MeshX 0.4
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_cwww_element.cpp File Reference

Implementation of MeshX CWWW Element (Tasks A-E). More...

Data Structures

struct  meshx_light_ctl_cli_msg

Macros

#define CONFIG_SERVER_CB_MASK
#define CWWW_CLI_TO_BLE_EVT_MASK   (CONTROL_TASK_MSG_EVT_TO_BLE_SET_ON_OFF | CONTROL_TASK_MSG_EVT_TO_BLE_SET_CTL)
#define CWWW_SRV_TO_BLE_EVT_MASK   (CONTROL_TASK_MSG_EVT_TO_BLE_SET_ON_OFF_SRV | CONTROL_TASK_MSG_EVT_TO_BLE_SET_CTL_SRV)
#define MESHX_GEN_ON_OFF_CLI_MSG_ACK   1
#define MESHX_GEN_ON_OFF_CLI_MSG_NO_ACK   0

Typedefs

typedef struct meshx_light_ctl_cli_msg meshx_light_ctl_cli_msg_t

Functions

meshx_err_t cwww_cli_ut_handler (int cmd_id, int argc, char **argv)
meshx_err_t cwww_srv_ut_handler (int cmd_id, int argc, char **argv)
meshx_err_t create_cwww_server_elements_cpp (dev_struct_t *pdev, uint16_t element_cnt)
 C++ factory for CWWW Server elements.
meshx_err_t create_cwww_client_elements_cpp (dev_struct_t *pdev, uint16_t element_cnt)
 C++ factory for CWWW Client elements.

Detailed Description

Implementation of MeshX CWWW Element (Tasks A-E).

Author
Pranjal Chanda
Date
2024-2025

Macro Definition Documentation

◆ CONFIG_SERVER_CB_MASK

#define CONFIG_SERVER_CB_MASK
Value:
CONTROL_TASK_MSG_EVT_PUB_ADD
Definition meshx_control_task.h:146
CONTROL_TASK_MSG_EVT_APP_KEY_BIND
Definition meshx_control_task.h:142
CONTROL_TASK_MSG_EVT_PUB_DEL
Definition meshx_control_task.h:147
29#define CONFIG_SERVER_CB_MASK \
30 CONTROL_TASK_MSG_EVT_PUB_ADD \
31 | CONTROL_TASK_MSG_EVT_PUB_DEL \
32 | CONTROL_TASK_MSG_EVT_APP_KEY_BIND

◆ CWWW_CLI_TO_BLE_EVT_MASK

◆ CWWW_SRV_TO_BLE_EVT_MASK

◆ MESHX_GEN_ON_OFF_CLI_MSG_ACK

#define MESHX_GEN_ON_OFF_CLI_MSG_ACK   1

◆ MESHX_GEN_ON_OFF_CLI_MSG_NO_ACK

#define MESHX_GEN_ON_OFF_CLI_MSG_NO_ACK   0

Typedef Documentation

◆ meshx_light_ctl_cli_msg_t

Function Documentation

◆ create_cwww_client_elements_cpp()

meshx_err_t create_cwww_client_elements_cpp ( dev_struct_t * pdev,
uint16_t element_cnt )

C++ factory for CWWW Client elements.

Constructs CONFIG_LIGHT_CWWW_CLIENT_COUNT meshXCWWWClientElement objects and registers each with the platform BLE Mesh composition.

Parameters
pdevPointer to the device structure.
element_cntNumber of light CWWW client elements to create. Capped by CONFIG_LIGHT_CWWW_CLI_COUNT.
Returns
MESHX_SUCCESS on success, error code otherwise.
456{
458 pdev,
459 element_cnt,
460 CONFIG_LIGHT_CWWW_CLIENT_COUNT,
462 "CWWW Cli"
463 );
464}
meshx_err_t meshx_element_factory_helper(dev_struct_t *pdev, uint16_t requested_cnt, uint16_t max_cnt, module_id_t module_id, const char *log_name)
Helper function to create and register mesh elements.
Definition meshx_element_factory.hpp:33
@ MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT
Definition module_id.h:29

◆ create_cwww_server_elements_cpp()

meshx_err_t create_cwww_server_elements_cpp ( dev_struct_t * pdev,
uint16_t element_cnt )

C++ factory for CWWW Server elements.

Constructs CONFIG_LIGHT_CWWW_SRV_COUNT meshXCWWWServerElement objects and registers each with the platform BLE Mesh composition.

Parameters
pdevPointer to the device structure.
element_cntNumber of light CWWW server elements to create. Capped by CONFIG_LIGHT_CWWW_SRV_COUNT.
Returns
MESHX_SUCCESS on success, error code otherwise.
432{
434 pdev,
435 element_cnt,
436 CONFIG_LIGHT_CWWW_SRV_COUNT,
438 "CWWW Srv"
439 );
440}
@ MODULE_ID_ELEMENT_LIGHT_CWWW_SERVER
Definition module_id.h:33

