Helper library to use modem_ref driver.

Dependencies:   WizziCom WizziDebug ram_fs modem_ref

Dependents:   D7A_Localisation D7A_1x_demo_send_file_data_and_forget D7A_1x_demo_CodeUpgradeProtocol D7A_1x_demo_LoRaWAN ... more

Revision:
66:a529d603be20
Parent:
61:8565bc7a6997
--- a/modem_ref_helper.cpp	Thu May 28 09:11:32 2020 +0000
+++ b/modem_ref_helper.cpp	Thu Jan 21 10:36:54 2021 +0000
@@ -315,6 +315,7 @@
         uint32_t     w[2];
     } uid;
     revision_t rev;
+    uint8_t id;
     
     // Override boot callback to catch the first boot message
     modem_callbacks_t boot_callbacks = {
@@ -335,28 +336,65 @@
     // Open modem Com port
     g_modem_com = new WizziCom(MODEM_PIN_RX, MODEM_PIN_TX, MODEM_PIN_IRQ_IN, MODEM_PIN_IRQ_OUT);
     
-    // Hardware reset
-    DigitalOut reset_low(MODEM_PIN_RESET, 0);
-    ThisThread::sleep_for(100);
-    
-    // Open driver to catch boot packet
-    modem_open(NULL, &boot_callbacks);
+    // open with user callbacks
+    modem_open(modem_serial_send, callbacks);
     
     // Redirect All Port traffic to modem_serial_input
     g_modem_com->attach(modem_serial_input, WizziComPacketUntreated);
+
+    // Wait for modem power up
+    ThisThread::sleep_for(100);
     
-    // Release reset
-    DigitalIn reset_release(MODEM_PIN_RESET);
+    // Try reading UID    
+    id = modem_get_id(my_main_callback);
+    modem_read_file(D7A_FID_UID, uid.b, 0, 8, id);
+    if (!g_modem_ready.try_acquire_for(200))
+    {
+        HELPER_PRINT("Trying software reset...\n");
+        
+        // Open driver to catch boot packet
+        modem_close();
+        modem_open(NULL, &boot_callbacks);
     
-    // Wait for first boot packet
-    HELPER_PRINT("Waiting boot packet...\n");
-    boot.acquire();
+        // Try software reset
+        g_modem_com->send(WizziComPacketSysReset, 0, NULL);
+        
+        if (!boot.try_acquire_for(1000))
+        {
+            HELPER_PRINT("Trying hardware reset...\n");
+            
+            // Assert reset pin
+            DigitalOut reset_low(MODEM_PIN_RESET, 0);
+            ThisThread::sleep_for(100);
+            
+            // Release reset pin
+            DigitalIn reset_release(MODEM_PIN_RESET);
+                    
+            if (!boot.try_acquire_for(1000))
+            {
+                // Modem not responding!
+                HELPER_PRINT("Failed to open modem.\n");
+            }
+            else
+            {
+                HELPER_PRINT("Modem is up after hardware reset.\n");
+            }
+        }
+        else
+        {
+            HELPER_PRINT("Modem is up after software reset.\n");
+        }
+    }
+    else
+    {
+        HELPER_PRINT("Modem is up.\n");
+    }
     
     // Re-open with user callbacks
     modem_close();
     modem_open(modem_serial_send, callbacks);
     
-    uint8_t id = modem_get_id(my_main_callback);
+    id = modem_get_id(my_main_callback);
 
     HELPER_PRINT("Start Modem Process (id=%d)\n", id);
     ThisThread::sleep_for(1000);