From Mesh Model v1.0.1 section 3.3.5.1 Generic Power OnOff Setup Server
"This model shall support model subscription, as defined in Section 4.2.3 of the Mesh Profile specification [2]."
Thus the Generic Power OnOff Setup Server doesn't support publishing, only subscription.
However, the current code in SDK For Mesh v4.2.0 set the .publish_timeout_cb for Generic Power OnOff Setup Server allowing the model to have a publish address in violation off the standard.
The generic_ponoff_setup_server_status_publish() function doesn't make sense as the Setup Server doesn't support publish and thus can be removed. As a consequence of this the status_send function can be simplified.
As a bonus, fix typos and const correctness.
The following patch fixes the above issue.
diff --git a/models/model_spec/generic_ponoff/include/generic_ponoff_setup_server.h b/models/model_spec/generic_ponoff/include/generic_ponoff_setup_server.h
index e0b876d..70d773e 100644
--- a/models/model_spec/generic_ponoff/include/generic_ponoff_setup_server.h
+++ b/models/model_spec/generic_ponoff/include/generic_ponoff_setup_server.h
@@ -152,7 +152,7 @@ struct __generic_ponoff_server_t
* destination. Wait for the transmission to finish before sending
* new segmented packets.
*/
-uint32_t generic_ponoff_server_status_publish(generic_ponoff_server_t * p_server, const generic_ponoff_status_params_t * p_params);
+uint32_t generic_ponoff_server_status_publish(const generic_ponoff_server_t * p_server, const generic_ponoff_status_params_t * p_params);
/**
@@ -217,27 +217,5 @@ struct __generic_ponoff_setup_server_t
*/
uint32_t generic_ponoff_setup_server_init(generic_ponoff_setup_server_t * p_server, uint8_t element_index);
-/**
- * Publishes unsolicited Status message.
- *
- * This API can be used to send unsolicited messages to report updated state value as a result of
- * local action.
- *
- * @param[in] p_server Status server context pointer.
- * @param[in] p_params Message parameters.
- *
- * @retval NRF_SUCCESS If the message is published successfully.
- * @retval NRF_ERROR_NULL NULL pointer given to function.
- * @retval NRF_ERROR_NO_MEM No memory available to send the message at this point.
- * @retval NRF_ERROR_NOT_FOUND The model is not initialized.
- * @retval NRF_ERROR_INVALID_PARAM Incorrect message parameters, the model not bound to application
- * key, or publish address not set.
- * @retval NRF_ERROR_FORBIDDEN Failed to allocate a sequence number from network.
- * @retval NRF_ERROR_INVALID_STATE There's already a segmented packet that is being to sent to this
- * destination. Wait for the transmission to finish before sending
- * new segmented packets.
- */
-uint32_t generic_ponoff_setup_server_status_publish(generic_ponoff_setup_server_t * p_server, const generic_ponoff_status_params_t * p_params);
-
/**@} end of GENERIC_PONOFF_SETUP_SERVER */
#endif /* GENERIC_PONOFF_SETUP_SERVER_H__ */
diff --git a/models/model_spec/generic_ponoff/src/generic_ponoff_setup_server.c b/models/model_spec/generic_ponoff/src/generic_ponoff_setup_server.c
index 0b3ae1f..2b0cd7b 100644
--- a/models/model_spec/generic_ponoff/src/generic_ponoff_setup_server.c
+++ b/models/model_spec/generic_ponoff/src/generic_ponoff_setup_server.c
@@ -49,36 +49,11 @@
#include "nrf_mesh_utils.h"
#include "nordic_common.h"
-typedef enum
-{
- PONOFF_SERVER,
- PONOFF_SETUP_SERVER
-} server_context_type_t;
-
-static uint32_t status_send(void * p_ctx,
- server_context_type_t ctx_type,
+static uint32_t status_send(const generic_ponoff_server_t * p_server,
const access_message_rx_t * p_message,
const generic_ponoff_status_params_t * p_params)
{
generic_ponoff_status_msg_pkt_t msg_pkt;
- uint16_t model_handle;
- bool force_segmented;
- nrf_mesh_transmic_size_t transmic_size;
-
- if (ctx_type == PONOFF_SERVER)
- {
- generic_ponoff_server_t * p_server = (generic_ponoff_server_t *) p_ctx;
- model_handle = p_server->model_handle;
- force_segmented = p_server->settings.force_segmented;
- transmic_size = p_server->settings.transmic_size;
- }
- else
- {
- generic_ponoff_setup_server_t * p_server = (generic_ponoff_setup_server_t *) p_ctx;
- model_handle = p_server->model_handle;
- force_segmented = p_server->settings.force_segmented;
- transmic_size = p_server->settings.transmic_size;
- }
if (p_params->on_powerup > GENERIC_ON_POWERUP_MAX)
{
@@ -92,17 +67,17 @@ static uint32_t status_send(void * p_ctx,
.opcode = ACCESS_OPCODE_SIG(GENERIC_PONOFF_OPCODE_STATUS),
.p_buffer = (const uint8_t *) &msg_pkt,
.length = sizeof(generic_ponoff_status_msg_pkt_t),
- .force_segmented = force_segmented,
- .transmic_size = transmic_size
+ .force_segmented = p_server->settings.force_segmented,
+ .transmic_size = p_server->settings.transmic_size
};
if (p_message == NULL)
{
- return access_model_publish(model_handle, &reply);
+ return access_model_publish(p_server->model_handle, &reply);
}
else
{
- return access_model_reply(model_handle, p_message, &reply);
+ return access_model_reply(p_server->model_handle, p_message, &reply);
}
}
@@ -113,16 +88,7 @@ static void periodic_publish_cb(access_model_handle_t handle, void * p_args)
generic_ponoff_status_params_t out_data = {0};
p_s_server->settings.p_callbacks->ponoff_cbs.get_cb(p_s_server, NULL, &out_data);
- (void) status_send(p_server, PONOFF_SERVER, NULL, &out_data);
-}
-
-static void periodic_publish_ss_cb(access_model_handle_t handle, void * p_args)
-{
- generic_ponoff_setup_server_t * p_server = (generic_ponoff_setup_server_t *)p_args;
- generic_ponoff_status_params_t out_data = {0};
-
- p_server->settings.p_callbacks->ponoff_cbs.get_cb(p_server, NULL, &out_data);
- (void) status_send(p_server, PONOFF_SETUP_SERVER, NULL, &out_data);
+ (void) status_send(p_server, NULL, &out_data);
}
@@ -139,7 +105,7 @@ static void handle_get(access_model_handle_t model_handle, const access_message_
if (p_rx_msg->length == 0)
{
p_s_server->settings.p_callbacks->ponoff_cbs.get_cb(p_s_server, &p_rx_msg->meta_data, &out_data);
- (void) status_send(p_server, PONOFF_SERVER, p_rx_msg, &out_data);
+ (void) status_send(p_server, p_rx_msg, &out_data);
}
}
@@ -159,7 +125,7 @@ static uint32_t generic_ponoff_server_init(generic_ponoff_server_t * p_server, u
return NRF_ERROR_NULL;
}
- /* Initialize parent model instsances - Generic OnOff */
+ /* Initialize parent model instances - Generic OnOff */
status = generic_onoff_server_init(&p_server->generic_onoff_srv, element_index);
if (status == NRF_SUCCESS)
@@ -186,7 +152,7 @@ static uint32_t generic_ponoff_server_init(generic_ponoff_server_t * p_server, u
return status;
}
-uint32_t generic_ponoff_server_status_publish(generic_ponoff_server_t * p_server, const generic_ponoff_status_params_t * p_params)
+uint32_t generic_ponoff_server_status_publish(const generic_ponoff_server_t * p_server, const generic_ponoff_status_params_t * p_params)
{
if (p_server == NULL ||
p_params == NULL)
@@ -194,7 +160,7 @@ uint32_t generic_ponoff_server_status_publish(generic_ponoff_server_t * p_server
return NRF_ERROR_NULL;
}
- return status_send(p_server, PONOFF_SERVER, NULL, p_params);
+ return status_send(p_server, NULL, p_params);
}
/**************************************************************************************************/
@@ -222,7 +188,7 @@ static void handle_set(access_model_handle_t model_handle, const access_message_
if (p_rx_msg->opcode.opcode == GENERIC_PONOFF_OPCODE_SET)
{
- (void) status_send(p_server, PONOFF_SETUP_SERVER, p_rx_msg, &out_param);
+ (void) status_send(&p_server->generic_ponoff_srv, p_rx_msg, &out_param);
}
}
}
@@ -247,7 +213,7 @@ uint32_t generic_ponoff_setup_server_init(generic_ponoff_setup_server_t * p_serv
return NRF_ERROR_NULL;
}
- /* Initialize parent model instsances - Generic Default Transition Time */
+ /* Initialize parent model instances - Generic Default Transition Time */
status = generic_dtt_server_init(&p_server->generic_dtt_srv, element_index);
if (status == NRF_SUCCESS)
@@ -255,7 +221,7 @@ uint32_t generic_ponoff_setup_server_init(generic_ponoff_setup_server_t * p_serv
status = access_model_subscription_list_dealloc(p_server->generic_dtt_srv.model_handle);
}
- /* Initialize parent model instsances - Generic Power OnOff */
+ /* Initialize parent model instances - Generic Power OnOff */
if (status == NRF_SUCCESS)
{
p_server->generic_ponoff_srv.settings.force_segmented = p_server->settings.force_segmented;
@@ -272,8 +238,7 @@ uint32_t generic_ponoff_setup_server_init(generic_ponoff_setup_server_t * p_serv
.element_index = element_index,
.p_opcode_handlers = &m_opcode_handlers_setup[0],
.opcode_count = ARRAY_SIZE(m_opcode_handlers_setup),
- .p_args = p_server,
- .publish_timeout_cb = periodic_publish_ss_cb
+ .p_args = p_server
};
status = access_model_add(&init_params, &p_server->model_handle);
@@ -301,14 +266,3 @@ uint32_t generic_ponoff_setup_server_init(generic_ponoff_setup_server_t * p_serv
return status;
}
-
-uint32_t generic_ponoff_setup_server_status_publish(generic_ponoff_setup_server_t * p_server, const generic_ponoff_status_params_t * p_params)
-{
- if (p_server == NULL ||
- p_params == NULL)
- {
- return NRF_ERROR_NULL;
- }
-
- return status_send(p_server, PONOFF_SETUP_SERVER, NULL, p_params);
-}
Thanks.