]> git.tnoah.ca Git - lora-radio.git/commitdiff
Base structure for BLE support on ESP32-S3 boards
authorMark Qvist <mark@unsigned.io>
Mon, 22 Apr 2024 22:52:57 +0000 (00:52 +0200)
committerMark Qvist <mark@unsigned.io>
Mon, 22 Apr 2024 22:52:57 +0000 (00:52 +0200)
Bluetooth.h
Boards.h
Device.h
RNode_Firmware.ino
Utilities.h

index e7231a12d5493ed487fab313a1a6eddd248fe55c..64eac7d756655d9329a53617dc9a73e3cfe28328 100644 (file)
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 #if MCU_VARIANT == MCU_ESP32
-#include "BluetoothSerial.h"
-#include "esp_bt_main.h"
-#include "esp_bt_device.h"
+  
 
 #elif MCU_VARIANT == MCU_NRF52
-#include <bluefruit.h>
-#include <math.h>
 #endif
 
 #if MCU_VARIANT == MCU_ESP32
-BluetoothSerial SerialBT;
+  #if HAS_BLUETOOTH == true
+    #include "BluetoothSerial.h"
+    #include "esp_bt_main.h"
+    #include "esp_bt_device.h"
+    BluetoothSerial SerialBT;
+  #elif HAS_BLE == true
+    #include "esp_bt_main.h"
+    #include "esp_bt_device.h"
+    // TODO: Remove
+    #define SerialBT Serial
+  #endif
+
 #elif MCU_VARIANT == MCU_NRF52
-BLEUart SerialBT;
-BLEDis  bledis;
-BLEBas  blebas;
+  #include <bluefruit.h>
+  #include <math.h>
+  BLEUart SerialBT;
+  BLEDis  bledis;
+  BLEBas  blebas;
 #endif
 
 #define BT_PAIRING_TIMEOUT 35000
@@ -42,114 +51,201 @@ char bt_dh[BT_DEV_HASH_LEN];
 char bt_devname[11];
 
 #if MCU_VARIANT == MCU_ESP32
+  #if HAS_BLUETOOTH == true
 
-  void bt_confirm_pairing(uint32_t numVal) {
-    bt_ssp_pin = numVal;
-    kiss_indicate_btpin();
-    if (bt_allow_pairing) {
-      SerialBT.confirmReply(true);
-    } else {
-      SerialBT.confirmReply(false);
+    void bt_confirm_pairing(uint32_t numVal) {
+      bt_ssp_pin = numVal;
+      kiss_indicate_btpin();
+      if (bt_allow_pairing) {
+        SerialBT.confirmReply(true);
+      } else {
+        SerialBT.confirmReply(false);
+      }
     }
-  }
 
-  void bt_stop() {
-    if (bt_state != BT_STATE_OFF) {
-      SerialBT.end();
-      bt_allow_pairing = false;
-      bt_state = BT_STATE_OFF;
+    void bt_stop() {
+      if (bt_state != BT_STATE_OFF) {
+        SerialBT.end();
+        bt_allow_pairing = false;
+        bt_state = BT_STATE_OFF;
+      }
     }
-  }
 
-  void bt_start() {
-    if (bt_state == BT_STATE_OFF) {
-      SerialBT.begin(bt_devname);
+    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_ssp_pin = 0;
       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_pairing_complete(boolean success) {
+      if (success) {
+        bt_disable_pairing();
+      } else {
+        bt_ssp_pin = 0;
+      }
+    }
 
-  void bt_disable_pairing() {
-    bt_allow_pairing = false;
-    bt_ssp_pin = 0;
-    bt_state = BT_STATE_ON;
-  }
+    void bt_connection_callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){
+      if(event == ESP_SPP_SRV_OPEN_EVT) {
+        bt_state = BT_STATE_CONNECTED;
+        cable_state = CABLE_STATE_DISCONNECTED;
+      }
+       
+      if(event == ESP_SPP_CLOSE_EVT ){
+        bt_state = BT_STATE_ON;
+      }
+    }
 
-  void bt_pairing_complete(boolean success) {
-    if (success) {
-      bt_disable_pairing();
-    } else {
+    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+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 false; }
+    }
+
+    bool bt_init() {
+        bt_state = BT_STATE_OFF;
+        if (bt_setup_hw()) {
+          if (bt_enabled && !console_active) bt_start();
+          return true;
+        } else {
+          return false;
+        }
+    }
+
+    void update_bt() {
+      if (bt_allow_pairing && millis()-bt_pairing_started >= BT_PAIRING_TIMEOUT) {
+        bt_disable_pairing();
+      }
+    }
+
+  #elif HAS_BLE == true
+    void bt_stop() {
+      if (bt_state != BT_STATE_OFF) {
+        bt_allow_pairing = false;
+        bt_state = BT_STATE_OFF;
+      }
+    }
+
+    void bt_disable_pairing() {
+      bt_allow_pairing = false;
       bt_ssp_pin = 0;
+      bt_state = BT_STATE_ON;
     }
-  }
 
-  void bt_connection_callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){
-    if(event == ESP_SPP_SRV_OPEN_EVT) {
+    void bt_connect_callback(uint16_t conn_handle) {
       bt_state = BT_STATE_CONNECTED;
       cable_state = CABLE_STATE_DISCONNECTED;
     }
-     
-    if(event == ESP_SPP_CLOSE_EVT ){
+
+    void bt_disconnect_callback(uint16_t conn_handle, uint8_t reason) {
       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+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;
 
+    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+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);
+
+              // TODO: Implement GAP & GATT for RNode comms over BLE
+              
+              bt_ready = true;
+              return true;
+
+            } else { return false; }
           } else { return false; }
         } else { return false; }
       } else { return false; }
