From 103a81bd6e4a08a2d3b2a79fb406a28dc5bc8fec Mon Sep 17 00:00:00 2001 From: Sjef Verhoeven PE5PVB Date: Wed, 17 Apr 2024 20:31:31 +0200 Subject: [PATCH] Another approche for RDS error detection --- src/TEF6686.cpp | 13 +++--- src/rds.cpp | 106 ++++++++++++++++++++++++------------------------ 2 files changed, 59 insertions(+), 60 deletions(-) diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 1bf5368..52320f2 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -372,10 +372,9 @@ bool TEF6686::getStatusAM(int16_t &level, uint16_t &noise, uint16_t &cochannel, return snr; } -void TEF6686::readRDS(byte showrdserrors) -{ +void TEF6686::readRDS(byte showrdserrors) { uint8_t offset; - if (rds.filter) { + if (rds.filter || ps_process) { devTEF_Radio_Get_RDS_Status(&rds.rdsStat, &rds.rdsA, &rds.rdsB, &rds.rdsC, &rds.rdsD, &rds.rdsErr); } else { if (millis() >= rdstimer + 87) { @@ -405,10 +404,10 @@ void TEF6686::readRDS(byte showrdserrors) rdsDerrorThreshold = (((rds.rdsErr >> 8) & 0x03) > showrdserrors); if (bitRead(rds.rdsStat, 9)) { // We have all data to decode... let's go... - rds.rdsAerror = (((rds.rdsErr >> 14) & 0x03) > 2); - rds.rdsBerror = (((rds.rdsErr >> 12) & 0x03) > 2); - rds.rdsCerror = (((rds.rdsErr >> 10) & 0x03) > 2); - rds.rdsDerror = (((rds.rdsErr >> 8) & 0x03) > 2); + rds.rdsAerror = (((rds.rdsErr >> 14) & 0x03) > 1); + rds.rdsBerror = (((rds.rdsErr >> 12) & 0x03) > 1); + rds.rdsCerror = (((rds.rdsErr >> 10) & 0x03) > 1); + rds.rdsDerror = (((rds.rdsErr >> 8) & 0x03) > 1); //PI decoder if (!rdsAerrorThreshold && afreset) { diff --git a/src/rds.cpp b/src/rds.cpp index 249c315..ac0890e 100644 --- a/src/rds.cpp +++ b/src/rds.cpp @@ -410,64 +410,64 @@ void readRds() { } } - if (bitRead(radio.rds.rdsStat, 9)) { - if ((RDSstatus && RDSSPYUSB) || (RDSstatus && RDSSPYTCP)) { - RDSSPYRDS = "G:\r\n"; - if (radio.rds.rdsAerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX) + String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX); - if (radio.rds.rdsBerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsB >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsB >> 8) & 0xF, HEX) + String(((radio.rds.rdsB) >> 4) & 0xF, HEX) + String((radio.rds.rdsB) & 0xF, HEX); - if (radio.rds.rdsCerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsC >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsC >> 8) & 0xF, HEX) + String(((radio.rds.rdsC) >> 4) & 0xF, HEX) + String((radio.rds.rdsC) & 0xF, HEX); - if (radio.rds.rdsDerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsD >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsD >> 8) & 0xF, HEX) + String(((radio.rds.rdsD) >> 4) & 0xF, HEX) + String((radio.rds.rdsD) & 0xF, HEX); - RDSSPYRDS += "\r\n\r\n"; + if (bitRead(radio.rds.rdsStat, 9)) { + if ((RDSstatus && RDSSPYUSB) || (RDSstatus && RDSSPYTCP)) { + RDSSPYRDS = "G:\r\n"; + if (radio.rds.rdsAerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX) + String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX); + if (radio.rds.rdsBerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsB >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsB >> 8) & 0xF, HEX) + String(((radio.rds.rdsB) >> 4) & 0xF, HEX) + String((radio.rds.rdsB) & 0xF, HEX); + if (radio.rds.rdsCerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsC >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsC >> 8) & 0xF, HEX) + String(((radio.rds.rdsC) >> 4) & 0xF, HEX) + String((radio.rds.rdsC) & 0xF, HEX); + if (radio.rds.rdsDerror) RDSSPYRDS += "----"; else RDSSPYRDS += String(((radio.rds.rdsD >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsD >> 8) & 0xF, HEX) + String(((radio.rds.rdsD) >> 4) & 0xF, HEX) + String((radio.rds.rdsD) & 0xF, HEX); + RDSSPYRDS += "\r\n\r\n"; - if (RDSSPYRDS != RDSSPYRDSold) { - if (RDSSPYUSB) Serial.print(RDSSPYRDS); else RemoteClient.print(RDSSPYRDS); - RDSSPYRDSold = RDSSPYRDS; - } - } - - if ((RDSstatus && XDRGTKUSB) || (RDSstatus && XDRGTKTCP)) { - XDRGTKRDS = "R"; - XDRGTKRDS += String(((radio.rds.rdsB >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsB >> 8) & 0xF, HEX); - XDRGTKRDS += String(((radio.rds.rdsB) >> 4) & 0xF, HEX) + String((radio.rds.rdsB) & 0xF, HEX); - XDRGTKRDS += String(((radio.rds.rdsC >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsC >> 8) & 0xF, HEX); - 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); - - uint8_t erroutput = 0; - erroutput |= ((radio.rds.rdsErr >> 8) & B00110000) >> 4; - erroutput |= ((radio.rds.rdsErr >> 8) & B00001100); - erroutput |= ((radio.rds.rdsErr >> 8) & B00000011) << 4; - - XDRGTKRDS += String((erroutput >> 4) & 0xF, HEX); - XDRGTKRDS += String(erroutput & 0xF, HEX); - XDRGTKRDS += "\n"; - - if (XDRGTKRDS != XDRGTKRDSold) { - uint8_t piError = radio.rds.rdsErr >> 14; - if (piError < 3) { - uint8_t piState = radio.rds.piBuffer.add(radio.rds.rdsA, piError); - - if (piState != RdsPiBuffer::STATE_INVALID) { - DataPrint ("P"); - String PIcodeToSend; - PIcodeToSend = String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX) + String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX); - PIcodeToSend.toUpperCase(); - DataPrint (PIcodeToSend); - while (piState != 0) { - DataPrint("?"); - piState--; - } - DataPrint ("\n"); - } + if (RDSSPYRDS != RDSSPYRDSold) { + if (RDSSPYUSB) Serial.print(RDSSPYRDS); else RemoteClient.print(RDSSPYRDS); + RDSSPYRDSold = RDSSPYRDS; + } + } + + if ((RDSstatus && XDRGTKUSB) || (RDSstatus && XDRGTKTCP)) { + XDRGTKRDS = "R"; + XDRGTKRDS += String(((radio.rds.rdsB >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsB >> 8) & 0xF, HEX); + XDRGTKRDS += String(((radio.rds.rdsB) >> 4) & 0xF, HEX) + String((radio.rds.rdsB) & 0xF, HEX); + XDRGTKRDS += String(((radio.rds.rdsC >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsC >> 8) & 0xF, HEX); + 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); + + uint8_t erroutput = 0; + erroutput |= ((radio.rds.rdsErr >> 8) & B00110000) >> 4; + erroutput |= ((radio.rds.rdsErr >> 8) & B00001100); + erroutput |= ((radio.rds.rdsErr >> 8) & B00000011) << 4; + + XDRGTKRDS += String((erroutput >> 4) & 0xF, HEX); + XDRGTKRDS += String(erroutput & 0xF, HEX); + XDRGTKRDS += "\n"; + + if (XDRGTKRDS != XDRGTKRDSold) { + uint8_t piError = radio.rds.rdsErr >> 14; + if (piError < 3) { + uint8_t piState = radio.rds.piBuffer.add(radio.rds.rdsA, piError); + + if (piState != RdsPiBuffer::STATE_INVALID) { + DataPrint ("P"); + String PIcodeToSend; + PIcodeToSend = String(((radio.rds.rdsA >> 8) >> 4) & 0xF, HEX) + String((radio.rds.rdsA >> 8) & 0xF, HEX) + String(((radio.rds.rdsA) >> 4) & 0xF, HEX) + String((radio.rds.rdsA) & 0xF, HEX); + PIcodeToSend.toUpperCase(); + DataPrint (PIcodeToSend); + while (piState != 0) { + DataPrint("?"); + piState--; + } + DataPrint ("\n"); + } + } + XDRGTKRDSold = XDRGTKRDS; + XDRGTKRDS.toUpperCase(); + DataPrint(XDRGTKRDS); } - XDRGTKRDSold = XDRGTKRDS; - XDRGTKRDS.toUpperCase(); - DataPrint(XDRGTKRDS); } } } - } } void ShowErrors() {