From abf5dd1256114caaf11e11e4a8819ac78b0242e8 Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Sun, 18 Jun 2023 23:03:37 +0200 Subject: [PATCH] Added RDS filter option You can now select RDS filter on/off in the menu. Off: RDS data can be dirty, but is very fast. On: RDS data is buffered and filtered by the TEF668x. --- TEF6686_ESP32.ino | 34 ++++++++++++++++++++++++++--- src/TEF6686.cpp | 22 +++++++++++++++---- src/TEF6686.h | 1 + src/Tuner_Drv_Lithio.cpp | 14 +++++++++++- src/Tuner_Drv_Lithio.h | 2 ++ src/language.h | 47 ++++++++++++++++++++++++---------------- 6 files changed, 93 insertions(+), 27 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index caaff0b..a44733b 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -224,8 +224,8 @@ WiFiUDP Udp; void setup() { setupmode = true; EEPROM.begin(244); - if (EEPROM.readByte(43) != 25) { - EEPROM.writeByte(43, 25); + if (EEPROM.readByte(43) != 26) { + EEPROM.writeByte(43, 26); EEPROM.writeUInt(0, 10000); EEPROM.writeInt(4, 0); EEPROM.writeUInt(8, 0); @@ -259,6 +259,7 @@ void setup() { EEPROM.writeByte(55, 0); EEPROM.writeByte(56, 1); EEPROM.writeByte(57, 1); + EEPROM.writeByte(58, 1); 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); @@ -302,6 +303,7 @@ void setup() { wifi = EEPROM.readByte(55); subnetclient = EEPROM.readByte(56); showSWMIBand = EEPROM.readByte(57); + radio.rds.filter = EEPROM.readByte(58); frequency_LW = EEPROM.readUInt(221); frequency_MW = EEPROM.readUInt(225); frequency_SW = EEPROM.readUInt(229); @@ -1221,6 +1223,7 @@ void ModeButtonPress() { EEPROM.writeByte(55, wifi); EEPROM.writeByte(56, subnetclient); EEPROM.writeByte(57, showSWMIBand); + EEPROM.writeByte(58, radio.rds.filter); EEPROM.commit(); Serial.end(); if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient); @@ -1547,6 +1550,13 @@ void ButtonPress() { tft.setTextColor(TFT_YELLOW); if (showSWMIBand) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 70: + tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][60], 155, 70, GFXFF); + tft.setTextColor(TFT_YELLOW); + if (radio.rds.filter) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } } } else { @@ -1831,6 +1841,14 @@ void KeyUp() { tft.setTextColor(TFT_YELLOW); if (showSWMIBand) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 70: + tft.setTextColor(TFT_BLACK); + if (radio.rds.filter) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + if (radio.rds.filter) radio.rds.filter = false; else radio.rds.filter = true; + tft.setTextColor(TFT_YELLOW); + if (radio.rds.filter) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } } } @@ -2108,6 +2126,14 @@ void KeyDown() { tft.setTextColor(TFT_YELLOW); if (showSWMIBand) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); break; + + case 70: + tft.setTextColor(TFT_BLACK); + if (radio.rds.filter) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + if (radio.rds.filter) radio.rds.filter = false; else radio.rds.filter = true; + tft.setTextColor(TFT_YELLOW); + if (radio.rds.filter) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } } } @@ -2492,8 +2518,10 @@ void BuildMenu() { case 3: tft.drawString(myLanguage[language][58], 14, 30, GFXFF); tft.drawString(myLanguage[language][59], 14, 50, GFXFF); + tft.drawString(myLanguage[language][60], 14, 70, GFXFF); tft.drawRightString(String(WiFi.localIP()[0]) + "." + String(WiFi.localIP()[1]) + "." + String(WiFi.localIP()[2]) + "." + String(subnetclient, DEC), 305, 30, GFXFF); if (showSWMIBand) tft.drawRightString(myLanguage[language][42], 305, 50, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 50, GFXFF); + if (radio.rds.filter) tft.drawRightString(myLanguage[language][42], 305, 70, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 70, GFXFF); } analogWrite(SMETERPIN, 0); } @@ -2819,7 +2847,7 @@ void ShowSignalLevel() { tft.setFreeFont(FONT7); tft.setTextColor(TFT_BLACK); if (SNRold == 99) tft.drawRightString("--", 294, 166, GFXFF); else tft.drawRightString(String(SNRold), 294, 166, GFXFF); - tft.setTextColor(TFT_YELLOW, TFT_BLACK); + tft.setTextColor(TFT_YELLOW, TFT_BLACK); if (tuned == true) { tft.drawRightString(String(SNR), 294, 166, GFXFF); SNRold = SNR; diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 18bfb30..d5285be 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -2,6 +2,7 @@ #include #include +unsigned long rdstimer = 0; void TEF6686::init(byte TEF) { uint8_t bootstatus; @@ -221,9 +222,21 @@ bool TEF6686::getStatusAM(int16_t &level, uint16_t &noise, uint16_t &cochannel, void TEF6686::readRDS(bool showrdserrors) { uint16_t rdsStat; - uint16_t result = devTEF_Radio_Get_RDS_Data(&rdsStat, &rds.rdsA, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); uint8_t offset; - + bool rdsReady; + if (rds.filter) { + devTEF_Radio_Get_RDS_Status(&rdsStat, &rds.rdsA, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); + } else { + if (millis() >= rdstimer + 87) { + rdstimer += 87; + devTEF_Radio_Get_RDS_Data(&rdsStat, &rds.rdsA, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); + + if ((rdsStat & (1 << 14))) { + for (int i = 0; i < 22; i++) devTEF_Radio_Get_RDS_Data(&rdsStat, &rds.rdsA, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); + } + } + } + if (rds.rdsB != rdsBprevious && rds.rdsC != rdsCprevious && rds.rdsD != rdsDprevious) { rds.correct = false; rds.hasRDS = false; @@ -233,9 +246,10 @@ void TEF6686::readRDS(bool showrdserrors) if (((rds.rdsErr >> 10) & 0x02) > 1) rds.rdsCerror = true; else rds.rdsCerror = false; // Any errors in Block C? if (((rds.rdsErr >> 8) & 0x02) > 1) rds.rdsDerror = true; else rds.rdsDerror = false; // Any errors in Block D? if (!rds.rdsAerror && !rds.rdsBerror && !rds.rdsCerror && !rds.rdsDerror) rds.correct = true; // Any errors in all blocks? - if ((rdsStat & (1 << 15)) && (rdsStat & (1 << 9))) rds.hasRDS = true; // RDS decoder synchronized and data available + if ((rdsStat & (1 << 9))) rds.hasRDS = true; // RDS decoder synchronized and data available + if ((rdsStat & (1 << 15))) rdsReady = true; - if (rds.hasRDS) { // We have all data to decode... let's go... + if (rdsReady) { // We have all data to decode... let's go... //PI decoder if (rds.region == 0 && !correctpi) { diff --git a/src/TEF6686.h b/src/TEF6686.h index 097df72..88b2a8a 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -193,6 +193,7 @@ typedef struct _rds_ { bool hasCT; bool rtAB; bool correct; + bool filter; bool underscore; bool rdsreset; } rds_; diff --git a/src/Tuner_Drv_Lithio.cpp b/src/Tuner_Drv_Lithio.cpp index 4313c15..2d7b275 100644 --- a/src/Tuner_Drv_Lithio.cpp +++ b/src/Tuner_Drv_Lithio.cpp @@ -229,7 +229,7 @@ bool devTEF_Radio_Get_Quality_Status_AM (int16_t *level, uint16_t *noise, uint16 } -bool devTEF_Radio_Get_RDS_Data (uint16_t *status, uint16_t *A_block, uint16_t *B_block, uint16_t *C_block, uint16_t *D_block, uint16_t *dec_error) { +bool devTEF_Radio_Get_RDS_Status (uint16_t *status, uint16_t *A_block, uint16_t *B_block, uint16_t *C_block, uint16_t *D_block, uint16_t *dec_error) { uint8_t buf[12]; uint8_t r = devTEF_Get_Cmd(TEF_FM, Cmd_Get_RDS_Status, buf, sizeof(buf)); *status = Convert8bto16b(buf); @@ -241,6 +241,18 @@ bool devTEF_Radio_Get_RDS_Data (uint16_t *status, uint16_t *A_block, uint16_t *B return r; } +bool devTEF_Radio_Get_RDS_Data (uint16_t *status, uint16_t *A_block, uint16_t *B_block, uint16_t *C_block, uint16_t *D_block, uint16_t *dec_error) { + uint8_t buf[12]; + uint8_t r = devTEF_Get_Cmd(TEF_FM, Cmd_Get_RDS_Data, buf, sizeof(buf)); + *status = Convert8bto16b(buf); + *A_block = Convert8bto16b(buf + 2); + *B_block = Convert8bto16b(buf + 4); + *C_block = Convert8bto16b(buf + 6); + *D_block = Convert8bto16b(buf + 8); + *dec_error = Convert8bto16b(buf + 10); + return r; +} + bool devTEF_Radio_Get_Stereo_Status(uint16_t *status) { uint8_t buf[2]; uint16_t r = devTEF_Get_Cmd(TEF_FM, Cmd_Get_Signal_Status, buf, sizeof(buf)); diff --git a/src/Tuner_Drv_Lithio.h b/src/Tuner_Drv_Lithio.h index 44ff29f..1bca22e 100644 --- a/src/Tuner_Drv_Lithio.h +++ b/src/Tuner_Drv_Lithio.h @@ -39,6 +39,7 @@ typedef enum { Cmd_Get_Quality_Status = 128, Cmd_Get_Quality_Data = 129, Cmd_Get_RDS_Status = 130, + Cmd_Get_RDS_Data = 131, Cmd_Get_Signal_Status = 133, Cmd_Get_Processing_Status = 134 } TEF_RADIO_COMMAND; @@ -71,6 +72,7 @@ bool devTEF_Audio_Set_Mute(uint8_t mode); bool devTEF_Audio_Set_Volume(int16_t volume); bool devTEF_Radio_Get_Stereo_Status(uint16_t *status); bool devTEF_APPL_Set_OperationMode(bool mode); +bool devTEF_Radio_Get_RDS_Status(uint16_t *status, uint16_t *A_block, uint16_t *B_block, uint16_t *C_block, uint16_t *D_block, uint16_t *dec_error); bool devTEF_Radio_Get_RDS_Data(uint16_t *status, uint16_t *A_block, uint16_t *B_block, uint16_t *C_block, uint16_t *D_block, uint16_t *dec_error); bool devTEF_Radio_Set_Bandwidth(uint8_t mode, uint16_t bandwidth, uint16_t control_sensitivity, uint16_t low_level_sensitivity); bool devTEF_Radio_Set_BandwidthAM(uint8_t mode, uint16_t bandwidth, uint16_t control_sensitivity, uint16_t low_level_sensitivity); diff --git a/src/language.h b/src/language.h index b6d5242..ecee3ad 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][60][78] = { +static const char myLanguage[9][61][78] = { { "English", // English "Rotary direction changed", "Please release button", @@ -59,8 +59,9 @@ static const char myLanguage[9][60][78] = { "Trying to connect with Wi-Fi", "FAILED.. WiFi disabled", "CONNECTED!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, { "Nederlands", // Dutch @@ -121,8 +122,9 @@ static const char myLanguage[9][60][78] = { "Verbinden met Wi-Fi...", "MISLUKT.. WiFi uitgeschakeld", "VERBONDEN!", - "Stationlist client IP", - "Toon SW golflengte" + "Stationlist client IP", + "Toon SW golflengte", + "RDS filter" }, { "Polski", // Polish @@ -183,8 +185,9 @@ static const char myLanguage[9][60][78] = { "Proba polaczenia z Wi-Fi", "BLAD.. WiFi wylaczone", "POLACZONO!", - "IP klienta Stationlist", - "Pokaz dlugosci fal SW" + "IP klienta Stationlist", + "Pokaz dlugosci fal SW", + "RDS filter" }, { "Hrvatski", // Croatian @@ -245,8 +248,9 @@ static const char myLanguage[9][60][78] = { "Spajanje s Wi-Fi mrežom..", "NEUSPJEŠNO.. Wi-Fi onemogućen", "SPOJENO!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, { "Ελληνικά", // Greek @@ -307,8 +311,9 @@ static const char myLanguage[9][60][78] = { "Προσπάθεια σύνδεσης με το Wi-Fi", "ΑΠΟΤΥΧΙΑ.. WiFi ανενεργό", "ΣΕ ΣΥΝΔΕΣΗ!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, { "Romana", // Romanian @@ -369,8 +374,9 @@ static const char myLanguage[9][60][78] = { "Trying to connect with Wi-Fi", "FAILED.. WiFi disabled", "CONNECTED!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, { "Deutsch", // German @@ -431,8 +437,9 @@ static const char myLanguage[9][60][78] = { "Versuche WLAN zu verbinden", "FEHLER.. WLAN deaktiviert", "VERBUNDEN!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, { "Czech", // Czech "Směr enkóderu byl změněn", @@ -492,8 +499,9 @@ static const char myLanguage[9][60][78] = { "Trying to connect with Wi-Fi", "FAILED.. WiFi disabled", "CONNECTED!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, { "Slovak", // Slovak "Smer enkóderu bol zmenený", @@ -553,7 +561,8 @@ static const char myLanguage[9][60][78] = { "Trying to connect with Wi-Fi", "FAILED.. WiFi disabled", "CONNECTED!", - "Stationlist client IP", - "Show SW wavelength" + "Stationlist client IP", + "Show SW wavelength", + "RDS filter" }, };