3030LOG_MODULE_REGISTER (main , CONFIG_MODEM_LOG_LEVEL );
3131
3232static K_SEM_DEFINE (network_connected_sem , 0 , 1 ) ;
33- const struct device * modem = DEVICE_DT_GET (DT_ALIAS (modem ));
33+ static K_SEM_DEFINE (fota_complete_rerun , 0 , 1 ) ;
34+ const static struct device * modem = DEVICE_DT_GET (DT_ALIAS (modem ));
3435
3536/* Zephyr NET management event callback structures. */
3637static struct net_mgmt_event_callback l4_cb ;
3738static struct net_mgmt_event_callback conn_cb ;
38-
39+ #ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
40+ static int fota_update_status = -1 ;
41+ #endif
42+ /** Convert RAT mode enum to string */
3943static const char * rat_get_in_string (enum hl78xx_cell_rat_mode rat )
4044{
4145 switch (rat ) {
@@ -144,9 +148,6 @@ static void l4_event_handler(struct net_mgmt_event_callback *cb, uint64_t event,
144148
145149static void evnt_listener (struct hl78xx_evt * event , struct hl78xx_evt_monitor_entry * context )
146150{
147- #ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
148- LOG_DBG ("%d HL78XX modem Event Received: %d" , __LINE__ , event -> type );
149- #endif
150151 switch (event -> type ) {
151152 /* Do something */
152153 case HL78XX_LTE_RAT_UPDATE :
@@ -160,7 +161,40 @@ static void evnt_listener(struct hl78xx_evt *event, struct hl78xx_evt_monitor_en
160161 LOG_INF ("%d HL78XX modem startup status: %s" , __LINE__ ,
161162 hl78xx_module_status_to_string (event -> content .value ));
162163 break ;
164+ #ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
165+ case HL78XX_LTE_FOTA_UPDATE_STATUS :
166+ LOG_INF ("%d HL78XX modem FOTA update status: %d" , __LINE__ ,
167+ event -> content .wdsi_indication );
168+ if (event -> content .wdsi_indication == WDSI_FIRMWARE_UPDATE_SUCCESS ) {
169+ LOG_INF ("FOTA update complete, restarting modem..." );
170+ k_sem_reset (& network_connected_sem );
171+ fota_update_status = (int )WDSI_FIRMWARE_UPDATE_SUCCESS ;
172+ k_sem_give (& fota_complete_rerun );
173+ } else if (event -> content .wdsi_indication == WDSI_FIRMWARE_UPDATE_FAILED ) {
174+ LOG_INF ("FOTA update failed." );
175+ fota_update_status = (int )WDSI_FIRMWARE_UPDATE_FAILED ;
176+ k_sem_give (& fota_complete_rerun );
177+ } else if (event -> content .wdsi_indication == WDSI_FIRMWARE_DOWNLOAD_REQUEST &&
178+ fota_update_status != (int )WDSI_FIRMWARE_DOWNLOAD_REQUEST ) {
179+ LOG_INF ("FOTA download requested, starting download..." );
180+ if (fota_update_status != (int )WDSI_SESSION_STARTED ) {
181+ return ;
182+ }
183+ fota_update_status = (int )WDSI_FIRMWARE_DOWNLOAD_REQUEST ;
184+ k_sem_give (& fota_complete_rerun );
185+ } else if (event -> content .wdsi_indication == WDSI_SESSION_STARTED ) {
186+ LOG_INF ("FOTA session started..." );
187+ fota_update_status = (int )WDSI_SESSION_STARTED ;
188+ } else {
189+ /* Other WDSI indications can be handled here if needed */
190+ }
191+
192+ break ;
193+ #endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
163194 default :
195+ #ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
196+ LOG_DBG ("%d HL78XX modem Event Received: %d" , __LINE__ , event -> type );
197+ #endif
164198 break ;
165199 }
166200}
@@ -171,7 +205,7 @@ static void hl78xx_on_ok(struct modem_chat *chat, char **argv, uint16_t argc, vo
171205 return ;
172206 }
173207#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
174- LOG_DBG ("%d %s %s " , __LINE__ , __func__ , argv [0 ]);
208+ LOG_DBG ("%d %s" , __LINE__ , argv [0 ]);
175209#endif
176210}
177211
@@ -251,7 +285,6 @@ int main(void)
251285 }
252286
253287 (void )conn_mgr_if_connect (iface );
254-
255288 LOG_INF ("Waiting for network connection..." );
256289 k_sem_take (& network_connected_sem , K_FOREVER );
257290 }
@@ -262,6 +295,7 @@ int main(void)
262295 char apn [MDM_APN_MAX_LENGTH ] = {0 };
263296 char operator [MDM_MODEL_LENGTH ] = {0 };
264297 char imei [MDM_IMEI_LENGTH ] = {0 };
298+ char serial_number [MDM_SERIAL_NUMBER_LENGTH ] = {0 };
265299 enum hl78xx_cell_rat_mode tech ;
266300 enum cellular_registration_status status ;
267301 int16_t rsrp ;
@@ -289,6 +323,9 @@ int main(void)
289323
290324 hl78xx_get_modem_info (modem , HL78XX_MODEM_INFO_APN , (char * )apn , sizeof (apn ));
291325
326+ hl78xx_get_modem_info (modem , HL78XX_MODEM_INFO_SERIAL_NUMBER , (char * )serial_number ,
327+ sizeof (serial_number ));
328+
292329 cellular_get_modem_info (modem , CELLULAR_MODEM_INFO_IMEI , imei , sizeof (imei ));
293330#ifdef CONFIG_MODEM_HL78XX_AUTORAT
294331 /* In auto rat mode, get the current rat from the modem status */
@@ -308,6 +345,7 @@ int main(void)
308345 LOG_RAW ("**********************************************************\n" );
309346 LOG_INF ("Manufacturer: %s" , manufacturer );
310347 LOG_INF ("Firmware Version: %s" , fw_ver );
348+ LOG_INF ("Module Serial Number: %s" , serial_number );
311349 LOG_INF ("APN: \"%s\"" , apn );
312350 LOG_INF ("Imei: %s" , imei );
313351 LOG_INF ("RAT: %s" , rat_get_in_string (tech ));
@@ -337,6 +375,35 @@ int main(void)
337375
338376 resolve_broker_addr (& test_endpoint_addr );
339377
378+ #ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
379+ #ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE_UA_CONNECT_AIRVANTAGE
380+ LOG_INF ("Starting AirVantage DM session..." );
381+ hl78xx_start_airvantage_dm_session (modem );
382+ k_sem_reset (& fota_complete_rerun );
383+ LOG_INF ("Waiting for AirVantage FOTA Creation..." );
384+ /* Wait for FOTA download request, max 120 seconds */
385+ ret = k_sem_take (& fota_complete_rerun , K_SECONDS (120 ));
386+ if (ret < 0 ) {
387+ LOG_WRN ("AirVantage DM session timed out waiting for FOTA download request.%d" ,
388+ ret );
389+ } else {
390+ k_sem_reset (& fota_complete_rerun );
391+ LOG_INF ("Waiting for AirVantage FOTA Completion..." );
392+ /* Wait for FOTA completion */
393+ ret = k_sem_take (& fota_complete_rerun , K_FOREVER );
394+ if (fota_update_status == (int )WDSI_FIRMWARE_UPDATE_SUCCESS ) {
395+ LOG_INF ("FOTA update successful, restarting application to apply update." );
396+ } else if (fota_update_status == (int )WDSI_FIRMWARE_UPDATE_FAILED ) {
397+ LOG_WRN ("FOTA update failed." );
398+ } else {
399+ LOG_WRN ("FOTA update status unknown." );
400+ }
401+ }
402+
403+ #else
404+ LOG_WRN ("AirVantage User Agreement not accepted, cannot start DM session." );
405+ #endif
406+ #endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
340407 LOG_INF ("Sample application finished." );
341408
342409 return 0 ;
0 commit comments