Skip to content

Commit

Permalink
Update ESP32Bluetooth.cpp (#1625)
Browse files Browse the repository at this point in the history
* Update ESP32Bluetooth.cpp

* Update ESP32Bluetooth.h
  • Loading branch information
thebentern authored Aug 12, 2022
1 parent 20e43fc commit 97712a9
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 123 deletions.
154 changes: 48 additions & 106 deletions src/platform/esp32/ESP32Bluetooth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,56 +10,44 @@
#include "mesh/mesh-pb-constants.h"
#include <NimBLEDevice.h>

//static BLEService meshBleService = BLEService(BLEUuid(MESH_SERVICE_UUID_16));
//static BLECharacteristic fromNum = BLECharacteristic(BLEUuid(FROMNUM_UUID_16));
//static BLECharacteristic fromRadio = BLECharacteristic(BLEUuid(FROMRADIO_UUID_16));
//static BLECharacteristic toRadio = BLECharacteristic(BLEUuid(TORADIO_UUID_16));

//static BLEDis bledis; // DIS (Device Information Service) helper class instance
//static BLEBas blebas; // BAS (Battery Service) helper class instance
//static BLEDfu bledfu; // DFU software update helper service

// This scratch buffer is used for various bluetooth reads/writes - but it is safe because only one bt operation can be in
// proccess at once
// static uint8_t trBytes[_max(_max(_max(_max(ToRadio_size, RadioConfig_size), User_size), MyNodeInfo_size), FromRadio_size)];
static uint8_t fromRadioBytes[FromRadio_size];

NimBLECharacteristic *FromNumCharacteristic;
NimBLECharacteristic *fromNumCharacteristic;
NimBLEServer *bleServer;

static bool passkeyShowing;
static uint32_t doublepressed;

/**
* Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies)
*/
void BluetoothPhoneAPI::onNowHasData(uint32_t fromRadioNum)
class BluetoothPhoneAPI : public PhoneAPI
{
PhoneAPI::onNowHasData(fromRadioNum);

DEBUG_MSG("BLE notify fromNum\n");
//fromNum.notify32(fromRadioNum);

uint8_t val[4];
put_le32(val, fromRadioNum);

std::string fromNumByteString(&val[0], &val[0] + sizeof(val));
/**
* Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies)
*/
virtual void onNowHasData(uint32_t fromRadioNum)
{
PhoneAPI::onNowHasData(fromRadioNum);

DEBUG_MSG("BLE notify fromNum\n");

uint8_t val[4];
put_le32(val, fromRadioNum);

FromNumCharacteristic->setValue(fromNumByteString);
FromNumCharacteristic->notify();
}
fromNumCharacteristic->setValue(val, sizeof(val));
fromNumCharacteristic->notify();
}

/// Check the current underlying physical link to see if the client is currently connected
bool BluetoothPhoneAPI::checkIsConnected() {
if (bleServer && bleServer->getConnectedCount() > 0) {
return true;
/// Check the current underlying physical link to see if the client is currently connected
virtual bool checkIsConnected()
{
return bleServer && bleServer->getConnectedCount() > 0;
}
return false;
}
};

PhoneAPI *bluetoothPhoneAPI;
static BluetoothPhoneAPI *bluetoothPhoneAPI;
/**
* Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies)
*/

class ESP32BluetoothToRadioCallback : public NimBLECharacteristicCallbacks {
class ESP32BluetoothToRadioCallback : public NimBLECharacteristicCallbacks
{
virtual void onWrite(NimBLECharacteristic *pCharacteristic) {
DEBUG_MSG("To Radio onwrite\n");
auto val = pCharacteristic->getValue();
Expand All @@ -71,6 +59,7 @@ class ESP32BluetoothToRadioCallback : public NimBLECharacteristicCallbacks {
class ESP32BluetoothFromRadioCallback : public NimBLECharacteristicCallbacks {
virtual void onRead(NimBLECharacteristic *pCharacteristic) {
DEBUG_MSG("From Radio onread\n");
uint8_t fromRadioBytes[FromRadio_size];
size_t numBytes = bluetoothPhoneAPI->getFromRadio(fromRadioBytes);

std::string fromRadioByteString(fromRadioBytes, fromRadioBytes + numBytes);
Expand All @@ -79,7 +68,8 @@ class ESP32BluetoothFromRadioCallback : public NimBLECharacteristicCallbacks {
}
};

class ESP32BluetoothServerCallback : public NimBLEServerCallbacks {
class ESP32BluetoothServerCallback : public NimBLEServerCallbacks
{
virtual uint32_t onPassKeyRequest() {

uint32_t passkey = 0;
Expand All @@ -89,8 +79,8 @@ class ESP32BluetoothServerCallback : public NimBLEServerCallbacks {
passkey = defaultBLEPin;
} else {
DEBUG_MSG("Using random passkey\n");
passkey = random(
100000, 999999); // This is the passkey to be entered on peer - we pick a number >100,000 to ensure 6 digits
// This is the passkey to be entered on peer - we pick a number >100,000 to ensure 6 digits
passkey = random(100000, 999999);
}
DEBUG_MSG("*** Enter passkey %d on the peer side ***\n", passkey);

Expand All @@ -109,6 +99,7 @@ class ESP32BluetoothServerCallback : public NimBLEServerCallbacks {
screen->stopBluetoothPinScreen();
}
}

virtual void onDisconnect(NimBLEServer* pServer, ble_gap_conn_desc *desc) {
DEBUG_MSG("BLE disconnect\n");
}
Expand All @@ -129,48 +120,7 @@ void ESP32Bluetooth::shutdown()

void ESP32Bluetooth::setup()
{
// Initialise the Bluefruit module
DEBUG_MSG("Initialise the ESP32 bluetooth module\n");
//Bluefruit.autoConnLed(false);
//Bluefruit.begin();

// Set the advertised device name (keep it short!)
//Bluefruit.setName(getDeviceName());

// Set the connect/disconnect callback handlers
//Bluefruit.Periph.setConnectCallback(connect_callback);
//Bluefruit.Periph.setDisconnectCallback(disconnect_callback);

// Configure and Start the Device Information Service
DEBUG_MSG("Configuring the Device Information Service\n");
// FIXME, we should set a mfg string based on our HW_VENDOR enum
// bledis.setManufacturer(HW_VENDOR);
//bledis.setModel(optstr(HW_VERSION));
//bledis.setFirmwareRev(optstr(APP_VERSION));
//bledis.begin();

// Start the BLE Battery Service and set it to 100%
//DEBUG_MSG("Configuring the Battery Service\n");
//blebas.begin();
//blebas.write(0); // Unknown battery level for now

//bledfu.begin(); // Install the DFU helper

// Setup the Heart Rate Monitor service using
// BLEService and BLECharacteristic classes
DEBUG_MSG("Configuring the Mesh bluetooth service\n");
//setupMeshService();

// Supposedly debugging works with soft device if you disable advertising
//if (isSoftDeviceAllowed) {
// Setup the advertising packet(s)
// DEBUG_MSG("Setting up the advertising payload(s)\n");
// startAdv();

// DEBUG_MSG("Advertising\n");
//}

//NimBLEDevice::deleteAllBonds();

NimBLEDevice::init(getDeviceName());
NimBLEDevice::setPower(ESP_PWR_LVL_P9);
Expand All @@ -182,14 +132,18 @@ void ESP32Bluetooth::setup()
ESP32BluetoothServerCallback *serverCallbacks = new ESP32BluetoothServerCallback();
bleServer->setCallbacks(serverCallbacks, true);

setupService();
startAdvertising();
}

void ESP32Bluetooth::setupService()
{
NimBLEService *bleService = bleServer->createService(MESH_SERVICE_UUID);
//NimBLECharacteristic *pNonSecureCharacteristic = bleService->createCharacteristic("1234", NIMBLE_PROPERTY::READ );
//NimBLECharacteristic *pSecureCharacteristic = bleService->createCharacteristic("1235", NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::READ_AUTHEN);

//define the characteristics that the app is looking for
NimBLECharacteristic *ToRadioCharacteristic = bleService->createCharacteristic(TORADIO_UUID, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN | NIMBLE_PROPERTY::WRITE_ENC);
NimBLECharacteristic *FromRadioCharacteristic = bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC);
FromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC);
fromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC);

bluetoothPhoneAPI = new BluetoothPhoneAPI();

Expand All @@ -199,26 +153,17 @@ void ESP32Bluetooth::setup()
fromRadioCallbacks = new ESP32BluetoothFromRadioCallback();
FromRadioCharacteristic->setCallbacks(fromRadioCallbacks);

//uint8_t val[4];
//uint32_t zero = 0;
//put_le32(val, zero);
//std::string fromNumByteString(&val[0], &val[0] + sizeof(val));
//FromNumCharacteristic->setValue(fromNumByteString);

bleService->start();
//pNonSecureCharacteristic->setValue("Hello Non Secure BLE");
//pSecureCharacteristic->setValue("Hello Secure BLE");

//FromRadioCharacteristic->setValue("FromRadioString");
//ToRadioCharacteristic->setCallbacks()
}

void ESP32Bluetooth::startAdvertising()
{
NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
pAdvertising->reset();
pAdvertising->addServiceUUID(MESH_SERVICE_UUID);
pAdvertising->start(0);
}


/// Given a level between 0-100, update the BLE attribute
void updateBatteryLevel(uint8_t level)
{
Expand All @@ -228,20 +173,17 @@ void updateBatteryLevel(uint8_t level)
void ESP32Bluetooth::clearBonds()
{
DEBUG_MSG("Clearing bluetooth bonds!\n");
//bond_print_list(BLE_GAP_ROLE_PERIPH);
//bond_print_list(BLE_GAP_ROLE_CENTRAL);

//Bluefruit.Periph.clearBonds();
//Bluefruit.Central.clearBonds();
NimBLEDevice::deleteAllBonds();
}

void clearNVS() {
void clearNVS()
{
NimBLEDevice::deleteAllBonds();
ESP.restart();
}

void disablePin() {
void disablePin()
{
DEBUG_MSG("User Override, disabling bluetooth pin requirement\n");
// keep track of when it was pressed, so we know it was within X seconds

Expand All @@ -261,4 +203,4 @@ void disablePin() {
doublepressed = millis();
}

#endif
#endif
22 changes: 5 additions & 17 deletions src/platform/esp32/ESP32Bluetooth.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,20 @@

#pragma once

extern uint16_t fromNumValHandle;

class BluetoothPhoneAPI : public PhoneAPI
{
protected:
/**
* Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies)
*/
virtual void onNowHasData(uint32_t fromRadioNum) override;

/// Check the current underlying physical link to see if the client is currently connected
virtual bool checkIsConnected() override;
};

extern PhoneAPI *bluetoothPhoneAPI;

class ESP32Bluetooth
{
public:
void setup();
void shutdown();
void clearBonds();

private:
void setupService();
void startAdvertising();
};

void setBluetoothEnable(bool on);
void clearNVS();
void disablePin();

#endif
#endif

0 comments on commit 97712a9

Please sign in to comment.