Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: modem_ref_helper CRC DebouncedInterrupt
Diff: main.cpp
- Revision:
- 11:41be2acd7541
- Parent:
- 8:db5679d113c2
- Child:
- 13:43bcbb6fc446
diff -r 96d836906b98 -r 41be2acd7541 main.cpp --- a/main.cpp Tue Jan 30 09:46:47 2018 +0000 +++ b/main.cpp Wed Jan 31 10:46:47 2018 +0000 @@ -9,6 +9,7 @@ Semaphore button_user(0); Semaphore modem_ready(0); +Semaphore user_ready(0); Queue<void, 8> modem_resp; uint8_t g_main_id, g_report_id; @@ -16,7 +17,9 @@ enum { MODEM_RESP_NO, MODEM_RESP_TERMINAL, - MODEM_RESP_DONE, + MODEM_RESP_ERROR, + MODEM_RESP_ACK, + MODEM_RESP_TIMEOUT, }; alp_d7a_itf_t alarm_itf = { @@ -39,24 +42,30 @@ button_user.release(); } - -// Callback for broadcast read +// Response Callback void my_response_callback(uint8_t terminal, int8_t err, uint8_t id) { (void)id; - //PRINT("TERMINAL %d STATUS %d\r\n", terminal, err); if (terminal) - { + { modem_resp.put((void*)MODEM_RESP_TERMINAL); } else { if (ALP_ERR_NONE == err) { - modem_resp.put((void*)MODEM_RESP_DONE); + modem_resp.put((void*)MODEM_RESP_ACK); + } + else + { + PRINT("Resp err %d ", err); + modem_resp.put((void*)MODEM_RESP_ERROR); } } + + // Wait end of user processing before resuming + user_ready.wait(); } void button_user_thread() @@ -96,24 +105,51 @@ ram_fs_write(FID_ALARM, 0, 1, &alarm); PRINT("BUTTON ALARM %d\r\n", alarm); - + + // Send data modem_send_file_content((uint8_t*)&alarm_itf, D7_ITF_SIZE(&alarm_itf), (void*)&istat, FID_ALARM, &alarm, 0, 1, my_user_id); do { - evt = modem_resp.get(); - resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : NULL; - - if (MODEM_RESP_DONE == resp) + // Wait for callback + evt = modem_resp.get(3000); + resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT; + + if (MODEM_RESP_ACK == resp) + { + // Print metadata + PRINT("ACK %d: ", ++nb); + PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " "); + PRINT("SNR: %ddB RXLEV: %ddBm LB: %ddB\n", istat.snr, -istat.rxlev, istat.lb); + + // Clear istatus buffer + memset(&istat, 0, sizeof(d7a_sp_res_t)); + + // Resume processing + user_ready.release(); + } + else if (MODEM_RESP_TIMEOUT == resp) { - nb++; - PRINT("ACK %d: ", nb); - PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " "); - PRINT("SNR:%d dB RXLEV:%d dBm LB:%d dB\n", istat.snr, -istat.rxlev, istat.lb); + // Could be because of the RF duty cycle, + // especialy after boot where the duty credit is near 0. + // The only thing to do is wait some time for duty credit. + PRINT("WAITING...\n"); + } + else if (MODEM_RESP_ERROR == resp) + { + PRINT("ERROR.\n"); - memset(&istat, 0, sizeof(d7a_sp_res_t)); + // Resume processing + user_ready.release(); } - + else if (MODEM_RESP_TERMINAL == resp) + { + PRINT("DONE.\n"); + + // Resume processing + user_ready.release(); + } + } while (MODEM_RESP_TERMINAL != resp); PRINT("BUTTON ALARM DONE\r\n");