diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 26b58f5..bf4d32b 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -89,6 +89,7 @@ bool XDRGTKdata; bool XDRGTKTCP; bool XDRGTKUSB; bool XDRMute; +bool screensavertriggered = false; byte af_counterold; byte amnb; byte audiomode; @@ -130,11 +131,13 @@ byte specialstepOIRT; byte stepsize; byte fmminstepsize; byte deepsleep; +byte screensaverset; byte StereoLevel; byte subnetclient; byte TEF; byte theme; byte tunemode; +byte screensaverOptions[5] = { 0, 5, 10, 30, 60 }; char buff[16]; char programTypePrevious[18]; char radioIdPrevious[6]; @@ -269,10 +272,12 @@ WiFiConnect wc; WiFiServer Server(7373); WiFiClient RemoteClient; WiFiUDP Udp; +hw_timer_t *timScreensaver = NULL; +byte screensaver_IRQ = OFF; void setup() { setupmode = true; - EEPROM.begin(262); + EEPROM.begin(263); if (EEPROM.readByte(43) != 29) DefaultSettings(); frequency = EEPROM.readUInt(0); @@ -326,6 +331,7 @@ void setup() { deepsleep = EEPROM.readByte(259); CurrentTheme = EEPROM.readByte(260); fmminstepsize = EEPROM.readByte(261); + screensaverset = EEPROM.readByte(262); LWLowEdgeSet = FREQ_LW_LOW_EDGE_MIN; // later will read from flash LWHighEdgeSet = FREQ_LW_HIGH_EDGE_MAX; // later will read from flash @@ -572,6 +578,11 @@ void setup() { sprite.createSprite(317, 16); sprite2.createSprite(172, 16); radio.tone(50, -5, 2000); + + if (screensaverset) { + ScreensaverTimerInit(); + ScreensaverTimerSet(screensaverOptions[screensaverset]); + } } void loop() { @@ -684,8 +695,14 @@ void loop() { } } - if (rotary == -1) KeyUp(); - if (rotary == 1) KeyDown(); + if (rotary == -1) { + KeyUp(); + if (screensaverset && !menu) ScreensaverTimerRestart(); + } + if (rotary == 1) { + KeyDown(); + if (screensaverset && !menu) ScreensaverTimerRestart(); + } if (digitalRead(ROTARY_BUTTON) == LOW) ButtonPress(); if (digitalRead(MODEBUTTON) == LOW && screenmute == false) ModeButtonPress(); @@ -707,6 +724,27 @@ void loop() { attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), read_encoder, CHANGE); attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_B), read_encoder, CHANGE); } + + if (screensaverset) { + if (screensaver_IRQ) + { + screensaver_IRQ = OFF; + if (!screensavertriggered && !advancedRDS && !menu) { + screensavertriggered = true; + WakeToSleep(true); + } + } + } + } else { + if (rotary != 0) { + rotary = 0; + if (screensavertriggered) { + screensavertriggered = false; + screensaver_IRQ = OFF; + WakeToSleep(false); + ScreensaverTimerReopen(); + } + } } } @@ -730,8 +768,8 @@ void GetData() { } } -void SleepWake(bool isSleep) { - if (isSleep) { +void WakeToSleep(bool yes) { + if (yes) { power = false; analogWrite(SMETERPIN, 0); analogWrite(CONTRASTPIN, 0); @@ -750,15 +788,56 @@ void SleepWake(bool isSleep) { } } +void ScreensaverTimerInit() { + timScreensaver = timerBegin(0, 80, true); + timerAttachInterrupt(timScreensaver, ScreensaverInterrupt, true); +} + +void ScreensaverTimerSet(byte value) { + if (timScreensaver == NULL) { + ScreensaverTimerInit(); + ScreensaverTimerSet(screensaverOptions[screensaverset]); + } + + if (value == OFF) { + if (screensaverset) timerStop(timScreensaver); + } else { + timerStop(timScreensaver); + timerAlarmWrite(timScreensaver, value * TIMER_SCREENSAVER_BASE, true); + timerStart(timScreensaver); + timerAlarmEnable(timScreensaver); + } +} + +void ScreensaverTimerRestart() { + if (timScreensaver == NULL) { + ScreensaverTimerInit(); + ScreensaverTimerSet(screensaverOptions[screensaverset]); + } + timerRestart(timScreensaver); +} + +void ScreensaverTimerReopen() { + ScreensaverTimerSet(OFF); + ScreensaverTimerSet(screensaverOptions[screensaverset]); + ScreensaverTimerRestart(); +} + +void ScreensaverInterrupt() +{ + screensaver_IRQ = ON; +} + void BANDBUTTONPress() { - if (menu == false) { - unsigned long counterold = millis(); - unsigned long counter = millis(); + unsigned long counterold = millis(); + unsigned long counter = millis(); + if (menu == false && power) { while (digitalRead(BANDBUTTON) == LOW && counter - counterold <= 1000) counter = millis(); if (counter - counterold < 1000) { if (advancedRDS) { BuildDisplay(); + ScreensaverTimerReopen(); } else { if (tunemode != TUNE_MEM) { if (band == BAND_FM) { @@ -771,6 +850,7 @@ void BANDBUTTONPress() { StoreFrequency(); SelectBand(); } + ScreensaverTimerRestart(); } } else { if (band == BAND_FM) { @@ -780,6 +860,25 @@ void BANDBUTTONPress() { while (digitalRead(BANDBUTTON) == LOW) delay(50); delay(100); } + + // Wake after screensaver triggered here + if (power == false) { + while (digitalRead(BANDBUTTON) == LOW && counter - counterold <= 1000) counter = millis(); + + if (counter - counterold < 1000) { + if (screensavertriggered) { + screensavertriggered = !screensavertriggered; + WakeToSleep(false); + ScreensaverTimerReopen(); + } + } else { + if (screensavertriggered) { + screensavertriggered = !screensavertriggered; + WakeToSleep(false); + ScreensaverTimerReopen(); + } + } + } } void StoreFrequency() { @@ -1211,6 +1310,9 @@ void BWButtonPress() { } else { doStereoToggle(); } + if (screensaverset) { + ScreensaverTimerRestart(); + } } while (digitalRead(BWBUTTON) == LOW) delay(50); @@ -1252,6 +1354,9 @@ void ModeButtonPress() { if (counter - counterold <= 1000) { doTuneMode(); + if (screensaverset) { + ScreensaverTimerRestart(); + } } else { if (XDRGTKUSB == true || XDRGTKTCP == true) { ShowFreq(1); @@ -1267,6 +1372,7 @@ void ModeButtonPress() { if (menu == false) { BuildMenu(); menu = true; + ScreensaverTimerSet(OFF); } } } @@ -1334,10 +1440,13 @@ void ModeButtonPress() { EEPROM.writeByte(259, deepsleep); EEPROM.writeByte(260, CurrentTheme); EEPROM.writeByte(261, fmminstepsize); + EEPROM.writeByte(262, screensaverset); EEPROM.commit(); Serial.end(); if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient); if (USBmode) Serial.begin(19200); else Serial.begin(115200); + ScreensaverTimerSet(screensaverOptions[screensaverset]); + if (screensaverset) ScreensaverTimerRestart(); } } while (digitalRead(MODEBUTTON) == LOW) delay(50); @@ -1522,6 +1631,9 @@ void ButtonPress() { EEPROM.commit(); } } + if (screensaverset) { + ScreensaverTimerRestart(); + } } else { if (menuopen == false) { menuopen = true; @@ -1823,6 +1935,13 @@ void ButtonPress() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); if (fmminstepsize) tft.drawRightString(String(FREQ_FM_STEP_100K * 10, DEC), 155, 110, GFXFF); else tft.drawRightString(String(FREQ_FM_STEP_50K * 10, DEC), 155, 110, GFXFF); break; + case 110: + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + tft.drawCentreString(myLanguage[language][91], 155, 70, GFXFF); + if (screensaverset) tft.drawString(myLanguage[language][92], 170, 110, GFXFF); + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + if (!screensaverset) tft.drawRightString(myLanguage[language][33], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); + break; } break; } @@ -2212,6 +2331,7 @@ void KeyUp() { tft.setTextColor(PrimaryColor); tft.drawCentreString(CurrentThemeString, 155, 110, GFXFF); break; + case 70: if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); if (deepsleep) tft.drawCentreString(myLanguage[language][75], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][76], 155, 110, GFXFF); @@ -2219,6 +2339,7 @@ void KeyUp() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); if (deepsleep) tft.drawCentreString(myLanguage[language][75], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][76], 155, 110, GFXFF); break; + case 90: if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); if (fmminstepsize) tft.drawRightString(String(FREQ_FM_STEP_100K * 10, DEC), 155, 110, GFXFF); else tft.drawRightString(String(FREQ_FM_STEP_50K * 10, DEC), 155, 110, GFXFF); @@ -2226,6 +2347,18 @@ void KeyUp() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); if (fmminstepsize) tft.drawRightString(String(FREQ_FM_STEP_100K * 10, DEC), 155, 110, GFXFF); else tft.drawRightString(String(FREQ_FM_STEP_50K * 10, DEC), 155, 110, GFXFF); break; + + case 110: + if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); + if (screensaverset) tft.drawString(myLanguage[language][92], 170, 110, GFXFF); + if (!screensaverset) tft.drawRightString(myLanguage[language][33], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); + screensaverset ++; + if (screensaverset > 4) screensaverset = 0; + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + if (screensaverset) tft.drawString(myLanguage[language][92], 170, 110, GFXFF); + if (!screensaverset) tft.drawRightString(myLanguage[language][33], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); + break; + } break; } @@ -2616,6 +2749,7 @@ void KeyDown() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); if (deepsleep) tft.drawCentreString(myLanguage[language][75], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][76], 155, 110, GFXFF); break; + case 90: if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); if (fmminstepsize) tft.drawRightString(String(FREQ_FM_STEP_100K * 10, DEC), 155, 110, GFXFF); else tft.drawRightString(String(FREQ_FM_STEP_50K * 10, DEC), 155, 110, GFXFF); @@ -2623,6 +2757,18 @@ void KeyDown() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); if (fmminstepsize) tft.drawRightString(String(FREQ_FM_STEP_100K * 10, DEC), 155, 110, GFXFF); else tft.drawRightString(String(FREQ_FM_STEP_50K * 10, DEC), 155, 110, GFXFF); break; + + case 110: + if (CurrentTheme == 7) tft.setTextColor(TFT_WHITE); else tft.setTextColor(TFT_BLACK); + if (screensaverset) tft.drawString(myLanguage[language][92], 170, 110, GFXFF); + if (!screensaverset) tft.drawRightString(myLanguage[language][33], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); + screensaverset --; + if (screensaverset > 4) screensaverset = 4; + if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); + if (screensaverset) tft.drawString(myLanguage[language][92], 170, 110, GFXFF); + if (!screensaverset) tft.drawRightString(myLanguage[language][33], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); + break; + } break; } @@ -3302,14 +3448,17 @@ void BuildMenu() { break; case 4: tft.drawRightString("KHz", 305, 90, GFXFF); + if (screensaverset) tft.drawRightString(myLanguage[language][92], 305, 110, GFXFF); tft.drawString(myLanguage[language][77], 14, 30, GFXFF); tft.drawString(myLanguage[language][70], 14, 50, GFXFF); tft.drawString(myLanguage[language][74], 14, 70, GFXFF); tft.drawString(myLanguage[language][90], 14, 90, GFXFF); + tft.drawString(myLanguage[language][91], 14, 110, GFXFF); tft.setTextColor(PrimaryColor); tft.drawRightString(CurrentThemeString, 305, 30, GFXFF); if (deepsleep) tft.drawRightString(myLanguage[language][75], 305, 70, GFXFF); else tft.drawRightString(myLanguage[language][76], 305, 70, GFXFF); if (fmminstepsize) 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][33], 265, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 265, 110, GFXFF); break; } analogWrite(SMETERPIN, 0); @@ -3337,6 +3486,7 @@ void MuteScreen(int setting) { void BuildAdvancedRDS() { advancedRDS = true; + ScreensaverTimerSet(OFF); if (theme == 0) { tft.invertDisplay(colorinvert); tft.fillScreen(BackgroundColor); @@ -5431,5 +5581,6 @@ void DefaultSettings() { EEPROM.writeByte(259, 0); EEPROM.writeByte(260, 0); EEPROM.writeByte(261, 0); + EEPROM.writeByte(262, 0); EEPROM.commit(); } diff --git a/src/constants.h b/src/constants.h index 301546a..f9a541a 100644 --- a/src/constants.h +++ b/src/constants.h @@ -1,7 +1,11 @@ +#define ON 1 +#define OFF 0 + #define TIMER_OFFSET_TIMER (TIMER_500_TICK) #define TIMER_BW_TIMER (TIMER_500_TICK) #define TIMER_SNR_TIMER (TIMER_500_TICK) #define TIMER_BAT_TIMER (TIMER_500_TICK) +#define TIMER_SCREENSAVER_BASE 1000000 #define TIMER_500_TICK 500 #define BAT_LEVEL_EMPTY 1600 diff --git a/src/language.h b/src/language.h index 26bad50..5fe3348 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[12][91] = { +static const char* const myLanguage[12][93] = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -91,7 +91,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM default stepsize" // 90 + "FM default stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Nederlands", // Dutch @@ -184,7 +186,9 @@ static const char* const myLanguage[12][91] = { "AF niet beschikbaar", // 87 "EON niet beschikbaar", // 88 "RT+ niet beschikbaar", // 89 - "FM stapgrootte" // 90 + "FM stapgrootte", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Polski", // Polish @@ -277,7 +281,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM min stepsize" // 90 + "FM min stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Hrvatski", // Croatian @@ -370,7 +376,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM min stepsize" // 90 + "FM min stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Ελληνικά", // Greek @@ -463,7 +471,9 @@ static const char* const myLanguage[12][91] = { "Μη διαθέσιμο AF", // 87 "Μη διαθέσιμο EON", // 88 "Μη διαθέσιμο RT+", // 89 - "Μέγεθος βήματος FM" // 90 + "Μέγεθος βήματος FM", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Romana", // Romanian @@ -556,7 +566,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM min stepsize" // 90 + "FM min stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Deutsch", // German @@ -649,7 +661,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM min stepsize" // 90 + "FM min stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Czech", // Czech @@ -742,7 +756,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM min stepsize" // 90 + "FM min stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Slovak", // Slovak @@ -835,7 +851,9 @@ static const char* const myLanguage[12][91] = { "No AF available", // 87 "No EON available", // 88 "No RT+ available", // 89 - "FM min stepsize" // 90 + "FM min stepsize", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "France", // French @@ -855,7 +873,7 @@ static const char* const myLanguage[12][91] = { "Décalage du niveau RF:", // 14 "Seuil minimum pour la Stéréo :", // 15 "Angle du filtre High Cut :", // 16 - "Seuil minimum pour le filtre High Cut:", // 17 + "Seuil minimum pour le filtre High Cut :", // 17 "Seuil minimum de niveau bas :", // 18 "Contraste:", // 19 "Réglage du volume", // 20 @@ -863,10 +881,10 @@ static const char* const myLanguage[12][91] = { "Réglage de la limite de bande basse", // 22 "Réglage de la limite de bande haute", // 23 "Réglage du décalage du niveau", // 24 - "Seuil minimum pour la sép. Stéréo", // 25 - "Fréq. pour l'angle High Cut", // 26 - "Seuil minimum pour le filtre High Cut", // 27 - "Seuil minimum de niveau bas", // 28 + "Réglage du seuil minimum pour la séparation de la Stéréo", // 25 + "Réglage de la fréquence pour l'angle du filtre High Cut", // 26 + "Réglage du seuil minimum pour le filtre High Cut", // 27 + "Réglage du seuil minimum de niveau bas", // 28 "Réglage de la luminosité de l'affichage", // 29 "Éteint", // 30 "L'écran est désactivé !", // 31 @@ -879,15 +897,15 @@ static const char* const myLanguage[12][91] = { "Montrer les erreurs de décodage RDS", // 38 "Langage", // 39 "Choix de la langue", // 40 - "APP. SUR MODE POUR SAUVEGARDER", // 41 + "APPUYEZ SUR MODE POUR SORTIR ET SAUVEGARDER", // 41 "Allumé", // 42 "Sourdine douce FM", // 43 "Sourdine douce AM", // 44 - "Bip à la limite de bande", // 45 + "Émettre un bip lorsque la limite de bande est atteinte", // 45 "Région", // 46 "Europe", // 47 "États-Unis", // 48 - "Tirets à la place des espaces sur le PS", // 49 + "Remplacer les espaces du PS (RDS) par des tirets du bas", // 49 "Mode USB", // 50 "Wi-Fi actif", // 51 "Configuration du Wi-Fi", // 52 @@ -928,7 +946,9 @@ static const char* const myLanguage[12][91] = { "AF indisponible", // 87 "EON indisponible", // 88 "RT+ indisponible", // 89 - "Valeur du pas FM par défaut" // 90 + "Valeur du pas FM par défaut", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Български", // Bulgarian @@ -1021,7 +1041,9 @@ static const char* const myLanguage[12][91] = { "AF опцията не е налична", // 87 "EON опцията не е налична", // 88 "RT+ опцията не е налична", // 89 - "Размер на стъпката по подразбиране на FM" // 90 + "Размер на стъпката по подразбиране на FM", // 90 + "Screensaver", // 91 + "Sec" // 92 }, { "Русский", // Russian @@ -1114,7 +1136,9 @@ static const char* const myLanguage[12][91] = { "Нет доступного AF", // 87 "Нет доступного EON", // 88 "Нет доступного RT+", // 89 - "Шаг FM по умолчанию" // 90 + "Шаг FM по умолчанию", // 90 + "Screensaver", // 91 + "Sec" // 92 } };