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:
44:7563b8e53e1d
Parent:
43:90c9221c1430
Child:
45:382159015b55
--- a/modem_ref_helper.cpp	Thu Oct 04 11:44:36 2018 +0000
+++ b/modem_ref_helper.cpp	Wed Oct 10 16:39:56 2018 +0000
@@ -11,7 +11,8 @@
 #define MODEM_VERSION_PATCH         310
 
 static WizziCom* g_modem_com;
-static Semaphore g_modem_ready[MAX_USER_NB];
+static Semaphore g_modem_ready;
+static int8_t    g_err;
 
 void modem_print_error(uint8_t itf, int8_t error)
 {
@@ -210,14 +211,46 @@
 {
     (void)id;
     
+    g_err = err;
+    
+    //modem_print_error(0xC0, g_err);
+    
     if (terminal)
     {
-        g_modem_ready[id].release();
+        g_modem_ready.release();
     }
 }
 
 // Misc
 // ============================================================{{{
+    
+void modem_notify_host_rev(revision_t* data, alp_file_header_t* header, uint8_t* root_key)
+{
+    uint8_t id = modem_get_id(my_main_callback);
+    
+    // Write the version to the version file.
+    // This file is notified on write.
+    modem_write_file_root(FID_HOST_REV, (void*)data, 0, HAL_U32_BYTE_SWAP(header->alloc), root_key, id);
+    g_modem_ready.wait();
+    
+    if (ALP_ERR_NONE != g_err)
+    {
+        // Error when writing to the file
+        // Delete old file
+        modem_delete_file(FID_HOST_REV, id);
+        g_modem_ready.wait();
+        
+        // Recreate file
+        modem_create_file(FID_HOST_REV, header, id);
+        g_modem_ready.wait();
+        
+        // Retry writing to the file
+        modem_write_file_root(FID_HOST_REV, (void*)data, 0, HAL_U32_BYTE_SWAP(header->alloc), root_key, id);
+        g_modem_ready.wait();
+    }
+    
+    modem_free_id(id);
+}
 
 void modem_update_file(uint8_t fid, alp_file_header_t* header, uint8_t* data)
 {
@@ -228,7 +261,7 @@
     
     // Read remote header
     modem_read_fprop(fid, &remote_header, id);
-    g_modem_ready[id].wait();
+    g_modem_ready.wait();
     
     // Add file in local file system
     ram_fs_new(fid, (uint8_t*)header, data);
@@ -239,7 +272,7 @@
         HELPER_PRINT("Updating file %d\n", fid);
         // Delete
         modem_delete_file(fid, id);
-        g_modem_ready[id].wait();
+        g_modem_ready.wait();
         // Restore in local file system
         ram_fs_new(fid, (uint8_t*)header, data);
         // Re-create
@@ -251,7 +284,7 @@
         {
             modem_create_file(fid, header, id);
         }
-        g_modem_ready[id].wait();
+        g_modem_ready.wait();
     }
     else
     {
@@ -320,10 +353,10 @@
     Thread::wait(1000);
     
     modem_read_file(D7A_FID_UID, uid.b, 0, 8, id);
-    g_modem_ready[id].wait();
+    g_modem_ready.wait();
     
     modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t), id);
-    g_modem_ready[id].wait();
+    g_modem_ready.wait();
     
     PRINT("------------ D7A Modem infos ------------\r\n");
     PRINT_DATA(" - UID:              ", "%02X", uid.b, 8, "\r\n");