/* * 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 #include #include #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_ */