| /** @file | 
 |  *  @brief Health Client Model APIs. | 
 |  */ | 
 |  | 
 | /* | 
 |  * Copyright (c) 2017 Intel Corporation | 
 |  * | 
 |  * SPDX-License-Identifier: Apache-2.0 | 
 |  */ | 
 | #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_CLI_H_ | 
 | #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_CLI_H_ | 
 |  | 
 | /** | 
 |  * @brief Health Client Model | 
 |  * @defgroup bt_mesh_health_cli Health Client Model | 
 |  * @ingroup bt_mesh | 
 |  * @{ | 
 |  */ | 
 |  | 
 | #ifdef __cplusplus | 
 | extern "C" { | 
 | #endif | 
 |  | 
 | /** Health Client Model Context */ | 
 | struct bt_mesh_health_cli { | 
 | 	/** Composition data model entry pointer. */ | 
 | 	struct bt_mesh_model *model; | 
 |  | 
 | 	/** @brief Optional callback for Health Period Status messages. | 
 | 	 * | 
 | 	 *  Handles received Health Period Status messages from a Health | 
 | 	 *  server. The @c divisor param represents the period divisor value. | 
 | 	 * | 
 | 	 *  @param cli         Health client that received the status message. | 
 | 	 *  @param addr        Address of the sender. | 
 | 	 *  @param divisor     Health Period Divisor value. | 
 | 	 */ | 
 | 	void (*period_status)(struct bt_mesh_health_cli *cli, uint16_t addr, | 
 | 			      uint8_t divisor); | 
 |  | 
 | 	/** @brief Optional callback for Health Attention Status messages. | 
 | 	 * | 
 | 	 *  Handles received Health Attention Status messages from a Health | 
 | 	 *  server. The @c attention param represents the current attention value. | 
 | 	 * | 
 | 	 *  @param cli         Health client that received the status message. | 
 | 	 *  @param addr        Address of the sender. | 
 | 	 *  @param attention   Current attention value. | 
 | 	 */ | 
 | 	void (*attention_status)(struct bt_mesh_health_cli *cli, uint16_t addr, | 
 | 				 uint8_t attention); | 
 |  | 
 | 	/** @brief Optional callback for Health Fault Status messages. | 
 | 	 * | 
 | 	 *  Handles received Health Fault Status messages from a Health | 
 | 	 *  server. The @c fault array represents all faults that are | 
 | 	 *  currently present in the server's element. | 
 | 	 * | 
 | 	 *  @see bt_mesh_health_faults | 
 | 	 * | 
 | 	 *  @param cli         Health client that received the status message. | 
 | 	 *  @param addr        Address of the sender. | 
 | 	 *  @param test_id     Identifier of a most recently performed test. | 
 | 	 *  @param cid         Company Identifier of the node. | 
 | 	 *  @param faults      Array of faults. | 
 | 	 *  @param fault_count Number of faults in the fault array. | 
 | 	 */ | 
 | 	void (*fault_status)(struct bt_mesh_health_cli *cli, uint16_t addr, | 
 | 			     uint8_t test_id, uint16_t cid, uint8_t *faults, | 
 | 			     size_t fault_count); | 
 |  | 
 | 	/** @brief Optional callback for Health Current Status messages. | 
 | 	 * | 
 | 	 *  Handles received Health Current Status messages from a Health | 
 | 	 *  server. The @c fault array represents all faults that are | 
 | 	 *  currently present in the server's element. | 
 | 	 * | 
 | 	 *  @see bt_mesh_health_faults | 
 | 	 * | 
 | 	 *  @param cli         Health client that received the status message. | 
 | 	 *  @param addr        Address of the sender. | 
 | 	 *  @param test_id     Identifier of a most recently performed test. | 
 | 	 *  @param cid         Company Identifier of the node. | 
 | 	 *  @param faults      Array of faults. | 
 | 	 *  @param fault_count Number of faults in the fault array. | 
 | 	 */ | 
 | 	void (*current_status)(struct bt_mesh_health_cli *cli, uint16_t addr, | 
 | 			       uint8_t test_id, uint16_t cid, uint8_t *faults, | 
 | 			       size_t fault_count); | 
 |  | 
 | 	/* Internal parameters for tracking message responses. */ | 
 | 	struct bt_mesh_msg_ack_ctx ack_ctx; | 
 | }; | 
 |  | 
 | /** @def BT_MESH_MODEL_HEALTH_CLI | 
 |  * | 
 |  *  @brief Generic Health Client model composition data entry. | 
 |  * | 
 |  *  @param cli_data Pointer to a @ref bt_mesh_health_cli instance. | 
 |  */ | 
 | #define BT_MESH_MODEL_HEALTH_CLI(cli_data)                                     \ | 
 | 	BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_HEALTH_CLI, bt_mesh_health_cli_op,   \ | 
 | 			 NULL, cli_data, &bt_mesh_health_cli_cb) | 
 |  | 
 | /** @brief Set Health client model instance to use for communication. | 
 |  * | 
 |  *  @param model Health Client model instance from the composition data. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_cli_set(struct bt_mesh_model *model); | 
 |  | 
 | /** @brief Get the registered fault state for the given Company ID. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p test_id | 
 |  *  and ( @p faults or @p fault_count ) as NULL This way the method | 
 |  *  will not wait for response and will return immediately after | 
 |  *  sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c fault_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @see bt_mesh_health_faults | 
 |  * | 
 |  *  @param addr        Target node element address. | 
 |  *  @param app_idx     Application index to encrypt with. | 
 |  *  @param cid         Company ID to get the registered faults of. | 
 |  *  @param test_id     Test ID response buffer. | 
 |  *  @param faults      Fault array response buffer. | 
 |  *  @param fault_count Fault count response buffer. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_fault_get(uint16_t addr, uint16_t app_idx, uint16_t cid, | 
 | 			     uint8_t *test_id, uint8_t *faults, | 
 | 			     size_t *fault_count); | 
 |  | 
 | /** @brief Clear the registered faults for the given Company ID. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p test_id | 
 |  *  and ( @p faults or @p fault_count ) as NULL This way the method | 
 |  *  will not wait for response and will return immediately after | 
 |  *  sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c fault_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @see bt_mesh_health_faults | 
 |  * | 
 |  *  @param addr        Target node element address. | 
 |  *  @param app_idx     Application index to encrypt with. | 
 |  *  @param cid         Company ID to clear the registered faults for. | 
 |  *  @param test_id     Test ID response buffer. | 
 |  *  @param faults      Fault array response buffer. | 
 |  *  @param fault_count Fault count response buffer. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_fault_clear(uint16_t addr, uint16_t app_idx, uint16_t cid, | 
 | 			       uint8_t *test_id, uint8_t *faults, | 
 | 			       size_t *fault_count); | 
 |  | 
 | /** @brief Clear the registered faults for the given Company ID (unacked). | 
 |  * | 
 |  *  @see bt_mesh_health_faults | 
 |  * | 
 |  *  @param addr        Target node element address. | 
 |  *  @param app_idx     Application index to encrypt with. | 
 |  *  @param cid         Company ID to clear the registered faults for. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_fault_clear_unack(uint16_t addr, uint16_t app_idx, | 
 | 				     uint16_t cid); | 
 |  | 
 | /** @brief Invoke a self-test procedure for the given Company ID. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p faults | 
 |  *  or @p fault_count as NULL This way the method will not wait | 
 |  *  for response and will return immediately after sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c fault_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @param addr        Target node element address. | 
 |  *  @param app_idx     Application index to encrypt with. | 
 |  *  @param cid         Company ID to invoke the test for. | 
 |  *  @param test_id     Test ID response buffer. | 
 |  *  @param faults      Fault array response buffer. | 
 |  *  @param fault_count Fault count response buffer. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_fault_test(uint16_t addr, uint16_t app_idx, uint16_t cid, | 
 | 			      uint8_t test_id, uint8_t *faults, | 
 | 			      size_t *fault_count); | 
 |  | 
 | /** @brief Invoke a self-test procedure for the given Company ID (unacked). | 
 |  * | 
 |  *  @param addr        Target node element address. | 
 |  *  @param app_idx     Application index to encrypt with. | 
 |  *  @param cid         Company ID to invoke the test for. | 
 |  *  @param test_id     Test ID response buffer. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_fault_test_unack(uint16_t addr, uint16_t app_idx, | 
 | 				    uint16_t cid, uint8_t test_id); | 
 |  | 
 | /** @brief Get the target node's Health fast period divisor. | 
 |  * | 
 |  *  The health period divisor is used to increase the publish rate when a fault | 
 |  *  is registered. Normally, the Health server will publish with the period in | 
 |  *  the configured publish parameters. When a fault is registered, the publish | 
 |  *  period is divided by (1 << divisor). For example, if the target node's | 
 |  *  Health server is configured to publish with a period of 16 seconds, and the | 
 |  *  Health fast period divisor is 5, the Health server will publish with an | 
 |  *  interval of 500 ms when a fault is registered. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p divisor | 
 |  *  as NULL. This way the method will not wait for response and will | 
 |  *  return immediately after sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c period_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @param addr    Target node element address. | 
 |  *  @param app_idx Application index to encrypt with. | 
 |  *  @param divisor Health period divisor response buffer. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_period_get(uint16_t addr, uint16_t app_idx, | 
 | 			      uint8_t *divisor); | 
 |  | 
 | /** @brief Set the target node's Health fast period divisor. | 
 |  * | 
 |  *  The health period divisor is used to increase the publish rate when a fault | 
 |  *  is registered. Normally, the Health server will publish with the period in | 
 |  *  the configured publish parameters. When a fault is registered, the publish | 
 |  *  period is divided by (1 << divisor). For example, if the target node's | 
 |  *  Health server is configured to publish with a period of 16 seconds, and the | 
 |  *  Health fast period divisor is 5, the Health server will publish with an | 
 |  *  interval of 500 ms when a fault is registered. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p updated_divisor | 
 |  *  as NULL. This way the method will not wait for response and will | 
 |  *  return immediately after sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c period_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @param addr            Target node element address. | 
 |  *  @param app_idx         Application index to encrypt with. | 
 |  *  @param divisor         New Health period divisor. | 
 |  *  @param updated_divisor Health period divisor response buffer. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_period_set(uint16_t addr, uint16_t app_idx, uint8_t divisor, | 
 | 			      uint8_t *updated_divisor); | 
 |  | 
 | /** @brief Set the target node's Health fast period divisor (unacknowledged). | 
 |  * | 
 |  *  This is an unacknowledged version of this API. | 
 |  * | 
 |  *  @param addr            Target node element address. | 
 |  *  @param app_idx         Application index to encrypt with. | 
 |  *  @param divisor         New Health period divisor. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_period_set_unack(uint16_t addr, uint16_t app_idx, | 
 | 				    uint8_t divisor); | 
 |  | 
 | /** @brief Get the current attention timer value. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p attention | 
 |  *  as NULL. This way the method will not wait for response and will | 
 |  *  return immediately after sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c attention_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @param addr      Target node element address. | 
 |  *  @param app_idx   Application index to encrypt with. | 
 |  *  @param attention Attention timer response buffer, measured in seconds. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_attention_get(uint16_t addr, uint16_t app_idx, | 
 | 				 uint8_t *attention); | 
 |  | 
 | /** @brief Set the attention timer. | 
 |  * | 
 |  *  This method can be used asynchronously by setting @p updated_attention | 
 |  *  as NULL. This way the method will not wait for response and will | 
 |  *  return immediately after sending the command. | 
 |  * | 
 |  *  To process the response arguments of an async method, register | 
 |  *  the @c attention_status callback in @c bt_mesh_health_cli struct. | 
 |  * | 
 |  *  @param addr              Target node element address. | 
 |  *  @param app_idx           Application index to encrypt with. | 
 |  *  @param attention         New attention timer time, in seconds. | 
 |  *  @param updated_attention Attention timer response buffer, measured in | 
 |  *                           seconds. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_attention_set(uint16_t addr, uint16_t app_idx, | 
 | 				 uint8_t attention, uint8_t *updated_attention); | 
 |  | 
 | /** @brief Set the attention timer (unacknowledged). | 
 |  * | 
 |  *  @param addr              Target node element address. | 
 |  *  @param app_idx           Application index to encrypt with. | 
 |  *  @param attention         New attention timer time, in seconds. | 
 |  * | 
 |  *  @return 0 on success, or (negative) error code on failure. | 
 |  */ | 
 | int bt_mesh_health_attention_set_unack(uint16_t addr, uint16_t app_idx, | 
 | 				       uint8_t attention); | 
 |  | 
 | /** @brief Get the current transmission timeout value. | 
 |  * | 
 |  *  @return The configured transmission timeout in milliseconds. | 
 |  */ | 
 | int32_t bt_mesh_health_cli_timeout_get(void); | 
 |  | 
 | /** @brief Set the transmission timeout value. | 
 |  * | 
 |  *  @param timeout The new transmission timeout. | 
 |  */ | 
 | void bt_mesh_health_cli_timeout_set(int32_t timeout); | 
 |  | 
 | /** @cond INTERNAL_HIDDEN */ | 
 | extern const struct bt_mesh_model_op bt_mesh_health_cli_op[]; | 
 | extern const struct bt_mesh_model_cb bt_mesh_health_cli_cb; | 
 | /** @endcond */ | 
 |  | 
 | #ifdef __cplusplus | 
 | } | 
 | #endif | 
 |  | 
 | /** | 
 |  * @} | 
 |  */ | 
 |  | 
 | #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_CLI_H_ */ |