LoRaWAN demo.

Dependencies:   modem_ref_helper DebouncedInterrupt

Revision:
15:86f6fa566d89
Parent:
13:b9420183fbfc
Child:
16:59d93cb1efee
--- a/main.cpp	Thu Oct 11 14:39:37 2018 +0000
+++ b/main.cpp	Mon Nov 26 16:43:43 2018 +0000
@@ -18,10 +18,12 @@
 };
 
 Semaphore modem_ready[MAX_USER_NB];
+Semaphore modem_urc(0);
 Semaphore button_user(0);
 sensor_config_t g_light_config;
 Queue<void, 8> g_file_modified;
 Queue<void, 8> modem_resp;
+uint32_t itf_busy = 0;
 
 bool alarm_ready = false;
 
@@ -217,8 +219,6 @@
 
 void button_user_thread()
 {
-    FPRINT("(id:0x%08x)\r\n", osThreadGetId());
-
     alarm_t alarm;
     uint8_t id = modem_get_id(my_main_callback);
         
@@ -228,6 +228,14 @@
     
     // Load alarm value
     ram_fs_read(FID_ALARM, 0, SIZE_ALARM, &alarm);
+        
+    PRINT("Setup LoRaWAN URCs\n");
+    modem_enable_urc(ALP_URC_TYPE_ITF_BUSY, FID_LWAN_ITF0, 1, true, id);
+    modem_ready[id].wait();
+    
+    PRINT("Start LoRaWAN Stack (Join)\n");
+    modem_activate_itf(ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF0, 0, true, id);
+    modem_ready[id].wait();
     
     while (true)
     {
@@ -236,23 +244,53 @@
         alarm_ready = true;
         button_user.wait();
         alarm_ready = false;
-                
-        // load/save value to keep choerency in case of remote access...
-        ram_fs_read(FID_ALARM, 0, SIZE_ALARM, &alarm);
+
+        if (itf_busy)
+        {
+            PRINT("LoRaWAN Still busy.\r\n");
+        }
+        else
+        {
+            // load/save value to keep choerency in case of remote access...
+            ram_fs_read(FID_ALARM, 0, SIZE_ALARM, &alarm);
 
-        // Toggle alarm state
-        alarm = !alarm;
-        
-        ram_fs_write(FID_ALARM, 0, SIZE_ALARM, &alarm);
+            // Toggle alarm state
+            alarm = !alarm;
+            
+            ram_fs_write(FID_ALARM, 0, SIZE_ALARM, &alarm);
+            
+            PRINT("BUTTON ALARM %d\r\n", alarm);
+                        
+            modem_send_file_content((uint8_t*)&alarm_itf, sizeof(lwan_itf_t), NULL, FID_ALARM, &alarm, 0, SIZE_ALARM, id);
+            modem_ready[id].wait();
+        }
+    }
+}
+
+void urc_thread()
+{    
+    while (true)
+    {
+        modem_urc.wait();
         
-        PRINT("BUTTON ALARM %d\r\n", alarm);
-                    
-        modem_send_file_content((uint8_t*)&alarm_itf, sizeof(lwan_itf_t), NULL, FID_ALARM, &alarm, 0, SIZE_ALARM, id);
-        modem_ready[id].wait();
-        
-        PRINT("BUTTON ALARM DONE\r\n");
-        
-        Thread::wait(ALARM_COOLDOWN_TIME);
+        if (MAX_U32 == itf_busy)
+        {
+            // Failed to join
+            PRINT("LoRaWAN Join failed.\r\n");
+            
+            // Clear busy, join will be retried at next send.
+            itf_busy = 0;
+        }
+        else if (itf_busy)
+        {
+            // Packet will be sent in x seconds
+            PRINT("LoRaWAN Busy for %ds.\r\n", itf_busy);
+        }
+        else
+        {
+            // Packet has been sent
+            PRINT("LoRaWAN Done.\r\n");
+        }
     }
 }
 
@@ -268,6 +306,7 @@
     .reset      = my_reset,
     .boot       = my_boot,
     .busy       = my_busy,
+    .itf_busy   = my_itf_busy,
 };
 
 /*** Main function ------------------------------------------------------------- ***/
@@ -303,7 +342,7 @@
     modem_ready[id].wait();
 
     // Configure URC: LQUAL on report file notification every 10 reports
-    PRINT("Setup URCs\n");
+    PRINT("Setup D7A URCs\n");
     modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, id);
     modem_ready[id].wait();
     
@@ -311,10 +350,6 @@
     modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_EOP, true, id);
     modem_ready[id].wait();
     
-    PRINT("Start LoRaWAN Stack (Join)\n");
-    modem_activate_itf(ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF0, 0, true, id);
-    modem_ready[id].wait();
-    
     PRINT("Notify Modem Version\n");
     modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, id);
     modem_ready[id].wait();
@@ -342,6 +377,10 @@
     Thread but_th(osPriorityNormal, 1024, NULL);
     status = but_th.start(button_user_thread);
     ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
+    
+    Thread urc_th(osPriorityNormal, 1024, NULL);
+    status = urc_th.start(urc_thread);
+    ASSERT(status == osOK, "Failed to start urc thread (err: %d)\r\n", status);
 #endif
 
 #ifdef DEBUG_LED