LoRaWAN demo.
Dependencies: modem_ref_helper DebouncedInterrupt
Diff: main.cpp
- Revision:
- 15:86f6fa566d89
- Parent:
- 13:b9420183fbfc
- Child:
- 16:59d93cb1efee
--- a/main.cpp Thu Oct 11 14:39:37 2018 +0000 +++ b/main.cpp Mon Nov 26 16:43:43 2018 +0000 @@ -18,10 +18,12 @@ }; Semaphore modem_ready[MAX_USER_NB]; +Semaphore modem_urc(0); Semaphore button_user(0); sensor_config_t g_light_config; Queue<void, 8> g_file_modified; Queue<void, 8> modem_resp; +uint32_t itf_busy = 0; bool alarm_ready = false; @@ -217,8 +219,6 @@ void button_user_thread() { - FPRINT("(id:0x%08x)\r\n", osThreadGetId()); - alarm_t alarm; uint8_t id = modem_get_id(my_main_callback); @@ -228,6 +228,14 @@ // Load alarm value ram_fs_read(FID_ALARM, 0, SIZE_ALARM, &alarm); + + PRINT("Setup LoRaWAN URCs\n"); + modem_enable_urc(ALP_URC_TYPE_ITF_BUSY, FID_LWAN_ITF0, 1, true, id); + modem_ready[id].wait(); + + PRINT("Start LoRaWAN Stack (Join)\n"); + modem_activate_itf(ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF0, 0, true, id); + modem_ready[id].wait(); while (true) { @@ -236,23 +244,53 @@ alarm_ready = true; button_user.wait(); alarm_ready = false; - - // load/save value to keep choerency in case of remote access... - ram_fs_read(FID_ALARM, 0, SIZE_ALARM, &alarm); + + if (itf_busy) + { + PRINT("LoRaWAN Still busy.\r\n"); + } + else + { + // load/save value to keep choerency in case of remote access... + ram_fs_read(FID_ALARM, 0, SIZE_ALARM, &alarm); - // Toggle alarm state - alarm = !alarm; - - ram_fs_write(FID_ALARM, 0, SIZE_ALARM, &alarm); + // Toggle alarm state + alarm = !alarm; + + ram_fs_write(FID_ALARM, 0, SIZE_ALARM, &alarm); + + PRINT("BUTTON ALARM %d\r\n", alarm); + + modem_send_file_content((uint8_t*)&alarm_itf, sizeof(lwan_itf_t), NULL, FID_ALARM, &alarm, 0, SIZE_ALARM, id); + modem_ready[id].wait(); + } + } +} + +void urc_thread() +{ + while (true) + { + modem_urc.wait(); - PRINT("BUTTON ALARM %d\r\n", alarm); - - modem_send_file_content((uint8_t*)&alarm_itf, sizeof(lwan_itf_t), NULL, FID_ALARM, &alarm, 0, SIZE_ALARM, id); - modem_ready[id].wait(); - - PRINT("BUTTON ALARM DONE\r\n"); - - Thread::wait(ALARM_COOLDOWN_TIME); + if (MAX_U32 == itf_busy) + { + // Failed to join + PRINT("LoRaWAN Join failed.\r\n"); + + // Clear busy, join will be retried at next send. + itf_busy = 0; + } + else if (itf_busy) + { + // Packet will be sent in x seconds + PRINT("LoRaWAN Busy for %ds.\r\n", itf_busy); + } + else + { + // Packet has been sent + PRINT("LoRaWAN Done.\r\n"); + } } } @@ -268,6 +306,7 @@ .reset = my_reset, .boot = my_boot, .busy = my_busy, + .itf_busy = my_itf_busy, }; /*** Main function ------------------------------------------------------------- ***/ @@ -303,7 +342,7 @@ modem_ready[id].wait(); // Configure URC: LQUAL on report file notification every 10 reports - PRINT("Setup URCs\n"); + PRINT("Setup D7A URCs\n"); modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, id); modem_ready[id].wait(); @@ -311,10 +350,6 @@ modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_EOP, true, id); modem_ready[id].wait(); - PRINT("Start LoRaWAN Stack (Join)\n"); - modem_activate_itf(ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF0, 0, true, id); - modem_ready[id].wait(); - PRINT("Notify Modem Version\n"); modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, id); modem_ready[id].wait(); @@ -342,6 +377,10 @@ Thread but_th(osPriorityNormal, 1024, NULL); status = but_th.start(button_user_thread); ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status); + + Thread urc_th(osPriorityNormal, 1024, NULL); + status = urc_th.start(urc_thread); + ASSERT(status == osOK, "Failed to start urc thread (err: %d)\r\n", status); #endif #ifdef DEBUG_LED