From 2e7683b5e227d3c51da4b8476459ea1956f8e359 Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Thu, 4 Jul 2019 17:27:44 +0200 Subject: [PATCH] sx127x_netdev: remove switch-case from ISR handler Some LoRa modules don't provide all ISR lines. Thus, there are cases where different interrupts appear simultaneously in the ISR flags. It's required to use an AND/OR pattern to check which interrupts were triggered. --- drivers/sx127x/sx127x_netdev.c | 35 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/drivers/sx127x/sx127x_netdev.c b/drivers/sx127x/sx127x_netdev.c index ae67cc4f77..36c462415c 100644 --- a/drivers/sx127x/sx127x_netdev.c +++ b/drivers/sx127x/sx127x_netdev.c @@ -223,32 +223,27 @@ static int _init(netdev_t *netdev) static void _isr(netdev_t *netdev) { - sx127x_t *dev = (sx127x_t *) netdev; + sx127x_t *dev = (sx127x_t *)netdev; uint8_t interruptReg = sx127x_reg_read(dev, SX127X_REG_LR_IRQFLAGS); - switch (interruptReg) { - case SX127X_RF_LORA_IRQFLAGS_TXDONE: - case SX127X_RF_LORA_IRQFLAGS_RXDONE: - _on_dio0_irq(dev); - break; + if (interruptReg & (SX127X_RF_LORA_IRQFLAGS_TXDONE | + SX127X_RF_LORA_IRQFLAGS_RXDONE)) { + _on_dio0_irq(dev); + } - case SX127X_RF_LORA_IRQFLAGS_RXTIMEOUT: - _on_dio1_irq(dev); - break; + if (interruptReg & SX127X_RF_LORA_IRQFLAGS_RXTIMEOUT) { + _on_dio1_irq(dev); + } - case SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL: - _on_dio2_irq(dev); - break; + if (interruptReg & SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL) { + _on_dio2_irq(dev); + } - case SX127X_RF_LORA_IRQFLAGS_CADDETECTED: - case SX127X_RF_LORA_IRQFLAGS_CADDONE: - case SX127X_RF_LORA_IRQFLAGS_VALIDHEADER: - _on_dio3_irq(dev); - break; - - default: - break; + if (interruptReg & (SX127X_RF_LORA_IRQFLAGS_CADDETECTED | + SX127X_RF_LORA_IRQFLAGS_CADDONE | + SX127X_RF_LORA_IRQFLAGS_VALIDHEADER)) { + _on_dio3_irq(dev); } }