1 /*
2  * Copyright (c) 2024 Croxel, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_NUS_H_
8 #define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_NUS_H_
9 
10 #include <zephyr/bluetooth/uuid.h>
11 #include <zephyr/bluetooth/services/nus/inst.h>
12 #include <zephyr/sys/slist.h>
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /** @brief UUIDs of Nordic UART GATT Service.
19  * Service: 6e400001-b5a3-f393-e0a9-e50e24dcca9e
20  * RX Char: 6e400002-b5a3-f393-e0a9-e50e24dcca9e
21  * TX Char: 6e400003-b5a3-f393-e0a9-e50e24dcca9e
22  */
23 #define BT_UUID_NUS_SRV_VAL \
24 	BT_UUID_128_ENCODE(0x6e400001, 0xb5a3, 0xf393, 0xe0a9, 0xe50e24dcca9e)
25 #define BT_UUID_NUS_RX_CHAR_VAL \
26 	BT_UUID_128_ENCODE(0x6e400002, 0xb5a3, 0xf393, 0xe0a9, 0xe50e24dcca9e)
27 #define BT_UUID_NUS_TX_CHAR_VAL \
28 	BT_UUID_128_ENCODE(0x6e400003, 0xb5a3, 0xf393, 0xe0a9, 0xe50e24dcca9e)
29 
30 /** @brief Macro to define instance of NUS Service. It allows users to
31  * define multiple NUS instances, analogous to Serial endpoints, and use each
32  * one for different purposes. A default NUS instance may be defined through
33  * Kconfig.
34  */
35 #define BT_NUS_INST_DEFINE(_name) \
36 	Z_INTERNAL_BT_NUS_INST_DEFINE(_name)
37 
38 /** @brief Callbacks for getting notified on NUS Service occurrences */
39 struct bt_nus_cb {
40 	/** @brief Notifications subscription changed
41 	 *
42 	 * @param enabled Flag that is true if notifications were enabled, false
43 	 *                if they were disabled.
44 	 * @param ctx User context provided in the callback structure.
45 	 */
46 	void (*notif_enabled)(bool enabled, void *ctx);
47 
48 	/** @brief Received Data
49 	 *
50 	 * @param conn Peer Connection object.
51 	 * @param data Pointer to buffer with data received.
52 	 * @param len Size in bytes of data received.
53 	 * @param ctx User context provided in the callback structure.
54 	 */
55 	void (*received)(struct bt_conn *conn, const void *data, uint16_t len, void *ctx);
56 
57 	/** Internal member. Provided as a callback argument for user context */
58 	void *ctx;
59 
60 	/** Internal member to form a list of callbacks */
61 	sys_snode_t _node;
62 };
63 
64 /** @brief NUS server Instance callback register
65  *
66  * This function registers callbacks that will be called in
67  * certain events related to NUS.
68  *
69  * @param inst Pointer to instance of NUS service. NULL if using default instance.
70  * @param cb Pointer to callbacks structure. Must be valid throughout the
71  *           lifetime of the application.
72  * @param ctx User context to be provided through the callback.
73  *
74  * @return 0 on success
75  * @return -EINVAL in case @p cb is NULL
76  */
77 int bt_nus_inst_cb_register(struct bt_nus_inst *inst, struct bt_nus_cb *cb, void *ctx);
78 
79 /** @brief Send Data to NUS Instance
80  *
81  * @note This API sends the data to the specified peer.
82  *
83  * @param conn Connection object to send data to. NULL if notifying all peers.
84  * @param inst Pointer to instance of NUS service. NULL if using default instance.
85  * @param data Pointer to buffer with bytes to send.
86  * @param len Length in bytes of data to send.
87  *
88  * @return 0 on success, negative error code if failed.
89  * @return -EAGAIN when Bluetooth stack has not been enabled.
90  * @return -ENOTCONN when either no connection has been established or no peers
91  *         have subscribed.
92  */
93 int bt_nus_inst_send(struct bt_conn *conn,
94 		     struct bt_nus_inst *inst,
95 		     const void *data,
96 		     uint16_t len);
97 
98 /** @brief NUS server callback register
99  *
100  * @param cb Pointer to callbacks structure. Must be valid throughout the
101  *           lifetime of the application.
102  * @param ctx User context to be provided through the callback.
103  *
104  * @return 0 on success, negative error code if failed.
105  * @return -EINVAL in case @p cb is NULL
106  */
bt_nus_cb_register(struct bt_nus_cb * cb,void * ctx)107 static inline int bt_nus_cb_register(struct bt_nus_cb *cb, void *ctx)
108 {
109 	return bt_nus_inst_cb_register(NULL, cb, ctx);
110 }
111 
112 /** @brief Send Data over NUS
113  *
114  * @note This API sends the data to the specified peer.
115  *
116  * @param conn Connection object to send data to. NULL if notifying all peers.
117  * @param data Pointer to buffer with bytes to send.
118  * @param len Length in bytes of data to send.
119  *
120  * @return 0 on success, negative error code if failed.
121  * @return -EAGAIN when Bluetooth stack has not been enabled.
122  * @return -ENOTCONN when either no connection has been established or no peers
123  *         have subscribed.
124  */
bt_nus_send(struct bt_conn * conn,const void * data,uint16_t len)125 static inline int bt_nus_send(struct bt_conn *conn, const void *data, uint16_t len)
126 {
127 	return bt_nus_inst_send(conn, NULL, data, len);
128 }
129 
130 #ifdef __cplusplus
131 }
132 #endif
133 
134 
135 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_NUS_H_ */
136