]> git.tnoah.ca Git - lora-radio.git/commitdiff
Improved ESP32 compatibility
authorMark Qvist <mark@unsigned.io>
Fri, 14 Jan 2022 20:12:33 +0000 (21:12 +0100)
committerMark Qvist <mark@unsigned.io>
Fri, 14 Jan 2022 20:12:33 +0000 (21:12 +0100)
Config.h
RNode_Firmware.ino

index c09d961c01b2bb2beff7bc412cc8f7b1e2296936..c58f42b1ac0dbf0e16f5cdab69cbef7b053d92bb 100644 (file)
--- a/Config.h
+++ b/Config.h
@@ -83,7 +83,7 @@
 
                #define BOARD_MODEL BOARD_TBEAM
 
-               #define CONFIG_UART_BUFFER_SIZE 64
+               #define CONFIG_UART_BUFFER_SIZE 6144
                #define CONFIG_QUEUE_SIZE 6144
                #define CONFIG_QUEUE_MAX_LENGTH 250
 
index 5fa380222013344ce61b37eda5a3fdfaca244c34..8bebf9e44187a7af2017ee5da8f3b61d70f3f057 100644 (file)
@@ -22,18 +22,13 @@ volatile bool serial_buffering = false;
 char sbuf[128];
 
 #if MCU_VARIANT == MCU_ESP32
-  #include "soc/rtc_wdt.h"
-  #define ISR_VECT IRAM_ATTR
   bool packet_ready = false;
