From 649cfd901bfa4337402f5be36e31eb03283586ff Mon Sep 17 00:00:00 2001 From: Jeff Lehman Date: Wed, 8 Mar 2023 16:12:14 -0600 Subject: [PATCH] Add OLED 'pages' and blank OLED screen --- examples/0_MQTT_Gateway/fdrs_gateway_config.h | 1 + examples/1_UART_Gateway/fdrs_gateway_config.h | 1 + .../2_ESPNOW_Repeater/fdrs_gateway_config.h | 1 + .../3_LoRa_Repeater/fdrs_gateway_config.h | 1 + .../fdrs_gateway_config.h | 1 + src/fdrs_gateway.h | 3 + src/fdrs_oled.h | 97 ++++++++++++++++--- 7 files changed, 93 insertions(+), 12 deletions(-) diff --git a/examples/0_MQTT_Gateway/fdrs_gateway_config.h b/examples/0_MQTT_Gateway/fdrs_gateway_config.h index 6a6c8e4..120bf86 100644 --- a/examples/0_MQTT_Gateway/fdrs_gateway_config.h +++ b/examples/0_MQTT_Gateway/fdrs_gateway_config.h @@ -46,6 +46,7 @@ // OLED -- Displays console debugging messages on an SSD1306 I²C OLED ///#define USE_OLED #define OLED_HEADER "FDRS" +#define OLED_PAGE_SECS 30 #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 diff --git a/examples/1_UART_Gateway/fdrs_gateway_config.h b/examples/1_UART_Gateway/fdrs_gateway_config.h index b27c7c8..7128ea2 100644 --- a/examples/1_UART_Gateway/fdrs_gateway_config.h +++ b/examples/1_UART_Gateway/fdrs_gateway_config.h @@ -46,6 +46,7 @@ // OLED -- Displays console debugging messages on an SSD1306 I²C OLED ///#define USE_OLED #define OLED_HEADER "FDRS" +#define OLED_PAGE_SECS 30 #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 diff --git a/examples/2_ESPNOW_Repeater/fdrs_gateway_config.h b/examples/2_ESPNOW_Repeater/fdrs_gateway_config.h index c265ea3..f9f1659 100644 --- a/examples/2_ESPNOW_Repeater/fdrs_gateway_config.h +++ b/examples/2_ESPNOW_Repeater/fdrs_gateway_config.h @@ -46,6 +46,7 @@ // OLED -- Displays console debugging messages on an SSD1306 I²C OLED ///#define USE_OLED #define OLED_HEADER "FDRS" +#define OLED_PAGE_SECS 30 #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 diff --git a/examples/3_LoRa_Repeater/fdrs_gateway_config.h b/examples/3_LoRa_Repeater/fdrs_gateway_config.h index 2b330d8..b5bfe62 100644 --- a/examples/3_LoRa_Repeater/fdrs_gateway_config.h +++ b/examples/3_LoRa_Repeater/fdrs_gateway_config.h @@ -46,6 +46,7 @@ // OLED -- Displays console debugging messages on an SSD1306 I²C OLED ///#define USE_OLED #define OLED_HEADER "FDRS" +#define OLED_PAGE_SECS 30 #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 diff --git a/examples/Gateway_Examples/1_MQTT_Gateway_Ethernet/fdrs_gateway_config.h b/examples/Gateway_Examples/1_MQTT_Gateway_Ethernet/fdrs_gateway_config.h index 28f6dec..edd9f94 100644 --- a/examples/Gateway_Examples/1_MQTT_Gateway_Ethernet/fdrs_gateway_config.h +++ b/examples/Gateway_Examples/1_MQTT_Gateway_Ethernet/fdrs_gateway_config.h @@ -46,6 +46,7 @@ // OLED -- Displays console debugging messages on an SSD1306 I²C OLED ///#define USE_OLED #define OLED_HEADER "FDRS" +#define OLED_PAGE_SECS 30 #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 diff --git a/src/fdrs_gateway.h b/src/fdrs_gateway.h index 32239f6..e208891 100644 --- a/src/fdrs_gateway.h +++ b/src/fdrs_gateway.h @@ -178,6 +178,9 @@ void loopFDRS() #endif #ifdef USE_WIFI handleMQTT(); +#endif +#ifdef USE_OLED + drawPageOLED(true); #endif if (newData != event_clear) { diff --git a/src/fdrs_oled.h b/src/fdrs_oled.h index 008c3c1..bd34b01 100644 --- a/src/fdrs_oled.h +++ b/src/fdrs_oled.h @@ -1,9 +1,12 @@ #include +#define DISPLAY_PAGES 4 String debug_buffer[5] = {"", "", "", "", ""}; SSD1306Wire display(0x3c, OLED_SDA, OLED_SCL); // ADDRESS, SDA, SCL +unsigned long displayEvent = 0; +uint8_t displayPage = 0; void draw_OLED_header() { @@ -33,13 +36,28 @@ void draw_OLED_header() display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_10); #endif + display.drawHorizontalLine(0, 15, 128); + display.drawHorizontalLine(0, 16, 128); +} + +void drawDebugPage() { + draw_OLED_header(); + uint8_t lineNumber = 0; + for (uint8_t i = 0; i < 5; i++) + { + uint8_t ret = display.FDRS_drawStringMaxWidth(0, 17 + (lineNumber * 9), 127, debug_buffer[i]); + lineNumber = ret + lineNumber; + if (lineNumber > 5) + break; + } + display.display(); } void debug_OLED(String debug_text) { - draw_OLED_header(); - display.drawHorizontalLine(0, 15, 128); - display.drawHorizontalLine(0, 16, 128); + displayEvent = millis()/1000; // Display Event is tracked in units of seconds + displayPage = 0; + display.clear(); for (uint8_t i = 4; i > 0; i--) { @@ -47,16 +65,73 @@ void debug_OLED(String debug_text) debug_buffer[i] = debug_buffer[i - 1]; } debug_buffer[0] = String(millis() / 1000) + " " + debug_text; - uint8_t lineNumber = 0; - for (uint8_t i = 0; i < 5; i++) - { - uint8_t ret = display.FDRS_drawStringMaxWidth(0, 17 + (lineNumber * 9), 127, debug_buffer[i]); - lineNumber = ret + lineNumber; - if (lineNumber > 5) + drawDebugPage(); +} + +void drawBlankPage() { + display.clear(); + display.display(); +} + +void drawStatusPage() { + // draw_OLED_header(); + // display.FDRS_drawStringMaxWidth(0, 17, 127, "Status Page 1 " + String(millis()/1000)); + // display.display(); +} + +void drawPage2() { + // draw_OLED_header(); + // display.FDRS_drawStringMaxWidth(0, 17, 127, "Page 2 " + String(millis()/1000)); + // display.display(); +} + +void drawPage3() { + // draw_OLED_header(); + // display.FDRS_drawStringMaxWidth(0, 17, 127, "Page 3 " + String(millis()/1000)); + // display.display(); +} + +// write display content to display buffer +// nextpage = true -> flip 1 page +// When debug info comes in then switch to debug page +// after 60 seconds switch to blank page to save screen +void drawPageOLED(bool nextpage) { + + if((millis()/1000 - displayEvent) > OLED_PAGE_SECS && nextpage) { + displayPage = (displayPage >= DISPLAY_PAGES) ? 0 : (displayPage + 1); + displayEvent = millis()/1000; + display.clear(); + + switch(displayPage) { + + // page 0: debug output + // page 1: gateway/node status + // page 2: to be defined + // page 3: to be defined + // page 4: blank (screen saver) + + case 0: // display debug output + drawDebugPage(); + break; + case 1: // gateway/node status + // drawStatusPage(); + // break; + case 2: // to be defined later + // drawPage2(); + // break; + case 3: // to be defined later + // drawPage3(); + // break; + case 4: // Blank page + drawBlankPage(); break; + default: // Blank page + drawBlankPage(); + break; + } } - display.display(); } + void init_oled(){ pinMode(OLED_RST, OUTPUT); digitalWrite(OLED_RST, LOW); @@ -66,6 +141,4 @@ void init_oled(){ display.init(); display.flipScreenVertically(); draw_OLED_header(); - - } \ No newline at end of file