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
meshXLightHSLServerModel Class Reference

A template class for creating Light HSL Server models. More...

#include <meshx_model_hsl.hpp>

Inheritance diagram for meshXLightHSLServerModel:
meshXServerModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t > meshXModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t > meshXModelIF

Public Member Functions

meshx_err_t model_send (meshx_light_hsl_send_params_t *params) override
 Send a packet to the MeshX stack based on the given parameters.
meshx_err_t model_from_ble_cb (dev_struct_t *, control_task_msg_evt_t, meshx_ptr_t) override
 This function is the callback for the Light HSL Server model.
meshx_err_t request_status (uint16_t dst_addr=0)
 meshXLightHSLServerModel (meshXElementIF *parent_element=nullptr, meshx_ptr_t parent_element_state=nullptr, uint16_t model_func_id=0)
 Constructor for Light HSL Server Model.
 ~meshXLightHSLServerModel ()=default
Public Member Functions inherited from meshXServerModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t >
 meshXServerModel (MESHX_MODEL *p_plat_model, uint32_t model_id, meshXElementIF *parent_element=nullptr, meshx_ptr_t parent_element_state=nullptr, uint16_t model_func_id=0)
 Construct a new Server Model.
Public Member Functions inherited from meshXModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t >
void set_plat_model (MESHX_MODEL *p_model) override
 Set the platform-specific model instance.
meshx_err_t model_handle_from_ble_cb (dev_struct_t *p_dev, evt_model_id_t evt_model_id, meshx_ptr_t params)
 Handle upstream BLE Mesh events.
void on_baked (void) override
 Called when the model's parent element is baked.
virtual ~meshXModel ()
 Destructor for meshXModel.
meshx_err_t send_to_parent_element (meshx_ptr_t msg_ptr, size_t msg_size)
 Send message to parent element.
uint16_t get_model_func_id (void) const
 Get the model function identifier.
void set_model_func_id (uint16_t func_id)
 Set the model function identifier.
uint16_t get_model_id (void) const override
 Get the model identifier.
bool is_initialized (void) const override
 Check if the model is successfully initialized.
void set_model_id (uint16_t id)
 Set the model identifier.
meshx_err_t get_init_status (void) const
 Get the model initialization status.
meshXBaseLightServerModelget_base_model (void) const
 Get the base model instance.
 meshXModel (MESHX_MODEL *p_plat_model, uint32_t model_id, meshXElementIF *parent_element=nullptr, uint16_t model_func_id=0)
 Constructs a new meshXModel instance.
Public Member Functions inherited from meshXModelIF
 meshXModelIF ()
 meshXModelIF (MESHX_MODEL *p_plat_model)
virtual ~meshXModelIF ()=default
MESHX_MODEL * get_plat_model (void) const
 Get the platform-specific model instance.
meshx_ptr_t get_pub_struct (void) const
 Get the publication structures.
meshx_ptr_t get_gen_struct (void) const
 Get the generic structures.
void set_pub_struct (meshx_ptr_t pub)
 Set the publication structures.
void set_gen_struct (meshx_ptr_t gen)
 Set the generic structures.
void set_parent_element (meshXElementIF *parent)
 Set the parent element for this model.
meshXElementIFget_parent_element (void) const
 Get the parent element of this model.
void set_parent_element_state (meshx_ptr_t state)
 Set the parent element state pointer.
meshx_ptr_t get_parent_element_state (void) const
 Get the parent element state pointer.

Private Member Functions

meshx_err_t plat_model_create (MESHX_MODEL *p_plat_model_ptr=nullptr) override
 Creates and initializes a server model instance.
meshx_err_t plat_model_delete (void) override
 Deletes the Light HSL Server model and its associated resources.
meshx_err_t element_state_change_handle (void) override
 Handle state change request from element.
meshx_err_t prepare_element_msg (meshx_ptr_t *msg_ptr, size_t *msg_size) override
 Handle state change request from element.

