LoRaWAN demo.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Thu May 28 09:12:40 2020 +0000
Revision:
19:a530dce81081
Parent:
16:59d93cb1efee
Updated for v5.3.283.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:06ba20deb797 1 #include "modem_ref_helper.h"
Jeej 0:06ba20deb797 2
Jeej 0:06ba20deb797 3
Jeej 0:06ba20deb797 4 // ============================================================}}}
Jeej 0:06ba20deb797 5
Jeej 0:06ba20deb797 6 // Callbacks to MODEM's ALP requests
Jeej 0:06ba20deb797 7 // ============================================================{{{
Jeej 0:06ba20deb797 8 void my_read(u8 fid, u32 offset, u32 length, int id)
Jeej 0:06ba20deb797 9 {
Jeej 0:06ba20deb797 10 u8 data[256];
Jeej 0:06ba20deb797 11
Jeej 0:06ba20deb797 12 if (!ram_fs_read(fid, offset, length, data))
Jeej 0:06ba20deb797 13 {
Jeej 0:06ba20deb797 14 modem_respond_read(fid, data, offset, length, id);
Jeej 0:06ba20deb797 15 }
Jeej 0:06ba20deb797 16 else
Jeej 0:06ba20deb797 17 {
Jeej 15:86f6fa566d89 18 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:06ba20deb797 19 }
Jeej 0:06ba20deb797 20 }
Jeej 0:06ba20deb797 21
Jeej 0:06ba20deb797 22 void my_write(u8 fid, void *data, u32 offset, u32 length, int id)
Jeej 0:06ba20deb797 23 {
Jeej 0:06ba20deb797 24 if (!ram_fs_write(fid, offset, length, (uint8_t*)data))
Jeej 0:06ba20deb797 25 {
Jeej 15:86f6fa566d89 26 extern Queue<void, 8> g_file_modified;
Jeej 15:86f6fa566d89 27
Jeej 15:86f6fa566d89 28 modem_respond(ALP_ERR_NONE, id);
Jeej 0:06ba20deb797 29 g_file_modified.put((void*)fid);
Jeej 0:06ba20deb797 30 }
Jeej 0:06ba20deb797 31 else
Jeej 0:06ba20deb797 32 {
Jeej 15:86f6fa566d89 33 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:06ba20deb797 34 }
Jeej 0:06ba20deb797 35 }
Jeej 0:06ba20deb797 36
Jeej 0:06ba20deb797 37 void my_read_fprop(u8 fid, int id)
Jeej 0:06ba20deb797 38 {
Jeej 0:06ba20deb797 39 u8* hdr = (u8*)ram_fs_get_header(fid);
Jeej 0:06ba20deb797 40
Jeej 0:06ba20deb797 41 if (hdr != NULL)
Jeej 0:06ba20deb797 42 {
Jeej 0:06ba20deb797 43 modem_respond_fprop(fid, hdr, id);
Jeej 0:06ba20deb797 44 }
Jeej 0:06ba20deb797 45 else
Jeej 0:06ba20deb797 46 {
Jeej 15:86f6fa566d89 47 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:06ba20deb797 48 }
Jeej 0:06ba20deb797 49 }
Jeej 0:06ba20deb797 50
Jeej 0:06ba20deb797 51 void my_flush(u8 fid, int id)
Jeej 0:06ba20deb797 52 {
Jeej 0:06ba20deb797 53 // No flush in this file system
Jeej 15:86f6fa566d89 54 modem_respond(ALP_ERR_NONE, id);
Jeej 0:06ba20deb797 55 }
Jeej 0:06ba20deb797 56
Jeej 0:06ba20deb797 57 void my_delete(u8 fid, int id)
Jeej 0:06ba20deb797 58 {
Jeej 15:86f6fa566d89 59 modem_respond((ram_fs_delete(fid))? ALP_ERR_FILE_NOT_FOUND : ALP_ERR_NONE, id);
Jeej 0:06ba20deb797 60 }
Jeej 0:06ba20deb797 61
Jeej 7:026f8c8bcdab 62 void my_udata(void *data, u32 length)
Jeej 7:026f8c8bcdab 63 {
Jeej 7:026f8c8bcdab 64 uint8_t* p = (uint8_t*)data;
Jeej 7:026f8c8bcdab 65 int32_t rem = length;
Jeej 7:026f8c8bcdab 66 alp_parsed_chunk_t r;
Jeej 7:026f8c8bcdab 67 d7a_sp_res_t* istat;
Jeej 7:026f8c8bcdab 68
Jeej 7:026f8c8bcdab 69 do {
Jeej 7:026f8c8bcdab 70 uint32_t parsed = alp_parse_chunk(&p, &r);
Jeej 7:026f8c8bcdab 71 if (!parsed)
Jeej 7:026f8c8bcdab 72 {
Jeej 7:026f8c8bcdab 73 // Discard the payload in case of parsing error.
Jeej 7:026f8c8bcdab 74 PRINT("Parsing error!\r\n");
Jeej 7:026f8c8bcdab 75 break;
Jeej 7:026f8c8bcdab 76 }
Jeej 7:026f8c8bcdab 77 rem -= parsed;
Jeej 7:026f8c8bcdab 78
Jeej 7:026f8c8bcdab 79 switch (r.type)
Jeej 7:026f8c8bcdab 80 {
Jeej 7:026f8c8bcdab 81 // Interface status
Jeej 7:026f8c8bcdab 82 case ALP_OPCODE_RSP_ISTATUS:
Jeej 7:026f8c8bcdab 83 // D7A Interface
Jeej 7:026f8c8bcdab 84 if (ALP_ITF_TYPE_D7A == r.meta.itf.type)
Jeej 7:026f8c8bcdab 85 {
Jeej 7:026f8c8bcdab 86 union {
Jeej 7:026f8c8bcdab 87 u8 b[8];
Jeej 7:026f8c8bcdab 88 u32 w[2];
Jeej 7:026f8c8bcdab 89 } uid;
Jeej 7:026f8c8bcdab 90
Jeej 7:026f8c8bcdab 91 // ISTATUS can come either alone or together with ALP_OPCODE_RSP_F_DATA
Jeej 7:026f8c8bcdab 92 // but there should be only one per payload, moreover it will come first
Jeej 7:026f8c8bcdab 93 istat = (d7a_sp_res_t*)r.data;
Jeej 7:026f8c8bcdab 94 memcpy(uid.b,istat->addressee.id,8);
Jeej 7:026f8c8bcdab 95
Jeej 7:026f8c8bcdab 96 PRINT("Got accessed by UID:%08X%08X SNR: %3ddB RXLEV: -%-3ddBm LB: %3ddB\n",
Jeej 7:026f8c8bcdab 97 HAL_U32_BYTE_SWAP(uid.w[0]), HAL_U32_BYTE_SWAP(uid.w[1]),
Jeej 7:026f8c8bcdab 98 istat->snr, istat->rxlev, istat->lb);
Jeej 7:026f8c8bcdab 99 }
Jeej 7:026f8c8bcdab 100 else
Jeej 7:026f8c8bcdab 101 {
Jeej 7:026f8c8bcdab 102 PRINT("Got accessed by unknown Interface 0x%02X\n", r.meta.itf.type);
Jeej 7:026f8c8bcdab 103 }
Jeej 7:026f8c8bcdab 104 break;
Jeej 7:026f8c8bcdab 105 // Data return
Jeej 7:026f8c8bcdab 106 case ALP_OPCODE_RSP_F_DATA:
Jeej 7:026f8c8bcdab 107 // RSP_F_DATA can come either alone or together with ISTATUS
Jeej 7:026f8c8bcdab 108 PRINT("Got UNS File[%3d]@%d %d Bytes\n", r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 7:026f8c8bcdab 109 break;
Jeej 7:026f8c8bcdab 110 default:
Jeej 7:026f8c8bcdab 111 PRINT("Untreated OPCODE %d\n", r.type);
Jeej 7:026f8c8bcdab 112 break;
Jeej 7:026f8c8bcdab 113 }
Jeej 7:026f8c8bcdab 114 } while (rem > 0);
Jeej 0:06ba20deb797 115 }
Jeej 0:06ba20deb797 116
Jeej 0:06ba20deb797 117 void my_lqual(u8 ifid, int per)
Jeej 0:06ba20deb797 118 {
Jeej 0:06ba20deb797 119 PRINT("Interface File [%3d] LQUAL : %d%% PER\r\n", ifid, per);
Jeej 0:06ba20deb797 120 }
Jeej 0:06ba20deb797 121
Jeej 0:06ba20deb797 122 void my_ldown(u8 ifid)
Jeej 0:06ba20deb797 123 {
Jeej 0:06ba20deb797 124 PRINT("Interface File [%3d] LDOWN\r\n", ifid);
Jeej 0:06ba20deb797 125 }
Jeej 0:06ba20deb797 126
Jeej 0:06ba20deb797 127 void my_reset(void)
Jeej 0:06ba20deb797 128 {
Jeej 0:06ba20deb797 129 PRINT("Restarting application...\r\n");
Jeej 0:06ba20deb797 130 FLUSH();
Jeej 0:06ba20deb797 131 NVIC_SystemReset();
Jeej 0:06ba20deb797 132 }
Jeej 0:06ba20deb797 133
Jeej 0:06ba20deb797 134 void my_boot(u8 cause, u16 number)
Jeej 0:06ba20deb797 135 {
Jeej 0:06ba20deb797 136 PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 0:06ba20deb797 137
Jeej 0:06ba20deb797 138 // Modem re-booted, restart APP
Jeej 0:06ba20deb797 139 my_reset();
Jeej 7:026f8c8bcdab 140 }
Jeej 7:026f8c8bcdab 141
Jeej 7:026f8c8bcdab 142 void my_busy(u8 busy)
Jeej 7:026f8c8bcdab 143 {
Jeej 7:026f8c8bcdab 144 if (busy)
Jeej 7:026f8c8bcdab 145 {
Jeej 7:026f8c8bcdab 146 PRINT("Modem Busy\r\n");
Jeej 7:026f8c8bcdab 147
Jeej 7:026f8c8bcdab 148 /* Stop report, do not use modem */
Jeej 7:026f8c8bcdab 149 /* Wait for modem reboot or modem not busy */
Jeej 7:026f8c8bcdab 150 }
Jeej 7:026f8c8bcdab 151 else
Jeej 7:026f8c8bcdab 152 {
Jeej 7:026f8c8bcdab 153 PRINT("Modem not Busy\r\n");
Jeej 7:026f8c8bcdab 154
Jeej 7:026f8c8bcdab 155 /* Resume reports */
Jeej 7:026f8c8bcdab 156 }
Jeej 15:86f6fa566d89 157 }
Jeej 15:86f6fa566d89 158
Jeej 15:86f6fa566d89 159 void my_itf_busy(u8 ifid, u32 seconds)
Jeej 15:86f6fa566d89 160 {
Jeej 15:86f6fa566d89 161 //PRINT("ITF[%d] Busy for %d seconds.\r\n", ifid, seconds);
Jeej 15:86f6fa566d89 162
Jeej 15:86f6fa566d89 163 extern Semaphore modem_urc;
Jeej 16:59d93cb1efee 164 extern int32_t itf_busy;
Jeej 16:59d93cb1efee 165 extern Timer busy_tim;
Jeej 15:86f6fa566d89 166
Jeej 16:59d93cb1efee 167 busy_tim.reset();
Jeej 16:59d93cb1efee 168 busy_tim.start();
Jeej 15:86f6fa566d89 169 itf_busy = seconds;
Jeej 15:86f6fa566d89 170 modem_urc.release();
Jeej 0:06ba20deb797 171 }