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_light_ctl_client.c
Go to the documentation of this file.
1
12
13#include "meshx_err.h"
15
16#define LIGHT_CTL_CLIENT_INIT_MAGIC 0x8932
17
18#if CONFIG_LIGHT_CTL_CLIENT_COUNT > 0
19
20static uint16_t light_ctl_client_init_flag = 0;
21
34{
35 if (!param)
36 return MESHX_INVALID_ARG;
37
38 meshx_ctl_cli_el_msg_t el_light_ctl_param = {
39 .err_code = status,
40 .ctx = param->ctx,
41 .model = param->model
42 };
43 switch (param->ctx.opcode)
44 {
46 el_light_ctl_param.ctl_state.lightness = param->status.ctl_status.present_ctl_lightness;
48 break;
52 break;
56 break;
58 el_light_ctl_param.ctl_state.delta_uv = param->status.ctl_default_status.delta_uv;
59 el_light_ctl_param.ctl_state.lightness = param->status.ctl_default_status.lightness;
60 el_light_ctl_param.ctl_state.temperature = param->status.ctl_default_status.temperature;
61 break;
62
63 default:
64 break;
65 }
67 {
68 el_light_ctl_param.err_code = MESHX_TIMEOUT;
69 }
70
74 &el_light_ctl_param,
76
77}
78
92 const dev_struct_t *pdev,
95)
96{
97 if (model_id != MESHX_MODEL_ID_LIGHT_CTL_CLI || !pdev || !param)
98 return MESHX_INVALID_ARG;
99
100 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "op|src|dst:%04" PRIx32 "|%04x|%04x",
101 param->ctx.opcode, param->ctx.src_addr, param->ctx.dst_addr);
105
106 return err;
107}
108
118{
120
122 return MESHX_SUCCESS;
123
125
127 if (err)
128 {
129 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Failed to initialize meshx client");
130 }
131
135 );
136 if (err)
137 {
138 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Failed to register Light CTL Client callback: %d", err);
139 }
140
141 return err;
142}
143
158{
159 if (!p_model || !p_sig_model)
160 {
161 return MESHX_INVALID_ARG;
162 }
163
165 if (!*p_model)
166 {
167 return MESHX_NO_MEM;
168 }
169
171 p_sig_model,
172 &((*p_model)->meshx_pub),
173 &((*p_model)->meshx_gen));
174}
175
189{
190 if (p_model == NULL || *p_model == NULL)
191 {
192 return MESHX_INVALID_ARG;
193 }
194
196 &((*p_model)->meshx_pub),
197 &((*p_model)->meshx_gen)
198 );
199
200 MESHX_FREE(*p_model);
201 *p_model = NULL;
202
203 return MESHX_SUCCESS;
204}
205
218{
220 if (!params || !params->model || !params->model->meshx_sig)
221 {
222 return MESHX_INVALID_ARG; // Invalid model pointer
223 }
225 .state = &set,
226 .addr = params->addr,
227 .opcode = params->opcode,
228 .app_idx = params->app_idx,
229 .net_idx = params->net_idx,
230 .model = params->model->meshx_sig,
231 };
232
234 {
236 }
237 else if (params->opcode == MESHX_MODEL_OP_LIGHT_CTL_SET ||
239 {
240 set.ctl_set.op_en = false;
241 set.ctl_set.tid = params->tid;
242 set.ctl_set.ctl_delta_uv = params->delta_uv;
243 set.ctl_set.ctl_lightness = params->lightness;
244 set.ctl_set.ctl_temperature = params->temperature;
245 }
246 else{
247 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Invalid opcode for Light CTL Client: %04x", params->opcode);
248 return MESHX_INVALID_ARG;
249 }
250 return meshx_gen_light_send_msg(&send_params);
251}
252
265{
267 if (!params || !params->model || !params->model->meshx_sig)
268 {
269 return MESHX_INVALID_ARG; // Invalid model pointer
270 }
272 .state = &set,
273 .addr = params->addr,
274 .opcode = params->opcode,
275 .app_idx = params->app_idx,
276 .net_idx = params->net_idx,
277 .model = params->model->meshx_sig,
278 };
279
281 {
283 }
286 {
287 set.ctl_temperature_set.op_en = false;
288 set.ctl_temperature_set.tid = params->tid;
291
292 }
293 else{
294 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Invalid opcode for Light CTL Client: %04x", params->opcode);
295 return MESHX_INVALID_ARG;
296 }
297
298 return meshx_gen_light_send_msg(&send_params);
299}
300
313{
315 if (!params || !params->model || !params->model->meshx_sig)
316 {
317 return MESHX_INVALID_ARG; // Invalid model pointer
318 }
320 .state = &set,
321 .addr = params->addr,
322 .opcode = params->opcode,
323 .app_idx = params->app_idx,
324 .net_idx = params->net_idx,
325 .model = params->model->meshx_sig,
326 };
327
329 {
331 }
334 {
337 }
338 else{
339 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "Invalid opcode for Light CTL Client: %04x", params->opcode);
340 return MESHX_INVALID_ARG;
341 }
342
343 return meshx_gen_light_send_msg(&send_params);
344}
345
358 const meshx_ctl_cli_el_msg_t *param,
359 meshx_ctl_el_state_t *p_ctl_prev_state,
360 const meshx_ctl_el_state_t *p_ctl_next_state
361)
362{
363 if (!p_ctl_prev_state || !param || !p_ctl_next_state)
364 return MESHX_INVALID_ARG;
365
366 /* Kept for future use */
367 MESHX_UNUSED(p_ctl_next_state);
368 bool state_change = false;
369 if(param->err_code == MESHX_SUCCESS)
370 {
372 {
373 if (p_ctl_prev_state->lightness != param->ctl_state.lightness
374 || p_ctl_prev_state->temperature != param->ctl_state.temperature
375 )
376 {
377 p_ctl_prev_state->lightness = param->ctl_state.lightness;
378 p_ctl_prev_state->temperature = param->ctl_state.temperature;
379 state_change = true;
380 }
381 }
383 {
384 if(p_ctl_prev_state->delta_uv != param->ctl_state.delta_uv
385 || p_ctl_prev_state->temperature != param->ctl_state.temperature)
386 {
387 p_ctl_prev_state->delta_uv = param->ctl_state.delta_uv;
388 p_ctl_prev_state->temperature = param->ctl_state.temperature;
389 state_change = true;
390 }
391 }
393 {
394 if (p_ctl_prev_state->temp_range_max != param->ctl_state.temp_range_max
395 || p_ctl_prev_state->temp_range_min != param->ctl_state.temp_range_min)
396 {
397 p_ctl_prev_state->temp_range_max = param->ctl_state.temp_range_max;
398 p_ctl_prev_state->temp_range_min = param->ctl_state.temp_range_min;
399 state_change = true;
400 }
401 }
403 {
405 }
406 else
407 {
408 /* Return as No CTL related OPCode were received */
410 }
411 }
412 else
413 {
414 MESHX_LOGE(MODULE_ID_MODEL_CLIENT, "CWWW Client Element Message: Error (%d)", param->err_code);
415 /* Retry sending the failed packet done by MeshX Light CTL Layer. Do not notify App */
417 }
418 return state_change ? MESHX_SUCCESS : MESHX_INVALID_STATE;
419}
420
421#endif /* CONFIG_LIGHT_CTL_CLIENT_COUNT > 0 */
#define MESHX_MODEL_ID_LIGHT_CTL_CLI
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_STATUS
#define MESHX_MODEL_OP_LIGHT_CTL_SET
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_GET
#define MESHX_MODEL_OP_LIGHT_CTL_STATUS
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_SET_UNACK
#define MESHX_MODEL_OP_LIGHT_CTL_DEFAULT_STATUS
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_STATUS
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_SET
#define MESHX_MODEL_OP_LIGHT_CTL_SET_UNACK
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_GET
#define MESHX_MODEL_OP_LIGHT_CTL_GET
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_SET
meshx_err_t meshx_plat_light_client_delete(meshx_ptr_t *p_pub, meshx_ptr_t *p_cli)
Deletes the Light client instance and its associated publication context.
struct meshx_gen_light_cli_cb_param meshx_gen_light_cli_cb_param_t
Callback parameters for Generic Light Client Model events. This structure is used to pass information...
control_task_msg_handle_t meshx_gen_light_client_cb_t
@ MESHX_GEN_LIGHT_CLI_TIMEOUT
meshx_err_t meshx_plat_light_ctl_client_create(meshx_ptr_t p_model, meshx_ptr_t *p_pub, meshx_ptr_t *p_light_ctl_cli)
Creates and initializes a Light CTL (Color Temperature Light) client model instance.
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_CODE_EL_STATE_CH
CONTROL_TASK_MSG_EVT_EL_STATE_CH_SET_CTL
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
#define MESHX_UNUSED(x)
Definition meshx_err.h:15
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_DO_NOTHING
Definition meshx_err.h:17
#define MESHX_FREE
Definition meshx_err.h:32
static meshx_err_t meshx_handle_gen_light_msg(dev_struct_t *pdev, control_task_msg_evt_t model_id, meshx_gen_light_cli_cb_param_t *param)
Handle the Generic Light Client messages.
meshx_err_t meshx_gen_light_send_msg(const meshx_gen_light_client_send_params_t *params)
Send a message using the generic client model.
meshx_err_t meshx_gen_light_client_from_ble_reg_cb(uint16_t model_id, meshx_gen_light_client_cb_t cb)
Registers a callback function for getting Generic Light Client messages from BLE.
struct meshx_gen_light_client_send_params meshx_gen_light_client_send_params_t
Generic Light Client Model send parameters. This structure is used to pass parameters to the Generic ...
meshx_err_t meshx_gen_light_cli_init(void)
Initialize the meshxuction generic client.
meshx_err_t meshx_light_ctl_client_delete(meshx_light_ctl_client_model_t **p_model)
Delete the Light client model instance.
static meshx_err_t meshx_handle_gen_light_msg(const dev_struct_t *pdev, control_task_msg_evt_t model_id, const meshx_gen_light_cli_cb_param_t *param)
Handles generic light model messages for the Light CTL client.
meshx_err_t meshx_light_ctl_state_change_handle(const meshx_ctl_cli_el_msg_t *param, meshx_ctl_el_state_t *p_ctl_prev_state, const meshx_ctl_el_state_t *p_ctl_next_state)
Handles state changes for the Light CTL client element.
static meshx_err_t meshx_ctl_state_change_notify(const meshx_gen_light_cli_cb_param_t *param, uint8_t status)
Notifies about a change in the CTL (Color Temperature Lightness) state.
meshx_err_t meshx_light_ctl_client_create(meshx_light_ctl_client_model_t **p_model, void *p_sig_model)
Creates and initializes a Generic Light Client model instance.
meshx_err_t meshx_light_ctl_temperature_client_send_msg(meshx_gen_ctl_send_params_t *params)
Sends a Light CTL Temperature message from the client model.
meshx_err_t meshx_light_ctl_client_init()
Initialize the Light CTL Client model.
#define LIGHT_CTL_CLIENT_INIT_MAGIC
meshx_err_t meshx_light_ctl_temp_range_client_send_msg(meshx_gen_ctl_send_params_t *params)
Sends a Light CTL Temperature Range message from the client model.
meshx_err_t meshx_light_ctl_client_send_msg(meshx_gen_ctl_send_params_t *params)
Sends a Light CTL (Color Temperature Lightness) message from the Light CTL Client model.
static uint16_t light_ctl_client_init_flag
Header file for the Light CTL (Color Temperature Light) Client model.
struct meshx_ctl_el_state meshx_ctl_el_state_t
Structure to hold arguments for sending Light CTL messages.
struct meshx_ctl_cli_el_msg meshx_ctl_cli_el_msg_t
Structure to hold the On/Off Server to element message.
struct meshx_gen_ctl_send_params meshx_gen_ctl_send_params_t
Structure to hold the parameters for sending a Generic Ctl message.
meshx_model_interface_t meshx_light_ctl_client_model_t
Structure representing the Light CTL (Color Temperature Lightness) client model in MeshX.
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:73
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:113
@ MODULE_ID_MODEL_CLIENT
Definition module_id.h:31
@ MODULE_ID_MODEL_SERVER
Definition module_id.h:30
meshx_ctl_el_state_t ctl_state
uint16_t src_addr
uint16_t dst_addr
meshx_light_ctl_client_model_t * model
meshx_gen_light_client_status_cb_t status
meshx_light_ctl_temperature_range_status_cb_t ctl_temperature_range_status
meshx_light_ctl_temperature_status_cb_t ctl_temperature_status
meshx_light_ctl_default_status_cb_t ctl_default_status
Lighting Client Model set message union.
meshx_light_ctl_temperature_range_set_t ctl_temperature_range_set
meshx_light_ctl_temperature_set_t ctl_temperature_set