diff --git a/src/boards/Groundstation/Automated/Actuators/Actuators.cpp b/src/boards/Groundstation/Automated/Actuators/Actuators.cpp index 56f491ba559df96abf4a2196337fae84e9595d79..79ce0fc556e9fb267f9a64ceee3d9c6f65a272fd 100644 --- a/src/boards/Groundstation/Automated/Actuators/Actuators.cpp +++ b/src/boards/Groundstation/Automated/Actuators/Actuators.cpp @@ -24,8 +24,6 @@ #include <interfaces-impl/hwmapping.h> -#include <utils/ModuleManager/ModuleManager.hpp> - #include "ActuatorsConfig.h" using namespace miosix; diff --git a/src/boards/Groundstation/Automated/Actuators/Actuators.h b/src/boards/Groundstation/Automated/Actuators/Actuators.h index 38e35ff8e10d9c3c0c40ac732c28fe9dc9dbae9b..317bd33ca44fd7dcc32ec9903aa1a2ed50fffbd2 100644 --- a/src/boards/Groundstation/Automated/Actuators/Actuators.h +++ b/src/boards/Groundstation/Automated/Actuators/Actuators.h @@ -23,8 +23,7 @@ #include <common/Mavlink.h> #include <logger/Logger.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> #include "ActuatorsConfig.h" #include "ActuatorsData.h" @@ -55,7 +54,7 @@ enum class ActuationStatus : uint8_t EMERGENCY_STOP, ///< `6` }; -class Actuators : public Boardcore::Module +class Actuators : public Boardcore::Injectable { public: Actuators(); diff --git a/src/boards/Groundstation/Automated/Hub.cpp b/src/boards/Groundstation/Automated/Hub.cpp index c1589926bf4e3c026aa62c1004d7df4bdf602603..c3db6b0be3b32f99a3353d7079d4b6e95959f1bf 100644 --- a/src/boards/Groundstation/Automated/Hub.cpp +++ b/src/boards/Groundstation/Automated/Hub.cpp @@ -46,10 +46,9 @@ using namespace miosix; void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) { // TODO: Dispatch to correct radio using mavlink ids - bool send_ok = false; - ModuleManager& modules = ModuleManager::getInstance(); + bool send_ok = false; - LyraGS::RadioMain* radio = modules.get<LyraGS::RadioMain>(); + LyraGS::RadioMain* radio = getModule<LyraGS::RadioMain>(); if (msg.sysid == MAV_SYSID_ARP) { @@ -98,7 +97,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) // The stepper is moved of 'angle' degrees ActuationStatus moved = - modules.get<SMA>()->moveStepperDeg(stepperId, angle); + getModule<SMA>()->moveStepperDeg(stepperId, angle); if (moved == ActuationStatus::OK) sendAck(msg); else @@ -114,7 +113,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) // The stepper is moved of 'steps' steps ActuationStatus moved = - modules.get<SMA>()->moveStepperSteps(stepperId, steps); + getModule<SMA>()->moveStepperSteps(stepperId, steps); if (moved == ActuationStatus::OK) sendAck(msg); else @@ -128,7 +127,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) float multiplier = mavlink_msg_set_stepper_multiplier_tc_get_multiplier(&msg); - modules.get<SMA>()->setMultipliers(stepperId, multiplier); + getModule<SMA>()->setMultipliers(stepperId, multiplier); sendAck(msg); break; } @@ -150,7 +149,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) gpsData.fix = 3; gpsData.satellites = 42; - modules.get<SMA>()->setInitialRocketCoordinates(gpsData); + getModule<SMA>()->setInitialRocketCoordinates(gpsData); sendAck(msg); break; } @@ -172,7 +171,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) gpsData.fix = 3; gpsData.satellites = 42; - modules.get<SMA>()->setAntennaCoordinates(gpsData); + getModule<SMA>()->setAntennaCoordinates(gpsData); sendAck(msg); break; } @@ -241,7 +240,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) void Hub::dispatchIncomingMsg(const mavlink_message_t& msg) { - Serial* serial = ModuleManager::getInstance().get<Serial>(); + Groundstation::Serial* serial = getModule<Groundstation::Serial>(); #if !defined(NO_MAVLINK_ON_SERIAL) serial->sendMsg(msg); #else @@ -284,8 +283,7 @@ void Hub::dispatchIncomingMsg(const mavlink_message_t& msg) Logger::getInstance().log(gpsState); } - LyraGS::Ethernet* ethernet = - ModuleManager::getInstance().get<LyraGS::Ethernet>(); + LyraGS::EthernetGS* ethernet = getModule<LyraGS::EthernetGS>(); ethernet->sendMsg(msg); } diff --git a/src/boards/Groundstation/Automated/Hub.h b/src/boards/Groundstation/Automated/Hub.h index 93b658aa93bfc3e422b38899c96e3cfecfd0abe6..4d72f1514dbcb6523184e53131b2fdd2500623b9 100644 --- a/src/boards/Groundstation/Automated/Hub.h +++ b/src/boards/Groundstation/Automated/Hub.h @@ -22,13 +22,22 @@ #pragma once +#include <Groundstation/Automated/SMA/SMA.h> #include <Groundstation/Common/HubBase.h> +#include <Groundstation/Common/Ports/Serial.h> +#include <Groundstation/LyraGS/BoardStatus.h> +#include <Groundstation/LyraGS/Ports/Ethernet.h> +#include <Groundstation/LyraGS/Radio/Radio.h> #include <algorithms/NAS/NASState.h> #include <common/Mavlink.h> #include <miosix.h> #include <sensors/SensorData.h> +#include <utils/DependencyManager/DependencyManager.h> -#include <utils/ModuleManager/ModuleManager.hpp> +namespace LyraGS +{ +class BoardStatus; +} namespace Antennas { @@ -36,11 +45,11 @@ namespace Antennas /** * @brief Central hub connecting all outgoing and ingoing modules. */ -class Hub : public Groundstation::HubBase +class Hub : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::HubBase>, SMA, + LyraGS::RadioMain, Groundstation::Serial, LyraGS::EthernetGS> { public: - Hub() {} - /** * @brief Dispatch to the correct interface and outgoing packet (gs -> * rocket). diff --git a/src/boards/Groundstation/Automated/Leds/Leds.h b/src/boards/Groundstation/Automated/Leds/Leds.h index 95ad2bd1bfc93551a0f8639535f4f87c050035cc..10dc84efcd3b35b10f0085a2bb4c70136639a6d0 100644 --- a/src/boards/Groundstation/Automated/Leds/Leds.h +++ b/src/boards/Groundstation/Automated/Leds/Leds.h @@ -24,10 +24,10 @@ #include <ActiveObject.h> #include <scheduler/TaskScheduler.h> +#include <utils/DependencyManager/DependencyManager.h> #include <array> #include <mutex> -#include <utils/ModuleManager/ModuleManager.hpp> constexpr uint32_t LED_BLINK_FAST_PERIOD_MS = 50; constexpr uint32_t LED_BLINK_SLOW_PERIOD_MS = 300; @@ -48,7 +48,7 @@ enum class LedColor : uint8_t * @brief Utility to handle blinking leds with non-blocking sleep * (useful for state machines states that need to blink leds without blocking) */ -class Leds : public Boardcore::Module +class Leds : public Boardcore::Injectable { public: explicit Leds(Boardcore::TaskScheduler* scheduler); diff --git a/src/boards/Groundstation/Automated/PinHandler/PinHandler.h b/src/boards/Groundstation/Automated/PinHandler/PinHandler.h index 9497a5ca752be463feefd4b3ad14711e3735081c..3bb5ef27d101d5638aec35eec9f28bbaffd3d541 100644 --- a/src/boards/Groundstation/Automated/PinHandler/PinHandler.h +++ b/src/boards/Groundstation/Automated/PinHandler/PinHandler.h @@ -25,13 +25,12 @@ #include <Groundstation/Automated/PinHandler/PinData.h> #include <diagnostic/PrintLogger.h> #include <scheduler/TaskScheduler.h> +#include <utils/DependencyManager/DependencyManager.h> #include <utils/PinObserver/PinObserver.h> -#include <utils/ModuleManager/ModuleManager.hpp> - namespace Antennas { -class PinHandler : public Boardcore::Module +class PinHandler : public Boardcore::Injectable { public: enum PinList : uint8_t diff --git a/src/boards/Groundstation/Automated/SMA/SMA.cpp b/src/boards/Groundstation/Automated/SMA/SMA.cpp index dc96d97c852c50513c1cd1b1190d508e5f5571b9..ad40628486f35bad5fe72920d754b76557b681f5 100644 --- a/src/boards/Groundstation/Automated/SMA/SMA.cpp +++ b/src/boards/Groundstation/Automated/SMA/SMA.cpp @@ -31,8 +31,6 @@ #include <drivers/timer/TimestampTimer.h> #include <sensors/Vectornav/VN300/VN300Data.h> -#include <utils/ModuleManager/ModuleManager.hpp> - #include "SMAData.h" using namespace Boardcore; @@ -104,8 +102,7 @@ ActuationStatus SMA::moveStepperDeg(StepperList stepperId, float angle) } else { - return ModuleManager::getInstance().get<Actuators>()->moveDeg(stepperId, - angle); + return getModule<Actuators>()->moveDeg(stepperId, angle); } } @@ -118,8 +115,7 @@ ActuationStatus SMA::moveStepperSteps(StepperList stepperId, int16_t steps) } else { - return ModuleManager::getInstance().get<Actuators>()->move(stepperId, - steps); + return getModule<Actuators>()->move(stepperId, steps); } } @@ -134,8 +130,7 @@ void SMA::setMultipliers(StepperList axis, float multiplier) } else { - ModuleManager::getInstance().get<Actuators>()->setMultipliers( - axis, multiplier); + getModule<Actuators>()->setMultipliers(axis, multiplier); } } @@ -162,7 +157,7 @@ void SMA::update() VN300Data vn300Data; GPSData antennaPosition; - auto* sensors = ModuleManager::getInstance().get<Sensors>(); + auto* sensors = getModule<Sensors>(); vn300Data = sensors->getVN300LastSample(); if (vn300Data.fix_gps != 0) @@ -196,8 +191,7 @@ void SMA::update() { GPSData rocketCoordinates; - Hub* hub = - static_cast<Hub*>(ModuleManager::getInstance().get<HubBase>()); + Hub* hub = static_cast<Hub*>(getModule<Groundstation::HubBase>()); rocketCoordinates = hub->getRocketCoordinates(); if (rocketCoordinates.fix != 0) @@ -219,8 +213,7 @@ void SMA::update() case SMAState::ACTIVE: { // retrieve the last NAS Rocket state - Hub* hub = - static_cast<Hub*>(ModuleManager::getInstance().get<HubBase>()); + Hub* hub = static_cast<Hub*>(getModule<HubBase>()); if (hub->hasNasSet()) { NASState nasState = hub->getRocketNasState(); @@ -234,9 +227,7 @@ void SMA::update() // update the follower with the propagated state follower.setLastRocketNasState(predicted.getNasState()); - VN300Data vn300Data = ModuleManager::getInstance() - .get<Sensors>() - ->getVN300LastSample(); + VN300Data vn300Data = getModule<Sensors>()->getVN300LastSample(); follower.setLastAntennaAttitude(vn300Data); follower.update(); // step the follower FollowerState follow = follower.getState(); @@ -248,7 +239,7 @@ void SMA::update() static_cast<Boardcore::AntennaAngles>(target)); // actuate the steppers - auto steppers = ModuleManager::getInstance().get<Actuators>(); + auto steppers = getModule<Actuators>(); steppers->setSpeed(StepperList::STEPPER_X, follow.horizontalSpeed); steppers->setSpeed(StepperList::STEPPER_Y, follow.verticalSpeed); @@ -280,8 +271,7 @@ void SMA::update() VN300Data fakeAttitudeData; // retrieve the last NAS Rocket state - Hub* hub = - static_cast<Hub*>(ModuleManager::getInstance().get<HubBase>()); + Hub* hub = static_cast<Hub*>(getModule<HubBase>()); if (hub->hasNasSet()) { NASState nasState = hub->getRocketNasState(); @@ -293,7 +283,7 @@ void SMA::update() propagator.update(); // step the propagator PropagatorState predicted = propagator.getState(); - auto steppers = ModuleManager::getInstance().get<Actuators>(); + auto steppers = getModule<Actuators>(); // set the attitude as the current position of the steppers // FIXME this method of setting the attitude is too dirty @@ -391,13 +381,13 @@ State SMA::state_feedback(const Event& event) case EV_ENTRY: { logStatus(SMAState::FEEDBACK); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW); + getModule<Leds>()->setOn(LedColor::YELLOW); return HANDLED; } case EV_EXIT: { - ModuleManager::getInstance().get<Actuators>()->disarm(); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::YELLOW); + getModule<Actuators>()->disarm(); + getModule<Leds>()->setOff(LedColor::YELLOW); return HANDLED; } case EV_EMPTY: @@ -427,13 +417,13 @@ State SMA::state_no_feedback(const Event& event) case EV_ENTRY: { logStatus(SMAState::NO_FEEDBACK); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW); + getModule<Leds>()->setOn(LedColor::YELLOW); return HANDLED; } case EV_EXIT: { - ModuleManager::getInstance().get<Actuators>()->disarm(); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::YELLOW); + getModule<Actuators>()->disarm(); + getModule<Leds>()->setOff(LedColor::YELLOW); return HANDLED; } case EV_EMPTY: @@ -499,10 +489,9 @@ State SMA::state_init_error(const Event& event) { logStatus(SMAState::INIT_ERROR); if (fatalInit) - ModuleManager::getInstance().get<Leds>()->setFastBlink( - LedColor::RED); + getModule<Leds>()->setFastBlink(LedColor::RED); else - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED); + getModule<Leds>()->setOn(LedColor::RED); return HANDLED; } case EV_EXIT: @@ -539,10 +528,9 @@ State SMA::state_init_done(const Event& event) case EV_ENTRY: { logStatus(SMAState::INIT_DONE); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::RED); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE); - ModuleManager::getInstance().get<Leds>()->setSlowBlink( - LedColor::YELLOW); + getModule<Leds>()->setOff(LedColor::RED); + getModule<Leds>()->setOff(LedColor::BLUE); + getModule<Leds>()->setSlowBlink(LedColor::YELLOW); return HANDLED; } case EV_EXIT: @@ -579,8 +567,8 @@ State SMA::state_insert_info(const Event& event) case EV_ENTRY: { logStatus(SMAState::INSERT_INFO); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::YELLOW); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED); + getModule<Leds>()->setOff(LedColor::YELLOW); + getModule<Leds>()->setOn(LedColor::RED); return HANDLED; } case EV_EXIT: @@ -613,10 +601,9 @@ State SMA::state_arm_ready(const Event& event) case EV_ENTRY: { logStatus(SMAState::ARM_READY); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED); - ModuleManager::getInstance().get<Leds>()->setSlowBlink( - LedColor::YELLOW); + getModule<Leds>()->setOff(LedColor::BLUE); + getModule<Leds>()->setOn(LedColor::RED); + getModule<Leds>()->setSlowBlink(LedColor::YELLOW); return HANDLED; } case EV_EXIT: @@ -649,9 +636,9 @@ State SMA::state_armed(const Event& event) case EV_ENTRY: { logStatus(SMAState::ARMED); - ModuleManager::getInstance().get<Actuators>()->arm(); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE); + getModule<Actuators>()->arm(); + getModule<Leds>()->setOn(LedColor::YELLOW); + getModule<Leds>()->setOff(LedColor::BLUE); return HANDLED; } case EV_EXIT: @@ -756,8 +743,7 @@ State SMA::state_fix_antennas(const Event& event) case EV_ENTRY: { logStatus(SMAState::FIX_ANTENNAS); - ModuleManager::getInstance().get<Leds>()->setSlowBlink( - LedColor::BLUE); + getModule<Leds>()->setSlowBlink(LedColor::BLUE); return HANDLED; } case EV_EXIT: @@ -794,13 +780,12 @@ State SMA::state_fix_rocket(const Event& event) case EV_ENTRY: { logStatus(SMAState::FIX_ROCKET); - ModuleManager::getInstance().get<Leds>()->setFastBlink( - LedColor::BLUE); + getModule<Leds>()->setFastBlink(LedColor::BLUE); return HANDLED; } case EV_EXIT: { - auto* leds = ModuleManager::getInstance().get<Leds>(); + auto* leds = getModule<Leds>(); leds->setOff(LedColor::YELLOW); // init the follower before leaving the state @@ -845,7 +830,7 @@ State SMA::state_active(const Event& event) logStatus(SMAState::ACTIVE); follower.begin(); propagator.begin(); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::BLUE); + getModule<Leds>()->setOn(LedColor::BLUE); return HANDLED; } case EV_EXIT: @@ -880,10 +865,10 @@ State SMA::state_armed_nf(const Event& event) case EV_ENTRY: { logStatus(SMAState::ARMED_NF); - ModuleManager::getInstance().get<Actuators>()->arm(); - ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED); + getModule<Actuators>()->arm(); + getModule<Leds>()->setOff(LedColor::BLUE); + getModule<Leds>()->setOn(LedColor::YELLOW); + getModule<Leds>()->setOn(LedColor::RED); return HANDLED; } case EV_EXIT: @@ -952,13 +937,12 @@ State SMA::state_fix_rocket_nf(const Event& event) case EV_ENTRY: { logStatus(SMAState::FIX_ROCKET_NF); - ModuleManager::getInstance().get<Leds>()->setFastBlink( - LedColor::BLUE); + getModule<Leds>()->setFastBlink(LedColor::BLUE); return HANDLED; } case EV_EXIT: { - auto* leds = ModuleManager::getInstance().get<Leds>(); + auto* leds = getModule<Leds>(); leds->setOff(LedColor::YELLOW); // init the follower before leaving the state @@ -1003,8 +987,8 @@ State SMA::state_active_nf(const Event& event) logStatus(SMAState::ACTIVE_NF); follower.begin(); propagator.begin(); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::BLUE); - ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED); + getModule<Leds>()->setOn(LedColor::BLUE); + getModule<Leds>()->setOn(LedColor::RED); return HANDLED; } case EV_EXIT: diff --git a/src/boards/Groundstation/Automated/SMA/SMA.h b/src/boards/Groundstation/Automated/SMA/SMA.h index 0a468df20a91d579cce25e2b52eb0a4f55085bf8..e460036e8d25928d796d197da8d3e5321a4b3029 100644 --- a/src/boards/Groundstation/Automated/SMA/SMA.h +++ b/src/boards/Groundstation/Automated/SMA/SMA.h @@ -23,6 +23,9 @@ #pragma once #include <Groundstation/Automated/Actuators/Actuators.h> +#include <Groundstation/Automated/Leds/Leds.h> +#include <Groundstation/Automated/Sensors/Sensors.h> +#include <Groundstation/Common/HubBase.h> #include <algorithms/Follower/Follower.h> #include <algorithms/NAS/NASState.h> #include <algorithms/Propagator/Propagator.h> @@ -30,8 +33,7 @@ #include <events/HSM.h> #include <scheduler/TaskScheduler.h> #include <sensors/SensorData.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> #include "SMAData.h" @@ -42,7 +44,9 @@ namespace Antennas * @brief SMA - State Machine for Arp is the state machine which * controls the Autonomous Rocket Pointer system. */ -class SMA : public Boardcore::Module, public Boardcore::HSM<SMA> +class SMA : public Boardcore::InjectableWithDeps<Actuators, Sensors, + Groundstation::HubBase, Leds>, + public Boardcore::HSM<SMA> { public: explicit SMA(Boardcore::TaskScheduler* scheduler); diff --git a/src/boards/Groundstation/Automated/Sensors/Sensors.cpp b/src/boards/Groundstation/Automated/Sensors/Sensors.cpp index 8b1209533d4bc3159c8264de9b772e9f08c44031..35af6ce8a41f27e3afd5758706ad2cc66942e8e7 100644 --- a/src/boards/Groundstation/Automated/Sensors/Sensors.cpp +++ b/src/boards/Groundstation/Automated/Sensors/Sensors.cpp @@ -22,8 +22,6 @@ #include "Sensors.h" -#include <utils/ModuleManager/ModuleManager.hpp> - using namespace std; using namespace miosix; using namespace Boardcore; @@ -54,7 +52,7 @@ bool Sensors::start() bool Sensors::vn300Init() { vn300 = new Boardcore::VN300( - ModuleManager::getInstance().get<LyraGS::Buses>()->usart2, 115200, + getModule<LyraGS::Buses>()->usart2, 115200, VN300Defs::SampleOptions::ARP, VNCommonSerial::CRCOptions::CRC_ENABLE_16); ///< TODO: see that CRC ///< behaves correctly diff --git a/src/boards/Groundstation/Automated/Sensors/Sensors.h b/src/boards/Groundstation/Automated/Sensors/Sensors.h index f2e399a9f0cd6ec22c51065c48efbd97d320353a..a293f0a2f60bf3a0f2e2f955973f7129b0006836 100644 --- a/src/boards/Groundstation/Automated/Sensors/Sensors.h +++ b/src/boards/Groundstation/Automated/Sensors/Sensors.h @@ -21,7 +21,7 @@ */ #pragma once -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> #include "Groundstation/LyraGS/Buses.h" #include "sensors/SensorManager.h" @@ -29,7 +29,7 @@ namespace Antennas { -class Sensors : public Boardcore::Module +class Sensors : public Boardcore::InjectableWithDeps<LyraGS::Buses> { public: Sensors(); diff --git a/src/boards/Groundstation/Common/HubBase.h b/src/boards/Groundstation/Common/HubBase.h index 78b4143f4fe7af093065a4969f07e612627431d4..ea981ffcd933ea1967df82dd58f12f0cb7096427 100644 --- a/src/boards/Groundstation/Common/HubBase.h +++ b/src/boards/Groundstation/Common/HubBase.h @@ -23,8 +23,7 @@ #pragma once #include <common/Mavlink.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> namespace Groundstation { @@ -32,7 +31,7 @@ namespace Groundstation /** * @brief Central hub connecting all outgoing and ingoing modules. */ -class HubBase : public Boardcore::Module +class HubBase : public Boardcore::Injectable { public: /** diff --git a/src/boards/Groundstation/Common/Ports/EthernetBase.cpp b/src/boards/Groundstation/Common/Ports/EthernetBase.cpp index 2cd5d4c8092ccd6eba128fc21b0865dec54f2adf..2a07d43310fd5c75e95ba7a715f0997def1e5e23 100644 --- a/src/boards/Groundstation/Common/Ports/EthernetBase.cpp +++ b/src/boards/Groundstation/Common/Ports/EthernetBase.cpp @@ -120,7 +120,7 @@ bool EthernetBase::start(std::unique_ptr<Boardcore::Wiz5500> wiz5500) void EthernetBase::handleMsg(const mavlink_message_t& msg) { // Dispatch the message through the hub. - ModuleManager::getInstance().get<HubBase>()->dispatchOutgoingMsg(msg); + getModule<HubBase>()->dispatchOutgoingMsg(msg); } ssize_t EthernetBase::receive(uint8_t* pkt, size_t max_len) diff --git a/src/boards/Groundstation/Common/Ports/EthernetBase.h b/src/boards/Groundstation/Common/Ports/EthernetBase.h index 899234879515020ab0cd86861bf56b46c5b1cbc8..c370ae3d0070ec997d50240b830ac1fea0840e48 100644 --- a/src/boards/Groundstation/Common/Ports/EthernetBase.h +++ b/src/boards/Groundstation/Common/Ports/EthernetBase.h @@ -23,9 +23,11 @@ #pragma once #include <ActiveObject.h> +#include <Groundstation/Common/HubBase.h> #include <common/Mavlink.h> #include <drivers/WIZ5500/WIZ5500.h> #include <radio/MavlinkDriver/MavlinkDriver.h> +#include <utils/DependencyManager/DependencyManager.h> #include <memory> @@ -38,7 +40,8 @@ Boardcore::WizMac genNewRandomMac(); using EthernetMavDriver = Boardcore::MavlinkDriver<1024, 10, MAVLINK_MAX_DIALECT_PAYLOAD_SIZE>; -class EthernetBase : public Boardcore::Transceiver +class EthernetBase : public Boardcore::Transceiver, + public Boardcore::InjectableWithDeps<HubBase> { public: EthernetBase(){}; diff --git a/src/boards/Groundstation/Common/Ports/Serial.cpp b/src/boards/Groundstation/Common/Ports/Serial.cpp index 45f4b7712016451e394c9ce4284e5bcb8c6fb4ce..a8716aaeba18190e5825aa57c8cd82f58f6c8b08 100644 --- a/src/boards/Groundstation/Common/Ports/Serial.cpp +++ b/src/boards/Groundstation/Common/Ports/Serial.cpp @@ -22,9 +22,6 @@ #include "Serial.h" -#include <Groundstation/Common/HubBase.h> -#include <filesystem/console/console_device.h> - using namespace miosix; using namespace Groundstation; using namespace Boardcore; @@ -55,7 +52,7 @@ void Serial::sendMsg(const mavlink_message_t& msg) void Serial::handleMsg(const mavlink_message_t& msg) { // Dispatch the message through the hub. - ModuleManager::getInstance().get<HubBase>()->dispatchOutgoingMsg(msg); + getModule<HubBase>()->dispatchOutgoingMsg(msg); } ssize_t Serial::receive(uint8_t* pkt, size_t max_len) diff --git a/src/boards/Groundstation/Common/Ports/Serial.h b/src/boards/Groundstation/Common/Ports/Serial.h index ea39b639428dd17b623c6e0899ac2cd6c5e7e630..199bc1ba40d8612d7cc8d7922799ad36ffa73f21 100644 --- a/src/boards/Groundstation/Common/Ports/Serial.h +++ b/src/boards/Groundstation/Common/Ports/Serial.h @@ -23,11 +23,13 @@ #pragma once #include <ActiveObject.h> +#include <Groundstation/Common/HubBase.h> #include <common/Mavlink.h> +#include <filesystem/console/console_device.h> #include <radio/MavlinkDriver/MavlinkDriver.h> +#include <utils/DependencyManager/DependencyManager.h> #include <memory> -#include <utils/ModuleManager/ModuleManager.hpp> namespace Groundstation { @@ -38,7 +40,8 @@ using SerialMavDriver = /** * @brief Class responsible for UART communication. */ -class Serial : public Boardcore::Module, public Boardcore::Transceiver +class Serial : public Boardcore::InjectableWithDeps<HubBase>, + public Boardcore::Transceiver { public: Serial() {} diff --git a/src/boards/Groundstation/Common/Radio/RadioBase.cpp b/src/boards/Groundstation/Common/Radio/RadioBase.cpp index b30f5a03bd0821a43d1d6b7f9c367826cca1c53f..e6931d701754e2537ee12813bacd1baf4fea17ae 100644 --- a/src/boards/Groundstation/Common/Radio/RadioBase.cpp +++ b/src/boards/Groundstation/Common/Radio/RadioBase.cpp @@ -141,7 +141,7 @@ bool RadioBase::send(uint8_t* pkt, size_t len) void RadioBase::handleMsg(const mavlink_message_t& msg) { // Dispatch the message through the hub. - ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg); + getModule<HubBase>()->dispatchIncomingMsg(msg); if (isEndOfTransmissionPacket(msg)) { diff --git a/src/boards/Groundstation/Common/Radio/RadioBase.h b/src/boards/Groundstation/Common/Radio/RadioBase.h index 3067912106fb345926e74fc8c63039ae43592115..fc8bf2d332b10587e4fe854a21f6bb0d8c79bc3f 100644 --- a/src/boards/Groundstation/Common/Radio/RadioBase.h +++ b/src/boards/Groundstation/Common/Radio/RadioBase.h @@ -24,13 +24,14 @@ #include <ActiveObject.h> #include <Groundstation/Common/Config/RadioConfig.h> +#include <Groundstation/Common/HubBase.h> #include <common/Mavlink.h> #include <common/Radio.h> #include <radio/MavlinkDriver/MavlinkDriver.h> #include <radio/SX1278/SX1278Fsk.h> +#include <utils/DependencyManager/DependencyManager.h> #include <memory> -#include <utils/ModuleManager/ModuleManager.hpp> namespace Groundstation { @@ -58,7 +59,9 @@ struct RadioStats * @brief Base radio class, used to implement functionality independent of * main/payload radios. */ -class RadioBase : private Boardcore::ActiveObject, public Boardcore::Transceiver +class RadioBase : private Boardcore::ActiveObject, + public Boardcore::Transceiver, + public Boardcore::InjectableWithDeps<HubBase> { public: RadioBase() {} diff --git a/src/boards/Groundstation/LyraGS/Base/Hub.cpp b/src/boards/Groundstation/LyraGS/Base/Hub.cpp index 38fdaa65e181769bbe9d702ae65306df3aa4a3ed..79f437896f134ad48125bef3b16f6e78ad60f424 100644 --- a/src/boards/Groundstation/LyraGS/Base/Hub.cpp +++ b/src/boards/Groundstation/LyraGS/Base/Hub.cpp @@ -26,30 +26,27 @@ #include <Groundstation/Common/Ports/Serial.h> #include <Groundstation/LyraGS/BoardStatus.h> #include <Groundstation/LyraGS/Ports/Ethernet.h> -#include <Groundstation/LyraGS/Radio/Radio.h> using namespace Groundstation; using namespace GroundstationBase; using namespace Boardcore; +using namespace LyraGS; void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) { - LyraGS::BoardStatus* status = - ModuleManager::getInstance().get<LyraGS::BoardStatus>(); + LyraGS::BoardStatus* status = getModule<LyraGS::BoardStatus>(); bool send_ok = false; if (status->isMainRadioPresent() && msg.sysid == MAV_SYSID_MAIN) { - LyraGS::RadioMain* radio = - ModuleManager::getInstance().get<LyraGS::RadioMain>(); + LyraGS::RadioMain* radio = getModule<LyraGS::RadioMain>(); send_ok |= radio->sendMsg(msg); } if (status->isPayloadRadioPresent() && msg.sysid == MAV_SYSID_PAYLOAD) { - LyraGS::RadioPayload* radio = - ModuleManager::getInstance().get<LyraGS::RadioPayload>(); + LyraGS::RadioPayload* radio = getModule<LyraGS::RadioPayload>(); send_ok |= radio->sendMsg(msg); } @@ -64,16 +61,14 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg) void Hub::dispatchIncomingMsg(const mavlink_message_t& msg) { - LyraGS::BoardStatus* status = - ModuleManager::getInstance().get<LyraGS::BoardStatus>(); + LyraGS::BoardStatus* status = getModule<LyraGS::BoardStatus>(); - Serial* serial = ModuleManager::getInstance().get<Serial>(); + Serial* serial = getModule<Serial>(); serial->sendMsg(msg); if (status->isEthernetPresent()) { - LyraGS::Ethernet* ethernet = - ModuleManager::getInstance().get<LyraGS::Ethernet>(); + LyraGS::EthernetGS* ethernet = getModule<LyraGS::EthernetGS>(); ethernet->sendMsg(msg); } } \ No newline at end of file diff --git a/src/boards/Groundstation/LyraGS/Base/Hub.h b/src/boards/Groundstation/LyraGS/Base/Hub.h index 0e8e8335526abbe3456f6f99eac9c8a9c31a3d11..00855c32cfb04b5e49c0b1b9341eea2c9ae51c0d 100644 --- a/src/boards/Groundstation/LyraGS/Base/Hub.h +++ b/src/boards/Groundstation/LyraGS/Base/Hub.h @@ -23,17 +23,20 @@ #pragma once #include <Groundstation/Common/HubBase.h> +#include <Groundstation/Common/Ports/Serial.h> +#include <Groundstation/LyraGS/Ports/Ethernet.h> #include <common/Mavlink.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> namespace GroundstationBase { - /** * @brief Central hub connecting all outgoing and ingoing modules. */ -class Hub : public Groundstation::HubBase +class Hub : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::HubBase>, + LyraGS::BoardStatus, LyraGS::RadioMain, LyraGS::RadioPayload, + Groundstation::Serial, LyraGS::EthernetGS> { public: /** diff --git a/src/boards/Groundstation/LyraGS/BoardStatus.cpp b/src/boards/Groundstation/LyraGS/BoardStatus.cpp index ab709195d483197e60ef23ef3ebd655d52e68e12..b65ce88af2beed8715fa5a217070f6e66152db20 100644 --- a/src/boards/Groundstation/LyraGS/BoardStatus.cpp +++ b/src/boards/Groundstation/LyraGS/BoardStatus.cpp @@ -22,16 +22,6 @@ #include "BoardStatus.h" -#include <Groundstation/Automated/Actuators/Actuators.h> -#include <Groundstation/Automated/SMA/SMA.h> -#include <Groundstation/Automated/Sensors/Sensors.h> -#include <Groundstation/Common/Config/GeneralConfig.h> -#include <Groundstation/Common/HubBase.h> -#include <Groundstation/LyraGS/Ports/Ethernet.h> -#include <Groundstation/LyraGS/Radio/Radio.h> -#include <common/Mavlink.h> -#include <drivers/timer/TimestampTimer.h> - using namespace Boardcore; using namespace Groundstation; using namespace LyraGS; @@ -70,12 +60,11 @@ void BoardStatus::arpRoutine() using namespace Antennas; miosix::Thread::sleep(Groundstation::RADIO_STATUS_PERIOD); - ModuleManager &modules = ModuleManager::getInstance(); - auto vn300 = modules.get<Sensors>()->getVN300LastSample(); + auto vn300 = getModule<Sensors>()->getVN300LastSample(); - Actuators *actuators = modules.get<Actuators>(); - SMA *sm = modules.get<SMA>(); + Actuators *actuators = getModule<Actuators>(); + SMA *sm = getModule<SMA>(); AntennaAngles targetAngles = sm->getTargetAngles(); @@ -112,7 +101,7 @@ void BoardStatus::arpRoutine() { tm.main_radio_present = 1; - auto stats = ModuleManager::getInstance().get<RadioMain>()->getStats(); + auto stats = getModule<RadioMain>()->getStats(); tm.main_packet_tx_error_count = stats.send_errors; tm.main_tx_bitrate = main_tx_bitrate.update(stats.bits_tx_count); tm.main_packet_rx_success_count = stats.packet_rx_success_count; @@ -125,7 +114,7 @@ void BoardStatus::arpRoutine() if (ethernet_present) { - auto stats = ModuleManager::getInstance().get<Ethernet>()->getState(); + auto stats = getModule<EthernetGS>()->getState(); tm.ethernet_present = 1; tm.ethernet_status = (stats.link_up ? 1 : 0) | @@ -137,7 +126,7 @@ void BoardStatus::arpRoutine() mavlink_msg_arp_tm_encode(SysIDs::MAV_SYSID_ARP, Groundstation::GS_COMPONENT_ID, &msg, &tm); - ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg); + getModule<HubBase>()->dispatchIncomingMsg(msg); } void BoardStatus::GSRoutine() @@ -154,7 +143,7 @@ void BoardStatus::GSRoutine() { tm.main_radio_present = 1; - auto stats = ModuleManager::getInstance().get<RadioMain>()->getStats(); + auto stats = getModule<RadioMain>()->getStats(); tm.main_packet_tx_error_count = stats.send_errors; tm.main_tx_bitrate = main_tx_bitrate.update(stats.bits_tx_count); tm.main_packet_rx_success_count = stats.packet_rx_success_count; @@ -169,8 +158,7 @@ void BoardStatus::GSRoutine() { tm.payload_radio_present = 1; - auto stats = - ModuleManager::getInstance().get<RadioPayload>()->getStats(); + auto stats = getModule<RadioPayload>()->getStats(); tm.payload_packet_tx_error_count = stats.send_errors; tm.payload_tx_bitrate = payload_tx_bitrate.update(stats.bits_tx_count); tm.payload_packet_rx_success_count = stats.packet_rx_success_count; @@ -183,7 +171,8 @@ void BoardStatus::GSRoutine() if (ethernet_present) { - auto stats = ModuleManager::getInstance().get<Ethernet>()->getState(); + auto ethernet = getModule<EthernetGS>(); + auto stats = ethernet->getState(); tm.ethernet_present = 1; tm.ethernet_status = (stats.link_up ? 1 : 0) | @@ -194,7 +183,7 @@ void BoardStatus::GSRoutine() mavlink_message_t msg; mavlink_msg_arp_tm_encode(GS_SYSTEM_ID, GS_COMPONENT_ID, &msg, &tm); - ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg); + getModule<HubBase>()->dispatchIncomingMsg(msg); } void BoardStatus::run() diff --git a/src/boards/Groundstation/LyraGS/BoardStatus.h b/src/boards/Groundstation/LyraGS/BoardStatus.h index 10a14c4bf845c2d412812b0210ebf3dd99999083..0396a2b077d47ee4e2d22db0f24ce9e21f03e119 100644 --- a/src/boards/Groundstation/LyraGS/BoardStatus.h +++ b/src/boards/Groundstation/LyraGS/BoardStatus.h @@ -23,14 +23,25 @@ #pragma once #include <ActiveObject.h> +#include <Groundstation/Automated/Actuators/Actuators.h> +#include <Groundstation/Automated/SMA/SMA.h> +#include <Groundstation/Automated/Sensors/Sensors.h> +#include <Groundstation/Common/Config/GeneralConfig.h> #include <Groundstation/Common/Config/RadioConfig.h> +#include <Groundstation/Common/HubBase.h> #include <Groundstation/Common/Radio/RadioBase.h> +#include <Groundstation/LyraGS/Ports/Ethernet.h> +#include <Groundstation/LyraGS/Radio/Radio.h> +#include <common/Mavlink.h> +#include <drivers/timer/TimestampTimer.h> +#include <utils/DependencyManager/DependencyManager.h> #include <utils/collections/CircularBuffer.h> -#include <utils/ModuleManager/ModuleManager.hpp> - namespace LyraGS { +class RadioMain; +class RadioPayload; +class EthernetGS; /** * @brief Utility to calculate the bitrate @@ -70,7 +81,11 @@ private: /** * @brief Class responsible for keeping track of radio status and metrics. */ -class BoardStatus : public Boardcore::Module, private Boardcore::ActiveObject +class BoardStatus + : public Boardcore::InjectableWithDeps< + Antennas::Actuators, Antennas::SMA, Antennas::Sensors, + Groundstation::HubBase, RadioMain, RadioPayload, EthernetGS>, + private Boardcore::ActiveObject { public: explicit BoardStatus(bool isArp) : isArp{isArp} {} @@ -88,7 +103,7 @@ public: bool isPayloadRadioPresent(); /** - * @brief Check wether the ethernet was found during boot. + * @brief Check wether the ethernet was found d\uring boot. */ bool isEthernetPresent(); diff --git a/src/boards/Groundstation/LyraGS/Buses.h b/src/boards/Groundstation/LyraGS/Buses.h index ead43b9b116f86bb476c1eda5c5a2a4d5a45af41..1faf0f84611b36b9e182c38852a26a1cb4a05c33 100644 --- a/src/boards/Groundstation/LyraGS/Buses.h +++ b/src/boards/Groundstation/LyraGS/Buses.h @@ -24,29 +24,23 @@ #include <drivers/spi/SPIBus.h> #include <drivers/usart/USART.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <utils/DependencyManager/DependencyManager.h> #include "interfaces-impl/hwmapping.h" namespace LyraGS { -class Buses : public Boardcore::Module +class Buses : public Boardcore::Injectable { public: - Boardcore::SPIBus radio1_bus; - Boardcore::SPIBus radio2_bus; - Boardcore::USART usart2; - Boardcore::USART uart4; - Boardcore::SPIBus ethernet_bus; + Boardcore::SPIBus &getRadio() { return radio1_bus; } - Buses() - : radio1_bus{MIOSIX_RADIO1_SPI}, radio2_bus{MIOSIX_RADIO2_SPI}, - usart2{USART2, 115200}, uart4{UART4, 115200}, ethernet_bus{ - MIOSIX_ETHERNET_SPI} - { - } + Boardcore::SPIBus radio1_bus{MIOSIX_RADIO1_SPI}; + Boardcore::SPIBus radio2_bus{MIOSIX_RADIO2_SPI}; + Boardcore::USART usart2{USART2, 115200}; + Boardcore::USART uart4{UART4, 115200}; + Boardcore::SPIBus ethernet_bus{MIOSIX_ETHERNET_SPI}; }; } // namespace LyraGS \ No newline at end of file diff --git a/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp b/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp index 72cc4b01d0765031ff8d22743f91d5575a5d3d98..f4223d71deca2c96ffa71999ae01a712f8c430bd 100644 --- a/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp +++ b/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp @@ -27,21 +27,27 @@ #include <interfaces-impl/hwmapping.h> using namespace Boardcore; +using namespace LyraGS; + +namespace LyraGS +{ +EthernetGS* ethernetGSGlobal = nullptr; +} void __attribute__((used)) MIOSIX_ETHERNET_IRQ() { - ModuleManager::getInstance().get<LyraGS::Ethernet>()->handleINTn(); + if (ethernetGSGlobal) + ethernetGSGlobal->handleINTn(); } namespace LyraGS { -bool Ethernet::start() +bool EthernetGS::start() { std::unique_ptr<Wiz5500> wiz5500 = std::make_unique<Wiz5500>( - ModuleManager::getInstance().get<Buses>()->ethernet_bus, - miosix::ethernet::cs::getPin(), miosix::ethernet::intr::getPin(), - SPI::ClockDivider::DIV_64); + getModule<Buses>()->ethernet_bus, miosix::ethernet::cs::getPin(), + miosix::ethernet::intr::getPin(), SPI::ClockDivider::DIV_64); // First check if the device is even connected bool present = wiz5500->checkVersion(); @@ -56,8 +62,17 @@ bool Ethernet::start() return false; } - ModuleManager::getInstance().get<BoardStatus>()->setEthernetPresent(true); + ethernetGSGlobal = this; + getModule<BoardStatus>()->setEthernetPresent(true); return true; } + +void EthernetGS::sendMsg(const mavlink_message_t& msg) { Super::sendMsg(msg); }; + +void EthernetGS::handleINTn() { EthernetBase::handleINTn(); } +Boardcore::Wiz5500::PhyState EthernetGS::getState() +{ + return Super::getState(); +}; } // namespace LyraGS \ No newline at end of file diff --git a/src/boards/Groundstation/LyraGS/Ports/Ethernet.h b/src/boards/Groundstation/LyraGS/Ports/Ethernet.h index d35d3b4a957054744bcf948fa29348a6ab6b9d9b..fe6913f22d14bbc265c124a9487aba57b2ba9332 100644 --- a/src/boards/Groundstation/LyraGS/Ports/Ethernet.h +++ b/src/boards/Groundstation/LyraGS/Ports/Ethernet.h @@ -23,21 +23,24 @@ #pragma once #include <Groundstation/Common/Ports/EthernetBase.h> - -#include <utils/ModuleManager/ModuleManager.hpp> +#include <Groundstation/LyraGS/BoardStatus.h> +#include <utils/DependencyManager/DependencyManager.h> namespace LyraGS { +class BoardStatus; -class Ethernet : public Groundstation::EthernetBase, public Boardcore::Module +class EthernetGS : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::EthernetBase>, + Buses, BoardStatus> { public: - Ethernet() : EthernetBase(), Module() {} - Ethernet(bool randomIp, uint8_t ipOffset) - : EthernetBase(randomIp, ipOffset), Module() - { - } + EthernetGS() : Super{} {} + EthernetGS(bool randomIp, uint8_t ipOffset) : Super{randomIp, ipOffset} {} [[nodiscard]] bool start(); + void sendMsg(const mavlink_message_t& msg); + void handleINTn(); + Boardcore::Wiz5500::PhyState getState(); }; } // namespace LyraGS \ No newline at end of file diff --git a/src/boards/Groundstation/LyraGS/Radio/Radio.cpp b/src/boards/Groundstation/LyraGS/Radio/Radio.cpp index 4780fcab966bd98c726b25206be8694891b9c320..85b4afcaab6c2d2641b37cc5c462deba3f77ab62 100644 --- a/src/boards/Groundstation/LyraGS/Radio/Radio.cpp +++ b/src/boards/Groundstation/LyraGS/Radio/Radio.cpp @@ -22,51 +22,54 @@ #include "Radio.h" -#include <Groundstation/Common/HubBase.h> -#include <Groundstation/Common/Ports/Serial.h> -#include <Groundstation/LyraGS/BoardStatus.h> -#include <Groundstation/LyraGS/Buses.h> -#include <interfaces-impl/hwmapping.h> -#include <radio/SX1278/SX1278Frontends.h> - -using namespace Groundstation; using namespace LyraGS; using namespace Boardcore; using namespace miosix; +SX1278Fsk* radioMainGlobal{nullptr}; +SX1278Fsk* radioPayloadGlobal{nullptr}; + void __attribute__((used)) MIOSIX_RADIO1_DIO0_IRQ() { - ModuleManager::getInstance().get<RadioMain>()->handleDioIRQ(); + SX1278Fsk* instance = radioMainGlobal; + if (instance) + instance->handleDioIRQ(); } void __attribute__((used)) MIOSIX_RADIO1_DIO1_IRQ() { - ModuleManager::getInstance().get<RadioMain>()->handleDioIRQ(); + SX1278Fsk* instance = radioMainGlobal; + if (instance) + instance->handleDioIRQ(); } void __attribute__((used)) MIOSIX_RADIO1_DIO3_IRQ() { - ModuleManager::getInstance().get<RadioMain>()->handleDioIRQ(); + SX1278Fsk* instance = radioMainGlobal; + if (instance) + instance->handleDioIRQ(); } void __attribute__((used)) MIOSIX_RADIO2_DIO0_IRQ() { - ModuleManager::getInstance().get<RadioPayload>()->handleDioIRQ(); + if (radioPayloadGlobal) + radioPayloadGlobal->handleDioIRQ(); } void __attribute__((used)) MIOSIX_RADIO2_DIO1_IRQ() { - ModuleManager::getInstance().get<RadioPayload>()->handleDioIRQ(); + if (radioPayloadGlobal) + radioPayloadGlobal->handleDioIRQ(); } void __attribute__((used)) MIOSIX_RADIO2_DIO3_IRQ() { - ModuleManager::getInstance().get<RadioPayload>()->handleDioIRQ(); + if (radioPayloadGlobal) + radioPayloadGlobal->handleDioIRQ(); } bool RadioMain::start() { - std::unique_ptr<SX1278::ISX1278Frontend> frontend; if (hasBackup) @@ -77,31 +80,30 @@ bool RadioMain::start() std::unique_ptr<Boardcore::SX1278Fsk> sx1278 = std::make_unique<Boardcore::SX1278Fsk>( - 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_bus, radio1::cs::getPin(), + radio1::dio0::getPin(), radio1::dio1::getPin(), + radio1::dio3::getPin(), SPI::ClockDivider::DIV_64, + std::move(frontend)); + + // Set the global radio for IRQ + radioMainGlobal = sx1278.get(); // First check if the device is even connected bool present = sx1278->checkVersion(); - ModuleManager::getInstance().get<BoardStatus>()->setMainRadioPresent( - present); + getModule<LyraGS::BoardStatus>()->setMainRadioPresent(present); if (present) { // Configure the radio if (sx1278->configure(Common::MAIN_RADIO_CONFIG) != SX1278Fsk::Error::NONE) - { return false; - } // Initialize if only if present if (!RadioBase::start(std::move(sx1278))) - { + return false; - } } return true; @@ -118,15 +120,17 @@ bool RadioPayload::start() frontend = std::make_unique<Skyward433Frontend>(); sx1278 = std::make_unique<Boardcore::SX1278Fsk>( - ModuleManager::getInstance().get<Buses>()->radio2_bus, - radio2::cs::getPin(), radio2::dio0::getPin(), radio2::dio1::getPin(), - radio2::dio3::getPin(), SPI::ClockDivider::DIV_64, std::move(frontend)); + getModule<Buses>()->radio2_bus, radio2::cs::getPin(), + radio2::dio0::getPin(), radio2::dio1::getPin(), radio2::dio3::getPin(), + SPI::ClockDivider::DIV_64, std::move(frontend)); + + // Set the global radio for IRQ + radioPayloadGlobal = sx1278.get(); // First check if the device is even connected bool present = sx1278->checkVersion(); - ModuleManager::getInstance().get<BoardStatus>()->setPayloadRadioPresent( - present); + getModule<LyraGS::BoardStatus>()->setPayloadRadioPresent(present); if (present) { diff --git a/src/boards/Groundstation/LyraGS/Radio/Radio.h b/src/boards/Groundstation/LyraGS/Radio/Radio.h index 47cefb5690d2c4316dd68e088d9b2750f8bab417..b176e2758a751f70be2f79a24f200ac2d2df2cd7 100644 --- a/src/boards/Groundstation/LyraGS/Radio/Radio.h +++ b/src/boards/Groundstation/LyraGS/Radio/Radio.h @@ -22,12 +22,23 @@ #pragma once +#include <Groundstation/Common/HubBase.h> +#include <Groundstation/Common/Ports/Serial.h> #include <Groundstation/Common/Radio/RadioBase.h> +#include <Groundstation/LyraGS/BoardStatus.h> +#include <Groundstation/LyraGS/Buses.h> +#include <interfaces-impl/hwmapping.h> +#include <radio/SX1278/SX1278Frontends.h> +#include <utils/DependencyManager/DependencyManager.h> namespace LyraGS { -class RadioMain : public Groundstation::RadioBase, public Boardcore::Module +class BoardStatus; + +class RadioMain : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::RadioBase>, + Buses, BoardStatus> { public: [[nodiscard]] bool start(); @@ -39,8 +50,9 @@ public: private: bool hasBackup = false; }; - -class RadioPayload : public Groundstation::RadioBase, public Boardcore::Module +class RadioPayload : public Boardcore::InjectableWithDeps< + Boardcore::InjectableBase<Groundstation::RadioBase>, + Buses, BoardStatus> { public: [[nodiscard]] bool start(); diff --git a/src/entrypoints/Groundstation/Automated/test-actuators.cpp b/src/entrypoints/Groundstation/Automated/test-actuators.cpp index b013b9410fbde35734b37e52b415f4fbdde0d8e1..064b76b6aa4e8f8f15619548cae18fe6b4224a74 100644 --- a/src/entrypoints/Groundstation/Automated/test-actuators.cpp +++ b/src/entrypoints/Groundstation/Automated/test-actuators.cpp @@ -199,19 +199,19 @@ int main() Actuators *actuators = new Actuators(); Sensors *sensors = new Sensors(); - ModuleManager &modules = ModuleManager::getInstance(); - PrintLogger logger = PrintLogger{Logging::getLogger("test-actuators")}; - bool ok = true; + DependencyManager manager; + PrintLogger logger = PrintLogger{Logging::getLogger("test-actuators")}; + bool ok = true; LOG_INFO(logger, "test-actuators\n"); // Insert modules { - ok &= modules.insert<HubBase>(hub); - ok &= modules.insert(buses); - ok &= modules.insert(serial); - ok &= modules.insert(actuators); - ok &= modules.insert(sensors); + ok &= manager.insert<HubBase>(hub); + ok &= manager.insert(buses); + ok &= manager.insert(serial); + ok &= manager.insert(actuators); + ok &= manager.insert(sensors); // If insertion failed, stop right here if (!ok) @@ -223,6 +223,16 @@ int main() { LOG_DEBUG(logger, "All modules inserted successfully!\n"); } + + if (!manager.inject()) + { + LOG_ERR(logger, "[error] Failed to inject the dependencies!\n"); + errorLoop(); + } + else + { + LOG_DEBUG(logger, "All modules injected successfully!\n"); + } } // Start modules diff --git a/src/entrypoints/Groundstation/lyra-gs-entry.cpp b/src/entrypoints/Groundstation/lyra-gs-entry.cpp index 2dfeae47d4e6d529dd8040e2fe899cebe48700be..4ac45bb3d66190ecdd01c11ca096f21bc19825c0 100644 --- a/src/entrypoints/Groundstation/lyra-gs-entry.cpp +++ b/src/entrypoints/Groundstation/lyra-gs-entry.cpp @@ -38,14 +38,15 @@ #include <events/EventBroker.h> #include <miosix.h> #include <scheduler/TaskScheduler.h> +#include <utils/DependencyManager/DependencyManager.h> #include <thread> -#include <utils/ModuleManager/ModuleManager.hpp> using namespace Boardcore; using namespace miosix; using namespace Groundstation; using namespace LyraGS; +using namespace Antennas; /** * @brief Dip switch status for the GS board @@ -126,29 +127,39 @@ int main() DipSwitch dip(sh, clk, qh, microSecClk); DipStatusLyraGS dipRead = getDipStatus(dip.read()); - // TODO: Pass to DependencyManager when rebased! - ModuleManager &modules = ModuleManager::getInstance(); - PrintLogger logger = Logging::getLogger("lyra_gs"); + DependencyManager manager; + PrintLogger logger = Logging::getLogger("lyra_gs"); // TODO: Board scheduler for the schedulers TaskScheduler *scheduler_low = new TaskScheduler(0); TaskScheduler *scheduler_high = new TaskScheduler(); Buses *buses = new Buses(); Serial *serial = new Serial(); - RadioMain *radio_main = new LyraGS::RadioMain(dipRead.mainHasBackup); - BoardStatus *board_status = new BoardStatus(dipRead.isARP); - LyraGS::Ethernet *ethernet = new LyraGS::Ethernet(false, dipRead.ipConfig); - RadioPayload *radio_payload = new RadioPayload(dipRead.payloadHasBackup); - Antennas::Actuators *actuators = nullptr; + LyraGS::RadioMain *radio_main = + new LyraGS::RadioMain(dipRead.mainHasBackup); + LyraGS::BoardStatus *board_status = new LyraGS::BoardStatus(dipRead.isARP); + LyraGS::EthernetGS *ethernet = + new LyraGS::EthernetGS(false, dipRead.ipConfig); + LyraGS::RadioPayload *radio_payload = + new LyraGS::RadioPayload(dipRead.payloadHasBackup); + + HubBase *hub = nullptr; + + // ARP-related things + Antennas::Actuators *actuators = nullptr; + Antennas::Leds *leds = nullptr; + Antennas::Sensors *sensors = nullptr; + Antennas::SMA *sma = nullptr; + Antennas::PinHandler *pinHandler = nullptr; bool ok = true; - ok &= modules.insert(buses); - ok &= modules.insert(serial); - ok &= modules.insert(radio_main); - ok &= modules.insert(ethernet); - ok &= modules.insert(radio_payload); - ok &= modules.insert(board_status); + ok &= manager.insert(buses); + ok &= manager.insert(serial); + ok &= manager.insert<LyraGS::RadioMain>(radio_main); + ok &= manager.insert<LyraGS::EthernetGS>(ethernet); + ok &= manager.insert<LyraGS::RadioPayload>(radio_payload); + ok &= manager.insert(board_status); // Inserting Modules @@ -156,30 +167,29 @@ int main() if (dipRead.isARP) { LOG_DEBUG(logger, "[debug] Starting as ARP Ground Station\n"); - Antennas::Leds *leds = new Antennas::Leds(scheduler_low); - HubBase *hub = new Antennas::Hub(); - actuators = new Antennas::Actuators(); - Antennas::Sensors *sensors = new Antennas::Sensors(); - Antennas::SMA *sma = new Antennas::SMA(scheduler_high); - Antennas::PinHandler *pinHandler = new Antennas::PinHandler(); - - ok &= modules.insert(sma); - ok &= modules.insert<HubBase>(hub); - ok &= modules.insert(actuators); - ok &= modules.insert(sensors); - ok &= modules.insert(leds); - ok &= modules.insert(pinHandler); + leds = new Antennas::Leds(scheduler_low); + hub = new Antennas::Hub(); + actuators = new Antennas::Actuators(); + sensors = new Antennas::Sensors(); + sma = new Antennas::SMA(scheduler_high); + pinHandler = new Antennas::PinHandler(); + + ok &= manager.insert(sma); + ok &= manager.insert<HubBase>(hub); + ok &= manager.insert(actuators); + ok &= manager.insert(sensors); + ok &= manager.insert(leds); + ok &= manager.insert(pinHandler); } // Ground station module insertion else { LOG_DEBUG(logger, "[debug] Starting as GS base Ground Station\n"); - HubBase *hub = new GroundstationBase::Hub(); - ok &= modules.insert<HubBase>(hub); + hub = new GroundstationBase::Hub(); + ok &= manager.insert<HubBase>(hub); } // If insertion failed, stop right here - if (!ok) { LOG_ERR(logger, "[error] Failed to insert all modules!\n"); @@ -188,6 +198,15 @@ int main() LOG_DEBUG(logger, "[debug] All modules inserted correctly!\n"); + if (!manager.inject()) + { + LOG_ERR(logger, "[error] Failed to inject the dependencies!\n"); + errorLoop(); + } + + // Print out the graph of dependencies + manager.graphviz(std::cout); + // Start the modules // ARP start errors @@ -201,12 +220,16 @@ int main() } #endif + LOG_DEBUG(logger, "DEBUG: scheduler_low starting...\n"); + if (!scheduler_low->start()) { LOG_ERR(logger, "[error] Failed to start scheduler_low!\n"); ok = false; } + LOG_DEBUG(logger, "DEBUG: scheduler_high starting...\n"); + if (!scheduler_high->start()) { LOG_ERR(logger, "[error] Failed to start scheduler_high!\n"); @@ -214,12 +237,16 @@ int main() init_fatal = true; } + LOG_DEBUG(logger, "DEBUG: serial starting...\n"); + if (!serial->start()) { LOG_ERR(logger, "[error] Failed to start serial!\n"); ok = false; } + LOG_DEBUG(logger, "DEBUG: radio_main starting...\n"); + if (!radio_main->start()) { LOG_ERR(logger, "[error] Failed to start radio_main!\n"); @@ -227,6 +254,8 @@ int main() init_fatal = true; } + LOG_DEBUG(logger, "DEBUG: radio_payload starting...\n"); + if (!radio_payload->start()) { LOG_ERR(logger, "[error] Failed to start payload radio!\n"); @@ -234,12 +263,16 @@ int main() ok &= dipRead.isARP; } + LOG_DEBUG(logger, "DEBUG: ethernet starting...\n"); + if (!ethernet->start()) { LOG_ERR(logger, "[error] Failed to start ethernet!\n"); ok = false; } + LOG_DEBUG(logger, "DEBUG: board_status starting...\n"); + if (!board_status->start()) { LOG_ERR(logger, "[error] Failed to start board_status!\n"); @@ -250,24 +283,32 @@ int main() if (dipRead.isARP) { - if (!ModuleManager::getInstance().get<Antennas::Leds>()->start()) + LOG_DEBUG(logger, "DEBUG: leds starting...\n"); + + if (leds && !(leds->start())) { LOG_ERR(logger, "[error] Failed to start leds!\n"); ok = false; } - if (!ModuleManager::getInstance().get<Antennas::Sensors>()->start()) + LOG_DEBUG(logger, "DEBUG: sensors starting...\n"); + + if (sensors && !(sensors->start())) { LOG_ERR(logger, "[error] Failed to start sensors!\n"); ok = false; } - if (!ModuleManager::getInstance().get<Antennas::SMA>()->start()) + LOG_DEBUG(logger, "DEBUG: sma starting...\n"); + + if (sma && !(sma->start())) { LOG_ERR(logger, "[error] Failed to start sma!\n"); ok = false; } + LOG_DEBUG(logger, "DEBUG: actuators starting...\n"); + if (actuators) { actuators->start(); @@ -276,7 +317,9 @@ int main() else LOG_ERR(logger, "[error] Failed to start actuators!\n"); - if (!modules.get<Antennas::PinHandler>()->start()) + LOG_DEBUG(logger, "DEBUG: pin handler starting...\n"); + + if (pinHandler && !pinHandler->start()) { LOG_ERR(logger, "[error] Failed to start PinHandler!\n"); ok = false; @@ -334,10 +377,8 @@ int main() "ARP's modules initialization has failed. Init fatal " "error. Cannot proceed, a restart and fix of the " "boards/module is required.\n"); - ModuleManager::getInstance().get<Antennas::Leds>()->setFastBlink( - Antennas::LedColor::RED); - ModuleManager::getInstance().get<Antennas::SMA>()->setFatal(); - + if (sma) + sma->setFatal(); // Still go to INIT_ERROR to still allow initialization EventBroker::getInstance().post(Common::ARP_INIT_ERROR, Common::TOPIC_ARP); @@ -349,8 +390,6 @@ int main() logger, "ARP's modules initialization has failed. Init error. It " "is still possible to proceed with MAV_ARP_CMD_FORCE_INIT.\n"); - ModuleManager::getInstance().get<Antennas::Leds>()->setOn( - Antennas::LedColor::RED); EventBroker::getInstance().post(Common::ARP_INIT_ERROR, Common::TOPIC_ARP); } // If all modules are ok