LoRaWAN demo.

Dependencies:   modem_ref_helper DebouncedInterrupt

Files at this revision

API Documentation at this revision

Comitter:
Jeej
Date:
Fri Feb 19 14:58:25 2021 +0000
Parent:
20:49a8ecd1dda3
Commit message:
Updated for v5.6.x

Changed in this revision

d7a_callbacks.cpp Show annotated file Show diff for this revision Revisions of this file
d7a_callbacks.h Show annotated file Show diff for this revision Revisions of this file
files.cpp Show annotated file Show diff for this revision Revisions of this file
lwan_callbacks.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
modem_d7a.lib Show annotated file Show diff for this revision Revisions of this file
modem_ref_helper.lib Show diff for this revision Revisions of this file
--- a/d7a_callbacks.cpp	Wed Jan 27 14:45:50 2021 +0000
+++ b/d7a_callbacks.cpp	Fri Feb 19 14:58:25 2021 +0000
@@ -6,7 +6,7 @@
 
 // Callbacks to MODEM's ALP requests
 // ============================================================{{{
-void my_read(uint8_t fid, uint32_t offset, uint32_t length, int id)
+void my_read(u8 action, uint8_t fid, uint32_t offset, uint32_t length, int id)
 {
     uint8_t data[256];
     #if 0
@@ -17,26 +17,26 @@
     else
     #endif
     {
-        modem_ref_respond(ALP_ERR_FILE_NOT_FOUND, id);
+        modem_ref_respond(action, ALP_ERR_FILE_NOT_FOUND, id);
     }    
 }
 
-void my_write(uint8_t fid, void *data, uint32_t offset, uint32_t length, int id)
+void my_write(u8 action, uint8_t fid, void *data, uint32_t offset, uint32_t length, int id)
 {
     if (!ram_fs_write(fid, (uint8_t*)data, offset, length))
     {
         extern Queue<uint8_t, 8> g_file_modified;
 
-        modem_ref_respond(ALP_ERR_NONE, id);
+        modem_ref_respond(action, ALP_ERR_NONE, id);
         g_file_modified.put((uint8_t*)(uint32_t)fid);
     }
     else
     {
-        modem_ref_respond(ALP_ERR_FILE_NOT_FOUND, id);
+        modem_ref_respond(action, ALP_ERR_FILE_NOT_FOUND, id);
     }
 }
 
-void my_read_fprop(uint8_t fid, int id)
+void my_read_fprop(u8 action, uint8_t fid, int id)
 {
     uint8_t* hdr = (uint8_t*)ram_fs_get_header(fid);
     
@@ -46,74 +46,24 @@
     }
     else
     {
-        modem_ref_respond(ALP_ERR_FILE_NOT_FOUND, id);
+        modem_ref_respond(action, ALP_ERR_FILE_NOT_FOUND, id);
     }
 }
 
-void my_flush(uint8_t fid, int id)
+void my_flush(u8 action, uint8_t fid, int id)
 {
     // No flush in this file system
-    modem_ref_respond(ALP_ERR_NONE, id);
-}
-
-void my_delete(uint8_t fid, int id)
-{
-    modem_ref_respond((ram_fs_delete(fid))? ALP_ERR_FILE_NOT_FOUND : ALP_ERR_NONE, id);
+    modem_ref_respond(action, ALP_ERR_NONE, id);
 }
 
