]> git.tnoah.ca Git - lora-radio.git/commitdiff
Added firmware update indication to display
authorMark Qvist <mark@unsigned.io>
Wed, 2 Nov 2022 23:58:45 +0000 (00:58 +0100)
committerMark Qvist <mark@unsigned.io>
Wed, 2 Nov 2022 23:58:45 +0000 (00:58 +0100)
Config.h
Display.h
Framing.h
Graphics.h
RNode_Firmware.ino
Utilities.h

index fd72e88e8fd21270c4f4d94e10bc4cd89f8c8471..818042ca8a69831a8c4ce7b4ac5e259df1bbf13d 100644 (file)
--- a/Config.h
+++ b/Config.h
     uint8_t battery_state = 0x00;
     uint8_t display_intensity = 0xFF;
     bool device_init_done = false;
+    bool eeprom_ok = false;
+    bool firmware_update_mode = false;
 
        // Boot flags
        #define START_FROM_BOOTLOADER 0x01
index d1932fbbdb9993fddd75f9471607f69796dc5066..61390b250c4fc08074b88ba42e39586c4f55908a 100644 (file)
--- a/Display.h
+++ b/Display.h
@@ -273,12 +273,18 @@ void draw_stat_area() {
 }
 
 void update_stat_area() {
-  draw_stat_area();
-  if (disp_mode == DISP_MODE_PORTRAIT) {
-    display.drawBitmap(p_as_x, p_as_y, stat_area.getBuffer(), stat_area.width(), stat_area.height(), SSD1306_WHITE, SSD1306_BLACK);
-  } else if (disp_mode == DISP_MODE_LANDSCAPE) {
-    display.drawBitmap(p_as_x+2, p_as_y, stat_area.getBuffer(), stat_area.width(), stat_area.height(), SSD1306_WHITE, SSD1306_BLACK);
-    display.drawLine(p_as_x, 0, p_as_x, 64, SSD1306_WHITE);
+  if (eeprom_ok && !firmware_update_mode) {
+    draw_stat_area();
+    if (disp_mode == DISP_MODE_PORTRAIT) {
+      display.drawBitmap(p_as_x, p_as_y, stat_area.getBuffer(), stat_area.width(), stat_area.height(), SSD1306_WHITE, SSD1306_BLACK);
+    } else if (disp_mode == DISP_MODE_LANDSCAPE) {
+      display.drawBitmap(p_as_x+2, p_as_y, stat_area.getBuffer(), stat_area.width(), stat_area.height(), SSD1306_WHITE, SSD1306_BLACK);
+      if (device_init_done) display.drawLine(p_as_x, 0, p_as_x, 64, SSD1306_WHITE);
+    }
+  } else {
+    if (firmware_update_mode) {
+      // Indicate firmware update spinner
+    }
   }
 }
 
@@ -286,8 +292,9 @@ void update_stat_area() {
 const uint8_t pages = 3;
 uint8_t disp_page = START_PAGE;
 void draw_disp_area() {
-  if (!device_init_done) {
-    disp_area.drawBitmap(0, 37, bm_boot, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+  if (!device_init_done || firmware_update_mode) {
+    if (!device_init_done) disp_area.drawBitmap(0, 37, bm_boot, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+    if (firmware_update_mode) disp_area.drawBitmap(0, 37, bm_fw_update, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
   } else {
     if (!disp_ext_fb or bt_ssp_pin != 0) {
       if (device_signatures_ok()) {
index 649bb1fa3a0e17f0229439f7a2ef01bcb708be6f..56730c5f144d673a3377cd9abc46fe0e4a3790ed 100644 (file)
--- a/Framing.h
+++ b/Framing.h
@@ -47,6 +47,7 @@
        #define CMD_DEV_SIG     0x57
        #define CMD_FW_HASH     0x58
        #define CMD_HASHES      0x60
+       #define CMD_FW_UPD      0x61
        #define CMD_UNLOCK_ROM  0x59
        #define ROM_UNLOCK_BYTE 0xF8
        #define CMD_RESET       0x55
index 776ad345a01202318985c7b09552c5598d940b2e..31ddf427a13ea114a8af6694efd8d2714ab44b96 100644 (file)
@@ -44,6 +44,23 @@ const unsigned char bm_boot [] PROGMEM = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
+const unsigned char bm_fw_update [] 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, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xfc, 0x98, 0x70, 0xf1, 0xc3, 0x33, 0x38, 0x7f, 0xfc, 0x99, 0x32, 0x64, 0xe7, 0x31, 0x33, 0xff, 
+   0xfc, 0x98, 0x72, 0x60, 0xe7, 0x30, 0x32, 0x7f, 0xfc, 0x99, 0xf2, 0x64, 0xe7, 0x32, 0x32, 0x7f, 
+   0xfe, 0x39, 0xf0, 0xe4, 0xe7, 0x33, 0x38, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+   0xf8, 0x66, 0x1c, 0xe6, 0x73, 0x8e, 0x1c, 0x3f, 0xf9, 0xe6, 0x4c, 0x46, 0x53, 0x26, 0x4c, 0xff, 
+   0xf8, 0x66, 0x1c, 0x06, 0x53, 0x06, 0x1c, 0x3f, 0xf9, 0xe6, 0x1c, 0xa6, 0x03, 0x26, 0x1c, 0xff, 
+   0xf9, 0xe6, 0x4c, 0xe7, 0x27, 0x26, 0x4c, 0x3f, 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, 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_version [] 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, 0xff, 0xff, 0xff, 0xff, 0xff, 
index de12b5f9ad529e2cd03f7ab91dfd38c4e680327f..c5b520f8f587fefa234937075245c1e37d68f496 100644 (file)
@@ -702,6 +702,12 @@ void serialCallback(uint8_t sbyte) {
             device_save_signature();
           }
       #endif
+    } else if (command == CMD_FW_UPD) {
+      if (sbyte == 0x01) {
+        firmware_update_mode = true;
+      } else {
+        firmware_update_mode = false;
+      }
     } else if (command == CMD_HASHES) {
       #if MCU_VARIANT == MCU_ESP32
         if (sbyte == 0x01) {
@@ -866,6 +872,7 @@ void validate_status() {
     if (eeprom_lock_set()) {
       if (eeprom_product_valid() && eeprom_model_valid() && eeprom_hwrev_valid()) {
         if (eeprom_checksum_valid()) {
+          eeprom_ok = true;
           #if PLATFORM == PLATFORM_ESP32
             if (device_init()) {
               hw_ready = true;
@@ -881,12 +888,32 @@ void validate_status() {
             op_mode = MODE_TNC;
             startRadio();
           }
+        } else {
+          hw_ready = false;
+          #if HAS_DISPLAY
+            if (disp_ready) {
+              device_init_done = true;
+              update_display();
+            }
+          #endif
         }
       } else {
         hw_ready = false;
+        #if HAS_DISPLAY
+          if (disp_ready) {
+            device_init_done = true;
+            update_display();
+          }
+        #endif
       }
     } else {
       hw_ready = false;
+      #if HAS_DISPLAY
+        if (disp_ready) {
+          device_init_done = true;
+          update_display();
+        }
+      #endif
     }
   } else {
     hw_ready = false;
@@ -940,6 +967,7 @@ void loop() {
     if (hw_ready) {
       led_indicate_standby();
     } else {
+
       led_indicate_not_ready();
       stopRadio();
     }
index 8e5f407ca8abdcafa97aab0c367e9ef3ee71785b..09d40d95d5650a897bd0969cab4db899bfff37a2 100644 (file)
@@ -652,7 +652,8 @@ void kiss_indicate_fbstate() {
 
        void kiss_indicate_target_fw_hash() {
          serial_write(FEND);
-         serial_write(CMD_DEV_HASH);
+         serial_write(CMD_HASHES);
+         serial_write(0x01);
          for (int i = 0; i < DEV_HASH_LEN; i++) {
            uint8_t byte = dev_firmware_hash_target[i];
                        escaped_serial_write(byte);
@@ -662,7 +663,8 @@ void kiss_indicate_fbstate() {
 
        void kiss_indicate_fw_hash() {
          serial_write(FEND);
-         serial_write(CMD_DEV_HASH);
+         serial_write(CMD_HASHES);
+         serial_write(0x02);
          for (int i = 0; i < DEV_HASH_LEN; i++) {
            uint8_t byte = dev_firmware_hash[i];
                        escaped_serial_write(byte);
@@ -672,7 +674,8 @@ void kiss_indicate_fbstate() {
 
        void kiss_indicate_bootloader_hash() {
          serial_write(FEND);
-         serial_write(CMD_DEV_HASH);
+         serial_write(CMD_HASHES);
+         serial_write(0x03);
          for (int i = 0; i < DEV_HASH_LEN; i++) {
            uint8_t byte = dev_bootloader_hash[i];
                        escaped_serial_write(byte);
@@ -682,7 +685,8 @@ void kiss_indicate_fbstate() {
 
        void kiss_indicate_partition_table_hash() {
          serial_write(FEND);
-         serial_write(CMD_DEV_HASH);
+         serial_write(CMD_HASHES);
+         serial_write(0x04);
          for (int i = 0; i < DEV_HASH_LEN; i++) {
            uint8_t byte = dev_partition_table_hash[i];
                        escaped_serial_write(byte);