blob: de70495e829f58ee15f3bc11789a1cc74e3fdc17 [file] [log] [blame]
/*
* Copyright (c) 2024 Croxel, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_NUS_INST_H_
#define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_NUS_INST_H_
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/sys/iterable_sections.h>
#include <zephyr/sys/slist.h>
#ifdef __cplusplus
extern "C" {
#endif
struct bt_nus_inst {
/** Pointer to the NUS Service Instance */
const struct bt_gatt_service_static *svc;
/** List of subscribers to invoke callbacks on asynchronous events */
sys_slist_t *cbs;
};
#define BT_UUID_NUS_SERVICE BT_UUID_DECLARE_128(BT_UUID_NUS_SRV_VAL)
#define BT_UUID_NUS_TX_CHAR BT_UUID_DECLARE_128(BT_UUID_NUS_TX_CHAR_VAL)
#define BT_UUID_NUS_RX_CHAR BT_UUID_DECLARE_128(BT_UUID_NUS_RX_CHAR_VAL)
/** Required as the service may be instantiated outside of the module */
ssize_t nus_bt_chr_write(struct bt_conn *conn, const struct bt_gatt_attr *attr,
const void *buf, uint16_t len, uint16_t offset, uint8_t flags);
void nus_ccc_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value);
#define Z_INTERNAL_BT_NUS_INST_DEFINE(_name) \
\
BT_GATT_SERVICE_DEFINE(_name##_svc, \
BT_GATT_PRIMARY_SERVICE(BT_UUID_NUS_SERVICE), \
BT_GATT_CHARACTERISTIC(BT_UUID_NUS_TX_CHAR, \
BT_GATT_CHRC_NOTIFY, \
BT_GATT_PERM_NONE, \
NULL, NULL, NULL), \
BT_GATT_CCC(nus_ccc_cfg_changed, \
BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), \
BT_GATT_CHARACTERISTIC(BT_UUID_NUS_RX_CHAR, \
BT_GATT_CHRC_WRITE | \
BT_GATT_CHRC_WRITE_WITHOUT_RESP, \
BT_GATT_PERM_WRITE, \
NULL, nus_bt_chr_write, NULL), \
); \
\
sys_slist_t _name##_cbs = SYS_SLIST_STATIC_INIT(&_name##_cbs); \
\
STRUCT_SECTION_ITERABLE(bt_nus_inst, _name) = { \
.svc = &_name##_svc, \
.cbs = &_name##_cbs, \
}
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_NUS_INST_H_ */