LedDisplay/firmware/src/BluetoothLeUartServer.cpp

112 lines
3.3 KiB
C++

#include "BluetoothLeUartServer.h"
BluetoothLeUartServer::BluetoothLeUartServer(String deviceName, const char uartServiceUUID[36], const char rxUUID[36], const char txUUID[36])
{
this->uartServiceUUID = uartServiceUUID;
this->rxUUID = rxUUID;
this->txUUID = txUUID;
this->callbacks = nullptr;
this->deviceConnected = false;
this->deviceConnectionId = -1;
// Create the BLE Device
BLEDevice::init(deviceName.c_str()); // Give it a name
// Create the BLE Server
bleServer = BLEDevice::createServer();
bleServer->setCallbacks(this);
// Create the BLE Service
bleService = bleServer->createService(this->uartServiceUUID);
// Create a BLE Characteristic
txCharacteristic = bleService->createCharacteristic(
this->txUUID,
BLECharacteristic::PROPERTY_NOTIFY);
txCharacteristic->addDescriptor(new BLE2902());
rxCharacteristic = bleService->createCharacteristic(
this->rxUUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE);
rxCharacteristic->setCallbacks(this);
// Start the service
bleService->start();
// Start advertising
bleServer->getAdvertising()->addServiceUUID(bleService->getUUID());
bleServer->getAdvertising()->setScanResponse(true);
bleServer->getAdvertising()->setMinPreferred(0x06); // functions that help with iPhone connections issue
bleServer->getAdvertising()->setMinPreferred(0x12);
bleServer->getAdvertising()->start();
}
void BluetoothLeUartServer::setCallbacks(BluetoothLeUartServerCallbacks *callbacks)
{
this->callbacks = callbacks;
}
void BluetoothLeUartServer::sendData(String data)
{
//txCharacteristic->setValue(data.c_str());
//Serial.printf("String is : '%s' with length of %d\n", data.c_str(), data.length() );
txCharacteristic->setValue((uint8_t*)data.c_str(),data.length());
txCharacteristic->notify();
}
bool BluetoothLeUartServer::getDeviceConnected()
{
return this->deviceConnected;
}
bool BluetoothLeUartServer::disconnectCurrentDevice() {
if(!this->getDeviceConnected())
return false;
this->bleServer->disconnect(this->deviceConnectionId);
return true;
}
String BluetoothLeUartServer::getDeviceAddress() {
String address = BLEDevice::getAddress().toString().c_str();
address.toUpperCase();
return address;
}
void BluetoothLeUartServer::onConnect(BLEServer* pServer, esp_ble_gatts_cb_param_t *param)
{
// only allow one device
if(this->deviceConnected)
return this->bleServer->disconnect(param->connect.conn_id);
this->deviceConnected = true;
this->deviceConnectionId = param->connect.conn_id;
if (this->callbacks != nullptr)
{
this->callbacks->onDeviceConnectedChanged(this->deviceConnected);
}
}
void BluetoothLeUartServer::onDisconnect(BLEServer *pServer)
{
this->deviceConnected = false;
this->deviceConnectionId = -1;
bleServer->getAdvertising()->start();
Serial.println("Restart advertising after disconnect ...");
if (this->callbacks != nullptr)
this->callbacks->onDeviceConnectedChanged(this->deviceConnected);
}
void BluetoothLeUartServer::onWrite(BLECharacteristic *rxCharacteristic)
{
if (this->callbacks != nullptr)
this->callbacks->onDataReceived(rxCharacteristic->getValue().c_str());
}