]> git.tnoah.ca Git - lora-radio.git/commitdiff
Implemented Bluetooth power and pairing state control
authorMark Qvist <mark@unsigned.io>
Sun, 30 Oct 2022 13:52:22 +0000 (14:52 +0100)
committerMark Qvist <mark@unsigned.io>
Sun, 30 Oct 2022 13:52:22 +0000 (14:52 +0100)
Bluetooth.h
Display.h
Framing.h
RNode_Firmware.ino
ROM.h
Utilities.h

index b898fd487bacdbba547bf14ed4bdda3505265df4..a91000e3abffdc60c6d4bcf7de3c9173ebbf202a 100644 (file)
@@ -3,7 +3,7 @@
 #include "esp_bt_device.h"
 
 BluetoothSerial SerialBT;
-#define BT_PAIRING_TIMEOUT 30000
+#define BT_PAIRING_TIMEOUT 35000
 uint32_t bt_pairing_started = 0;
 
 #define BT_DEV_ADDR_LEN 6
@@ -13,7 +13,7 @@ char bt_dh[BT_DEV_HASH_LEN];
 char bt_devname[11];
 
 bool bt_ready = false;
-bool bt_enabled = true;
+bool bt_enabled = false;
 bool bt_allow_pairing = false;
 
 #if MCU_VARIANT == MCU_ESP32
@@ -30,47 +30,51 @@ bool bt_allow_pairing = false;
 
   void bt_pairing_complete(boolean success) {
     if (success) {
-      Serial.println("Paired");
+      // Pass
     } else {
-      Serial.println("Not Paired");
+      // Pass
     }
   }
 
