diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 66c60d3..2612d9c 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -528,8 +528,9 @@ void TEF6686::readRDS(byte showrdserrors) //AF decoder if (rdsblock == 0) { // Only when in GROUP 0A - if ((rds.rdsC >> 8) > 224 && (rds.rdsC >> 8) < 250 && ((rds.rdsC & 0xFF) * 10 + 8750) == currentfreq) { // Check for AF method B + if ((rds.rdsC >> 8) > 224 && (rds.rdsC >> 8) < 250 && ((rds.rdsC & 0xFF) * 10 + 8750) == currentfreq && !afmethodB) { // Check for AF method B afmethodB = true; + af_updatecounter++; } if (((rds.rdsC >> 8) > 0 && (rds.rdsC >> 8) > 224) && ((rds.rdsC >> 8) > 0 && (rds.rdsC >> 8) < 250)) afinit = true; @@ -542,10 +543,37 @@ void TEF6686::readRDS(byte showrdserrors) if ((rds.rdsC & 0xFF) > 0 && (rds.rdsC & 0xFF) < 205) buffer1 = (rds.rdsC & 0xFF) * 10 + 8750; else buffer1 = 0; if (buffer0 != 0 || buffer1 != 0) rds.hasAF = true; - if (buffer1 == currentfreq && buffer0 > buffer1) for (int x = 0; x < af_counter; x++) if (af[x].frequency == buffer0) af[x].regional = true; - if (buffer0 == currentfreq && buffer0 > buffer1) for (int x = 0; x < af_counter; x++) if (af[x].frequency == buffer1) af[x].regional = true; + if (buffer1 == currentfreq && buffer0 > buffer1) { + for (int x = 0; x < af_counter; x++) { + if (af[x].frequency == buffer0 && !af[x].regional) { + af[x].regional = true; + af_updatecounter++; + } + } + } else if (buffer1 == currentfreq && buffer0 < buffer1) { + for (int x = 0; x < af_counter; x++) { + if (af[x].frequency == buffer0 && !af[x].mixed) { + af[x].mixed = true; + af_updatecounter++; + } + } + } - if (buffer0 == currentfreq || buffer1 == currentfreq) afmethodcounter++; + if (buffer0 == currentfreq && buffer0 > buffer1) { + for (int x = 0; x < af_counter; x++) { + if (af[x].frequency == buffer1 && !af[x].regional) { + af[x].regional = true; + af_updatecounter++; + } + } + } else if (buffer0 == currentfreq && buffer0 < buffer1) { + for (int x = 0; x < af_counter; x++) { + if (af[x].frequency == buffer0 && !af[x].mixed) { + af[x].mixed = true; + af_updatecounter++; + } + } + } bool isValuePresent = false; for (int i = 0; i < 50; i++) { @@ -558,6 +586,7 @@ void TEF6686::readRDS(byte showrdserrors) if (!isValuePresent) { af[af_counter].frequency = buffer0; if (af_counter < 50) af_counter++; + af_updatecounter++; } isValuePresent = false; @@ -571,6 +600,7 @@ void TEF6686::readRDS(byte showrdserrors) if (!isValuePresent) { af[af_counter].frequency = buffer1; if (af_counter < 50) af_counter++; + af_updatecounter++; } if (rds.sortaf) { @@ -945,6 +975,7 @@ void TEF6686::clearRDS (bool fullsearchrds) af[i].afvalid = true; af[i].checked = false; af[i].regional = false; + af[i].mixed = false; } for (i = 0; i < 20; i++) { @@ -997,6 +1028,7 @@ void TEF6686::clearRDS (bool fullsearchrds) rds.hasDynamicPTY = false; rds.hasStereo = false; af_counter = 0; + af_updatecounter = 0; eon_counter = 0; afreset = true; rds.MS = 0; @@ -1011,7 +1043,6 @@ void TEF6686::clearRDS (bool fullsearchrds) afinit = false; errorfreepi = false; afmethodB = false; - afmethodcounter = 0; packet0 = false; packet1 = false; packet2 = false; diff --git a/src/TEF6686.h b/src/TEF6686.h index 5c28438..d7dfa1e 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -12,47 +12,6 @@ enum RDS_GROUPS { RDS_GROUP_12A, RDS_GROUP_12B, RDS_GROUP_13A, RDS_GROUP_13B, RDS_GROUP_14A, RDS_GROUP_14B, RDS_GROUP_15A, RDS_GROUP_15B }; -// FM band: before BAND_GAP; AM band: after BAND_GAP -enum RADIO_BAND { - BAND_OIRT = 0, BAND_FM, BAND_GAP, BAND_LW, BAND_MW, BAND_SW -}; - -// Toggle: LW -> MW -> SW -enum RADIO_AM_BAND_SELECTION { - AM_BAND_ALL = 0, AM_BAND_LW_MW, AM_BAND_LW_SW, AM_BAND_MW_SW, - AM_BAND_LW, AM_BAND_MW, AM_BAND_SW, - AM_BAND_CNT -}; - -// Toggle: OIRT -> FM -enum RADIO_FM_BAND_SELECTION { - FM_BAND_ALL = 0, FM_BAND_OIRT, FM_BAND_FM, - FM_BAND_CNT -}; - -enum RADIO_TUNE_MODE { - TUNE_MAN, TUNE_AUTO, TUNE_MEM, TUNE_MI_BAND -}; - -enum RADIO_POWER_MODE { - DEEP_SLEEP = 0, LCD_OFF, LCD_BRIGHTNESS_1_PERCENT, LCD_BRIGHTNESS_A_QUARTER, LCD_BRIGHTNESS_HALF, RADIO_POWER_MODE_CNT -}; - -enum RADIO_HARDWARE_MODEL { - BASE_ILI9341 = 0, PORTABLE_ILI9341, PORTABLE_TOUCH_ILI9341, - RADIO_HARDWARE_CNT -}; - -enum RADIO_BATTERY_SELECTION { - BATTERY_NONE = 0, BATTERY_VALUE, BATTERY_PERCENT, - RADIO_BATTERY_CNT -}; - -enum RADIO_FM_DEEMPHASIS { - DEEMPHASIS_NONE = 0, DEEMPHASIS_50, DEEMPHASIS_75, - DEEMPHASIS_COUNT -}; - static const char* const PTY_EU[] { "None", "News", @@ -181,6 +140,7 @@ typedef struct _af_ { bool afvalid; bool checked; bool regional; + bool mixed; } af_; typedef struct _eon_ { @@ -258,6 +218,7 @@ class TEF6686 { uint8_t rtplusblock; bool mute; bool afmethodB; + byte af_updatecounter; private: void RDScharConverter(const char* input, wchar_t* output, size_t size, bool under); @@ -296,11 +257,9 @@ class TEF6686 { bool rdsBerrorThreshold; bool rdsCerrorThreshold; bool rdsDerrorThreshold; - byte afmethodcounter; bool packet0; bool packet1; bool packet2; bool packet3; }; - #endif \ No newline at end of file diff --git a/src/constants.h b/src/constants.h index 7e22a7f..f9f160b 100644 --- a/src/constants.h +++ b/src/constants.h @@ -189,6 +189,47 @@ static const char* const unitString[] = {"dBμV", "dBf", "dBm"}; +// FM band: before BAND_GAP; AM band: after BAND_GAP +enum RADIO_BAND { + BAND_OIRT = 0, BAND_FM, BAND_GAP, BAND_LW, BAND_MW, BAND_SW +}; + +// Toggle: LW -> MW -> SW +enum RADIO_AM_BAND_SELECTION { + AM_BAND_ALL = 0, AM_BAND_LW_MW, AM_BAND_LW_SW, AM_BAND_MW_SW, + AM_BAND_LW, AM_BAND_MW, AM_BAND_SW, + AM_BAND_CNT +}; + +// Toggle: OIRT -> FM +enum RADIO_FM_BAND_SELECTION { + FM_BAND_ALL = 0, FM_BAND_OIRT, FM_BAND_FM, + FM_BAND_CNT +}; + +enum RADIO_TUNE_MODE { + TUNE_MAN, TUNE_AUTO, TUNE_MEM, TUNE_MI_BAND +}; + +enum RADIO_POWER_MODE { + DEEP_SLEEP = 0, LCD_OFF, LCD_BRIGHTNESS_1_PERCENT, LCD_BRIGHTNESS_A_QUARTER, LCD_BRIGHTNESS_HALF, RADIO_POWER_MODE_CNT +}; + +enum RADIO_HARDWARE_MODEL { + BASE_ILI9341 = 0, PORTABLE_ILI9341, PORTABLE_TOUCH_ILI9341, + RADIO_HARDWARE_CNT +}; + +enum RADIO_BATTERY_SELECTION { + BATTERY_NONE = 0, BATTERY_VALUE, BATTERY_PERCENT, + RADIO_BATTERY_CNT +}; + +enum RADIO_FM_DEEMPHASIS { + DEEMPHASIS_NONE = 0, DEEMPHASIS_50, DEEMPHASIS_75, + DEEMPHASIS_COUNT +}; + 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/rds.cpp b/src/rds.cpp index 2cfb53c..2558489 100644 --- a/src/rds.cpp +++ b/src/rds.cpp @@ -208,12 +208,12 @@ void ShowAdvancedRDS() { } if (afmethodBold != radio.afmethodB || rdsreset) { - if (!screenmute) { - if (radio.afmethodB) tftPrint(-1, "-R", 60, 51, PrimaryColor, PrimaryColorSmooth, 16); else tftPrint(-1, "-R", 60, 51, GreyoutColor, BackgroundColor, 16); - } - afmethodBold = radio.afmethodB; + if (!screenmute) { + if (radio.afmethodB) tftPrint(-1, "-R", 60, 51, PrimaryColor, PrimaryColorSmooth, 16); else tftPrint(-1, "-R", 60, 51, GreyoutColor, BackgroundColor, 16); + } + afmethodBold = radio.afmethodB; } - + if (MSold != radio.rds.MS) { if (!screenmute) { switch (radio.rds.MS) { @@ -825,16 +825,16 @@ void ShowAFEON() { afpagenr = 0; } - if (af_counterold != radio.af_counter || radio.afmethodB != afmethodBold) { + if (af_counterold != radio.af_updatecounter) { tft.fillRect(2, 48, 166, 150, BackgroundColor); for (byte i = 0; i < radio.af_counter; i++) { byte x = i - (afpagenr == 2 ? 30 : 0); if (radio.af[i].checked) { - if (!screenmute) tftPrint(1, (radio.af[i].regional && radio.afmethodB ? "R " : "") + String(radio.af[i].frequency / 100) + "." + String((radio.af[i].frequency % 100) / 10), 50 + (x > 9 ? 54 : 0) + (x > 19 ? 54 : 0), 48 + (15 * x) - (x > 9 ? 150 : 0) - (x > 19 ? 150 : 0), InsignificantColor, InsignificantColorSmooth, 16); + if (!screenmute) tftPrint(1, ((radio.afmethodB && radio.af[i].regional && radio.af[i].mixed) ? "M " : (radio.afmethodB && radio.af[i].regional && !radio.af[i].mixed ? "R " : "")) + String(radio.af[i].frequency / 100) + "." + String((radio.af[i].frequency % 100) / 10), 50 + (x > 9 ? 54 : 0) + (x > 19 ? 54 : 0), 48 + (15 * x) - (x > 9 ? 150 : 0) - (x > 19 ? 150 : 0), InsignificantColor, InsignificantColorSmooth, 16); } else if (!radio.af[i].afvalid) { - if (!screenmute) tftPrint(1, (radio.af[i].regional && radio.afmethodB ? "R " : "") + String(radio.af[i].frequency / 100) + "." + String((radio.af[i].frequency % 100) / 10), 50 + (x > 9 ? 54 : 0) + (x > 19 ? 54 : 0), 48 + (15 * x) - (x > 9 ? 150 : 0) - (x > 19 ? 150 : 0), SignificantColor, SignificantColorSmooth, 16); + if (!screenmute) tftPrint(1, ((radio.afmethodB && radio.af[i].regional && radio.af[i].mixed) ? "M " : (radio.afmethodB && radio.af[i].regional && !radio.af[i].mixed ? "R " : "")) + String(radio.af[i].frequency / 100) + "." + String((radio.af[i].frequency % 100) / 10), 50 + (x > 9 ? 54 : 0) + (x > 19 ? 54 : 0), 48 + (15 * x) - (x > 9 ? 150 : 0) - (x > 19 ? 150 : 0), SignificantColor, SignificantColorSmooth, 16); } else { - if (!screenmute) tftPrint(1, (radio.af[i].regional && radio.afmethodB ? "R " : "") + String(radio.af[i].frequency / 100) + "." + String((radio.af[i].frequency % 100) / 10), 50 + (x > 9 ? 54 : 0) + (x > 19 ? 54 : 0), 48 + (15 * x) - (x > 9 ? 150 : 0) - (x > 19 ? 150 : 0), PrimaryColor, PrimaryColorSmooth, 16); + if (!screenmute) tftPrint(1, ((radio.afmethodB && radio.af[i].regional && radio.af[i].mixed) ? "M " : (radio.afmethodB && radio.af[i].regional && !radio.af[i].mixed ? "R " : "")) + String(radio.af[i].frequency / 100) + "." + String((radio.af[i].frequency % 100) / 10), 50 + (x > 9 ? 54 : 0) + (x > 19 ? 54 : 0), 48 + (15 * x) - (x > 9 ? 150 : 0) - (x > 19 ? 150 : 0), PrimaryColor, PrimaryColorSmooth, 16); } if (i == 29 + (afpagenr == 2 ? 30 : 0)) i = 254; } @@ -843,8 +843,7 @@ void ShowAFEON() { if (radio.af_counter > 20 + (afpagenr == 2 ? 30 : 0)) tft.drawLine(113, 54, 113, 191, SecondaryColor); if (afpage && !screenmute) tftPrint(1, String(afpagenr) + "/2", 315, 222, SecondaryColor, SecondaryColorSmooth, 16); } - af_counterold = radio.af_counter; - afmethodBold = radio.afmethodB; + af_counterold = radio.af_updatecounter; } if (radio.rds.hasEON) {