From 4e627d6e6b0be435af0eae72c782d963ae65e906 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Wed, 15 Jan 2025 21:19:58 +0100 Subject: [PATCH] Implemented backlight control and display blanking for T-Echo --- Display.h | 67 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/Display.h b/Display.h index 17d4ac6..c79e239 100644 --- a/Display.h +++ b/Display.h @@ -75,7 +75,7 @@ #define SCL_OLED 17 #define SDA_OLED 18 #elif BOARD_MODEL == BOARD_TECHO - SPIClass displaySPI = SPIClass(NRF_SPIM0, pin_disp_miso, pin_disp_sck, pin_disp_mosi); + SPIClass displaySPI = SPIClass(NRF_SPIM3, pin_disp_miso, pin_disp_sck, pin_disp_mosi); #define DISP_W 128 #define DISP_H 64 #define DISP_ADDR -1 @@ -200,7 +200,10 @@ uint8_t display_contrast = 0x00; #elif BOARD_MODEL == BOARD_HELTEC_T114 void set_contrast(ST7789Spi *display, uint8_t value) { } #elif BOARD_MODEL == BOARD_TECHO - void set_contrast(uint8_t value) { } + void set_contrast(void *display, uint8_t value) { + if (value == 0) { digitalWrite(pin_backlight, LOW); } + else { analogWrite(pin_backlight, value); } + } #elif BOARD_MODEL == BOARD_TDECK void set_contrast(Adafruit_ST7789 *display, uint8_t value) { static uint8_t level = 0; @@ -267,10 +270,11 @@ bool display_init() { digitalWrite(PIN_T114_TFT_EN, LOW); #elif BOARD_MODEL == BOARD_TECHO display.init(0, true, 10, false, displaySPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); + display.setPartialWindow(0, 0, DISP_W, DISP_H); display.epd2.setBusyCallback(busyCallback); #if HAS_BACKLIGHT - pinMode(pin_backlight, INPUT_PULLUP); - digitalWrite(pin_backlight, HIGH); + pinMode(pin_backlight, OUTPUT); + digitalWrite(pin_backlight, LOW); #endif #elif BOARD_MODEL == BOARD_TBEAM_S_V1 Wire.begin(SDA_OLED, SCL_OLED); @@ -285,9 +289,9 @@ bool display_init() { #if DISP_CUSTOM_ADDR == true #if HAS_EEPROM - uint8_t display_address = EEPROM.read(eeprom_addr(ADDR_CONF_DADR)); + uint8_t display_address = EEPROM.read(eeprom_addr(ADDR_CONF_DADR)); #elif MCU_VARIANT == MCU_NRF52 - uint8_t display_address = eeprom_read(eeprom_addr(ADDR_CONF_DADR)); + uint8_t display_address = eeprom_read(eeprom_addr(ADDR_CONF_DADR)); #endif if (display_address == 0xFF) display_address = DISP_ADDR; #else @@ -304,6 +308,16 @@ bool display_init() { display_blanking_timeout = db_timeout*1000; } } + #elif MCU_VARIANT == MCU_NRF52 + if (eeprom_read(eeprom_addr(ADDR_CONF_BSET)) == CONF_OK_BYTE) { + uint8_t db_timeout = eeprom_read(eeprom_addr(ADDR_CONF_DBLK)); + if (db_timeout == 0x00) { + display_blanking_enabled = false; + } else { + display_blanking_enabled = true; + display_blanking_timeout = db_timeout*1000; + } + } #endif #if BOARD_MODEL == BOARD_TECHO @@ -324,9 +338,7 @@ bool display_init() { #endif return false; } else { - #if BOARD_MODEL != BOARD_TECHO - set_contrast(&display, display_contrast); - #endif + set_contrast(&display, display_contrast); if (display_rotation != 0xFF) { if (display_rotation == 0 || display_rotation == 2) { disp_mode = DISP_MODE_LANDSCAPE; @@ -381,9 +393,6 @@ bool display_init() { } update_area_positions(); - #if BOARD_MODEL == BOARD_TECHO - display.setPartialWindow(p_ad_x, p_ad_y, 64, 128); - #endif for (int i = 0; i < WATERFALL_SIZE; i++) { waterfall[i] = 0; } @@ -397,10 +406,16 @@ bool display_init() { #endif #if HAS_EEPROM - #if MCU_VARIANT != MCU_NRF52 - display_intensity = EEPROM.read(eeprom_addr(ADDR_CONF_DINT)); - #else - display_intensity = eeprom_read(eeprom_addr(ADDR_CONF_DINT)); + display_intensity = EEPROM.read(eeprom_addr(ADDR_CONF_DINT)); + #elif MCU_VARIANT == MCU_NRF52 + display_intensity = eeprom_read(eeprom_addr(ADDR_CONF_DINT)); + #endif + display_unblank_intensity = display_intensity; + + #if BOARD_MODEL == BOARD_TECHO + #if HAS_BACKLIGHT + if (display_intensity == 0) { digitalWrite(pin_backlight, LOW); } + else { analogWrite(pin_backlight, display_intensity); } #endif #endif @@ -889,6 +904,7 @@ void display_recondition() { #endif } +bool epd_blanked = false; void update_display(bool blank = false) { display_updating = true; if (blank == true) { @@ -914,14 +930,16 @@ void update_display(bool blank = false) { if (millis()-last_disp_update >= disp_update_interval) { if (display_contrast != display_intensity) { display_contrast = display_intensity; - #if BOARD_MODEL != BOARD_TECHO - set_contrast(&display, display_contrast); - #endif + set_contrast(&display, display_contrast); } #if BOARD_MODEL == BOARD_TECHO - display.setFullWindow(); - display.fillScreen(SSD1306_WHITE); + if (!epd_blanked) { + display.setFullWindow(); + display.fillScreen(SSD1306_WHITE); + display.display(true); + epd_blanked = true; + } #endif #if BOARD_MODEL == BOARD_HELTEC_T114 @@ -942,9 +960,7 @@ void update_display(bool blank = false) { uint32_t current = millis(); if (display_contrast != display_intensity) { display_contrast = display_intensity; - #if BOARD_MODEL != BOARD_TECHO - set_contrast(&display, display_contrast); - #endif + set_contrast(&display, display_contrast); } #if BOARD_MODEL == BOARD_HELTEC_T114 @@ -959,7 +975,7 @@ void update_display(bool blank = false) { display_recondition(); } else { #if BOARD_MODEL == BOARD_TECHO - display.setPartialWindow(p_ad_x, p_ad_y, 64, 128); + display.setFullWindow(); display.fillScreen(SSD1306_WHITE); #endif @@ -972,6 +988,7 @@ void update_display(bool blank = false) { if (current-last_epd_full_refresh >= REFRESH_PERIOD) { display.display(false); last_epd_full_refresh = millis(); } else { display.display(true); } last_epd_refresh = millis(); + epd_blanked = false; } #elif BOARD_MODEL != BOARD_TDECK display.display();