LoRaWAN demo.
Dependencies: modem_ref_helper DebouncedInterrupt
Diff: d7a_callbacks.cpp
- 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