From 406fe4762f20ca2d758a406aeff03ad8ff2f5b76 Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Sun, 16 Jul 2023 01:20:02 +0200 Subject: [PATCH] Added AF --- TEF6686_ESP32.ino | 70 ++++++++++++++++++++++++++++++++---- src/TEF6686.cpp | 76 +++++++++++++++++++++++++++++++++++++++- src/TEF6686.h | 3 ++ src/Tuner_Drv_Lithio.cpp | 6 ++-- src/Tuner_Drv_Lithio.h | 2 +- src/constants.h | 5 +-- src/language.h | 47 ++++++++++++++++--------- 7 files changed, 181 insertions(+), 28 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index f1fc964..7aa8a61 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -40,6 +40,8 @@ TFT_eSPI tft = TFT_eSPI(240, 320); #endif bool advancedRDS; +bool af; +bool aftest; bool afpage; bool afscreen; bool artheadold; @@ -277,6 +279,8 @@ unsigned long rttickerhold; unsigned long rtplusticker; unsigned long rtplustickerhold; +unsigned long aftimer; + TEF6686 radio; TFT_eSprite sprite = TFT_eSprite(&tft); TFT_eSprite sprite2 = TFT_eSprite(&tft); @@ -345,7 +349,8 @@ void setup() { fmdefaultstepsize = EEPROM.readByte(EE_BYTE_FMDEFAULTSTEPSIZE); screensaverset = EEPROM.readByte(EE_BYTE_SCREENSAVERSET); AMLevelOffset = EEPROM.readInt(EE_INT_AMLEVELOFFSET); - unit = EEPROM.readByte(EE_BYTE_UINT); + unit = EEPROM.readByte(EE_BYTE_UNIT); + af = EEPROM.readByte(EE_BYTE_AF); LWLowEdgeSet = FREQ_LW_LOW_EDGE_MIN; // later will read from flash LWHighEdgeSet = FREQ_LW_HIGH_EDGE_MAX; // later will read from flash @@ -610,11 +615,34 @@ void setup() { } void loop() { - Communication(); - if (digitalRead(BANDBUTTON) == LOW && XDRGTKUSB == false && XDRGTKTCP == false) BANDBUTTONPress(); if (power == true) { + Communication(); + + if (af) { + if (aftest && millis() >= aftimer + 5000) { + aftimer = millis(); + aftest = false; + frequency = radio.TestAF(); + if (freqold != frequency) { + ShowFreq(0); + store = true; + } + } + + if (millis() >= aftimer + 10000) { + aftimer = millis(); + if (USN > 150 || WAM > 150) { + frequency = radio.TestAF(); + if (freqold != frequency) { + ShowFreq(0); + store = true; + } + } + } + } + if (seek == true) Seek(direction); if ((SStatus / 10 > LowLevelSet) && LowLevelInit == false && menu == false && band == BAND_FM) { @@ -1551,7 +1579,8 @@ void ModeButtonPress() { EEPROM.writeByte(EE_BYTE_FMDEFAULTSTEPSIZE, fmdefaultstepsize); EEPROM.writeByte(EE_BYTE_SCREENSAVERSET, screensaverset); EEPROM.writeInt(EE_INT_AMLEVELOFFSET, AMLevelOffset); - EEPROM.writeByte(EE_BYTE_UINT, unit); + EEPROM.writeByte(EE_BYTE_UNIT, unit); + EEPROM.writeByte(EE_BYTE_AF, af); EEPROM.commit(); Serial.end(); if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient); @@ -2066,6 +2095,12 @@ void ButtonPress() { tft.setTextColor(PrimaryColor); tft.drawCentreString(unitString[unit], 155, 110, GFXFF); break; + case 170: + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][99], 155, 70, GFXFF); + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + if (af) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } break; } @@ -2504,6 +2539,14 @@ void KeyUp() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(PrimaryColor); tft.drawCentreString(unitString[unit], 155, 110, GFXFF); break; + + case 170: + if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); + if (af) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + if (af) af = false; else af = true; + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + if (af) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } break; } @@ -2936,6 +2979,14 @@ void KeyDown() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(PrimaryColor); tft.drawCentreString(unitString[unit], 155, 110, GFXFF); break; + + case 170: + if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); + if (af) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + if (af) af = false; else af = true; + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + if (af) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF); + break; } break; } @@ -3672,12 +3723,14 @@ void BuildMenu() { 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.drawString(myLanguage[language][99], 14, 170, GFXFF); tft.setTextColor(PrimaryColor); tft.drawRightString(CurrentThemeString, 305, 30, GFXFF); ShowPowerOptions(false); if (fmdefaultstepsize) 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); + if (af) tft.drawRightString(myLanguage[language][42], 305, 170, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 170, GFXFF); tft.drawRightString(unitString[unit], 305, 150, GFXFF); break; } @@ -4309,7 +4362,7 @@ void ShowSignalLevel() { tft.drawRightString(String(SStatusold / 10) + "." + String(abs(SStatusold % 10)), 274, 45, GFXFF); tft.setTextColor(PrimaryColor); tft.drawRightString(String(SStatusprint / 10) + "." + String(abs(SStatusprint % 10)), 274, 45, GFXFF); - SStatusold = SStatus; + SStatusold = SStatusprint; } else { tft.setFreeFont(FONT24); tft.setTextColor(BackgroundColor); @@ -5530,6 +5583,8 @@ void XDRGTKRoutine() { } void TuneUp() { + aftest = true; + aftimer = millis(); unsigned int temp; if (stepsize == 0) { if (band != BAND_FM) { @@ -5609,6 +5664,8 @@ void TuneUp() { } void TuneDown() { + aftest = true; + aftimer = millis(); unsigned int temp; if (stepsize == 0) { if (band != BAND_FM) { @@ -5970,6 +6027,7 @@ void DefaultSettings() { EEPROM.writeByte(EE_BYTE_FMDEFAULTSTEPSIZE, 0); EEPROM.writeByte(EE_BYTE_SCREENSAVERSET, 0); EEPROM.writeInt(EE_INT_AMLEVELOFFSET, 0); - EEPROM.writeByte(EE_BYTE_UINT, 0); + EEPROM.writeByte(EE_BYTE_UNIT, 0); + EEPROM.writeByte(EE_BYTE_AF, 0); EEPROM.commit(); } diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 82ed6a5..68faee1 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -7,6 +7,74 @@ unsigned long rdstimer = 0; unsigned long bitStartTime = 0; bool lastBitState = false; +uint16_t TEF6686::TestAF() { + + if (rds.hasRDS) { + uint16_t status; + uint16_t rdsStat; + uint16_t dummy1; + uint16_t dummy2; + uint8_t dummy3; + + int16_t aflevel; + uint16_t afusn; + uint16_t afwam; + int16_t afoffset; + + int16_t currentlevel; + uint16_t currentusn; + uint16_t currentwam; + int16_t currentoffset; + uint16_t currentpi; + + byte timing; + + devTEF_Radio_Get_Quality_Status(&status, ¤tlevel, ¤tusn, ¤twam, ¤toffset, &dummy1, &dummy2, &dummy3); + devTEF_Radio_Get_RDS_Status(&rdsStat, ¤tpi, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); + + for (int x = 0; x < af_counter; x++) { + timing = 0; + devTEF_Set_Cmd(TEF_FM, Cmd_Tune_To, 7, 3, af[x].frequency); + while (timing == 0 && !bitRead(timing, 15)) { + devTEF_Radio_Get_Quality_Status(&status, &aflevel, &afusn, &afwam, &afoffset, &dummy1, &dummy2, &dummy3); + timing = lowByte(status); + } + af[x].score = aflevel - afusn - afwam; + if (afoffset < -125 || afoffset > 125) af[x].score = -32767; + } + + int16_t highestValue = af[0].score; + int highestIndex = 0; + + for (int i = 1; i < af_counter; i++) { + if (af[i].score > highestValue) { + highestValue = af[i].score; + highestIndex = i; + } + } + + if (af_counter != 0 && af[highestIndex].afvalid && af[highestIndex].score > (currentlevel - currentusn - currentwam) && (af[highestIndex].score - (currentlevel - currentusn - currentwam)) >= 70) { + devTEF_Set_Cmd(TEF_FM, Cmd_Tune_To, 7, 4, af[highestIndex].frequency); + delay(200); + devTEF_Radio_Get_RDS_Status(&rdsStat, &rds.rdsA, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); + if ((rdsStat & (1 << 9)) && rds.rdsA == currentpi) { + currentfreq = af[highestIndex].frequency; + for (byte y = 0; y < 50; y++) { + af[y].frequency = 0; + af[y].score = -32767; + af[y].afvalid = true; + af[y].filler = false; + af_counter = 0; + } + } else { + af[highestIndex].afvalid = false; + devTEF_Set_Cmd(TEF_FM, Cmd_Tune_To, 7, 4, currentfreq); + } + } + } + return currentfreq; +} + void TEF6686::init(byte TEF) { uint8_t bootstatus; @@ -210,7 +278,8 @@ bool TEF6686::getProcessing(uint16_t &highcut, uint16_t &stereo, uint16_t &sthib } bool TEF6686::getStatus(int16_t &level, uint16_t &USN, uint16_t &WAM, int16_t &offset, uint16_t &bandwidth, uint16_t &modulation, uint8_t &snr) { - bool result = devTEF_Radio_Get_Quality_Status(&level, &USN, &WAM, &offset, &bandwidth, &modulation, &snr); + uint16_t status; + bool result = devTEF_Radio_Get_Quality_Status(&status, &level, &USN, &WAM, &offset, &bandwidth, &modulation, &snr); return level; return USN; return WAM; @@ -438,10 +507,13 @@ void TEF6686::readRDS(bool showrdserrors) if (af[j].frequency > af[j + 1].frequency && af[j + 1].frequency != 0) { uint16_t temp = af[j].frequency; bool temp2 = af[j].filler; + bool temp3 = af[j].afvalid; af[j].frequency = af[j + 1].frequency; af[j].filler = af[j + 1].filler; + af[j].afvalid = af[j + 1].afvalid; af[j + 1].frequency = temp; af[j + 1].filler = temp2; + af[j + 1].afvalid = temp3; } } } @@ -726,7 +798,9 @@ void TEF6686::clearRDS (bool fullsearchrds) for (i = 0; i < 50; i++) { af[i].frequency = 0; + af[i].score = -32767; af[i].filler = false; + af[i].afvalid = true; } for (i = 0; i < 20; i++) { diff --git a/src/TEF6686.h b/src/TEF6686.h index a04cee5..2a6207b 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -144,7 +144,9 @@ typedef struct _rds_ { typedef struct _af_ { uint16_t frequency; + int16_t score; bool filler; + bool afvalid; } af_; typedef struct _eon_ { @@ -162,6 +164,7 @@ class TEF6686 { af_ af[50]; eon_ eon[20]; rds_ rds; + uint16_t TestAF(); void readRDS(bool showrdserrors); void SetFreq(uint16_t frequency); void SetFreqAM(uint16_t frequency); diff --git a/src/Tuner_Drv_Lithio.cpp b/src/Tuner_Drv_Lithio.cpp index f45c506..bd1e7c2 100644 --- a/src/Tuner_Drv_Lithio.cpp +++ b/src/Tuner_Drv_Lithio.cpp @@ -206,10 +206,12 @@ bool devTEF_Radio_Get_Processing_Status (uint16_t *highcut, uint16_t *stereo, ui return r; } -bool devTEF_Radio_Get_Quality_Status (int16_t *level, uint16_t *usn, uint16_t *wam, int16_t *offset, uint16_t *bandwidth, uint16_t *mod, uint8_t *snr) { +bool devTEF_Radio_Get_Quality_Status (uint16_t *status, int16_t *level, uint16_t *usn, uint16_t *wam, int16_t *offset, uint16_t *bandwidth, uint16_t *mod, uint8_t *snr) { uint8_t buf[14]; uint16_t r = devTEF_Get_Cmd(TEF_FM, Cmd_Get_Quality_Data, buf, sizeof(buf)); - + uint16_t test = Convert8bto16b(buf); + bool bitValue = bitRead(test,15); + *status = Convert8bto16b(buf); *level = Convert8bto16b(buf + 2); *usn = Convert8bto16b(buf + 4); *wam = Convert8bto16b(buf + 6); diff --git a/src/Tuner_Drv_Lithio.h b/src/Tuner_Drv_Lithio.h index 6c5d090..131036f 100644 --- a/src/Tuner_Drv_Lithio.h +++ b/src/Tuner_Drv_Lithio.h @@ -64,7 +64,7 @@ bool devTEF_Set_Cmd(TEF_MODULE module, uint8_t cmd, uint16_t len, ...); bool devTEF_Radio_Get_Identification (uint16_t *device, uint16_t *hw_version, uint16_t *sw_version); bool devTEF_Radio_Tune_To (uint16_t frequency ); bool devTEF_Radio_Tune_AM (uint16_t frequency ); -bool devTEF_Radio_Get_Quality_Status (int16_t *level, uint16_t *usn, uint16_t *wam, int16_t *offset, uint16_t *bandwidth, uint16_t *mod, uint8_t *snr); +bool devTEF_Radio_Get_Quality_Status (uint16_t *status, int16_t *level, uint16_t *usn, uint16_t *wam, int16_t *offset, uint16_t *bandwidth, uint16_t *mod, uint8_t *snr); bool devTEF_Radio_Get_Processing_Status (uint16_t *highcut, uint16_t *stereo, uint16_t *sthiblend, uint8_t *stband_1, uint8_t *stband_2, uint8_t *stband_3, uint8_t *stband_4); bool devTEF_Radio_Get_Quality_Status_AM (int16_t *level, uint16_t *noise, uint16_t *cochannel, int16_t *offset, uint16_t *bandwidth, uint16_t *mod, uint8_t *snr); bool devTEF_APPL_Get_Operation_Status(uint8_t *bootstatus); diff --git a/src/constants.h b/src/constants.h index e631cfe..c31247f 100644 --- a/src/constants.h +++ b/src/constants.h @@ -97,7 +97,7 @@ #define EE_PRESETS_CNT 30 #define EE_CHECKBYTE_VALUE 34 // 0 ~ 255,add new entry, change for new value -#define EE_TOTAL_CNT 268 +#define EE_TOTAL_CNT 269 #define EE_UINT_FREQUENCY_FM 0 #define EE_INT_VOLSET 4 #define EE_UINT_CONVERTERSET 8 @@ -156,7 +156,8 @@ #define EE_BYTE_FMDEFAULTSTEPSIZE 261 #define EE_BYTE_SCREENSAVERSET 262 #define EE_INT_AMLEVELOFFSET 263 -#define EE_BYTE_UINT 267 +#define EE_BYTE_UNIT 267 +#define EE_BYTE_AF 268 // End of EEPROM index defines static const char* const unitString[] = {"dBμV", "dBf", "dBm"}; diff --git a/src/language.h b/src/language.h index ce399d7..7b24e82 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[15][99] = { +static const char* const myLanguage[15][100] = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -99,7 +99,8 @@ static const char* const myLanguage[15][99] = { "25% brightness", // 95 "50% brightness", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Nederlands", // Dutch @@ -200,7 +201,8 @@ static const char* const myLanguage[15][99] = { "25% helderheid", // 95 "50% helderheid", // 96 "AM RF Level afwijking:", // 97 - "Signaalmeter eenheid:" // 98 + "Signaalmeter eenheid:", // 98 + "Gebruik AF:" // 99 }, { "Polski", // Polish @@ -301,7 +303,8 @@ static const char* const myLanguage[15][99] = { "25% jasnosci", // 95 "50% jasnosci", // 96 "Odchylenie poziomu RF AM:", // 97 - "Jednostka sygnalu:" // 98 + "Jednostka sygnalu:", // 98 + "Use AF:" // 99 }, { "Hrvatski", // Croatian @@ -402,7 +405,8 @@ static const char* const myLanguage[15][99] = { "25% svjetlina", // 95 "50% svjetlina", // 96 "AM pomak RF razine:", // 97 - "Jedinica mjerača signala:" // 98 + "Jedinica mjerača signala:", // 98 + "Use AF:" // 99 }, { "Ελληνικά", // Greek @@ -503,7 +507,8 @@ static const char* const myLanguage[15][99] = { "25% φωτεινότητα", // 95 "50% φωτεινότητα", // 96 "AM Ολίσθηση επιπέδου RF:", // 97 - "Μονάδα μέτρησης σήματος:" // 98 + "Μονάδα μέτρησης σήματος:", // 98 + "Use AF:" // 99 }, { "Romana", // Romanian @@ -604,7 +609,8 @@ static const char* const myLanguage[15][99] = { "25% brightness", // 95 "50% brightness", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Deutsch", // German @@ -705,7 +711,8 @@ static const char* const myLanguage[15][99] = { "25% Helligkeit", // 95 "50% Helligkeit", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Czech", // Czech @@ -806,7 +813,8 @@ static const char* const myLanguage[15][99] = { "25% brightness", // 95 "50% brightness", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Slovak", // Slovak @@ -907,7 +915,8 @@ static const char* const myLanguage[15][99] = { "25% brightness", // 95 "50% brightness", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Français", // French @@ -1008,7 +1017,8 @@ static const char* const myLanguage[15][99] = { "25% brightness", // 95 "50% brightness", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Български", // Bulgarian @@ -1109,7 +1119,8 @@ static const char* const myLanguage[15][99] = { "25% brightness", // 95 "50% brightness", // 96 "AM RF Level offset:", // 97 - "Signalmeter unit:" // 98 + "Signalmeter unit:", // 98 + "Use AF:" // 99 }, { "Русский", // Russian @@ -1210,7 +1221,8 @@ static const char* const myLanguage[15][99] = { "25% яркости", // 95 "50% яркости", // 96 "Смещение уровня AM RF:", // 97 - "Измеритель сигнала:" // 98 + "Измеритель сигнала:", // 98 + "Use AF:" // 99 }, { "Українська", // Ukranian @@ -1311,7 +1323,8 @@ static const char* const myLanguage[15][99] = { "25% яскравості", // 95 "50% яскравості", // 96 "Зміщення рівня AM RF:", // 97 - "Вимірник сигналу:" // 98 + "Вимірник сигналу:", // 98 + "Use AF:" // 99 }, { "Italiano", // Italian @@ -1412,7 +1425,8 @@ static const char* const myLanguage[15][99] = { "25 % di luminosità", // 95 "50 % di luminosità", // 96 "Offset livello RF AM: ", // 97 - "Unità S - meter: " // 98 + "Unità S - meter: ", // 98 + "Use AF:" // 99 }, { "Simplified Chinese", // Simplified Chinese @@ -1513,7 +1527,8 @@ static const char* const myLanguage[15][99] = { "屏幕25% 亮度", // 95 "屏幕50% 亮度", // 96 "AM 高频信号偏移:", // 97 - "信号单位:" // 98 + "信号单位:", // 98 + "Use AF:" // 99 } };