]> git.tnoah.ca Git - lora-radio.git/commitdiff
Use event queue for modem interrupt packet retrieval on ESP32 and nRF52
authorMark Qvist <mark@unsigned.io>
Sat, 5 Oct 2024 13:28:32 +0000 (15:28 +0200)
committerMark Qvist <mark@unsigned.io>
Sat, 5 Oct 2024 13:28:32 +0000 (15:28 +0200)
Config.h
Framing.h
RNode_Firmware.ino

index 07572aab2ea49227b649047f7b3faf4314da3001..71025a7fef2e55674e9c3be026d733a34a70630f 100644 (file)
--- a/Config.h
+++ b/Config.h
        bool pmu_ready     = false;
        bool promisc       = false;
        bool implicit      = false;
+       bool memory_low    = false;
        uint8_t implicit_l = 0;
 
        uint8_t op_mode   = MODE_HOST;
index 2b588cc2857cabaf12c2b9c682d08a6d226d4bb7..9a9499eef002fbd1ddbd51bd4eb0327340ad07cb 100644 (file)
--- a/Framing.h
+++ b/Framing.h
@@ -93,6 +93,7 @@
   #define ERROR_TXFAILED      0x02
   #define ERROR_EEPROM_LOCKED 0x03
   #define ERROR_QUEUE_FULL    0x04
+  #define ERROR_MEMORY_LOW    0x05
 
   // Serial framing variables
   size_t frame_len;
index 80a007786b56e7a0aedb4edb04ec8205b1508f4d..7dbd0f08da7dbb4e418aeb5ed4c167f336c47502 100644 (file)
@@ -41,6 +41,15 @@ volatile bool serial_buffering = false;
   #include "Console.h"
 #endif
 
+#if PLATFORM == PLATFORM_ESP32 || PLATFORM == PLATFORM_NRF52
+  #define MODEM_QUEUE_SIZE 4
+  typedef struct {
+          size_t len;
+          uint8_t data[];
+  } modem_packet_t;
+  static xQueueHandle modem_packet_queue = NULL;
+#endif
+
 char sbuf[128];
 
 #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
@@ -133,6 +142,10 @@ void setup() {
   memset(packet_lengths_buf, 0, sizeof(packet_starts_buf));
   fifo16_init(&packet_lengths, packet_lengths_buf, CONFIG_QUEUE_MAX_LENGTH);
 
+  #if PLATFORM == PLATFORM_ESP32 || PLATFORM == PLATFORM_NRF52
+    modem_packet_queue = xQueueCreate(MODEM_QUEUE_SIZE, sizeof(modem_packet_t*));
+  #endif
+
   // Set chip select, reset and interrupt
   // pins for the LoRa module
   #if MODEM == SX1276 || MODEM == SX1278
@@ -335,8 +348,22 @@ void ISR_VECT receive_callback(int packet_size) {
 
         // And then write the entire packet
         kiss_write_packet();
+      
       #else
-        packet_ready = true;
+        // Allocate packet struct, but abort if there
+        // is not enough memory available.
+        modem_packet_t *modem_packet = (modem_packet_t*)malloc(sizeof(modem_packet_t) + read_len);
+        if(!modem_packet) { memory_low = true; return; }
+
+        // Send packet to event queue, but free the
+        // allocated memory again if the queue is
+        // unable to receive the packet.
+        modem_packet->len = read_len;
+        memcpy(modem_packet->data, pbuf, read_len);
+        if (!modem_packet_queue || xQueueSendFromISR(modem_packet_queue, &modem_packet, NULL) != pdPASS) {
+            free(modem_packet);
+        }
+
       #endif
     }  
   } else {
@@ -1259,7 +1286,13 @@ void validate_status() {
 void loop() {
   if (radio_online) {
     #if MCU_VARIANT == MCU_ESP32
-      if (packet_ready) {
+      modem_packet_t *modem_packet = NULL;
+      if(modem_packet_queue && xQueueReceive(modem_packet_queue, &modem_packet, 0) == pdTRUE && modem_packet) {
+        memcpy(&pbuf, modem_packet->data, modem_packet->len);
+        read_len = modem_packet->len;
+        free(modem_packet);
+        modem_packet = NULL;
+
         portENTER_CRITICAL(&update_lock);
         last_rssi = LoRa->packetRssi();
         last_snr_raw = LoRa->packetSnrRaw();
@@ -1274,7 +1307,13 @@ void loop() {
       if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true;
 
     #elif MCU_VARIANT == MCU_NRF52
-      if (packet_ready) {
+      modem_packet_t *modem_packet = NULL;
+      if(modem_packet_queue && xQueueReceive(modem_packet_queue, &modem_packet, 0) == pdTRUE && modem_packet) {
+        memcpy(&pbuf, modem_packet->data, modem_packet->len);
+        read_len = modem_packet->len;
+        free(modem_packet);
+        modem_packet = NULL;
+
         portENTER_CRITICAL();
         last_rssi = LoRa->packetRssi();
         last_snr_raw = LoRa->packetSnrRaw();
@@ -1287,6 +1326,7 @@ void loop() {
       airtime_lock = false;
       if (st_airtime_limit != 0.0 && airtime >= st_airtime_limit) airtime_lock = true;
       if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true;
+
     #endif
 
     checkModemStatus();
@@ -1371,6 +1411,8 @@ void loop() {
   #if HAS_INPUT
     input_read();
   #endif
+
+  if (memory_low) { kiss_indicate_error(ERROR_MEMORY_LOW); memory_low = false; }
 }
 
 void sleep_now() {