diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 0a78766..28b03ae 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -131,14 +131,14 @@ byte SNRold; byte specialstepOIRT; byte stepsize; byte fmminstepsize; -byte deepsleep; +byte poweroptions; byte screensaverset; byte StereoLevel; byte subnetclient; byte TEF; byte theme; byte tunemode; -byte screensaverOptions[5] = { 0, 5, 10, 30, 60 }; +byte screensaverOptions[5] = { 0, 3, 10, 30, 60 }; char buff[16]; char programTypePrevious[18]; char radioIdPrevious[6]; @@ -330,7 +330,7 @@ void setup() { LowEdgeOIRTSet = EEPROM.readUInt(250); HighEdgeOIRTSet = EEPROM.readUInt(254); colorinvert = EEPROM.readByte(258); - deepsleep = EEPROM.readByte(259); + poweroptions = EEPROM.readByte(259); CurrentTheme = EEPROM.readByte(260); fmminstepsize = EEPROM.readByte(261); screensaverset = EEPROM.readByte(262); @@ -698,12 +698,22 @@ void loop() { } if (rotary == -1) { - KeyUp(); - if (screensaverset && !menu) ScreensaverTimerRestart(); + if (screensavertriggered) { + rotary = 0; + WakeToSleep(REVERSE); + } else { + KeyUp(); + if (screensaverset && !menu && !screensavertriggered) ScreensaverTimerRestart(); + } } if (rotary == 1) { - KeyDown(); - if (screensaverset && !menu) ScreensaverTimerRestart(); + if (screensavertriggered) { + rotary = 0; + WakeToSleep(REVERSE); + } else { + KeyDown(); + if (screensaverset && !menu && !screensavertriggered) ScreensaverTimerRestart(); + } } if (digitalRead(ROTARY_BUTTON) == LOW) if (!afscreen) ButtonPress(); @@ -732,7 +742,6 @@ void loop() { { screensaver_IRQ = OFF; if (!screensavertriggered && !advancedRDS && !menu) { - screensavertriggered = true; WakeToSleep(true); } } @@ -740,12 +749,7 @@ void loop() { } else { if (rotary != 0) { rotary = 0; - if (screensavertriggered) { - screensavertriggered = false; - screensaver_IRQ = OFF; - WakeToSleep(false); - ScreensaverTimerReopen(); - } + if (screensavertriggered) WakeToSleep(REVERSE); } } } @@ -774,22 +778,96 @@ void GetData() { } } +void ShowPowerOptions(bool notglanceview) { + uint16_t x, y; + if (notglanceview) { + x = 155; + y = 110; + } else { + x = 305; + y = 70; + } + + switch (poweroptions) { + case DEEP_SLEEP: + if (notglanceview) tft.drawCentreString(myLanguage[language][75], x, y, GFXFF); + else tft.drawRightString(myLanguage[language][75], x, y, GFXFF); + break; + case LCD_OFF: + if (notglanceview) tft.drawCentreString(myLanguage[language][76], x, y, GFXFF); + else tft.drawRightString(myLanguage[language][76], x, y, GFXFF); + break; + case LCD_BRIGHTNESS_1_PERCENT: + if (notglanceview) tft.drawCentreString(myLanguage[language][94], x, y, GFXFF); + else tft.drawRightString(myLanguage[language][94], x, y, GFXFF); + break; + case LCD_BRIGHTNESS_A_QUARTER: + if (notglanceview) tft.drawCentreString(myLanguage[language][95], x, y, GFXFF); + else tft.drawRightString(myLanguage[language][95], x, y, GFXFF); + break; + case LCD_BRIGHTNESS_HALF: + if (notglanceview) tft.drawCentreString(myLanguage[language][96], x, y, GFXFF); + else tft.drawRightString(myLanguage[language][96], x, y, GFXFF); + break; + } +} + void WakeToSleep(bool yes) { if (yes) { - power = false; - analogWrite(SMETERPIN, 0); - analogWrite(CONTRASTPIN, 0); - StoreFrequency(); - if (deepsleep) radio.power(1); - } else { - if (deepsleep) { - ESP.restart(); + screensavertriggered = true; + switch (poweroptions) { + case DEEP_SLEEP: + power = false; + analogWrite(SMETERPIN, 0); + analogWrite(CONTRASTPIN, 0); + StoreFrequency(); + radio.power(1); + break; + case LCD_OFF: + power = false; + analogWrite(SMETERPIN, 0); + analogWrite(CONTRASTPIN, 0); + StoreFrequency(); + break; + case LCD_BRIGHTNESS_1_PERCENT: + analogWrite(SMETERPIN, 0); + analogWrite(CONTRASTPIN, 1 * 2 + 27); + break; + case LCD_BRIGHTNESS_A_QUARTER: + analogWrite(SMETERPIN, 0); + analogWrite(CONTRASTPIN, MIN(ContrastSet, 25) * 2 + 27); + break; + case LCD_BRIGHTNESS_HALF: + analogWrite(SMETERPIN, 0); + analogWrite(CONTRASTPIN, MIN(ContrastSet, 50) * 2 + 27); + break; } - else { - power = true; - pinMode (STANDBYLED, OUTPUT); - digitalWrite(STANDBYLED, LOW); - analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); + } else { + switch (poweroptions) { + case DEEP_SLEEP: + ESP.restart(); + break; + case LCD_OFF: + power = true; + pinMode (STANDBYLED, OUTPUT); + digitalWrite(STANDBYLED, LOW); + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); + + screensavertriggered = false; + screensaver_IRQ = OFF; + ScreensaverTimerReopen(); + break; + case LCD_BRIGHTNESS_1_PERCENT: + case LCD_BRIGHTNESS_A_QUARTER: + case LCD_BRIGHTNESS_HALF: + pinMode (STANDBYLED, OUTPUT); + digitalWrite(STANDBYLED, LOW); + analogWrite(CONTRASTPIN, ContrastSet * 2 + 27); + + screensavertriggered = false; + screensaver_IRQ = OFF; + ScreensaverTimerReopen(); + break; } } } @@ -844,6 +922,11 @@ void BANDBUTTONPress() { while (digitalRead(BANDBUTTON) == LOW && counter - counterold <= 1000) counter = millis(); if (counter - counterold < 1000) { + if (screensavertriggered) { + WakeToSleep(REVERSE); + return; + } + if (advancedRDS) { BuildDisplay(); ScreensaverTimerReopen(); @@ -862,6 +945,11 @@ void BANDBUTTONPress() { ScreensaverTimerRestart(); } } else { + if (screensavertriggered) { + WakeToSleep(REVERSE); + return; + } + if (band == BAND_FM) { if (advancedRDS) BuildAFScreen(); else BuildAdvancedRDS(); } @@ -875,19 +963,9 @@ void BANDBUTTONPress() { while (digitalRead(BANDBUTTON) == LOW && counter - counterold <= 1000) counter = millis(); if (counter - counterold < 1000) { - if (screensavertriggered) { - screensavertriggered = !screensavertriggered; - screensaver_IRQ = OFF; - WakeToSleep(false); - ScreensaverTimerReopen(); - } + if (screensavertriggered) WakeToSleep(REVERSE); } else { - if (screensavertriggered) { - screensavertriggered = !screensavertriggered; - screensaver_IRQ = OFF; - WakeToSleep(false); - ScreensaverTimerReopen(); - } + if (screensavertriggered) WakeToSleep(REVERSE); } } } @@ -1357,6 +1435,7 @@ void doStereoToggle() { void ModeButtonPress() { if (advancedRDS) { BuildDisplay(); + ScreensaverTimerReopen(); } else { if (menu == false) { seek = false; @@ -1449,7 +1528,7 @@ void ModeButtonPress() { EEPROM.writeUInt(250, LowEdgeOIRTSet); EEPROM.writeUInt(254, HighEdgeOIRTSet); EEPROM.writeByte(258, colorinvert); - EEPROM.writeByte(259, deepsleep); + EEPROM.writeByte(259, poweroptions); EEPROM.writeByte(260, CurrentTheme); EEPROM.writeByte(261, fmminstepsize); EEPROM.writeByte(262, screensaverset); @@ -1938,7 +2017,7 @@ void ButtonPress() { if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); tft.drawCentreString(myLanguage[language][74], 155, 70, GFXFF); 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); + ShowPowerOptions(true); break; case 90: if (CurrentTheme == 7) tft.setTextColor(TFT_BLACK); else tft.setTextColor(TFT_WHITE); @@ -1952,7 +2031,7 @@ void ButtonPress() { 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); + if (!screensaverset) tft.drawRightString(myLanguage[language][30], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); break; } break; @@ -2347,10 +2426,11 @@ void KeyUp() { 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); - if (deepsleep) deepsleep = 0; else deepsleep = 1; + ShowPowerOptions(true); + poweroptions++; + if (poweroptions > RADIO_POWER_MODE_CNT - 1) poweroptions = 0; 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); + ShowPowerOptions(true); break; case 90: @@ -2364,12 +2444,12 @@ void KeyUp() { 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); + if (!screensaverset) tft.drawRightString(myLanguage[language][30], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); screensaverset ++; - if (screensaverset > 4) screensaverset = 0; + if (screensaverset > sizeof(screensaverOptions) / sizeof(screensaverOptions[0]) - 1) 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); + if (!screensaverset) tft.drawRightString(myLanguage[language][30], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); break; } @@ -2759,10 +2839,11 @@ void KeyDown() { 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); - if (deepsleep) deepsleep = 0; else deepsleep = 1; + ShowPowerOptions(true); + poweroptions--; + if (poweroptions > RADIO_POWER_MODE_CNT - 1) poweroptions = RADIO_POWER_MODE_CNT - 1; 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); + ShowPowerOptions(true); break; case 90: @@ -2776,12 +2857,12 @@ void KeyDown() { 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); + if (!screensaverset) tft.drawRightString(myLanguage[language][30], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); screensaverset --; - if (screensaverset > 4) screensaverset = 4; + if (screensaverset > sizeof(screensaverOptions) / sizeof(screensaverOptions[0]) - 1) screensaverset = sizeof(screensaverOptions) / sizeof(screensaverOptions[0]) - 1; 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); + if (!screensaverset) tft.drawRightString(myLanguage[language][30], 155, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 155, 110, GFXFF); break; } @@ -3366,7 +3447,6 @@ void showRadioText() { tft.drawLine(0, 239, 320, 239, FrameColor); } - void BuildMenu() { advancedRDS = false; tft.setFreeFont(FONT7); @@ -3474,9 +3554,9 @@ void BuildMenu() { 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); + ShowPowerOptions(false); 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); + if (!screensaverset) tft.drawRightString(myLanguage[language][30], 265, 110, GFXFF); else tft.drawRightString(String(screensaverOptions[screensaverset], DEC), 265, 110, GFXFF); break; } analogWrite(SMETERPIN, 0); @@ -3760,7 +3840,7 @@ void BuildDisplay() { tft.drawString("80", 110, 146, GFXFF); tft.drawString("100", 134, 146, GFXFF); tft.drawString("120", 164, 146, GFXFF); - tft.drawString(" % ", 196, 146, GFXFF); + tft.drawString("%", 196, 146, GFXFF); tft.setTextColor(ActiveColor); tft.setFreeFont(FONT14); tft.drawString("kHz", 225, -5, GFXFF); diff --git a/src/TEF6686.h b/src/TEF6686.h index 6ccb237..e70ca2b 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -19,6 +19,10 @@ 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 +}; + static const char* const PTY_EU[] { "None", "News", diff --git a/src/constants.h b/src/constants.h index f9a541a..5ce2c49 100644 --- a/src/constants.h +++ b/src/constants.h @@ -1,5 +1,12 @@ #define ON 1 #define OFF 0 +#define REVERSE false + +#define MAX(x, y) ((x) < (y) ? (y) : (x)) +#define MIN(X, Y) ({\ + typeof (X) x_ = (X);\ + typeof (Y) y_ = (Y);\ + (x_ < y_) ? x_ : y_; }) #define TIMER_OFFSET_TIMER (TIMER_500_TICK) #define TIMER_BW_TIMER (TIMER_500_TICK) diff --git a/src/language.h b/src/language.h index 13c1d72..55d6e14 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[13][94] = { +static const char* const myLanguage[13][97] = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -94,7 +94,10 @@ static const char* const myLanguage[13][94] = { "FM default stepsize", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Nederlands", // Dutch @@ -190,7 +193,10 @@ static const char* const myLanguage[13][94] = { "FM stapgrootte", // 90 "Schermbeveiliging", // 91 "sec.", // 92 - "DRUK OP BAND OM AF TE SLUITEN" // 93 + "DRUK OP BAND OM AF TE SLUITEN", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Polski", // Polish @@ -286,7 +292,10 @@ static const char* const myLanguage[13][94] = { "Minimalny krok FM", // 90 "Wygaszacz ekranu", // 91 "Sek", // 92 - "NACISNIJ BAND ABY ZAMKNAC" // 93 + "NACISNIJ BAND ABY ZAMKNAC", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Hrvatski", // Croatian @@ -382,7 +391,10 @@ static const char* const myLanguage[13][94] = { "FM min stepsize", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Ελληνικά", // Greek @@ -478,7 +490,10 @@ static const char* const myLanguage[13][94] = { "Μέγεθος βήματος FM", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Romana", // Romanian @@ -574,7 +589,10 @@ static const char* const myLanguage[13][94] = { "FM min stepsize", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Deutsch", // German @@ -670,7 +688,10 @@ static const char* const myLanguage[13][94] = { "FM min stepsize", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Czech", // Czech @@ -766,7 +787,10 @@ static const char* const myLanguage[13][94] = { "FM min stepsize", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Slovak", // Slovak @@ -862,7 +886,10 @@ static const char* const myLanguage[13][94] = { "FM min stepsize", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "France", // French @@ -958,7 +985,10 @@ static const char* const myLanguage[13][94] = { "Valeur du pas FM par défaut", // 90 "Screensaver", // 91 "Sec", // 92 - "PRESS BAND TO CLOSE" // 93 + "PRESS BAND TO CLOSE", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Български", // Bulgarian @@ -1054,7 +1084,10 @@ static const char* const myLanguage[13][94] = { "Размер на стъпката на FM", // 90 "Авт. заспиване", // 91 "сек.", // 92 - "НАТИСНЕТЕ BAND ЗА ИЗХОД" // 93 + "НАТИСНЕТЕ BAND ЗА ИЗХОД", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Русский", // Russian @@ -1150,7 +1183,10 @@ static const char* const myLanguage[13][94] = { "Шаг FM по умолчанию", // 90 "Экран выкл. через", // 91 "сек", // 92 - "НАЖМИТЕ BAND ДЛЯ ЗАКРЫТИЯ" // 93 + "НАЖМИТЕ BAND ДЛЯ ЗАКРЫТИЯ", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 }, { "Українська", // Ukranian @@ -1246,7 +1282,10 @@ static const char* const myLanguage[13][94] = { "FM кроки за замовчуванням", // 90 "Заставка", // 91 "с", // 92 - "НАТИСНІТЬ BAND ДЛЯ ЗАКРИТТЯ" // 93 + "НАТИСНІТЬ BAND ДЛЯ ЗАКРИТТЯ", // 93 + "1% brightness", // 94 + "25% brightness", // 95 + "50% brightness" // 96 } };