Private Attributes

meshx_light_hsl_model_state_t model_state
meshx_light_hsl_srv_el_msg_t element_msg
bool element_msg_prepared

Additional Inherited Members

Protected Member Functions inherited from meshXServerModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t >
void update_element_state_change_header (meshx_err_t element_state_change, meshx_ptr_t msg_ptr) override
 Update element_state_change field in server message header.

Detailed Description

A template class for creating Light HSL Server models.

This class is derived from meshXServerModel and provides a convenient interface for creating Light HSL Server models. It handles the Light HSL state change notifications from the MeshX stack and publishes the state change event to the element layer.

Constructor & Destructor Documentation

◆ meshXLightHSLServerModel()

meshXLightHSLServerModel::meshXLightHSLServerModel ( meshXElementIF * parent_element = nullptr,
meshx_ptr_t parent_element_state = nullptr,
uint16_t model_func_id = 0 )

Constructor for Light HSL Server Model.

Parameters
[in]parent_elementPointer to the parent element (meshXElementIF)
[in]parent_element_statePointer to the parent element's state structure.
[in]model_func_idFunctional ID for the model instance.
614{
615}
bool element_msg_prepared
Definition meshx_model_hsl.hpp:146
meshXElementIF * parent_element
Definition meshx_model_class.hpp:42
uint16_t model_func_id
Definition meshx_model_class.hpp:181
meshXServerModel(MESHX_MODEL *p_plat_model, uint32_t model_id, meshXElementIF *parent_element=nullptr, meshx_ptr_t parent_element_state=nullptr, uint16_t model_func_id=0)
Definition meshx_model_class.cpp:200
#define MESHX_MODEL_ID_LIGHT_HSL_SRV
Definition meshx_ble_mesh_cmn_def.h:111

◆ ~meshXLightHSLServerModel()

meshXLightHSLServerModel::~meshXLightHSLServerModel ( )
default

Member Function Documentation

◆ element_state_change_handle()

meshx_err_t meshXLightHSLServerModel::element_state_change_handle ( void )
overrideprivatevirtual

Handle state change request from element.

Pure virtual function that derived classes must implement to handle state change requests from the parent element. The model validates the request, updates its internal state, and returns the result.

Returns
MESHX_SUCCESS on success, error code otherwise

Implements meshXModelIF.

574{
575 auto *el_state =
577
578 if (!el_state) {
579 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Invalid parameter in element_state_change_handle");
580 return MESHX_INVALID_ARG;
581 }
582
583 if(memcmp(&model_state, el_state, sizeof(meshx_light_hsl_model_state_t)) != 0)
584 {
586 "HSL state change request: hue=%d lightness=%d saturation=%d",
587 el_state->hue, el_state->lightness, el_state->saturation);
588 // Update the model state
589 *el_state = model_state;
590 }
591 else
592 {
593 return MESHX_INVALID_STATE;
594 }
595 return MESHX_SUCCESS;
596}
meshx_light_hsl_model_state_t model_state
Definition meshx_model_hsl.hpp:144
meshx_ptr_t get_parent_element_state(void) const
Get the parent element state pointer.
Definition meshx_model_class.hpp:154
@ MESHX_INVALID_ARG
Definition meshx_err.h:46
@ MESHX_INVALID_STATE
Definition meshx_err.h:49
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:126
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:114
struct meshx_light_hsl_model_state meshx_light_hsl_model_state_t
Definition meshx_model_hsl.hpp:48
**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
@ MODULE_ID_MODEL_SERVER
Definition module_id.h:34

◆ model_from_ble_cb()

meshx_err_t meshXLightHSLServerModel::model_from_ble_cb ( dev_struct_t * p_dev,
control_task_msg_evt_t model_id,
meshx_ptr_t params )
overridevirtual

This function is the callback for the Light HSL Server model.

This function is triggered whenever a Light HSL message is received from the MeshX stack. It handles the Light HSL state change notifications from the MeshX stack and publishes the state change event to the element layer.

