samples: lora: receive: demo async reception
Demonstrate asynchronous reception in the LoRa sample.
Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
diff --git a/samples/drivers/lora/receive/src/main.c b/samples/drivers/lora/receive/src/main.c
index b550d40..4c5a8c3 100644
--- a/samples/drivers/lora/receive/src/main.c
+++ b/samples/drivers/lora/receive/src/main.c
@@ -20,6 +20,24 @@
#include <logging/log.h>
LOG_MODULE_REGISTER(lora_receive);
+void lora_receive_cb(const struct device *dev, uint8_t *data, uint16_t size,
+ int16_t rssi, int8_t snr)
+{
+ static int cnt;
+
+ ARG_UNUSED(dev);
+ ARG_UNUSED(size);
+
+ LOG_INF("Received data: %s (RSSI:%ddBm, SNR:%ddBm)",
+ log_strdup(data), rssi, snr);
+
+ /* Stop receiving after 10 packets */
+ if (++cnt == 10) {
+ LOG_INF("Stopping packet receptions");
+ lora_recv_async(dev, NULL);
+ }
+}
+
void main(void)
{
const struct device *lora_dev = DEVICE_DT_GET(DEFAULT_RADIO_NODE);
@@ -48,7 +66,9 @@
return;
}
- while (1) {
+ /* Receive 4 packets synchronously */
+ LOG_INF("Synchronous reception");
+ for (int i = 0; i < 4; i++) {
/* Block until data arrives */
len = lora_recv(lora_dev, data, MAX_DATA_LEN, K_FOREVER,
&rssi, &snr);
@@ -60,4 +80,9 @@
LOG_INF("Received data: %s (RSSI:%ddBm, SNR:%ddBm)",
log_strdup(data), rssi, snr);
}
+
+ /* Enable asynchronous reception */
+ LOG_INF("Asynchronous reception");
+ lora_recv_async(lora_dev, lora_receive_cb);
+ k_sleep(K_FOREVER);
}