From 235f912eb2d961661385dbaefccac1ae2cbe321f Mon Sep 17 00:00:00 2001
From: Davide Mor <davide.mor@skywarder.eu>
Date: Fri, 2 Jun 2023 21:23:19 +0200
Subject: [PATCH] [sx1278] Implemented interrupt mode switching to reduce
 number of interrupts

---
 src/entrypoints/sx1278-serial.cpp             | 37 +++++--------------
 src/shared/radio/SX1278/SX1278Common.cpp      | 25 ++++++++++---
 src/shared/radio/SX1278/SX1278Common.h        | 33 ++++++++++++-----
 src/shared/radio/SX1278/SX1278Fsk.cpp         | 12 +++---
 src/shared/radio/SX1278/SX1278Fsk.h           |  6 ++-
 src/shared/radio/SX1278/SX1278Lora.cpp        | 11 ++++--
 src/shared/radio/SX1278/SX1278Lora.h          |  6 ++-
 .../radio/sx1278/fsk/test-sx1278-bidir.cpp    |  6 +--
 .../radio/sx1278/fsk/test-sx1278-mavlink.cpp  | 14 +------
 .../radio/sx1278/lora/test-sx1278-bidir.cpp   | 17 ++-------
 .../radio/sx1278/lora/test-sx1278-mavlink.cpp | 17 ++-------
 .../radio/sx1278/lora/test-sx1278-simple.cpp  | 17 ++-------
 src/tests/radio/sx1278/sx1278-init.h          | 28 +++-----------
 13 files changed, 95 insertions(+), 134 deletions(-)

diff --git a/src/entrypoints/sx1278-serial.cpp b/src/entrypoints/sx1278-serial.cpp
index db464cd40..8b44a472a 100644
--- a/src/entrypoints/sx1278-serial.cpp
+++ b/src/entrypoints/sx1278-serial.cpp
@@ -62,7 +62,7 @@ using rxen = Gpio<GPIOD_BASE, 4>;
 #define SX1278_SPI SPI4
 
 #define SX1278_IRQ_DIO0 EXTI6_IRQHandlerImpl
-#define SX1278_IRQ_DIO1 EXTI2_IRQHandlerImpl
+#define SX1278_IRQ_DIO1 EXTI4_IRQHandlerImpl
 #define SX1278_IRQ_DIO3 EXTI11_IRQHandlerImpl
 
 #elif defined _BOARD_STM32F429ZI_SKYWARD_RIG
@@ -79,8 +79,8 @@ using sck  = radio::sck;
 using miso = radio::miso;
 using mosi = radio::mosi;
 
-using txen = radio::txEn;
-using rxen = radio::rxEn;
+using txen                         = radio::txEn;
+using rxen                         = radio::rxEn;
 
 #define SX1278_SPI SPI4
 
@@ -132,24 +132,6 @@ void initBoard()
     rxen::low();
     txen::low();
 #endif
