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
--- 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");