From 00d78899f6cb92f49182559f95c93b2562668ffc Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Thu, 6 Jul 2023 20:36:19 +0200 Subject: [PATCH] Fixed theme selector Also finished EON in API --- TEF6686_ESP32.ino | 86 +++++++++++++++----------------------- src/TEF6686.cpp | 97 ++++++++++++++++++++++++------------------- src/TEF6686.h | 24 ++++++----- src/language.h | 103 +++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 193 insertions(+), 117 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index a293201..48c2295 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -88,6 +88,7 @@ int batupdatetimer; byte BWset; byte colorinvert; byte ContrastSet; +byte CurrentTheme; byte displayflip; byte ECCold; byte EQset; @@ -166,8 +167,6 @@ int ActiveColor; int OptimizerColor; int RDSColor; int StereoColor; -int CurrentTheme; - int16_t OStatus; int16_t SAvg; int16_t SAvg2; @@ -250,8 +249,8 @@ WiFiUDP Udp; void setup() { setupmode = true; - EEPROM.begin(265); - if (EEPROM.readByte(43) != 28) DefaultSettings(); + EEPROM.begin(261); + if (EEPROM.readByte(43) != 29) DefaultSettings(); frequency = EEPROM.readUInt(0); VolSet = EEPROM.readInt(4); @@ -302,7 +301,7 @@ void setup() { HighEdgeOIRTSet = EEPROM.readUInt(254); colorinvert = EEPROM.readByte(258); deepsleep = EEPROM.readByte(259); - CurrentTheme = EEPROM.readInt(260); + CurrentTheme = EEPROM.readByte(260); LWLowEdgeSet = FREQ_LW_LOW_EDGE_MIN; // later will read from flash LWHighEdgeSet = FREQ_LW_HIGH_EDGE_MAX; // later will read from flash @@ -350,7 +349,7 @@ void setup() { tft.init(); tft.invertDisplay(colorinvert); - + doTheme(); if (displayflip == 0) { #ifdef ARS tft.setRotation(0); @@ -471,7 +470,7 @@ void setup() { uint16_t device; uint16_t hw; uint16_t sw; - doTheme(); + radio.getIdentification(device, hw, sw); if (TEF != (highByte(hw) * 100 + highByte(sw))) SetTunerPatch(); tft.fillRect(120, 230, 16, 6, PrimaryColor); @@ -717,7 +716,7 @@ void SleepWake(bool isSleep) { analogWrite(CONTRASTPIN, 0); StoreFrequency(); if (deepsleep) radio.power(1); - }else { + } else { if (deepsleep) { ESP.restart(); } @@ -1237,10 +1236,10 @@ void ModeButtonPress() { tft.setFreeFont(FONT14); tft.setTextColor(ActiveColor, BackgroundColor); tft.setCursor (70, 60); - tft.drawString("NOT POSSIBLE", 70, 60, GFXFF); + tft.drawString(myLanguage[language][86], 70, 60, GFXFF); delay(1000); tft.setTextColor(BackgroundColor); - tft.drawString("NOT POSSIBLE", 70, 60, GFXFF); + tft.drawString(myLanguage[language][86], 70, 60, GFXFF); ShowFreq(0); } else { if (menu == false) { @@ -1308,7 +1307,7 @@ void ModeButtonPress() { EEPROM.writeUInt(254, HighEdgeOIRTSet); EEPROM.writeByte(258, colorinvert); EEPROM.writeByte(259, deepsleep); - EEPROM.writeInt(260, CurrentTheme); + EEPROM.writeByte(260, CurrentTheme); EEPROM.commit(); Serial.end(); if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient); @@ -1734,10 +1733,9 @@ void ButtonPress() { switch (menuoption) { case 30: tft.setTextColor(TFT_WHITE); - tft.drawCentreString(myLanguage[language][77], 150, 70, 4); - doTheme(); + tft.drawCentreString(myLanguage[language][77], 155, 70, GFXFF); tft.setTextColor(TFT_WHITE); - tft.drawCentreString(CurrentThemeString, 150, 110, 4); + tft.drawCentreString(CurrentThemeString, 155, 110, GFXFF); break; case 50: @@ -2145,15 +2143,12 @@ void KeyUp() { switch (menuoption) { case 30: tft.setTextColor(TFT_BLACK); - tft.drawCentreString(CurrentThemeString, 150, 110, 4); - CurrentTheme += 1; - if (CurrentTheme > 7) { - CurrentTheme = 0; - } - + tft.drawCentreString(CurrentThemeString, 155, 110, GFXFF); + CurrentTheme ++; + if (CurrentTheme > 7) CurrentTheme = 0; doTheme(); - tft.setTextColor(ActiveColor); - tft.drawCentreString(CurrentThemeString, 150, 110, 4); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString(CurrentThemeString, 155, 110, GFXFF); break; case 70: tft.setTextColor(TFT_BLACK); @@ -2536,16 +2531,14 @@ void KeyDown() { switch (menuoption) { case 30: tft.setTextColor(TFT_BLACK); - tft.drawCentreString(CurrentThemeString, 150, 110, 4); - CurrentTheme -= 1; - if (CurrentTheme < 0) { - CurrentTheme = 7; - } - + tft.drawCentreString(CurrentThemeString, 155, 110, GFXFF); + CurrentTheme --; + if (CurrentTheme > 7) CurrentTheme = 7; doTheme(); - tft.setTextColor(ActiveColor); - tft.drawCentreString(CurrentThemeString, 150, 110, 4); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString(CurrentThemeString, 155, 110, GFXFF); break; + case 70: tft.setTextColor(TFT_BLACK); if (deepsleep) tft.drawCentreString(myLanguage[language][75], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][76], 155, 110, GFXFF); @@ -4822,7 +4815,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = TFT_RED; RDSColor = PrimaryColor; - CurrentThemeString = "Default"; + CurrentThemeString = myLanguage[language][78]; break; case 1: // Cyan theme PrimaryColor = 0x0F3F; @@ -4835,7 +4828,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = 0xF3F; RDSColor = 0xFFFF; - CurrentThemeString = "Cyan"; + CurrentThemeString = myLanguage[language][79]; break; case 2: // Crimson theme PrimaryColor = 0xF8C3; @@ -4848,7 +4841,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = 0xF8C3; RDSColor = 0xFFFF; - CurrentThemeString = "Crimson"; + CurrentThemeString = myLanguage[language][80]; break; case 3: // Monochrome theme PrimaryColor = 0xFFFF; @@ -4861,7 +4854,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = 0xFFFF; RDSColor = 0xFFFF; - CurrentThemeString = "Monochrome"; + CurrentThemeString = myLanguage[language][81]; break; case 4: // Volcano theme PrimaryColor = 0xFC00; @@ -4874,7 +4867,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = 0xFC00; RDSColor = 0xFFFF; - CurrentThemeString = "Volcano"; + CurrentThemeString = myLanguage[language][82]; break; case 5: // Dendro theme PrimaryColor = TFT_GREEN; @@ -4887,7 +4880,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = TFT_GREEN; RDSColor = PrimaryColor; - CurrentThemeString = "Dendro"; + CurrentThemeString = myLanguage[language][83]; break; case 6: // Sakura theme PrimaryColor = 0xF3D5; @@ -4900,7 +4893,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 1; StereoColor = 0xF3D5; RDSColor = ActiveColor; - CurrentThemeString = "Sakura"; + CurrentThemeString = myLanguage[language][84]; break; case 7: // Whiteout theme PrimaryColor = 0x0000; @@ -4913,20 +4906,7 @@ void doTheme() { // Use this to put your own colors in: http://www.barth-dev.de OptimizerColor = 0xFFDF; StereoColor = 0x0000; RDSColor = 0x0000; - CurrentThemeString = "Whiteout"; - break; - default: - PrimaryColor = 0xFFE0; - SecondaryColor = 0xFFFF; - FrequencyColor = 0xFFE0; - FrameColor = 0x001F; - GreyoutColor = 0x38E7; - BackgroundColor = 0x0000; - ActiveColor = 0xFFFF; - OptimizerColor = 1; - StereoColor = TFT_RED; - RDSColor = PrimaryColor; - CurrentThemeString = "Default"; + CurrentThemeString = myLanguage[language][85]; break; } } @@ -5000,7 +4980,7 @@ void passwordcrypt() { } void DefaultSettings() { - EEPROM.writeByte(43, 28); + EEPROM.writeByte(43, 29); EEPROM.writeUInt(0, 10000); EEPROM.writeInt(4, 0); EEPROM.writeUInt(8, 0); @@ -5052,6 +5032,6 @@ void DefaultSettings() { EEPROM.writeUInt(254, 0); EEPROM.writeByte(258, 0); EEPROM.writeByte(259, 0); - EEPROM.writeInt(260, 0); + EEPROM.writeByte(260, 0); EEPROM.commit(); } diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index f610817..f5f51bb 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -420,8 +420,7 @@ void TEF6686::readRDS(bool showrdserrors) } } break; - case RDS_GROUP_4A: - case RDS_GROUP_4B: { + case RDS_GROUP_4A: { if (rds.correct) { // CT uint32_t mjd; @@ -561,47 +560,57 @@ void TEF6686::readRDS(bool showrdserrors) break; case RDS_GROUP_14A: { - if (rds.correct) rds.hasEON = true; // Group is there, so we have EON + // EON + if (rds.correct) { + rds.hasEON = true; // Group is there, so we have EON - bool isValuePresent = false; - for (int i = 0; i < 5; i++) { - if (eon[i].pi == rds.rdsD) { - isValuePresent = true; - break; - } - } + bool isValuePresent = false; + for (int i = 0; i < 5; i++) { + if (eon[i].pi == rds.rdsD) { // Check if EON is already in array + isValuePresent = true; + break; + } + } - if (!isValuePresent) { - eon[eon_counter].pi = rds.rdsD; - eon_counter++; - } - - offset = rds.rdsB & 0x0F; - if (offset < 4) { - byte position; - for (position = 0; position < 5; position++) { - if (eon[position].pi == rds.rdsD) { - break; - } - } - eon[position].ps[(offset * 2) + 0] = rds.rdsC >> 8; // First character of segment - eon[position].ps[(offset * 2) + 1] = rds.rdsC & 0xFF; // Second character of segment - eon[position].ps[(offset * 2) + 2] = '\0'; // Endmarker of segment - } + if (!isValuePresent) { + eon[eon_counter].pi = rds.rdsD; // Store PI on next array + eon_counter++; + } -// if (offset == 5 && rds.rdsD == 0xF202) { -// if (((rds.rdsC >> 8) * 10 +8750) == currentfreq) { - // uint16_t mapped = ((rds.rdsC & 0xFF) * 10 + 8750); -// Serial.print(currentfreq); -// Serial.print("\t"); -// Serial.println(mapped); -// } -// } + offset = rds.rdsB & 0x0F; // Read offset -// for (int i = 0; i < 5; i++) Serial.println(String(i) + "\t" + String(eon[i].pi,HEX) + "\t" + String(eon[i].ps)); -// Serial.println("----"); - - } + if (offset < 4) { + byte position; + for (position = 0; position < 5; position++) { + if (eon[position].pi == rds.rdsD) { // Find position in array + break; + } + } + + eon_buffer2[position][(offset * 2) + 0] = eon_buffer[position][(offset * 2) + 0]; // Make a copy of the PS buffer + eon_buffer2[position][(offset * 2) + 1] = eon_buffer[position][(offset * 2) + 1]; + + eon_buffer[position][(offset * 2) + 0] = rds.rdsC >> 8; // First character of segment + eon_buffer[position][(offset * 2) + 1] = rds.rdsC & 0xFF; // Second character of segment + eon_buffer[position][(offset * 2) + 2] = '\0'; // Endmarker of segment + + if (offset > 2) { // Last chars are received + if (eon_buffer[position] != eon_buffer2[position]) { // When difference between old and new, let's go... + RDScharConverter(eon_buffer[position], EONPStext, sizeof(EONPStext) / sizeof(wchar_t), true); // Convert 8 bit ASCII to 16 bit ASCII + String utf8String = convertToUTF8(EONPStext); // Convert RDS characterset to ASCII + eon[position].ps = extractUTF8Substring(utf8String, 0, 8, true); // Make sure PS does not exceed 8 characters + } + } + + if (offset > 4 && offset < 9) { + if (((rds.rdsC >> 8) * 10 + 8750) == currentfreq) { // Check if mapped frequency belongs to current frequency + eon[position].mappedfreq = ((rds.rdsC & 0xFF) * 10 + 8750); // Add mapped frequency to array + } + } + + } + } + } break; } } @@ -643,10 +652,14 @@ void TEF6686::clearRDS (bool fullsearchrds) for (i = 0; i < 18; i++) rds.stationType[i] = 0; for (i = 0; i < 6; i++) rds.picode[i] = 0; for (i = 0; i < 50; i++) af[i].frequency = 0; - + for (i = 0; i < 5; i++) { - eon[i].pi = 0; - for (int y = 0; y < 9; y++) eon[i].ps[y] = 0; + eon[i].pi = 0; + for (int y = 0; y < 9; y++) { + eon_buffer[i][y] = 0; + eon_buffer2[i][y] = 0; + } + eon[i].ps = ""; } for (i = 0; i < 45; i++) { diff --git a/src/TEF6686.h b/src/TEF6686.h index 234a361..e7b238d 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -141,16 +141,16 @@ typedef struct _af_ { } af_; typedef struct _eon_ { - uint16_t mappedfreq; - uint16_t pi; - char ps[9]; + uint16_t mappedfreq; + uint16_t pi; + String ps; } eon_; class TEF6686 { public: af_ af[50]; - eon_ eon[5]; + eon_ eon[5]; rds_ rds; void readRDS(bool showrdserrors); void SetFreq(uint16_t frequency); @@ -201,16 +201,17 @@ class TEF6686 { String extractUTF8Substring(const String& utf8String, size_t start, size_t length, bool under); char ps_buffer[9]; char ps_buffer2[9]; - char ptyn_buffer[9]; - char eon_buffer[9]; + char ptyn_buffer[9]; + char eon_buffer[9][5]; + char eon_buffer2[9][5]; bool ps_process; bool rt_process; char rt_buffer[65]; char rt_buffer2[65]; bool useRTPlus = true; bool checkDouble (uint16_t value); - bool checkDoubleEON (uint16_t value); - byte eon_counter; + bool checkDoubleEON (uint16_t value); + byte eon_counter; bool ABold; char stationTextBuffer[65]; uint64_t doublecheck; @@ -219,11 +220,12 @@ class TEF6686 { uint16_t rdsDprevious; bool rtABold; wchar_t PStext[9] = L""; - wchar_t PTYNtext[9] = L""; + wchar_t EONPStext[9] = L""; + wchar_t PTYNtext[9] = L""; byte ps_counter; char musicArtist[45]; char musicTitle[45]; char stationHost[45]; char stationEvent[45]; - uint16_t currentfreq; -}; + uint16_t currentfreq; +}; \ No newline at end of file diff --git a/src/language.h b/src/language.h index 45e7e7f..91b7b9d 100644 --- a/src/language.h +++ b/src/language.h @@ -1,6 +1,6 @@ // [number of languages][number of texts][max. length of text] -static const char myLanguage[9][78][85] = { +static const char myLanguage[9][87][85] = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -78,7 +78,16 @@ static const char myLanguage[9][78][85] = { "Power options", // 74 "Deep sleep", // 75 "Screen off", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Nederlands", // Dutch @@ -158,8 +167,17 @@ static const char myLanguage[9][78][85] = { "Power options", // 74 "Deep sleep", // 75 "Screen off", // 76 - "Theme" // 77 - }, // + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NIET MOGELIJK" // 86 + }, // { "Polski", // Polish "Kierunek obrotu zmieniony", // 1 @@ -238,7 +256,16 @@ static const char myLanguage[9][78][85] = { "Opcje zasilania", // 74 "Glebokie uspienie", // 75 "Wylacz ekran", // 76 - "Motyw" // 77 + "Motyw", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Hrvatski", // Croatian @@ -318,7 +345,16 @@ static const char myLanguage[9][78][85] = { "Power options", // 74 "Deep sleep", // 75 "Screen off", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Ελληνικά", // Greek @@ -398,7 +434,16 @@ static const char myLanguage[9][78][85] = { "Επιλογές ενέργειας", // 74 "Βαθιά αναμονή", // 75 "Οθόνη κλειστή", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Romana", // Romanian @@ -478,7 +523,16 @@ static const char myLanguage[9][78][85] = { "Power options", // 74 "Deep sleep", // 75 "Screen off", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Deutsch", // German @@ -558,7 +612,16 @@ static const char myLanguage[9][78][85] = { "Energieeinstellungen", // 74 "Komplett aus", // 75 "Bildschirm aus", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Czech", // Czech @@ -638,7 +701,16 @@ static const char myLanguage[9][78][85] = { "Power options", // 74 "Deep sleep", // 75 "Screen off", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, { "Slovak", // Slovak @@ -718,6 +790,15 @@ static const char myLanguage[9][78][85] = { "Power options", // 74 "Deep sleep", // 75 "Screen off", // 76 - "Theme" // 77 + "Theme", // 77 + "Default", // 78 + "Cyan", // 79 + "Crimson", // 80 + "Monochrome", // 81 + "Volcano", // 82 + "Dendro", // 83 + "Sakura", // 84 + "Whiteout", // 85 + "NOT POSSIBLE" // 86 }, };