From 1afc9fd2a97f38365f657f57b1d69ef7afddd323 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 14 Jan 2022 21:12:33 +0100 Subject: [PATCH] Improved ESP32 compatibility --- Config.h | 2 +- RNode_Firmware.ino | 249 ++++++++++++++++++++------------------------- 2 files changed, 111 insertions(+), 140 deletions(-) diff --git a/Config.h b/Config.h index c09d961..c58f42b 100644 --- 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 diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino index 5fa3802..8bebf9e 100644 --- a/RNode_Firmware.ino +++ b/RNode_Firmware.ino @@ -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 MCU_VARIANT == MCU_ESP32 - if (!handling_packet) { - handling_packet = true; - #endif + 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 (!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 - - getPacketData(packet_size); - - } else if (!isSplitPacket(header)) { - // This is not a split packet, so we - // just read it and set the ready - // flag to 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 MCU_VARIANT != MCU_ESP32 - last_rssi = LoRa.packetRssi(); - last_snr_raw = LoRa.packetSnrRaw(); - #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(); - 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); + + } 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 + + getPacketData(packet_size); + + } else if (!isSplitPacket(header)) { + // This is not a split packet, so we + // just read it and set the ready + // flag to 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 MCU_VARIANT != MCU_ESP32 + last_rssi = LoRa.packetRssi(); + last_snr_raw = LoRa.packetSnrRaw(); + #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; } }