]> git.tnoah.ca Git - lora-radio.git/commitdiff
Updated start sequence, added boot graphics
authorMark Qvist <mark@unsigned.io>
Wed, 2 Nov 2022 18:02:22 +0000 (19:02 +0100)
committerMark Qvist <mark@unsigned.io>
Wed, 2 Nov 2022 18:02:22 +0000 (19:02 +0100)
Bluetooth.h
Device.h
Display.h
Graphics.h
RNode_Firmware.ino
Utilities.h

index 01c357669baeba196f2ab7e00c668de89eb84509..099a442fabfbf03c7254d4d87374d2b7ff6195a8 100644 (file)
@@ -71,52 +71,37 @@ char bt_devname[11];
     }
   }
 
-  bool bt_early_init_done = false;
-  bool bt_early_init() {
-    if (!bt_early_init_done) {
+  bool bt_setup_hw() {
+    if (!bt_ready) {
+      if (EEPROM.read(eeprom_addr(ADDR_CONF_BT)) == BT_ENABLE_BYTE) {
+        bt_enabled = true;
+      } else {
+        bt_enabled = false;
+      }
       if (btStart()) {
         if (esp_bluedroid_init() == ESP_OK) {
           if (esp_bluedroid_enable() == ESP_OK) {
             const uint8_t* bda_ptr = esp_bt_dev_get_address();
-            memcpy(dev_bt_mac, bda_ptr, BT_DEV_HASH_LEN);
+            char *data = (char*)malloc(BT_DEV_ADDR_LEN+1);
+            for (int i = 0; i < BT_DEV_ADDR_LEN; i++) {
+                data[i] = bda_ptr[i];
+            }
+            data[BT_DEV_ADDR_LEN] = EEPROM.read(eeprom_addr(ADDR_SIGNATURE));
+            unsigned char *hash = MD5::make_hash(data, BT_DEV_ADDR_LEN);
+            memcpy(bt_dh, hash, BT_DEV_HASH_LEN);
+            sprintf(bt_devname, "RNode %02X%02X", bt_dh[14], bt_dh[15]);
+            free(data);
+
+            SerialBT.enableSSP();
+            SerialBT.onConfirmRequest(bt_confirm_pairing);
+            SerialBT.onAuthComplete(bt_pairing_complete);
+            SerialBT.register_callback(bt_connection_callback);
+            
+            bt_ready = true;
             return true;
-          } else {
-            return false;
-          }
-        } else {
-          return false;
-        }
-      } else {
-        return false;
-      }
-    } else {
-      return true;
-    }
-  }
-
-  bool bt_setup_hw() {
-    if (!bt_ready) {
-      if (EEPROM.read(eeprom_addr(ADDR_CONF_BT)) == BT_ENABLE_BYTE) { bt_enabled = true; } else { bt_enabled = false; }
-      if (bt_early_init()) {
-        const uint8_t* bda_ptr = esp_bt_dev_get_address();
-        char *data = (char*)malloc(BT_DEV_ADDR_LEN+1);
-        for (int i = 0; i < BT_DEV_ADDR_LEN; i++) {
-          data[i] = bda_ptr[i];
-        }
-        data[BT_DEV_ADDR_LEN] = EEPROM.read(eeprom_addr(ADDR_SIGNATURE));
-        unsigned char *hash = MD5::make_hash(data, BT_DEV_ADDR_LEN);
-        memcpy(bt_dh, hash, BT_DEV_HASH_LEN);
-        sprintf(bt_devname, "RNode %02X%02X", bt_dh[14], bt_dh[15]);
-        free(data);
-
-        SerialBT.enableSSP();
-        SerialBT.onConfirmRequest(bt_confirm_pairing);
-        SerialBT.onAuthComplete(bt_pairing_complete);
-        SerialBT.register_callback(bt_connection_callback);
-        
-        bt_ready = true;
-        return true;
 
+          } else { return false; }
+        } else { return false; }
       } else { return false; }
     }
   }
