This is a copy of the community maintained fork of the open firmware which powers RNode devices. This version will have support for the hardware made by Mees Electronics.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.6 KiB

#include "BluetoothSerial.h"
#include "esp_bt_main.h"
#include "esp_bt_device.h"
BluetoothSerial SerialBT;
#define BT_PAIRING_TIMEOUT 30000
uint32_t bt_pairing_started = 0;
#define BT_DEV_ADDR_LEN 6
#define BT_DEV_HASH_LEN 16
char bt_da[BT_DEV_ADDR_LEN];
char bt_dh[BT_DEV_HASH_LEN];
char bt_devname[11];
bool bt_ready = false;
bool bt_enabled = true;
bool bt_allow_pairing = false;
#if MCU_VARIANT == MCU_ESP32
void bt_confirm_pairing(uint32_t numVal) {
if (bt_allow_pairing) {
bt_state = BT_STATE_ON;
SerialBT.confirmReply(true);
} else {
bt_state = BT_STATE_ON;
SerialBT.confirmReply(false);
}
}
void bt_pairing_complete(boolean success) {
if (success) {
Serial.println("Paired");
} else {
Serial.println("Not Paired");
}
}
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() {
if (bt_state != BT_STATE_OFF) {
SerialBT.end();
bt_state = BT_STATE_OFF;
}
}
void bt_enable() {
if (bt_state == BT_STATE_OFF) {
SerialBT.begin(bt_devname);
bt_state = BT_STATE_ON;
}
}
bool bt_setup_hw() {
if (!bt_ready) {
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);
for (int i = 0; i < BT_DEV_ADDR_LEN; i++) {
data[i] = bda_ptr[i];
}
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);
bt_ready = true;
return true;
} else { return false; }
} else { return false; }
} else { return 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;
}
} else {
return false;
}
}
void update_bt() {
if (millis()-bt_pairing_started >= BT_PAIRING_TIMEOUT) {
bt_disable_pairing();
}
}
#endif