bool packet_ready = false;
-volatile bool process_packet = false;
-volatile uint8_t packet_interface = 0;
-
uint8_t *packet_queue[INTERFACE_COUNT];
void setup() {
packet_queue[i] = (uint8_t*)malloc(getQueueSize(i)+1);
}
+ memset(packet_rdy_interfaces_buf, 0, sizeof(packet_rdy_interfaces_buf));
+
+ fifo_init(&packet_rdy_interfaces, packet_rdy_interfaces_buf, MAX_INTERFACES);
+
// Create and configure interface objects
for (uint8_t i = 0; i < INTERFACE_COUNT; i++) {
switch (interfaces[i]) {
}
}
-void ISR_VECT receive_callback(uint8_t index, int packet_size) {
+void receive_callback(uint8_t index, int packet_size) {
if (!promisc) {
selected_radio = interface_obj[index];
getPacketData(selected_radio, packet_size);
packet_ready = true;
}
+
+ if (packet_ready) {
+ #if MCU_VARIANT == MCU_ESP32
+ portENTER_CRITICAL(&update_lock);
+ #elif MCU_VARIANT == MCU_NRF52
+ portENTER_CRITICAL();
+ #endif
+ last_rssi = selected_radio->packetRssi();
+ last_snr_raw = selected_radio->packetSnrRaw();
+ #if MCU_VARIANT == MCU_ESP32
+ portEXIT_CRITICAL(&update_lock);
+ #elif MCU_VARIANT == MCU_NRF52
+ portEXIT_CRITICAL();
+ #endif
+ kiss_indicate_stat_rssi();
+ kiss_indicate_stat_snr();
+ kiss_write_packet(index);
+ }
last_rx = millis();
}
// If at least one radio is online then we can continue
if (ready) {
- if (packet_ready) {
- selected_radio = interface_obj[packet_interface];
- #if MCU_VARIANT == MCU_ESP32
- portENTER_CRITICAL(&update_lock);
- #elif MCU_VARIANT == MCU_NRF52
- portENTER_CRITICAL();
- #endif
- last_rssi = selected_radio->packetRssi();
- last_snr_raw = selected_radio->packetSnrRaw();
- #if MCU_VARIANT == MCU_ESP32
- portEXIT_CRITICAL(&update_lock);
- #elif MCU_VARIANT == MCU_NRF52
- portEXIT_CRITICAL();
- #endif
- kiss_indicate_stat_rssi();
- kiss_indicate_stat_snr();
- kiss_write_packet(packet_interface);
- }
-
for (int i = 0; i < INTERFACE_COUNT; i++) {
selected_radio = interface_obj_sorted[i];
}
void packet_poll() {
- #if MCU_VARIANT == MCU_ESP32
- portENTER_CRITICAL(&update_lock);
- #elif MCU_VARIANT == MCU_NRF52
- portENTER_CRITICAL();
- #endif
// If we have received a packet on an interface which needs to be processed
- if (process_packet) {
- selected_radio = interface_obj[packet_interface];
+ while (!fifo_isempty(&packet_rdy_interfaces)) {
+ uint8_t packet_int = fifo_pop(&packet_rdy_interfaces);
+ selected_radio = interface_obj[packet_int];
selected_radio->clearIRQStatus();
selected_radio->handleDio0Rise();
- process_packet = false;
}
- #if MCU_VARIANT == MCU_ESP32
- portEXIT_CRITICAL(&update_lock);
- #elif MCU_VARIANT == MCU_NRF52
- portEXIT_CRITICAL();
- #endif
}
volatile bool serial_polling = false;
#define FREQ_DIV_6X (double)pow(2.0, 25.0)
#define FREQ_STEP_6X (double)(XTAL_FREQ_6X / FREQ_DIV_6X)
-extern bool process_packet;
-extern uint8_t packet_interface;
+extern FIFOBuffer packet_rdy_interfaces;
extern RadioInterface* interface_obj[];
// ISRs cannot provide parameters to the functions they call. Since we have
void ISR_VECT onDio0Rise() {
for (int i = 0; i < INTERFACE_COUNT; i++) {
if (digitalRead(interface_pins[i][5]) == HIGH) {
- process_packet = true;
- packet_interface = i;
- break;
+ fifo_push(&packet_rdy_interfaces, i);
}
}
}