-void my_udata(void *data, uint32_t length)
-{    
-    uint8_t* p = (uint8_t*)data;
-    int32_t rem = length;
-    alp_parsed_chunk_t r;
-    d7a_sp_res_t* istat;
-    
-    do {
-        uint32_t parsed = alp_parse_chunk(&p, &r);
-        if (!parsed)
-        {
-            // Discard the payload in case of parsing error.
-            PRINT("Parsing error!\r\n");
-            break;
-        }
-        rem -= parsed;
-        
-        switch (r.type)
-        {
-            // Interface status
-            case ALP_OPCODE_RSP_ISTATUS:
-                // D7A Interface
-                if (ALP_ITF_TYPE_D7A == r.meta.itf.type)
-                {
-                    union {
-                        uint8_t      b[8];
-                        uint32_t     w[2];
-                    } uid;
-                    
-                    // ISTATUS can come either alone or together with ALP_OPCODE_RSP_F_DATA
-                    // but there should be only one per payload, moreover it will come first
-                    istat = (d7a_sp_res_t*)r.data;
-                    memcpy(uid.b,istat->addressee.id,8);
-                        
-                    PRINT("Got accessed by UID:%08X%08X SNR: %3ddB RXLEV: -%-3ddBm LB: %3ddB\n",
-                    HAL_U32_BYTE_SWAP(uid.w[0]), HAL_U32_BYTE_SWAP(uid.w[1]),
-                    istat->snr, istat->rxlev, istat->lb);
-                }
-                else
-                {
-                    PRINT("Got accessed by unknown Interface 0x%02X\n", r.meta.itf.type);
-                }
-                break;
-            // Data return
-            case ALP_OPCODE_RSP_F_DATA:
-                // RSP_F_DATA can come either alone or together with ISTATUS
-                PRINT("Got UNS File[%3d]@%d %d Bytes\n", r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
-                break;
-            default:
-                PRINT("Untreated OPCODE %d\n", r.type);
-                break;
-        }
-    } while (rem > 0);
+void my_delete(u8 action, uint8_t fid, int id)
+{
+    modem_ref_respond(action, (ram_fs_delete(fid))? ALP_ERR_FILE_NOT_FOUND : ALP_ERR_NONE, id);
+}
+
+void my_udata(alp_payload_t* alp)
+{
+    alp_payload_print(alp);
 }
 
 void my_lqual(uint8_t ifid, int per)
--- a/d7a_callbacks.h	Wed Jan 27 14:45:50 2021 +0000
+++ b/d7a_callbacks.h	Fri Feb 19 14:58:25 2021 +0000
@@ -1,14 +1,13 @@
 #include "hal_types.h"
 
-void my_read(uint8_t fid, uint32_t offset, uint32_t length, int id);
-void my_write(uint8_t fid, void *data, uint32_t offset, uint32_t length, int id);
-void my_read_fprop(uint8_t fid, int id);
-void my_flush(uint8_t fid, int id);
-void my_delete(uint8_t fid, int id);
-void my_udata(void *data, uint32_t length);
-void my_lqual(uint8_t ifid, int per);
-void my_ldown(uint8_t ifid);
+void my_read(u8 action, u8 fid, u32 offset, u32 length, int id);
+void my_write(u8 action, u8 fid, void *data, u32 offset, u32 length, int id);
+void my_read_fprop(u8 action, u8 fid, int id);
+void my_flush(u8 action, u8 fid, int id);
+void my_delete(u8 action, u8 fid, int id);
+void my_udata(alp_payload_t* alp);
+void my_lqual(u8 ifid, int per);
+void my_ldown(u8 ifid);
 void my_reset(void);
-void my_boot(uint8_t cause, u16 number);
-void my_busy(uint8_t busy);
-void my_itf_busy(uint8_t ifid, uint32_t seconds);
\ No newline at end of file
+void my_boot(u8 cause, u16 number);
+void my_busy(u8 busy);
\ No newline at end of file
--- a/files.cpp	Wed Jan 27 14:45:50 2021 +0000
+++ b/files.cpp	Fri Feb 19 14:58:25 2021 +0000
@@ -26,9 +26,9 @@
     ///  FW_ID | MAJOR | MINOR | PATCH | HASH |
     //     1B  |  1B   |  1B   |   2B  |  4B  |
     .fw_version.id       = 0,
-    .fw_version.major    = 1,
+    .fw_version.major    = 2,
     .fw_version.minor    = 0,
-    .fw_version.patch    = 5,
+    .fw_version.patch    = 0,
     .fw_version.hash     = 0x20200528,
     /// Not used
     .cup_max_size        = 0x00000000
--- a/lwan_callbacks.cpp	Wed Jan 27 14:45:50 2021 +0000
+++ b/lwan_callbacks.cpp	Fri Feb 19 14:58:25 2021 +0000
@@ -1,4 +1,4 @@
-#include "modem_lwan.h"
+#include "modem_d7a.h"
 
 void lwan_packet_sent(void)
 {
--- a/main.cpp	Wed Jan 27 14:45:50 2021 +0000
+++ b/main.cpp	Fri Feb 19 14:58:25 2021 +0000
@@ -3,7 +3,6 @@
 
 #include "DebouncedInterrupt.h"
 #include "modem_d7a.h"
-#include "modem_lwan.h"
 #include "d7a_callbacks.h"
 #include "lwan_callbacks.h"
 #include "files.h"
@@ -13,20 +12,12 @@
 #define ALARM_COOLDOWN_TIME 10000 // ms
 #define MIN_REPORT_PERIOD   (10) // Seconds
 
-enum {
-    MODEM_RESP_NO,
-    MODEM_RESP_TERMINAL,
-    MODEM_RESP_DONE,
-};
-
-Semaphore modem_ready[MAX_USER_NB];
 Semaphore modem_urc(0);
 Semaphore button_user(0);
 sensor_config_t g_light_config;
 Queue<uint8_t, 8> g_file_modified;
-Queue<void, 8> modem_resp;
 Queue<uint32_t, 8> g_urc;
-uint32_t itf_busy;
+int itf_busy;
 Timer busy_tim;
 
 bool alarm_ready = false;
@@ -122,22 +113,6 @@
     }
 }
 
-// Callback for id User
-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[id].release();
-    }
-}
-
 static bool report_ok(uint32_t last_report_time)
 {
     // Do not send a report if it's been less than MIN_REPORT_PERIOD since the last report
@@ -219,7 +194,7 @@
 {
     light_value_t light_level;
     light_value_t light_level_old = 0;
-    alp_pub_payload_t* alp = NULL;
+    alp_payload_t* alp = NULL;
     revision_t rev;
     
     // To force a first report
@@ -235,6 +210,7 @@
     modem_declare_file(FID_ALARM, (alp_file_header_t*)&h_alarm);
     
     PRINT("D7A: Notify Revision\n");
+    modem_d7a_enable_itf();
     
     // Host revision file is in the modem. Update it.
     modem_write_file(FID_HOST_REV, &f_rev, 0, sizeof(revision_t));
@@ -248,7 +224,7 @@
     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));
     // Send