Parameters
[in]p_devA pointer to the device structure.
[in]model_idThe unique identifier of the BLE mesh model.
[in]paramsA pointer to the callback parameter structure containing the details of the received message.
Returns
  • MESHX_SUCCESS: Success
  • MESHX_INVALID_ARG: Invalid argument
  • MESHX_FAIL: Other failures

Implements meshXModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t >.

432{
433 if(!params || !p_dev)
434 {
435 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Invalid parameters");
436 return MESHX_INVALID_ARG;
437 }
439 {
440 /* Callback triggered not for this model */
441 return MESHX_SUCCESS;
442 }
443
444 auto *param = static_cast<meshx_lighting_server_cb_param_t *>(params);
445
446 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "op|src|dst:%04" PRIx32 "|%04x|%04x",
447 param->ctx.opcode, param->ctx.src_addr, param->ctx.dst_addr);
448
449 model_state.lightness = param->state_change.hsl_set.lightness;
450 model_state.hue = param->state_change.hsl_set.hue;
451 model_state.saturation = param->state_change.hsl_set.saturation;
452
453 // Initialize flag - message not prepared yet
454 element_msg_prepared = false;
455
456 bool send_reply = (param->ctx.opcode != MESHX_MODEL_OP_LIGHT_HSL_SET_UNACK &&
457 param->ctx.opcode != MESHX_MODEL_OP_LIGHT_HSL_HUE_SET_UNACK &&
459
460 switch (param->ctx.opcode)
461 {
468 break;
475 {
476 if (MESHX_ADDR_IS_UNICAST(param->ctx.dst_addr)
477 || (MESHX_ADDR_BROADCAST(param->ctx.dst_addr))
478 || (MESHX_ADDR_IS_GROUP(param->ctx.dst_addr)
479 && (MESHX_SUCCESS == meshx_is_group_subscribed(&param->model, param->ctx.dst_addr))))
480 {
481 // Prepare the message (store in member variable)
482 element_msg.header.model = param->model;
483 element_msg.header.element_state_change = MESHX_SUCCESS; // Will be set by base layer
484 element_msg.state = model_state;
486 }
487 break;
488 }
493 // Handle default and range operations
494 break;
495 default:
496 break;
497 }
498 if (send_reply
499 /* This is meant to notify the respective publish client */
500 || param->ctx.src_addr != param->model.pub_addr)
501 {
502 /* Here the message was received from unregistered source and mention the state to the respective client */
503 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "PUB: src|pub %x|%x", param->ctx.src_addr, param->model.pub_addr);
504 param->ctx.dst_addr = param->model.pub_addr;
505
506 // Create a parameter structure for sending the response
507 meshx_light_hsl_send_params_t send_params = {
508 .model = &param->model,
509 .ctx = &param->ctx,
510 .tid = 0,
511 .state = {
512 .lightness = param->state_change.hsl_set.lightness,
513 .hue = param->state_change.hsl_set.hue,
514 .saturation = param->state_change.hsl_set.saturation,
515 .target_lightness = 0,
516 .target_hue = 0,
517 .target_saturation = 0,
518 .hue_range_min = 0,
519 .hue_range_max = 0,
520 .sat_range_min = 0,
521 .sat_range_max = 0
522 }
523 };
524
525 return this->model_send(&send_params);
526 }
527
528 // If we reach here, message was not prepared for element notification
529 // Return error so base layer doesn't send uninitialized message
531 {
532 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "No element notification needed for opcode: %04x", param->ctx.opcode);
533 return MESHX_NOT_SUPPORTED;
534 }
535
536 return MESHX_SUCCESS;
537}
meshx_light_hsl_srv_el_msg_t element_msg
Definition meshx_model_hsl.hpp:145
meshx_err_t model_send(meshx_light_hsl_send_params_t *params) override
Send a packet to the MeshX stack based on the given parameters.
Definition meshx_model_hsl.cpp:387
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.
#define MESHX_ADDR_IS_GROUP(_addr)
Definition meshx_ble_mesh_cmn_def.h:27
#define MESHX_MODEL_OP_LIGHT_HSL_RANGE_SET_UNACK
Definition meshx_ble_mesh_cmn_def.h:458
#define MESHX_MODEL_OP_LIGHT_HSL_SATURATION_SET_UNACK
Definition meshx_ble_mesh_cmn_def.h:442
#define MESHX_MODEL_OP_LIGHT_HSL_DEFAULT_GET
Definition meshx_ble_mesh_cmn_def.h:449
#define MESHX_MODEL_OP_LIGHT_HSL_RANGE_SET
Definition meshx_ble_mesh_cmn_def.h:457
#define MESHX_MODEL_OP_LIGHT_HSL_HUE_SET
Definition meshx_ble_mesh_cmn_def.h:437
#define MESHX_MODEL_OP_LIGHT_HSL_HUE_SET_UNACK
Definition meshx_ble_mesh_cmn_def.h:438
#define MESHX_MODEL_OP_LIGHT_HSL_SET_UNACK
Definition meshx_ble_mesh_cmn_def.h:445
#define MESHX_MODEL_OP_LIGHT_HSL_SATURATION_GET
Definition meshx_ble_mesh_cmn_def.h:440
#define MESHX_MODEL_OP_LIGHT_HSL_HUE_GET
Definition meshx_ble_mesh_cmn_def.h:436
#define MESHX_MODEL_OP_LIGHT_HSL_GET
Definition meshx_ble_mesh_cmn_def.h:435
#define MESHX_MODEL_OP_LIGHT_HSL_TARGET_GET
Definition meshx_ble_mesh_cmn_def.h:447
#define MESHX_MODEL_OP_LIGHT_HSL_DEFAULT_SET_UNACK
Definition meshx_ble_mesh_cmn_def.h:456
#define MESHX_MODEL_OP_LIGHT_HSL_SATURATION_SET
Definition meshx_ble_mesh_cmn_def.h:441
#define MESHX_ADDR_IS_UNICAST(_addr)
Definition meshx_ble_mesh_cmn_def.h:25
#define MESHX_ADDR_BROADCAST(_addr)
Definition meshx_ble_mesh_cmn_def.h:26
#define MESHX_MODEL_OP_LIGHT_HSL_SET
Definition meshx_ble_mesh_cmn_def.h:444
#define MESHX_MODEL_OP_LIGHT_HSL_RANGE_GET
Definition meshx_ble_mesh_cmn_def.h:451
#define MESHX_MODEL_OP_LIGHT_HSL_DEFAULT_SET
Definition meshx_ble_mesh_cmn_def.h:455
struct meshx_lighting_server_cb_param meshx_lighting_server_cb_param_t
@ MESHX_NOT_SUPPORTED
Definition meshx_err.h:51
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:132
struct meshx_light_hsl_send_params meshx_light_hsl_send_params_t
Definition meshx_model_hsl.hpp:61

