133 lines
3.2 KiB
C++
133 lines
3.2 KiB
C++
// Copyright (C) 2024, Mark Qvist
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
#include "Boards.h"
|
|
|
|
#if PLATFORM != PLATFORM_NRF52
|
|
#if HAS_BLE
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include <BLEDevice.h>
|
|
#include <BLEUtils.h>
|
|
#include <BLEServer.h>
|
|
#include <BLE2902.h>
|
|
|
|
template <size_t n>
|
|
class BLEFIFO {
|
|
private:
|
|
uint8_t buffer[n];
|
|
int head = 0;
|
|
int tail = 0;
|
|
|
|
public:
|
|
void push(uint8_t value) {
|
|
buffer[head] = value;
|
|
head = (head + 1) % n;
|
|
if (head == tail) { tail = (tail + 1) % n; }
|
|
}
|
|
|
|
int pop() {
|
|
if (head == tail) {
|
|
return -1;
|
|
} else {
|
|
uint8_t value = buffer[tail];
|
|
tail = (tail + 1) % n;
|
|
return value;
|
|
}
|
|
}
|
|
|
|
void clear() { head = 0; tail = 0; }
|
|
|
|
int get(size_t index) {
|
|
if (index >= this->getLength()) {
|
|
return -1;
|
|
} else {
|
|
return buffer[(tail + index) % n];
|
|
}
|
|
}
|
|
|
|
size_t getLength() {
|
|
if (head >= tail) {
|
|
return head - tail;
|
|
} else {
|
|
return n - tail + head;
|
|
}
|
|
}
|
|
};
|
|
|
|
#define RX_BUFFER_SIZE 6144
|
|
#define BLE_BUFFER_SIZE 512 // Must fit in max GATT attribute length
|
|
#define MIN_MTU 50
|
|
|
|
class BLESerial : public BLECharacteristicCallbacks, public BLEServerCallbacks, public BLESecurityCallbacks, public Stream {
|
|
public:
|
|
BLESerial();
|
|
|
|
void begin(const char *name);
|
|
void end();
|
|
void onWrite(BLECharacteristic *characteristic);
|
|
int available();
|
|
int peek();
|
|
int read();
|
|
size_t readBytes(uint8_t *buffer, size_t bufferSize);
|
|
size_t write(uint8_t byte);
|
|
size_t write(const uint8_t *buffer, size_t bufferSize);
|
|
size_t print(const char *value);
|
|
void flush();
|
|
void onConnect(BLEServer *server);
|
|
void onDisconnect(BLEServer *server);
|
|
|
|
uint32_t onPassKeyRequest();
|
|
void onPassKeyNotify(uint32_t passkey);
|
|
bool onSecurityRequest();
|
|
void onAuthenticationComplete(esp_ble_auth_cmpl_t);
|
|
bool onConfirmPIN(uint32_t pin);
|
|
|
|
bool connected();
|
|
|
|
BLEServer *ble_server;
|
|
BLEAdvertising *ble_adv;
|
|
BLEService *SerialService;
|
|
BLECharacteristic *TxCharacteristic;
|
|
BLECharacteristic *RxCharacteristic;
|
|
size_t transmitBufferLength;
|
|
unsigned long long lastFlushTime;
|
|
|
|
private:
|
|
BLESerial(BLESerial const &other) = delete;
|
|
void operator=(BLESerial const &other) = delete;
|
|
|
|
BLEFIFO<RX_BUFFER_SIZE> rx_buffer;
|
|
size_t numAvailableLines;
|
|
uint8_t transmitBuffer[BLE_BUFFER_SIZE];
|
|
|
|
int ConnectedDeviceCount;
|
|
void SetupSerialService();
|
|
|
|
uint16_t peerMTU;
|
|
uint16_t maxTransferSize = BLE_BUFFER_SIZE;
|
|
|
|
bool checkMTU();
|
|
|
|
const char *BLE_SERIAL_SERVICE_UUID = "6e400001-b5a3-f393-e0a9-e50e24dcca9e";
|
|
const char *BLE_RX_UUID = "6e400002-b5a3-f393-e0a9-e50e24dcca9e";
|
|
const char *BLE_TX_UUID = "6e400003-b5a3-f393-e0a9-e50e24dcca9e";
|
|
|
|
bool started = false;
|
|
};
|
|
|
|
#endif
|
|
#endif |