This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Generic Power OnOff Setup Server allow publishing but the standard doesn't

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.

Parents Reply Children
No Data
Related