◆ model_send()

meshx_err_t meshXLightHSLServerModel::model_send ( meshx_light_hsl_send_params_t * params)
overridevirtual

Send a packet to the MeshX stack based on the given parameters.

This function takes a pointer to a meshx_light_hsl_send_params_t structure as input and sends the corresponding packet to the MeshX stack for processing.

Parameters
[in]paramsPointer to the meshx_light_hsl_send_params_t structure containing the parameters
Returns
MESHX_SUCCESS on success, or an error code on failure

Implements meshXModel< meshXBaseLightServerModel, meshx_light_hsl_send_params_t >.

388{
389 if (!params || !params->model || !params->ctx)
390 {
391 return MESHX_INVALID_ARG;
392 }
394 meshx_lighting_server_state_change_t state_change = {
395 .hsl_set = {
396 .lightness = params->state.lightness,
397 .hue = params->state.hue,
398 .saturation = params->state.saturation
399 }
400 };
402 .p_model = params->model,
403 .p_ctx = params->ctx,
404 .state_change = &state_change
405 };
406 return this->get_base_model()->plat_send_msg(&send_params);
407}
meshx_err_t plat_send_msg(meshx_light_server_send_params_t *params) override
Sends a status message for the Light Server model.
Definition meshx_base_model_light.cpp:375
meshXBaseLightServerModel * get_base_model(void) const
Definition meshx_model_class.hpp:315
#define MESHX_MODEL_OP_LIGHT_HSL_STATUS
Definition meshx_ble_mesh_cmn_def.h:446
struct meshx_light_server_send_params meshx_light_server_send_params_t
Light Server send parameters. Used by meshXBaseLightServerModel::plat_send_msg to forward state chang...
uint32_t opcode
Definition meshx_ble_mesh_cmn.h:49
uint16_t saturation
Definition meshx_model_hsl.hpp:38
uint16_t hue
Definition meshx_model_hsl.hpp:37
uint16_t lightness
Definition meshx_model_hsl.hpp:36
meshx_ctx_t * ctx
Definition meshx_model_hsl.hpp:56
meshx_model_t * model
Definition meshx_model_hsl.hpp:55
meshx_light_hsl_model_state_t state
Definition meshx_model_hsl.hpp:58

