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# if defined(CONFIG_NIMBLE_CPP_IDF)
25# include "nimble/nimble_npl.h"
27# include "nimble/nimble/include/nimble/nimble_npl.h"
31# include <type_traits>
34# if NIMBLE_CPP_ARDUINO_STRING_AVAILABLE
42 virtual size_t write(uint8_t) = 0;
43 virtual size_t write(
const uint8_t* buffer,
size_t size) = 0;
44 size_t print(
const char* s);
45 size_t println(
const char* s);
46 size_t printf(
const char* format, ...) __attribute__((format(printf, 2, 3)));
49class Stream : public Print {
51 virtual int available() = 0;
52 virtual int read() = 0;
53 virtual int peek() = 0;
54 virtual void flush() {}
55 void setTimeout(
unsigned long timeout) { m_timeout = timeout; }
56 unsigned long getTimeout()
const {
return m_timeout; }
59 unsigned long m_timeout{0};
63class NimBLEStream :
public Stream {
65 enum RxOverflowAction {
70 using RxOverflowCallback = std::function<RxOverflowAction(
const uint8_t* data,
size_t len,
void* userArg)>;
72 NimBLEStream() =
default;
73 virtual ~NimBLEStream() { end(); }
76 virtual size_t write(
const uint8_t* data,
size_t len)
override;
77 virtual size_t write(uint8_t data)
override {
return write(&data, 1); }
81 typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, uint8_t>::value,
size_t>::type write(T data) {
82 return write(
static_cast<uint8_t
>(data));
85 size_t availableForWrite()
const;
88 size_t read(uint8_t* buffer,
size_t len);
91 virtual int available()
override;
92 virtual int read()
override;
93 virtual int peek()
override;
94 virtual bool ready()
const = 0;
101 void setRxOverflowCallback(RxOverflowCallback cb,
void* userArg =
nullptr) {
102 m_rxOverflowCallback = cb;
103 m_rxOverflowUserArg = userArg;
106 operator bool()
const {
return ready(); }
110 struct ByteRingBuffer;
115 size_t pushRx(
const uint8_t* data,
size_t len);
117 virtual bool send() = 0;
118 static void txDrainEventCb(
struct ble_npl_event* ev);
119 static void txDrainCalloutCb(
struct ble_npl_event* ev);
121 ByteRingBuffer* m_txBuf{
nullptr};
122 ByteRingBuffer* m_rxBuf{
nullptr};
123 uint8_t m_txChunkBuf[MYNEWT_VAL(BLE_ATT_PREFERRED_MTU)];
124 uint32_t m_txBufSize{1024};
125 uint32_t m_rxBufSize{1024};
126 ble_npl_event m_txDrainEvent{};
127 ble_npl_callout m_txDrainCallout{};
128 RxOverflowCallback m_rxOverflowCallback{
nullptr};
129 void* m_rxOverflowUserArg{
nullptr};
130 bool m_coInitialized{
false};
131 bool m_eventInitialized{
false};
134# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
135# include "NimBLECharacteristic.h"
137class NimBLEStreamServer :
public NimBLEStream {
139 NimBLEStreamServer() : m_charCallbacks(this) {}
140 ~NimBLEStreamServer()
override { end(); }
143 NimBLEStreamServer(
const NimBLEStreamServer&) =
delete;
144 NimBLEStreamServer& operator=(
const NimBLEStreamServer&) =
delete;
146 bool begin(NimBLECharacteristic* chr, uint32_t txBufSize = 1024, uint32_t rxBufSize = 1024);
151 uint32_t txBufSize = 1024,
152 uint32_t rxBufSize = 1024,
153 bool secure =
false);
156 size_t write(
const uint8_t* data,
size_t len)
override;
157 uint16_t getPeerHandle()
const {
return m_charCallbacks.m_peerHandle; }
158 void setCallbacks(NimBLECharacteristicCallbacks* pCallbacks) { m_charCallbacks.m_userCallbacks = pCallbacks; }
159 bool ready()
const override;
160 virtual void flush()
override;
162 using NimBLEStream::write;
165 bool send()
override;
167 struct ChrCallbacks :
public NimBLECharacteristicCallbacks {
168 ChrCallbacks(NimBLEStreamServer* parent)
169 : m_parent(parent), m_userCallbacks(nullptr), m_peerHandle(BLE_HS_CONN_HANDLE_NONE) {}
170 void onWrite(NimBLECharacteristic* pCharacteristic,
NimBLEConnInfo& connInfo)
override;
171 void onSubscribe(NimBLECharacteristic* pCharacteristic,
NimBLEConnInfo& connInfo, uint16_t subValue)
override;
172 void onStatus(NimBLECharacteristic* pCharacteristic,
NimBLEConnInfo& connInfo,
int code)
override;
174 void onStatus(NimBLECharacteristic* pCharacteristic,
int code)
override {
175 if (m_userCallbacks !=
nullptr) {
176 m_userCallbacks->onStatus(pCharacteristic, code);
180 NimBLEStreamServer* m_parent;
181 NimBLECharacteristicCallbacks* m_userCallbacks;
182 uint16_t m_peerHandle;
185 NimBLECharacteristic* m_pChr{
nullptr};
188 bool m_deleteSvcOnEnd{
false};
192# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
193# include "NimBLERemoteCharacteristic.h"
195class NimBLEStreamClient :
public NimBLEStream {
197 NimBLEStreamClient() =
default;
198 ~NimBLEStreamClient()
override { end(); }
201 NimBLEStreamClient(
const NimBLEStreamClient&) =
delete;
202 NimBLEStreamClient& operator=(
const NimBLEStreamClient&) =
delete;
206 bool begin(NimBLERemoteCharacteristic* pChr,
207 bool subscribeNotify =
false,
208 uint32_t txBufSize = 1024,
209 uint32_t rxBufSize = 1024);
211 void setNotifyCallback(NimBLERemoteCharacteristic::notify_callback cb) { m_userNotifyCallback = cb; }
212 bool ready()
const override;
213 virtual void flush()
override;
215 using NimBLEStream::write;
218 bool send()
override;
219 void notifyCallback(NimBLERemoteCharacteristic* pChar, uint8_t* pData,
size_t len,
bool isNotify);
221 NimBLERemoteCharacteristic* m_pChr{
nullptr};
222 NimBLERemoteCharacteristic::notify_callback m_userNotifyCallback{
nullptr};
Connection information.
Definition NimBLEConnInfo.h:33
A model of a BLE UUID.
Definition NimBLEUUID.h:41