diff --git a/src/boards/Groundstation/Rovie/Buses.h b/src/boards/Groundstation/Rovie/Buses.h index 34b13057ff99ffe2c0dfdd6cde1cd2e446e1d2e3..54d1ce0175a906953dc95ef8ec5f0dfaaf25f33d 100644 --- a/src/boards/Groundstation/Rovie/Buses.h +++ b/src/boards/Groundstation/Rovie/Buses.h @@ -23,23 +23,20 @@ #pragma once #include <drivers/spi/SPIBus.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> #include "interfaces-impl/hwmapping.h" namespace GroundstationRovie { -class Buses : public Boardcore::Module +class Buses : public Boardcore::Injectable { public: - Boardcore::SPIBus radio1_bus; - Boardcore::SPIBus ethernet_bus; + Boardcore::SPIBus radio1; + Boardcore::SPIBus ethernet; - Buses() : radio1_bus(MIOSIX_RADIO1_SPI), ethernet_bus(MIOSIX_ETHERNET_SPI) - { - } + Buses() : radio1(MIOSIX_RADIO1_SPI), ethernet(MIOSIX_ETHERNET_SPI) {} }; } // namespace GroundstationRovie \ No newline at end of file diff --git a/src/boards/Groundstation/Rovie/Hub.cpp b/src/boards/Groundstation/Rovie/Hub.cpp index 50fa886a2f63ea81cdeb84df3f4f43bd22ed369d..f91e023cdd12f7149e27d52a97423458530d183f 100644 --- a/src/boards/Groundstation/Rovie/Hub.cpp +++ b/src/boards/Groundstation/Rovie/Hub.cpp @@ -38,9 +38,6 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) void Hub::dispatchIncomingMsg(const mavlink_message_t& msg) { - Serial* serial = ModuleManager::getInstance().get<Serial>(); - serial->sendMsg(msg); - - Ethernet* ethernet = ModuleManager::getInstance().get<Ethernet>(); - ethernet->sendMsg(msg); + getModule<Serial>()->sendMsg(msg); + getModule<Ethernet>()->sendMsg(msg); } \ No newline at end of file diff --git a/src/boards/Groundstation/Rovie/Hub.h b/src/boards/Groundstation/Rovie/Hub.h index 18b7531326a9469c9cb7b37d2b8995ab93879e3f..b74a80901298591ed527c32651e270850b5558c0 100644 --- a/src/boards/Groundstation/Rovie/Hub.h +++ b/src/boards/Groundstation/Rovie/Hub.h @@ -23,9 +23,11 @@ #pragma once #include <Groundstation/Common/HubBase.h> +#include <Groundstation/Common/Ports/Serial.h> +#include <Groundstation/Rovie/Ports/Ethernet.h> +#include <Groundstation/Rovie/Radio/Radio.h> #include <common/Mavlink.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> namespace GroundstationRovie { @@ -33,7 +35,9 @@ namespace GroundstationRovie /** * @brief Central hub connecting all outgoing and ingoing modules. */ -class Hub : public Groundstation::HubBase +class Hub : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::HubBase>, Ethernet, + RadioRig, Groundstation::Serial> { public: Hub() {} diff --git a/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp b/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp index b242322bf5f41510caea0c0fc7c3438067bd547d..3be88ebe667cc86baeae81945b32fd1a451cb62b 100644 --- a/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp +++ b/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp @@ -30,18 +30,30 @@ using namespace GroundstationRovie; using namespace Boardcore; using namespace miosix; +Wiz5500* gWiz5500{nullptr}; + void __attribute__((used)) MIOSIX_ETHERNET_IRQ() { - ModuleManager::getInstance().get<Ethernet>()->handleINTn(); + Wiz5500* instance = gWiz5500; + if (instance) + { + instance->handleINTn(); + } +} + +void setIRQWiz5500(Wiz5500* instance) +{ + FastInterruptDisableLock dl; + gWiz5500 = instance; } bool Ethernet::start() { std::unique_ptr<Wiz5500> wiz5500 = std::make_unique<Wiz5500>( - ModuleManager::getInstance().get<Buses>()->ethernet_bus, - ethernet::cs::getPin(), ethernet::intr::getPin(), - SPI::ClockDivider::DIV_64); + getModule<Buses>()->ethernet, ethernet::cs::getPin(), + ethernet::intr::getPin(), SPI::ClockDivider::DIV_64); + setIRQWiz5500(wiz5500.get()); if (!EthernetBase::start(std::move(wiz5500))) { return false; diff --git a/src/boards/Groundstation/Rovie/Ports/Ethernet.h b/src/boards/Groundstation/Rovie/Ports/Ethernet.h index 1aa1acdb919d529cf8f3562348338bf9828994ef..7184483e7ed4ca09893d30aa65e3afe3e7cc73d9 100644 --- a/src/boards/Groundstation/Rovie/Ports/Ethernet.h +++ b/src/boards/Groundstation/Rovie/Ports/Ethernet.h @@ -23,13 +23,15 @@ #pragma once #include <Groundstation/Common/Ports/EthernetBase.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <Groundstation/Rovie/Buses.h> +#include <utils/DependencyManager/DependencyManager.h> namespace GroundstationRovie { -class Ethernet : public Groundstation::EthernetBase, public Boardcore::Module +class Ethernet + : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::EthernetBase>, Buses> { public: [[nodiscard]] bool start(); diff --git a/src/boards/Groundstation/Rovie/Radio/Radio.cpp b/src/boards/Groundstation/Rovie/Radio/Radio.cpp index dd129e6bd73ccd3f369085c1708c8e43cf052d26..4a3bc05945f74c3c296b52dd4ccd9518153cc02d 100644 --- a/src/boards/Groundstation/Rovie/Radio/Radio.cpp +++ b/src/boards/Groundstation/Rovie/Radio/Radio.cpp @@ -24,7 +24,6 @@ #include <Groundstation/Common/Ports/Serial.h> #include <Groundstation/Rovie/Buses.h> -#include <Groundstation/Rovie/Hub.h> #include <radio/SX1278/SX1278Frontends.h> using namespace Groundstation; @@ -32,28 +31,26 @@ using namespace GroundstationRovie; using namespace Boardcore; using namespace miosix; -void __attribute__((used)) MIOSIX_RADIO1_DIO0_IRQ() -{ - ModuleManager::getInstance().get<RadioRig>()->handleDioIRQ(); -} +SX1278Lora* gRadio{nullptr}; -void __attribute__((used)) MIOSIX_RADIO1_DIO1_IRQ() +void handleDioIRQ() { - ModuleManager::getInstance().get<RadioRig>()->handleDioIRQ(); + SX1278Lora* instance = gRadio; + if (instance) + { + instance->handleDioIRQ(); + } } -void __attribute__((used)) MIOSIX_RADIO1_DIO3_IRQ() +void setIRQRadio(SX1278Lora* radio) { - ModuleManager::getInstance().get<RadioRig>()->handleDioIRQ(); + FastInterruptDisableLock dl; + gRadio = radio; } -void RadioRig::handleDioIRQ() -{ - if (started) - { - sx1278->handleDioIRQ(); - } -} +void __attribute__((used)) MIOSIX_RADIO_DIO0_IRQ() { handleDioIRQ(); } +void __attribute__((used)) MIOSIX_RADIO_DIO1_IRQ() { handleDioIRQ(); } +void __attribute__((used)) MIOSIX_RADIO_DIO3_IRQ() { handleDioIRQ(); } bool RadioRig::start() { @@ -67,9 +64,12 @@ bool RadioRig::start() #endif sx1278 = std::make_unique<SX1278Lora>( - ModuleManager::getInstance().get<Buses>()->radio1_bus, - radio1::cs::getPin(), radio1::dio0::getPin(), radio1::dio1::getPin(), - radio1::dio3::getPin(), SPI::ClockDivider::DIV_64, std::move(frontend)); + getModule<Buses>()->radio1, radio1::cs::getPin(), + radio1::dio0::getPin(), radio1::dio1::getPin(), radio1::dio3::getPin(), + SPI::ClockDivider::DIV_64, std::move(frontend)); + + // Store the global radio instance + setIRQRadio(sx1278.get()); // Configure the radio if (sx1278->configure(Common::RIG_RADIO_CONFIG) != SX1278Lora::Error::NONE) @@ -77,14 +77,14 @@ bool RadioRig::start() return false; } - auto mav_handler = [this](RadioMavDriver* channel, - const mavlink_message_t& msg) { handleMsg(msg); }; + auto mavHandler = [this](RadioMavDriver* channel, + const mavlink_message_t& msg) { handleMsg(msg); }; - mav_driver = std::make_unique<RadioMavDriver>( - sx1278.get(), mav_handler, Groundstation::MAV_SLEEP_AFTER_SEND, + mavDriver = std::make_unique<RadioMavDriver>( + sx1278.get(), mavHandler, Groundstation::MAV_SLEEP_AFTER_SEND, Groundstation::MAV_OUT_BUFFER_MAX_AGE); - if (!mav_driver->start()) + if (!mavDriver->start()) { return false; } @@ -96,5 +96,5 @@ bool RadioRig::start() void RadioRig::handleMsg(const mavlink_message_t& msg) { // Dispatch the message through the hub. - ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg); + getModule<HubBase>()->dispatchIncomingMsg(msg); } \ No newline at end of file diff --git a/src/boards/Groundstation/Rovie/Radio/Radio.h b/src/boards/Groundstation/Rovie/Radio/Radio.h index 2e497210756c134a9d5a0a86852001258ce2259e..05dfb37514801b499f3169c8bea5f91d668c1c1e 100644 --- a/src/boards/Groundstation/Rovie/Radio/Radio.h +++ b/src/boards/Groundstation/Rovie/Radio/Radio.h @@ -22,7 +22,10 @@ #pragma once +#include <Groundstation/Common/HubBase.h> #include <Groundstation/Common/Radio/RadioBase.h> +#include <Groundstation/Rovie/Buses.h> +#include <utils/DependencyManager/DependencyManager.h> #include <atomic> @@ -34,18 +37,14 @@ using RadioMavDriver = Groundstation::MAV_OUT_QUEUE_SIZE, MAVLINK_MAX_DIALECT_PAYLOAD_SIZE>; -class RadioRig : public Boardcore::Module +class RadioRig + : public Boardcore::InjectableWithDeps<Groundstation::HubBase, Buses> { public: RadioRig() {} [[nodiscard]] bool start(); - /** - * @brief Handle generic DIO irq. - */ - void handleDioIRQ(); - private: /** * @brief Called internally when a message is received. @@ -57,7 +56,7 @@ private: // Objects are always destructed in reverse order, so keep them in this // order std::unique_ptr<Boardcore::SX1278Lora> sx1278; - std::unique_ptr<RadioMavDriver> mav_driver; + std::unique_ptr<RadioMavDriver> mavDriver; }; } // namespace GroundstationRovie \ No newline at end of file diff --git a/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp b/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp index 59dba2ff317a499e8ed3ca7ee09d12b3dd19f40d..be6064a41333a686e502d246a61b3233a82acf91 100644 --- a/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp +++ b/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp @@ -26,6 +26,7 @@ #include <Groundstation/Rovie/Ports/Ethernet.h> #include <Groundstation/Rovie/Radio/Radio.h> #include <miosix.h> +#include <utils/DependencyManager/DependencyManager.h> using namespace Groundstation; using namespace GroundstationRovie; @@ -55,21 +56,19 @@ int main() { ledOff(); - Hub *hub = new Hub(); - Buses *buses = new Buses(); - Serial *serial = new Serial(); - Ethernet *ethernet = new Ethernet(); - RadioRig *radio_rig = new RadioRig(); + Hub *hub = new Hub(); + Buses *buses = new Buses(); + Serial *serial = new Serial(); + Ethernet *ethernet = new Ethernet(); + RadioRig *radioRig = new RadioRig(); - ModuleManager &modules = ModuleManager::getInstance(); + DependencyManager manager; - bool ok = true; + bool ok = manager.insert<HubBase>(hub) && manager.insert(buses) && + manager.insert(serial) && manager.insert(ethernet) && + manager.insert(radioRig) && manager.inject(); - ok &= modules.insert<HubBase>(hub); - ok &= modules.insert(buses); - ok &= modules.insert(serial); - ok &= modules.insert(ethernet); - ok &= modules.insert(radio_rig); + manager.graphviz(std::cout); // If insertion failed, stop right here if (!ok) @@ -92,7 +91,7 @@ int main() printf("[error] Failed to start ethernet!\n"); } - ok &= radio_rig->start(); + ok &= radioRig->start(); if (!ok) { printf("[error] Failed to start RIG radio!\n");