◆ plat_model_create()

meshx_err_t meshXLightHSLServerModel::plat_model_create ( MESHX_MODEL * p_plat_model_ptr = nullptr)
overrideprivatevirtual

Creates and initializes a server model instance.

This function handles the platform-specific model creation process for server models. It initializes server-specific features and cannot be overridden by derived classes.

Parameters
[in]p_plat_model_ptrOptional pointer to a pre-allocated platform model structure.
Returns
meshx_err_t Returns an error code indicating the result of the operation.
  • MESHX_SUCCESS on successful model creation and initialization
  • MESHX_ERR_NO_MEM if memory allocation fails
  • Other error codes for platform-specific failures
Note
This is a final function and cannot be overridden by derived classes.

Implements meshXModelIF.

320{
321 if (p_plat_model_ptr) {
322 this->set_plat_model(p_plat_model_ptr);
323 }
324
325 meshx_ptr_t p_pub = this->get_pub_struct();
326 meshx_ptr_t p_gen = this->get_gen_struct();
328
329 err = meshx_plat_light_hsl_srv_create( this->get_plat_model(), &p_pub, &p_gen );
330 if(err)
331 {
332 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to create Light HSL Server Model");
333 }
334 else
335 {
336 /* Set the publication and generic structures */
337 this->set_pub_struct(p_pub);
338 this->set_gen_struct(p_gen);
339 }
340 return err;
341}
meshx_ptr_t get_pub_struct(void) const
Get the publication structures.
Definition meshx_model_class.hpp:113
MESHX_MODEL * get_plat_model(void) const
Get the platform-specific model instance.
Definition meshx_model_class.hpp:107
void set_gen_struct(meshx_ptr_t gen)
Set the generic structures.
Definition meshx_model_class.hpp:131
meshx_ptr_t get_gen_struct(void) const
Get the generic structures.
Definition meshx_model_class.hpp:119
void set_pub_struct(meshx_ptr_t pub)
Set the publication structures.
Definition meshx_model_class.hpp:125
void set_plat_model(MESHX_MODEL *p_model) override
Definition meshx_model_class.cpp:92
void * meshx_ptr_t
Definition meshx_ble_mesh_cmn_def.h:636
meshx_err_t meshx_plat_light_hsl_srv_create(meshx_ptr_t p_model, meshx_ptr_t *p_pub, meshx_ptr_t *p_hsl_srv)
Create a Light HSL Server instance.
meshx_err_t
MeshX Error Codes.
Definition meshx_err.h:43

◆ plat_model_delete()

meshx_err_t meshXLightHSLServerModel::plat_model_delete ( void )
overrideprivatevirtual

