18#ifndef NIMBLE_CPP_STREAM_H
19#define NIMBLE_CPP_STREAM_H
21#include "syscfg/syscfg.h"
22#if CONFIG_BT_NIMBLE_ENABLED && (MYNEWT_VAL(BLE_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_ROLE_CENTRAL))
24# ifdef USING_NIMBLE_ARDUINO_HEADERS
25# include "nimble/nimble/include/nimble/nimble_npl.h"
27# include "nimble/nimble_npl.h"
31# include <type_traits>
34# ifndef NIMBLE_CPP_ARDUINO_STRING_AVAILABLE
35# define NIMBLE_CPP_ARDUINO_STRING_AVAILABLE (__has_include(<Arduino.h>))
38# if NIMBLE_CPP_ARDUINO_STRING_AVAILABLE
46 virtual size_t write(uint8_t) = 0;
47 virtual size_t write(
const uint8_t* buffer,
size_t size) = 0;
48 size_t print(
const char* s);
49 size_t println(
const char* s);
50 size_t printf(
const char* format, ...) __attribute__((format(printf, 2, 3)));
53class Stream : public Print {
55 virtual int available() = 0;
56 virtual int read() = 0;
57 virtual int peek() = 0;
58 virtual void flush() {}
59 void setTimeout(
unsigned long timeout) { m_timeout = timeout; }
60 unsigned long getTimeout()
const {
return m_timeout; }
63 unsigned long m_timeout{0};
67class NimBLEStream :
public Stream {
69 enum RxOverflowAction {
74 using RxOverflowCallback = std::function<RxOverflowAction(
const uint8_t* data,
size_t len,
void* userArg)>;
76 NimBLEStream() =
default;
77 virtual ~NimBLEStream() { end(); }
80 virtual size_t write(
const uint8_t* data,
size_t len)
override;
81 virtual size_t write(uint8_t data)
override {
return write(&data, 1); }
85 typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, uint8_t>::value,
size_t>::type write(T data) {
86 return write(
static_cast<uint8_t
>(data));
89 size_t availableForWrite()
const;
92 size_t read(uint8_t* buffer,
size_t len);
95 virtual int available()
override;
96 virtual int read()
override;
97 virtual int peek()
override;
98 virtual bool ready()
const = 0;
105 void setRxOverflowCallback(RxOverflowCallback cb,
void* userArg =
nullptr) {
106 m_rxOverflowCallback = cb;
107 m_rxOverflowUserArg = userArg;
110 operator bool()
const {
return ready(); }
114 struct ByteRingBuffer;
119 size_t pushRx(
const uint8_t* data,
size_t len);
121 virtual bool send() = 0;
122 static void txDrainEventCb(
struct ble_npl_event* ev);
123 static void txDrainCalloutCb(
struct ble_npl_event* ev);
125 ByteRingBuffer* m_txBuf{
nullptr};
126 ByteRingBuffer* m_rxBuf{
nullptr};
127 uint8_t m_txChunkBuf[MYNEWT_VAL(BLE_ATT_PREFERRED_MTU)];
128 uint32_t m_txBufSize{1024};
129 uint32_t m_rxBufSize{1024};
130 ble_npl_event m_txDrainEvent{};
131 ble_npl_callout m_txDrainCallout{};
132 RxOverflowCallback m_rxOverflowCallback{
nullptr};
133 void* m_rxOverflowUserArg{
nullptr};
134 bool m_coInitialized{
false};
135 bool m_eventInitialized{
false};
138# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
139# include "NimBLECharacteristic.h"
141class NimBLEStreamServer :
public NimBLEStream {
143 NimBLEStreamServer() : m_charCallbacks(this) {}
144 ~NimBLEStreamServer()
override { end(); }
147 NimBLEStreamServer(
const NimBLEStreamServer&) =
delete;
148 NimBLEStreamServer& operator=(
const NimBLEStreamServer&) =
delete;
150 bool begin(NimBLECharacteristic* chr, uint32_t txBufSize = 1024, uint32_t rxBufSize = 1024);
155 uint32_t txBufSize = 1024,
156 uint32_t rxBufSize = 1024,
157 bool secure =
false);
160 size_t write(
const uint8_t* data,
size_t len)
override;
161 uint16_t getPeerHandle()
const {
return m_charCallbacks.m_peerHandle; }
162 void setCallbacks(NimBLECharacteristicCallbacks* pCallbacks) { m_charCallbacks.m_userCallbacks = pCallbacks; }
163 bool ready()
const override;
164 virtual void flush()
override;
166 using NimBLEStream::write;
169 bool send()
override;
171 struct ChrCallbacks :
public NimBLECharacteristicCallbacks {
172 ChrCallbacks(NimBLEStreamServer* parent)
173 : m_parent(parent), m_userCallbacks(nullptr), m_peerHandle(BLE_HS_CONN_HANDLE_NONE) {}
174 void onWrite(NimBLECharacteristic* pCharacteristic,
NimBLEConnInfo& connInfo)
override;
175 void onSubscribe(NimBLECharacteristic* pCharacteristic,
NimBLEConnInfo& connInfo, uint16_t subValue)
override;
176 void onStatus(NimBLECharacteristic* pCharacteristic,
NimBLEConnInfo& connInfo,
int code)
override;
178 void onStatus(NimBLECharacteristic* pCharacteristic,
int code)
override {
179 if (m_userCallbacks !=
nullptr) {
180 m_userCallbacks->onStatus(pCharacteristic, code);
184 NimBLEStreamServer* m_parent;
185 NimBLECharacteristicCallbacks* m_userCallbacks;
186 uint16_t m_peerHandle;
189 NimBLECharacteristic* m_pChr{
nullptr};
192 bool m_deleteSvcOnEnd{
false};
196# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
197# include "NimBLERemoteCharacteristic.h"
199class NimBLEStreamClient :
public NimBLEStream {
201 NimBLEStreamClient() =
default;
202 ~NimBLEStreamClient()
override { end(); }
205 NimBLEStreamClient(
const NimBLEStreamClient&) =
delete;
206 NimBLEStreamClient& operator=(
const NimBLEStreamClient&) =
delete;
210 bool begin(NimBLERemoteCharacteristic* pChr,
211 bool subscribeNotify =
false,
212 uint32_t txBufSize = 1024,
213 uint32_t rxBufSize = 1024);
215 void setNotifyCallback(NimBLERemoteCharacteristic::notify_callback cb) { m_userNotifyCallback = cb; }
216 bool ready()
const override;
217 virtual void flush()
override;
219 using NimBLEStream::write;
222 bool send()
override;
223 void notifyCallback(NimBLERemoteCharacteristic* pChar, uint8_t* pData,
size_t len,
bool isNotify);
225 NimBLERemoteCharacteristic* m_pChr{
nullptr};
226 NimBLERemoteCharacteristic::notify_callback m_userNotifyCallback{
nullptr};
Connection information.
Definition NimBLEConnInfo.h:33
A model of a BLE UUID.
Definition NimBLEUUID.h:41