index f62ffc8876f5865f7a1de9277245b6b66b38798e..d18179a5bc8858f833f7088a0a31a10a3c8a3993 100644 (file)
--- a/Device.h
+++ b/Device.h
@@ -113,7 +113,7 @@ bool device_firmware_ok() {
 }
 
 bool device_init() {
-  if (bt_early_init()) {
+  if (bt_ready) {
     for (uint8_t i=0; i<EEPROM_SIG_LEN; i++){dev_eeprom_signature[i]=EEPROM.read(eeprom_addr(ADDR_SIGNATURE+i));}
     mbedtls_md_context_t ctx;
     mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256;     
index 70458cad2ec1b66200c0d38ae1840b0696ab7e8d..d1932fbbdb9993fddd75f9471607f69796dc5066 100644 (file)
--- a/Display.h
+++ b/Display.h
@@ -253,20 +253,22 @@ void draw_waterfall(int px, int py) {
 
 bool stat_area_intialised = false;
 void draw_stat_area() {
-  if (!stat_area_intialised) {
-    stat_area.drawBitmap(0, 0, bm_frame, 64, 64, SSD1306_WHITE, SSD1306_BLACK);
-    stat_area_intialised = true;
-  }
+  if (device_init_done) {
+    if (!stat_area_intialised) {
+      stat_area.drawBitmap(0, 0, bm_frame, 64, 64, SSD1306_WHITE, SSD1306_BLACK);
+      stat_area_intialised = true;
+    }
 
-  draw_cable_icon(3, 8);
-  draw_bt_icon(3, 30);
-  draw_lora_icon(45, 8);
-  draw_mw_icon(45, 30);
-  draw_battery_bars(4, 58);
-  if (radio_online) {
-    draw_quality_bars(28, 56);
-    draw_signal_bars(44, 56);
-    draw_waterfall(27, 4);
+    draw_cable_icon(3, 8);
+    draw_bt_icon(3, 30);
+    draw_lora_icon(45, 8);
+    draw_mw_icon(45, 30);
+    draw_battery_bars(4, 58);
+    if (radio_online) {
+      draw_quality_bars(28, 56);
+      draw_signal_bars(44, 56);
+      draw_waterfall(27, 4);
+    }
   }
 }
 
@@ -284,74 +286,78 @@ void update_stat_area() {
 const uint8_t pages = 3;
 uint8_t disp_page = START_PAGE;
 void draw_disp_area() {
-  if (!disp_ext_fb or bt_ssp_pin != 0) {
-    if (device_signatures_ok()) {
-      disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);      
-    } else {
-      disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, 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);
+  if (!device_init_done) {
+    disp_area.drawBitmap(0, 37, bm_boot, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+  } else {
+    if (!disp_ext_fb or bt_ssp_pin != 0) {
+      if (device_signatures_ok()) {
+        disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, 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);
-
-      disp_area.drawBitmap(0, 37, bm_pairing, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
-      for (int i = 0; i < DISP_PIN_SIZE; i++) {
-        uint8_t numeric = pin_str[i]-48;
-        uint8_t offset = numeric*5;
-        disp_area.drawBitmap(7+9*i, 37+16, bm_n_uh+offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+        disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, 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);
+
+        disp_area.drawBitmap(0, 37, bm_pairing, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+        for (int i = 0; i < DISP_PIN_SIZE; i++) {
+          uint8_t numeric = pin_str[i]-48;
+          uint8_t offset = numeric*5;
+          disp_area.drawBitmap(7+9*i, 37+16, bm_n_uh+offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+        }
 
-    } else {
-      if (millis()-last_page_flip >= page_interval) {
-        disp_page = (++disp_page%pages);
-        last_page_flip = millis();
-        if (not community_fw and disp_page == 0) disp_page = 1;
-      }
+      } else {
+        if (millis()-last_page_flip >= page_interval) {
+          disp_page = (++disp_page%pages);
+          last_page_flip = millis();
+          if (not community_fw and disp_page == 0) disp_page = 1;
+        }
 
-      if (disp_page == 0) {
-        if (device_signatures_ok()) {
+        if (disp_page == 0) {
+          if (device_signatures_ok()) {
+            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_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_checks, 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 {
-          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);
+        } 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);
           }
-          disp_area.drawLine(27, 37+19, 28, 37+19, SSD1306_BLACK);
-          disp_area.drawLine(27, 37+20, 28, 37+20, SSD1306_BLACK);
         }
       }
+    } else {
+      disp_area.drawBitmap(0, 0, fb, disp_area.width(), disp_area.height(), SSD1306_WHITE, SSD1306_BLACK);
     }
-  } else {
-    disp_area.drawBitmap(0, 0, fb, disp_area.width(), disp_area.height(), SSD1306_WHITE, SSD1306_BLACK);
   }
 }
 
index a4321776470909a978800c45389dd3c95f35b6ad..776ad345a01202318985c7b09552c5598d940b2e 100644 (file)
@@ -27,6 +27,23 @@ const unsigned char bm_bt [] PROGMEM = {
    0x29, 0x94, 0x11, 0x48, 0x03, 0x20, 0x05, 0x10, 0x09, 0x20, 0x01, 0x40, 0x01, 0x80, 0x01, 0x00
 };
 
+const unsigned char bm_boot [] 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, 
+   0xff, 0xfc, 0x38, 0x66, 0x67, 0x1c, 0x3f, 0xff, 0xff, 0xfc, 0x99, 0xe6, 0x66, 0x4c, 0xff, 0xff, 
+   0xff, 0xfc, 0x98, 0x70, 0xe6, 0x7c, 0x3f, 0xff, 0xff, 0xfc, 0x99, 0xf0, 0xe6, 0x4c, 0xff, 0xff, 
+   0xff, 0xfc, 0x38, 0x79, 0xe7, 0x1c, 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, 0x0c, 0x38, 0xe1, 0xc3, 0x33, 0x38, 0x7f, 0xfe, 0x7e, 0x72, 0x64, 0xe7, 0x31, 0x33, 0xff, 
+   0xff, 0x1e, 0x70, 0x61, 0xe7, 0x30, 0x32, 0x7f, 0xff, 0xce, 0x72, 0x61, 0xe7, 0x32, 0x32, 0x7f, 
+   0xfe, 0x1e, 0x72, 0x64, 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, 
+   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 0a441ba4aca9e12405df61a77deaeb4657c048fe..de12b5f9ad529e2cd03f7ab91dfd38c4e680327f 100644 (file)
@@ -52,8 +52,7 @@ char sbuf[128];
 
 void setup() {
   #if MCU_VARIANT == MCU_ESP32
-    // TODO: Reset?
-    // delay(500);
+    boot_seq();
     EEPROM.begin(EEPROM_SIZE);
     Serial.setRxBufferSize(CONFIG_UART_BUFFER_SIZE);
   #endif
@@ -90,16 +89,22 @@ void setup() {
   // pins for the LoRa module
   LoRa.setPins(pin_cs, pin_reset, pin_dio);
 
+  #if HAS_DISPLAY
+    disp_ready = display_init();
+    update_display();
+  #endif
+
   #if MCU_VARIANT == MCU_ESP32
     #if HAS_PMU == true
       pmu_ready = init_pmu();
     #endif
 
-    kiss_indicate_reset();
-  #endif
+    #if HAS_BLUETOOTH
+      bt_init();
+      bt_init_ran = true;
+    #endif
 
-  #if HAS_DISPLAY
-    disp_ready = display_init();
+    kiss_indicate_reset();
   #endif
 
   // Validate board health, EEPROM and config
@@ -832,7 +837,10 @@ void validate_status() {
     hw_ready = false;
     Serial.write("Error, invalid hardware check state\r\n");
     #if HAS_DISPLAY
-      if (disp_ready) update_display();
+      if (disp_ready) {
+        device_init_done = true;
+        update_display();
+      }
     #endif
     led_indicate_boot_error();
   }
@@ -846,7 +854,10 @@ void validate_status() {
   } else {
       Serial.write("Error, indeterminate boot vector\r\n");
       #if HAS_DISPLAY
-        if (disp_ready) update_display();
+        if (disp_ready) {
+          device_init_done = true;
+          update_display();
+        }
       #endif
       led_indicate_boot_error();
   }
@@ -881,7 +892,10 @@ void validate_status() {
     hw_ready = false;
     Serial.write("Error, incorrect boot vector\r\n");
     #if HAS_DISPLAY
-      if (disp_ready) update_display();
+      if (disp_ready) {
+        device_init_done = true;
+        update_display();
+      }
     #endif
     led_indicate_boot_error();
   }
@@ -947,11 +961,6 @@ void loop() {
   #endif
 
   #if HAS_BLUETOOTH
-    if (!bt_init_ran && millis() > 1000) {
-      bt_init();
-      bt_init_ran = true;
-    }
-
     if (bt_ready) update_bt();
   #endif
 }
index 49f89a1b995aef70f12372de54983a1d22894ac5..8e5f407ca8abdcafa97aab0c367e9ef3ee71785b 100644 (file)
@@ -66,6 +66,20 @@ uint8_t boot_vector = 0x00;
                pixels.show();
        }
   }
+
+  void boot_seq() {
+       uint8_t rs[] = { 0x00, 0x00, 0x00 };
+       uint8_t gs[] = { 0x10, 0x08, 0x00 };
+       uint8_t bs[] = { 0x00, 0x08, 0x10 };
+       for (int i = 0; i < 1*sizeof(rs); i++) {
+               npset(rs[i%sizeof(rs)], gs[i%sizeof(gs)], bs[i%sizeof(bs)]);
+               delay(33);
+               npset(0x00, 0x00, 0x00);
+               delay(66);
+       }
+  }
+#else
+  void boot_seq() { }
 #endif
 
 #if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560