LoRaWAN demo.
Dependencies: modem_ref_helper DebouncedInterrupt
Revision 21:f0aecd41db08, committed 2021-02-19
- 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
--- 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