1
0
mirror of https://github.com/JvanKatwijk/dab-cmdline synced 2025-10-05 23:52:50 +02:00
Files
SDR-DAB_dab-cmdline/dab-scanner/dab_tables.cpp
2018-08-26 17:47:28 +02:00

674 lines
21 KiB
C++

#
/*
* Copyright (C) 2018
* Hayati Ayguen (h_ayguen@web.de)
*
* DAB-library is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* DAB-library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DAB-library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "dab_tables.h"
#include <string.h>
#include <stdlib.h>
// ETSI TS 101 756 V2.2.1: Registered Tables
// for Extended Country Code, Country Id, Language Code,
// Program Type, User Application Type, Content Type
// https://www.etsi.org/deliver/etsi_ts/101700_101799/101756/02.02.01_60/ts_101756v020201p.pdf
// ETSI TR 101 496-3 V1.1.2
// protection level/classes, ..
// https://www.etsi.org/deliver/etsi_tr/101400_101499/10149603/01.01.02_60/tr_10149603v010102p.pdf
static const char *uep_rates [] = {"7/20", "2/5", "1/2", "3/5"};
static const char *eep_Arates[] = {"1/4", "3/8", "1/2", "3/4"}; // see ETSI EN 300 401 V1.3.2 (2000-09), Table 8, page 46
static const char *eep_Brates[] = {"4/9", "4/7", "4/6", "4/5"}; // see ETSI EN 300 401 V1.3.2 (2000-09), Table 9, page 46
struct country_codes {
uint8_t ecc;
uint8_t countryId;
const char *countryName;
};
// following countryTable[] is sorted over all regions to make
// it easier to find "missing" / "old" but still unused entries.
// achieved by searching old standard tables document for each ECC code.
// Table 3: ITU Region 1 - European broadcasting area
// Table 4: ITU Region 1 - African broadcasting area
// Table 6: ITU Region 2 - North and South Americas
// Table 7: ITU Region 3 - Asia and Pacific
static country_codes countryTable[] = {
{0xA0, 0x1, "United States of America"},
{0xA0, 0x2, "United States of America"},
{0xA0, 0x3, "United States of America"},
{0xA0, 0x4, "United States of America"},
{0xA0, 0x5, "United States of America"},
{0xA0, 0x6, "United States of America"},
{0xA0, 0x7, "United States of America"},
{0xA0, 0x8, "United States of America"},
{0xA0, 0x9, "United States of America"},
{0xA0, 0xA, "United States of America"},
{0xA0, 0xB, "United States of America"},
{0xA0, 0xC, "United States of America"},
{0xA0, 0xD, "United States of America"},
{0xA0, 0xE, "United States of America"},
{0xA1, 0xC, "Canada"},
{0xA1, 0xF, "Greenland"},
{0xA2, 0x1, "Anguilla"},
{0xA2, 0x2, "Antigua and Barbuda"},
{0xA2, 0x3, "Equador"},
{0xA2, 0x4, "Falkland Islands"},
{0xA2, 0x5, "Barbados"},
{0xA2, 0x6, "Belize"},
{0xA2, 0x7, "Cayman Islands"},
{0xA2, 0x8, "Costa Rica"},
{0xA2, 0x9, "Cuba"},
{0xA2, 0xA, "Argentina"},
{0xA2, 0xB, "Brazil"},
{0xA2, 0xC, "Bermuda"},
{0xA2, 0xD, "Netherlands Antilles"},
{0xA2, 0xE, "Guadeloupe"},
{0xA2, 0xF, "Bahamas"},
{0xA3, 0x1, "Bolivia"},
{0xA3, 0x2, "Colombia"},
{0xA3, 0x3, "Jamaica"},
{0xA3, 0x4, "Martinique"},
{0xA3, 0x6, "Paraguay"},
{0xA3, 0x7, "Nicaragua"},
{0xA3, 0x8, "Puerto Rico"},
{0xA3, 0x9, "Panama"},
{0xA3, 0xA, "Dominica"},
{0xA3, 0xB, "Dominican Republic"},
{0xA3, 0xC, "Chile"},
{0xA3, 0xD, "Grenada"},
{0xA3, 0xE, "Turks and Caicos islands"},
{0xA3, 0xF, "Guyana"},
{0xA4, 0x1, "Guatemala"},
{0xA4, 0x2, "Honduras"},
{0xA4, 0x3, "Aruba"},
{0xA4, 0x5, "Montserrat"},
{0xA4, 0x6, "Trinidad and Tobago"},
{0xA4, 0x7, "Peru"},
{0xA4, 0x8, "Surinam"},
{0xA4, 0x9, "Uruguay"},
{0xA4, 0xA, "St. Kitts"},
{0xA4, 0xB, "St. Lucia"},
{0xA4, 0xC, "El Salvador"},
{0xA4, 0xD, "Haiti"},
{0xA4, 0xE, "Venezuela"},
{0xA4, 0xF, "Mexico"},
{0xA5, 0xC, "St. Vincent"},
{0xA5, 0xF, "Virgin islands (British or USA)"}, // British and USA have same IDs! amended "or USA"
{0xA5, 0xF, "Virgin islands (USA)"}, // keep this entry .. doesn't hurt
{0xA6, 0xF, "St. Pierre and Miquelon"},
{0xD0, 0x1, "Cameroon"},
{0xD0, 0x2, "Central African Republic"},
{0xD0, 0x3, "Djibouti"},
{0xD0, 0x4, "Madagascar"},
{0xD0, 0x5, "Mali"},
{0xD0, 0x6, "Angola"},
{0xD0, 0x7, "Equatorial Guinea"},
{0xD0, 0x8, "Gabon"},
{0xD0, 0x9, "Republic of Guinea"},
{0xD0, 0xA, "South Africa"},
{0xD0, 0xB, "Burkina Faso"},
{0xD0, 0xC, "Congo"},
{0xD0, 0xD, "Togo"},
{0xD0, 0xE, "Benin"},
{0xD0, 0xF, "Malawi"},
{0xD1, 0x1, "Namibia"},
{0xD1, 0x2, "Liberia"},
{0xD1, 0x3, "Ghana"},
{0xD1, 0x4, "Mauritania"},
{0xD1, 0x5, "Sao Tome & Principe"},
{0xD1, 0x6, "Cape Verde"},
{0xD1, 0x7, "Senegal"},
{0xD1, 0x8, "Gambia"},
{0xD1, 0x9, "Burundi"},
{0xD1, 0xA, "Ascension island"},
{0xD1, 0xB, "Botswana"},
{0xD1, 0xC, "Comoros"},
{0xD1, 0xD, "Tanzania"},
{0xD1, 0xE, "Ethiopia"},
{0xD1, 0xF, "Nigeria"},
{0xD2, 0x1, "Sierra Leone"},
{0xD2, 0x2, "Zimbabwe"},
{0xD2, 0x3, "Mozambique"},
{0xD2, 0x4, "Uganda"},
{0xD2, 0x5, "Swaziland"},
{0xD2, 0x6, "Kenya"},
{0xD2, 0x7, "Somalia"},
{0xD2, 0x8, "Niger"},
{0xD2, 0x9, "Chad"},
{0xD2, 0xA, "Guinea-Bissau"},
{0xD2, 0xB, "Zaire"},
{0xD2, 0xC, "Cote d'Ivoire"},
{0xD2, 0xD, "Zanzibar"},
{0xD2, 0xE, "Zambia"},
{0xD3, 0x3, "Western Sahara"},
{0xD3, 0x4, "Cabinda"}, // was in V1.4.1. was removed later. but IDs are unused .. so keep it here
{0xD3, 0x5, "Rwanda"},
{0xD3, 0x6, "Lesotho"},
{0xD3, 0x8, "Seychelles"},
{0xD3, 0xA, "Mauritius"},
{0xD3, 0xC, "Sudan"},
{0xE0, 0x1, "Germany"},
{0xE0, 0x2, "Algeria"},
{0xE0, 0x3, "Andorra"},
{0xE0, 0x4, "Israel"},
{0xE0, 0x5, "Italy"},
{0xE0, 0x6, "Belgium"},
{0xE0, 0x7, "Russian Federation"},
{0xE0, 0x8, "Azores (Portugal)"}, // was in V1.4.1. was removed later. but IDs are unused .. so keep it here
{0xE0, 0x9, "Albania"},
{0xE0, 0xA, "Austria"},
{0xE0, 0xB, "Hungary"},
{0xE0, 0xC, "Malta"},
{0xE0, 0xD, "Germany"},
{0xE0, 0xE, "Canary Islands (Spain)"}, // amended "(Spain)"
{0xE0, 0xF, "Egypt"},
{0xE1, 0x1, "Greece"},
{0xE1, 0x2, "Cyprus"},
{0xE1, 0x3, "San Marino"},
{0xE1, 0x4, "Switzerland"},
{0xE1, 0x5, "Jordan"},
{0xE1, 0x6, "Finland"},
{0xE1, 0x7, "Luxembourg"},
{0xE1, 0x8, "Bulgaria"},
{0xE1, 0x9, "Faroe (Denmark)"},
{0xE1, 0xA, "Gibraltar (UK)"}, // amended "(UK)"
{0xE1, 0xB, "Iraq"},
{0xE1, 0xC, "United Kingdom"},
{0xE1, 0xD, "Libya"},
{0xE1, 0xE, "Romania"},
{0xE1, 0xF, "France"},
{0xE2, 0x1, "Marocco"},
{0xE2, 0x2, "Czech Republic"},
{0xE2, 0x3, "Poland"},
{0xE2, 0x4, "Vatican"},
{0xE2, 0x5, "Slovak Republic"},
{0xE2, 0x6, "Syria"},
{0xE2, 0x7, "Tunisia"},
{0xE2, 0x8, "Madeira"}, // was in V1.4.1. was removed later. but IDs are unused .. so keep it here
{0xE2, 0x9, "Liechtenstein"},
{0xE2, 0xA, "Iceland"},
{0xE2, 0xB, "Monaco"},
{0xE2, 0xC, "Lithuania"},
{0xE2, 0xD, "Serbia"},
{0xE2, 0xE, "Spain"},
{0xE2, 0xF, "Norway"},
{0xE3, 0x1, "Montenegro"},
{0xE3, 0x2, "Ireland"},
{0xE3, 0x3, "Turkey"},
{0xE3, 0x4, "Macedonia"},
{0xE3, 0x5, "Tajikistan"}, // was in V1.4.1. was removed later. but IDs are unused .. so keep it here
{0xE3, 0x8, "Netherlands"},
{0xE3, 0x9, "Latvia"},
{0xE3, 0xA, "Lebanon"},
{0xE3, 0xB, "Azerbaijan"}, // was in V1.4.1. was removed later. but IDs are unused .. so keep it here
{0xE3, 0xC, "Croatia"},
{0xE3, 0xD, "Kazakhstan"}, // was in V1.4.1. was removed later. but IDs are unused .. so keep it here
{0xE3, 0xE, "Sweden"},
{0xE3, 0xF, "Belarus"},
{0xE4, 0x1, "Moldova"},
{0xE4, 0x2, "Estonia"},
{0xE4, 0x3, "Macedonia / Kyrghyzstan"}, // amended "/ Kyrghyzstan" double used Id
{0xE4, 0x3, "Kyrghyzstan"}, // keep this entry .. doesn't hurt
{0xE4, 0x6, "Ukraine"},
{0xE4, 0x7, "Kosovo"},
{0xE4, 0x8, "Portugal"},
{0xE4, 0x9, "Slovenia"},
{0xE4, 0xA, "Armenia"},
{0xE4, 0xB, "Uzbekistan"},
{0xE4, 0xC, "Georgia"},
{0xE4, 0xE, "Turkmenistan"},
{0xE4, 0xF, "Bosnia Herzegovina"},
{0xF0, 0x1, "Australia: Capital Cities (commercial and community)"},
{0xF0, 0x2, "Australia: New South Wales and ACT"},
{0xF0, 0x3, "Australia: Capital Cities (national broadcasters, was Victoria)"},
{0xF0, 0x4, "Australia: Queensland"},
{0xF0, 0x5, "Australia: South and Northern Territory"},
{0xF0, 0x6, "Australia: Western"},
{0xF0, 0x7, "Australia: Victoria and Tasmania"},
{0xF0, 0x8, "Australia: (future, was Northern Territory)"},
{0xF0, 0x9, "Saudi Arabia"},
{0xF0, 0xA, "Afghanistan"},
{0xF0, 0xB, "Myanmar (Burma)"},
{0xF0, 0xC, "China"},
{0xF0, 0xD, "Korea (North)"},
{0xF0, 0xE, "Bahrain"},
{0xF0, 0xF, "Malaysia"},
{0xF1, 0x1, "Kiribati"},
{0xF1, 0x2, "Bhutan"},
{0xF1, 0x3, "Bangladesh"},
{0xF1, 0x4, "Pakistan"},
{0xF1, 0x5, "Fiji"},
{0xF1, 0x6, "Oman"},
{0xF1, 0x7, "Nauru"},
{0xF1, 0x8, "Iran"},
{0xF1, 0x9, "New Zealand"},
{0xF1, 0xA, "Solomon Islands"},
{0xF1, 0xB, "Brunei Darussalam"},
{0xF1, 0xC, "Sri Lanka"},
{0xF1, 0xD, "Taiwan"},
{0xF1, 0xE, "Korea (South)"},
{0xF1, 0xF, "Hong Kong"},
{0xF2, 0x1, "Kuwait"},
{0xF2, 0x2, "Qatar"},
{0xF2, 0x3, "Cambodia"},
{0xF2, 0x4, "Western Samoa"},
{0xF2, 0x5, "India"},
{0xF2, 0x6, "Macau"},
{0xF2, 0x7, "Vietnam"},
{0xF2, 0x8, "Philippines"},
{0xF2, 0x9, "Japan"},
{0xF2, 0xA, "Singapore"},
{0xF2, 0xB, "Maldives"},
{0xF2, 0xC, "Indonesia"},
{0xF2, 0xD, "United Arab Emirates"},
{0xF2, 0xE, "Nepal"},
{0xF2, 0xF, "Vanuatu"},
{0xF3, 0x1, "Laos"},
{0xF3, 0x2, "Thailand"},
{0xF3, 0x3, "Tonga"},
{0xF3, 0x9, "Papua New Guinea"},
{0xF3, 0xB, "Yemen"},
{0xF3, 0xE, "Micronesia"},
{0xF3, 0xF, "Mongolia"},
{0x00, 0x0, nullptr }
};
// from Table 2a
const char * getASCTy (int16_t ASCTy) {
switch (ASCTy) {
case 0: return "DAB";
case 63: return "DAB+";
default: return "unknown";
}
}
// from Table 2b
const char * getDSCTy (int16_t DSCTy) {
switch (DSCTy) {
case 1: return "Traffic Message CHannel (TMC)";
case 2: return "Emergency Warning System (EWS)";
case 3: return "Interactive Text Transmission System (ITTS)";
case 4: return "Paging";
case 5: return "Transparent Data Channel (TDC)";
case 24: return "MPEG-2 Transport Stream";
case 59: return "Embedded IP packets";
case 60: return "Multimedia Object Transfer (MOT)";
case 61: return "Proprietary service";
default: return "unknown";
}
}
// from Table 9 and 10
const char * getLanguage (int16_t language) {
switch (language) {
case 0x00: return "Unknown/not applicable";
case 0x01: return "Albanian";
case 0x02: return "Breton";
case 0x03: return "Catalan";
case 0x04: return "Croatian";
case 0x05: return "Welsh";
case 0x06: return "Czech";
case 0x07: return "Danish";
case 0x08: return "German";
case 0x09: return "English";
case 0x0A: return "Spanish";
case 0x0B: return "Esperanto";
case 0x0C: return "Estonian";
case 0x0D: return "Basque";
case 0x0E: return "Faroese";
case 0x0F: return "French";
case 0x10: return "Frisian";
case 0x11: return "Irish";
case 0x12: return "Gaelic";
case 0x13: return "Galician";
case 0x14: return "Icelandic";
case 0x15: return "Italian";
case 0x16: return "Sami";
case 0x17: return "Latin";
case 0x18: return "Latvian";
case 0x19: return "Luxembourgian";
case 0x1A: return "Lithuanian";
case 0x1B: return "Hungarian";
case 0x1C: return "Maltese";
case 0x1D: return "Dutch";
case 0x1E: return "Norwegian";
case 0x1F: return "Occitan";
case 0x20: return "Polish";
case 0x21: return "Portuguese";
case 0x22: return "Romanian";
case 0x23: return "Romansh";
case 0x24: return "Serbian";
case 0x25: return "Slovak";
case 0x26: return "Slovene";
case 0x27: return "Finnish";
case 0x28: return "Swedish";
case 0x29: return "Turkish";
case 0x2A: return "Flemish";
case 0x2B: return "Walloon";
case 0x30: // no break
case 0x31: // no break
case 0x32: // no break
case 0x33: // no break
case 0x34: // no break
case 0x35: // no break
case 0x36: // no break
case 0x37: // no break
case 0x38: // no break
case 0x39: // no break
case 0x3A: // no break
case 0x3B: // no break
case 0x3C: // no break
case 0x3D: // no break
case 0x3E: // no break
case 0x3F: return "Reserved for national assignment";
case 0x7F: return "Amharic";
case 0x7E: return "Arabic";
case 0x7D: return "Armenian";
case 0x7C: return "Assamese";
case 0x7B: return "Azerbaijani";
case 0x7A: return "Bambora";
case 0x79: return "Belorussian";
case 0x78: return "Bengali";
case 0x77: return "Bulgarian";
case 0x76: return "Burmese";
case 0x75: return "Chinese";
case 0x74: return "Chuvash";
case 0x73: return "Dari";
case 0x72: return "Fulani";
case 0x71: return "Georgian";
case 0x70: return "Greek";
case 0x6F: return "Gujurati";
case 0x6E: return "Gurani";
case 0x6D: return "Hausa";
case 0x6C: return "Hebrew";
case 0x6B: return "Hindi";
case 0x6A: return "Indonesian";
case 0x69: return "Japanese";
case 0x68: return "Kannada";
case 0x67: return "Kazakh";
case 0x66: return "Khmer";
case 0x65: return "Korean";
case 0x64: return "Laotian";
case 0x63: return "Macedonian";
case 0x62: return "Malagasay";
case 0x61: return "Malaysian";
case 0x60: return "Moldavian";
case 0x5F: return "Marathi";
case 0x5E: return "Ndebele";
case 0x5D: return "Nepali";
case 0x5C: return "Oriya";
case 0x5B: return "Papiamento";
case 0x5A: return "Persian";
case 0x59: return "Punjabi";
case 0x58: return "Pushtu";
case 0x57: return "Quechua";
case 0x56: return "Russian";
case 0x55: return "Rusyn";
case 0x54: return "Serbo-Croat";
case 0x53: return "Shona";
case 0x52: return "Sinhalese";
case 0x51: return "Somali";
case 0x50: return "Sranan Tongo";
case 0x4F: return "Swahili";
case 0x4E: return "Tadzhik";
case 0x4D: return "Tamil";
case 0x4C: return "Tatar";
case 0x4B: return "Telugu";
case 0x4A: return "Thai";
case 0x49: return "Ukranian";
case 0x48: return "Urdu";
case 0x47: return "Uzbek";
case 0x46: return "Vietnamese";
case 0x45: return "Zulu";
case 0x40: return "Background sound/clean feed";
default: return "unknown";
}
}
const char *getCountry (uint8_t ecc, uint8_t countryId) {
int16_t i = 0;
while (countryTable [i].ecc != 0) {
if ((countryTable[i].ecc == ecc) &&
(countryTable[i].countryId == countryId) )
return countryTable[i].countryName;
++i;
}
return nullptr;
}
// from Table 12
const char *getProgramType_Not_NorthAmerica (int16_t programType) {
switch (programType) {
case 0: return "No programme type";
case 1: return "News";
case 2: return "Current Affairs";
case 3: return "Information";
case 4: return "Sport";
case 5: return "Education";
case 6: return "Drama";
case 7: return "Culture";
case 8: return "Science";
case 9: return "Varied"; //Talk
case 10: return "Pop Music";
case 11: return "Rock Music";
case 12: return "Easy Listening Music";
case 13: return "Light Classical";
case 14: return "Serious Classical";
case 15: return "Other Music";
case 16: return "Weather/meteorology";
case 17: return "Finance/Business";
case 18: return "Children's programmes";
case 19: return "Social Affairs"; //Factual
case 20: return "Religion";
case 21: return "Phone In";
case 22: return "Travel";
case 23: return "Leisure";
case 24: return "Jazz Music";
case 25: return "Country Music";
case 26: return "National Music";
case 27: return "Oldies Music";
case 28: return "Folk Music";
case 29: return "Documentary";
case 30: return "unknown programme type 30";
case 31: return "unknown programme type 31";
default: return "unknown programme type";
}
}
// from Table 13
const char *getProgramType_For_NorthAmerica (int16_t programType) {
switch (programType) {
case 0: return "No programme type";
case 1: return "News";
case 2: return "Information";
case 3: return "Sports";
case 4: return "Talk";
case 5: return "Rock";
case 6: return "Classic Rock";
case 7: return "Adult Hits";
case 8: return "Soft Rock";
case 9: return "Top 40";
case 10: return "Country";
case 11: return "Oldies";
case 12: return "Soft";
case 13: return "Nostalgia";
case 14: return "Jazz";
case 15: return "Classical";
case 16: return "Rhythm and Blues";
case 17: return "Soft Rhythm and Blues";
case 18: return "Foreign Language";
case 19: return "Religious Music";
case 20: return "Religious Talk";
case 21: return "Personality";
case 22: return "Public";
case 23: return "College";
case 24: return "unknown programme type 24";
case 25: return "unknown programme type 25";
case 26: return "unknown programme type 26";
case 27: return "unknown programme type 27";
case 28: return "unknown programme type 28";
case 29: return "Weather";
case 30: return "unknown programme type 30";
case 31: return "unknown programme type 31";
default: return "unknown programme type";
}
}
const char *getProgramType (bool gotInterTabId,
uint8_t interTabId, int16_t programType) {
if (gotInterTabId && (interTabId == 1))
return getProgramType_Not_NorthAmerica (programType);
else
if (gotInterTabId && (interTabId == 2))
return getProgramType_For_NorthAmerica (programType);
else {
switch (programType) {
case 0: return "unknown programme type 0";
case 1: return "unknown programme type 1";
case 2: return "unknown programme type 2";
case 3: return "unknown programme type 3";
case 4: return "unknown programme type 4";
case 5: return "unknown programme type 5";
case 6: return "unknown programme type 6";
case 7: return "unknown programme type 7";
case 8: return "unknown programme type 8";
case 9: return "unknown programme type 9";
case 10: return "unknown programme type 10";
case 11: return "unknown programme type 11";
case 12: return "unknown programme type 12";
case 13: return "unknown programme type 13";
case 14: return "unknown programme type 14";
case 15: return "unknown programme type 15";
case 16: return "unknown programme type 16";
case 17: return "unknown programme type 17";
case 18: return "unknown programme type 18";
case 19: return "unknown programme type 19";
case 20: return "unknown programme type 20";
case 21: return "unknown programme type 21";
case 22: return "unknown programme type 22";
case 23: return "unknown programme type 23";
case 24: return "unknown programme type 24";
case 25: return "unknown programme type 25";
case 26: return "unknown programme type 26";
case 27: return "unknown programme type 27";
case 28: return "unknown programme type 28";
case 29: return "unknown programme type 29";
case 30: return "unknown programme type 30";
case 31: return "unknown programme type 31";
default: return "unknown programme type";
}
}
return "unknown programme type";
}
// 11-bit from HandleFIG0Extension13, see ETSI TS 101 756 table 16
const char *getUserApplicationType (int16_t appType) {
switch (appType) {
case 1: return "Dynamic labels (X-PAD only)";
case 2: return "MOT Slide Show";
case 3: return "MOT Broadcast Web Site";
case 4: return "TPEG";
case 5: return "DGPS";
case 6: return "TMC";
case 7: return "SPI, was EPG";
case 8: return "DAB Java";
case 9: return "DMB";
case 0x00a: return "IPDC services";
case 0x00b: return "Voice applications";
case 0x00c: return "Middleware";
case 0x00d: return "Filecasting";
case 0x44a: return "Journaline";
default: return "unknown";
}
}
const char * getFECscheme (int16_t FEC_scheme) {
switch (FEC_scheme) {
case 0: return "no FEC";
case 1: return "FEC";
default: return "unknown";
}
}
const char * getProtectionLevel (bool shortForm, int16_t protLevel) {
if (!shortForm) {
switch (protLevel) {
case 0: return "EEP 1-A";
case 1: return "EEP 2-A";
case 2: return "EEP 3-A";
case 3: return "EEP 4-A";
case 4: return "EEP 1-B";
case 5: return "EEP 2-B";
case 6: return "EEP 3-B";
case 7: return "EEP 4-B";
default: return "EEP unknown";
}
}
else {
switch (protLevel) {
case 1: return "UEP 1";
case 2: return "UEP 2";
case 3: return "UEP 3";
case 4: return "UEP 4";
case 5: return "UEP 5";
default: return "UEP unknown";
}
}
}
const char *getCodeRate (bool shortForm, int16_t protLevel) {
int h = protLevel;
if (!shortForm)
return ((h & (1 << 2)) == 0) ?
eep_Arates [h & 03] :
eep_Brates [h & 03]; // EEP -A/-B
else
return uep_rates [h & 03]; // UEP
}