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:
75:dad2f09cb870
Parent:
72:15bf99fcfed9
Child:
76:cbe558f136a4
--- a/modem_d7a.cpp	Tue Sep 07 08:44:08 2021 +0000
+++ b/modem_d7a.cpp	Tue Sep 07 15:59:23 2021 +0000
@@ -1,6 +1,7 @@
 
 #include "mbed.h"
 #include "modem_d7a.h"
+#include "modem_cup.h"
 
 #if 0
 #define HELPER_PRINT(...)  PRINT(__VA_ARGS__)
@@ -73,7 +74,7 @@
     return size;
 }
 
-Semaphore boot(0);
+static Semaphore boot(0);
 void my_startup_boot(u8 cause, u16 number)
 {
     HELPER_PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
@@ -215,31 +216,7 @@
     PRINT("-----------------------------------------\r\n");
     FLUSH();
 
-    if (MODEM_DEVICE_ID == rev.device_id)
-    {
-        // Check version
-        uint32_t rev_sum1 = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
-        uint32_t rev_sum2 = (MODEM_VERSION_MAJOR << 24) | (MODEM_VERSION_MINOR << 16) | MODEM_VERSION_PATCH;
-        if (rev_sum1 < rev_sum2)
-        {
-            PRINT("\r\nYou need a modem at version %d.%d.%d or above to use this Driver.\r\n"
-                    "You can:\r\n"
-                    " - Check modem updates on the Dash7Board:\r\n"
-                    "   Go to your site's version manager.\r\n"
-                    " - Check modem updates by importing:\r\n"
-                    "   https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\r\n"
-                    " - Choose the right 'modem_ref_helper' revision.\r\n"
-                    "   Right click on modem_ref_helper -> Revision.\r\n"
-                    , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR, MODEM_VERSION_PATCH);
-
-            ThisThread::sleep_for(osWaitForever);
-        }
-    }
-    else
-    {
-        // Do not check version
-        PRINT("/!\\ Not a modem firmware /!\\\r\n");
-    }
+    modem_cup_update(&rev);
 
     return 0;
 }
