Dash7Board Code Upgrade Protocol demonstration code.

Dependencies:   modem_ref_helper CRC

Revision:
9:d110f2b86831
Parent:
8:6b7d38139b43
--- a/main.cpp	Thu May 28 09:11:58 2020 +0000
+++ b/main.cpp	Fri Feb 19 11:00:25 2021 +0000
@@ -1,7 +1,7 @@
 // @autor: jeremie@wizzilab.com
 // @date: 2017-12-14
 
-#include "modem_ref_helper.h"
+#include "modem_d7a.h"
 #include "modem_callbacks.h"
 #include "files.h"
 #include "crc.h"
@@ -9,16 +9,13 @@
 
 #define CHUNK_SIZE (128)
 
-Semaphore modem_ready(0);
 Queue<touch_t, 8> g_file_modified;
 
 // CRC calculated on the incoming data stream
 extern uint32_t stream_crc;
 extern int32_t last_end;
 
-const uint8_t default_root_key[] = DEFAULT_ROOT_KEY;
-
-modem_callbacks_t callbacks = {
+modem_ref_callbacks_t callbacks = {
     .read       = my_read,
     .write      = my_write,
     .read_fprop = my_read_fprop,
@@ -32,22 +29,6 @@
     .busy       = my_busy
 };
 
-// Callback
-void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
-{
-    (void)id;
-    
-    if (ALP_ERR_NONE > err)
-    {
-        modem_print_error(ALP_ITF_TYPE_D7A, err);
-    }
-
-    if (terminal)
-    {
-        modem_ready.release();
-    }
-}
-
 void thread_file_modified()
 {
     touch_t* touch;
@@ -57,8 +38,6 @@
     uint32_t next_chunk = 0;
     uint32_t chunks=0;
     
-    uint8_t id = modem_get_id(my_main_callback);
-    
     PRINT("Ready\n");
     
     while (true)
@@ -73,7 +52,7 @@
             {
                 cup_cfg_bcast_header_t cup_cfg;
                 
-                ram_fs_read(FID_APP_CUP_CFG_BCAST, 0, sizeof(cup_cfg_bcast_header_t), (uint8_t*)&cup_cfg);
+                ram_fs_read(FID_APP_CUP_CFG_BCAST, (uint8_t*)&cup_cfg, 0, sizeof(cup_cfg_bcast_header_t));
                         
                 if (CUP_CMD_UPGRADE_FILE_START == cup_cfg.cmd)
                 {
@@ -94,8 +73,7 @@
                             .cmd = CUP_CMD_UPGRADE_UPLOAD,
                             .arch_nb = cup_cfg.to,
                             };
-                        modem_write_file_root(FID_CUP_CFG, (uint8_t*)&cup_start, 0, 4, (uint8_t*)default_root_key, id);
-                        modem_ready.acquire();
+                        modem_write_file(FID_CUP_CFG, (uint8_t*)&cup_start, 0, 4);
                     }
                     else
                     {
@@ -114,7 +92,7 @@
                 cup_cfg_t cup_cfg = { 0 };
                 uint8_t* data = (uint8_t*)((uint8_t*)&cup_cfg + touch->offset);
                 
-                ram_fs_read(touch->fid, touch->offset, touch->length, data);
+                ram_fs_read(touch->fid, data, touch->offset, touch->length);
                 
                 if (CUP_CMD_UPGRADE_FILE_END == cup_cfg.cmd)
                 {
@@ -147,8 +125,7 @@
                 
                 // Notify modem code file to reset upload watchdog
                 // else the device will exit upload mode after the watchdog timeout
-                modem_notify_file(FID_CUP_CODE, 0, 1, id);
-                modem_ready.acquire();
+                modem_notify_file(FID_CUP_CODE, 0, 1);
                 
                 break;
             }
@@ -174,7 +151,7 @@
           "---------------- Demo CUP ---------------\n"
           "-----------------------------------------\n");
               
-    modem_helper_open(&callbacks);
+    modem_open(&callbacks);
     
     PRINT("--------------- APP infos ---------------\r\n");
     PRINT(" - Manufacturer ID:  %08X\r\n", f_rev.manufacturer_id);
@@ -184,32 +161,39 @@
     PRINT(" - CUP max size:     %d\r\n", f_rev.cup_max_size);
     PRINT("-----------------------------------------\r\n");
     
-    uint8_t id = modem_get_id(my_main_callback);
-
     PRINT("Register Files\n");
-    modem_update_file(FID_HOST_REV, (alp_file_header_t*)&h_rev, (uint8_t*)&f_rev);
-    modem_update_file(FID_APP_CUP_CFG, (alp_file_header_t*)&h_cup_cfg, (uint8_t*)&f_cup_cfg);
-    modem_update_file(FID_APP_CUP_CFG_BCAST, (alp_file_header_t*)&h_cup_cfg_bcast, (uint8_t*)&f_cup_cfg_bcast);
+    ram_fs_new(FID_APP_CUP_CFG, (uint8_t*)&h_cup_cfg, (uint8_t*)&f_cup_cfg);
+    ram_fs_new(FID_APP_CUP_CFG_BCAST, (uint8_t*)&h_cup_cfg_bcast, (uint8_t*)&f_cup_cfg_bcast);
+    modem_declare_file(FID_APP_CUP_CFG, (alp_file_header_t*)&h_cup_cfg);
+    modem_declare_file(FID_APP_CUP_CFG_BCAST, (alp_file_header_t*)&h_cup_cfg_bcast);
     
     // Declare the cup code file
     // It needs a special handling of its data in my_write callback since we want to keep them.
     // (can't be done with the current RAM file system)
-    modem_declare_file(FID_APP_CUP_CODE, (alp_file_header_t*)&h_cup_code, true, id);
-    modem_ready.acquire();
+    modem_declare_file(FID_APP_CUP_CODE, (alp_file_header_t*)&h_cup_code);
     
-    PRINT("Start D7A Stack\n");
-    modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0,  ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, true, id);
-    modem_ready.acquire();
+    PRINT("Enable D7A interface\n");
+    modem_d7a_enable_itf();
+    
+    // Host revision file is in the modem. Update it.
+    PRINT("Update host revision\n");
+    modem_write_file(FID_HOST_REV, &f_rev, 0, sizeof(revision_t));
     
-    PRINT("Notify Modem Version\n");
-    modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, sizeof(revision_t), id);
-    modem_ready.acquire();
+    // Retrieve modem revision
+    PRINT("Send revision\n");
+    revision_t rev;
+    modem_read_file(FID_WM_REV, &rev, 0, sizeof(revision_t));
     
-    PRINT("Notify Host Version\n");
-    modem_notify_host_rev(&f_rev, &h_rev, (uint8_t*)default_root_key);
+    // Send both to the server
+    // Build payload
+    alp_payload_t* alp = NULL;
+    alp = alp_payload_rsp_f_data(alp, FID_WM_REV, &rev, 0, sizeof(revision_t));
+    alp = alp_payload_rsp_f_data(alp, FID_HOST_REV, &f_rev, 0, sizeof(revision_t));
     
-    // id no longer needed
-    modem_free_id(id);
+    // Send
+    alp_itf_d7a_cfg_t report_itf;
+    modem_read_file(IFID_REPORT, &report_itf, 0, sizeof(alp_itf_d7a_cfg_t));
+    modem_remote_raw_alp((void*)&report_itf, alp, NULL, 10000);
         
     // Start file modified thread
     Thread th_file_modified(osPriorityNormal, 1024, NULL);