◆ cwww_cli_ut_handler()

meshx_err_t cwww_cli_ut_handler ( int cmd_id,
int argc,
char ** argv )
469{
470 if (argc < 1) return MESHX_INVALID_ARG;
471 uint16_t el_id = UT_GET_ARG(0, uint16_t, argv);
472
473 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: cmd_id=%d, argc=%d, el_id=%d", cmd_id, argc, el_id);
474
476 el_id, MESHX_ELEMENT_TYPE_LIGHT_CWWW_CLIENT);
477 if (!el) {
478 MESHX_LOGE(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: Element %d not found!", el_id);
479 return MESHX_NOT_FOUND;
480 }
481
482 auto &ctx = el->get_ctx();
483 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "CWWW Cli [%d]: pub_addr=0x%04x, app_id=%d", el_id, ctx.pub_addr, ctx.app_id);
484 if (ctx.pub_addr == MESHX_ADDR_UNASSIGNED) {
485 MESHX_LOGW(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "CWWW Cli [%d]: no pub addr", el_id);
486 }
487
488 if (cmd_id == 0x01 || cmd_id == 0x02) { // ONOFF SET / SET UNACK
490 msg.ack = (uint8_t)(cmd_id == 0x01 ? 1 : 0);
492 msg.on_off = ctx.gen_on_off_state.next_on_off;
493 msg.reserved = 0;
494 msg.element_id = el_id;
495
496 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: Publishing ONOFF SET, on_off=%d, ack=%d, size=%zu",
497 msg.on_off, msg.ack, sizeof(msg));
499 }
500 else if (cmd_id == 0x04 || cmd_id == 0x05) { // CTL SET / SET UNACK
501 if (argc < 4) return MESHX_INVALID_ARG;
503 msg.ack = (cmd_id == 0x04);
505 msg.element_id = el_id;
506
507 msg.lightness = UT_GET_ARG(1, uint16_t, argv);
508 msg.temperature = UT_GET_ARG(2, uint16_t, argv);
509 msg.delta_uv = UT_GET_ARG(3, int16_t, argv);
510
511 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: Publishing CTL SET, light=%d, temp=%d, delta=%d, ack=%d, size=%zu",
512 msg.lightness, msg.temperature, msg.delta_uv, msg.ack, sizeof(msg));
514 }
515 else if (cmd_id == 0x06 || cmd_id == 0x07) { // LIGHTNESS SET / UNACK
516 if (argc < 2) return MESHX_INVALID_ARG;
518 msg.ack = (cmd_id == 0x06);
520 msg.element_id = el_id;
521 msg.lightness = UT_GET_ARG(1, uint16_t, argv);
522 msg.temperature = ctx.light_ctl_state.temperature;
523 msg.delta_uv = ctx.light_ctl_state.delta_uv;
524
525 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: Publishing Lightness SET, value=%d, ack=%d, size=%zu",
526 msg.lightness, msg.ack, sizeof(msg));
528 }
529 else if (cmd_id == 0x08 || cmd_id == 0x09) { // TEMPERATURE SET / UNACK
530 if (argc < 2) return MESHX_INVALID_ARG;
532 msg.ack = (cmd_id == 0x08);
534 msg.element_id = el_id;
535 msg.temperature = UT_GET_ARG(1, uint16_t, argv);
536 msg.lightness = ctx.light_ctl_state.lightness;
537 msg.delta_uv = ctx.light_ctl_state.delta_uv;
538
539 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: Publishing Temp SET, value=%d, ack=%d, size=%zu",
540 msg.temperature, msg.ack, sizeof(msg));
542 }
543 else if (cmd_id == 0x0A || cmd_id == 0x0B) { // DELTA UV SET / UNACK
544 if (argc < 2) return MESHX_INVALID_ARG;
546 msg.ack = (cmd_id == 0x0A);
548 msg.element_id = el_id;
549 msg.delta_uv = UT_GET_ARG(1, int16_t, argv);
550 msg.lightness = ctx.light_ctl_state.lightness;
551 msg.temperature = ctx.light_ctl_state.temperature;
552
553 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_CLIENT, "cwww_cli_ut_handler: Publishing DeltaUV SET, value=%d, ack=%d, size=%zu",
554 msg.delta_uv, msg.ack, sizeof(msg));
556 }
557 return MESHX_FAIL;
558}
#define MESHX_GEN_ON_OFF_CLI_MSG_SET
Definition ble_mesh/elements/inc/meshx_relay_msg_defs.h:26
struct meshx_gen_on_off_cli_msg meshx_gen_on_off_cli_msg_t
Standard Relay Client Message structure (shared between C element and C++ model).
Definition meshx_cwww_element.hpp:139
meshx_cwww_cli_el_ctx_t & get_ctx()
Definition meshx_cwww_element.hpp:184
T * find_and_cast(uint16_t element_idx, meshx_element_type_t expected_variant)
Find and cast an element instance.
Definition meshx_element_registry.hpp:84
static meshXElementRegistry & get_instance()
Definition meshx_element_registry.hpp:33
#define MESHX_ADDR_UNASSIGNED
Definition meshx_ble_mesh_cmn_def.h:30
CONTROL_TASK_MSG_EVT_TO_BLE_SET_CTL
Definition meshx_control_task.h:110
@ CONTROL_TASK_MSG_CODE_TO_BLE
Definition meshx_control_task.h:67
CONTROL_TASK_MSG_EVT_TO_BLE_SET_ON_OFF
Definition meshx_control_task.h:109
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.
Definition meshx_control_task.c:84
struct meshx_light_ctl_cli_msg meshx_light_ctl_cli_msg_t
@ MESHX_INVALID_ARG
Definition meshx_err.h:46
@ MESHX_FAIL
Definition meshx_err.h:45
@ MESHX_NOT_FOUND
Definition meshx_err.h:50
#define MESHX_LOGW(module_id, format,...)
Definition meshx_log.h:120
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:126
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:114
uint8_t set_get
Definition ble_mesh/elements/inc/meshx_relay_msg_defs.h:21
uint16_t element_id
Definition ble_mesh/elements/inc/meshx_relay_msg_defs.h:23
uint8_t reserved
Definition ble_mesh/elements/inc/meshx_relay_msg_defs.h:22
uint8_t on_off
Definition ble_mesh/elements/inc/variants/meshx_relay_msg_defs.h:22
uint8_t ack
Definition ble_mesh/elements/inc/meshx_relay_msg_defs.h:20
uint16_t temperature
Definition meshx_cwww_element.cpp:49
uint16_t lightness
Definition meshx_cwww_element.cpp:48
int16_t delta_uv
Definition meshx_cwww_element.cpp:50
bool ack
Definition meshx_cwww_element.cpp:46
uint8_t set_get
Definition meshx_cwww_element.cpp:47
uint16_t element_id
Definition meshx_cwww_element.cpp:45
#define UT_GET_ARG(_x, _type, _argv)
Macro to extract an argument from the argument list.
Definition unit_test.h:31