Deletes the Light HSL Server model and its associated resources.

This function frees the memory allocated for the Light HSL Server and sets the pointer to NULL. It also deletes the model publication resources associated with the server.

Returns
  • MESHX_SUCCESS: Model and publication deleted successfully.
  • MESHX_FAIL: Failed to delete the model or publication.

Implements meshXModelIF.

357{
358 meshx_ptr_t p_pub = this->get_pub_struct();
359 meshx_ptr_t p_gen = this->get_gen_struct();
360
361 meshx_err_t err = meshx_plat_light_srv_delete( &p_pub, &p_gen );
362 if (err)
363 {
364 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to delete Light HSL Server Model");
365 }
366 else
367 {
368 /* Set the publication and generic structures to NULL */
369 this->set_pub_struct(nullptr);
370 this->set_gen_struct(nullptr);
371 }
372
373 return err;
374}
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.

◆ prepare_element_msg()

meshx_err_t meshXLightHSLServerModel::prepare_element_msg ( meshx_ptr_t * msg_ptr,
size_t * msg_size )
overrideprivatevirtual

Handle state change request from element.

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. Note: The actual state is maintained in the element layer, not the model layer.

Returns
  • MESHX_SUCCESS: State change handled successfully
  • MESHX_INVALID_ARG: Invalid parameter
  • MESHX_INVALID_STATE: No state change detected

Implements meshXModelIF.

554{
555 if (!msg_ptr || !msg_size)
556 {
557 return MESHX_INVALID_ARG;
558 }
559
561 {
562 return MESHX_NOT_SUPPORTED;
563 }
564
565 *msg_ptr = &element_msg;
566 *msg_size = sizeof(element_msg);
567
568 return MESHX_SUCCESS;
569}

◆ request_status()

meshx_err_t meshXLightHSLServerModel::request_status ( uint16_t dst_addr = 0)
620{
621 auto *el_state = static_cast<meshx_light_hsl_model_state_t*>(this->get_parent_element_state());
622 auto *el = this->get_parent_element();
623 if (!el || !el_state) return MESHX_INVALID_STATE;
624
625 auto *common_ctx = static_cast<meshx_element_common_ctx_t*>(el->get_element_ctx());
626 if (!common_ctx) return MESHX_INVALID_STATE;
627
628 meshx_model_t model_ref = {
629 .el_id = el->get_element_idx(),
630 .model_id = (uint16_t)this->get_model_id(),
631 .pub_addr = common_ctx->pub_addr,
632 .p_model = (MESHX_MODEL*)this->get_plat_model()
633 };
634
635 meshx_ctx_t ctx = {
636 .app_idx = common_ctx->app_id,
637 .net_idx = meshx_get_net_key_id(),
639 .src_addr = 0,
640 .dst_addr = (dst_addr == 0) ? common_ctx->pub_addr : dst_addr,
641 .p_ctx = nullptr
642 };
643
645 .model = &model_ref,
646 .ctx = &ctx,
647 .tid = 0,
648 .state = *el_state
649 };
650
651 return this->model_send(&sp);
652}
meshXElementIF * get_parent_element(void) const
Get the parent element of this model.
Definition meshx_model_class.hpp:143
uint16_t get_model_id(void) const override
Definition meshx_model_class.hpp:292
uint16_t meshx_get_net_key_id(void)
Get the network key identifier.
Definition meshx.c:316
struct meshx_model meshx_model_t
struct meshx_ctx meshx_ctx_t
Structure to hold context information for BLE Mesh operations.

Field Documentation

◆ element_msg

meshx_light_hsl_srv_el_msg_t meshXLightHSLServerModel::element_msg
private

◆ element_msg_prepared

bool meshXLightHSLServerModel::element_msg_prepared
private

◆ model_state

meshx_light_hsl_model_state_t meshXLightHSLServerModel::model_state
private

The documentation for this class was generated from the following files: