From 8aaeb72d8164f0f599010688b1bbb978dde8dfa0 Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Wed, 12 Jul 2023 21:58:18 +0200 Subject: [PATCH] Several fixes and updates - Error output for XDRGTK finally compatible - Added dBuV/dBf/dBm selector - Added display softstart (just because it looks nice) --- TEF6686_ESP32.ino | 90 ++++++++++++++++++++++++++++++++++++++--------- src/TEF6686.cpp | 15 ++++---- src/constants.h | 2 ++ src/language.h | 41 +++++++++++++-------- 4 files changed, 111 insertions(+), 37 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 8348888..1d95cf5 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -1,6 +1,7 @@ #include #include #include +#include #include // https://github.com/Bodmer/TFT_eSPI #include // https://github.com/PaulStoffregen/Time #include // https://github.com/bbx10/Hash_tng @@ -140,7 +141,8 @@ byte subnetclient; byte TEF; byte theme; byte tunemode; -byte screensaverOptions[5] = { 0, 3, 10, 30, 60 }; +byte screensaverOptions[5] = {0, 3, 10, 30, 60}; +byte unit; char buff[16]; char programTypePrevious[18]; char radioIdPrevious[6]; @@ -283,8 +285,8 @@ byte screensaver_IRQ = OFF; void setup() { setupmode = true; - EEPROM.begin(267); - if (EEPROM.readByte(43) != 31) DefaultSettings(); + EEPROM.begin(268); + if (EEPROM.readByte(43) != 32) DefaultSettings(); frequency = EEPROM.readUInt(0); VolSet = EEPROM.readInt(4); @@ -339,6 +341,7 @@ void setup() { fmminstepsize = EEPROM.readByte(261); screensaverset = EEPROM.readByte(262); AMLevelOffset = EEPROM.readInt(263); + unit = EEPROM.readByte(264); LWLowEdgeSet = FREQ_LW_LOW_EDGE_MIN; // later will read from flash LWHighEdgeSet = FREQ_LW_HIGH_EDGE_MAX; // later will read from flash @@ -409,13 +412,13 @@ void setup() { attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), read_encoder, CHANGE); attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_B), read_encoder, CHANGE); - analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); analogWrite(SMETERPIN, 0); if (digitalRead(BWBUTTON) == LOW && digitalRead(ROTARY_BUTTON) == HIGH) { if (rotarymode == 0) rotarymode = 1; else rotarymode = 0; EEPROM.writeByte(39, rotarymode); EEPROM.commit(); + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); tft.setFreeFont(FONT14); tft.fillScreen(BackgroundColor); tft.setTextColor(ActiveColor); @@ -434,6 +437,7 @@ void setup() { } EEPROM.writeByte(38, displayflip); EEPROM.commit(); + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); tft.setFreeFont(FONT14); tft.fillScreen(BackgroundColor); tft.setTextColor(ActiveColor); @@ -444,6 +448,7 @@ void setup() { if (digitalRead(BANDBUTTON) == LOW) { analogWrite(SMETERPIN, 511); + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); tft.setFreeFont(FONT14); tft.fillScreen(BackgroundColor); tft.setTextColor(ActiveColor); @@ -454,6 +459,7 @@ void setup() { } if (digitalRead(ROTARY_BUTTON) == LOW && digitalRead(BWBUTTON) == HIGH) { + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); tft.setFreeFont(FONT14); tft.fillScreen(BackgroundColor); tft.setTextColor(ActiveColor); @@ -471,6 +477,7 @@ void setup() { } if (digitalRead(ROTARY_BUTTON) == LOW && digitalRead(BWBUTTON) == LOW) { + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); tft.setFreeFont(FONT14); tft.fillScreen(BackgroundColor); tft.setTextColor(ActiveColor); @@ -499,6 +506,11 @@ void setup() { tft.drawBitmap(130, 80, TEFLogo, 59, 23, PrimaryColor); + for (int x = 0; x <= ContrastSet; x++) { + analogWrite(CONTRASTPIN, x * 2 + 27); + delay(30); + } + TEF = EEPROM.readByte(37); if (TEF != 101 && TEF != 102 && TEF != 205) SetTunerPatch(); @@ -1542,6 +1554,7 @@ void ModeButtonPress() { EEPROM.writeByte(261, fmminstepsize); EEPROM.writeByte(262, screensaverset); EEPROM.writeInt(263, AMLevelOffset); + EEPROM.writeByte(264, unit); EEPROM.commit(); Serial.end(); if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient); @@ -2050,6 +2063,12 @@ void ButtonPress() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); if (AMLevelOffset > 0) tft.drawRightString("+" + String(AMLevelOffset, DEC), 155, 110, GFXFF); else tft.drawRightString(String(AMLevelOffset, DEC), 155, 110, GFXFF); break; + case 150: + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][98], 155, 70, GFXFF); + tft.setTextColor(PrimaryColor); + tft.drawCentreString(unitString[unit], 155, 110, GFXFF); + break; } break; } @@ -2479,6 +2498,15 @@ void KeyUp() { if (AMLevelOffset > 0) tft.drawRightString("+" + String(AMLevelOffset, DEC), 155, 110, GFXFF); else tft.drawRightString(String(AMLevelOffset, DEC), 155, 110, GFXFF); radio.setAMOffset(AMLevelOffset); break; + + case 150: + if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); + tft.drawCentreString(unitString[unit], 155, 110, GFXFF); + unit ++; + if (unit > 2) unit = 0; + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(PrimaryColor); + tft.drawCentreString(unitString[unit], 155, 110, GFXFF); + break; } break; } @@ -2902,6 +2930,15 @@ void KeyDown() { if (AMLevelOffset > 0) tft.drawRightString("+" + String(AMLevelOffset, DEC), 155, 110, GFXFF); else tft.drawRightString(String(AMLevelOffset, DEC), 155, 110, GFXFF); radio.setAMOffset(AMLevelOffset); break; + + case 150: + if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); + tft.drawCentreString(unitString[unit], 155, 110, GFXFF); + unit --; + if (unit > 2) unit = 2; + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(PrimaryColor); + tft.drawCentreString(unitString[unit], 155, 110, GFXFF); + break; } break; } @@ -2995,7 +3032,8 @@ void readRds() { DataPrint ("P"); DataPrint (String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX)); DataPrint (String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX)); - if (radio.rds.correct == false) DataPrint("?"); + if (((radio.rds.rdsErr >> 14) & 0x02) > 2) DataPrint("?"); + if (((radio.rds.rdsErr >> 14) & 0x01) > 1) DataPrint("?"); DataPrint ("\n"); XDRGTKRDS = "R"; @@ -3005,7 +3043,19 @@ void readRds() { XDRGTKRDS += String(((radio.rds.rdsC) >> 4) & 0xF, HEX) + String((radio.rds.rdsC) & 0xF, HEX); XDRGTKRDS += String(((radio.rds.rdsD >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsD >> 8) & 0xF, HEX); XDRGTKRDS += String(((radio.rds.rdsD) >> 4) & 0xF, HEX) + String((radio.rds.rdsD) & 0xF, HEX); - XDRGTKRDS += String(((radio.rds.rdsErr >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsErr >> 8) & 0xF, HEX); + + byte erroutput; + erroutput |= (highByte(radio.rds.rdsErr) & 0x04) >> 2; + erroutput |= (highByte(radio.rds.rdsErr) & 0x02) << 2; + erroutput |= (highByte(radio.rds.rdsErr) & 0x01) << 6; + erroutput |= (highByte(radio.rds.rdsErr) & 0x08) >> 3; + erroutput |= (highByte(radio.rds.rdsErr) & 0x10) >> 1; + erroutput |= (highByte(radio.rds.rdsErr) & 0x40) << 1; + erroutput |= (highByte(radio.rds.rdsErr) & 0x80) >> 7; + erroutput |= (highByte(radio.rds.rdsErr) & 0x20) << 5; + + if (highByte(radio.rds.rdsErr) < 0x10) XDRGTKRDS += "0"; + XDRGTKRDS += String(erroutput, HEX); XDRGTKRDS += "\n"; if (XDRGTKRDS != XDRGTKRDSold) { @@ -3601,12 +3651,14 @@ void BuildMenu() { tft.drawString(myLanguage[language][90], 14, 90, GFXFF); tft.drawString(myLanguage[language][91], 14, 110, GFXFF); tft.drawString(myLanguage[language][97], 14, 130, GFXFF); + tft.drawString(myLanguage[language][98], 14, 150, GFXFF); tft.setTextColor(PrimaryColor); tft.drawRightString(CurrentThemeString, 305, 30, GFXFF); ShowPowerOptions(false); if (fmminstepsize) tft.drawRightString(String(FREQ_FM_STEP_100K * 10, DEC), 265, 90, GFXFF); else tft.drawRightString(String(FREQ_FM_STEP_50K * 10, DEC), 265, 90, GFXFF); if (!screensaverset) tft.drawRightString(myLanguage[language][30], 305, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 265, 110, GFXFF); if (AMLevelOffset > 0) tft.drawRightString("+" + String(AMLevelOffset, DEC), 265, 130, GFXFF); else tft.drawRightString(String(AMLevelOffset, DEC), 265, 130, GFXFF); + tft.drawRightString(unitString[unit], 305, 150, GFXFF); break; } analogWrite(SMETERPIN, 0); @@ -3772,7 +3824,7 @@ void BuildAdvancedRDS() { tft.setTextColor(ActiveColor); tft.setFreeFont(FONT7); tft.drawString("ERRORS : ", 6, 30, GFXFF); - tft.drawRightString("dBμV", 310, 45, GFXFF); + tft.drawRightString(unitString[unit], 310, 45, GFXFF); if (region == 0) tft.drawString("PI : ", 216, 76, GFXFF); if (region == 1) tft.drawString("ID : ", 216, 76, GFXFF); tft.drawString("PS : ", 6, 76, GFXFF); @@ -4223,27 +4275,30 @@ void ShowSignalLevel() { if (menu == false) analogWrite(SMETERPIN, smeter); - if (SStatus > (SStatusold + 3) || SStatus < (SStatusold - 3)) { + int SStatusprint; + if (unit == 0) SStatusprint = SStatus; + if (unit == 1) SStatusprint = ((SStatus * 100) + 10875) / 100; + if (unit == 2) SStatusprint = ((float(SStatus / 10) - 10 * log10(75) - 90) * 10); + + if (SStatusprint > (SStatusold + 3) || SStatusprint < (SStatusold - 3)) { if (advancedRDS) { tft.setFreeFont(FONT7); tft.setTextColor(BackgroundColor); tft.drawRightString(String(SStatusold / 10) + "." + String(abs(SStatusold % 10)), 274, 45, GFXFF); tft.setTextColor(PrimaryColor); - tft.drawRightString(String(SStatus / 10) + "." + String(abs(SStatus % 10)), 274, 45, GFXFF); + tft.drawRightString(String(SStatusprint / 10) + "." + String(abs(SStatusprint % 10)), 274, 45, GFXFF); SStatusold = SStatus; } else { - if (SStatus > 1200) SStatus = 1200; - if (SStatus < -400) SStatus = -400; tft.setFreeFont(FONT24); tft.setTextColor(BackgroundColor); - if (SStatusold / 10 != SStatus / 10) tft.drawRightString(String(SStatusold / 10), 290, 106, GFXFF); + if (SStatusold / 10 != SStatusprint / 10) tft.drawRightString(String(SStatusold / 10), 290, 106, GFXFF); tft.setFreeFont(FONT14); tft.drawString("." + String(abs(SStatusold % 10)), 296, 97, GFXFF); tft.setFreeFont(FONT24); tft.setTextColor(PrimaryColor); - tft.drawRightString(String(SStatus / 10), 290, 106, GFXFF); + tft.drawRightString(String(SStatusprint / 10), 290, 106, GFXFF); tft.setFreeFont(FONT14); - tft.drawString("." + String(abs(SStatus % 10)), 296, 97, GFXFF); + tft.drawString("." + String(abs(SStatusprint % 10)), 296, 97, GFXFF); if (band == BAND_FM) segments = (SStatus + 200) / 10; else segments = (SStatus + 200) / 10; @@ -4251,10 +4306,10 @@ void ShowSignalLevel() { tft.fillRect(16 + 2 * 54, 109, 2 * (constrain(segments, 54, 94) - 54), 8, TFT_RED); tft.fillRect(16 + 2 * constrain(segments, 0, 94), 109, 2 * (94 - constrain(segments, 0, 94)), 8, GreyoutColor); - SStatusold = SStatus; + SStatusold = SStatusprint; tft.setTextColor(ActiveColor); tft.setFreeFont(FONT7); - tft.drawString("dBμV", 282, 144, GFXFF); + tft.drawString(unitString[unit], 282, 144, GFXFF); } if (wifi) { Udp.beginPacket(remoteip, 9030); @@ -5814,7 +5869,7 @@ void passwordcrypt() { } void DefaultSettings() { - EEPROM.writeByte(43, 31); + EEPROM.writeByte(43, 32); EEPROM.writeUInt(0, 10000); EEPROM.writeInt(4, 0); EEPROM.writeUInt(8, 0); @@ -5870,5 +5925,6 @@ void DefaultSettings() { EEPROM.writeByte(261, 0); EEPROM.writeByte(262, 0); EEPROM.writeInt(263, 0); + EEPROM.writeByte(264, 0); EEPROM.commit(); } diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index cc95697..08a2eec 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -94,7 +94,7 @@ bool TEF6686::getStereoStatus() { } void TEF6686::setMono(bool mono) { - devTEF_Radio_Set_Stereo_Min(mono); + devTEF_Radio_Set_Stereo_Min(mono); } void TEF6686::setVolume(int8_t volume) { @@ -269,9 +269,10 @@ void TEF6686::readRDS(bool showrdserrors) } } - if (rds.rdsAerror) rds.picode[4] = '?'; else rds.picode[4] = ' '; // Not sure, add a ? - rds.picode[5] = '\0'; - if (strcmp(rds.picode, "0000?") == 0) { + if (((rds.rdsErr >> 14) & 0x02) > 2) rds.picode[5] = '?'; + if (((rds.rdsErr >> 14) & 0x01) > 1) rds.picode[4] = '?'; else rds.picode[4] = ' '; // Not sure, add a ? + rds.picode[6] = '\0'; + if (strncmp(rds.picode, "0000", 4) == 0) { memset(rds.picode, 0, sizeof(rds.picode)); } } @@ -303,7 +304,9 @@ void TEF6686::readRDS(bool showrdserrors) rds.picode[5] = '\0'; } } - if (rds.rdsAerror) rds.picode[4] = '?'; else rds.picode[4] = ' '; // Not sure, add a ? + if (((rds.rdsErr >> 14) & 0x02) > 2) rds.picode[5] = '?'; + if (((rds.rdsErr >> 14) & 0x01) > 1) rds.picode[4] = '?'; else rds.picode[4] = ' '; // Not sure, add a ? + rds.picode[6] = '\0'; } // TP Indicator @@ -680,7 +683,7 @@ void TEF6686::clearRDS (bool fullsearchrds) for (i = 0; i < 65; i++) rt_buffer[i] = 0; for (i = 0; i < 33; i++) rt_buffer32[i] = 0; for (i = 0; i < 18; i++) rds.stationType[i] = 0; - for (i = 0; i < 6; i++) rds.picode[i] = 0; + for (i = 0; i < 7; i++) rds.picode[i] = 0; for (i = 0; i < 50; i++) { af[i].frequency = 0; diff --git a/src/constants.h b/src/constants.h index 5ce2c49..ff221ce 100644 --- a/src/constants.h +++ b/src/constants.h @@ -93,6 +93,8 @@ #define SW_MI_BAND_120M 120 #define SW_MI_BAND_160M 160 +static const char* const unitString[] = {"dBμV", "dBf", "dBm"}; + static const uint8_t TEFLogo[] PROGMEM = { 0xff, 0xff, 0xf8, 0x7f, 0xfe, 0x07, 0xff, 0xe0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x1f, 0xff, 0xe0, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x1f, 0xff, 0xe0, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0x3f, 0xff, 0xe0, diff --git a/src/language.h b/src/language.h index c279dab..91b1a55 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* const myLanguage[13][98] = { +static const char* const myLanguage[13][99] = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -98,7 +98,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Nederlands", // Dutch @@ -198,7 +199,8 @@ static const char* const myLanguage[13][98] = { "1% helderheid", // 94 "25% helderheid", // 95 "50% helderheid", // 96 - "AM RF Level offset:" // 97 + "AM RF Level afwijking:", // 97 + "Signaalmeter eenheid:" // 98 }, { "Polski", // Polish @@ -298,7 +300,8 @@ static const char* const myLanguage[13][98] = { "1% jasnosci", // 94 "25% jasnosci", // 95 "50% jasnosci", // 96 - "Odchylenie poziomu RF AM:" // 97 + "Odchylenie poziomu RF AM:", // 97 + "Signalmeter unit:" // 98 }, { "Hrvatski", // Croatian @@ -398,7 +401,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Ελληνικά", // Greek @@ -498,7 +502,8 @@ static const char* const myLanguage[13][98] = { "1% φωτεινότητα", // 94 "25% φωτεινότητα", // 95 "50% φωτεινότητα", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Romana", // Romanian @@ -598,7 +603,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Deutsch", // German @@ -698,7 +704,8 @@ static const char* const myLanguage[13][98] = { "1% Helligkeit", // 94 "25% Helligkeit", // 95 "50% Helligkeit", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Czech", // Czech @@ -798,7 +805,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Slovak", // Slovak @@ -898,7 +906,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Français", // French @@ -998,7 +1007,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Български", // Bulgarian @@ -1098,7 +1108,8 @@ static const char* const myLanguage[13][98] = { "1% brightness", // 94 "25% brightness", // 95 "50% brightness", // 96 - "AM RF Level offset:" // 97 + "AM RF Level offset:", // 97 + "Signalmeter unit:" // 98 }, { "Русский", // Russian @@ -1198,7 +1209,8 @@ static const char* const myLanguage[13][98] = { "1% яркости", // 94 "25% яркости", // 95 "50% яркости", // 96 - "Смещение уровня AM RF:" // 97 + "Смещение уровня AM RF:", // 97 + "Signalmeter unit:" // 98 }, { "Українська", // Ukranian @@ -1298,7 +1310,8 @@ static const char* const myLanguage[13][98] = { "1% яскравості", // 94 "25% яскравості", // 95 "50% яскравості", // 96 - "Зміщення рівня AM RF:" // 97 + "Зміщення рівня AM RF:", // 97 + "Signalmeter unit:" // 98 } };