|
|
@ -41,6 +41,15 @@ volatile bool serial_buffering = false; |
|
|
|
#include "Console.h" |
|
|
|
#include "Console.h" |
|
|
|
#endif |
|
|
|
#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]; |
|
|
|
char sbuf[128]; |
|
|
|
|
|
|
|
|
|
|
|
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 |
|
|
|
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 |
|
|
@ -133,6 +142,10 @@ void setup() { |
|
|
|
memset(packet_lengths_buf, 0, sizeof(packet_starts_buf)); |
|
|
|
memset(packet_lengths_buf, 0, sizeof(packet_starts_buf)); |
|
|
|
fifo16_init(&packet_lengths, packet_lengths_buf, CONFIG_QUEUE_MAX_LENGTH); |
|
|
|
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
|
|
|
|
// Set chip select, reset and interrupt
|
|
|
|
// pins for the LoRa module
|
|
|
|
// pins for the LoRa module
|
|
|
|
#if MODEM == SX1276 || MODEM == SX1278 |
|
|
|
#if MODEM == SX1276 || MODEM == SX1278 |
|
|
@ -335,8 +348,22 @@ void ISR_VECT receive_callback(int packet_size) { |
|
|
|
|
|
|
|
|
|
|
|
// And then write the entire packet
|
|
|
|
// And then write the entire packet
|
|
|
|
kiss_write_packet(); |
|
|
|
kiss_write_packet(); |
|
|
|
|
|
|
|
|
|
|
|
#else |
|
|
|
#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 |
|
|
|
#endif |
|
|
|
}
|
|
|
|
}
|
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -1259,7 +1286,13 @@ void validate_status() { |
|
|
|
void loop() { |
|
|
|
void loop() { |
|
|
|
if (radio_online) { |
|
|
|
if (radio_online) { |
|
|
|
#if MCU_VARIANT == MCU_ESP32 |
|
|
|
#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); |
|
|
|
portENTER_CRITICAL(&update_lock); |
|
|
|
last_rssi = LoRa->packetRssi(); |
|
|
|
last_rssi = LoRa->packetRssi(); |
|
|
|
last_snr_raw = LoRa->packetSnrRaw(); |
|
|
|
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; |
|
|
|
if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true; |
|
|
|
|
|
|
|
|
|
|
|
#elif MCU_VARIANT == MCU_NRF52 |
|
|
|
#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(); |
|
|
|
portENTER_CRITICAL(); |
|
|
|
last_rssi = LoRa->packetRssi(); |
|
|
|
last_rssi = LoRa->packetRssi(); |
|
|
|
last_snr_raw = LoRa->packetSnrRaw(); |
|
|
|
last_snr_raw = LoRa->packetSnrRaw(); |
|
|
@ -1287,6 +1326,7 @@ void loop() { |
|
|
|
airtime_lock = false; |
|
|
|
airtime_lock = false; |
|
|
|
if (st_airtime_limit != 0.0 && airtime >= st_airtime_limit) airtime_lock = true; |
|
|
|
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; |
|
|
|
if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true; |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
checkModemStatus(); |
|
|
|
checkModemStatus(); |
|
|
@ -1371,6 +1411,8 @@ void loop() { |
|
|
|
#if HAS_INPUT |
|
|
|
#if HAS_INPUT |
|
|
|
input_read(); |
|
|
|
input_read(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (memory_low) { kiss_indicate_error(ERROR_MEMORY_LOW); memory_low = false; } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void sleep_now() { |
|
|
|
void sleep_now() { |
|
|
|