-    } else { return false; }
-  }
+    }
 
-  bool bt_init() {
-      bt_state = BT_STATE_OFF;
-      if (bt_setup_hw()) {
-        if (bt_enabled && !console_active) bt_start();
-        return true;
-      } else {
-        return false;
+    void bt_start() {
+      if (bt_state == BT_STATE_OFF) {
+        bt_state = BT_STATE_ON;
+        // TODO: Implement
       }
-  }
+    }
 
-  void update_bt() {
-    if (bt_allow_pairing && millis()-bt_pairing_started >= BT_PAIRING_TIMEOUT) {
-      bt_disable_pairing();
+    bool bt_init() {
+        bt_state = BT_STATE_OFF;
+        if (bt_setup_hw()) {
+          if (bt_enabled && !console_active) bt_start();
+          return true;
+        } else {
+          return false;
+        }
     }
-  }
+
+    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 update_bt() {
+      if (bt_allow_pairing && millis()-bt_pairing_started >= BT_PAIRING_TIMEOUT) {
+        bt_disable_pairing();
+      }
+    }
+  #endif
 
 #elif MCU_VARIANT == MCU_NRF52
 uint8_t eeprom_read(uint32_t mapped_addr);
@@ -244,8 +340,8 @@ bool bt_setup_hw() {
 void bt_start() {
   if (bt_state == BT_STATE_OFF) {
     Bluefruit.setName(bt_devname);
-    bledis.setManufacturer("Adafruit Industries");
-    bledis.setModel("Bluefruit Feather52");
+    bledis.setManufacturer(BLE_MANUFACTURER);
+    bledis.setModel(BLE_MODEL);
     // start device information service
     bledis.begin();
 
index 8fe602e605c1b57210084be139b4ac378f9250b5..cfc48d79b188964d2cd22150bf6a49f97ffa87e2 100644 (file)
--- a/Boards.h
+++ b/Boards.h
 #ifndef BOARDS_H
   #define BOARDS_H
 
-  #define PLATFORM_AVR   0x90
-  #define PLATFORM_ESP32 0x80
-  #define PLATFORM_NRF52 0x70
+  #define PLATFORM_AVR        0x90
+  #define PLATFORM_ESP32      0x80
+  #define PLATFORM_NRF52      0x70
 
-  #define MCU_1284P 0x91
-  #define MCU_2560  0x92
-  #define MCU_ESP32 0x81
-  #define MCU_NRF52 0x71
+  #define MCU_1284P           0x91
+  #define MCU_2560            0x92
+  #define MCU_ESP32           0x81
+  #define MCU_NRF52           0x71
 
   #define BOARD_RNODE         0x31
   #define BOARD_HMBRW         0x32
     #elif BOARD_MODEL == BOARD_HELTEC32_V3
       #define IS_ESP32S3 true
       #define HAS_DISPLAY true
-      //ESP32-S3 no bluetooth classic
       #define HAS_BLUETOOTH false
-      // TODO BLE
-      #define HAS_BLE false
+      #define HAS_BLE true
       // Cannot run wifi and BLE at same time?
       #define HAS_CONSOLE false
       #define HAS_EEPROM true
-      // Only one LED on pin 35
       #if defined(EXTERNAL_LEDS)
         const int pin_led_rx = 13;
         const int pin_led_tx = 14;
       const int pin_miso = 11;
       const int pin_sclk = 9;
 
-
-
     #elif BOARD_MODEL == BOARD_RNODE_NG_20
       #define HAS_DISPLAY true
       #define HAS_BLUETOOTH true
       #define HAS_TCXO true
 
       #define HAS_DISPLAY true
+      #define HAS_CONSOLE false
+      #define HAS_BLUETOOTH false
       #define HAS_BLE true
-      #define HAS_BLUETOOTH false // TODO: Implement
-      #define HAS_CONSOLE false   // TODO: Implement
       #define HAS_PMU true
       #define HAS_NP false
       #define HAS_SD false
   #elif MCU_VARIANT == MCU_NRF52
     #if BOARD_MODEL == BOARD_RAK4630
       #define HAS_EEPROM false
-      #define HAS_DISPLAY false // set for debugging
-      #define HAS_BLUETOOTH true
+      #define HAS_DISPLAY true
+      #define HAS_BLUETOOTH false
+      #define HAS_BLE true
       #define HAS_CONSOLE false
       #define HAS_PMU false
       #define HAS_NP false
       #define CONFIG_QUEUE_MAX_LENGTH 200
       #define EEPROM_SIZE 200
       #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED
+      #define BLE_MANUFACTURER "RAK Wireless"
+      #define BLE_MODEL "RAK4640"
 
-      // following pins are for the sx1262
+      // Following pins are for the sx1262
       const int pin_rxen = 37;
       const int pin_reset = 38;
       const int pin_cs = 42;
index 0b9f5e57b2a25ff2a133c411c52283811bc6e51c..b7a11a6ee736fc75c9ff768d1ee3387fadaa458f 100644 (file)
--- a/Device.h
+++ b/Device.h
@@ -154,7 +154,7 @@ bool device_init() {
     mbedtls_md_init(&ctx);
     mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0);
     mbedtls_md_starts(&ctx);
-    #if HAS_BLUETOOTH == true
+    #if HAS_BLUETOOTH == true || HAS_BLE == true
       mbedtls_md_update(&ctx, dev_bt_mac, BT_DEV_ADDR_LEN);
     #else
       // TODO: Get from BLE stack instead
index 7f026a51d9b3c3dd7415cd3c4682754e2ef778f6..7f0c8393b70b0558661828daf439740d1aba419c 100644 (file)
@@ -33,7 +33,7 @@ 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
+#if HAS_BLUETOOTH || HAS_BLE == true
   bool bt_init_ran = false;
 #endif
 
@@ -160,12 +160,9 @@ void setup() {
       pmu_ready = init_pmu();
     #endif
 
-    #if HAS_BLUETOOTH
+    #if HAS_BLUETOOTH || HAS_BLE == true
       bt_init();
       bt_init_ran = true;
-    #elif HAS_BLE
-      // TODO: Implement BLE on ESP32S3 instead of this hack
-      bt_ready = true;
     #endif
 
     if (console_active) {
@@ -910,7 +907,7 @@ void serialCallback(uint8_t sbyte) {
           }
       #endif
     } else if (command == CMD_BT_CTRL) {
-      #if HAS_BLUETOOTH
+      #if HAS_BLUETOOTH || HAS_BLE
         if (sbyte == 0x00) {
           bt_stop();
           bt_conf_save(false);
@@ -1111,15 +1108,7 @@ void validate_status() {
               if (device_init()) {
                 hw_ready = true;
               } else {
-                #if !HAS_BLUETOOTH && !HAS_BLE
-                  // Without bluetooth, bt_ready and device_init_done 
-                  // are not set
-                  // and neither is hw_ready (see device_init())
-                  hw_ready = true;
-                  device_init_done = true;
-                #else
-                  hw_ready = false;
-                #endif
+                hw_ready = false;
               }
             #else
               hw_ready = true;
@@ -1297,7 +1286,7 @@ void loop() {
     if (pmu_ready) update_pmu();
   #endif
 
-  #if HAS_BLUETOOTH
+  #if HAS_BLUETOOTH || HAS_BLE == true
     if (!console_active && bt_ready) update_bt();
   #endif
 }
@@ -1329,7 +1318,7 @@ void buffer_serial() {
 
     uint8_t c = 0;
 
-    #if HAS_BLUETOOTH
+    #if HAS_BLUETOOTH || HAS_BLE == true
     while (
       c < MAX_CYCLES &&
       ( (bt_state != BT_STATE_CONNECTED && Serial.available()) || (bt_state == BT_STATE_CONNECTED && SerialBT.available()) )
@@ -1344,7 +1333,7 @@ void buffer_serial() {
         if (!fifo_isfull_locked(&serialFIFO)) {
           fifo_push_locked(&serialFIFO, Serial.read());
         }
-      #elif HAS_BLUETOOTH
+      #elif HAS_BLUETOOTH || HAS_BLE == true
         if (bt_state == BT_STATE_CONNECTED) {
           if (!fifo_isfull(&serialFIFO)) {
             fifo_push(&serialFIFO, SerialBT.read());
index 5f9bdf759180effe5b472dae9729670df5b0ab0b..9400367fe404ad13f051c00ab0efd0122083ef2d 100644 (file)
@@ -47,7 +47,7 @@ sx128x *LoRa = &sx128x_modem;
   #include "Display.h"
 #endif
 
-#if HAS_BLUETOOTH == true
+#if HAS_BLUETOOTH == true || HAS_BLE == true
        void kiss_indicate_btpin();
   #include "Bluetooth.h"
 #endif
@@ -629,7 +629,7 @@ int8_t  led_standby_direction = 0;
 #endif
 
 void serial_write(uint8_t byte) {
-       #if HAS_BLUETOOTH
+       #if HAS_BLUETOOTH || HAS_BLE == true
                if (bt_state != BT_STATE_CONNECTED) {
                        Serial.write(byte);
                } else {
@@ -829,7 +829,7 @@ void kiss_indicate_battery() {
 }
 
 void kiss_indicate_btpin() {
-       #if HAS_BLUETOOTH
+       #if HAS_BLUETOOTH || HAS_BLE == true
                serial_write(FEND);
                serial_write(CMD_BT_PIN);
                escaped_serial_write(bt_ssp_pin>>24);