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