-    modem_remote_raw_alp(&report_itf, NULL, alp);
+    modem_remote_raw_alp((void*)&report_itf, alp, NULL, 10000);
     
     // Get the sensor configuration
     ram_fs_read(FID_SENSOR_CONFIG, (uint8_t*)&g_light_config, 0, SIZE_SENSOR_CONFIG);
@@ -262,9 +238,12 @@
         if (report_needed(&g_light_config, light_level, light_level_old, last_report_time))
         {
             PRINT("D7A: Light report %d\r\n", light_level);
-        
-            // Send notification
-            modem_write_file(FID_SENSOR_LIGHT, &light_level, 0, SIZE_SENSOR_LIGHT);
+                    
+            // Build payload
+            alp = NULL;
+            alp = alp_payload_rsp_f_data(alp, FID_SENSOR_LIGHT, &light_level, 0, SIZE_SENSOR_LIGHT);
+            // Send
+            modem_remote_raw_alp((void*)&report_itf, alp, NULL, 1000);
         
             // Update 
             light_level_old = light_level;
@@ -281,7 +260,7 @@
 void lwan_thread()
 {
     alarm_t alarm;
-    alp_pub_payload_t* alp = NULL;
+    alp_payload_t* alp = NULL;
         
     DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
     user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
@@ -310,6 +289,27 @@
         {
             PRINT("LoRaWAN: Still busy for %ds.\r\n", itf_busy);
             busy_tim.reset();
+            
+            lwan_status_t lwan;
+            
+            modem_lwan_get_status(&lwan);
+            
+            PRINT(
+                "LoRaWAN: Joined            :%d\r\n"
+                "         NetID             :%d\r\n"
+                "         IsmBand           :%d\r\n"
+                "         PublicNetwork     :%d\r\n"
+                "         UpLinkCounter     :%d\r\n"
+                "         DownLinkCounter   :%d\r\n"
+                "         TxDr              :%d\r\n",
+                lwan.IsNetworkJoined,
+                lwan.NetID,
+                lwan.IsmBand,
+                lwan.PublicNetwork,
+                lwan.UpLinkCounter,
+                lwan.DownLinkCounter,
+                lwan.TxDr
+            );
         }
         else
         {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modem_d7a.lib	Fri Feb 19 14:58:25 2021 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/WizziLab/code/modem_ref_helper/#15bf99fcfed9
--- a/modem_ref_helper.lib	Wed Jan 27 14:45:50 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://developer.mbed.org/teams/WizziLab/code/modem_ref_helper/#b2dd7309da44