From 1c4436186089d031dfa98df18403026c19c9be11 Mon Sep 17 00:00:00 2001 From: ViezeVingertjes Date: Fri, 19 Dec 2025 08:07:42 +0100 Subject: [PATCH] Add T-Echo hibernation with e-ink clear and peripheral shutdown --- examples/companion_radio/ui-new/UITask.cpp | 6 ++++++ src/helpers/ui/GxEPDDisplay.cpp | 8 +++++++ src/helpers/ui/GxEPDDisplay.h | 1 + variants/lilygo_techo/TechoBoard.h | 25 ++++++++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 29cc59d33..fbdc99b16 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -688,7 +688,13 @@ void UITask::shutdown(bool restart){ if (restart) { _board->reboot(); } else { + delay(2000); + #ifdef DISPLAY_CLASS + extern DISPLAY_CLASS display; + display.hibernate(); + #else _display->turnOff(); + #endif radio_driver.powerOff(); _board->powerOff(); } diff --git a/src/helpers/ui/GxEPDDisplay.cpp b/src/helpers/ui/GxEPDDisplay.cpp index ad47754bf..a33631554 100644 --- a/src/helpers/ui/GxEPDDisplay.cpp +++ b/src/helpers/ui/GxEPDDisplay.cpp @@ -55,6 +55,14 @@ void GxEPDDisplay::turnOff() { _isOn = false; } +void GxEPDDisplay::hibernate() { + display.fillScreen(GxEPD_BLACK); + display.display(false); + display.fillScreen(GxEPD_WHITE); + display.display(false); + display.hibernate(); +} + void GxEPDDisplay::clear() { display.fillScreen(GxEPD_WHITE); display.setTextColor(GxEPD_BLACK); diff --git a/src/helpers/ui/GxEPDDisplay.h b/src/helpers/ui/GxEPDDisplay.h index 1a04cc246..246a1ff4f 100644 --- a/src/helpers/ui/GxEPDDisplay.h +++ b/src/helpers/ui/GxEPDDisplay.h @@ -49,6 +49,7 @@ class GxEPDDisplay : public DisplayDriver { bool isOn() override {return _isOn;}; void turnOn() override; void turnOff() override; + void hibernate(); void clear() override; void startFrame(Color bkg = DARK) override; void setTextSize(int sz) override; diff --git a/variants/lilygo_techo/TechoBoard.h b/variants/lilygo_techo/TechoBoard.h index c9bdc229b..f6f3b94e6 100644 --- a/variants/lilygo_techo/TechoBoard.h +++ b/variants/lilygo_techo/TechoBoard.h @@ -2,6 +2,7 @@ #include #include +#include #include // built-ins @@ -26,18 +27,42 @@ class TechoBoard : public NRF52BoardOTA { void powerOff() override { #ifdef LED_RED digitalWrite(LED_RED, HIGH); + pinMode(LED_RED, INPUT_PULLUP); #endif #ifdef LED_GREEN digitalWrite(LED_GREEN, HIGH); + pinMode(LED_GREEN, INPUT_PULLUP); #endif #ifdef LED_BLUE digitalWrite(LED_BLUE, HIGH); + pinMode(LED_BLUE, INPUT_PULLUP); #endif #ifdef DISP_BACKLIGHT digitalWrite(DISP_BACKLIGHT, LOW); + pinMode(DISP_BACKLIGHT, INPUT_PULLDOWN); + #endif + #ifdef GPS_EN + digitalWrite(GPS_EN, LOW); + pinMode(GPS_EN, INPUT_PULLDOWN); + #endif + #ifdef PIN_GPS_RESET + digitalWrite(PIN_GPS_RESET, LOW); + pinMode(PIN_GPS_RESET, INPUT_PULLDOWN); + #endif + Wire.end(); + #ifdef PIN_WIRE_SDA + pinMode(PIN_WIRE_SDA, INPUT_PULLUP); + #endif + #ifdef PIN_WIRE_SCL + pinMode(PIN_WIRE_SCL, INPUT_PULLUP); + #endif + #ifdef SX126X_POWER_EN + digitalWrite(SX126X_POWER_EN, LOW); + pinMode(SX126X_POWER_EN, INPUT); #endif #ifdef PIN_PWR_EN digitalWrite(PIN_PWR_EN, LOW); + pinMode(PIN_PWR_EN, INPUT); #endif sd_power_system_off(); }