From 84c4a0515d2a21b181946432c16609e01236faae Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Sun, 9 Jul 2023 11:52:23 +0200 Subject: [PATCH] Added TMC indicator --- TEF6686_ESP32.ino | 24 +++++++++++++++++------- src/TEF6686.cpp | 5 ++++- src/TEF6686.h | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 659eb50..56267e8 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -53,6 +53,7 @@ bool dynamicPTYold; bool edgebeep; bool haseonold; bool hasrtplusold; +bool hastmcold; bool fullsearchrds; bool hasafold; bool LowLevelInit; @@ -570,6 +571,7 @@ void setup() { sprite.createSprite(317, 16); sprite2.createSprite(172, 16); radio.tone(50, -5, 2000); + BuildAdvancedRDS(); } void loop() { @@ -2796,7 +2798,7 @@ void ShowAdvancedRDS() { if (radio.rds.hasAF) for (byte i = 0; i < radio.af_counter; i++) afstring += String(radio.af[i].frequency / 100) + "." + (radio.af[i].frequency % 100 < 10 ? "0" : "") + String(radio.af[i].frequency % 100) + (radio.af[i].filler ? "(f)" : "") + (i == radio.af_counter - 1 ? " " : " | "); else afstring = myLanguage[language][87]; if (hasafold != radio.rds.hasAF) { if (radio.rds.hasAF) tft.setTextColor(PrimaryColor); else tft.setTextColor(GreyoutColor); - tft.drawString("AF", 62, 45, GFXFF); + tft.drawString("AF", 42, 45, GFXFF); hasafold = radio.rds.hasAF; } if (millis() - afticker >= 350) { @@ -2859,7 +2861,7 @@ void ShowAdvancedRDS() { if (TAold != radio.rds.hasTA) { tft.setFreeFont(FONT7); if (radio.rds.hasTA == true) tft.setTextColor(PrimaryColor); else tft.setTextColor(GreyoutColor); - tft.drawString("TA", 34, 45, GFXFF); + tft.drawString("TA", 24, 45, GFXFF); TAold = radio.rds.hasTA; } @@ -2904,7 +2906,7 @@ void ShowAdvancedRDS() { tft.setFreeFont(FONT7); tft.setTextColor(BackgroundColor); tft.drawRightString(rds_clockold, 205, 105, GFXFF); - if (radio.rds.hasCT == true) tft.setTextColor(PrimaryColor); else tft.setTextColor(GreyoutColor); tft.drawString("CT", 88, 45, GFXFF); + if (radio.rds.hasCT == true) tft.setTextColor(PrimaryColor); else tft.setTextColor(GreyoutColor); tft.drawString("CT", 62, 45, GFXFF); tft.drawRightString(rds_clock, 205, 105, GFXFF); rds_clockold = rds_clock; } @@ -2914,6 +2916,12 @@ void ShowAdvancedRDS() { if (radio.rdsblock < 33) tft.fillCircle((6 * radio.rdsblock) + 10, 136, 2, TFT_GREEN); rdsblockold = radio.rdsblock; } + + if (hastmcold != radio.rds.hasTMC) { + if (radio.rds.hasTMC == true) tft.setTextColor(PrimaryColor); else tft.setTextColor(GreyoutColor); + tft.drawString("TMC", 82, 45, GFXFF); + hastmcold = radio.rds.hasTMC; + } } void doAF() { @@ -3366,15 +3374,16 @@ void BuildAdvancedRDS() { tft.setTextColor(GreyoutColor); tft.setFreeFont(FONT7); tft.drawString("TP", 6, 45, GFXFF); - tft.drawString("TA", 34, 45, GFXFF); - tft.drawString("AF", 62, 45, GFXFF); - tft.drawString("CT", 88, 45, GFXFF); + tft.drawString("TA", 24, 45, GFXFF); + tft.drawString("AF", 42, 45, GFXFF); + tft.drawString("CT", 62, 45, GFXFF); + tft.drawString("TMC", 82, 45, GFXFF); tft.drawString("RT+", 116, 45, GFXFF); tft.drawString("EON", 148, 45, GFXFF); tft.drawString("M", 185, 45, GFXFF); tft.drawString("S", 198, 45, GFXFF); } - + RDSstatusold = false; ShowFreq(0); Stereostatusold = false; @@ -3394,6 +3403,7 @@ void BuildAdvancedRDS() { licold = 254; TAold = false; TPold = false; + hastmcold = false; errorAold = true; errorBold = true; errorCold = true; diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index f6e3cc6..796bb7d 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -306,7 +306,7 @@ void TEF6686::readRDS(bool showrdserrors) rds.hasTP = (bitRead(rds.rdsB, 10)); if (rds.correct) rdsblock = rds.rdsB >> 11; - switch (rds.rdsB >> 11) { + switch (rdsblock) { case RDS_GROUP_0A: { //PS decoder @@ -550,6 +550,8 @@ void TEF6686::readRDS(bool showrdserrors) RDScharConverter(RDSplus2, RTtext2, sizeof(RTtext2) / sizeof(wchar_t), false); // Convert 8 bit ASCII to 16 bit ASCII rds.RTContent2 = convertToUTF8(RTtext2); // Convert RDS characterset to ASCII rds.RTContent2 = extractUTF8Substring(rds.RTContent2, 0, 44, false); // Make sure RT does not exceed 32 characters + + if (rds.correct && rdsblock == 16 && (rds.rdsB & (1 << 4))) rds.hasTMC = true; // TMC flag } break; @@ -681,6 +683,7 @@ void TEF6686::clearRDS (bool fullsearchrds) rds.hasTA = false; rds.hasEON = false; rds.hasCT = false; + rds.hasTMC = false; rds.hasRDSplus = false; rds.correct = false; rt_process = false; diff --git a/src/TEF6686.h b/src/TEF6686.h index 47826a2..3c0b746 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -125,6 +125,7 @@ typedef struct _rds_ { bool hasTP; bool hasTA; bool hasEON; + bool hasTMC; bool hasAF; bool hasCT; bool rtAB;