Send file data demo.

Dependencies:   modem_ref_helper CRC DebouncedInterrupt

Revision:
14:788c749cabed
Parent:
13:43bcbb6fc446
Child:
15:4db98a56f7c1
--- a/main.cpp	Fri Mar 09 16:18:52 2018 +0000
+++ b/main.cpp	Thu Sep 20 12:26:16 2018 +0000
@@ -12,7 +12,7 @@
 Semaphore user_ready(0);
 Queue<void, 8> modem_resp;
 
-uint8_t g_main_id, g_report_id;
+uint8_t id, g_report_id;
 
 enum {
     MODEM_RESP_NO,
@@ -40,6 +40,30 @@
     button_user.release();
 }
 
+void print_status(uint8_t id, int status)
+{
+    switch (status)
+    {
+        case ALP_ERR_NONE:
+            PRINT("Status[%d]: OK\n", id);
+            break;
+        default:
+            PRINT("Status[%d]: error %d\n", id, status);
+            break;
+    }
+}
+
+// Main Callback
+void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
+{    
+    print_status(id, err);
+    
+    if (terminal)
+    {
+        modem_ready.release();
+    }
+}
+
 // Response Callback
 void my_response_callback(uint8_t terminal, int8_t err, uint8_t id)
 {
@@ -73,7 +97,7 @@
     osEvent evt;
     uint32_t resp;
     uint8_t alarm;
-    uint8_t my_user_id = modem_get_id(my_response_callback);
+    uint8_t id = modem_get_id(my_main_callback);
     d7a_sp_res_t istat;
     uint8_t nb = 0;
     
@@ -83,9 +107,13 @@
     ram_fs_read(FID_ALARM, 0, 1, &alarm);
     
     // Send initial value
-    modem_send_file_content((uint8_t*)&alarm_itf, D7_ITF_SIZE(&alarm_itf), (void*)&istat, FID_ALARM, &alarm, 0, 1, g_main_id);
+    modem_send_file_content((uint8_t*)&alarm_itf, D7_ITF_SIZE(&alarm_itf), (void*)&istat, FID_ALARM, &alarm, 0, 1, id);
     modem_ready.wait();
     
+    // Change callback
+    modem_free_id(id);
+    id = modem_get_id(my_response_callback);
+    
     while (true)
     {
         // Wait for button press
@@ -105,7 +133,7 @@
         PRINT("BUTTON ALARM %d\r\n", alarm);
         
         // Send data
-        modem_send_file_content((uint8_t*)&alarm_itf, D7_ITF_SIZE(&alarm_itf), (void*)&istat, FID_ALARM, &alarm, 0, 1, my_user_id);
+        modem_send_file_content((uint8_t*)&alarm_itf, D7_ITF_SIZE(&alarm_itf), (void*)&istat, FID_ALARM, &alarm, 0, 1, id);
         
         do
         {
@@ -117,7 +145,7 @@
             {
                 // Print metadata
                 PRINT("ACK %d: ", ++nb);
-                PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
+                PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " ");
                 PRINT("SNR: %ddB RXLEV: %ddBm LB: %ddB\n", istat.snr, -istat.rxlev, istat.lb);
                 
                 // Clear istatus buffer
@@ -130,7 +158,8 @@
             {
                 // Could be because of the RF duty cycle,
                 // especialy after boot where the duty credit is near 0.
-                // The only thing to do is wait some time for duty credit.
+                // The only thing to do is wait.
+                // The transmission will resume once some duty credit is available.
                 PRINT("WAITING...\n");
             }
             else if (MODEM_RESP_ERROR == resp)
@@ -147,7 +176,7 @@
                 // Resume processing
                 user_ready.release();
             }
-                        
+
         } while (MODEM_RESP_TERMINAL != resp);
         
         PRINT("BUTTON ALARM DONE\r\n");
@@ -162,38 +191,6 @@
     memcpy(hdr, ram_fs_get_header(fid), sizeof(alp_file_header_t));
 }
 
-void print_status(int status)
-{
-    switch (status)
-    {
-        case ALP_ERR_NONE:
-            PRINT("Status: OK\n");
-            break;
-        case ALP_ERR_FILE_EXIST:
-            PRINT("Status: Already registered\n");
-            break;
-        default:
-            PRINT("Status: error %d\n", status);
-            break;
-    }
-}
-
-void print_resp(int status)
-{
-    switch (status)
-    {
-        case ALP_ERR_NONE:
-            PRINT("Resp: OK\n");
-            break;
-        case ALP_ERR_FILE_EXIST:
-            PRINT("Resp: Already registered\n");
-            break;
-        default:
-            PRINT("Resp: error %d\n", status);
-            break;
-    }
-}
-
 modem_callbacks_t callbacks = {
     .read       = my_read,
     .write      = my_write,
@@ -204,25 +201,10 @@
     .lqual      = my_lqual,
     .ldown      = my_ldown,
     .reset      = my_reset,
-    .boot       = my_boot
+    .boot       = my_boot,
+    .busy       = my_busy,
 };
 
-// Callback for g_main_id User
-void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
-{
-    (void)id;
-    
-    if (terminal)
-    {    
-        print_status(err);
-        modem_ready.release();
-    }
-    else
-    {
-        print_resp(err);
-    }
-}
-
 
 /*** Main function ------------------------------------------------------------- ***/
 int main()
@@ -242,7 +224,7 @@
     
     modem_helper_open(&callbacks);
     
-    g_main_id = modem_get_id(my_main_callback);
+    uint8_t id = modem_get_id(my_main_callback);
     
     PRINT("Register Files\n");
     // HOST Revision is a local file. Uses D7AActP Notification.
@@ -255,20 +237,22 @@
 
     // Configure URC: LQUAL on report file notification every 10 reports
     PRINT("Setup URCs\n");
-    modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, g_main_id);
+    modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, id);
     modem_ready.wait();
     
     PRINT("Start D7A Stack\n");
-    modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS, true, g_main_id);
+    modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS, true, id);
     modem_ready.wait();
     
     PRINT("Notify Modem Version\n");
-    modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, g_main_id);
+    modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, id);
     modem_ready.wait();
     
     PRINT("Notify FW Version\n");
-    modem_notify_file(FID_HOST_REV, 0, SIZE_HOST_REV, g_main_id);
+    modem_notify_file(FID_HOST_REV, 0, SIZE_HOST_REV, id);
     modem_ready.wait();
+    
+    modem_free_id(id);
 
 #ifdef DEBUG_BUTTON
     DebouncedInterrupt user_interrupt(DEBUG_BUTTON);