-  void bt_enable_pairing() {
-    bt_allow_pairing = true;
-    bt_pairing_started = millis();
-    bt_state = BT_STATE_PAIRING;
-  }
-
-  void bt_disable_pairing() {
-    bt_allow_pairing = false;
-    bt_state = BT_STATE_ON;
-  }
-
-  void bt_disable() {
+  void bt_stop() {
     if (bt_state != BT_STATE_OFF) {
       SerialBT.end();
+      bt_allow_pairing = false;
       bt_state = BT_STATE_OFF;
     }
   }
 
-  void bt_enable() {
+  void bt_start() {
     if (bt_state == BT_STATE_OFF) {
       SerialBT.begin(bt_devname);
       bt_state = BT_STATE_ON;
      }
   }
 
+  void bt_enable_pairing() {
+    if (bt_state == BT_STATE_OFF) bt_start();
+    bt_allow_pairing = true;
+    bt_pairing_started = millis();
+    bt_state = BT_STATE_PAIRING;
+  }
+
+  void bt_disable_pairing() {
+    bt_allow_pairing = false;
+    bt_state = BT_STATE_ON;
+  }
+
   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();
-            char *data = (char*)malloc(BT_DEV_ADDR_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]);
@@ -91,23 +95,18 @@ bool bt_allow_pairing = false;
 
   bool bt_init() {
       bt_state = BT_STATE_OFF;
-      if (bt_enabled) {
-        if (bt_setup_hw()) {
-          // TODO: Read from conf
-          bt_enable();
-          return true;
-        } else {
-          return false;
-        }
+      if (bt_setup_hw()) {
+        if (bt_enabled) bt_start();
+        return true;
       } else {
         return false;
       }
   }
 
   void update_bt() {
-    if (millis()-bt_pairing_started >= BT_PAIRING_TIMEOUT) {
+    if (bt_allow_pairing && millis()-bt_pairing_started >= BT_PAIRING_TIMEOUT) {
       bt_disable_pairing();
     }
   }
-  
+
 #endif
index b6eafa6395a9fd17a015d66a49f87df190d3d345..9551ed66873ab2bbd4592bf8ac635f14064175a1 100644 (file)
--- a/Display.h
+++ b/Display.h
@@ -104,6 +104,8 @@ void draw_bt_icon(int px, int py) {
     stat_area.drawBitmap(px, py, bm_bt+2*32, 16, 16, SSD1306_WHITE, SSD1306_BLACK);
   } else if (bt_state == BT_STATE_CONNECTED) {
     stat_area.drawBitmap(px, py, bm_bt+3*32, 16, 16, SSD1306_WHITE, SSD1306_BLACK);
+  } else {
+    stat_area.drawBitmap(px, py, bm_bt+0*32, 16, 16, SSD1306_WHITE, SSD1306_BLACK);
   }
 }
 
index eaadb423432cd9c50c263855f1d8a1da5b74d16e..04c1864f4896589a51cde8b62a2f613e7f0a0652 100644 (file)
--- a/Framing.h
+++ b/Framing.h
@@ -47,7 +47,6 @@
        #define CMD_RESET       0x55
        #define CMD_RESET_BYTE  0xF8
 
-
        #define DETECT_REQ              0x73
        #define DETECT_RESP             0x46
 
index 6e1b54524447b3727fa7de1ad88b701d510b3ff2..47e9d31d031be5d38be2def55b7e5beedea99dbc 100644 (file)
@@ -40,6 +40,9 @@ volatile uint16_t queued_bytes = 0;
 volatile uint16_t queue_cursor = 0;
 volatile uint16_t current_packet_start = 0;
 volatile bool serial_buffering = false;
+#if HAS_BLUETOOTH
+  bool bt_init_ran = false;
+#endif
 
 char sbuf[128];
 
@@ -100,10 +103,6 @@ void setup() {
 
   // Validate board health, EEPROM and config
   validateStatus();
-
-  #if HAS_BLUETOOTH
-    bt_init();
-  #endif
 }
 
 void lora_receive() {
@@ -677,9 +676,11 @@ void serialCallback(uint8_t sbyte) {
     } else if (command == CMD_BT_CTRL) {
       #if HAS_BLUETOOTH
         if (sbyte == 0x00) {
-          bt_disable();
+          bt_stop();
+          bt_conf_save(false);
         } else if (sbyte == 0x01) {
-          bt_enable();
+          bt_start();
+          bt_conf_save(true);
         } else if (sbyte == 0x02) {
           bt_enable_pairing();
         }
@@ -861,6 +862,11 @@ void loop() {
   #endif
 
   #if HAS_BLUETOOTH
+    if (!bt_init_ran && millis() > 1000) {
+      bt_init();
+      bt_init_ran = true;
+    }
+
     if (bt_ready) update_bt();
   #endif
 }
diff --git a/ROM.h b/ROM.h
index d680b6feef6137355f69ece51d3762b2c9367e9c..587d795f3e1ce9d2ad4ee30fa80eb7c5742b114a 100644 (file)
--- a/ROM.h
+++ b/ROM.h
        #define ADDR_CONF_BW   0x9F
        #define ADDR_CONF_FREQ 0xA3
        #define ADDR_CONF_OK   0xA7
+       
+       #define ADDR_CONF_BT   0xB0
 
        #define INFO_LOCK_BYTE 0x73
        #define CONF_OK_BYTE   0x73
+       #define BT_ENABLE_BYTE 0x73
 
        #define EEPROM_RESERVED 200
 #endif
\ No newline at end of file
index 5d46926d23e46202e086ca5b53ee70eba51ea4cf..9d7ab7c1e5d20c0ae1ded60a7647a01befeb5b89 100644 (file)
@@ -915,6 +915,14 @@ bool eeprom_checksum_valid() {
        return checksum_valid;
 }
 
+void bt_conf_save(bool is_enabled) {
+       if (is_enabled) {
+               eeprom_update(eeprom_addr(ADDR_CONF_BT), BT_ENABLE_BYTE);
+       } else {
+               eeprom_update(eeprom_addr(ADDR_CONF_BT), 0x00);
+       }
+}
+
 bool eeprom_have_conf() {
        if (EEPROM.read(eeprom_addr(ADDR_CONF_OK)) == CONF_OK_BYTE) {
                return true;