diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index da6620c5..492ac424 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "OBSWConfig.h" #include "bsp_q7s/boardtest/Q7STestTask.h" @@ -137,7 +138,7 @@ void ObjectFactory::produce(void* args) { gpioCallbacks::disableAllDecoder(); createPcduComponents(gpioComIF, &pwrSwitcher); createRadSensorComponent(gpioComIF); - createSunSensorComponents(gpioComIF, spiComIF); + createSunSensorComponents(gpioComIF, spiComIF, pwrSwitcher); #if OBSW_ADD_ACS_BOARD == 1 createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher); @@ -323,7 +324,7 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) { #endif } -void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF) { +void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF* pwrSwitcher) { using namespace gpio; GpioCookie* gpioCookieSus = new GpioCookie(); GpioCallback* susgpio = nullptr; @@ -367,118 +368,124 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI gpioComIF->addGpios(gpioCookieSus); + SusFdir* fdir = nullptr; + std::array susHandlers = {}; #if OBSW_ADD_SUN_SENSORS == 1 SpiCookie* spiCookie = new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler0 = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie); + susHandlers[0] = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_0); + susHandlers[0]->setParent(objects::SUS_BOARD_ASS); + susHandlers[0]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler1 = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie); + susHandlers[1] = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_1); + susHandlers[1]->setParent(objects::SUS_BOARD_ASS); + susHandlers[1]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler2 = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie); + susHandlers[2] = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_2); + susHandlers[2]->setParent(objects::SUS_BOARD_ASS); + susHandlers[2]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler3 = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie); + susHandlers[3] = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_3); + susHandlers[3]->setParent(objects::SUS_BOARD_ASS); + susHandlers[3]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler4 = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie); + susHandlers[4] = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_4); + susHandlers[4]->setParent(objects::SUS_BOARD_ASS); + susHandlers[4]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler5 = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie); + susHandlers[5] = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_5); + susHandlers[5]->setParent(objects::SUS_BOARD_ASS); + susHandlers[5]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler6 = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie); + susHandlers[6] = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_6); + susHandlers[6]->setParent(objects::SUS_BOARD_ASS); + susHandlers[6]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler7 = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie); + susHandlers[7] = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_7); + susHandlers[7]->setParent(objects::SUS_BOARD_ASS); + susHandlers[7]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler8 = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie); + susHandlers[8] = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_8); + susHandlers[8]->setParent(objects::SUS_BOARD_ASS); + susHandlers[8]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler9 = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie); + susHandlers[9] = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_9); + susHandlers[9]->setParent(objects::SUS_BOARD_ASS); + susHandlers[9]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler10 = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie); + susHandlers[10] = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_10); + susHandlers[10]->setParent(objects::SUS_BOARD_ASS); + susHandlers[10]->setCustomFdir(fdir); spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler11 = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie); - static_cast(susHandler0); - static_cast(susHandler1); - static_cast(susHandler2); - static_cast(susHandler3); - static_cast(susHandler4); - static_cast(susHandler5); - static_cast(susHandler6); - static_cast(susHandler7); - static_cast(susHandler8); - static_cast(susHandler9); - static_cast(susHandler10); - static_cast(susHandler11); + susHandlers[11] = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie); + fdir = new SusFdir(objects::SUS_11); + susHandlers[11]->setParent(objects::SUS_BOARD_ASS); + susHandlers[11]->setCustomFdir(fdir); + + for(auto& sus: susHandlers) { + if(sus != nullptr) { #if OBSW_TEST_SUS == 1 - susHandler0->setStartUpImmediately(); - susHandler1->setStartUpImmediately(); - susHandler2->setStartUpImmediately(); - susHandler3->setStartUpImmediately(); - susHandler4->setStartUpImmediately(); - susHandler5->setStartUpImmediately(); - susHandler6->setStartUpImmediately(); - susHandler7->setStartUpImmediately(); - susHandler8->setStartUpImmediately(); - susHandler9->setStartUpImmediately(); - susHandler10->setStartUpImmediately(); - susHandler11->setStartUpImmediately(); - susHandler0->setToGoToNormalMode(true); - susHandler1->setToGoToNormalMode(true); - susHandler2->setToGoToNormalMode(true); - susHandler3->setToGoToNormalMode(true); - susHandler4->setToGoToNormalMode(true); - susHandler5->setToGoToNormalMode(true); - susHandler6->setToGoToNormalMode(true); - susHandler7->setToGoToNormalMode(true); - susHandler8->setToGoToNormalMode(true); - susHandler9->setToGoToNormalMode(true); - susHandler10->setToGoToNormalMode(true); - susHandler11->setToGoToNormalMode(true); + sus->setStartUpImmediately(); + sus->setToGoToNormalMode(true); #endif #if OBSW_DEBUG_SUS == 1 - susHandler0->enablePeriodicPrintout(true, 3); - susHandler1->enablePeriodicPrintout(true, 3); - susHandler2->enablePeriodicPrintout(true, 3); - susHandler3->enablePeriodicPrintout(true, 3); - susHandler4->enablePeriodicPrintout(true, 3); - susHandler5->enablePeriodicPrintout(true, 3); - susHandler6->enablePeriodicPrintout(true, 3); - susHandler7->enablePeriodicPrintout(true, 3); - susHandler8->enablePeriodicPrintout(true, 3); - susHandler9->enablePeriodicPrintout(true, 3); - susHandler10->enablePeriodicPrintout(true, 3); - susHandler11->enablePeriodicPrintout(true, 3); + sus->enablePeriodicPrintout(true, 3); #endif + } + } + std::array susIds = {objects::SUS_0, objects::SUS_1, objects::SUS_2, + objects::SUS_3, objects::SUS_4, objects::SUS_5, + objects::SUS_6, objects::SUS_7, objects::SUS_8, + objects::SUS_9, objects::SUS_10, objects::SUS_11}; + SusAssHelper susAssHelper = SusAssHelper(susIds); + auto susAss = + new SusAssembly(objects::SUS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, susAssHelper); + static_cast(susAss); #endif /* OBSW_ADD_SUN_SENSORS == 1 */ } @@ -583,6 +590,7 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio); gpioComIF->addGpios(gpioCookieAcsBoard); AcsBoardFdir* fdir = nullptr; + static_cast(fdir); #if OBSW_ADD_ACS_HANDLERS == 1 std::string spiDev = q7s::SPI_DEFAULT_DEV; @@ -739,14 +747,6 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI auto acsAss = new AcsBoardAssembly(objects::ACS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, acsBoardHelper, gpioComIF); static_cast(acsAss); - std::array susIds = {objects::SUS_0, objects::SUS_1, objects::SUS_2, - objects::SUS_3, objects::SUS_4, objects::SUS_5, - objects::SUS_6, objects::SUS_7, objects::SUS_8, - objects::SUS_9, objects::SUS_10, objects::SUS_11}; - SusAssHelper susAssHelper = SusAssHelper(susIds); - auto susAss = - new SusAssembly(objects::SUS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, susAssHelper); - static_cast(susAss); #if OBSW_TEST_ACS_BOARD_ASS == 1 CommandMessage msg; ModeMessage::setModeMessage(&msg, ModeMessage::CMD_MODE_COMMAND, DeviceHandlerIF::MODE_NORMAL, diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index d680a7c9..fc5fc1d8 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -18,7 +18,7 @@ void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF); void createTmpComponents(); void createRadSensorComponent(LinuxLibgpioIF* gpioComIF); -void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF); +void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF* pwrSwitcher); void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF, PowerSwitchIF* pwrSwitcher); void createHeaterComponents(); diff --git a/fsfw b/fsfw index ddc1cdb1..b6ed45a8 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit ddc1cdb1f5d1ee6f532c04b0419e24f8f40566cf +Subproject commit b6ed45a85cae1f1af83f352b4e6f8bb787743cb1 diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 2d269e6a..4fb1a908 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -48,7 +48,7 @@ debugging. */ #define OBSW_ADD_STAR_TRACKER 0 #define OBSW_ADD_PLOC_SUPERVISOR 0 #define OBSW_ADD_PLOC_MPSOC 0 -#define OBSW_ADD_SUN_SENSORS 0 +#define OBSW_ADD_SUN_SENSORS 1 #define OBSW_ADD_ACS_BOARD 1 #define OBSW_ADD_ACS_HANDLERS 1 #define OBSW_ADD_RW 0 diff --git a/mission/system/CMakeLists.txt b/mission/system/CMakeLists.txt index 0f8bdbca..f29f5336 100644 --- a/mission/system/CMakeLists.txt +++ b/mission/system/CMakeLists.txt @@ -8,5 +8,7 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE TcsSubsystem.cpp DualLanePowerStateMachine.cpp DualLaneAssemblyBase.cpp + AcsBoardFdir.cpp + SusFdir.cpp ) \ No newline at end of file diff --git a/mission/system/DualLaneAssemblyBase.cpp b/mission/system/DualLaneAssemblyBase.cpp index 7b2f062a..81626033 100644 --- a/mission/system/DualLaneAssemblyBase.cpp +++ b/mission/system/DualLaneAssemblyBase.cpp @@ -26,6 +26,7 @@ void DualLaneAssemblyBase::performChildOperation() { // switching off or on devices. if (not pwrStateMachine.active()) { AssemblyBase::performChildOperation(); + // TODO: Handle Event Queue } } diff --git a/mission/system/SusAssembly.cpp b/mission/system/SusAssembly.cpp index 32b72e97..7729a8b9 100644 --- a/mission/system/SusAssembly.cpp +++ b/mission/system/SusAssembly.cpp @@ -130,7 +130,7 @@ ReturnValue_t SusAssembly::initialize() { return result; } } - return result; + return AssemblyBase::initialize(); } bool SusAssembly::isUseable(object_id_t object, Mode_t mode) { diff --git a/mission/system/SusAssembly.h b/mission/system/SusAssembly.h index 5cf4a42f..a8a98391 100644 --- a/mission/system/SusAssembly.h +++ b/mission/system/SusAssembly.h @@ -15,7 +15,7 @@ struct SusAssHelper { class PowerSwitchIF; -class SusAssembly : DualLaneAssemblyBase { +class SusAssembly : public DualLaneAssemblyBase { public: static constexpr uint8_t NUMBER_SUN_SENSORS_ONE_SIDE = 6; static constexpr uint8_t NUMBER_SUN_SENSORS = 12; diff --git a/mission/system/SusFdir.cpp b/mission/system/SusFdir.cpp new file mode 100644 index 00000000..a2e0aff4 --- /dev/null +++ b/mission/system/SusFdir.cpp @@ -0,0 +1,6 @@ +#include "SusFdir.h" + +#include + +SusFdir::SusFdir(object_id_t sensorId) + : DeviceHandlerFailureIsolation(sensorId, objects::SUS_BOARD_ASS) {} diff --git a/mission/system/SusFdir.h b/mission/system/SusFdir.h new file mode 100644 index 00000000..b69d522a --- /dev/null +++ b/mission/system/SusFdir.h @@ -0,0 +1,11 @@ +#ifndef MISSION_SYSTEM_SUSFDIR_H_ +#define MISSION_SYSTEM_SUSFDIR_H_ + +#include + +class SusFdir : public DeviceHandlerFailureIsolation { + public: + SusFdir(object_id_t sensorId); +}; + +#endif /* MISSION_SYSTEM_SUSFDIR_H_ */