Line data Source code
1 1 : /** @file
2 : * @brief Health Client Model APIs.
3 : */
4 :
5 : /*
6 : * Copyright (c) 2017 Intel Corporation
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : */
10 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_CLI_H_
11 : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_CLI_H_
12 :
13 : #include <zephyr/bluetooth/mesh.h>
14 :
15 : /**
16 : * @brief Health Client Model
17 : * @defgroup bt_mesh_health_cli Health Client Model
18 : * @ingroup bt_mesh
19 : * @{
20 : */
21 :
22 : #ifdef __cplusplus
23 : extern "C" {
24 : #endif
25 :
26 : /** Health Client Model Context */
27 1 : struct bt_mesh_health_cli {
28 : /** Composition data model entry pointer. */
29 1 : const struct bt_mesh_model *model;
30 :
31 : /** Publication structure instance */
32 1 : struct bt_mesh_model_pub pub;
33 :
34 : /** Publication buffer */
35 1 : struct net_buf_simple pub_buf;
36 :
37 : /** Publication data */
38 1 : uint8_t pub_data[BT_MESH_MODEL_BUF_LEN(BT_MESH_MODEL_OP_2(0x80, 0x32), 3)];
39 :
40 : /** @brief Optional callback for Health Period Status messages.
41 : *
42 : * Handles received Health Period Status messages from a Health
43 : * server. The @c divisor param represents the period divisor value.
44 : *
45 : * @param cli Health client that received the status message.
46 : * @param addr Address of the sender.
47 : * @param divisor Health Period Divisor value.
48 : */
49 1 : void (*period_status)(struct bt_mesh_health_cli *cli, uint16_t addr,
50 : uint8_t divisor);
51 :
52 : /** @brief Optional callback for Health Attention Status messages.
53 : *
54 : * Handles received Health Attention Status messages from a Health
55 : * server. The @c attention param represents the current attention value.
56 : *
57 : * @param cli Health client that received the status message.
58 : * @param addr Address of the sender.
59 : * @param attention Current attention value.
60 : */
61 1 : void (*attention_status)(struct bt_mesh_health_cli *cli, uint16_t addr,
62 : uint8_t attention);
63 :
64 : /** @brief Optional callback for Health Fault Status messages.
65 : *
66 : * Handles received Health Fault Status messages from a Health
67 : * server. The @c fault array represents all faults that are
68 : * currently present in the server's element.
69 : *
70 : * @see bt_mesh_health_faults
71 : *
72 : * @param cli Health client that received the status message.
73 : * @param addr Address of the sender.
74 : * @param test_id Identifier of a most recently performed test.
75 : * @param cid Company Identifier of the node.
76 : * @param faults Array of faults.
77 : * @param fault_count Number of faults in the fault array.
78 : */
79 1 : void (*fault_status)(struct bt_mesh_health_cli *cli, uint16_t addr,
80 : uint8_t test_id, uint16_t cid, uint8_t *faults,
81 : size_t fault_count);
82 :
83 : /** @brief Optional callback for Health Current Status messages.
84 : *
85 : * Handles received Health Current Status messages from a Health
86 : * server. The @c fault array represents all faults that are
87 : * currently present in the server's element.
88 : *
89 : * @see bt_mesh_health_faults
90 : *
91 : * @param cli Health client that received the status message.
92 : * @param addr Address of the sender.
93 : * @param test_id Identifier of a most recently performed test.
94 : * @param cid Company Identifier of the node.
95 : * @param faults Array of faults.
96 : * @param fault_count Number of faults in the fault array.
97 : */
98 1 : void (*current_status)(struct bt_mesh_health_cli *cli, uint16_t addr,
99 : uint8_t test_id, uint16_t cid, uint8_t *faults,
100 : size_t fault_count);
101 :
102 : /** @brief Optional callback for updating the message to be sent as periodic publication.
103 : *
104 : * This callback is called before sending the periodic publication message.
105 : * The callback can be used to update the message to be sent.
106 : *
107 : * If this callback is not implemented, periodic publication can still be enabled,
108 : * but no messages will be sent.
109 : *
110 : * @param cli Health client that is sending the periodic publication message.
111 : * @param pub_buf Publication message buffer to be updated.
112 : *
113 : * @return 0 if @p pub_buf is updated successfully, or (negative) error code on failure.
114 : * The message won't be sent if an error is returned.
115 : */
116 1 : int (*update)(struct bt_mesh_health_cli *cli, struct net_buf_simple *pub_buf);
117 :
118 : /* Internal parameters for tracking message responses. */
119 0 : struct bt_mesh_msg_ack_ctx ack_ctx;
120 : };
121 :
122 : /**
123 : * @brief Generic Health Client model composition data entry.
124 : *
125 : * @param cli_data Pointer to a @ref bt_mesh_health_cli instance.
126 : */
127 1 : #define BT_MESH_MODEL_HEALTH_CLI(cli_data) \
128 : BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_HEALTH_CLI, bt_mesh_health_cli_op, \
129 : &(cli_data)->pub, cli_data, &bt_mesh_health_cli_cb)
130 :
131 : /** @brief Get the registered fault state for the given Company ID.
132 : *
133 : * This method can be used asynchronously by setting @p test_id
134 : * and ( @p faults or @p fault_count ) as NULL This way the method
135 : * will not wait for response and will return immediately after
136 : * sending the command.
137 : *
138 : * To process the response arguments of an async method, register
139 : * the @c fault_status callback in @c bt_mesh_health_cli struct.
140 : *
141 : * @see bt_mesh_health_faults
142 : *
143 : * @param cli Client model to send on.
144 : * @param ctx Message context, or NULL to use the configured publish
145 : * parameters.
146 : * @param cid Company ID to get the registered faults of.
147 : * @param test_id Test ID response buffer.
148 : * @param faults Fault array response buffer.
149 : * @param fault_count Fault count response buffer.
150 : *
151 : * @return 0 on success, or (negative) error code on failure.
152 : */
153 1 : int bt_mesh_health_cli_fault_get(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
154 : uint16_t cid, uint8_t *test_id, uint8_t *faults,
155 : size_t *fault_count);
156 :
157 : /** @brief Clear the registered faults for the given Company ID.
158 : *
159 : * This method can be used asynchronously by setting @p test_id
160 : * and ( @p faults or @p fault_count ) as NULL This way the method
161 : * will not wait for response and will return immediately after
162 : * sending the command.
163 : *
164 : * To process the response arguments of an async method, register
165 : * the @c fault_status callback in @c bt_mesh_health_cli struct.
166 : *
167 : * @see bt_mesh_health_faults
168 : *
169 : * @param cli Client model to send on.
170 : * @param ctx Message context, or NULL to use the configured publish
171 : * parameters.
172 : * @param cid Company ID to clear the registered faults for.
173 : * @param test_id Test ID response buffer.
174 : * @param faults Fault array response buffer.
175 : * @param fault_count Fault count response buffer.
176 : *
177 : * @return 0 on success, or (negative) error code on failure.
178 : */
179 1 : int bt_mesh_health_cli_fault_clear(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
180 : uint16_t cid, uint8_t *test_id, uint8_t *faults,
181 : size_t *fault_count);
182 :
183 : /** @brief Clear the registered faults for the given Company ID (unacked).
184 : *
185 : * @see bt_mesh_health_faults
186 : *
187 : * @param cli Client model to send on.
188 : * @param ctx Message context, or NULL to use the configured publish
189 : * parameters.
190 : * @param cid Company ID to clear the registered faults for.
191 : *
192 : * @return 0 on success, or (negative) error code on failure.
193 : */
194 1 : int bt_mesh_health_cli_fault_clear_unack(struct bt_mesh_health_cli *cli,
195 : struct bt_mesh_msg_ctx *ctx, uint16_t cid);
196 :
197 : /** @brief Invoke a self-test procedure for the given Company ID.
198 : *
199 : * This method can be used asynchronously by setting @p faults
200 : * or @p fault_count as NULL This way the method will not wait
201 : * for response and will return immediately after sending the command.
202 : *
203 : * To process the response arguments of an async method, register
204 : * the @c fault_status callback in @c bt_mesh_health_cli struct.
205 : *
206 : * @param cli Client model to send on.
207 : * @param ctx Message context, or NULL to use the configured publish
208 : * parameters.
209 : * @param cid Company ID to invoke the test for.
210 : * @param test_id Test ID response buffer.
211 : * @param faults Fault array response buffer.
212 : * @param fault_count Fault count response buffer.
213 : *
214 : * @return 0 on success, or (negative) error code on failure.
215 : */
216 1 : int bt_mesh_health_cli_fault_test(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
217 : uint16_t cid, uint8_t test_id, uint8_t *faults,
218 : size_t *fault_count);
219 :
220 : /** @brief Invoke a self-test procedure for the given Company ID (unacked).
221 : *
222 : * @param cli Client model to send on.
223 : * @param ctx Message context, or NULL to use the configured publish
224 : * parameters.
225 : * @param cid Company ID to invoke the test for.
226 : * @param test_id Test ID response buffer.
227 : *
228 : * @return 0 on success, or (negative) error code on failure.
229 : */
230 1 : int bt_mesh_health_cli_fault_test_unack(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
231 : uint16_t cid, uint8_t test_id);
232 :
233 : /** @brief Get the target node's Health fast period divisor.
234 : *
235 : * The health period divisor is used to increase the publish rate when a fault
236 : * is registered. Normally, the Health server will publish with the period in
237 : * the configured publish parameters. When a fault is registered, the publish
238 : * period is divided by (1 << divisor). For example, if the target node's
239 : * Health server is configured to publish with a period of 16 seconds, and the
240 : * Health fast period divisor is 5, the Health server will publish with an
241 : * interval of 500 ms when a fault is registered.
242 : *
243 : * This method can be used asynchronously by setting @p divisor
244 : * as NULL. This way the method will not wait for response and will
245 : * return immediately after sending the command.
246 : *
247 : * To process the response arguments of an async method, register
248 : * the @c period_status callback in @c bt_mesh_health_cli struct.
249 : *
250 : * @param cli Client model to send on.
251 : * @param ctx Message context, or NULL to use the configured publish
252 : * parameters.
253 : * @param divisor Health period divisor response buffer.
254 : *
255 : * @return 0 on success, or (negative) error code on failure.
256 : */
257 1 : int bt_mesh_health_cli_period_get(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
258 : uint8_t *divisor);
259 :
260 : /** @brief Set the target node's Health fast period divisor.
261 : *
262 : * The health period divisor is used to increase the publish rate when a fault
263 : * is registered. Normally, the Health server will publish with the period in
264 : * the configured publish parameters. When a fault is registered, the publish
265 : * period is divided by (1 << divisor). For example, if the target node's
266 : * Health server is configured to publish with a period of 16 seconds, and the
267 : * Health fast period divisor is 5, the Health server will publish with an
268 : * interval of 500 ms when a fault is registered.
269 : *
270 : * This method can be used asynchronously by setting @p updated_divisor
271 : * as NULL. This way the method will not wait for response and will
272 : * return immediately after sending the command.
273 : *
274 : * To process the response arguments of an async method, register
275 : * the @c period_status callback in @c bt_mesh_health_cli struct.
276 : *
277 : * @param cli Client model to send on.
278 : * @param ctx Message context, or NULL to use the configured publish
279 : * parameters.
280 : * @param divisor New Health period divisor.
281 : * @param updated_divisor Health period divisor response buffer.
282 : *
283 : * @return 0 on success, or (negative) error code on failure.
284 : */
285 1 : int bt_mesh_health_cli_period_set(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
286 : uint8_t divisor, uint8_t *updated_divisor);
287 :
288 : /** @brief Set the target node's Health fast period divisor (unacknowledged).
289 : *
290 : * This is an unacknowledged version of this API.
291 : *
292 : * @param cli Client model to send on.
293 : * @param ctx Message context, or NULL to use the configured publish
294 : * parameters.
295 : * @param divisor New Health period divisor.
296 : *
297 : * @return 0 on success, or (negative) error code on failure.
298 : */
299 1 : int bt_mesh_health_cli_period_set_unack(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
300 : uint8_t divisor);
301 :
302 : /** @brief Get the current attention timer value.
303 : *
304 : * This method can be used asynchronously by setting @p attention
305 : * as NULL. This way the method will not wait for response and will
306 : * return immediately after sending the command.
307 : *
308 : * To process the response arguments of an async method, register
309 : * the @c attention_status callback in @c bt_mesh_health_cli struct.
310 : *
311 : * @param cli Client model to send on.
312 : * @param ctx Message context, or NULL to use the configured publish
313 : * parameters.
314 : * @param attention Attention timer response buffer, measured in seconds.
315 : *
316 : * @return 0 on success, or (negative) error code on failure.
317 : */
318 1 : int bt_mesh_health_cli_attention_get(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
319 : uint8_t *attention);
320 :
321 : /** @brief Set the attention timer.
322 : *
323 : * This method can be used asynchronously by setting @p updated_attention
324 : * as NULL. This way the method will not wait for response and will
325 : * return immediately after sending the command.
326 : *
327 : * To process the response arguments of an async method, register
328 : * the @c attention_status callback in @c bt_mesh_health_cli struct.
329 : *
330 : * @param cli Client model to send on.
331 : * @param ctx Message context, or NULL to use the configured publish
332 : * parameters.
333 : * @param attention New attention timer time, in seconds.
334 : * @param updated_attention Attention timer response buffer, measured in
335 : * seconds.
336 : *
337 : * @return 0 on success, or (negative) error code on failure.
338 : */
339 1 : int bt_mesh_health_cli_attention_set(struct bt_mesh_health_cli *cli, struct bt_mesh_msg_ctx *ctx,
340 : uint8_t attention, uint8_t *updated_attention);
341 :
342 : /** @brief Set the attention timer (unacknowledged).
343 : *
344 : * @param cli Client model to send on.
345 : * @param ctx Message context, or NULL to use the configured publish
346 : * parameters.
347 : * @param attention New attention timer time, in seconds.
348 : *
349 : * @return 0 on success, or (negative) error code on failure.
350 : */
351 1 : int bt_mesh_health_cli_attention_set_unack(struct bt_mesh_health_cli *cli,
352 : struct bt_mesh_msg_ctx *ctx, uint8_t attention);
353 :
354 : /** @brief Get the current transmission timeout value.
355 : *
356 : * @return The configured transmission timeout in milliseconds.
357 : */
358 1 : int32_t bt_mesh_health_cli_timeout_get(void);
359 :
360 : /** @brief Set the transmission timeout value.
361 : *
362 : * @param timeout The new transmission timeout.
363 : */
364 1 : void bt_mesh_health_cli_timeout_set(int32_t timeout);
365 :
366 : /** @cond INTERNAL_HIDDEN */
367 : extern const struct bt_mesh_model_op bt_mesh_health_cli_op[];
368 : extern const struct bt_mesh_model_cb bt_mesh_health_cli_cb;
369 : /** @endcond */
370 :
371 : #ifdef __cplusplus
372 : }
373 : #endif
374 :
375 : /**
376 : * @}
377 : */
378 :
379 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_CLI_H_ */
|