]> git.tnoah.ca Git - lora-radio.git/commitdiff
Change read_len to array to combat multiple interface edge case
authorjacob.eva <x00010@disroot.org>
Tue, 22 Oct 2024 17:02:46 +0000 (18:02 +0100)
committerjacob.eva <x00010@disroot.org>
Tue, 22 Oct 2024 17:02:46 +0000 (18:02 +0100)
Config.h
RNode_Firmware_CE.ino

index 1f0d6a918fa08f864d98a0214ef503173763beb8..41646ec4bf351e9ecdc2c96eefd39fdc7c2f2450 100644 (file)
--- a/Config.h
+++ b/Config.h
@@ -90,7 +90,7 @@
        uint8_t last_rssi_raw   = 0x00;
        uint8_t last_snr_raw    = 0x80;
        uint8_t seq[INTERFACE_COUNT];
-       uint16_t read_len               = 0;
+       uint16_t read_len[INTERFACE_COUNT];
 
     bool serial_in_frame = false;
 
index 143bff9fa982d5ab489184e209400c3b961124d3..961d2938baa69784b6e292a51bf25d4982a489d3 100644 (file)
@@ -168,6 +168,7 @@ void setup() {
   memset(packet_lengths_buf, 0, sizeof(packet_starts_buf));
 
   memset(seq, 0xFF, sizeof(seq));
+  memset(read_len, 0, sizeof(read_len));
 
   modem_packet_queue = xQueueCreate(MODEM_QUEUE_SIZE, sizeof(modem_packet_t*));
 
@@ -355,7 +356,7 @@ inline void kiss_write_packet(int index) {
   // Add index of interface the packet came from
   serial_write(cmd_byte);
 
-  for (uint16_t i = 0; i < read_len; i++) {
+  for (uint16_t i = 0; i < read_len[index]; i++) {
     #if MCU_VARIANT == MCU_NRF52
       portENTER_CRITICAL();
       uint8_t byte = pbuf[i];
@@ -370,7 +371,7 @@ inline void kiss_write_packet(int index) {
   }
 
   serial_write(FEND);
-  read_len = 0;
+  read_len[index] = 0;
 
   #if MCU_VARIANT == MCU_ESP32 && HAS_BLE
       bt_flush();
@@ -378,14 +379,15 @@ inline void kiss_write_packet(int index) {
 }
 
 inline void getPacketData(RadioInterface* radio, uint16_t len) {
+    uint8_t index = radio->getIndex();
   #if MCU_VARIANT != MCU_NRF52
-    while (len-- && read_len < MTU) {
-      pbuf[read_len++] = radio->read();
+    while (len-- && read_len[index] < MTU) {
+      pbuf[read_len[index]++] = radio->read();
     }  
   #else
     BaseType_t int_mask = taskENTER_CRITICAL_FROM_ISR();
-    while (len-- && read_len < MTU) {
-      pbuf[read_len++] = radio->read();
+    while (len-- && read_len[index] < MTU) {
+      pbuf[read_len[index]++] = radio->read();
     }
     taskEXIT_CRITICAL_FROM_ISR(int_mask);
   #endif
@@ -394,7 +396,7 @@ inline void getPacketData(RadioInterface* radio, uint16_t len) {
 inline bool queue_packet(RadioInterface* radio, uint8_t index) {
     // 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);
+    modem_packet_t *modem_packet = (modem_packet_t*)malloc(sizeof(modem_packet_t) + read_len[index]);
     if(!modem_packet) { memory_low = true; return false; }
 
     // Get packet RSSI and SNR
@@ -408,8 +410,8 @@ inline bool queue_packet(RadioInterface* radio, uint8_t index) {
     // 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);
+    modem_packet->len = read_len[index];
+    memcpy(modem_packet->data, pbuf, read_len[index]);
     if (!modem_packet_queue || xQueueSendFromISR(modem_packet_queue, &modem_packet, NULL) != pdPASS) {
         free(modem_packet);
         return false;
@@ -437,9 +439,9 @@ void ISR_VECT receive_callback(uint8_t index, int packet_size) {
       // packet, so we set the seq variable
       // and add the data to the buffer
       #if MCU_VARIANT == MCU_NRF52
-        int_mask = taskENTER_CRITICAL_FROM_ISR(); read_len = 0; taskEXIT_CRITICAL_FROM_ISR(int_mask);
+        int_mask = taskENTER_CRITICAL_FROM_ISR(); read_len[index] = 0; taskEXIT_CRITICAL_FROM_ISR(int_mask);
       #else
-        read_len = 0;
+        read_len[index] = 0;
       #endif
       
       seq[index] = sequence;
@@ -462,9 +464,9 @@ void ISR_VECT receive_callback(uint8_t index, int packet_size) {
       // that we are seeing the first part of
       // a new split packet.
       #if MCU_VARIANT == MCU_NRF52
-        int_mask = taskENTER_CRITICAL_FROM_ISR(); read_len = 0; taskEXIT_CRITICAL_FROM_ISR(int_mask);
+        int_mask = taskENTER_CRITICAL_FROM_ISR(); read_len[index] = 0; taskEXIT_CRITICAL_FROM_ISR(int_mask);
       #else
-        read_len = 0;
+        read_len[index] = 0;
       #endif
       seq[index] = sequence;
 
@@ -479,9 +481,9 @@ void ISR_VECT receive_callback(uint8_t index, int packet_size) {
         // If we already had part of a split
         // packet in the buffer, we clear it.
         #if MCU_VARIANT == MCU_NRF52
-          int_mask = taskENTER_CRITICAL_FROM_ISR(); read_len = 0; taskEXIT_CRITICAL_FROM_ISR(int_mask);
+          int_mask = taskENTER_CRITICAL_FROM_ISR(); read_len[index] = 0; taskEXIT_CRITICAL_FROM_ISR(int_mask);
         #else
-          read_len = 0;
+          read_len[index] = 0;
         #endif
         seq[index] = SEQ_UNSET;
       }
@@ -493,7 +495,7 @@ void ISR_VECT receive_callback(uint8_t index, int packet_size) {
   } else {
     // In promiscuous mode, raw packets are
     // output directly to the host
-    read_len = 0;
+    read_len[index] = 0;
 
     getPacketData(selected_radio, packet_size);
 
@@ -1318,10 +1320,10 @@ void loop() {
     #if MCU_VARIANT == MCU_ESP32
       modem_packet_t *modem_packet = NULL;
       if(modem_packet_queue && xQueueReceive(modem_packet_queue, &modem_packet, 0) == pdTRUE && modem_packet) {
-        read_len = modem_packet->len;
+        packet_interface = modem_packet->interface;
+        read_len[packet_interface] = modem_packet->len;
         last_rssi = modem_packet->rssi;
         last_snr_raw = modem_packet->snr_raw;
-        packet_interface = modem_packet->interface;
         memcpy(&pbuf, modem_packet->data, modem_packet->len);
         free(modem_packet);
         modem_packet = NULL;
@@ -1334,11 +1336,11 @@ void loop() {
     #elif MCU_VARIANT == MCU_NRF52
       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;
+        packet_interface = modem_packet->interface;
+        read_len[packet_interface] = modem_packet->len;
         last_rssi = modem_packet->rssi;
         last_snr_raw = modem_packet->snr_raw;
-        packet_interface = modem_packet->interface;
+        memcpy(&pbuf, modem_packet->data, modem_packet->len);
         free(modem_packet);
         modem_packet = NULL;