]> git.tnoah.ca Git - lora-radio.git/commitdiff
Updated display driver
authorMark Qvist <mark@unsigned.io>
Tue, 1 Nov 2022 20:10:43 +0000 (21:10 +0100)
committerMark Qvist <mark@unsigned.io>
Tue, 1 Nov 2022 20:10:43 +0000 (21:10 +0100)
Display.h
Graphics.h

index 2ef122ddc234d4ba4e46e6536706e533de7ed241..7cc9fecc38d9b73c7607b80e4c666d7ddca0a285 100644 (file)
--- a/Display.h
+++ b/Display.h
@@ -33,7 +33,9 @@ uint32_t last_disp_update = 0;
 uint8_t disp_target_fps = 7;
 int disp_update_interval = 1000/disp_target_fps;
 uint32_t last_page_flip = 0;
-int page_interval = 5000;
+int page_interval = 4000;
+bool device_signatures_ok();
+bool device_firmware_ok();
 
 #define WATERFALL_SIZE 46
 int waterfall[WATERFALL_SIZE];
@@ -61,6 +63,12 @@ void update_area_positions() {
   }
 }
 
+uint8_t display_contrast = 0x00;
+void set_contrast(Adafruit_SSD1306 *display, uint8_t contrast) {
+    display->ssd1306_command(SSD1306_SETCONTRAST);
+    display->ssd1306_command(contrast);
+}
+
 bool display_init() {
   #if HAS_DISPLAY
     #if BOARD_MODEL == BOARD_RNODE_NG_20 || BOARD_MODEL == BOARD_LORA32_V2_0
@@ -75,6 +83,7 @@ bool display_init() {
     if(!display.begin(SSD1306_SWITCHCAPVCC, DISP_ADDR)) {
       return false;
     } else {
+      set_contrast(&display, display_contrast);
       #if BOARD_MODEL == BOARD_RNODE_NG_20
         disp_mode = DISP_MODE_PORTRAIT;
         display.setRotation(3);
@@ -271,15 +280,19 @@ void update_stat_area() {
   }
 }
 
-#define START_PAGE 1
-const uint8_t pages = 2;
+#define START_PAGE 0
+const uint8_t pages = 3;
 uint8_t disp_page = START_PAGE;
 void draw_disp_area() {
   if (!disp_ext_fb or bt_ssp_pin != 0) {
     disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
     
-    if (!hw_ready || radio_error) {
-      disp_area.drawBitmap(0, 37, bm_hwfail, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+    if (!hw_ready || radio_error || !device_firmware_ok()) {
+      if (!device_firmware_ok()) {
+        disp_area.drawBitmap(0, 37, bm_fw_corrupt, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+      } else {
+        disp_area.drawBitmap(0, 37, bm_hwfail, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+      }
     } else if (bt_state == BT_STATE_PAIRING and bt_ssp_pin != 0) {      
       char *pin_str = (char*)malloc(DISP_PIN_SIZE+1);
       sprintf(pin_str, "%06d", bt_ssp_pin);
@@ -299,13 +312,34 @@ void draw_disp_area() {
       }
 
       if (disp_page == 0) {
-        disp_area.drawBitmap(0, 37, bm_nfr, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+        if (device_signatures_ok()) {
+          disp_area.drawBitmap(0, 37, bm_checks, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+        } else {
+          disp_area.drawBitmap(0, 37, bm_nfr, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+        }
       } else if (disp_page == 1) {
         if (radio_online) {
           disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
         } else{
           disp_area.drawBitmap(0, 37, bm_hwok, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
         }
+      } else if (disp_page == 2) {
+        if (radio_online) {
+          disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+        } else{
+          disp_area.drawBitmap(0, 37, bm_version, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+          char *v_str = (char*)malloc(3+1);
+          sprintf(v_str, "%01d%02d", MAJ_VERS, MIN_VERS);
+          for (int i = 0; i < 3; i++) {
+            uint8_t numeric = v_str[i]-48; uint8_t bm_offset = numeric*5;
+            uint8_t dxp = 20;
+            if (i == 1) dxp += 9*1+4;
+            if (i == 2) dxp += 9*2+4;
+            disp_area.drawBitmap(dxp, 37+16, bm_n_uh+bm_offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+          }
+          disp_area.drawLine(27, 37+19, 28, 37+19, SSD1306_BLACK);
+          disp_area.drawLine(27, 37+20, 28, 37+20, SSD1306_BLACK);
+        }
       }
     }
   } else {
@@ -321,6 +355,10 @@ void update_disp_area() {
 
 void update_display() {
   if (millis()-last_disp_update >= disp_update_interval) {
+    if (display_contrast != display_intensity) {
+      display_contrast = display_intensity;
+      set_contrast(&display, display_contrast);
+    }
     display.clearDisplay();
     update_stat_area();
     update_disp_area();
index c948d6ef17c28ef5137709134ee1f43e198f943e..c27b59fbd28813381448e9b8952f61f6e489ad20 100644 (file)
@@ -44,6 +44,23 @@ const unsigned char bm_version [] PROGMEM = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
+const unsigned char bm_fw_corrupt [] PROGMEM = {
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x30, 0xe7, 0x33, 0x9c, 0x70, 0xe1, 0xff, 
+   0xcf, 0x32, 0x62, 0x32, 0x99, 0x32, 0x67, 0xff, 0xc3, 0x30, 0xe0, 0x32, 0x98, 0x30, 0xe1, 0xff, 
+   0xcf, 0x30, 0xe5, 0x30, 0x19, 0x30, 0xe7, 0xff, 0xcf, 0x32, 0x67, 0x39, 0x39, 0x32, 0x61, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xc7, 0x0e, 0x1c, 0x98, 0x70, 0xfc, 0xff, 
+   0xc9, 0x93, 0x26, 0x4c, 0x99, 0x39, 0xfb, 0x7f, 0xcf, 0x93, 0x0e, 0x1c, 0x98, 0x79, 0xfb, 0x7f, 
+   0xc9, 0x93, 0x0e, 0x1c, 0x99, 0xf9, 0xf7, 0xbf, 0xe3, 0xc7, 0x26, 0x4e, 0x39, 0xf9, 0xf4, 0xbf, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdf, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xef, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xf7, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfb, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
 static unsigned char bm_def[] PROGMEM = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x61, 0x10, 0x8c, 0x23, 0xc4, 0x3f, 0xff, 
    0xb5, 0xa7, 0xb7, 0xb5, 0xed, 0xed, 0xbf, 0xff, 0xb5, 0xb9, 0xb4, 0xb4, 0x6d, 0xed, 0xbf, 0xff, 
@@ -101,6 +118,23 @@ const unsigned char bm_frame [] PROGMEM = {
    0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x8a, 0xaa, 0x80
 };
 
+const unsigned char bm_checks [] PROGMEM = {
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x0c, 0x99, 0xc7, 0x0f, 
+   0xe6, 0x00, 0x7f, 0x93, 0x3c, 0x99, 0x93, 0x3f, 0xe6, 0x00, 0x7f, 0x93, 0x0e, 0x39, 0x9f, 0x0f, 
+   0xff, 0xff, 0xff, 0x93, 0x3e, 0x39, 0x93, 0x3f, 0xff, 0xff, 0xff, 0x87, 0x0f, 0x79, 0xc7, 0x0f, 
+   0xe6, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x39, 0x30, 0xe3, 0x93, 0x87, 
+   0xe6, 0x00, 0x7c, 0x99, 0x33, 0xc9, 0x87, 0x3f, 0xe6, 0x00, 0x7c, 0xf8, 0x30, 0xcf, 0x8f, 0x8f, 
+   0xff, 0xff, 0xfc, 0x99, 0x33, 0xc9, 0x87, 0xe7, 0xff, 0xff, 0xfe, 0x39, 0x30, 0xe3, 0x93, 0x0f, 
+   0xe6, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x9c, 0x3c, 0x78, 0x70, 0xc3, 0x0f, 
+   0xe6, 0x0d, 0x3c, 0x99, 0x33, 0xe7, 0xcf, 0x27, 0xe6, 0x04, 0x7c, 0x38, 0x38, 0xf1, 0xc3, 0x27, 
+   0xff, 0xfe, 0xfc, 0xf9, 0x3e, 0x7c, 0xcf, 0x27, 0xff, 0xff, 0xfc, 0xf9, 0x30, 0xe1, 0xc3, 0x0f, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
 const unsigned char bm_hwfail [] PROGMEM = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xe3, 0x87, 0x0e, 0x73, 0x8e, 0x1c, 0x3f,