MeshX 0.3
This repository provides an implementation for Bluetooth Low Energy (BLE) Mesh network nodes. The project allows you to create BLE mesh nodes that can communicate with each other, enabling the development of smart home solutions or other IoT-based applications.
Loading...
Searching...
No Matches
meshx_onoff_client.c
Go to the documentation of this file.
1
11
12#include "meshx_err.h"
13#include "meshx_txcm.h"
14#include "meshx_onoff_client.h"
15
16#define MESHX_CLIENT_INIT_MAGIC 0x2378
17
18#if CONFIG_ENABLE_GEN_ONOFF_CLIENT
19
20static uint16_t meshx_client_init_flag = 0;
21
35static meshx_err_t meshx_state_change_notify(const meshx_gen_cli_cb_param_t *param, uint8_t status)
36{
37 if (!param)
38 return MESHX_INVALID_ARG;
39
40 meshx_on_off_cli_el_msg_t cli_onoff_param = {
41 .err_code = status,
42 .ctx = param->ctx,
43 .model = param->model,
44 .on_off_state = param->status.onoff_status.present_onoff
45 };
46
50 &cli_onoff_param,
51 sizeof(meshx_on_off_cli_el_msg_t));
52
53}
54
68 const dev_struct_t *pdev,
70 const meshx_gen_cli_cb_param_t *param
71)
72{
73 if(!param || !pdev)
74 {
75 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Invalid parameters");
76 return MESHX_INVALID_ARG;
77 }
78 if(model_id != MESHX_MODEL_ID_GEN_ONOFF_CLI)
79 {
80 return MESHX_SUCCESS;
81 }
82
83 meshx_err_t err = param->evt == MESHX_GEN_CLI_TIMEOUT ?
86
87 return err;
88}
89
98meshx_err_t meshx_on_off_client_init(void)
99{
101
102 if (meshx_client_init_flag == MESHX_CLIENT_INIT_MAGIC)
103 {
104 return MESHX_SUCCESS;
105 }
106 meshx_client_init_flag = MESHX_CLIENT_INIT_MAGIC;
107
108 err = meshx_gen_client_init();
109 if (err)
110 {
111 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Failed to initialize meshx client");
112 }
113
117 );
118 if (err)
119 {
120 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to initialize meshx_gen_srv_reg_cb (Err: %d)", err);
121 }
122
123 return err;
124}
125
139meshx_err_t meshx_on_off_client_create(meshx_onoff_client_model_t **p_model, void *p_sig_model)
140{
141 if (!p_model || !p_sig_model)
142 {
143 return MESHX_INVALID_ARG;
144 }
145
146 *p_model = (meshx_onoff_client_model_t *)MESHX_CALOC(1, sizeof(meshx_onoff_client_model_t));
147 if (!*p_model)
148 {
149 return MESHX_NO_MEM;
150 }
151
153 p_sig_model,
154 &((*p_model)->meshx_pub),
155 &((*p_model)->meshx_gen));
156}
157
170meshx_err_t meshx_on_off_client_delete(meshx_onoff_client_model_t **p_model)
171{
172 if (p_model == NULL || *p_model == NULL)
173 {
174 return MESHX_INVALID_ARG;
175 }
176
178 &((*p_model)->meshx_pub),
179 &((*p_model)->meshx_gen)
180 );
181
182 MESHX_FREE(*p_model);
183 *p_model = NULL;
184
185 return MESHX_SUCCESS;
186}
187
201meshx_err_t meshx_onoff_client_send_msg(meshx_gen_onoff_send_params_t *params)
202{
203 meshx_err_t err;
204 meshx_gen_cli_set_t set = {0};
205 if (!params || !params->model || !params->model->meshx_sig)
206 {
207 return MESHX_INVALID_ARG;
208 }
209
210 meshx_gen_client_send_params_t send_params = {
211 .state = &set,
212 .addr = params->addr,
213 .opcode = params->opcode,
214 .app_idx = params->app_idx,
215 .net_idx = params->net_idx,
216 .model = params->model->meshx_sig,
217 };
218
219 if(params->opcode == MESHX_MODEL_OP_GEN_ONOFF_GET)
220 {
221 err = meshx_gen_cli_send_msg(&send_params);
222 }
223
224 else if (params->opcode == MESHX_MODEL_OP_GEN_ONOFF_SET ||
225 params->opcode == MESHX_MODEL_OP_GEN_ONOFF_SET_UNACK)
226 {
227 set.onoff_set.tid = params->tid;
228 set.onoff_set.onoff = params->state;
229 set.onoff_set.op_en = false;
230
232 &send_params
233 );
234 }
235 else{
236 err = MESHX_INVALID_ARG; // Invalid opcode
237 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Invalid opcode for Generic OnOff Client: %04x", params->opcode);
238 }
239 return err;
240}
241
257meshx_err_t meshx_gen_on_off_state_change_handle(
258 const meshx_on_off_cli_el_msg_t *param,
259 meshx_on_off_cli_state_t *p_prev_state,
260 meshx_on_off_cli_state_t *p_next_state
261)
262{
263 if (!p_prev_state || !param || !p_next_state)
264 return MESHX_INVALID_ARG;
265 bool state_change = false;
266
267 if(param->err_code == MESHX_SUCCESS)
268 {
269 if (p_prev_state->on_off != param->on_off_state)
270 {
271 p_prev_state->on_off = param->on_off_state;
272 state_change = true;
273 }
274 else
275 {
276 MESHX_LOGD(MODULE_ID_MODEL_CLIENT, "No change in state: %d", param->on_off_state);
277 }
278 p_next_state->on_off = !param->on_off_state;
279 }
280 else
281 {
282 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "OnOff state change failed: %d", param->err_code);
283 state_change = true;
284 /* state_change = true if want to notify app about timeout */
285 }
286
287 return state_change ? MESHX_SUCCESS : MESHX_INVALID_STATE;
288}
289#endif /* CONFIG_ENABLE_GEN_ONOFF_CLIENT*/
#define MESHX_MODEL_ID_GEN_ONOFF_CLI
#define MESHX_MODEL_OP_GEN_ONOFF_SET_UNACK
#define MESHX_MODEL_OP_GEN_ONOFF_GET
#define MESHX_MODEL_OP_GEN_ONOFF_SET
struct meshx_gen_cli_cb_param meshx_gen_cli_cb_param_t
Callback parameters for Generic Client Model events. This structure is used to pass information about...
control_task_msg_handle_t meshx_gen_client_cb_t
@ MESHX_GEN_CLI_TIMEOUT
meshx_err_t meshx_plat_gen_cli_delete(meshx_ptr_t *p_pub, meshx_ptr_t *p_cli)
Deletes the Generic OnOff Client model and its associated resources.
meshx_err_t meshx_plat_on_off_gen_cli_create(meshx_ptr_t p_model, meshx_ptr_t *p_pub, meshx_ptr_t *p_onoff_cli)
Creates a Generic OnOff client model and its publication context.
struct dev_struct dev_struct_t
Structure representing the device composition and elements.
uint32_t control_task_msg_evt_t
Type definition for control task message event.
CONTROL_TASK_MSG_EVT_EL_STATE_CH_SET_ON_OFF
@ CONTROL_TASK_MSG_CODE_EL_STATE_CH
meshx_err_t control_task_msg_publish(control_task_msg_code_t msg_code, control_task_msg_evt_t msg_evt, const void *msg_evt_params, size_t sizeof_msg_evt_params)
Publish a control task message.
MeshX Error Codes.
#define MESHX_CALOC
Definition meshx_err.h:28
meshx_err_t
MeshX Error Codes.
Definition meshx_err.h:39
@ MESHX_SUCCESS
Definition meshx_err.h:40
@ MESHX_INVALID_ARG
Definition meshx_err.h:42
@ MESHX_INVALID_STATE
Definition meshx_err.h:45
@ MESHX_NO_MEM
Definition meshx_err.h:44
@ MESHX_TIMEOUT
Definition meshx_err.h:48
#define MESHX_FREE
Definition meshx_err.h:32
static meshx_err_t meshx_handle_gen_onoff_msg(dev_struct_t *pdev, control_task_msg_evt_t model_id, meshx_gen_cli_cb_param_t *param)
Handle the Generic OnOff Client messages.
meshx_err_t meshx_gen_client_from_ble_reg_cb(uint32_t model_id, meshx_gen_client_cb_t cb)
Registers a callback function for a specific generic server model.
struct meshx_gen_client_send_params meshx_gen_client_send_params_t
Generic Client Model send parameters. This structure is used to pass parameters to the Generic Client...
meshx_err_t meshx_gen_cli_send_msg(meshx_gen_client_send_params_t *params)
Sends a Generic Client message over BLE Mesh.
meshx_err_t meshx_gen_client_init(void)
Initialize the meshxuction generic client.
static meshx_err_t meshx_state_change_notify(meshx_lighting_server_cb_param_t *param)
Perform hardware change for the light control server model.
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:73
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:113
#define MESHX_CLIENT_INIT_MAGIC
Header file for the On/Off client model in BLE mesh.
MeshX Tx Control Module This header file contains the definitions and function prototypes for the Mes...
@ MODULE_ID_MODEL_CLIENT
Definition module_id.h:31
@ MODULE_ID_MODEL_SERVER
Definition module_id.h:30
meshx_gen_client_status_cb_t status
Generic Client Model set message union.
meshx_gen_onoff_set_t onoff_set
meshx_gen_onoff_status_cb_t onoff_status