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,41 @@ 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+ }
189+ else {
190+ /* Other WDSI indications can be handled here if needed */
191+ }
192+
193+ break ;
194+ #endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
163195 default :
196+ #ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
197+ LOG_DBG ("%d HL78XX modem Event Received: %d" , __LINE__ , event -> type );
198+ #endif
164199 break ;
165200 }
166201}
@@ -171,7 +206,7 @@ static void hl78xx_on_ok(struct modem_chat *chat, char **argv, uint16_t argc, vo
171206 return ;
172207 }
173208#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
174- LOG_DBG ("%d %s %s " , __LINE__ , __func__ , argv [0 ]);
209+ LOG_DBG ("%d %s" , __LINE__ , argv [0 ]);
175210#endif
176211}
177212
@@ -251,7 +286,6 @@ int main(void)
251286 }
252287
253288 (void )conn_mgr_if_connect (iface );
254-
255289 LOG_INF ("Waiting for network connection..." );
256290 k_sem_take (& network_connected_sem , K_FOREVER );
257291 }
@@ -262,6 +296,7 @@ int main(void)
262296 char apn [MDM_APN_MAX_LENGTH ] = {0 };
263297 char operator [MDM_MODEL_LENGTH ] = {0 };
264298 char imei [MDM_IMEI_LENGTH ] = {0 };
299+ char serial_number [MDM_SERIAL_NUMBER_LENGTH ] = {0 };
265300 enum hl78xx_cell_rat_mode tech ;
266301 enum cellular_registration_status status ;
267302 int16_t rsrp ;
@@ -289,6 +324,9 @@ int main(void)
289324
290325 hl78xx_get_modem_info (modem , HL78XX_MODEM_INFO_APN , (char * )apn , sizeof (apn ));
291326
327+ hl78xx_get_modem_info (modem , HL78XX_MODEM_INFO_SERIAL_NUMBER , (char * )serial_number ,
328+ sizeof (serial_number ));
329+
292330 cellular_get_modem_info (modem , CELLULAR_MODEM_INFO_IMEI , imei , sizeof (imei ));
293331#ifdef CONFIG_MODEM_HL78XX_AUTORAT
294332 /* In auto rat mode, get the current rat from the modem status */
@@ -308,6 +346,7 @@ int main(void)
308346 LOG_RAW ("**********************************************************\n" );
309347 LOG_INF ("Manufacturer: %s" , manufacturer );
310348 LOG_INF ("Firmware Version: %s" , fw_ver );
349+ LOG_INF ("Module Serial Number: %s" , serial_number );
311350 LOG_INF ("APN: \"%s\"" , apn );
312351 LOG_INF ("Imei: %s" , imei );
313352 LOG_INF ("RAT: %s" , rat_get_in_string (tech ));
@@ -337,6 +376,35 @@ int main(void)
337376
338377 resolve_broker_addr (& test_endpoint_addr );
339378
379+ #ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
380+ #ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE_UA_CONNECT_AIRVANTAGE
381+ LOG_INF ("Starting AirVantage DM session..." );
382+ hl78xx_start_airvantage_dm_session (modem );
383+ k_sem_reset (& fota_complete_rerun );
384+ LOG_INF ("Waiting for AirVantage FOTA Creation..." );
385+ /* Wait for FOTA download request, max 120 seconds */
386+ ret = k_sem_take (& fota_complete_rerun , K_SECONDS (120 ));
387+ if (ret < 0 ) {
388+ LOG_WRN ("AirVantage DM session timed out waiting for FOTA download request.%d" ,
389+ ret );
390+ } else {
391+ k_sem_reset (& fota_complete_rerun );
392+ LOG_INF ("Waiting for AirVantage FOTA Completion..." );
393+ /* Wait for FOTA completion */
394+ ret = k_sem_take (& fota_complete_rerun , K_FOREVER );
395+ if (fota_update_status == (int )WDSI_FIRMWARE_UPDATE_SUCCESS ) {
396+ LOG_INF ("FOTA update successful, restarting application to apply update." );
397+ } else if (fota_update_status == (int )WDSI_FIRMWARE_UPDATE_FAILED ) {
398+ LOG_WRN ("FOTA update failed." );
399+ } else {
400+ LOG_WRN ("FOTA update status unknown." );
401+ }
402+ }
403+
404+ #else
405+ LOG_WRN ("AirVantage User Agreement not accepted, cannot start DM session." );
406+ #endif
407+ #endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
340408 LOG_INF ("Sample application finished." );
341409
342410 return 0 ;
0 commit comments