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_srv.c
Go to the documentation of this file.
1
13
14#include <meshx_light_ctl_srv.h>
15
16#define MESHX_SERVER_INIT_MAGIC_NO 0x2483
17
18#if CONFIG_ENABLE_LIGHT_CTL_SERVER
19
32
39static struct
40{
45 .ctl_setup_server = {
46 .ctl_setup_server_init = 0,
47 .meshx_srv_model = NULL,
48 },
49 .ctl_lighting_server_init = 0,
50 .ctl_lighting_server_created = 0,
51};
52
66{
67 meshx_light_ctl_srv_t ctl_srv_params = {
68 .model = param->model};
69
71 {
72 switch (param->ctx.opcode)
73 {
76 ctl_srv_params.state.delta_uv = param->state_change.ctl_set.delta_uv;
77 ctl_srv_params.state.lightness = param->state_change.ctl_set.lightness;
78 ctl_srv_params.state.temperature = param->state_change.ctl_set.temperature;
79 break;
82 ctl_srv_params.state.delta_uv = param->state_change.ctl_temp_set.delta_uv;
84 break;
85 default:
87 }
88 /* Send msg for hw manipulation */
89 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "HW change requested, Element_id: 0x%x",
90 param->model.el_id);
91
95 &ctl_srv_params,
96 sizeof(meshx_light_ctl_srv_t));
97 return err;
98 }
100}
101
118 const control_task_msg_evt_t evt,
120{
122 return MESHX_INVALID_ARG;
124
125 bool send_reply_to_src = false;
126 bool state_change_notify = false;
127 uint32_t op_code = param->ctx.opcode;
128 uint32_t status_op = 0;
129 switch (op_code)
130 {
135 /* Ignore, as these are status messages */
136 break;
142 if (op_code != MESHX_MODEL_OP_LIGHT_CTL_GET)
143 state_change_notify = true;
144
146 send_reply_to_src = true;
147
148 break;
154 state_change_notify = true;
155
157 send_reply_to_src = true;
158 break;
166
168 send_reply_to_src = true;
169
170 break;
177
179 send_reply_to_src = true;
180
181 break;
182 default:
183 MESHX_LOGW(MODULE_ID_MODEL_SERVER, "CTL Unhandled Event %p", (void *)param->ctx.opcode);
184 break;
185 }
186 if (state_change_notify)
187 {
188 err = meshx_state_change_notify(param);
189 if (err)
190 return err;
191 }
192 if (send_reply_to_src
193 /* This is meant to notify the respective publish client */
194 || param->ctx.src_addr != param->model.pub_addr)
195 {
196 /* Here the message was received from unregistered source and mention the state to the respective client */
197 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "PUB: src|pub %x|%x", param->ctx.src_addr, param->model.pub_addr);
198 param->ctx.opcode = (uint16_t)status_op;
199 param->ctx.dst_addr = param->model.pub_addr;
200
203 param
204 );
205 }
206
207 return err;
208}
209
219{
220 if (g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model != NULL)
221 {
222 MESHX_FREE(g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model);
223 g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model = NULL;
224
226 &(g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model->meshx_pub),
227 &(g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model->meshx_gen)
228 );
229
230 g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model = NULL;
231 }
232
233 g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model = 0;
234 return MESHX_SUCCESS;
235}
236
247{
249 if ( g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model != NULL
250 || g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_server_init == MESHX_SERVER_INIT_MAGIC_NO)
251 return MESHX_SUCCESS;
252
253 g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model =
255 if (NULL == g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model)
256 {
257 return MESHX_NO_MEM;
258 }
259
261 &g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_srv_model,
262 &g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model->meshx_pub,
263 &g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model->meshx_gen);
264 if(err != MESHX_SUCCESS)
265 {
266 /* Tops down deinit for CTL setup server model */
268 return err;
269 }
270 else
271 {
272 g_meshx_light_ctl_srv.ctl_lighting_server_init++;
273 }
274
275 return err;
276}
277
290{
291 if (!p_model)
292 return MESHX_INVALID_ARG;
293
294 if (g_meshx_light_ctl_srv.ctl_setup_server.meshx_srv_model == NULL)
295 return MESHX_FAIL;
296
297 memcpy(p_model, &g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_srv_model, sizeof(MESHX_MODEL));
298 return MESHX_SUCCESS;
299}
300
312{
314
315 if (g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_server_init == MESHX_SERVER_INIT_MAGIC_NO)
316 return MESHX_SUCCESS;
317
318 g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_server_init = MESHX_SERVER_INIT_MAGIC_NO;
319
321 if (err)
322 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to initialize prod server");
323
327 );
328 if (err)
329 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to initialize meshx_gen_srv_reg_cb (Err: %d)", err);
330
334 );
335 if (err)
336 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to initialize meshx_gen_srv_reg_cb (Err: %d)", err);
337
338 return err;
339}
340
358{
360 if (!p_model || !p_sig_model)
361 {
362 return MESHX_INVALID_ARG;
363 }
364
366 if (!*p_model)
367 {
368 return MESHX_NO_MEM;
369 }
370
372 p_sig_model,
373 &((*p_model)->meshx_pub),
374 &((*p_model)->meshx_gen));
375 if(err != MESHX_SUCCESS)
376 {
377 /* Tops down deinit for CTL server model */
379 return err;
380 }
381
382 if( g_meshx_light_ctl_srv.ctl_lighting_server_created == 0
383 && g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_server_init == 0)
384 {
385 MESHX_LOGI(MODULE_ID_MODEL_SERVER, "Creating CTL setup server model");
386 /* Create CTL setup server */
388 if(err != MESHX_SUCCESS)
389 {
390 /* Tops down deinit for CTL server model */
392 /* The code execution below is only possible if this is the very first model being created */
394 return err;
395 }
396 g_meshx_light_ctl_srv.ctl_setup_server.ctl_setup_server_init = MESHX_SERVER_INIT_MAGIC_NO;
397 }
398 else
399 {
400 g_meshx_light_ctl_srv.ctl_lighting_server_created++;
401 }
402
403 (*p_model)->meshx_sig = p_sig_model;
404
405 return err;
406}
407
421{
422 if (p_model == NULL || *p_model == NULL)
423 {
424 return MESHX_INVALID_ARG;
425 }
426
428 &((*p_model)->meshx_pub),
429 &((*p_model)->meshx_gen));
430
431 MESHX_FREE(*p_model);
432 *p_model = NULL;
433 if (g_meshx_light_ctl_srv.ctl_lighting_server_created == 0)
434 {
435 MESHX_LOGW(MODULE_ID_MODEL_SERVER, "Deleting CTL setup server model");
436 /* Delete CTL setup server */
437 }
438 else
439 {
440 g_meshx_light_ctl_srv.ctl_lighting_server_created--;
441 }
442 return MESHX_SUCCESS;
443}
444
460{
461 if (!p_model)
462 return MESHX_INVALID_STATE;
463
465 ctl_state.delta_uv,
466 ctl_state.lightness,
467 ctl_state.temperature,
468 ctl_state.temperature_range_max,
469 ctl_state.temperature_range_min);
470}
471
487 meshx_ctx_t *ctx,
488 int16_t delta_uv,
489 uint16_t lightness,
490 uint16_t temperature)
491{
492 if (!p_model)
493 {
494 return MESHX_INVALID_ARG;
495 }
496
498 .ctl_set = {
499 .delta_uv = delta_uv,
500 .lightness = lightness,
501 .temperature = temperature
502 }
503 };
504
506 p_model,
507 ctx,
508 &state_change
509 );
510
511 if (err != MESHX_SUCCESS)
512 {
513 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to send Light CTL status: %d", err);
514 }
515
516 return err;
517}
518
537 meshx_ptr_t p_model,
538 uint16_t element_id,
539 uint16_t net_idx,
540 uint16_t app_idx,
541 uint16_t pub_addr,
543 meshx_lighting_server_cb_param_t *light_srv_send)
544{
545 if (!p_model || !light_srv_send)
546 {
547 return MESHX_INVALID_ARG;
548 }
549
550 memset(light_srv_send, 0, sizeof(meshx_lighting_server_cb_param_t));
551 light_srv_send->ctx.net_idx = net_idx;
552 light_srv_send->ctx.app_idx = app_idx;
553 light_srv_send->ctx.src_addr = element_id;
554 light_srv_send->ctx.dst_addr = pub_addr;
556 light_srv_send->ctx.p_ctx = NULL;
557
558 light_srv_send->model.el_id = element_id;
559 light_srv_send->model.p_model = p_model;
560
561 light_srv_send->state_change.ctl_set.delta_uv = ctl_state.delta_uv;
562 light_srv_send->state_change.ctl_set.lightness = ctl_state.lightness;
563 light_srv_send->state_change.ctl_set.temperature = ctl_state.temperature;
564
565 return MESHX_SUCCESS;
566}
567
568#endif /* CONFIG_ENABLE_LIGHT_CTL_SERVER */
meshx_err_t meshx_is_group_subscribed(meshx_model_t *p_model, uint16_t addr)
Checks if a model is subscribed to a specific group address.
struct meshx_model meshx_model_t
struct meshx_ctx meshx_ctx_t
Structure to hold context information for BLE Mesh operations.
#define MESHX_ADDR_IS_GROUP(_addr)
#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
void * meshx_ptr_t
#define MESHX_MODEL_ID_LIGHT_CTL_SETUP_SRV
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_SET_UNACK
#define MESHX_MODEL_OP_LIGHT_CTL_DEFAULT_GET
#define MESHX_MODEL_ID_LIGHT_CTL_SRV
#define MESHX_MODEL_OP_LIGHT_CTL_DEFAULT_SET_UNACK
#define MESHX_MODEL_OP_LIGHT_CTL_DEFAULT_STATUS
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_STATUS
#define MESHX_MODEL_OP_LIGHT_CTL_DEFAULT_SET
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK
#define MESHX_MODEL_OP_LIGHT_CTL_TEMPERATURE_SET
#define MESHX_ADDR_IS_UNICAST(_addr)
#define MESHX_ADDR_BROADCAST(_addr)
#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_ctl_setup_srv_create(meshx_ptr_t p_model, meshx_ptr_t *p_pub, meshx_ptr_t *p_ctl_srv)
Creates and initializes a Light CTL (Color Temperature Lightness) Setup Server model instance.
meshx_err_t meshx_plat_light_srv_delete(meshx_ptr_t *p_pub, meshx_ptr_t *p_ctl_srv)
Delete a Light CTL Server instance.
struct meshx_light_ctl_srv_state meshx_light_ctl_srv_state_t
struct meshx_light_ctl_srv meshx_light_ctl_srv_t
Structure representing the Light CTL Server model.
meshx_err_t meshx_plat_light_ctl_srv_create(meshx_ptr_t p_model, meshx_ptr_t *p_pub, meshx_ptr_t *p_ctl_srv)
Create a Light CTL Server instance.
struct meshx_lighting_server_cb_param meshx_lighting_server_cb_param_t
meshx_err_t meshx_plat_light_ctl_srv_restore(meshx_ptr_t p_model, uint16_t delta_uv, uint16_t lightness, uint16_t temperature, uint16_t temp_range_max, uint16_t temp_range_min)
Restore the state of the Light CTL Server.
struct dev_struct dev_struct_t
Structure representing the device composition and elements.
CONTROL_TASK_MSG_EVT_TO_BLE_SET_CTL_SRV
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.
#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_NOT_SUPPORTED
Definition meshx_err.h:47
@ MESHX_FAIL
Definition meshx_err.h:41
@ MESHX_INVALID_STATE
Definition meshx_err.h:45
@ MESHX_NO_MEM
Definition meshx_err.h:44
#define MESHX_DO_NOTHING
Definition meshx_err.h:17
#define MESHX_FREE
Definition meshx_err.h:32
#define MESHX_SERVER_INIT_MAGIC_NO
uint16_t ctl_lighting_server_created
uint16_t ctl_lighting_server_init
meshx_err_t meshx_light_ctl_server_create(meshx_ctl_server_model_t **p_model, meshx_ptr_t p_sig_model)
Create and initialize a new CTL server model instance.
meshx_light_ctl_setup_server_t ctl_setup_server
static meshx_err_t meshx_handle_light_ctl_msg(const dev_struct_t *pdev, const control_task_msg_evt_t evt, meshx_lighting_server_cb_param_t *param)
Handle Light CTL messages for the lighting server model.
meshx_err_t meshx_get_ctl_setup_srv_model(meshx_ptr_t p_model)
Retrieves the CTL (Color Temperature Lightness) Setup Server model instance.
meshx_err_t meshx_light_ctl_srv_state_restore(meshx_ctl_server_model_t *p_model, meshx_light_ctl_srv_state_t ctl_state)
Restore the CTL state for the generic server model.
static meshx_err_t meshx_light_ctl_setup_server_delete(void)
Deletes or deinitializes the Light CTL (Color Temperature Lightness) Setup Server instance.
meshx_err_t meshx_light_ctl_srv_status_send(meshx_model_t *p_model, meshx_ctx_t *ctx, int16_t delta_uv, uint16_t lightness, uint16_t temperature)
Send the Light CTL status message.
static meshx_err_t meshx_light_ctl_setup_server_create(void)
Creates and initializes the Light CTL (Color Temperature Lightness) Setup Server.
static meshx_err_t meshx_state_change_notify(meshx_lighting_server_cb_param_t *param)
Perform hardware change for the light control server model.
meshx_err_t meshx_light_ctl_srv_send_pack_create(meshx_ptr_t p_model, uint16_t element_id, uint16_t net_idx, uint16_t app_idx, uint16_t pub_addr, meshx_light_ctl_srv_state_t ctl_state, meshx_lighting_server_cb_param_t *light_srv_send)
Create a Light CTL Server send message packet.
static struct @162134341120176320346270047367114065256252040066 g_meshx_light_ctl_srv
Structure to maintain the initialization and creation state of the MeshX Light CTL Server.
meshx_err_t meshx_light_ctl_server_init(void)
Initialize the Light CTL Server model.
meshx_err_t meshx_light_ctl_server_delete(meshx_ctl_server_model_t **p_model)
Delete the CTL server model instance.
struct meshx_light_ctl_setup_server meshx_light_ctl_setup_server_t
Structure representing the MeshX Light CTL Setup Server.
Header file for the Light CTL Server module.
meshx_model_interface_t meshx_ctl_server_model_t
Structure representing the MeshX CTL (Color Temperature Lightness) server model.
meshx_model_interface_t meshx_ctl_setup_server_model_t
Structure representing the MeshX CTL (Color Temperature Lightness) Setup Server Model.
meshx_err_t meshx_lighting_srv_init(void)
Initialize the production lighting server.
meshx_err_t meshx_gen_light_srv_status_send(meshx_model_t *p_model, meshx_ctx_t *ctx, meshx_lighting_server_state_change_t *state_change)
Sends a status message for the Lighting Server model.
control_task_msg_handle_t meshx_lighting_server_cb
meshx_err_t meshx_lighting_reg_cb(uint32_t model_id, meshx_lighting_server_cb cb)
Register a callback function for the lighting server model.
meshx_err_t meshx_gen_light_srv_send_msg_to_ble(control_task_msg_evt_to_ble_t evt, const meshx_lighting_server_cb_param_t *params)
Sends a message to the BLE subsystem via the control task.
#define MESHX_LOGW(module_id, format,...)
Definition meshx_log.h:87
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:100
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:73
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:113
#define MESHX_MODEL
@ MODULE_ID_MODEL_SERVER
Definition module_id.h:30
meshx_ptr_t p_ctx
uint16_t src_addr
uint16_t dst_addr
Structure representing the MeshX Light CTL Setup Server.
meshx_ctl_setup_server_model_t * meshx_srv_model
meshx_light_ctl_srv_state_t state
meshx_lighting_server_state_change_t state_change
meshx_ptr_t p_model
Lighting Server Model state change value union.
meshx_state_change_light_ctl_temperature_set_t ctl_temp_set
meshx_state_change_light_ctl_set_t ctl_set