3#include <zephyr/kernel.h>
4#include <bluetooth/services/nus.h>
10#include <zephyr/sys/ring_buffer.h>
21static const char *
const TAG =
"ble_nus";
24 if (atomic_get(&this->
tx_status_) == TX_DISABLED) {
27 return ring_buf_put(&global_ble_tx_ring_buf, data,
len);
46 ESP_LOGVV(TAG,
"Sent operation completed");
51 case BT_NUS_SEND_STATUS_ENABLED:
58 ESP_LOGD(TAG,
"NUS notification has been enabled");
60 case BT_NUS_SEND_STATUS_DISABLED:
62 ESP_LOGD(TAG,
"NUS notification has been disabled");
68 ESP_LOGD(TAG,
"Received %d bytes.",
len);
72 bt_nus_cb callbacks = {
78 bt_nus_init(&callbacks);
80 static bt_conn_cb conn_callbacks = {
85 bt_conn_cb_register(&conn_callbacks);
91 [
this](
int level,
const char *tag,
const char *
message,
size_t message_len) {
94 this->
write_array(
reinterpret_cast<const uint8_t *
>(&c), 1);
102 ESP_LOGCONFIG(TAG,
"ble nus:");
103 ESP_LOGCONFIG(TAG,
" log: %s", YESNO(this->
expose_log_));
105 bt_conn *conn = this->
conn_.load();
107 mtu = bt_nus_get_mtu(conn);
109 ESP_LOGCONFIG(TAG,
" MTU: %u", mtu);
113 if (ring_buf_is_empty(&global_ble_tx_ring_buf)) {
117 if (!atomic_cas(&this->
tx_status_, TX_ENABLED, TX_BUSY)) {
118 if (atomic_get(&this->
tx_status_) == TX_DISABLED) {
119 ring_buf_reset(&global_ble_tx_ring_buf);
124 bt_conn *conn = this->
conn_.load();
126 conn = bt_conn_ref(conn);
129 if (
nullptr == conn) {
130 atomic_cas(&this->
tx_status_, TX_BUSY, TX_ENABLED);
134 uint32_t req_len = bt_nus_get_mtu(conn);
137 uint32_t size = ring_buf_get_claim(&global_ble_tx_ring_buf, &buf, req_len);
141 err = bt_nus_send(conn, buf, size);
142 err2 = ring_buf_get_finish(&global_ble_tx_ring_buf, size);
145 ESP_LOGE(TAG,
"Size %u exceeds valid bytes in the ring buffer (%d error)", size, err2);
148 ESP_LOGVV(TAG,
"Sent %d bytes", size);
150 ESP_LOGE(TAG,
"Failed to send %d bytes (%d error)", size, err);
151 atomic_cas(&this->
tx_status_, TX_BUSY, TX_ENABLED);
void schedule_dump_config()
static void disconnected(bt_conn *conn, uint8_t reason)
static void rx_callback(bt_conn *conn, const uint8_t *data, uint16_t len)
static void connected(bt_conn *conn, uint8_t err)
std::atomic< bt_conn * > conn_
static void tx_callback(bt_conn *conn)
void dump_config() override
size_t write_array(const uint8_t *data, size_t len)
static void send_enabled_callback(bt_nus_send_status status)
void add_on_log_callback(std::function< void(uint8_t, const char *, const char *, size_t)> &&callback)
Register a callback that will be called for every log message sent.
constexpr size_t BLE_TX_BUF_SIZE
RING_BUF_DECLARE(global_ble_tx_ring_buf, BLE_TX_BUF_SIZE)
Application App
Global storage of Application pointer - only one Application can exist.