#pragma once #include "../BaseSerialInterface.h" #include #ifndef BLE_TX_POWER #define BLE_TX_POWER 4 #endif class SerialBLEInterface : public BaseSerialInterface { BLEUart bleuart; bool _isEnabled; bool _isDeviceConnected; uint16_t _conn_handle; unsigned long _last_health_check; unsigned long _last_retry_attempt; struct Frame { uint8_t len; uint8_t buf[MAX_FRAME_SIZE]; }; #define FRAME_QUEUE_SIZE 12 uint8_t send_queue_len; Frame send_queue[FRAME_QUEUE_SIZE]; uint8_t recv_queue_len; Frame recv_queue[FRAME_QUEUE_SIZE]; void clearBuffers(); void shiftSendQueueLeft(); void shiftRecvQueueLeft(); bool isValidConnection(uint16_t handle, bool requireWaitingForSecurity = false) const; bool isAdvertising() const; static void onConnect(uint16_t connection_handle); static void onDisconnect(uint16_t connection_handle, uint8_t reason); static void onSecured(uint16_t connection_handle); static bool onPairingPasskey(uint16_t connection_handle, uint8_t const passkey[6], bool match_request); static void onPairingComplete(uint16_t connection_handle, uint8_t auth_status); static void onBLEEvent(ble_evt_t* evt); static void onBleUartRX(uint16_t conn_handle); public: SerialBLEInterface() { _isEnabled = false; _isDeviceConnected = false; _conn_handle = BLE_CONN_HANDLE_INVALID; _last_health_check = 0; _last_retry_attempt = 0; send_queue_len = 0; recv_queue_len = 0; } void begin(const char* device_name, uint32_t pin_code); void disconnect(); void enable() override; void disable() override; bool isEnabled() const override { return _isEnabled; } bool isConnected() const override; bool isWriteBusy() const override; size_t writeFrame(const uint8_t src[], size_t len) override; size_t checkRecvFrame(uint8_t dest[]) override; }; #if BLE_DEBUG_LOGGING && ARDUINO #include #define BLE_DEBUG_PRINT(F, ...) Serial.printf("BLE: " F, ##__VA_ARGS__) #define BLE_DEBUG_PRINTLN(F, ...) Serial.printf("BLE: " F "\n", ##__VA_ARGS__) #else #define BLE_DEBUG_PRINT(...) {} #define BLE_DEBUG_PRINTLN(...) {} #endif