-#else
-  #define ISR_VECT
 #endif
 
 void setup() {
   #if MCU_VARIANT == MCU_ESP32
     delay(500);
     EEPROM.begin(EEPROM_SIZE);
-    // TODO: Check this
     Serial.setRxBufferSize(CONFIG_UART_BUFFER_SIZE);
   #endif
 
@@ -69,16 +64,9 @@ void setup() {
   // pins for the LoRa module
   LoRa.setPins(pin_cs, pin_reset, pin_dio);
 
-  #if MCU_VARIANT == MCU_ESP32
-    // ESP32-specific initialisation
-    Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, PIN_GPS_RX, PIN_GPS_TX);
-    
-    // rtc_wdt_protect_off();
-    // rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM);
-    // rtc_wdt_set_time(RTC_WDT_STAGE0, 25);
-    // rtc_wdt_protect_on();
-    // rtc_wdt_enable();
-
+  #if MCU_VARIANT == MCU_ESP32    
+    Wire.begin(I2C_SDA, I2C_SCL);
+    initPMU();
     kiss_indicate_reset();
   #endif
 
@@ -97,7 +85,7 @@ void lora_receive() {
 inline void kiss_write_packet() {
   Serial.write(FEND);
   Serial.write(CMD_DATA);
-  for (int i = 0; i < read_len; i++) {
+  for (uint16_t i = 0; i < read_len; i++) {
     uint8_t byte = pbuf[i];
     if (byte == FEND) { Serial.write(FESC); byte = TFEND; }
     if (byte == FESC) { Serial.write(FESC); byte = TFESC; }
@@ -110,123 +98,89 @@ inline void kiss_write_packet() {
   #endif
 }
 
-inline void getPacketData(int len) {
+inline void getPacketData(uint16_t len) {
   while (len-- && read_len < MTU) {
     pbuf[read_len++] = LoRa.read();
   }
 }
 
-#if MCU_VARIANT == MCU_ESP32
-  portMUX_TYPE isr_lock = portMUX_INITIALIZER_UNLOCKED;
-#endif
-
-bool handling_packet = false;
 void ISR_VECT receive_callback(int packet_size) {
-  #if MCU_VARIANT == MCU_ESP32
-    portENTER_CRITICAL_ISR(&isr_lock);
-  #endif
+  if (!promisc) {
+    // The standard operating mode allows large
+    // packets with a payload up to 500 bytes,
+    // by combining two raw LoRa packets.
+    // We read the 1-byte header and extract
+    // packet sequence number and split flags
+    uint8_t header   = LoRa.read(); packet_size--;
+    uint8_t sequence = packetSequence(header);
+    bool    ready    = false;
+
+    if (isSplitPacket(header) && seq == SEQ_UNSET) {
+      // This is the first part of a split
+      // packet, so we set the seq variable
+      // and add the data to the buffer
+      read_len = 0;
+      seq = sequence;
 
-  #if MCU_VARIANT == MCU_ESP32
-  if (!handling_packet) {
-    handling_packet = true;
-    #endif
-
-    if (!promisc) {
-      // The standard operating mode allows large
-      // packets with a payload up to 500 bytes,
-      // by combining two raw LoRa packets.
-      // We read the 1-byte header and extract
-      // packet sequence number and split flags
-      uint8_t header   = LoRa.read(); packet_size--;
-      uint8_t sequence = packetSequence(header);
-      bool    ready    = false;
-
-      if (isSplitPacket(header) && seq == SEQ_UNSET) {
-        // This is the first part of a split
-        // packet, so we set the seq variable
-        // and add the data to the buffer
-        read_len = 0;
-        seq = sequence;
-
-        #if MCU_VARIANT != MCU_ESP32
-          last_rssi = LoRa.packetRssi();
-          last_snr_raw = LoRa.packetSnrRaw();
-        #endif
-
-        getPacketData(packet_size);
-
-      } else if (isSplitPacket(header) && seq == sequence) {
-        // This is the second part of a split
-        // packet, so we add it to the buffer
-        // and set the ready flag.
-        
-        #if MCU_VARIANT != MCU_ESP32
-          last_rssi = (last_rssi+LoRa.packetRssi())/2;
-          last_snr_raw = (last_snr_raw+LoRa.packetSnrRaw())/2;
-        #endif
-        
-        getPacketData(packet_size);
-        seq = SEQ_UNSET;
-        ready = true;
-
-      } else if (isSplitPacket(header) && seq != sequence) {
-        // This split packet does not carry the
-        // same sequence id, so we must assume
-        // that we are seeing the first part of
-        // a new split packet.
-        read_len = 0;
-        seq = sequence;
+      #if MCU_VARIANT != MCU_ESP32
+        last_rssi = LoRa.packetRssi();
+        last_snr_raw = LoRa.packetSnrRaw();
+      #endif
 
-        #if MCU_VARIANT != MCU_ESP32
-          last_rssi = LoRa.packetRssi();
-          last_snr_raw = LoRa.packetSnrRaw();
-        #endif
+      getPacketData(packet_size);
 
-        getPacketData(packet_size);
+    } else if (isSplitPacket(header) && seq == sequence) {
+      // This is the second part of a split
+      // packet, so we add it to the buffer
+      // and set the ready flag.
+      
+      #if MCU_VARIANT != MCU_ESP32
+        last_rssi = (last_rssi+LoRa.packetRssi())/2;
+        last_snr_raw = (last_snr_raw+LoRa.packetSnrRaw())/2;
+      #endif
+      
+      getPacketData(packet_size);
+      seq = SEQ_UNSET;
+      ready = true;
+
+    } else if (isSplitPacket(header) && seq != sequence) {
+      // This split packet does not carry the
+      // same sequence id, so we must assume
+      // that we are seeing the first part of
+      // a new split packet.
+      read_len = 0;
+      seq = sequence;
 
-      } else if (!isSplitPacket(header)) {
-        // This is not a split packet, so we
-        // just read it and set the ready
-        // flag to true.
+      #if MCU_VARIANT != MCU_ESP32
+        last_rssi = LoRa.packetRssi();
+        last_snr_raw = LoRa.packetSnrRaw();
+      #endif
 
-        if (seq != SEQ_UNSET) {
-          // If we already had part of a split
-          // packet in the buffer, we clear it.
-          read_len = 0;
-          seq = SEQ_UNSET;
-        }
+      getPacketData(packet_size);
 
-        #if MCU_VARIANT != MCU_ESP32
-          last_rssi = LoRa.packetRssi();
-          last_snr_raw = LoRa.packetSnrRaw();
-        #endif
+    } else if (!isSplitPacket(header)) {
+      // This is not a split packet, so we
+      // just read it and set the ready
+      // flag to true.
 
-        getPacketData(packet_size);
-        ready = true;
+      if (seq != SEQ_UNSET) {
+        // If we already had part of a split
+        // packet in the buffer, we clear it.
+        read_len = 0;
+        seq = SEQ_UNSET;
       }
 
-      if (ready) {
-        #if MCU_VARIANT != MCU_ESP32
-          // We first signal the RSSI of the
-          // recieved packet to the host.
-          kiss_indicate_stat_rssi();
-          kiss_indicate_stat_snr();
-
-          // And then write the entire packet
-          kiss_write_packet();
-        #else
-          packet_ready = true;
-        #endif
-      }  
-    } else {
       #if MCU_VARIANT != MCU_ESP32
-        // In promiscuous mode, raw packets are
-        // output directly to the host
-        read_len = 0;
         last_rssi = LoRa.packetRssi();
         last_snr_raw = LoRa.packetSnrRaw();
-        getPacketData(packet_size);
+      #endif
+
+      getPacketData(packet_size);
+      ready = true;
+    }
 
+    if (ready) {
+      #if MCU_VARIANT != MCU_ESP32
         // We first signal the RSSI of the
         // recieved packet to the host.
         kiss_indicate_stat_rssi();
@@ -234,21 +188,33 @@ void ISR_VECT receive_callback(int packet_size) {
 
         // And then write the entire packet
         kiss_write_packet();
-
       #else
-        read_len = 0;
-        getPacketData(packet_size);
         packet_ready = true;
       #endif
-    #if MCU_VARIANT == MCU_ESP32
-    }
-    handling_packet = false;
+    }  
+  } else {
+    #if MCU_VARIANT != MCU_ESP32
+      // In promiscuous mode, raw packets are
+      // output directly to the host
+      read_len = 0;
+      last_rssi = LoRa.packetRssi();
+      last_snr_raw = LoRa.packetSnrRaw();
+      getPacketData(packet_size);
+
+      // We first signal the RSSI of the
+      // recieved packet to the host.
+      kiss_indicate_stat_rssi();
+      kiss_indicate_stat_snr();
+
+      // And then write the entire packet
+      kiss_write_packet();
+
+    #else
+      read_len = 0;
+      getPacketData(packet_size);
+      packet_ready = true;
     #endif
   }
-
-  #if MCU_VARIANT == MCU_ESP32
-    portEXIT_CRITICAL_ISR(&isr_lock);
-  #endif
 }
 
 
@@ -628,9 +594,22 @@ void serialCallback(uint8_t sbyte) {
   }
 }
 
+#if MCU_VARIANT == MCU_ESP32
+  portMUX_TYPE update_lock = portMUX_INITIALIZER_UNLOCKED;
+#endif
+
 void updateModemStatus() {
+  #if MCU_VARIANT == MCU_ESP32
+    portENTER_CRITICAL(&update_lock);
+  #endif
+
   uint8_t status = LoRa.modemStatus();
   last_status_update = millis();
+
+  #if MCU_VARIANT == MCU_ESP32
+    portEXIT_CRITICAL(&update_lock);
+  #endif
+
   if (status & SIG_DETECT == SIG_DETECT) { stat_signal_detected = true; } else { stat_signal_detected = false; }
   if (status & SIG_SYNCED == SIG_SYNCED) { stat_signal_synced = true; } else { stat_signal_synced = false; }
   if (status & RX_ONGOING == RX_ONGOING) { stat_rx_ongoing = true; } else { stat_rx_ongoing = false; }
@@ -801,14 +780,6 @@ void buffer_serial() {
       #endif
     }
 
-    #if MCU_VARIANT == MCU_ESP32
-      // Discard GPS data for now
-      c = 0;
-      while (c < MAX_CYCLES && Serial1.available()) {
-        Serial1.read();
-      }
-    #endif
-
     serial_buffering = false;
   }
 }