refactoring eink devices behaviour

This commit is contained in:
Florent committed 2026-10-21 14:08:56 -04:00
1 parent 428a95c643
commit a31e2c92df
17 files changed
+71 -25

No files matched your search

+32 -12
View File
@@ -197,11 +197,10 @@ class HomeScreen : public UIScreen {
sensors_nb ++;
}
sensors_scroll = sensors_nb > UI_RECENT_LIST_SIZE;
#if AUTO_OFF_MILLIS > 0
next_sensors_refresh = millis() + 5000; // refresh sensor values every 5 sec
#else
next_sensors_refresh = millis() + 60000; // refresh sensor values every 1 min
#endif
if (display.isEink()) // preserve eink displays
next_sensors_refresh = millis() + 60000; // refresh sensor values every 1 min
else
next_sensors_refresh = millis() + 5000; // refresh sensor values every 5 sec
}
}
@@ -703,11 +702,7 @@ public:
display.translateUTF8ToBlocks(filtered_msg, p->msg, sizeof(filtered_msg));
display.printWordWrap(filtered_msg, display.width());
#if AUTO_OFF_MILLIS==0 // probably e-ink
return 10000; // 10 s
#else
return 1000; // next render after 1000 ms
#endif
return display.isEink() ? 10000 : 1000; // 10 s for eink
}
bool handleInput(char c) override {
@@ -739,6 +734,9 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
#if defined(PIN_USER_BTN_ANA)
analog_btn.begin();
#endif
#if defined(BACKLIGHT_BTN)
backlight_btn.begin();
#endif
_node_prefs = node_prefs;
@@ -1002,13 +1000,30 @@ void UITask::loop() {
#endif
#if defined(BACKLIGHT_BTN)
if (millis() > next_backlight_btn_check) {
bool touch_state = digitalRead(PIN_BUTTON2);
if (backlight_btn.isPressed()) {
if (!_display->isOn()) {
_display->turnOn();
_next_refresh = 0;
}
_auto_off = millis() + AUTO_OFF_MILLIS; // extend auto-off timer
backlight_btn_pressed_at = millis(); // still pressed
}
bool touch_state = (millis() - backlight_btn_pressed_at > 5000);
// Backlight button events
int bev = backlight_btn.check();
if (bev == BUTTON_EVENT_DOUBLE_CLICK) {
_display->forceFullRefresh();
} else if (bev == BUTTON_EVENT_TRIPLE_CLICK) {
_display->blankScreen();
_display->turnOff();
backlight_btn_pressed_at = 0;
}
#if defined(DISP_BACKLIGHT)
digitalWrite(DISP_BACKLIGHT, !touch_state);
#elif defined(EXP_PIN_BACKLIGHT)
expander.digitalWrite(EXP_PIN_BACKLIGHT, !touch_state);
#endif
next_backlight_btn_check = millis() + 300;
next_backlight_btn_check = millis() + 100;
}
#endif
@@ -1056,6 +1071,11 @@ void UITask::loop() {
}
#endif
if (millis() > _auto_off) {
#ifdef EINK_SCREENOFF_BLANK
if (curr != msg_preview) { // don't blank if messages are waiting
display.blankScreen();
}
#endif
_display->turnOff();
}
#endif
+2 -1
View File
@@ -61,7 +61,8 @@ class UITask : public AbstractUITask {
unsigned long _alert_expiry;
int _msgcount;
unsigned long ui_started_at, next_batt_chck;
int next_backlight_btn_check = 0;
unsigned long next_backlight_btn_check = 0;
unsigned long backlight_btn_pressed_at = 0;
#ifdef PIN_STATUS_LED
int led_state = 0;
int next_led_change = 0;
+1
View File
@@ -27,6 +27,7 @@ public:
virtual void turnOn() = 0;
virtual void turnOff() = 0;
virtual void clear() = 0;
virtual void blankScreen() {} // to cleanly erase screen before turning off
virtual void startFrame(ColorVal bkg = UIColor::window_bkg) = 0;
virtual void setTextSize(int sz) = 0;
virtual void setColor(ColorVal c) = 0;
+5 -1
View File
@@ -82,13 +82,17 @@ void GxEPDDisplay::turnOff() {
expander.digitalWrite(EXP_PIN_BACKLIGHT, LOW);
#endif
_isOn = false;
last_display_crc_value=0;
display.hibernate();
}
void GxEPDDisplay::blankScreen() {
// do full refresh before powering off to clear screen
// no full refresh needed at wakeup
display.clearScreen(0xFF); // Clears microcontroller side RAM
display.writeScreenBuffer(0xFF); // Forces 0xFF (White) into the display controller's history registers
resetPartialRefreshCounter();
last_display_crc_value=0;
display.hibernate();
}
void GxEPDDisplay::clear() {
+1
View File
@@ -61,6 +61,7 @@ public:
void turnOn() override;
void turnOff() override;
void clear() override;
void blankScreen() override;
void startFrame(ColorVal bkg = UIColor::window_bkg) override;
void setTextSize(int sz) override;
void setColor(ColorVal c) override;
+5 -3
View File
@@ -32,8 +32,12 @@ build_flags = ${nrf52_base.build_flags}
-D PIN_GPS_RESET_ACTIVE=LOW
-D TELEM_BME280_ADDRESS=0x77
-D DISPLAY_CLASS=GxEPDDisplay
-D EINK_SCREENOFF_BLANK
-D UI_RECENT_LIST_SIZE=9
-D UI_MSG_PREVIEW_SIZE=165
-D EINK_MAX_PARTIAL_REFRESH=60
-D AUTO_OFF_MILLIS=1800000
-D BACKLIGHT_BTN=PIN_BUTTON2
-D AUTO_OFF_MILLIS=0
build_src_filter = ${nrf52_base.build_src_filter}
+<helpers/*.cpp>
+<TechoBoard.cpp>
@@ -91,7 +95,6 @@ build_flags =
-D BLE_PIN_CODE=123456
; -D BLE_DEBUG_LOGGING=1
-D OFFLINE_QUEUE_SIZE=256
-D UI_RECENT_LIST_SIZE=9
-D UI_SENSORS_PAGE=1
-D UI_GPS_PAGE=1
; -D MESH_PACKET_LOGGING=1
@@ -116,7 +119,6 @@ build_flags =
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D OFFLINE_QUEUE_SIZE=256
-D UI_RECENT_LIST_SIZE=9
-D UI_SENSORS_PAGE=1
-D AUTO_SHUTDOWN_MILLIVOLTS=3300
-D QSPIFLASH=1
+1
View File
@@ -23,6 +23,7 @@ EnvironmentSensorManager sensors = EnvironmentSensorManager();
#ifdef DISPLAY_CLASS
DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
MomentaryButton backlight_btn(BACKLIGHT_BTN, 1000, true);
#endif
bool radio_init() {
+1
View File
@@ -22,6 +22,7 @@ extern EnvironmentSensorManager sensors;
#ifdef DISPLAY_CLASS
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;
extern MomentaryButton backlight_btn;
#endif
bool radio_init();
+7
View File
@@ -24,6 +24,13 @@ build_flags = ${nrf52_base.build_flags}
-D SX126X_RX_BOOSTED_GAIN=1
-D LORA_TX_POWER=22
-D P_LORA_TX_LED=13
-D UI_RECENT_LIST_SIZE=9
-D UI_MSG_PREVIEW_SIZE=165
-D EINK_MAX_PARTIAL_REFRESH=60
-D BACKLIGHT_BTN=PIN_BUTTON2
-D AUTO_OFF_MILLIS=1800000
-D UI_NO_HIBERNATE
-D DISABLE_DIAGNOSTIC_OUTPUT
build_src_filter = ${nrf52_base.build_src_filter}
+<helpers/*.cpp>
+<ThinkNodeM1Board.cpp>
+1
View File
@@ -17,6 +17,7 @@ ThinkNodeM1SensorManager sensors = ThinkNodeM1SensorManager(nmea);
#ifdef DISPLAY_CLASS
DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
MomentaryButton backlight_btn(BACKLIGHT_BTN, 1000, true);
#endif
bool radio_init() {
+1
View File
@@ -40,6 +40,7 @@ extern ThinkNodeM1SensorManager sensors;
#ifdef DISPLAY_CLASS
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;
extern MomentaryButton backlight_btn;
#endif
bool radio_init();
+5 -2
View File
@@ -26,8 +26,12 @@ build_flags = ${esp32_base.build_flags}
-D EINK_SCALE_Y=1.5625f
-D EINK_X_OFFSET=0
-D EINK_Y_OFFSET=10
-D UI_RECENT_LIST_SIZE=9
-D UI_MSG_PREVIEW_SIZE=165
-D EINK_MAX_PARTIAL_REFRESH=60
-D BACKLIGHT_BTN=PIN_BUTTON2
-D AUTO_OFF_MILLIS=0
-D AUTO_OFF_MILLIS=1800000
-D UI_NO_HIBERNATE
-D DISABLE_DIAGNOSTIC_OUTPUT
-D SX126X_DIO2_AS_RF_SWITCH=true
-D SX126X_DIO3_TCXO_VOLTAGE=3.3
@@ -150,7 +154,6 @@ build_flags =
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456
-D OFFLINE_QUEUE_SIZE=256
-D UI_RECENT_LIST_SIZE=9
; -D BLE_DEBUG_LOGGING=1
; -D MESH_PACKET_LOGGING=1
; -D GPS_NMEA_DEBUG
+1
View File
@@ -26,6 +26,7 @@ EnvironmentSensorManager sensors = EnvironmentSensorManager();
#ifdef DISPLAY_CLASS
DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
MomentaryButton backlight_btn(BACKLIGHT_BTN, 1000, true);
#endif
bool radio_init() {
+1
View File
@@ -24,6 +24,7 @@ extern PCA9557 expander;
#ifdef DISPLAY_CLASS
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;
extern MomentaryButton backlight_btn;
#endif
bool radio_init();
+5 -6
View File
@@ -18,12 +18,16 @@ build_flags = ${nrf52_base.build_flags}
-D P_LORA_SCLK=19
-D P_LORA_MISO=22
-D P_LORA_MOSI=20
-D UI_SHOW_CLOCK=1
-D DISPLAY_ROTATION=4
-D UI_HAS_ROTARY_INPUT=1
-D UI_HAS_NAV_INPUT=1
-D UI_RECENT_LIST_SIZE=9
-D UI_MSG_PREVIEW_SIZE=165
-D EINK_MAX_PARTIAL_REFRESH=60
-D AUTO_OFF_MILLIS=1800000
-D BACKLIGHT_BTN=PIN_BUTTON2
-D UI_SHOW_CLOCK=1
-D EINK_SCREENOFF_BLANK
-D EINK_DISPLAY_MODEL=GxEPD2_154_D67
; -D EINK_DISPLAY_MODEL=GxEPD2_154_GDEY0154D67
; -D EINK_DISPLAY_MODEL=GxEPD2_150_BN
@@ -92,10 +96,7 @@ build_flags =
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456
# -D BLE_DEBUG_LOGGING=1
-D DISPLAY_ROTATION=4
-D DISPLAY_CLASS=GxEPDDisplay
-D BACKLIGHT_BTN=PIN_BUTTON2
-D AUTO_OFF_MILLIS=0
-D OFFLINE_QUEUE_SIZE=256
-D PIN_BUZZER=33
-D AUTO_SHUTDOWN_MILLIVOLTS=3300
@@ -133,8 +134,6 @@ build_flags =
-D DISPLAY_ROTATION=4
-D QSPIFLASH=1
-D DISPLAY_CLASS=GxEPDDisplay
-D BACKLIGHT_BTN=PIN_BUTTON2
-D AUTO_OFF_MILLIS=0
-D OFFLINE_QUEUE_SIZE=256
-D PIN_BUZZER=6
-D AUTO_SHUTDOWN_MILLIVOLTS=3300
+1
View File
@@ -23,6 +23,7 @@ EnvironmentSensorManager sensors = EnvironmentSensorManager();
DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
RotaryInputGPIO rotary_input(PIN_BUTTON1_A, PIN_BUTTON1_B);
MomentaryButton backlight_btn(BACKLIGHT_BTN, 1000, true);
#endif
bool radio_init() {
+1
View File
@@ -23,6 +23,7 @@ extern EnvironmentSensorManager sensors;
#ifdef DISPLAY_CLASS
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;
extern MomentaryButton backlight_btn;
extern RotaryInputGPIO rotary_input;
#endif