From 675b83efdfc377346331737df6cd9fbbb5f39efb Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Thu, 15 Jun 2023 11:52:00 +0200 Subject: [PATCH] Added support for RDS Spy on USB --- TEF6686_ESP32.ino | 117 ++++++++++++++-- src/language.h | 343 ++++++++++++++++++++++++---------------------- 2 files changed, 278 insertions(+), 182 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 86a8afc..460f57b 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -66,6 +66,7 @@ bool TPold; bool TAold; bool tuned; bool USBstatus; +bool USBmode = 1; bool XDRMute; byte region; byte regionold; @@ -139,6 +140,8 @@ String PSold; String PTYold; String rds_clock; String rds_clockold; +String RDSSPYRDS; +String RDSSPYRDSold; String RTold; String XDRGTKRDS; String XDRGTKRDSold; @@ -169,8 +172,8 @@ TFT_eSprite sprite = TFT_eSprite(&tft); void setup() { setupmode = true; EEPROM.begin(234); - if (EEPROM.readByte(43) != 21) { - EEPROM.writeByte(43, 21); + if (EEPROM.readByte(43) != 22) { + EEPROM.writeByte(43, 22); EEPROM.writeUInt(0, 10000); EEPROM.writeInt(4, 0); EEPROM.writeUInt(8, 0); @@ -200,6 +203,7 @@ void setup() { EEPROM.writeByte(51, 0); EEPROM.writeByte(52, 0); EEPROM.writeByte(53, 0); + EEPROM.writeByte(54, 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.writeUInt(221, 180); @@ -237,6 +241,7 @@ void setup() { memorypos = EEPROM.readByte(51); region = EEPROM.readByte(52); radio.rds.underscore = EEPROM.readByte(53); + USBmode = EEPROM.readByte(54); frequency_LW = EEPROM.readUInt(221); frequency_MW = EEPROM.readUInt(225); frequency_SW = EEPROM.readUInt(229); @@ -244,7 +249,8 @@ void setup() { 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); btStop(); - Serial.begin(115200); + + if (USBmode) Serial.begin(19200); else Serial.begin(115200); if (iMSset == 1 && EQset == 1) iMSEQ = 2; if (iMSset == 0 && EQset == 1) iMSEQ = 3; @@ -252,12 +258,12 @@ void setup() { if (iMSset == 0 && EQset == 0) iMSEQ = 1; switch (band) { - case BAND_LW: + case BAND_LW: frequency_LW = frequency_AM; if (stepsize > 3) stepsize = 3; break; - case BAND_MW: - frequency_MW = frequency_AM; + case BAND_MW: + frequency_MW = frequency_AM; if (stepsize > 3) stepsize = 3; break; case BAND_SW: frequency_SW = frequency_AM; break; @@ -280,7 +286,7 @@ void setup() { #endif } - TEF = EEPROM.readByte(54); + TEF = EEPROM.readByte(37); if (TEF != 101 && TEF != 102 && TEF != 205) SetTunerPatch(); @@ -508,7 +514,7 @@ void loop() { } } - XDRGTKRoutine(); + if (USBmode) RDSSpyRoutine(); else XDRGTKRoutine(); if (menu == true && menuopen == true && menupage == 1 && menuoption == 110) { if (band == BAND_FM) radio.getStatus(SStatus, USN, WAM, OStatus, BW, MStatus); else radio.getStatusAM(SStatus, USN, WAM, OStatus, BW, MStatus); @@ -630,13 +636,13 @@ void StoreFrequency() { EEPROM.writeUInt(0, frequency); EEPROM.writeUInt(31, frequency_AM); EEPROM.writeByte(46, band); + EEPROM.writeUInt(221, frequency_LW); + EEPROM.writeUInt(225, frequency_MW); + EEPROM.writeUInt(229, frequency_SW); EEPROM.commit(); } void LimitAMFrequency() { - Serial.println(frequency_LW); - Serial.println(frequency_MW); - Serial.println(frequency_SW); switch (band) { case BAND_LW: frequency_AM = frequency_LW; @@ -749,15 +755,13 @@ void ModeButtonPress() { if (counter - counterold <= 1000) { doTuneMode(); } else { - if (USBstatus == true) { + if (USBstatus == true && USBmode == false) { ShowFreq(1); tft.setFreeFont(FONT14); - tft.setTextFont(4); tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.setCursor (70, 60); tft.drawString("NOT POSSIBLE", 70, 60, GFXFF); delay(1000); - tft.setTextFont(4); tft.setTextColor(TFT_BLACK); tft.drawString("NOT POSSIBLE", 70, 60, GFXFF); ShowFreq(0); @@ -798,7 +802,10 @@ void ModeButtonPress() { EEPROM.writeInt(47, LowLevelSet); EEPROM.writeByte(52, region); EEPROM.writeByte(53, radio.rds.underscore); + EEPROM.writeByte(54, USBmode); EEPROM.commit(); + Serial.end(); + if (USBmode) Serial.begin(19200); else Serial.begin(115200); } while (digitalRead(MODEBUTTON) == LOW) delay(50); delay(100); @@ -1066,6 +1073,13 @@ void ButtonPress() { tft.setTextColor(TFT_YELLOW); if (radio.rds.underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 170: + tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][50], 155, 70, GFXFF); + tft.setTextColor(TFT_YELLOW); + if (USBmode) tft.drawCentreString("RDS Spy", 155, 110, GFXFF); else tft.drawCentreString("XDRGTK", 155, 110, GFXFF); + break; } } } else { @@ -1298,6 +1312,16 @@ void KeyUp() { if (radio.rds.underscore) radio.rds.underscore = false; else radio.rds.underscore = true; tft.setTextColor(TFT_YELLOW); if (radio.rds.underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; + + case 170: + tft.setTextColor(TFT_BLACK); + if (USBmode) tft.drawCentreString("RDS Spy", 155, 110, GFXFF); else tft.drawCentreString("XDRGTK", 155, 110, GFXFF); + if (USBmode) USBmode = false; else USBmode = true; + tft.setTextColor(TFT_YELLOW); + if (USBmode) tft.drawCentreString("RDS Spy", 155, 110, GFXFF); else tft.drawCentreString("XDRGTK", 155, 110, GFXFF); + break; + } } } @@ -1528,6 +1552,15 @@ void KeyDown() { if (radio.rds.underscore) radio.rds.underscore = false; else radio.rds.underscore = true; tft.setTextColor(TFT_YELLOW); if (radio.rds.underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; + + case 170: + tft.setTextColor(TFT_BLACK); + if (USBmode) tft.drawCentreString("RDS Spy", 155, 110, GFXFF); else tft.drawCentreString("XDRGTK", 155, 110, GFXFF); + if (USBmode) USBmode = false; else USBmode = true; + tft.setTextColor(TFT_YELLOW); + if (USBmode) tft.drawCentreString("RDS Spy", 155, 110, GFXFF); else tft.drawCentreString("XDRGTK", 155, 110, GFXFF); + break; } } } @@ -1590,7 +1623,25 @@ void readRds() { } } - if (RDSstatus == 1 && USBstatus == true) { + if (RDSstatus == 1 && USBstatus == true && USBmode == true) { + RDSSPYRDS = "G:\r\n"; + RDSSPYRDS += String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsB >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsB >> 8) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsB) >> 4) & 0xF, HEX) + String((radio.rds.rdsB) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsC >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsC >> 8) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsC) >> 4) & 0xF, HEX) + String((radio.rds.rdsC) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsD >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsD >> 8) & 0xF, HEX); + RDSSPYRDS += String(((radio.rds.rdsD) >> 4) & 0xF, HEX) + String((radio.rds.rdsD) & 0xF, HEX); + RDSSPYRDS += "\r\n\r\n"; + + if (RDSSPYRDS != RDSSPYRDSold) { + RDSSPYRDSold = RDSSPYRDS; + Serial.print(RDSSPYRDS); + } + } + + if (RDSstatus == 1 && USBstatus == true && USBmode == false) { Serial.print ("P"); Serial.print (String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX)); Serial.print (String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX)); @@ -1804,6 +1855,7 @@ void BuildMenu() { 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.drawString(myLanguage[language][50], 14, 170, 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); @@ -1813,6 +1865,7 @@ void BuildMenu() { if (region == 0) tft.drawRightString(myLanguage[language][47], 305, 130, GFXFF); if (region == 1) tft.drawRightString(myLanguage[language][48], 305, 130, GFXFF); if (radio.rds.underscore) tft.drawRightString(myLanguage[language][42], 305, 150, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 150, GFXFF); + if (USBmode) tft.drawRightString("RDS Spy", 305, 170, GFXFF); else tft.drawRightString("XDRGTK", 305, 170, GFXFF); break; } analogWrite(SMETERPIN, 0); @@ -2670,6 +2723,38 @@ void ShowUSBstatus() { if (USBstatus == true) tft.drawBitmap(272, 6, USBLogo, 43, 21, TFT_SKYBLUE); else tft.drawBitmap(272, 6, USBLogo, 43, 21, TFT_GREYOUT); } +void RDSSpyRoutine() { + if (Serial.available()) { + String data_str = Serial.readStringUntil('\n'); + int data = data_str.toInt(); + if (data_str.length() > 1 && data_str == ("*D*R?F")) USBstatus = true; + int symPos = data_str.indexOf("*F"); + if (symPos >= 5) { + String freq = data_str.substring(0, symPos); + freq = freq.substring(0, freq.length() - 1); + frequency = freq.toInt(); + radio.SetFreq(frequency); + radio.clearRDS(fullsearchrds); + if (band != 0) { + band = 0; + LowLevelInit == false; + BWreset = true; + BWset = 0; + radio.power(0); + delay(50); + radio.SetFreq(frequency); + radio.clearRDS(fullsearchrds); + freqold = frequency_AM; + doBW; + radio.getStatus(SStatus, USN, WAM, OStatus, BW, MStatus); + if (screenmute == false) BuildDisplay(); + } + ShowFreq(0); + store = true; + } + } +} + void XDRGTKRoutine() { if (Serial.available()) { buff[buff_pos] = Serial.read(); @@ -3047,6 +3132,7 @@ void TuneUp() { frequency_SW = frequency_AM; } radio.clearRDS(fullsearchrds); + if (RDSstatus == 1 && USBstatus == true && USBmode == true) Serial.print("G:\r\nRESET-------\r\n\r\n"); } void TuneDown() { @@ -3109,6 +3195,7 @@ void TuneDown() { frequency_SW = frequency_AM; } radio.clearRDS(fullsearchrds); + if (RDSstatus == 1 && USBstatus == true && USBmode == true) Serial.print("G:\r\nRESET-------\r\n\r\n"); } void EdgeBeeper() { diff --git a/src/language.h b/src/language.h index 29b7fba..a1ada87 100644 --- a/src/language.h +++ b/src/language.h @@ -1,7 +1,7 @@ // [number of languages][number of texts][max. length of text] -const char myLanguage[9][50][100] = { - { "English", // English +const char myLanguage[9][51][100] = { + { "English", // English "Rotary direction changed", "Please release button", "Screen flipped", @@ -43,17 +43,18 @@ const char myLanguage[9][50][100] = { "Language", "Choose language", "PRESS MODE TO EXIT AND STORE", - "On", - "Softmute FM", - "Softmute AM", - "Beep at band edge", - "Region", - "Europe", - "USA", - "Show underscore in RDS" + "On", + "Softmute FM", + "Softmute AM", + "Beep at band edge", + "Region", + "Europe", + "USA", + "Show underscore in RDS", + "USB mode" }, - - { "Nederlands", // Dutch + + { "Nederlands", // Dutch "Rotary richting aangepast", "Laat aub de knop los", "Scherm gedraaid", @@ -95,121 +96,124 @@ const char myLanguage[9][50][100] = { "Taal", "Kies taal", "DRUK OP MODE OM AF TE SLUITEN", - "Aan", - "Softmute FM", - "Softmute AM", - "Piep op bandeinde", - "Regio", - "Europa", - "USA", - "Toon underscore in RDS" + "Aan", + "Softmute FM", + "Softmute AM", + "Piep op bandeinde", + "Regio", + "Europa", + "USA", + "Toon underscore in RDS", + "USB mode" }, - - { "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", - "Region", - "Europe", - "USA", - "Show underscore in RDS" - }, - - {"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 RDS" - }, - - {"Ελληνικά", // Greek + + { "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", + "Region", + "Europe", + "USA", + "Show underscore in RDS", + "USB mode" + }, + + { "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 RDS", + "USB mode" + }, + + { "Ελληνικά", // Greek "Η διεύθυνση του ρότορα άλλαξε", "Παρακαλώ ελευθερώστε το πλήκτρο", "Η οθόνη αναποδογύρισε", @@ -251,17 +255,18 @@ const char myLanguage[9][50][100] = { "Γλώσσα", "Επιλογή γλώσσας", "ΠΙΕΣΤΕ ΤΟ MODE ΓΙΑ ΕΞΟΔΟ & ΑΠΟΘΗΚΕΥΣΗ", - "Ενεργό", - "Softmute FM", - "Softmute AM", - "Ηχητικό σήμα στο όριο μπάντας", - "Περιοχή", - "Ευρώπη", - "Η.Π.Α.", - "Εμφάνιση κάτω παύλας στο RDS" - }, - - { "Romana", // Romana + "Ενεργό", + "Softmute FM", + "Softmute AM", + "Ηχητικό σήμα στο όριο μπάντας", + "Περιοχή", + "Ευρώπη", + "Η.Π.Α.", + "Εμφάνιση κάτω παύλας στο RDS", + "USB mode" + }, + + { "Romana", // Romana "Sens rotire schimbat", "Eliberati butonul", "Ecran inversat", @@ -310,10 +315,11 @@ const char myLanguage[9][50][100] = { "Regiune", "Europa", "SUA", - "Arata evidentiat in RDS" + "Arata evidentiat in RDS", + "USB mode" }, - - { "Deutsch", // German + + { "Deutsch", // German "Drehrichtung geändert", "Bitte Taste loslassen", "Bildschirm gedreht", @@ -354,17 +360,18 @@ const char myLanguage[9][50][100] = { "Zeige RDS Fehler", "Sprache", "Sprache wählen", - "MODE DRÜCKEN ZUM BEENDEN UND SICHERN", - "Ein", - "Softmute FM", - "Softmute AM", - "Piepston bei Bandende", - "Region", - "Europa", - "USA", - "Zeige Unterstrich im RDS" + "MODE DRÜCKEN ZUM BEENDEN UND SICHERN", + "Ein", + "Softmute FM", + "Softmute AM", + "Piepston bei Bandende", + "Region", + "Europa", + "USA", + "Zeige Unterstrich im RDS", + "USB mode" }, - { "Czech", // English + { "Czech", // English "Směr enkóderu byl změněn", "Prosím, pusťte tlačítko", "Obrazovka otočena", @@ -406,16 +413,17 @@ const char myLanguage[9][50][100] = { "Jazyk", "Vyberte jazyk", "ZMÁČKNĚTE MODE PRO VYPNUTÍ A ULOŽENÍ", - "Zap", - "Softmute FM", - "Softmute AM", - "Pípnutí na konci pásma", - "Region", - "Evropa", - "USA", - "Zobrazit podtržítka v RDS" + "Zap", + "Softmute FM", + "Softmute AM", + "Pípnutí na konci pásma", + "Region", + "Evropa", + "USA", + "Zobrazit podtržítka v RDS", + "USB mode" }, - { "Slovak", // English + { "Slovak", // English "Smer enkóderu bol zmenený", "Prosím, pusťte tlačidlo", "Obrazovka otočená", @@ -457,13 +465,14 @@ const char myLanguage[9][50][100] = { "Jazyk", "Vyberte jazyk", "STLAČTE MODE PRE VYPNUTIE A ULOŽENIE", - "Zap", - "Softmute FM", - "Softmute AM", - "Pípnutie na konci pásma", - "Region", - "Európa", - "USA", - "Zobraziť podtržítka v RDS" + "Zap", + "Softmute FM", + "Softmute AM", + "Pípnutie na konci pásma", + "Region", + "Európa", + "USA", + "Zobraziť podtržítka v RDS", + "USB mode" }, };