@@ -106,6 +106,8 @@ struct lwm2m_rd_client_info {
106106
107107 char ep_name [CLIENT_EP_LEN ];
108108 char server_ep [CLIENT_EP_LEN ];
109+
110+ lwm2m_ctx_event_cb_t event_cb ;
109111};
110112
111113static K_THREAD_STACK_DEFINE (lwm2m_rd_client_thread_stack ,
@@ -120,10 +122,31 @@ static u8_t client_data[256]; /* allocate some data for the RD */
120122static struct lwm2m_rd_client_info clients [CLIENT_INSTANCE_COUNT ];
121123static int client_count ;
122124
123- static void set_sm_state (int index , u8_t state )
125+ static void set_sm_state (int index , u8_t sm_state )
124126{
127+ enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE ;
128+
129+ /* Determine if a callback to the app is needed */
130+ if (sm_state == ENGINE_BOOTSTRAP_DONE ) {
131+ event = LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_COMPLETE ;
132+ } else if (clients [index ].engine_state == ENGINE_UPDATE_SENT &&
133+ sm_state == ENGINE_REGISTRATION_DONE ) {
134+ event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE ;
135+ } else if (sm_state == ENGINE_REGISTRATION_DONE ) {
136+ event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE ;
137+ } else if ((sm_state == ENGINE_INIT ||
138+ sm_state == ENGINE_DEREGISTERED ) &&
139+ (clients [index ].engine_state > ENGINE_BOOTSTRAP_DONE &&
140+ clients [index ].engine_state < ENGINE_DEREGISTER )) {
141+ event = LWM2M_RD_CLIENT_EVENT_DISCONNECT ;
142+ }
143+
125144 /* TODO: add locking? */
126- clients [index ].engine_state = state ;
145+ clients [index ].engine_state = sm_state ;
146+
147+ if (event > LWM2M_RD_CLIENT_EVENT_NONE && clients [index ].event_cb ) {
148+ clients [index ].event_cb (clients [index ].ctx , event );
149+ }
127150}
128151
129152static bool sm_is_registered (int index )
@@ -200,14 +223,31 @@ static void sm_handle_timeout_state(struct lwm2m_message *msg,
200223 enum sm_engine_state sm_state )
201224{
202225 int index ;
226+ enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE ;
203227
204228 index = find_rd_client_from_msg (msg , clients , CLIENT_INSTANCE_COUNT );
205229 if (index < 0 ) {
206230 SYS_LOG_ERR ("Can't find RD client from msg: %p!" , msg );
207231 return ;
208232 }
209233
234+ if (clients [index ].engine_state == ENGINE_BOOTSTRAP_SENT ) {
235+ event = LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_FAILURE ;
236+ } else if (clients [index ].engine_state == ENGINE_REGISTRATION_SENT ) {
237+ event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE ;
238+ } else if (clients [index ].engine_state == ENGINE_UPDATE_SENT ) {
239+ event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE ;
240+ } else if (clients [index ].engine_state == ENGINE_DEREGISTER_SENT ) {
241+ event = LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE ;
242+ } else {
243+ /* TODO: unknown timeout state */
244+ }
245+
210246 set_sm_state (index , sm_state );
247+
248+ if (event > LWM2M_RD_CLIENT_EVENT_NONE && clients [index ].event_cb ) {
249+ clients [index ].event_cb (clients [index ].ctx , event );
250+ }
211251}
212252
213253/* force re-update with remote peer(s) */
@@ -820,7 +860,8 @@ static void lwm2m_rd_client_service(void)
820860
821861int lwm2m_rd_client_start (struct lwm2m_ctx * client_ctx ,
822862 char * peer_str , u16_t peer_port ,
823- const char * ep_name )
863+ const char * ep_name ,
864+ lwm2m_ctx_event_cb_t event_cb )
824865{
825866 int index , ret = 0 ;
826867
@@ -843,6 +884,7 @@ int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
843884 index = client_count ;
844885 client_count ++ ;
845886 clients [index ].ctx = client_ctx ;
887+ clients [index ].event_cb = event_cb ;
846888 set_sm_state (index , ENGINE_INIT );
847889 strncpy (clients [index ].ep_name , ep_name , CLIENT_EP_LEN - 1 );
848890 SYS_LOG_INF ("LWM2M Client: %s" , clients [index ].ep_name );
0 commit comments