◆ cwww_srv_ut_handler()

meshx_err_t cwww_srv_ut_handler ( int cmd_id,
int argc,
char ** argv )
561{
562 if (argc < 1) return MESHX_INVALID_ARG;
563 uint16_t el_id = UT_GET_ARG(0, uint16_t, argv);
564
565 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_SERVER, "cwww_srv_ut_handler: cmd_id=%d, argc=%d, el_id=%d", cmd_id, argc, el_id);
566
568 el_id, MESHX_ELEMENT_TYPE_LIGHT_CWWW_SERVER);
569 if (!el) {
570 MESHX_LOGE(MODULE_ID_ELEMENT_LIGHT_CWWW_SERVER, "cwww_srv_ut_handler: Element %d not found!", el_id);
571 return MESHX_NOT_FOUND;
572 }
573
574 if (cmd_id == 0x01) { // Check ONOFF state
575 uint8_t expected = UT_GET_ARG(1, uint8_t, argv);
576 uint8_t actual = el->get_onoff();
577 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_SERVER, "CWWW Server [%d] ONOFF state: %d, expected: %d", el_id, actual, expected);
578 return (actual == expected) ? MESHX_SUCCESS : MESHX_FAIL;
579 }
580 else if (cmd_id == 0x02) { // Check CTL state
581 uint16_t exp_light = UT_GET_ARG(1, uint16_t, argv);
582 uint16_t exp_temp = UT_GET_ARG(2, uint16_t, argv);
583 auto actual = el->get_ctl();
584 MESHX_LOGI(MODULE_ID_ELEMENT_LIGHT_CWWW_SERVER, "CWWW Server [%d] CTL state: light %d, temp %d, expected: light %d, temp %d",
585 el_id, actual.lightness, actual.temperature, exp_light, exp_temp);
586 return (actual.lightness == exp_light && actual.temperature == exp_temp) ? MESHX_SUCCESS : MESHX_FAIL;
587 }
588 return MESHX_FAIL;
589}
Definition meshx_cwww_element.hpp:61
**This function is called by the parent element when a state change request *is received It validates the request and returns a result to the element not the model layer **return * MESHX_SUCCESS
Definition meshx_model_level.cpp:385