From 05b232fcb4f714702e393613503e7f797e924c7a Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Thu, 8 Jun 2023 22:40:55 +0200 Subject: [PATCH] Added RBDS support with stationcall and underscore in PS --- TEF6686_ESP32.ino | 121 +++++++++++++++++++++---- src/TEF6686.cpp | 81 ++++++++--------- src/TEF6686.h | 77 +++++++++++++++- src/language.h | 224 +++++++++++++++++++++++++--------------------- 4 files changed, 342 insertions(+), 161 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 5d2048a..b838682 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -57,14 +57,17 @@ bool Stereostatusold; bool StereoToggle = true; bool store; bool tuned; +bool underscore; +bool USBstatus; +bool XDRMute; +byte region; +byte regionold; byte language; byte tunemode; byte memorypos; byte memoryposold; byte menupage = 1; byte menupagestotal = 2; -bool USBstatus; -bool XDRMute; byte band; byte BWset; byte ContrastSet; @@ -154,8 +157,8 @@ TFT_eSprite sprite = TFT_eSprite(&tft); void setup() { setupmode = true; EEPROM.begin(221); - if (EEPROM.readByte(43) != 20) { - EEPROM.writeByte(43, 20); + if (EEPROM.readByte(43) != 21) { + EEPROM.writeByte(43, 21); EEPROM.writeUInt(0, 10000); EEPROM.writeInt(4, 0); EEPROM.writeUInt(8, 0); @@ -181,8 +184,10 @@ void setup() { EEPROM.writeByte(44, 1); EEPROM.writeByte(45, 1); EEPROM.writeByte(46, 0); + EEPROM.writeInt(47, 20); EEPROM.writeByte(51, 0); - EEPROM.writeInt(55, 20); + EEPROM.writeByte(52, 0); + EEPROM.writeByte(53, 0); for (int i = 0; i < 30; i++) EEPROM.writeByte(i + 60, 0); for (int i = 0; i < 30; i++) EEPROM.writeUInt((i * 4) + 100, 8750); EEPROM.commit(); @@ -213,8 +218,10 @@ void setup() { iMSset = EEPROM.readByte(44); EQset = EEPROM.readByte(45); band = EEPROM.readByte(46); + LowLevelSet = EEPROM.readInt(47); memorypos = EEPROM.readByte(51); - LowLevelSet = EEPROM.readInt(55); + region = EEPROM.readByte(52); + underscore = EEPROM.readByte(53); for (int i = 0; i < 30; i++) memoryband[i] = EEPROM.readByte(i + 60); for (int i = 0; i < 30; i++) memory[i] = EEPROM.readUInt((i * 4) + 100); @@ -368,6 +375,8 @@ void setup() { radio.setMute(); radio.setSoftmuteFM(softmutefm); radio.setSoftmuteAM(softmuteam); + if (region == 1) radio.setDeemphasis(2); + radio.rds.region = region; LowLevelInit = true; if (ConverterSet >= 200) { @@ -403,7 +412,8 @@ void loop() { tft.drawString("120", 164, 146, GFXFF); tft.drawString("%", 196, 146, GFXFF); tft.drawString("M", 6, 132, GFXFF); - tft.drawString("PI:", 216, 191, GFXFF); + if (region == 0) tft.drawString("PI:", 216, 191, GFXFF); + if (region == 1) tft.drawString("ID:", 216, 191, GFXFF); tft.drawString("PS:", 6, 191, GFXFF); tft.drawString("PTY:", 6, 164, GFXFF); tft.drawLine(20, 150, 200, 150, TFT_DARKGREY); @@ -437,7 +447,8 @@ void loop() { tft.drawString("120", 164, 146, GFXFF); tft.drawString("%", 196, 146, GFXFF); tft.drawString("M", 6, 132, GFXFF); - tft.drawString("PI:", 216, 191, GFXFF); + if (region == 0) tft.drawString("PI:", 216, 191, GFXFF); + if (region == 1) tft.drawString("ID:", 216, 191, GFXFF); tft.drawString("PS:", 6, 191, GFXFF); tft.drawString("PTY:", 6, 164, GFXFF); tft.drawLine(20, 150, 200, 150, TFT_GREYOUT); @@ -590,7 +601,8 @@ void SelectBand() { radio.getStatusAM(SStatus, USN, WAM, OStatus, BW, MStatus); if (screenmute == false) BuildDisplay(); tft.setFreeFont(FONT7); - tft.drawString("PI:", 216, 191, GFXFF); + if (region == 0) tft.drawString("PI:", 216, 191, GFXFF); + if (region == 1) tft.drawString("ID:", 216, 191, GFXFF); tft.drawString("PS:", 6, 191, GFXFF); tft.drawString("PTY:", 6, 164, GFXFF); tft.drawBitmap(110, 5, RDSLogo, 67, 22, TFT_GREYOUT); @@ -712,7 +724,9 @@ void ModeButtonPress() { EEPROM.writeByte(30, softmutefm); EEPROM.writeByte(35, language); EEPROM.writeByte(36, showrdserrors); - EEPROM.writeInt(55, LowLevelSet); + EEPROM.writeInt(47, LowLevelSet); + EEPROM.writeByte(52, region); + EEPROM.writeByte(53, underscore); EEPROM.commit(); } while (digitalRead(MODEBUTTON) == LOW) delay(50); @@ -960,6 +974,21 @@ void ButtonPress() { tft.setTextColor(TFT_YELLOW); if (edgebeep) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 130: + tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][46], 155, 70, GFXFF); + tft.setTextColor(TFT_YELLOW); + if (region == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF); + if (region == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF); + break; + + case 150: + tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][49], 155, 70, GFXFF); + tft.setTextColor(TFT_YELLOW); + if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } } } else { @@ -1171,6 +1200,28 @@ void KeyUp() { tft.setTextColor(TFT_YELLOW); if (edgebeep) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 130: + tft.setTextColor(TFT_BLACK); + if (region == 0) region = 1; else region = 0; + if (regionold == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF); + if (regionold == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF); + if (edgebeep) edgebeep = false; else edgebeep = true; + tft.setTextColor(TFT_YELLOW); + if (region == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF); + if (region == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF); + regionold = region; + if (region == 0) radio.setDeemphasis(1); + if (region == 1) radio.setDeemphasis(2); + radio.rds.region = region; + break; + + case 150: + tft.setTextColor(TFT_BLACK); + if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + if (underscore) underscore = false; else underscore = true; + tft.setTextColor(TFT_YELLOW); + if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); } } } @@ -1380,6 +1431,28 @@ void KeyDown() { tft.setTextColor(TFT_YELLOW); if (edgebeep) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 130: + tft.setTextColor(TFT_BLACK); + if (region == 0) region = 1; else region = 0; + if (regionold == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF); + if (regionold == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF); + if (edgebeep) edgebeep = false; else edgebeep = true; + tft.setTextColor(TFT_YELLOW); + if (region == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF); + if (region == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF); + regionold = region; + if (region == 0) radio.setDeemphasis(1); + if (region == 1) radio.setDeemphasis(2); + radio.rds.region = region; + break; + + case 150: + tft.setTextColor(TFT_BLACK); + if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + if (underscore) underscore = false; else underscore = true; + tft.setTextColor(TFT_YELLOW); + if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); } } } @@ -1494,8 +1567,20 @@ void showPS() { tft.setTextColor(TFT_BLACK); tft.drawString(PSold, 38, 182, GFXFF); tft.setTextColor(TFT_YELLOW); - tft.drawString(radio.rds.stationName, 38, 182, GFXFF); - PSold = radio.rds.stationName; + if (underscore) { + char PS_[9]; + strcpy (PS_, radio.rds.stationName); + for (int i = 0; i < 8; i++) + { + if (PS_[i] < 0x10) PS_[i] = '0'; + if (PS_[i] == 0x20) PS_[i] = '_'; + } + tft.drawString(PS_, 38, 182, GFXFF); + PSold = PS_; + } else { + tft.drawString(radio.rds.stationName, 38, 182, GFXFF); + PSold = radio.rds.stationName; + } strcpy(programServicePrevious, radio.rds.stationName); } } @@ -1596,12 +1681,17 @@ void BuildMenu() { tft.drawString(myLanguage[language][43], 14, 70, GFXFF); tft.drawString(myLanguage[language][44], 14, 90, GFXFF); tft.drawString(myLanguage[language][45], 14, 110, GFXFF); + tft.drawString(myLanguage[language][46], 14, 130, GFXFF); + tft.drawString(myLanguage[language][49], 14, 150, GFXFF); tft.setTextColor(TFT_YELLOW); tft.drawRightString(myLanguage[language][0], 305, 30, GFXFF); if (showrdserrors) tft.drawRightString(myLanguage[language][42], 305, 50, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 50, GFXFF); if (softmutefm) tft.drawRightString(myLanguage[language][42], 305, 70, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 70, GFXFF); if (softmuteam) tft.drawRightString(myLanguage[language][42], 305, 90, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 90, GFXFF); if (edgebeep) tft.drawRightString(myLanguage[language][42], 305, 110, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 110, GFXFF); + if (region == 0) tft.drawRightString(myLanguage[language][47], 305, 130, GFXFF); + if (region == 1) tft.drawRightString(myLanguage[language][48], 305, 130, GFXFF); + if (underscore) tft.drawRightString(myLanguage[language][42], 305, 150, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 150, GFXFF); break; } analogWrite(SMETERPIN, 0); @@ -1656,7 +1746,8 @@ void BuildDisplay() { tft.drawString("dB", 300, 167, GFXFF); tft.drawString("S", 6, 100, GFXFF); tft.drawString("M", 6, 132, GFXFF); - tft.drawString("PI:", 216, 191, GFXFF); + if (region == 0) tft.drawString("PI:", 216, 191, GFXFF); + if (region == 1) tft.drawString("ID:", 216, 191, GFXFF); tft.drawString("PS:", 6, 191, GFXFF); tft.drawString("PTY:", 6, 164, GFXFF); tft.drawString("%", 196, 146, GFXFF); @@ -2421,12 +2512,12 @@ void XDRGTKRoutine() { LevelOffset = atol(buff + 1); if (LevelOffset == 0) { MuteScreen(0); - LowLevelSet = EEPROM.readInt(55); + LowLevelSet = EEPROM.readInt(47); Serial.print("G00\n"); } if (LevelOffset == 10) { MuteScreen(1); - LowLevelSet = EEPROM.readInt(55); + LowLevelSet = EEPROM.readInt(47); Serial.print("G10\n"); } if (LevelOffset == 1) { diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 05dd9da..121b8e1 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -1,42 +1,5 @@ #include "TEF6686.h" -const char* const PTY[] -{ - "None", - "News", - "Current Affairs", - "Information", - "Sport", - "Education", - "Drama", - "Cultures", - "Science", - "Varied Speech", - "Pop Music", - "Rock Music", - "Easy Listening", - "Light Classics", - "Serious Classics", - "Other Music", - "Weather", - "Finance", - "Children's Progs", - "Social Affair", - "Religion", - "Phone In", - "Travel & Touring", - "Leisure & Hobby", - "Jazz Music", - "Country Music", - "National Music", - "Oldies Music", - "Folk Music", - "Documentary", - "Alarm Test", - "Alarm!!!", - " " -}; - void TEF6686::init(byte TEF) { uint8_t bootstatus; Tuner_I2C_Init(); @@ -280,12 +243,41 @@ bool TEF6686::readRDS(bool showrdserrors) { //PI if (rds.stationID == 0) rds.stationID = rds.rdsA; - char Hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - rds.picode[0] = Hex[(rds.rdsA & 0xF000U) >> 12]; - rds.picode[1] = Hex[(rds.rdsA & 0x0F00U) >> 8]; - rds.picode[2] = Hex[(rds.rdsA & 0x00F0U) >> 4]; - rds.picode[3] = Hex[(rds.rdsA & 0x000FU)]; - rds.picode[4] = '\0'; + if (rds.region == 0) { + char Hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + rds.picode[0] = Hex[(rds.rdsA & 0xF000U) >> 12]; + rds.picode[1] = Hex[(rds.rdsA & 0x0F00U) >> 8]; + rds.picode[2] = Hex[(rds.rdsA & 0x00F0U) >> 4]; + rds.picode[3] = Hex[(rds.rdsA & 0x000FU)]; + rds.picode[4] = '\0'; + } + if (rds.region == 1) { + if (rds.stationID > 4096) { + if (rds.stationID > 21671 &&(rds.stationID & 0xF00U) >> 8 == 0) rds.stationID = ((uint16_t)uint8_t(0xA0 + ((rds.stationID & 0xF000U) >> 12)) << 8) + lowByte(rds.stationID); // C0DE -> ACDE + if (rds.stationID > 21671 && lowByte(rds.stationID) == 0) rds.stationID = 0xAF00 + uint8_t(highByte(rds.stationID)); // CD00 -> AFCD + if (rds.stationID < 39247) { + if (rds.stationID > 21671) { + rds.picode[0] = 'W'; + rds.stationID -= 21672; + } else { + rds.picode[0] = 'K'; + rds.stationID -= 4096; + } + rds.picode[1] = char(rds.stationID / 676 + 65); + rds.picode[2] = char((rds.stationID - 676 * int(rds.stationID / 676)) / 26 + 65); + rds.picode[3] = char(((rds.stationID - 676 * int(rds.stationID / 676)) % 26) + 65); + rds.picode[4] = '\0'; + } else { + rds.stationID -= 4835; + rds.picode[0] = 'K'; + rds.picode[1] = char(rds.stationID / 676 + 65); + rds.picode[2] = char((rds.stationID - 676 * int(rds.stationID / 676)) / 26 + 65); + rds.picode[3] = char(((rds.stationID - 676 * int(rds.stationID / 676)) % 26) + 65); + rds.picode[4] = '\0'; + } + } + } + rds_group = (rds.rdsB >> 11); if (rds.correctPI == false && rds.correct == true) rds.correctPI = true; switch (rds_group) { @@ -313,7 +305,8 @@ bool TEF6686::readRDS(bool showrdserrors) //PTY rds.stationTypeCode = (rds.rdsB >> 5) & 0x1F; rds.hasPTY = true; - strcpy(rds.stationType, PTY[rds.stationTypeCode]); + if (rds.region == 0) strcpy(rds.stationType, PTY_EU[rds.stationTypeCode]); + if (rds.region == 1) strcpy(rds.stationType, PTY_USA[rds.stationTypeCode]); //TP-TA-EON-MS if ((bitRead(rds.rdsB, 4)) == 1 && ((bitRead(rds.rdsB, 10)) == 0)) rds.hasEON = true; else rds.hasEON = false; diff --git a/src/TEF6686.h b/src/TEF6686.h index 365233c..fa0c75a 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -11,7 +11,80 @@ enum RDS_GROUPS { RDS_GROUP_12A, RDS_GROUP_12B, RDS_GROUP_13A, RDS_GROUP_13B, RDS_GROUP_14A, RDS_GROUP_14B, RDS_GROUP_15A, RDS_GROUP_15B }; +const char* const PTY_EU[] { + "None", + "News", + "Current Affairs", + "Information", + "Sport", + "Education", + "Drama", + "Cultures", + "Science", + "Varied Speech", + "Pop Music", + "Rock Music", + "Easy Listening", + "Light Classics", + "Serious Classics", + "Other Music", + "Weather", + "Finance", + "Children's Progs", + "Social Affair", + "Religion", + "Phone In", + "Travel & Touring", + "Leisure & Hobby", + "Jazz Music", + "Country Music", + "National Music", + "Oldies Music", + "Folk Music", + "Documentary", + "Alarm Test", + "Alarm!!!", + " " +}; + +const char* const PTY_USA[] { + "None", + "News", + "Information", + "Sports", + "Talk", + "Rock", + "Classic Rock", + "Adult Hits", + "Soft Rock", + "Top 40", + "Country", + "Oldies", + "Soft", + "Nostalgia", + "Jazz", + "Classical", + "Rhythm and Blues ", + "Soft R & B", + "Foreign_Language", + "Religious Music", + "Religious Talk", + "Personality", + "Public", + "College", + "Hablar Espanol", + "Musica Espanol", + "Hip Hop", + " ", + " ", + "Weather", + "Emergency Test", + "ALERT! ALERT!", + " " +}; + typedef struct _rds_ { + byte region; byte stationTypeCode; char stationName[9]; char stationText[65]; @@ -94,9 +167,9 @@ class TEF6686 { void setStereoLevel(uint8_t start); void setUnMute(); void setVolume(int8_t volume); - uint8_t af_counter; - bool mute; void tone(uint16_t time, int16_t amplitude, uint16_t frequency); + uint8_t af_counter; + bool mute; private: uint8_t ascii_converter (uint8_t src); diff --git a/src/language.h b/src/language.h index 2b38d83..179ab52 100644 --- a/src/language.h +++ b/src/language.h @@ -1,6 +1,6 @@ // [number of languages][number of texts][max. length of text] -const char myLanguage[6][46][100] = { +const char myLanguage[6][50][100] = { { "English", // English "Rotary direction changed", "Please release button", @@ -46,7 +46,11 @@ const char myLanguage[6][46][100] = { "On", "Softmute FM", "Softmute AM", - "Beep at band edge" + "Beep at band edge", + "Region", + "Europe", + "USA", + "Show underscore in PS" }, { "Nederlands", // Dutch @@ -94,106 +98,118 @@ const char myLanguage[6][46][100] = { "Aan", "Softmute FM", "Softmute AM", - "Piep op bandeinde" + "Piep op bandeinde", + "Regio", + "Europa", + "USA", + "Toon underscore in PS" }, { "Polski", // Polish - "Kierunek obrotu zmieniony", - "Zwolnij przycisk", - "Obrocono ekran", - "Kalibracja analogowego miernika", - "Zwolnij przycisk gdy gotowe", - "wybrano enkoder optyczny", - "wybrano standardowy enkoder", - "Odbiornik FM/AM", - "Tuner: !Brak!", - "Glosnosc:", - "Konwerter:", - "Dolna granica pasma:", - "Gorna granica pasma:", - "Odchylenie poziomu RF:", - "Prog Stereo:", - "Krawedz dolnoprzep..:", - "Prog dolnoprzepust.:", - "Prog niskiego sygnalu:", - "Kontrast:", - "Ustaw glosnosc", - "Ustaw odchylenie konwertera", - "Ustaw dolna granice pasma", - "Ustaw gorna granice pasma", - "Ustaw odchylenie sygnalu", - "Ustaw prog separacji Stereo", - "Czest. gran. filtra dolnoprzep.", - "Ustaw prog dolnoprzep.", - "Ustaw dolna granice sygnalu", - "Ustaw jasnosc wyswietlacza", - "Wyl.", - "Ekran jest wyciszony!", - "Aby wyl. wyciszenie odznacz RF+", - "WYL.", - "SKANOWANIE...", - "Nie wykryto tunera", - "Ustawiono wersje tunera: v", - "Prosze uruchomic pon. tuner", - "Pokaz bledy RDS", - "Jezyk", - "Wybierz swoj jezyk", - "WCISNIJ MODE ABY ZAMKNAC I ZAPISAC", - "Wlacz.", - "Lagodne wycisz. FM", - "Lagodne wycisz. AM", - "Beep na krawedzi pasma" + "Kierunek obrotu zmieniony", + "Zwolnij przycisk", + "Obrocono ekran", + "Kalibracja analogowego miernika", + "Zwolnij przycisk gdy gotowe", + "wybrano enkoder optyczny", + "wybrano standardowy enkoder", + "Odbiornik FM/AM", + "Tuner: !Brak!", + "Glosnosc:", + "Konwerter:", + "Dolna granica pasma:", + "Gorna granica pasma:", + "Odchylenie poziomu RF:", + "Prog Stereo:", + "Krawedz dolnoprzep..:", + "Prog dolnoprzepust.:", + "Prog niskiego sygnalu:", + "Kontrast:", + "Ustaw glosnosc", + "Ustaw odchylenie konwertera", + "Ustaw dolna granice pasma", + "Ustaw gorna granice pasma", + "Ustaw odchylenie sygnalu", + "Ustaw prog separacji Stereo", + "Czest. gran. filtra dolnoprzep.", + "Ustaw prog dolnoprzep.", + "Ustaw dolna granice sygnalu", + "Ustaw jasnosc wyswietlacza", + "Wyl.", + "Ekran jest wyciszony!", + "Aby wyl. wyciszenie odznacz RF+", + "WYL.", + "SKANOWANIE...", + "Nie wykryto tunera", + "Ustawiono wersje tunera: v", + "Prosze uruchomic pon. tuner", + "Pokaz bledy RDS", + "Jezyk", + "Wybierz swoj jezyk", + "WCISNIJ MODE ABY ZAMKNAC I ZAPISAC", + "Wlacz.", + "Lagodne wycisz. FM", + "Lagodne wycisz. AM", + "Beep na krawedzi pasma", + "Region", + "Europe", + "USA", + "Show underscore in PS" }, - {"Hrvatski", // Croatian - "Smjer enkodera promij.", - "Otpustite gumb", - "Zaslon je okrenut", - "Kalibracija analog. mjerača", - "Otpustite gumb", - "Optički enkoder postav.", - "Standardni enkoder postav.", - "FM/AM prijemnik", - "Prijemnik: !Nije pronađen!", - "Pomak glasnoće:", - "Pomak konvertera:", - "Donja granica opsega:", - "Gornja granica opsega:", - "Pomak RF razine:", - "Razina stereo signala:", - "Granična frekvencija:", - "Razina granične frekv.:", - "Donja granica za signal:", - "Svjetlina:", - "Pomak glasnoće", - "Pomak konvertera", - "Donja granica frekv. opsega", - "Gornja granica frekv. opsega", - "Pomak signala", - "Razina stereo signala", - "Granična frekvencija", - "Razina granične frekv.", - "Donja granica za signal", - "Svjetlina zaslona", - "Isključeno", - "Zaslon je isključen!", - "Da biste uključili zaslon, poništite kvadratić RF+", - "ISK.", - "SKENIRANJE...", - "Prijemnik nije pronađen", - "Postavljena verzija prijemnika: v", - "Molim, ponovno pokrenite prijemnik", - "Prikaži RDS pogreške", - "Jezik", - "Odaberite jezik", - "PRITISNITE MODE ZA IZLAZ I SPREMANJE", - "Uključeno", - "Softmute FM", - "Softmute AM", - "Beep na rubu frekv. opsega" - }, + {"Hrvatski", // Croatian + "Smjer enkodera promij.", + "Otpustite gumb", + "Zaslon je okrenut", + "Kalibracija analog. mjerača", + "Otpustite gumb", + "Optički enkoder postav.", + "Standardni enkoder postav.", + "FM/AM prijemnik", + "Prijemnik: !Nije pronađen!", + "Pomak glasnoće:", + "Pomak konvertera:", + "Donja granica opsega:", + "Gornja granica opsega:", + "Pomak RF razine:", + "Razina stereo signala:", + "Granična frekvencija:", + "Razina granične frekv.:", + "Donja granica za signal:", + "Svjetlina:", + "Pomak glasnoće", + "Pomak konvertera", + "Donja granica frekv. opsega", + "Gornja granica frekv. opsega", + "Pomak signala", + "Razina stereo signala", + "Granična frekvencija", + "Razina granične frekv.", + "Donja granica za signal", + "Svjetlina zaslona", + "Isključeno", + "Zaslon je isključen!", + "Da biste uključili zaslon, poništite kvadratić RF+", + "ISK.", + "SKENIRANJE...", + "Prijemnik nije pronađen", + "Postavljena verzija prijemnika: v", + "Molim, ponovno pokrenite prijemnik", + "Prikaži RDS pogreške", + "Jezik", + "Odaberite jezik", + "PRITISNITE MODE ZA IZLAZ I SPREMANJE", + "Uključeno", + "Softmute FM", + "Softmute AM", + "Beep na rubu frekv. opsega", + "Region", + "Europe", + "USA", + "Show underscore in PS" + }, - {"Ελληνικά", // Greek + {"Ελληνικά", // Greek "Η διεύθυνση του ρότορα άλλαξε", "Παρακαλώ ελευθερώστε το πλήκτρο", "Η οθόνη αναποδογύρισε", @@ -238,10 +254,14 @@ const char myLanguage[6][46][100] = { "Ενεργό", "Softmute FM", "Softmute AM", - "Ηχητικό σήμα στο όριο μπάντας" - }, + "Ηχητικό σήμα στο όριο μπάντας", + "Region", + "Europe", + "USA", + "Show underscore in PS" + }, - { "Romana", // Roman + { "Romana", // Roman "Sens rotire schimbat", "Eliberati butonul", "Ecran inversat", @@ -286,6 +306,10 @@ const char myLanguage[6][46][100] = { "Pornit", "FM fara sonor", "A fara sonorM", - "Sunet la marginea Benzii" + "Sunet la marginea Benzii", + "Region", + "Europe", + "USA", + "Show underscore in PS" } };