Line data Source code
1 1 : /** @file 2 : * @brief Health Server 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_SRV_H_ 11 : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_SRV_H_ 12 : 13 : /** 14 : * @brief Health Server Model 15 : * @defgroup bt_mesh_health_srv Health Server Model 16 : * @ingroup bt_mesh 17 : * @{ 18 : */ 19 : 20 : #include <zephyr/bluetooth/mesh.h> 21 : #include <zephyr/bluetooth/byteorder.h> 22 : 23 : #ifdef __cplusplus 24 : extern "C" { 25 : #endif 26 : 27 : /** Callback function for the Health Server model */ 28 1 : struct bt_mesh_health_srv_cb { 29 : /** @brief Callback for fetching current faults. 30 : * 31 : * Fault values may either be defined by the specification, or by a 32 : * vendor. Vendor specific faults should be interpreted in the context 33 : * of the accompanying Company ID. Specification defined faults may be 34 : * reported for any Company ID, and the same fault may be presented 35 : * for multiple Company IDs. 36 : * 37 : * All faults shall be associated with at least one Company ID, 38 : * representing the device vendor or some other vendor whose vendor 39 : * specific fault values are used. 40 : * 41 : * If there are multiple Company IDs that have active faults, 42 : * return only the faults associated with one of them at the time. 43 : * To report faults for multiple Company IDs, interleave which Company 44 : * ID is reported for each call. 45 : * 46 : * @param model Health Server model instance to get faults of. 47 : * @param test_id Test ID response buffer. 48 : * @param company_id Company ID response buffer. 49 : * @param faults Array to fill with current faults. 50 : * @param fault_count The number of faults the fault array can fit. 51 : * Should be updated to reflect the number of faults 52 : * copied into the array. 53 : * 54 : * @return 0 on success, or (negative) error code otherwise. 55 : */ 56 1 : int (*fault_get_cur)(const struct bt_mesh_model *model, uint8_t *test_id, 57 : uint16_t *company_id, uint8_t *faults, 58 : uint8_t *fault_count); 59 : 60 : /** @brief Callback for fetching all registered faults. 61 : * 62 : * Registered faults are all past and current faults since the last 63 : * call to @c fault_clear. Only faults associated with the given 64 : * Company ID should be reported. 65 : * 66 : * Fault values may either be defined by the specification, or by a 67 : * vendor. Vendor specific faults should be interpreted in the context 68 : * of the accompanying Company ID. Specification defined faults may be 69 : * reported for any Company ID, and the same fault may be presented 70 : * for multiple Company IDs. 71 : * 72 : * @param model Health Server model instance to get faults of. 73 : * @param company_id Company ID to get faults for. 74 : * @param test_id Test ID response buffer. 75 : * @param faults Array to fill with registered faults. 76 : * @param fault_count The number of faults the fault array can fit. 77 : * Should be updated to reflect the number of faults 78 : * copied into the array. 79 : * 80 : * @return 0 on success, or (negative) error code otherwise. 81 : */ 82 1 : int (*fault_get_reg)(const struct bt_mesh_model *model, uint16_t company_id, 83 : uint8_t *test_id, uint8_t *faults, 84 : uint8_t *fault_count); 85 : 86 : /** @brief Clear all registered faults associated with the given Company 87 : * ID. 88 : * 89 : * @param model Health Server model instance to clear faults of. 90 : * @param company_id Company ID to clear faults for. 91 : * 92 : * @return 0 on success, or (negative) error code otherwise. 93 : */ 94 1 : int (*fault_clear)(const struct bt_mesh_model *model, uint16_t company_id); 95 : 96 : /** @brief Run a self-test. 97 : * 98 : * The Health server may support up to 256 self-tests for each Company 99 : * ID. The behavior for all test IDs are vendor specific, and should be 100 : * interpreted based on the accompanying Company ID. Test failures 101 : * should result in changes to the fault array. 102 : * 103 : * @param model Health Server model instance to run test for. 104 : * @param test_id Test ID to run. 105 : * @param company_id Company ID to run test for. 106 : * 107 : * @return 0 if the test execution was started successfully, or 108 : * (negative) error code otherwise. Note that the fault array will not 109 : * be reported back to the client if the test execution didn't start. 110 : */ 111 1 : int (*fault_test)(const struct bt_mesh_model *model, uint8_t test_id, 112 : uint16_t company_id); 113 : 114 : /** @brief Start calling attention to the device. 115 : * 116 : * The attention state is used to map an element address to a 117 : * physical device. When this callback is called, the device should 118 : * start some physical procedure meant to call attention to itself, 119 : * like blinking, buzzing, vibrating or moving. If there are multiple 120 : * Health server instances on the device, the attention state should 121 : * also help identify the specific element the server is in. 122 : * 123 : * The attention calling behavior should continue until the @c attn_off 124 : * callback is called. 125 : * 126 : * @param model Health Server model to start the attention state of. 127 : */ 128 1 : void (*attn_on)(const struct bt_mesh_model *model); 129 : 130 : /** @brief Stop the attention state. 131 : * 132 : * Any physical activity started to call attention to the device should 133 : * be stopped. 134 : * 135 : * @param model 136 : */ 137 1 : void (*attn_off)(const struct bt_mesh_model *model); 138 : }; 139 : 140 : /** 141 : * A helper to define a health publication context 142 : * 143 : * @param _name Name given to the publication context variable. 144 : * @param _max_faults Maximum number of faults the element can have. 145 : */ 146 1 : #define BT_MESH_HEALTH_PUB_DEFINE(_name, _max_faults) \ 147 : BT_MESH_MODEL_PUB_DEFINE(_name, NULL, (1 + 3 + (_max_faults))) 148 : 149 : /** Mesh Health Server Model Context */ 150 1 : struct bt_mesh_health_srv { 151 : /** Composition data model entry pointer. */ 152 1 : const struct bt_mesh_model *model; 153 : 154 : /** Optional callback struct */ 155 1 : const struct bt_mesh_health_srv_cb *cb; 156 : 157 : /** Attention Timer state */ 158 1 : struct k_work_delayable attn_timer; 159 : }; 160 : 161 : /** 162 : * Define a new health server model. Note that this API needs to be 163 : * repeated for each element that the application wants to have a 164 : * health server model on. Each instance also needs a unique 165 : * bt_mesh_health_srv and bt_mesh_model_pub context. 166 : * 167 : * @param srv Pointer to a unique struct bt_mesh_health_srv. 168 : * @param pub Pointer to a unique struct bt_mesh_model_pub. 169 : * @param ... Optional Health Server metadata if application is compiled with 170 : * Large Composition Data Server support, otherwise this parameter 171 : * is ignored. 172 : * 173 : * @return New mesh model instance. 174 : */ 175 1 : #define BT_MESH_MODEL_HEALTH_SRV(srv, pub, ...) \ 176 : BT_MESH_MODEL_METADATA_CB(BT_MESH_MODEL_ID_HEALTH_SRV, \ 177 : bt_mesh_health_srv_op, \ 178 : pub, \ 179 : srv, \ 180 : &bt_mesh_health_srv_cb, __VA_ARGS__) 181 : 182 : /** 183 : * 184 : * Health Test Information Metadata ID. 185 : */ 186 1 : #define BT_MESH_HEALTH_TEST_INFO_METADATA_ID 0x0000 187 : 188 0 : #define BT_MESH_HEALTH_TEST_INFO_METADATA(tests) \ 189 : { \ 190 : .len = ARRAY_SIZE(tests), \ 191 : .id = BT_MESH_HEALTH_TEST_INFO_METADATA_ID, \ 192 : .data = tests, \ 193 : } 194 : 195 : /** 196 : * 197 : * Define a Health Test Info Metadata array. 198 : * 199 : * @param cid Company ID of the Health Test suite. 200 : * @param tests A comma separated list of tests. 201 : * 202 : * @return A comma separated list of values that make Health Test Info Metadata 203 : */ 204 1 : #define BT_MESH_HEALTH_TEST_INFO(cid, tests...) \ 205 : BT_BYTES_LIST_LE16(cid), sizeof((uint8_t[]){ tests }), tests 206 : 207 : /** @brief Notify the stack that the fault array state of the given element has 208 : * changed. 209 : * 210 : * This prompts the Health server on this element to publish the current fault 211 : * array if periodic publishing is disabled. 212 : * 213 : * @param elem Element to update the fault state of. 214 : * 215 : * @return 0 on success, or (negative) error code otherwise. 216 : */ 217 1 : int bt_mesh_health_srv_fault_update(const struct bt_mesh_elem *elem); 218 : 219 : /** @cond INTERNAL_HIDDEN */ 220 : extern const struct bt_mesh_model_op bt_mesh_health_srv_op[]; 221 : extern const struct bt_mesh_model_cb bt_mesh_health_srv_cb; 222 : /** @endcond */ 223 : 224 : #ifdef __cplusplus 225 : } 226 : #endif 227 : 228 : /** 229 : * @} 230 : */ 231 : 232 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_HEALTH_SRV_H_ */