LoRaWAN demo.

Dependencies:   modem_ref_helper DebouncedInterrupt

Revision:
20:49a8ecd1dda3
Child:
21:f0aecd41db08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/d7a_callbacks.cpp	Wed Jan 27 14:45:50 2021 +0000
@@ -0,0 +1,167 @@
+#include "modem_d7a.h"
+#include "ram_fs.h"
+
+
+// ============================================================}}}
+
+// Callbacks to MODEM's ALP requests
+// ============================================================{{{
+void my_read(uint8_t fid, uint32_t offset, uint32_t length, int id)
+{
+    uint8_t data[256];
+    #if 0
+    //if (!ram_fs_read(fid, (uint8_t*)data, offset, length))
+    {
+        modem_ref_respond_read(fid, data, offset, length, id);
+    }
+    else
+    #endif
+    {
+        modem_ref_respond(ALP_ERR_FILE_NOT_FOUND, id);
+    }    
+}
+
+void my_write(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);
+        g_file_modified.put((uint8_t*)(uint32_t)fid);
+    }
+    else
+    {
+        modem_ref_respond(ALP_ERR_FILE_NOT_FOUND, id);
+    }
+}
+
+void my_read_fprop(uint8_t fid, int id)
+{
+    uint8_t* hdr = (uint8_t*)ram_fs_get_header(fid);
+    
+    if (hdr != NULL)
+    {
+        modem_ref_respond_fprop(fid, (alp_file_header_t*)hdr, id);
+    }
+    else
+    {
+        modem_ref_respond(ALP_ERR_FILE_NOT_FOUND, id);
+    }
+}
+
+void my_flush(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);
+}
+
+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_lqual(uint8_t ifid, int per)
+{
+    PRINT("Interface File [%3d] LQUAL : %d%% PER\r\n", ifid, per);
+}
+
+void my_ldown(uint8_t ifid)
+{
+    PRINT("Interface File [%3d] LDOWN\r\n", ifid);
+}
+
+void my_reset(void)
+{
+    PRINT("Restarting application...\r\n");
+    FLUSH();
+    NVIC_SystemReset();
+}
+
+void my_boot(uint8_t cause, u16 number)
+{
+    PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
+    
+    // Modem re-booted, restart APP
+    my_reset();
+}
+
+void my_busy(uint8_t busy)
+{
+    if (busy)
+    {
+        PRINT("Modem Busy\r\n");
+        
+        /* Stop report, do not use modem */
+        /* Wait for modem reboot or modem not busy */
+    }
+    else
+    {
+        PRINT("Modem not Busy\r\n");
+        
+        /* Resume reports */
+    }
+}
+
+void my_itf_busy(uint8_t ifid, uint32_t seconds)
+{
+    extern Queue<uint32_t, 8> g_urc;
+    
+    //PRINT("ITF[%d] Busy for %d seconds.\r\n", ifid, seconds);
+    g_urc.put((uint32_t*)seconds);
+}
\ No newline at end of file