-
-#ifdef SX1278_IRQ_DIO0
-    GpioPin dio0_pin = dio0::getPin();
-    enableExternalInterrupt(dio0_pin.getPort(), dio0_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-#endif
-
-#ifdef SX1278_IRQ_DIO1
-    GpioPin dio1_pin = dio1::getPin();
-    enableExternalInterrupt(dio1_pin.getPort(), dio1_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-#endif
-
-#ifdef SX1278_IRQ_DIO3
-    GpioPin dio3_pin = dio3::getPin();
-    enableExternalInterrupt(dio3_pin.getPort(), dio3_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-#endif
 }
 
 void recvLoop()
@@ -185,7 +167,6 @@ int main()
     initBoard();
 
     SPIBus bus(SX1278_SPI);
-    GpioPin cs = cs::getPin();
 
 #if defined SX1278_IS_EBYTE
     printf("[sx1278] Confuring Ebyte frontend...\n");
@@ -204,8 +185,9 @@ int main()
     SX1278Lora::Config config;
     SX1278Lora::Error err;
 
-    sx1278 =
-        new SX1278Lora(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new SX1278Lora(bus, cs::getPin(), dio0::getPin(), dio1::getPin(),
+                            dio3::getPin(), SPI::ClockDivider::DIV_64,
+                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278 lora...\n");
     if ((err = sx1278->init(config)) != SX1278Lora::Error::NONE)
@@ -220,13 +202,14 @@ int main()
     SX1278Fsk::Config config;
     SX1278Fsk::Error err;
 
-    sx1278 =
-        new SX1278Fsk(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new SX1278Fsk(bus, cs::getPin(), dio0::getPin(), dio1::getPin(),
+                                            dio3::getPin(), SPI::ClockDivider::DIV_64,
+                                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278 fsk...\n");
     if ((err = sx1278->init(config)) != SX1278Fsk::Error::NONE)
     {
-                         // FIXME: Why does clang-format put this line up here?
+        // FIXME: Why does clang-format put this line up here?
         printf("[sx1278] sx1278->init error\n");
         return -1;
     }
diff --git a/src/shared/radio/SX1278/SX1278Common.cpp b/src/shared/radio/SX1278/SX1278Common.cpp
index 91d3b0b91..a815363c7 100644
--- a/src/shared/radio/SX1278/SX1278Common.cpp
+++ b/src/shared/radio/SX1278/SX1278Common.cpp
@@ -45,11 +45,18 @@ void SX1278Common::handleDioIRQ()
     }
 }
 
+void SX1278Common::enableIrqs() {
+    enableExternalInterrupt(dio0.getPort(), dio0.getNumber(), InterruptTrigger::RISING_EDGE);
+    enableExternalInterrupt(dio1.getPort(), dio1.getNumber(), InterruptTrigger::RISING_EDGE);
+    enableExternalInterrupt(dio3.getPort(), dio3.getNumber(), InterruptTrigger::RISING_EDGE);
+}
+
 void SX1278Common::setDefaultMode(Mode mode, DioMapping mapping,
+                                  InterruptTrigger dio1_trigger,
                                   bool tx_frontend, bool rx_frontend)
 {
     mutex.lock();
-    enterMode(mode, mapping, tx_frontend, rx_frontend);
+    enterMode(mode, mapping, dio1_trigger, tx_frontend, rx_frontend);
     mutex.unlock();
 }
 
@@ -163,13 +170,14 @@ ISX1278Frontend &SX1278Common::getFrontend() { return *frontend; }
 SPISlave &SX1278Common::getSpiSlave() { return slave; }
 
 SX1278Common::DeviceState SX1278Common::lockMode(Mode mode, DioMapping mapping,
+                                                 InterruptTrigger dio1_trigger,
                                                  bool tx_frontend,
                                                  bool rx_frontend)
 {
     // Store previous state
     DeviceState old_state = state;
 
-    enterMode(mode, mapping, tx_frontend, rx_frontend);
+    enterMode(mode, mapping, dio1_trigger, tx_frontend, rx_frontend);
     state.irq_wait_thread = nullptr;
 
     return old_state;
@@ -179,8 +187,8 @@ void SX1278Common::unlockMode(DeviceState old_state)
 {
     // Do this copy manually, we want stuff to be copied in a specific order
     state.irq_wait_thread = old_state.irq_wait_thread;
-    enterMode(old_state.mode, old_state.mapping, old_state.is_tx_frontend_on,
-              old_state.is_rx_frontend_on);
+    enterMode(old_state.mode, old_state.mapping, old_state.dio1_trigger,
+              old_state.is_tx_frontend_on, old_state.is_rx_frontend_on);
 }
 
 void SX1278Common::lock() { mutex.lock(); }
@@ -188,6 +196,7 @@ void SX1278Common::lock() { mutex.lock(); }
 void SX1278Common::unlock() { mutex.unlock(); }
 
 void SX1278Common::enterMode(Mode mode, DioMapping mapping,
+                             InterruptTrigger dio1_trigger,
                              bool set_tx_frontend_on, bool set_rx_frontend_on)
 {
     // disable - enable in order to avoid having both RX/TX frontends active at
@@ -218,13 +227,19 @@ void SX1278Common::enterMode(Mode mode, DioMapping mapping,
     state.is_tx_frontend_on = set_tx_frontend_on;
     state.is_rx_frontend_on = set_rx_frontend_on;
 
-    // Check if necessary
     if (mode != state.mode)
     {
         setMode(mode);
         state.mode = mode;
     }
 
+    // Change DIO1 interrupt kind
+    if (dio1_trigger != state.dio1_trigger)
+    {
+        enableExternalInterrupt(dio1.getPort(), dio1.getNumber(), dio1_trigger);
+        state.dio1_trigger = dio1_trigger;
+    }
+
     // Finally setup DIO mapping
     if (mapping != state.mapping)
     {
diff --git a/src/shared/radio/SX1278/SX1278Common.h b/src/shared/radio/SX1278/SX1278Common.h
index 744f3f7cd..2ac8cc607 100644
--- a/src/shared/radio/SX1278/SX1278Common.h
+++ b/src/shared/radio/SX1278/SX1278Common.h
@@ -22,6 +22,7 @@
 
 #pragma once
 
+#include <drivers/interrupt/external_interrupts.h>
 #include <drivers/spi/SPIDriver.h>
 #include <miosix.h>
 #include <radio/Transceiver.h>
@@ -114,6 +115,8 @@ private:
         bool is_rx_frontend_on = false;
         // True if the TX frontend is enabled
         bool is_tx_frontend_on = false;
+        // Mode of trigger for dio1
+        InterruptTrigger dio1_trigger = InterruptTrigger::RISING_EDGE;
     };
 
 public:
@@ -123,12 +126,14 @@ public:
     void handleDioIRQ();
 
 protected:
-    explicit SX1278Common(SPIBus &bus, miosix::GpioPin cs,
+    explicit SX1278Common(SPIBus &bus, miosix::GpioPin cs, miosix::GpioPin dio0,
+                          miosix::GpioPin dio1, miosix::GpioPin dio3,
                           SPI::ClockDivider clock_divider,
                           std::unique_ptr<ISX1278Frontend> frontend)
-        : slave(SPISlave(bus, cs, getSpiBusConfig(clock_divider))),
-          frontend(std::move(frontend))
+        : slave(SPISlave(bus, cs, getSpiBusConfig(clock_divider))), dio0(dio0),
+          dio1(dio1), dio3(dio3), frontend(std::move(frontend))
     {
+        enableIrqs();
     }
 
     /**
@@ -152,13 +157,14 @@ protected:
     {
     public:
         LockMode(SX1278Common &driver, Lock &lock, Mode mode,
-                 DioMapping mapping, bool set_tx_frontend_on = false,
+                 DioMapping mapping, InterruptTrigger dio1_trigger,
+                 bool set_tx_frontend_on = false,
                  bool set_rx_frontend_on = false)
             : driver(driver), lock(lock)
         {
             // cppcheck-suppress useInitializationList
-            old_state = driver.lockMode(mode, mapping, set_tx_frontend_on,
-                                        set_rx_frontend_on);
+            old_state = driver.lockMode(mode, mapping, dio1_trigger,
+                                        set_tx_frontend_on, set_rx_frontend_on);
         }
 
         ~LockMode() { driver.unlockMode(old_state); }
@@ -174,7 +180,8 @@ protected:
      *
      * WARNING: This will lock the mutex.
      */
-    void setDefaultMode(Mode mode, DioMapping mapping, bool set_tx_frontend_on,
+    void setDefaultMode(Mode mode, DioMapping mapping,
+                        InterruptTrigger dio1_trigger, bool set_tx_frontend_on,
                         bool set_rx_frontend_on);
 
     /**
@@ -209,21 +216,27 @@ protected:
     SPISlave &getSpiSlave();
 
 private:
+    void enableIrqs();
+
     void waitForIrqInner(LockMode &guard, bool unlock);
 
-    DeviceState lockMode(Mode mode, DioMapping mapping, bool set_tx_frontend_on,
+    DeviceState lockMode(Mode mode, DioMapping mapping,
+                         InterruptTrigger dio1_trigger, bool set_tx_frontend_on,
                          bool set_rx_frontend_on);
     void unlockMode(DeviceState old_state);
 
     void lock();
     void unlock();
 
-    void enterMode(Mode mode, DioMapping mapping, bool set_tx_frontend_on,
-                   bool set_rx_frontend_on);
+    void enterMode(Mode mode, DioMapping mapping, InterruptTrigger dio1_trigger,
+                   bool set_tx_frontend_on, bool set_rx_frontend_on);
 
     miosix::FastMutex mutex;
     DeviceState state;
     SPISlave slave;
+    miosix::GpioPin dio0;
+    miosix::GpioPin dio1;
+    miosix::GpioPin dio3;
     std::unique_ptr<ISX1278Frontend> frontend;
 };
 
diff --git a/src/shared/radio/SX1278/SX1278Fsk.cpp b/src/shared/radio/SX1278/SX1278Fsk.cpp
index d7cd936d7..58dcca41b 100644
--- a/src/shared/radio/SX1278/SX1278Fsk.cpp
+++ b/src/shared/radio/SX1278/SX1278Fsk.cpp
@@ -74,12 +74,14 @@ SX1278Fsk::Error SX1278Fsk::configure(const Config &config)
 
     // Set default mode to standby, that way we reset the fifo every time we
     // enter receive
-    setDefaultMode(RegOpMode::MODE_STDBY, DEFAULT_MAPPING, false, false);
+    setDefaultMode(RegOpMode::MODE_STDBY, DEFAULT_MAPPING,
+                   InterruptTrigger::RISING_EDGE, false, false);
     miosix::Thread::sleep(1);
 
     // Lock the bus
     Lock guard(*this);
-    LockMode guard_mode(*this, guard, RegOpMode::MODE_STDBY, DEFAULT_MAPPING);
+    LockMode guard_mode(*this, guard, RegOpMode::MODE_STDBY, DEFAULT_MAPPING,
+                        InterruptTrigger::RISING_EDGE);
 
     // The datasheet lies, this IRQ is unreliable, it doesn't always trigger
     // if (!waitForIrqBusy(guard_mode, RegIrqFlags::MODE_READY, 0, 1000))
@@ -230,7 +232,7 @@ ssize_t SX1278Fsk::receive(uint8_t *pkt, size_t max_len)
 {
     Lock guard(*this);
     LockMode guard_mode(*this, guard, RegOpMode::MODE_RX, DEFAULT_MAPPING,
-                        false, true);
+                        InterruptTrigger::RISING_EDGE, false, true);
 
     // Save the packet locally, we always want to read it all
     uint8_t tmp_pkt[MTU];
@@ -311,8 +313,8 @@ bool SX1278Fsk::send(uint8_t *pkt, size_t len)
     rateLimitTx();
 
     Lock guard(*this);
-    LockMode guard_mode(*this, guard, RegOpMode::MODE_TX, DEFAULT_MAPPING, true,
-                        false);
+    LockMode guard_mode(*this, guard, RegOpMode::MODE_TX, DEFAULT_MAPPING,
+                        InterruptTrigger::FALLING_EDGE, true, false);
 
     waitForIrq(guard_mode, RegIrqFlags::TX_READY, 0);
 
diff --git a/src/shared/radio/SX1278/SX1278Fsk.h b/src/shared/radio/SX1278/SX1278Fsk.h
index 994de6ddb..b67f6c202 100644
--- a/src/shared/radio/SX1278/SX1278Fsk.h
+++ b/src/shared/radio/SX1278/SX1278Fsk.h
@@ -135,10 +135,12 @@ public:
     /**
      * @brief Construct a new SX1278
      */
-    explicit SX1278Fsk(SPIBus &bus, miosix::GpioPin cs,
+    explicit SX1278Fsk(SPIBus &bus, miosix::GpioPin cs, miosix::GpioPin dio0,
+                       miosix::GpioPin dio1, miosix::GpioPin dio3,
                        SPI::ClockDivider clock_divider,
                        std::unique_ptr<SX1278::ISX1278Frontend> frontend)
-        : SX1278Common(bus, cs, clock_divider, std::move(frontend)),
+        : SX1278Common(bus, cs, dio0, dio1, dio3, clock_divider,
+                       std::move(frontend)),
           crc_enabled(false)
     {
     }
diff --git a/src/shared/radio/SX1278/SX1278Lora.cpp b/src/shared/radio/SX1278/SX1278Lora.cpp
index 744f8d067..de7c3ecfd 100644
--- a/src/shared/radio/SX1278/SX1278Lora.cpp
+++ b/src/shared/radio/SX1278/SX1278Lora.cpp
@@ -163,11 +163,12 @@ SX1278Lora::Error SX1278Lora::configure(const Config &config)
     enterLoraMode();
 
     // Then make sure the device remains in standby and not in sleep
-    setDefaultMode(RegOpMode::MODE_STDBY, DEFAULT_MAPPING, false, false);
+    setDefaultMode(RegOpMode::MODE_STDBY, DEFAULT_MAPPING, InterruptTrigger::RISING_EDGE, false, false);
 
     // Lock the bus
     Lock guard(*this);
-    LockMode mode_guard(*this, guard, RegOpMode::MODE_STDBY, DEFAULT_MAPPING);
+    LockMode mode_guard(*this, guard, RegOpMode::MODE_STDBY, DEFAULT_MAPPING,
+                        InterruptTrigger::RISING_EDGE);
 
     RegModemConfig1::Bw bw = static_cast<RegModemConfig1::Bw>(config.bandwidth);
     RegModemConfig1::Cr cr =
@@ -282,7 +283,8 @@ ssize_t SX1278Lora::receive(uint8_t *pkt, size_t max_len)
     // Use continuous because it doesn't go into timeout (and you cannot
     // disable it...)
     LockMode mode_guard(*this, guard, RegOpMode::MODE_RXCONTINUOUS,
-                        DioMapping(0, 0, 0, 0, 0, 0), false, true);
+                        DioMapping(0, 0, 0, 0, 0, 0),
+                        InterruptTrigger::RISING_EDGE, false, true);
 
     waitForIrq(mode_guard, RegIrqFlags::RX_DONE, 0, true);
 
@@ -317,7 +319,8 @@ bool SX1278Lora::send(uint8_t *pkt, size_t len)
     {
         // Now enter in mode TX to send the packet
         LockMode mode_guard(*this, guard, RegOpMode::MODE_TX,
-                            DioMapping(1, 0, 0, 0, 0, 0), true, false);
+                            DioMapping(1, 0, 0, 0, 0, 0),
+                            InterruptTrigger::RISING_EDGE, true, false);
 
         // Wait for the transmission to end
         waitForIrq(mode_guard, RegIrqFlags::TX_DONE, 0);
diff --git a/src/shared/radio/SX1278/SX1278Lora.h b/src/shared/radio/SX1278/SX1278Lora.h
index da4a1905b..c30bdf41f 100644
--- a/src/shared/radio/SX1278/SX1278Lora.h
+++ b/src/shared/radio/SX1278/SX1278Lora.h
@@ -136,10 +136,12 @@ public:
     /**
      * @brief Construct a new SX1278
      */
-    explicit SX1278Lora(SPIBus &bus, miosix::GpioPin cs,
+    explicit SX1278Lora(SPIBus &bus, miosix::GpioPin cs, miosix::GpioPin dio0,
+                        miosix::GpioPin dio1, miosix::GpioPin dio3,
                         SPI::ClockDivider clock_divider,
                         std::unique_ptr<SX1278::ISX1278Frontend> frontend)
-        : SX1278Common(bus, cs, clock_divider, std::move(frontend)),
+        : SX1278Common(bus, cs, dio0, dio1, dio3, clock_divider,
+                       std::move(frontend)),
           crc_enabled(false)
     {
     }
diff --git a/src/tests/radio/sx1278/fsk/test-sx1278-bidir.cpp b/src/tests/radio/sx1278/fsk/test-sx1278-bidir.cpp
index 4c2508ea2..e6f69d0be 100644
--- a/src/tests/radio/sx1278/fsk/test-sx1278-bidir.cpp
+++ b/src/tests/radio/sx1278/fsk/test-sx1278-bidir.cpp
@@ -139,12 +139,12 @@ int main()
     SX1278Fsk::Error err;
 
     SPIBus bus(SX1278_SPI);
-    GpioPin cs = cs::getPin();
 
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend());
 
-    sx1278 =
-        new SX1278Fsk(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new SX1278Fsk(bus, cs::getPin(), dio0::getPin(), dio1::getPin(),
+                           dio3::getPin(), SPI::ClockDivider::DIV_64,
+                           std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278...\n");
     if ((err = sx1278->init(config)) != SX1278Fsk::Error::NONE)
diff --git a/src/tests/radio/sx1278/fsk/test-sx1278-mavlink.cpp b/src/tests/radio/sx1278/fsk/test-sx1278-mavlink.cpp
index 0d430f695..caffecc2e 100644
--- a/src/tests/radio/sx1278/fsk/test-sx1278-mavlink.cpp
+++ b/src/tests/radio/sx1278/fsk/test-sx1278-mavlink.cpp
@@ -96,16 +96,7 @@ void __attribute__((used)) SX1278_IRQ_DIO3()
 
 void initBoard()
 {
-    GpioPin dio0_pin = dio0::getPin();
-    GpioPin dio1_pin = dio1::getPin();
-    GpioPin dio3_pin = dio3::getPin();
-
-    enableExternalInterrupt(dio0_pin.getPort(), dio0_pin.getNumber(),
-                            InterruptTrigger::RISING_FALLING_EDGE);
-    enableExternalInterrupt(dio1_pin.getPort(), dio1_pin.getNumber(),
-                            InterruptTrigger::RISING_FALLING_EDGE);
-    enableExternalInterrupt(dio3_pin.getPort(), dio3_pin.getNumber(),
-                            InterruptTrigger::RISING_FALLING_EDGE);
+
 }
 
 Mav* channel;
@@ -160,12 +151,11 @@ int main()
     SX1278Fsk::Error err;
 
     SPIBus bus(SX1278_SPI);
-    GpioPin cs = cs::getPin();
 
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend());
 
     sx1278 =
-        new SX1278Fsk(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+        new SX1278Fsk(bus, cs::getPin(), dio0::getPin(), dio1::getPin(), dio3::getPin(), SPI::ClockDivider::DIV_64, std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278...\n");
     if ((err = sx1278->init(config)) != SX1278Fsk::Error::NONE)
diff --git a/src/tests/radio/sx1278/lora/test-sx1278-bidir.cpp b/src/tests/radio/sx1278/lora/test-sx1278-bidir.cpp
index 0185e0167..c89191e55 100644
--- a/src/tests/radio/sx1278/lora/test-sx1278-bidir.cpp
+++ b/src/tests/radio/sx1278/lora/test-sx1278-bidir.cpp
@@ -89,17 +89,6 @@ void initBoard()
     rxen::low();
     txen::low();
 #endif
-
-    GpioPin dio0_pin = dio0::getPin();
-    GpioPin dio1_pin = dio1::getPin();
-    GpioPin dio3_pin = dio3::getPin();
-
-    enableExternalInterrupt(dio0_pin.getPort(), dio0_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-    enableExternalInterrupt(dio1_pin.getPort(), dio1_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-    enableExternalInterrupt(dio3_pin.getPort(), dio3_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
 }
 
 bool isByteBuf(uint8_t *buf, ssize_t len)
@@ -182,7 +171,6 @@ int main()
     SX1278Lora::Error err;
 
     SPIBus bus(SX1278_SPI);
-    GpioPin cs = cs::getPin();
 
 #ifdef IS_EBYTE
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(
@@ -191,8 +179,9 @@ int main()
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend());
 #endif
 
-    sx1278 =
-        new SX1278Lora(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new SX1278Lora(bus, cs::getPin(), dio0::getPin(), dio1::getPin(),
+                            dio3::getPin(), SPI::ClockDivider::DIV_64,
+                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278...\n");
     if ((err = sx1278->init(config)) != SX1278Lora::Error::NONE)
diff --git a/src/tests/radio/sx1278/lora/test-sx1278-mavlink.cpp b/src/tests/radio/sx1278/lora/test-sx1278-mavlink.cpp
index bac40989b..3b51df6cb 100644
--- a/src/tests/radio/sx1278/lora/test-sx1278-mavlink.cpp
+++ b/src/tests/radio/sx1278/lora/test-sx1278-mavlink.cpp
@@ -109,17 +109,6 @@ void initBoard()
     rxen::low();
     txen::low();
 #endif
-
-    GpioPin dio0_pin = dio0::getPin();
-    GpioPin dio1_pin = dio1::getPin();
-    GpioPin dio3_pin = dio3::getPin();
-
-    enableExternalInterrupt(dio0_pin.getPort(), dio0_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-    enableExternalInterrupt(dio1_pin.getPort(), dio1_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-    enableExternalInterrupt(dio3_pin.getPort(), dio3_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
 }
 
 Mav* channel;
@@ -193,7 +182,6 @@ int main()
     SX1278Lora::Error err;
 
     SPIBus bus(SX1278_SPI);
-    GpioPin cs = cs::getPin();
 
 #ifdef IS_EBYTE
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(
@@ -202,8 +190,9 @@ int main()
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend());
 #endif
 
-    sx1278 =
-        new SX1278Lora(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new SX1278Lora(bus, cs::getPin(), dio0::getPin(), dio1::getPin(),
+                            dio3::getPin(), SPI::ClockDivider::DIV_64,
+                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278...\n");
     if ((err = sx1278->init(config)) != SX1278Lora::Error::NONE)
diff --git a/src/tests/radio/sx1278/lora/test-sx1278-simple.cpp b/src/tests/radio/sx1278/lora/test-sx1278-simple.cpp
index 8bd407e8e..85a2a75ea 100644
--- a/src/tests/radio/sx1278/lora/test-sx1278-simple.cpp
+++ b/src/tests/radio/sx1278/lora/test-sx1278-simple.cpp
@@ -85,17 +85,6 @@ void initBoard()
     rxen::low();
     txen::low();
 #endif
-
-    GpioPin dio0_pin = dio0::getPin();
-    GpioPin dio1_pin = dio1::getPin();
-    GpioPin dio3_pin = dio3::getPin();
-
-    enableExternalInterrupt(dio0_pin.getPort(), dio0_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-    enableExternalInterrupt(dio1_pin.getPort(), dio1_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
-    enableExternalInterrupt(dio3_pin.getPort(), dio3_pin.getNumber(),
-                            InterruptTrigger::RISING_EDGE);
 }
 
 int main()
@@ -112,7 +101,6 @@ int main()
     SX1278Lora::Error err;
 
     SPIBus bus(SX1278_SPI);
-    GpioPin cs = cs::getPin();
 
 #ifdef IS_EBYTE
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(
@@ -121,8 +109,9 @@ int main()
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend());
 #endif
 
-    sx1278 =
-        new SX1278Lora(bus, cs, SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new SX1278Lora(bus, cs::getPin(), dio0::getPin(), dio1::getPin(),
+                            dio3::getPin(), SPI::ClockDivider::DIV_64,
+                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278...\n");
     if ((err = sx1278->init(config)) != SX1278Lora::Error::NONE)
diff --git a/src/tests/radio/sx1278/sx1278-init.h b/src/tests/radio/sx1278/sx1278-init.h
index 30cc3ae33..f5ff21857 100644
--- a/src/tests/radio/sx1278/sx1278-init.h
+++ b/src/tests/radio/sx1278/sx1278-init.h
@@ -128,24 +128,6 @@ void initBoard()
     rxen::low();
     txen::low();
 #endif
-
-#ifdef SX1278_IRQ_DIO0
-    miosix::GpioPin dio0_pin = dio0::getPin();
-    enableExternalInterrupt(dio0_pin.getPort(), dio0_pin.getNumber(),
-                            InterruptTrigger::RISING_FALLING_EDGE);
-#endif
-
-#ifdef SX1278_IRQ_DIO1
-    miosix::GpioPin dio1_pin = dio1::getPin();
-    enableExternalInterrupt(dio1_pin.getPort(), dio1_pin.getNumber(),
-                            InterruptTrigger::RISING_FALLING_EDGE);
-#endif
-
-#ifdef SX1278_IRQ_DIO3
-    miosix::GpioPin dio3_pin = dio3::getPin();
-    enableExternalInterrupt(dio3_pin.getPort(), dio3_pin.getNumber(),
-                            InterruptTrigger::RISING_FALLING_EDGE);
-#endif
 }
 
 Boardcore::SPIBus sx1278_bus(SX1278_SPI);
@@ -173,7 +155,8 @@ bool initRadio()
     Boardcore::SX1278Lora::Config config;
     Boardcore::SX1278Lora::Error err;
 
-    sx1278 = new Boardcore::SX1278Lora(sx1278_bus, cs::getPin(),
+    sx1278 = new Boardcore::SX1278Lora(sx1278_bus, cs::getPin(), dio0::getPin(),
+                                       dio1::getPin(), dio3::getPin(),
                                        Boardcore::SPI::ClockDivider::DIV_64,
                                        std::move(frontend));
 
@@ -190,9 +173,10 @@ bool initRadio()
     Boardcore::SX1278Fsk::Config config;
     Boardcore::SX1278Fsk::Error err;
 
-    sx1278 = new Boardcore::SX1278Fsk(sx1278_bus, cs::getPin(),
-                                      Boardcore::SPI::ClockDivider::DIV_64,
-                                      std::move(frontend));
+    sx1278 = new Boardcore::SX1278Fsk(sx1278_bus, cs::getPin(), dio0::getPin(),
+                                            dio1::getPin(), dio3::getPin(),
+                                            Boardcore::SPI::ClockDivider::DIV_64,
+                                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278 fsk...\n");
     if ((err = sx1278->init(config)) != Boardcore::SX1278Fsk::Error::NONE)
-- 
GitLab