diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 80c48d7..ab50245 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -191,7 +191,7 @@ byte amgain; byte freqoldcount; byte HighCutLevel; byte HighCutOffset; -byte items[10] = {10, static_cast(dynamicspi ? 10 : 9), 7, 10, 10, 10, 9, 9, 10, 9}; +byte items[10] = {10, static_cast(dynamicspi ? 10 : 9), 7, 10, 10, 10, 9, 10, 10, 9}; byte iMSEQ; byte iMSset; byte language; @@ -591,6 +591,7 @@ void setup() { autoDST = EEPROM.readByte(EE_BYTE_AUTODST); clockampm = EEPROM.readByte(EE_BYTE_CLOCKAMPM); logcounter = EEPROM.readUInt(EE_UINT16_LOGCOUNTER); + radio.rds.PICTlock = EEPROM.readUInt(EE_UINT16_PICTLOCK); #ifdef DYNAMIC_SPI_SPEED if (spispeed == SPI_SPEED_DEFAULT) { @@ -4581,6 +4582,7 @@ void DefaultSettings() { EEPROM.writeByte(EE_BYTE_AUTOLOG, 1); EEPROM.writeByte(EE_BYTE_AUTODST, 1); EEPROM.writeByte(EE_BYTE_CLOCKAMPM, 0); + EEPROM.writeUInt(EE_UINT16_PICTLOCK, 0); #ifdef DEEPELEC_DP_66X EEPROM.writeByte(EE_BYTE_ROTARYMODE, 1); @@ -4836,6 +4838,7 @@ void endMenu() { EEPROM.writeByte(EE_BYTE_AUTOLOG, autolog); EEPROM.writeByte(EE_BYTE_AUTODST, autoDST); EEPROM.writeByte(EE_BYTE_CLOCKAMPM, clockampm); + EEPROM.writeUInt(EE_UINT16_PICTLOCK, radio.rds.PICTlock); EEPROM.commit(); if (af == 2) radio.rds.afreg = true; else radio.rds.afreg = false; Serial.end(); diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 6b89c65..3f59ca9 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -1341,7 +1341,7 @@ void TEF6686::readRDS(byte showrdserrors) { } break; case RDS_GROUP_4A: { - if (!rdsBerrorThreshold && !rdsCerrorThreshold && !rdsDerrorThreshold && rds.ctupdate) { + if (!rdsBerrorThreshold && !rdsCerrorThreshold && !rdsDerrorThreshold && rds.ctupdate && (rds.PICTlock == rds.rdsA || rds.PICTlock == 0)) { // CT uint32_t mjd; mjd = (rds.rdsB & 0x03); diff --git a/src/TEF6686.h b/src/TEF6686.h index 555c20f..869d648 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -578,7 +578,7 @@ typedef struct _rds_ { char stationState[3]; char dabafeid[5]; char dabafchannel[4]; - uint16_t rdsA, rdsB, rdsC, rdsD, rdsErr, rdsStat, correctPI, rdsplusTag1, rdsplusTag2; + uint16_t rdsA, rdsB, rdsC, rdsD, rdsErr, rdsStat, correctPI, rdsplusTag1, rdsplusTag2, PICTlock = 0; bool ps12error, ps34error, ps56error, ps78error; time_t time; int32_t offset; diff --git a/src/constants.h b/src/constants.h index 13a5b36..6946a76 100644 --- a/src/constants.h +++ b/src/constants.h @@ -225,9 +225,9 @@ #define EE_CHECKBYTE_VALUE 10 // 0 ~ 255,add new entry, change for new value #define EE_PRESETS_FREQUENCY 0 // Default value when memory channel should be skipped! #ifdef HAS_AIR_BAND -#define EE_TOTAL_CNT 2288 // Total occupied eeprom bytes +#define EE_TOTAL_CNT 2292 // Total occupied eeprom bytes #else -#define EE_TOTAL_CNT 2283 // Total occupied eeprom bytes +#define EE_TOTAL_CNT 2287 // Total occupied eeprom bytes #endif #define EE_PRESETS_BAND_START 0 // 99 * 1 byte @@ -350,9 +350,10 @@ #define EE_BYTE_AUTODST 2277 #define EE_BYTE_CLOCKAMPM 2278 #define EE_UINT16_LOGCOUNTER 2279 +#define EE_UINT16_PICTLOCK 2283 #ifdef HAS_AIR_BAND -#define EE_BYTE_AIRSTEPSIZE 2283 -#define EE_UINT16_FREQUENCY_AIR 2284 +#define EE_BYTE_AIRSTEPSIZE 2287 +#define EE_UINT16_FREQUENCY_AIR 2288 #endif // End of EEPROM index defines diff --git a/src/gui.cpp b/src/gui.cpp index 76aed65..170574a 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -1588,6 +1588,21 @@ void ShowOneLine(byte position, byte item, bool selected) { FullLineSprite.drawString(String(fmscansens), 298, 2); break; + + case CONNECTIVITY: + FullLineSprite.setTextDatum(TL_DATUM); + FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + FullLineSprite.drawString(removeNewline(myLanguage[language][301]), 6, 2); + + char PICT[5]; + sprintf(PICT, "%04X", radio.rds.PICTlock); + FullLineSprite.setTextDatum(TR_DATUM); + FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + FullLineSprite.drawString((radio.rds.PICTlock == 0 ? myLanguage[language][30] : myLanguage[language][42]), 298, 2); + FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + FullLineSprite.drawString((radio.rds.PICTlock != 0 ? String(PICT) : ""), 258, 2); + break; + case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -2678,6 +2693,29 @@ void ShowOneButton(byte position, byte item, bool selected) { PSSprite.drawString(String(fmscansens), 75, 15); break; + case CONNECTIVITY: + PSSprite.setTextDatum(TC_DATUM); + PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + PSSprite.drawString(shortLine(removeNewline(myLanguage[language][301])), 75, 1); + + + if (radio.rds.PICTlock == 0) { + PSSprite.setTextDatum(TC_DATUM); + PSSprite.drawString(myLanguage[language][30], 75, 15); + } else { + char PICT[5]; + sprintf(PICT, "%04X", radio.rds.PICTlock); + + PSSprite.setTextDatum(TL_DATUM); + PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + PSSprite.drawString(myLanguage[language][42], 77, 15); + PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + PSSprite.setTextDatum(TR_DATUM); + PSSprite.drawString(String(PICT), 73, 15); + } + break; + + case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -3853,6 +3891,32 @@ void MenuUp() { OneBigLineSprite.drawString((clockampm ? "12" : "24"), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; + + case ITEM10: + char PICT[5]; + OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + + if (radio.rds.PICTlock != 0) { + OneBigLineSprite.setTextDatum(TC_DATUM); + OneBigLineSprite.drawString(myLanguage[language][30], 135, 0); + radio.rds.PICTlock = 0; + } else { + if (radio.rds.correctPI != 0) { + radio.rds.PICTlock = radio.rds.correctPI; + sprintf(PICT, "%04X", radio.rds.PICTlock); + OneBigLineSprite.setTextDatum(TR_DATUM); + OneBigLineSprite.drawString(myLanguage[language][42], 135, 0); + OneBigLineSprite.setTextDatum(TL_DATUM); + OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + OneBigLineSprite.drawString(String(PICT), 155, 0); + } else { + OneBigLineSprite.setTextDatum(TC_DATUM); + OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + OneBigLineSprite.drawString(myLanguage[language][302], 135, 0); + } + } + OneBigLineSprite.pushSprite(24, 118); + break; } break; @@ -4838,6 +4902,32 @@ void MenuDown() { OneBigLineSprite.drawString((clockampm ? "12" : "24"), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; + + case ITEM10: + char PICT[5]; + OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + + if (radio.rds.PICTlock != 0) { + OneBigLineSprite.setTextDatum(TC_DATUM); + OneBigLineSprite.drawString(myLanguage[language][30], 135, 0); + radio.rds.PICTlock = 0; + } else { + if (radio.rds.correctPI != 0) { + radio.rds.PICTlock = radio.rds.correctPI; + sprintf(PICT, "%04X", radio.rds.PICTlock); + OneBigLineSprite.setTextDatum(TR_DATUM); + OneBigLineSprite.drawString(myLanguage[language][42], 135, 0); + OneBigLineSprite.setTextDatum(TL_DATUM); + OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + OneBigLineSprite.drawString(String(PICT), 155, 0); + } else { + OneBigLineSprite.setTextDatum(TC_DATUM); + OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + OneBigLineSprite.drawString(myLanguage[language][302], 135, 0); + } + } + OneBigLineSprite.pushSprite(24, 118); + break; } break; @@ -5881,6 +5971,25 @@ void DoMenu() { OneBigLineSprite.drawString((clockampm ? "12" : "24"), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; + + case ITEM10: + Infoboxprint(myLanguage[language][301]); + + char PICT[5]; + OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); + + if (radio.rds.PICTlock == 0) { + OneBigLineSprite.setTextDatum(TC_DATUM); + OneBigLineSprite.drawString(myLanguage[language][30], 135, 0); + } else { + sprintf(PICT, "%04X", radio.rds.PICTlock); + OneBigLineSprite.setTextDatum(TR_DATUM); + OneBigLineSprite.drawString(myLanguage[language][42], 135, 0); + OneBigLineSprite.setTextDatum(TL_DATUM); + OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); + OneBigLineSprite.drawString(String(PICT), 155, 0); + } + OneBigLineSprite.pushSprite(24, 118); } break; diff --git a/src/language.h b/src/language.h index 2c4e7e4..85f5694 100644 --- a/src/language.h +++ b/src/language.h @@ -5,7 +5,7 @@ // [number of languages][number of texts] -static const char* const myLanguage[18][301] PROGMEM = { +static const char* const myLanguage[18][303] PROGMEM = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -306,7 +306,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Nederlands", // Dutch @@ -609,7 +611,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logboek vol!", // 297 "Klok methode", // 298 "Auto zomertijd\nop NTP tijd", // 299 - "Het logboek bevat meer dan 130 items, die de viewer niet kan verwerken. Download alstublieft het CSV-bestand om het te bekijken." // 300 + "Het logboek bevat meer dan 130 items, die de viewer niet kan verwerken. Download alstublieft het CSV-bestand om het te bekijken.", // 300 + "PI gebonden CT sync", // 301 + "Fout! Geen RDS!" // 302 }, { "Polski", // Polish @@ -912,7 +916,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Wykaz pełny!", // 297 "Tryb zegara", // 298 "Auto czas letni wg NTP", // 299 - "Wykaz zawiera ponad 130 wpisów, których przeglądarka nie może pokazać. Pobierz plik CSV, aby je przetworzyć." // 300 + "Wykaz zawiera ponad 130 wpisów, których przeglądarka nie może pokazać. Pobierz plik CSV, aby je przetworzyć.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Hrvatski", // Croatian @@ -1215,7 +1221,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Ελληνικά", // Greek @@ -1518,7 +1526,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Βιβλίο γεμάτο!", // 297 "Λειτουργία ρολογιού", // 298 "Αυτόματο DST\nσε ώρα NTP", // 299 - "Το βιβλίο περιέχει πάνω από 130 καταγραφές, και είναι αδύνατη η επεξεργασία τους από το χρήστη. Κάντε λήψη του αρχείου CSV για να το επεξεργαστείτε." // 300 + "Το βιβλίο περιέχει πάνω από 130 καταγραφές, και είναι αδύνατη η επεξεργασία τους από το χρήστη. Κάντε λήψη του αρχείου CSV για να το επεξεργαστείτε.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Română", // Romanian @@ -1821,7 +1831,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Deutsch", // German @@ -2124,10 +2136,12 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbuch ist voll!", // 297 "Uhrzeit-Modus", // 298 "Auto-Sommerzeit\nüber NTP", // 299 - "Das Logbuch enthält mehr als 130 Einträge, was der Viewer nicht verarbeiten kann. Bitte lade die CSV-Datei zum Verarbeiten herunter." // 300 + "Das Logbuch enthält mehr als 130 Einträge, was der Viewer nicht verarbeiten kann. Bitte lade die CSV-Datei zum Verarbeiten herunter.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, - { "Čeština", // Czech + { "Čeština", // Czech "Směr enkodéru byl změněn", // 1 "Prosím, pusťte tlačítko", // 2 "Obrazovka otočena", // 3 @@ -2427,7 +2441,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook je plný!", // 297 "Režim hodin", // 298 "Automatický letní čas u NTP času", // 299 - "Logbook obsahuje více než 130 položek, které prohlížeč nedokáže zpracovat. Pro zpracování všech položek si stáhněte CSV soubor." // 300 + "Logbook obsahuje více než 130 položek, které prohlížeč nedokáže zpracovat. Pro zpracování všech položek si stáhněte CSV soubor.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Magyar", // Hungarian @@ -2730,7 +2746,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Français", // French @@ -3033,7 +3051,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Journal de bord plein!", // 297 "Mode horloge", // 298 "DST automatique\nsur l'heure NTP", // 299 - "Le journal de bord contient plus de 130 entrées que le spectateur ne peut pas traiter. Télécharger le fichier CSV pour le traiter." // 300 + "Le journal de bord contient plus de 130 entrées que le spectateur ne peut pas traiter. Télécharger le fichier CSV pour le traiter.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Български", // Bulgarian @@ -3336,7 +3356,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Русский", // Russian @@ -3639,7 +3661,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Українська", // Ukranian @@ -3942,7 +3966,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Italiano", // Italian @@ -4245,7 +4271,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.",// 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Simplified Chinese", // Simplified Chinese @@ -4548,7 +4576,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Logbook full!", // 297 "Clock mode", // 298 "Auto DST on NTP time", // 299 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it." // 300 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Norsk", // Norwegian @@ -4851,7 +4881,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Loggbok full!", // 297 "Klokkemodus", // 298 "Auto sommertid på NTP-tid", // 299 - "Loggboken inneholder over 130 oppføringer, som en ikke kan behandle. Last ned CSV-filen for å behandle den." // 300 + "Loggboken inneholder over 130 oppføringer, som en ikke kan behandle. Last ned CSV-filen for å behandle den.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Español", // Spanish @@ -5154,7 +5186,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "¡Libro lleno!", // 297 "Modo reloj", // 298 "DST automático\nen hora NTP", // 299 - "El libro de registro contiene más de 130 entradas que el visor no puede procesar. Descargue el archivo CSV para procesarlo." // 300 + "El libro de registro contiene más de 130 entradas que el visor no puede procesar. Descargue el archivo CSV para procesarlo.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 }, { "Português", // Portuguese @@ -5457,7 +5491,9 @@ static const char* const myLanguage[18][301] PROGMEM = { "Livro cheio!", // 297 "Modo de relógio", // 298 "DST automático\nno horário NTP", // 299 - "O diário de bordo contém mais de 130 entradas que o espectador não consegue processar. Descarregue o ficheiro CSV para processá-lo." // 300 + "O diário de bordo contém mais de 130 entradas que o espectador não consegue processar. Descarregue o ficheiro CSV para processá-lo.", // 300 + "PI locked CT sync", // 301 + "Error! No RDS signal" // 302 } }; -#endif +#endif \ No newline at end of file