WizziLab / Mbed OS D7A_1x_demo_send_file_data Featured

Dependencies:   modem_ref_helper CRC DebouncedInterrupt

Revision:
11:41be2acd7541
Parent:
8:db5679d113c2
Child:
13:43bcbb6fc446
diff -r 96d836906b98 -r 41be2acd7541 main.cpp
--- a/main.cpp	Tue Jan 30 09:46:47 2018 +0000
+++ b/main.cpp	Wed Jan 31 10:46:47 2018 +0000
@@ -9,6 +9,7 @@
 
 Semaphore button_user(0);
 Semaphore modem_ready(0);
+Semaphore user_ready(0);
 Queue<void, 8> modem_resp;
 
 uint8_t g_main_id, g_report_id;
@@ -16,7 +17,9 @@
 enum {
     MODEM_RESP_NO,
     MODEM_RESP_TERMINAL,
-    MODEM_RESP_DONE,
+    MODEM_RESP_ERROR,
+    MODEM_RESP_ACK,
+    MODEM_RESP_TIMEOUT,
 };
 
 alp_d7a_itf_t alarm_itf = {
@@ -39,24 +42,30 @@
     button_user.release();
 }
 
-
-// Callback for broadcast read
+// Response Callback
 void my_response_callback(uint8_t terminal, int8_t err, uint8_t id)
 {
     (void)id;
     
-    //PRINT("TERMINAL %d STATUS %d\r\n", terminal, err);
     if (terminal)
-    {    
+    {
         modem_resp.put((void*)MODEM_RESP_TERMINAL);
     }
     else
     {
         if (ALP_ERR_NONE == err)
         {
-            modem_resp.put((void*)MODEM_RESP_DONE);
+            modem_resp.put((void*)MODEM_RESP_ACK);
+        }
+        else
+        {
+            PRINT("Resp err %d ", err);
+            modem_resp.put((void*)MODEM_RESP_ERROR);
         }
     }
+    
+    // Wait end of user processing before resuming
+    user_ready.wait();
 }
 
 void button_user_thread()
@@ -96,24 +105,51 @@
         ram_fs_write(FID_ALARM, 0, 1, &alarm);
         
         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);
         
         do
         {
-            evt = modem_resp.get();
-            resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : NULL;
-            
-            if (MODEM_RESP_DONE == resp)
+            // Wait for callback
+            evt = modem_resp.get(3000);
+            resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
+                        
+            if (MODEM_RESP_ACK == resp)
+            {
+                // Print metadata
+                PRINT("ACK %d: ", ++nb);
+                PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
+                PRINT("SNR: %ddB RXLEV: %ddBm LB: %ddB\n", istat.snr, -istat.rxlev, istat.lb);
+                
+                // Clear istatus buffer
+                memset(&istat, 0, sizeof(d7a_sp_res_t));
+                
+                // Resume processing
+                user_ready.release();
+            }
+            else if (MODEM_RESP_TIMEOUT == resp)
             {
-                nb++;
-                PRINT("ACK %d: ", nb);
-                PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " ");
-                PRINT("SNR:%d dB RXLEV:%d dBm LB:%d dB\n", istat.snr, -istat.rxlev, istat.lb);
+                // 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.
+                PRINT("WAITING...\n");
+            }
+            else if (MODEM_RESP_ERROR == resp)
+            {
+                PRINT("ERROR.\n");
                 
-                memset(&istat, 0, sizeof(d7a_sp_res_t));
+                // Resume processing
+                user_ready.release();
             }
-            
+            else if (MODEM_RESP_TERMINAL == resp)
+            {
+                PRINT("DONE.\n");
+                
+                // Resume processing
+                user_ready.release();
+            }
+                        
         } while (MODEM_RESP_TERMINAL != resp);
         
         PRINT("BUTTON ALARM DONE\r\n");