diff --git a/include/TEF6686.h b/include/TEF6686.h index 840ae3e..37bc64f 100644 --- a/include/TEF6686.h +++ b/include/TEF6686.h @@ -619,6 +619,7 @@ class TEF6686 { bool togglebit; bool runningbit; uint8_t segments_received[16]; + uint8_t segments_received_lps[8]; bool initab; bool afinit; bool errorfreepi; diff --git a/include/globals.h b/include/globals.h index 54b357a..a96a577 100644 --- a/include/globals.h +++ b/include/globals.h @@ -218,8 +218,6 @@ extern int Squelchold; extern int SStatusold; extern int Stereostatus; extern int XDRBWset; -extern int xPos; -extern int xPos2; extern int16_t OStatus; extern int16_t SAvg; extern int16_t SAvg2; @@ -326,8 +324,6 @@ extern unsigned long ModulationpeakPreviousMillis; extern unsigned long NTPtimer; extern unsigned long peakholdmillis; extern unsigned long processed_rdsblocksold[33]; -extern unsigned long pslongticker; -extern unsigned long pslongtickerhold; extern unsigned long rtticker; extern unsigned long rttickerhold; extern unsigned long rotarytimer; @@ -358,6 +354,8 @@ extern WiFiClient RemoteClient; extern WiFiUDP Udp; extern WebServer webserver; +extern ScrollingTextDisplay aidDisplay; +extern ScrollingTextDisplay lpsDisplay; extern ScrollingTextDisplay rtplusDisplay; extern ScrollingTextDisplay eonDisplay; extern ScrollingTextDisplay eccDisplay; diff --git a/include/scrolling_text.h b/include/scrolling_text.h index 7e236cb..e384542 100644 --- a/include/scrolling_text.h +++ b/include/scrolling_text.h @@ -15,14 +15,16 @@ private: bool isScrolling; std::function postDrawCallback; int usedH; + bool hold; + int xOffset; static const unsigned long SCROLL_INTERVAL = 5; static const unsigned long HOLD_DURATION = 2000; static const int SCROLL_GAP = 10; public: - ScrollingTextDisplay(TFT_eSprite* spr, int y, int maxW, int inuseH = -1 ) : - sprite(spr), yPos(y), maxWidth(maxW), xPos(0), textWidth(0), lastTick(0), holdTick(0), isScrolling(false), postDrawCallback(nullptr), usedH(inuseH) {} + ScrollingTextDisplay(TFT_eSprite* spr, int y, int maxW, int x = 35, int inuseH = -1 ) : + sprite(spr), yPos(y), maxWidth(maxW), xPos(0), textWidth(0), lastTick(0), holdTick(0), isScrolling(false), postDrawCallback(nullptr), usedH(inuseH), hold(false), xOffset(x) {} void setPostDrawCallback(std::function callback) { postDrawCallback = callback; @@ -39,12 +41,13 @@ public: if(!isScrolling) holdTick = millis(); isScrolling = true; if(millis() - lastTick >= SCROLL_INTERVAL) { - if(xPos <= -(textWidth + SCROLL_GAP)) xPos = 0; + if(xPos <= -(textWidth + SCROLL_GAP)) {xPos += textWidth + SCROLL_GAP; hold = true;} - if(xPos == 0) { + if(hold) { if(millis() - holdTick >= HOLD_DURATION) { xPos--; holdTick = millis(); + hold = false; } } else { xPos--; @@ -97,6 +100,6 @@ private: } if(postDrawCallback) postDrawCallback(sprite, false); - sprite->pushSprite(35, yPos, TFT_TRANSPARENT); + if(yPos != 0) sprite->pushSprite(xOffset, yPos, TFT_TRANSPARENT); } }; \ No newline at end of file diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 692aec4..124f908 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -1486,7 +1486,11 @@ void TEF6686::readRDS(byte showrdserrors) { case RDS_GROUP_15A: { if (pslong_process && rds.stationNameLong.length() > 0) rds.hasLongPS = true; - uint8_t offset = (rds.rdsB & 7) * 4; + uint8_t segment = rds.rdsB & 7; + uint8_t offset = segment * 4; + + if(segments_received_lps[segment] >= (rds.rdsCerror + rds.rdsBerror)) segments_received_lps[segment] = rds.rdsCerror + rds.rdsBerror; + else return; pslong_buffer2[offset + 0] = pslong_buffer[offset + 0]; pslong_buffer2[offset + 1] = pslong_buffer[offset + 1]; @@ -1629,6 +1633,7 @@ void TEF6686::clearRDS(bool fullsearchrds) { afmethodBprobe = afmethodBtrigger = _hasEnhancedRT = false; rds.ps12error = rds.ps34error = rds.ps56error = rds.ps78error = true; memset(segments_received, 99, sizeof(segments_received)); + memset(segments_received_lps, 99, sizeof(segments_received_lps)); } void TEF6686::tone(uint16_t time, int16_t amplitude, uint16_t frequency) { diff --git a/src/globals.cpp b/src/globals.cpp index 76181c9..eadd58d 100644 --- a/src/globals.cpp +++ b/src/globals.cpp @@ -204,8 +204,6 @@ int Squelchold; int SStatusold; int Stereostatus; int XDRBWset; -int xPos; -int xPos2; int16_t OStatus; int16_t SAvg; int16_t SAvg2; @@ -312,8 +310,6 @@ unsigned long ModulationpeakPreviousMillis; unsigned long NTPtimer; unsigned long peakholdmillis; unsigned long processed_rdsblocksold[33]; -unsigned long pslongticker; -unsigned long pslongtickerhold; unsigned long rtticker; unsigned long rttickerhold; unsigned long rotarytimer; @@ -351,7 +347,9 @@ WiFiClient RemoteClient; WiFiUDP Udp; WebServer webserver(80); -ScrollingTextDisplay rtplusDisplay(&GeneralTextSprite, 147, 173, 19); -ScrollingTextDisplay eonDisplay(&GeneralTextSprite, 174, 173, 19); +ScrollingTextDisplay aidDisplay(&FullLineSprite, 220, 270, 5); +ScrollingTextDisplay lpsDisplay(&PSSprite, 0, 150); +ScrollingTextDisplay rtplusDisplay(&GeneralTextSprite, 147, 173, 35, 19); +ScrollingTextDisplay eonDisplay(&GeneralTextSprite, 174, 173, 35, 19); ScrollingTextDisplay eccDisplay(&FullLineSprite, 198, 270); ScrollingTextDisplay rtDisplay(&FullLineSprite, 220, 270); \ No newline at end of file diff --git a/src/gui.cpp b/src/gui.cpp index 75623ef..a487923 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -608,9 +608,7 @@ void BuildAFScreen() { rds_clockold = ""; dropout = false; rdsreset = true; - rtplusDisplay.reset(); - eonDisplay.reset(); - eccDisplay.reset(); + aidDisplay.reset(); for (byte i = 0; i < 20; i++) { mappedfreqold[i] = 0; mappedfreqold2[i] = 0; @@ -2980,9 +2978,8 @@ void BuildAdvancedRDS() { dropout = false; rdsreset = true; ShowMemoryPos(); - xPos = 0; - xPos2 = 0; rtplusDisplay.reset(); + lpsDisplay.reset(); eonDisplay.reset(); eccDisplay.reset(); rtDisplay.reset(); @@ -3109,6 +3106,7 @@ void BuildDisplay() { BWreset = true; dropout = false; rtplusDisplay.reset(); + lpsDisplay.reset(); eonDisplay.reset(); eccDisplay.reset(); rtDisplay.reset(); @@ -3124,8 +3122,6 @@ void BuildDisplay() { radio.rds.hasTMC.call(); radio.rds.hasCT.call(); radio.rds.hasRTplus.call(); - xPos = 0; - xPos2 = 0; MPold = 99; USold = 99; } diff --git a/src/rds.cpp b/src/rds.cpp index 37c78be..05eb158 100644 --- a/src/rds.cpp +++ b/src/rds.cpp @@ -437,32 +437,9 @@ void showPS() { stationNameLongOld = stationNameLongString; } - // Handle scrolling logic for long PS - if (PSSprite.textWidth(trimTrailingSpaces(radio.rds.stationNameLong)) < 150) { - xPos2 = 0; - PSSprite.fillSprite(BackgroundColor); - PSSprite.setTextColor(RDSstatus ? RDSColor : RDSDropoutColor, RDSstatus ? RDSColorSmooth : RDSDropoutColorSmooth, false); - PSSprite.drawString(stationNameLongString, xPos2, 2); - } else { - if (millis() - pslongticker >= 5) { - if (xPos2 == 0 && millis() - pslongtickerhold < 2000) { - // Hold at position 0 - } else { - xPos2--; - pslongtickerhold = millis(); - } - - if (xPos2 < -PSLongWidth) xPos2 = 0; - pslongticker = millis(); - } - - PSSprite.fillSprite(BackgroundColor); - PSSprite.setTextColor(RDSstatus ? RDSColor : RDSDropoutColor, RDSstatus ? RDSColorSmooth : RDSDropoutColorSmooth, false); - PSSprite.drawString(stationNameLongString, xPos2 + 8, 2); - PSSprite.drawString(stationNameLongString, xPos2 + PSLongWidth, 2); - } + lpsDisplay.update(stationNameLongString, RDSstatus, RDSColor, RDSColorSmooth, RDSDropoutColor, RDSDropoutColorSmooth, BackgroundColor); } else { - xPos2 = 0; + lpsDisplay.reset(); PSSprite.fillSprite(BackgroundColor); for (int i = 0; i < 7; i++) { @@ -491,7 +468,7 @@ void showPS() { if (PSold != radio.rds.stationName) ps12errorold = ps34errorold = ps56errorold = ps78errorold = true; } - if (!screenmute) PSSprite.pushSprite(36, advancedRDS ? 72 : 185); + if (!screenmute) PSSprite.pushSprite(36, advancedRDS ? 72 : 185, TFT_TRANSPARENT); if (wifi && radio.rds.stationName.length() > 0 && PSold != radio.rds.stationName) { Udp.beginPacket(remoteip, 9030); @@ -762,34 +739,7 @@ void ShowAFEON() { } } - if (FullLineSprite.textWidth(trimTrailingSpaces(AIDString)) < 270) { - xPos = 0; - FullLineSprite.fillSprite(BackgroundColor); - FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(AIDString, xPos, 2); - FullLineSprite.drawLine(283, 0, 283, 19, FrameColor); - FullLineSprite.pushSprite(5, 220); - } else { - if (millis() - rtticker >= 5) { - if (xPos < -AIDWidth) xPos = 0; - if (xPos == 0) { - if (millis() - rttickerhold >= 2000) { - xPos--; - rttickerhold = millis(); - } - } else { - xPos--; - rttickerhold = millis(); - } - FullLineSprite.fillSprite(BackgroundColor); - FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(AIDString, xPos, 2); - FullLineSprite.drawString(AIDString, xPos + AIDWidth, 2); - FullLineSprite.drawLine(314, 0, 314, 19, FrameColor); - FullLineSprite.pushSprite(5, 220); - rtticker = millis(); - } - } + aidDisplay.update(AIDString, true, ActiveColor, ActiveColorSmooth, 0, 0, BackgroundColor); } }