@@ -311,9 +288,8 @@
 {
     int err = ALP_ERR_UNKNOWN;
     alp_payload_t* alp_rsp = NULL;
-    alp_payload_t* alp_tmp = NULL;
     
-    err = _modem_d7a_send(NULL, alp, &alp_rsp, timeout);
+    err = _modem_d7a_send(itf, alp, &alp_rsp, timeout);
     
     do {
         if (ALP_ERR_NONE > err) { PRINT("Send ALP timeout\n"); break; }
@@ -339,7 +315,6 @@
     int err = ALP_ERR_UNKNOWN;
     alp_payload_t* alp = NULL;
     alp_payload_t* alp_rsp = NULL;
-    alp_payload_t* alp_tmp = NULL;
 
     alp = alp_payload_f_rd_data(NULL, fid, offset, length, false);
     
@@ -352,11 +327,11 @@
         
         if (ALP_ERR_NONE > err) { PRINT("Read file err %d\n", err); break; }
         
-        alp_tmp = alp_payload_get(alp_rsp, ALP_OPCODE_RSP_F_DATA);
-        if (alp_tmp)
+        alp = alp_payload_get(alp_rsp, ALP_OPCODE_RSP_F_DATA);
+        if (alp)
         {
             alp_parsed_chunk_t r;
-            u8* p = alp_tmp->d;
+            u8* p = alp->d;
             
             alp_parse_chunk(&p, &r);
             memcpy(data, r.data, r.meta.f_data.length);
@@ -380,105 +355,50 @@
     return err;
 }
 
-static int _modem_write_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout)
+int modem_read_file(uint8_t fid, void *data, uint32_t offset, uint32_t length)
 {
-    int err = ALP_ERR_UNKNOWN;
-    alp_payload_t* alp = NULL;
-    alp_payload_t* alp_rsp = NULL;
-    alp_payload_t* alp_tmp = NULL;
-
-    alp = alp_payload_f_wr_data(NULL, fid, data, offset, length, false);
-
-    err = _modem_d7a_send(NULL, alp, &alp_rsp, timeout);
-
-    do {
-        if (ALP_ERR_NONE > err) { PRINT("Write file timeout\n"); break; }
-
-        err = alp_payload_get_err(alp_rsp);
-        
-        if (ALP_ERR_NONE > err) { PRINT("Write file err %d\n", err); break; }
-        
-        if (istatus)
-        {
-            _modem_get_istatus(alp_rsp, istatus);
-        }
-    
-    } while (0);
-
-    alp_payload_free(alp_rsp);
-
-    return err;
+    return _modem_read_file(NULL, NULL, fid, data, offset, length, MODEM_TIMEOUT_LOCAL);
 }
 
-int modem_read_file(uint8_t fid, void *data, uint32_t offset, uint32_t length)
+int modem_remote_read_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length)
 {
-    return _modem_read_file(NULL, NULL, fid, data, offset, length, MODEM_TIMEOUT);
-}
-
-int modem_remote_read_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout)
-{
-    return _modem_read_file(itf, istatus, fid, data, offset, length, timeout);
+    return _modem_read_file(itf, istatus, fid, data, offset, length, MODEM_TIMEOUT_DISTANT);
 }
 
 int modem_write_file(uint8_t fid, void *data, uint32_t offset, uint32_t length)
 {
-    return _modem_write_file(NULL, NULL, fid, data, offset, length, MODEM_TIMEOUT);
+    alp_payload_t* alp = alp_payload_f_wr_data(NULL, fid, data, offset, length, false);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
-int modem_remote_write_file(uint8_t* itf, void *istatus , uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout)
+int modem_remote_write_file(uint8_t* itf, void *istatus , uint8_t fid, void *data, uint32_t offset, uint32_t length)
 {
-    return _modem_write_file(itf, istatus, fid, data, offset, length, timeout);
+    alp_payload_t* alp = alp_payload_f_wr_data(NULL, fid, data, offset, length, false);
+    return modem_send_alp(itf, istatus, alp, MODEM_TIMEOUT_DISTANT);
+}
+
+int modem_flush_file(uint8_t fid)
+{
+    alp_payload_t* alp = alp_payload_f_flush(NULL, fid, false);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
 int modem_declare_file(uint8_t fid, alp_file_header_t* header)
 {
-    int err = ALP_ERR_UNKNOWN;
-    alp_payload_t* alp = NULL;
-    alp_payload_t* alp_rsp = NULL;
-
-    alp = alp_payload_f_declare(NULL, fid, header);
-
-    _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT);
-
-    err = alp_payload_get_err(alp_rsp);
-    
-    alp_payload_free(alp_rsp);
-
-    return err;
+    alp_payload_t* alp = alp_payload_f_declare(NULL, fid, header);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
 int modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
 {
-    int err = ALP_ERR_UNKNOWN;
-    alp_payload_t* alp = NULL;
-    alp_payload_t* alp_rsp = NULL;
-
-    alp = alp_payload_f_touch(NULL, fid, offset, length, false);
-
-    _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT);
-
-    err = alp_payload_get_err(alp_rsp);
-    
-    alp_payload_free(alp_rsp);
-
-    return err;
+    alp_payload_t* alp = alp_payload_f_touch(NULL, fid, offset, length, false);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
 static int _modem_d7a_itf_enable(u8 enable)
 {
-    int err = ALP_ERR_UNKNOWN;
-    alp_payload_t* alp = NULL;
-    alp_payload_t* alp_rsp = NULL;
-
-    alp = alp_payload_activate_itf(NULL, ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, enable);
-
-    _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT);
-
-    err = alp_payload_get_err(alp_rsp);
-    
-    alp_payload_free(alp_rsp);
-
-    return err;
+    alp_payload_t* alp = alp_payload_activate_itf(NULL, ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, enable);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
 int modem_d7a_enable_itf(void)
@@ -493,36 +413,14 @@
 
 static int modem_lwan_set_urc(void)
 {
-    int err = ALP_ERR_UNKNOWN;
-    alp_payload_t* alp = NULL;
-    alp_payload_t* alp_rsp = NULL;
-
-    alp = alp_payload_urcc_en(NULL, ALP_URC_TYPE_ITF_BUSY, FID_LWAN_ITF, 1);
-
-    _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT);
-
-    err = alp_payload_get_err(alp_rsp);
-    
-    alp_payload_free(alp_rsp);
-
-    return err;
+    alp_payload_t* alp = alp_payload_urcc_en(NULL, ALP_URC_TYPE_ITF_BUSY, FID_LWAN_ITF, 1);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
 static int modem_lwan_enable_itf(void)
 {
-    int err = ALP_ERR_UNKNOWN;
-    alp_payload_t* alp = NULL;
-    alp_payload_t* alp_rsp = NULL;
-
-    alp = alp_payload_activate_itf(NULL, ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF, 0, true);
-
-    _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT);
-
-    err = alp_payload_get_err(alp_rsp);
-    
-    alp_payload_free(alp_rsp);
-
-    return err;
+    alp_payload_t* alp = alp_payload_activate_itf(NULL, ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF, 0, true);
+    return modem_send_alp(NULL, NULL, alp, MODEM_TIMEOUT_LOCAL);
 }
 
 int modem_lwan_open(modem_lwan_callbacks_t* callbacks)
@@ -553,7 +451,7 @@
 {
     alp_itf_lwan_cfg_t itf = { .type = ALP_ITF_TYPE_LWAN };
     
-    return modem_remote_raw_alp((void*)&itf, alp, NULL, MODEM_TIMEOUT);
+    return modem_remote_raw_alp((void*)&itf, alp, NULL, MODEM_TIMEOUT_DISTANT);
 }
 
 int modem_lwan_get_status(lwan_status_t* status)