5#ifndef esp32bledumbdisplay_h
6#define esp32bledumbdisplay_h
17 #error DDBLESerialIO is for ESP32
30#include "dumbdisplay.h"
32#define DD_SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
33#define DD_CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
34#define DD_CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
36#define DD_RECEIVE_BUFFER_SIZE 256
37#define DD_SEND_BUFFER_SIZE 20
55 DDBLESerialIO(
const String& deviceName,
bool enableSerial =
false,
56 unsigned long serialBaud = DD_SERIAL_BAUD):
58 this->deviceName = deviceName;
59 this->initialized =
false;
64 const char* getWhat() {
68 return pCallbacks->available();
71 return pCallbacks->read();
73 void print(
const String &s) {
74 pCallbacks->print(s.c_str());
76 void print(
const char *p) {
79 void write(uint8_t b) {
82 bool preConnect(
bool firstCall) {
84 if (!setupForSerial) {
88 DDInputOutput::preConnect(firstCall);
92 if (!willUseSerial()) {
94 if (!Serial) Serial.begin(DD_SERIAL_BAUD);
96 Serial.println(
"ble address: " + address);
105 if (pServerCallbacks->isDisconnected()) {
106 pServerCallbacks->restartAdvertising();
113 void validConnection() {
114 if (pServerCallbacks->isDisconnected()) {
116 pServerCallbacks->restartAdvertising();
118 Serial.println(
"... connection lost ... waiting for re-connection ...");
122 bool canConnectPassive() {
125 bool canUseBuffer() {
129 class ServerCallbacks:
public BLEServerCallbacks {
131 ServerCallbacks(BLEServer* pServer) {
132 this->pServer = pServer;
133 this->connectionState = 0;
136 void restartAdvertising() {
137 pServer->startAdvertising();
140 Serial.println(
"restarted advertising");
143 bool isDisconnected() {
return connectionState == -1; }
144 bool isConnected() {
return connectionState == 1; }
145 bool isConnecting() {
return connectionState == 0; }
147 void onConnect(BLEServer* pServer) {
150 Serial.println(
"BLE connected");
153 void onDisconnect(BLEServer* pServer) {
154 connectionState = -1;
156 Serial.println(
"BLE disconnected");
163 class Callbacks:
public BLECharacteristicCallbacks {
165 Callbacks(BLECharacteristic *pTx, ServerCallbacks* pServerCallbacks) {
167 this->pServerCallbacks = pServerCallbacks;
168 this->buffering =
false;
169 this->bufferStart = 0;
171#ifdef DD_SEND_BUFFER_SIZE
172 this->sendBufferSize = 0;
176#ifdef CONFIG_IDF_INIT_VERSION
177 void print(String s) {
179 void print(std::string s) {
181#ifdef DD_SEND_BUFFER_SIZE
182 int len = s.length();
183 if ((len + sendBufferSize) > DD_SEND_BUFFER_SIZE) {
185 if (len > DD_SEND_BUFFER_SIZE) {
190 for (
int i = 0; i < len; i++) {
191 sendBuffer[sendBufferSize++] = s[i];
193 if (sendBufferSize > 0 && sendBuffer[sendBufferSize - 1] ==
'\n') {
200 void write(uint8_t b) {
212 return bufferStart != bufferEnd;
220 char c = buffer[bufferStart];
221 if (++bufferStart >= DD_RECEIVE_BUFFER_SIZE) {
230#ifdef DD_SEND_BUFFER_SIZE
231 void _flushSendBuffer() {
232 if (sendBufferSize > 0) {
233 sendBuffer[sendBufferSize] = 0;
239#ifdef CONFIG_IDF_INIT_VERSION
240 void _print(String s) {
242 void _print(std::string s) {
244#if defined(DD_DEBUG_BLE_SEND)
245 if (pServerCallbacks->isConnected()) {
246 }
else if (pServerCallbacks->isConnecting()) {
247 Serial.print(
"[connecting] ");
249 Serial.print(
"[not connected] ");
251 Serial.print(
"BLE sent ... [");
252 Serial.print(s.c_str());
255 int len = s.length();
266#ifdef CONFIG_IDF_INIT_VERSION
267 pTx->setValue(s.substring(0, 20));
269 pTx->setValue(s.substr(0, 20));
276#ifdef CONFIG_IDF_INIT_VERSION
286 void onWrite(BLECharacteristic *pCharacteristic) {
288#ifdef CONFIG_IDF_INIT_VERSION
289 String rxValue = pCharacteristic->getValue();
290 int count = rxValue.length();
292 std::string rxValue = pCharacteristic->getValue();
293 int count = rxValue.size();
295 for (
int i = 0; i < count; i++) {
296 int nextBufferEnd = bufferEnd + 1;
297 if (nextBufferEnd >= DD_RECEIVE_BUFFER_SIZE) {
300 if (nextBufferEnd == bufferStart) {
303 buffer[bufferEnd] = rxValue[i];
304 bufferEnd = nextBufferEnd;
306#ifdef DD_DEBUG_BLE_RECEIVE
307 Serial.print(
"BLE received ... ");
309 Serial.print(
" ... [");
310 Serial.print(rxValue.c_str());
311 Serial.print(
"] ==> ");
312 Serial.print(bufferStart);
314 Serial.print(bufferEnd);
316 Serial.print(DD_RECEIVE_BUFFER_SIZE);
322 BLECharacteristic *pTx;
323 ServerCallbacks* pServerCallbacks;
324 volatile bool buffering;
327 char buffer[DD_RECEIVE_BUFFER_SIZE];
328#ifdef DD_SEND_BUFFER_SIZE
329 uint8_t sendBufferSize;
330 char sendBuffer[DD_SEND_BUFFER_SIZE + 1];
336 Serial.println(
"initialized BLE ...");
338 BLEDevice::init(deviceName.c_str());
339 BLEServer *pServer = BLEDevice::createServer();
340 pServerCallbacks =
new ServerCallbacks(pServer);
341 pServer->setCallbacks(pServerCallbacks);
342 BLEService *pService = pServer->createService(DD_SERVICE_UUID);
343 BLECharacteristic *pTx = pService->createCharacteristic(
344 DD_CHARACTERISTIC_UUID_TX,
346 BLECharacteristic::PROPERTY_NOTIFY
348 BLECharacteristic::PROPERTY_INDICATE
351 pTx->addDescriptor(
new BLE2902());
352 BLECharacteristic *pRx = pService->createCharacteristic(
353 DD_CHARACTERISTIC_UUID_RX,
354 BLECharacteristic::PROPERTY_WRITE
356 pCallbacks =
new Callbacks(pTx, pServerCallbacks);
357 pRx->setCallbacks(pCallbacks);
359 pServer->getAdvertising()->start();
361 address = BLEDevice::getAddress().toString().c_str();
362 address.toUpperCase();
365 Serial.println(
"... done initialized BLE ... waiting for connection ...");
372 ServerCallbacks* pServerCallbacks;
373 Callbacks* pCallbacks;
Subclass of DDInputOutput.
Definition: esp32bledumbdisplay.h:49