From bcd97076e117772d10cfa6a7143baeec92b91fde Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 11:57:48 +0100 Subject: [PATCH 01/14] started TCS subsystem --- archive/gpio/gpioDefinitions.h | 8 +++--- bsp_q7s/core/ObjectFactory.cpp | 26 +++++++++---------- common/config/devConf.h | 1 + generators/events/translateEvents.cpp | 2 +- generators/objects/translateObjects.cpp | 2 +- linux/fsfwconfig/events/translateEvents.cpp | 2 +- linux/fsfwconfig/objects/translateObjects.cpp | 2 +- linux/obc/PdecHandler.cpp | 4 ++- mission/system/PlPcduAssembly.cpp | 1 + mission/system/PlPcduAssembly.h | 4 +++ mission/system/TcsSubsystem.cpp | 19 ++++++++++++++ mission/system/TcsSubsystem.h | 20 +++++++++++++- tmtc | 2 +- 13 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 mission/system/PlPcduAssembly.cpp create mode 100644 mission/system/PlPcduAssembly.h diff --git a/archive/gpio/gpioDefinitions.h b/archive/gpio/gpioDefinitions.h index 0db4db11..46050d12 100644 --- a/archive/gpio/gpioDefinitions.h +++ b/archive/gpio/gpioDefinitions.h @@ -8,13 +8,13 @@ using gpioId_t = uint16_t; namespace gpio { -enum Levels { LOW = 0, HIGH = 1 }; +enum class Levels : uint8_t { LOW = 0, HIGH = 1 }; -enum Direction { IN = 0, OUT = 1 }; +enum class Direction : uint8_t { IN = 0, OUT = 1 }; -enum GpioOperation { READ, WRITE }; +enum class GpioOperation { READ, WRITE }; -enum GpioTypes { NONE, GPIOD_REGULAR, CALLBACK }; +enum class GpioTypes { NONE, GPIOD_REGULAR, CALLBACK }; static constexpr gpioId_t NO_GPIO = -1; } // namespace gpio diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 492ac424..a9923a9d 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -373,7 +373,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI #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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -381,7 +381,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -389,7 +389,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -397,7 +397,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -405,7 +405,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -413,7 +413,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -421,7 +421,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -429,7 +429,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -437,7 +437,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -445,7 +445,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -453,7 +453,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -461,7 +461,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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); + spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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); @@ -485,7 +485,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI SusAssHelper susAssHelper = SusAssHelper(susIds); auto susAss = new SusAssembly(objects::SUS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, susAssHelper); - static_cast(susAss); + static_cast(susAss); #endif /* OBSW_ADD_SUN_SENSORS == 1 */ } diff --git a/common/config/devConf.h b/common/config/devConf.h index 8a35a0fa..73252e35 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -28,6 +28,7 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz. */ static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000; +static constexpr spi::SpiModes SUS_MAX_1227_MODE = spi::SpiModes::MODE_3; static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000; static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 93802bbf..f04a44e0 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 167 translations. * @details - * Generated on: 2022-03-22 10:19:12 + * Generated on: 2022-03-22 11:15:56 */ #include "translateEvents.h" diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 95f9cae1..96167528 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 114 translations. - * Generated on: 2022-03-22 10:13:27 + * Generated on: 2022-03-22 11:16:03 */ #include "translateObjects.h" diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 93802bbf..f04a44e0 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 167 translations. * @details - * Generated on: 2022-03-22 10:19:12 + * Generated on: 2022-03-22 11:15:56 */ #include "translateEvents.h" diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 95f9cae1..96167528 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 114 translations. - * Generated on: 2022-03-22 10:13:27 + * Generated on: 2022-03-22 11:16:03 */ #include "translateObjects.h" diff --git a/linux/obc/PdecHandler.cpp b/linux/obc/PdecHandler.cpp index f97c3965..b302d99e 100644 --- a/linux/obc/PdecHandler.cpp +++ b/linux/obc/PdecHandler.cpp @@ -24,7 +24,9 @@ PdecHandler::PdecHandler(object_id_t objectId, object_id_t tcDestinationId, uioRamMemory(uioRamMemory), uioRegisters(uioRegisters), actionHelper(this, nullptr) { - commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE); + auto mqArgs = MqArgs(objectId, static_cast(this)); + commandQueue = QueueFactory::instance()->createMessageQueue( + QUEUE_SIZE, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } PdecHandler::~PdecHandler() {} diff --git a/mission/system/PlPcduAssembly.cpp b/mission/system/PlPcduAssembly.cpp new file mode 100644 index 00000000..88403be2 --- /dev/null +++ b/mission/system/PlPcduAssembly.cpp @@ -0,0 +1 @@ +#include "PlPcduAssembly.h" diff --git a/mission/system/PlPcduAssembly.h b/mission/system/PlPcduAssembly.h new file mode 100644 index 00000000..d74a6693 --- /dev/null +++ b/mission/system/PlPcduAssembly.h @@ -0,0 +1,4 @@ +#ifndef MISSION_SYSTEM_PLPCDUASSEMBLY_H_ +#define MISSION_SYSTEM_PLPCDUASSEMBLY_H_ + +#endif /* MISSION_SYSTEM_PLPCDUASSEMBLY_H_ */ diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp index 3ecfde2b..438481a3 100644 --- a/mission/system/TcsSubsystem.cpp +++ b/mission/system/TcsSubsystem.cpp @@ -1 +1,20 @@ #include "TcsSubsystem.h" + +TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, TcsBoardHelper helper) + : SubsystemBase(objectId, parentId, MODE_OFF, 24), helper(helper) { +} + +ReturnValue_t TcsSubsystem::handleCommandMessage(CommandMessage *message) { + return RETURN_OK; +} + +void TcsSubsystem::performChildOperation() { +} + +ReturnValue_t TcsSubsystem::checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t *msToReachTheMode) { + return RETURN_OK; +} + +void TcsSubsystem::startTransition(Mode_t mode, Submode_t submode) { +} diff --git a/mission/system/TcsSubsystem.h b/mission/system/TcsSubsystem.h index a4849bc0..fe5bb3af 100644 --- a/mission/system/TcsSubsystem.h +++ b/mission/system/TcsSubsystem.h @@ -3,8 +3,26 @@ #include -class TcsSubsystem: SubsystemBase { +struct TcsBoardHelper { + TcsBoardHelper(std::array rtdIds): rtdIds(rtdIds) {} + std::array rtdIds = {}; +}; + +class TcsSubsystem: public SubsystemBase { +public: + TcsSubsystem(object_id_t objectId, object_id_t parentId, TcsBoardHelper helper); +private: + ReturnValue_t handleCommandMessage(CommandMessage *message) override; + + void performChildOperation() override; + + ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t *msToReachTheMode) override; + + void startTransition(Mode_t mode, Submode_t submode) override; + + TcsBoardHelper helper; }; #endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */ diff --git a/tmtc b/tmtc index 1b961371..c2bdb232 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 1b96137148217755c416c8e9554e82bdfe96d31f +Subproject commit c2bdb2326b14fd05e6360e05c3820bd44d75a9cc From 73e3d29ed08e6c0cca005ae453ec245f2e65f6c7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 14:30:42 +0100 Subject: [PATCH 02/14] added init function --- mission/system/TcsSubsystem.cpp | 3 +++ mission/system/TcsSubsystem.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp index 438481a3..0ff26c65 100644 --- a/mission/system/TcsSubsystem.cpp +++ b/mission/system/TcsSubsystem.cpp @@ -16,5 +16,8 @@ ReturnValue_t TcsSubsystem::checkModeCommand(Mode_t mode, Submode_t submode, return RETURN_OK; } +ReturnValue_t TcsSubsystem::initialize() { +} + void TcsSubsystem::startTransition(Mode_t mode, Submode_t submode) { } diff --git a/mission/system/TcsSubsystem.h b/mission/system/TcsSubsystem.h index fe5bb3af..f6c2481f 100644 --- a/mission/system/TcsSubsystem.h +++ b/mission/system/TcsSubsystem.h @@ -12,6 +12,9 @@ struct TcsBoardHelper { class TcsSubsystem: public SubsystemBase { public: TcsSubsystem(object_id_t objectId, object_id_t parentId, TcsBoardHelper helper); + + ReturnValue_t initialize() override; + private: ReturnValue_t handleCommandMessage(CommandMessage *message) override; From ce8253b9401377ac92df5555f1ca926ca7a32370 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 15:49:22 +0100 Subject: [PATCH 03/14] TCS subsystem continued --- bsp_q7s/core/ObjectFactory.cpp | 70 +++++++++----------- bsp_q7s/core/ObjectFactory.h | 3 +- fsfw | 2 +- mission/system/CMakeLists.txt | 1 + mission/system/DualLaneAssemblyBase.cpp | 10 +-- mission/system/DualLanePowerStateMachine.cpp | 61 +++++------------ mission/system/DualLanePowerStateMachine.h | 17 ++--- mission/system/PowerStateMachineBase.cpp | 33 +++++++++ mission/system/PowerStateMachineBase.h | 31 +++++++++ mission/system/TcsSubsystem.cpp | 35 ++++++---- mission/system/TcsSubsystem.h | 22 +++--- mission/system/definitions.h | 9 ++- 12 files changed, 167 insertions(+), 127 deletions(-) create mode 100644 mission/system/PowerStateMachineBase.cpp create mode 100644 mission/system/PowerStateMachineBase.h diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index a9923a9d..4d190b0b 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -324,7 +324,8 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) { #endif } -void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF* pwrSwitcher) { +void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF, + PowerSwitchIF* pwrSwitcher) { using namespace gpio; GpioCookie* gpioCookieSus = new GpioCookie(); GpioCallback* susgpio = nullptr; @@ -379,96 +380,85 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - susHandlers[7] = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie); + spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - susHandlers[9] = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie); + spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - susHandlers[10] = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie); + spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + 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::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); 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) { + for (auto& sus : susHandlers) { + if (sus != nullptr) { #if OBSW_TEST_SUS == 1 sus->setStartUpImmediately(); sus->setToGoToNormalMode(true); @@ -485,7 +475,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI SusAssHelper susAssHelper = SusAssHelper(susIds); auto susAss = new SusAssembly(objects::SUS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, susAssHelper); - static_cast(susAss); + static_cast(susAss); #endif /* OBSW_ADD_SUN_SENSORS == 1 */ } diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index fc5fc1d8..a3ee6a7a 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -18,7 +18,8 @@ void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF); void createTmpComponents(); void createRadSensorComponent(LinuxLibgpioIF* gpioComIF); -void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF* pwrSwitcher); +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 16f2fa93..d791fc87 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 16f2fa9327393ba8848817cc5a22497201c41d13 +Subproject commit d791fc87b7bba11c1baa68d544cd991028ff3330 diff --git a/mission/system/CMakeLists.txt b/mission/system/CMakeLists.txt index f29f5336..6c284620 100644 --- a/mission/system/CMakeLists.txt +++ b/mission/system/CMakeLists.txt @@ -7,6 +7,7 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE ComSubsystem.cpp TcsSubsystem.cpp DualLanePowerStateMachine.cpp + PowerStateMachineBase.cpp DualLaneAssemblyBase.cpp AcsBoardFdir.cpp diff --git a/mission/system/DualLaneAssemblyBase.cpp b/mission/system/DualLaneAssemblyBase.cpp index 3460d44f..fbd69d8f 100644 --- a/mission/system/DualLaneAssemblyBase.cpp +++ b/mission/system/DualLaneAssemblyBase.cpp @@ -63,8 +63,8 @@ bool DualLaneAssemblyBase::isUseable(object_id_t object, Mode_t mode) { } ReturnValue_t DualLaneAssemblyBase::pwrStateMachineWrapper() { - using namespace duallane; - OpCodes opCode = pwrStateMachine.powerStateMachine(); + using namespace power; + OpCodes opCode = pwrStateMachine.fsm(); if (customRecoveryStates == RecoveryCustomStates::IDLE) { if (opCode == OpCodes::NONE) { return RETURN_OK; @@ -163,7 +163,7 @@ void DualLaneAssemblyBase::handleModeTransitionFailed(ReturnValue_t result) { } bool DualLaneAssemblyBase::checkAndHandleRecovery() { - using namespace duallane; + using namespace power; OpCodes opCode = OpCodes::NONE; if (recoveryState == RECOVERY_IDLE) { return AssemblyBase::checkAndHandleRecovery(); @@ -173,14 +173,14 @@ bool DualLaneAssemblyBase::checkAndHandleRecovery() { customRecoveryStates = RecoveryCustomStates::POWER_SWITCHING_OFF; } if (customRecoveryStates == POWER_SWITCHING_OFF) { - opCode = pwrStateMachine.powerStateMachine(); + opCode = pwrStateMachine.fsm(); if (opCode == OpCodes::TO_OFF_DONE or opCode == OpCodes::TIMEOUT_OCCURED) { customRecoveryStates = RecoveryCustomStates::POWER_SWITCHING_ON; pwrStateMachine.start(targetMode, targetSubmode); } } if (customRecoveryStates == POWER_SWITCHING_ON) { - opCode = pwrStateMachine.powerStateMachine(); + opCode = pwrStateMachine.fsm(); if (opCode == OpCodes::TO_NOT_OFF_DONE or opCode == OpCodes::TIMEOUT_OCCURED) { customRecoveryStates = RecoveryCustomStates::DONE; } diff --git a/mission/system/DualLanePowerStateMachine.cpp b/mission/system/DualLanePowerStateMachine.cpp index e69f0310..666e1d1e 100644 --- a/mission/system/DualLanePowerStateMachine.cpp +++ b/mission/system/DualLanePowerStateMachine.cpp @@ -7,37 +7,16 @@ DualLanePowerStateMachine::DualLanePowerStateMachine(pcduSwitches::Switches swit pcduSwitches::Switches switchB, PowerSwitchIF* pwrSwitcher, dur_millis_t checkTimeout) - : SWITCH_A(switchA), SWITCH_B(switchB), pwrSwitcher(pwrSwitcher), checkTimeout(checkTimeout) {} + : PowerStateMachineBase(pwrSwitcher, checkTimeout), SWITCH_A(switchA), SWITCH_B(switchB) {} -void DualLanePowerStateMachine::setCheckTimeout(dur_millis_t timeout) { - checkTimeout.setTimeout(timeout); -} - -void DualLanePowerStateMachine::start(Mode_t mode, Submode_t submode) { - reset(); - checkTimeout.resetTimer(); - targetMode = mode; - targetSubmode = submode; - state = duallane::PwrStates::SWITCHING_POWER; -} - -duallane::PwrStates DualLanePowerStateMachine::getState() const { return state; } - -bool DualLanePowerStateMachine::active() { - if (state == duallane::PwrStates::IDLE or state == duallane::PwrStates::MODE_COMMANDING) { - return false; - } - return true; -} - -duallane::OpCodes DualLanePowerStateMachine::powerStateMachine() { +power::OpCodes DualLanePowerStateMachine::fsm() { using namespace duallane; ReturnValue_t switchStateA = RETURN_OK; ReturnValue_t switchStateB = RETURN_OK; - if (state == PwrStates::IDLE or state == PwrStates::MODE_COMMANDING) { + if (state == power::States::IDLE or state == power::States::MODE_COMMANDING) { return opResult; } - if (state == PwrStates::SWITCHING_POWER or state == PwrStates::CHECKING_POWER) { + if (state == power::States::SWITCHING_POWER or state == power::States::CHECKING_POWER) { switchStateA = pwrSwitcher->getSwitchState(SWITCH_A); switchStateB = pwrSwitcher->getSwitchState(SWITCH_B); } else { @@ -45,8 +24,8 @@ duallane::OpCodes DualLanePowerStateMachine::powerStateMachine() { } if (targetMode == HasModesIF::MODE_OFF) { if (switchStateA == PowerSwitchIF::SWITCH_OFF and switchStateB == PowerSwitchIF::SWITCH_OFF) { - state = PwrStates::IDLE; - opResult = OpCodes::TO_OFF_DONE; + state = power::States::IDLE; + opResult = power::OpCodes::TO_OFF_DONE; return opResult; } } else { @@ -54,8 +33,8 @@ duallane::OpCodes DualLanePowerStateMachine::powerStateMachine() { case (A_SIDE): { if (switchStateA == PowerSwitchIF::SWITCH_ON and switchStateB == PowerSwitchIF::SWITCH_OFF) { - state = PwrStates::MODE_COMMANDING; - opResult = OpCodes::TO_NOT_OFF_DONE; + state = power::States::MODE_COMMANDING; + opResult = power::OpCodes::TO_NOT_OFF_DONE; return opResult; } break; @@ -63,22 +42,22 @@ duallane::OpCodes DualLanePowerStateMachine::powerStateMachine() { case (B_SIDE): { if (switchStateA == PowerSwitchIF::SWITCH_OFF and switchStateB == PowerSwitchIF::SWITCH_ON) { - state = PwrStates::MODE_COMMANDING; - opResult = OpCodes::TO_NOT_OFF_DONE; + state = power::States::MODE_COMMANDING; + opResult = power::OpCodes::TO_NOT_OFF_DONE; return opResult; } break; } case (DUAL_MODE): { if (switchStateA == PowerSwitchIF::SWITCH_ON and switchStateB == PowerSwitchIF::SWITCH_ON) { - state = PwrStates::MODE_COMMANDING; - opResult = OpCodes::TO_NOT_OFF_DONE; + state = power::States::MODE_COMMANDING; + opResult = power::OpCodes::TO_NOT_OFF_DONE; return opResult; } } } } - if (state == PwrStates::SWITCHING_POWER) { + if (state == power::States::SWITCHING_POWER) { if (targetMode == HasModesIF::MODE_OFF) { if (switchStateA != PowerSwitchIF::SWITCH_OFF) { pwrSwitcher->sendSwitchCommand(SWITCH_A, PowerSwitchIF::SWITCH_OFF); @@ -121,20 +100,12 @@ duallane::OpCodes DualLanePowerStateMachine::powerStateMachine() { } } } - state = PwrStates::CHECKING_POWER; + state = power::States::CHECKING_POWER; } - if (state == PwrStates::CHECKING_POWER) { + if (state == power::States::CHECKING_POWER) { if (checkTimeout.hasTimedOut()) { - return OpCodes::TIMEOUT_OCCURED; + return power::OpCodes::TIMEOUT_OCCURED; } } return opResult; } - -void DualLanePowerStateMachine::reset() { - state = duallane::PwrStates::IDLE; - opResult = duallane::OpCodes::NONE; - targetMode = HasModesIF::MODE_OFF; - targetSubmode = 0; - checkTimeout.resetTimer(); -} diff --git a/mission/system/DualLanePowerStateMachine.h b/mission/system/DualLanePowerStateMachine.h index bf8679c4..e22e7ae4 100644 --- a/mission/system/DualLanePowerStateMachine.h +++ b/mission/system/DualLanePowerStateMachine.h @@ -3,32 +3,23 @@ #include #include +#include #include "definitions.h" class AssemblyBase; class PowerSwitchIF; -class DualLanePowerStateMachine : public HasReturnvaluesIF { +class DualLanePowerStateMachine : public PowerStateMachineBase { public: DualLanePowerStateMachine(pcduSwitches::Switches switchA, pcduSwitches::Switches switchB, PowerSwitchIF* pwrSwitcher, dur_millis_t checkTimeout = 5000); - void setCheckTimeout(dur_millis_t timeout); - void reset(); - void start(Mode_t mode, Submode_t submode); - bool active(); - duallane::PwrStates getState() const; - duallane::OpCodes powerStateMachine(); + power::OpCodes fsm() override; + const pcduSwitches::Switches SWITCH_A; const pcduSwitches::Switches SWITCH_B; private: - duallane::OpCodes opResult = duallane::OpCodes::NONE; - duallane::PwrStates state = duallane::PwrStates::IDLE; - PowerSwitchIF* pwrSwitcher = nullptr; - Mode_t targetMode = HasModesIF::MODE_OFF; - Submode_t targetSubmode = 0; - Countdown checkTimeout; }; #endif /* MISSION_SYSTEM_DUALLANEPOWERSTATEMACHINE_H_ */ diff --git a/mission/system/PowerStateMachineBase.cpp b/mission/system/PowerStateMachineBase.cpp new file mode 100644 index 00000000..37bd91f2 --- /dev/null +++ b/mission/system/PowerStateMachineBase.cpp @@ -0,0 +1,33 @@ +#include "PowerStateMachineBase.h" + +PowerStateMachineBase::PowerStateMachineBase(PowerSwitchIF *pwrSwitcher, dur_millis_t checkTimeout) + : pwrSwitcher(pwrSwitcher), checkTimeout(checkTimeout) {} + +void PowerStateMachineBase::reset() { + state = power::States::IDLE; + opResult = power::OpCodes::NONE; + targetMode = HasModesIF::MODE_OFF; + targetSubmode = 0; + checkTimeout.resetTimer(); +} + +void PowerStateMachineBase::setCheckTimeout(dur_millis_t timeout) { + checkTimeout.setTimeout(timeout); +} + +void PowerStateMachineBase::start(Mode_t mode, Submode_t submode) { + reset(); + checkTimeout.resetTimer(); + targetMode = mode; + targetSubmode = submode; + state = power::States::SWITCHING_POWER; +} + +power::States PowerStateMachineBase::getState() const { return state; } + +bool PowerStateMachineBase::active() { + if (state == power::States::IDLE or state == power::States::MODE_COMMANDING) { + return false; + } + return true; +} diff --git a/mission/system/PowerStateMachineBase.h b/mission/system/PowerStateMachineBase.h new file mode 100644 index 00000000..3adeebb6 --- /dev/null +++ b/mission/system/PowerStateMachineBase.h @@ -0,0 +1,31 @@ +#ifndef MISSION_SYSTEM_POWERSTATEMACHINE_H_ +#define MISSION_SYSTEM_POWERSTATEMACHINE_H_ + +#include +#include +#include + +#include "definitions.h" + +class PowerStateMachineBase : public HasReturnvaluesIF { + public: + PowerStateMachineBase(PowerSwitchIF* pwrSwitcher, dur_millis_t checkTimeout); + + virtual power::OpCodes fsm() = 0; + + void setCheckTimeout(dur_millis_t timeout); + void reset(); + void start(Mode_t mode, Submode_t submode); + bool active(); + power::States getState() const; + + protected: + power::OpCodes opResult = power::OpCodes::NONE; + power::States state = power::States::IDLE; + PowerSwitchIF* pwrSwitcher = nullptr; + Mode_t targetMode = HasModesIF::MODE_OFF; + Submode_t targetSubmode = 0; + Countdown checkTimeout; +}; + +#endif /* MISSION_SYSTEM_POWERSTATEMACHINE_H_ */ diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp index 0ff26c65..71b22c2d 100644 --- a/mission/system/TcsSubsystem.cpp +++ b/mission/system/TcsSubsystem.cpp @@ -1,23 +1,34 @@ #include "TcsSubsystem.h" -TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, TcsBoardHelper helper) - : SubsystemBase(objectId, parentId, MODE_OFF, 24), helper(helper) { -} +#include -ReturnValue_t TcsSubsystem::handleCommandMessage(CommandMessage *message) { - return RETURN_OK; -} +TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, + power::Switch_t theSwitch, TcsBoardHelper helper) + : SubsystemBase(objectId, parentId, MODE_OFF, 24), + switcher(pwrSwitcher, theSwitch), + helper(helper) {} -void TcsSubsystem::performChildOperation() { -} +ReturnValue_t TcsSubsystem::handleCommandMessage(CommandMessage* message) { return RETURN_OK; } + +void TcsSubsystem::performChildOperation() {} ReturnValue_t TcsSubsystem::checkModeCommand(Mode_t mode, Submode_t submode, - uint32_t *msToReachTheMode) { - return RETURN_OK; + uint32_t* msToReachTheMode) { + if (mode == MODE_ON or mode == MODE_OFF or mode == DeviceHandlerIF::MODE_NORMAL) { + return RETURN_OK; + } + return HasModesIF::INVALID_MODE; } ReturnValue_t TcsSubsystem::initialize() { + ReturnValue_t result = RETURN_OK; + for (const auto& obj : helper.rtdIds) { + result = registerChild(obj); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + } + return SubsystemBase::initialize(); } -void TcsSubsystem::startTransition(Mode_t mode, Submode_t submode) { -} +void TcsSubsystem::startTransition(Mode_t mode, Submode_t submode) {} diff --git a/mission/system/TcsSubsystem.h b/mission/system/TcsSubsystem.h index f6c2481f..7ccf51cf 100644 --- a/mission/system/TcsSubsystem.h +++ b/mission/system/TcsSubsystem.h @@ -1,31 +1,37 @@ #ifndef MISSION_SYSTEM_TCSSUBSYSTEM_H_ #define MISSION_SYSTEM_TCSSUBSYSTEM_H_ +#include +#include #include struct TcsBoardHelper { - TcsBoardHelper(std::array rtdIds): rtdIds(rtdIds) {} + TcsBoardHelper(std::array rtdIds) : rtdIds(rtdIds) {} std::array rtdIds = {}; }; -class TcsSubsystem: public SubsystemBase { -public: - TcsSubsystem(object_id_t objectId, object_id_t parentId, TcsBoardHelper helper); +class TcsSubsystem : public SubsystemBase { + public: + TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF *pwrSwitcher, + power::Switch_t switcher, TcsBoardHelper helper); ReturnValue_t initialize() override; -private: + private: + static constexpr uint8_t NUMBER_RTDS = 16; + PowerSwitcher switcher; + TcsBoardHelper helper; + FixedArrayList modeTable; + ReturnValue_t handleCommandMessage(CommandMessage *message) override; void performChildOperation() override; ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, - uint32_t *msToReachTheMode) override; + uint32_t *msToReachTheMode) override; void startTransition(Mode_t mode, Submode_t submode) override; - - TcsBoardHelper helper; }; #endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */ diff --git a/mission/system/definitions.h b/mission/system/definitions.h index 8b22e1f4..aee127bb 100644 --- a/mission/system/definitions.h +++ b/mission/system/definitions.h @@ -3,10 +3,15 @@ #include +namespace power { + +enum class States { IDLE, SWITCHING_POWER, CHECKING_POWER, MODE_COMMANDING }; +enum class OpCodes { NONE, TO_OFF_DONE, TO_NOT_OFF_DONE, TIMEOUT_OCCURED }; + +} // namespace power + namespace duallane { -enum class PwrStates { IDLE, SWITCHING_POWER, CHECKING_POWER, MODE_COMMANDING }; -enum class OpCodes { NONE, TO_OFF_DONE, TO_NOT_OFF_DONE, TIMEOUT_OCCURED }; enum Submodes : Submode_t { A_SIDE = 0, B_SIDE = 1, DUAL_MODE = 2 }; } // namespace duallane From c184385e1241c18f3cee56fe74919268a8b8ebc5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 15:55:30 +0100 Subject: [PATCH 04/14] hmm this is awkward --- fsfw | 2 +- mission/system/TcsSubsystem.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/fsfw b/fsfw index d791fc87..6dd6f28d 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit d791fc87b7bba11c1baa68d544cd991028ff3330 +Subproject commit 6dd6f28db0259ec37c351a81ee8d26696f47118a diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp index 71b22c2d..2d697d61 100644 --- a/mission/system/TcsSubsystem.cpp +++ b/mission/system/TcsSubsystem.cpp @@ -10,7 +10,12 @@ TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwit ReturnValue_t TcsSubsystem::handleCommandMessage(CommandMessage* message) { return RETURN_OK; } -void TcsSubsystem::performChildOperation() {} +void TcsSubsystem::performChildOperation() { + switcher.doStateMachine(); + if (not switcher.active()) { + + } +} ReturnValue_t TcsSubsystem::checkModeCommand(Mode_t mode, Submode_t submode, uint32_t* msToReachTheMode) { From 1ebd92a17eccbc1eda335cd395a75df483786f30 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 17:58:05 +0100 Subject: [PATCH 05/14] derive from ASS base instead --- fsfw | 2 +- mission/system/TcsSubsystem.cpp | 8 ++------ mission/system/TcsSubsystem.h | 16 +++++++--------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/fsfw b/fsfw index 6dd6f28d..bbe21e7e 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 6dd6f28db0259ec37c351a81ee8d26696f47118a +Subproject commit bbe21e7e8957a39e6697c6dd4fb2fe044b560044 diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp index 2d697d61..bddd8398 100644 --- a/mission/system/TcsSubsystem.cpp +++ b/mission/system/TcsSubsystem.cpp @@ -4,16 +4,14 @@ TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, power::Switch_t theSwitch, TcsBoardHelper helper) - : SubsystemBase(objectId, parentId, MODE_OFF, 24), + : AssemblyBase(objectId, parentId, 24), switcher(pwrSwitcher, theSwitch), helper(helper) {} -ReturnValue_t TcsSubsystem::handleCommandMessage(CommandMessage* message) { return RETURN_OK; } - void TcsSubsystem::performChildOperation() { switcher.doStateMachine(); if (not switcher.active()) { - + AssemblyBase::performChildOperation(); } } @@ -35,5 +33,3 @@ ReturnValue_t TcsSubsystem::initialize() { } return SubsystemBase::initialize(); } - -void TcsSubsystem::startTransition(Mode_t mode, Submode_t submode) {} diff --git a/mission/system/TcsSubsystem.h b/mission/system/TcsSubsystem.h index 7ccf51cf..7d023b5b 100644 --- a/mission/system/TcsSubsystem.h +++ b/mission/system/TcsSubsystem.h @@ -2,8 +2,8 @@ #define MISSION_SYSTEM_TCSSUBSYSTEM_H_ #include +#include #include -#include struct TcsBoardHelper { TcsBoardHelper(std::array rtdIds) : rtdIds(rtdIds) {} @@ -11,27 +11,25 @@ struct TcsBoardHelper { std::array rtdIds = {}; }; -class TcsSubsystem : public SubsystemBase { +class TcsSubsystem : public AssemblyBase { public: TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF *pwrSwitcher, power::Switch_t switcher, TcsBoardHelper helper); ReturnValue_t initialize() override; + void performChildOperation() override; private: static constexpr uint8_t NUMBER_RTDS = 16; PowerSwitcher switcher; TcsBoardHelper helper; FixedArrayList modeTable; - ReturnValue_t handleCommandMessage(CommandMessage *message) override; - - void performChildOperation() override; - + ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override; + ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; + ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, - uint32_t *msToReachTheMode) override; - - void startTransition(Mode_t mode, Submode_t submode) override; + uint32_t* msToReachTheMode) override; }; #endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */ From e95d25db66949c93c54a3d733fab0d792da55293 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 18:00:05 +0100 Subject: [PATCH 06/14] merge develop and apply afmt --- mission/system/TcsSubsystem.cpp | 4 +--- mission/system/TcsSubsystem.h | 5 +++-- tmtc | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp index bddd8398..c3e5724f 100644 --- a/mission/system/TcsSubsystem.cpp +++ b/mission/system/TcsSubsystem.cpp @@ -4,9 +4,7 @@ TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, power::Switch_t theSwitch, TcsBoardHelper helper) - : AssemblyBase(objectId, parentId, 24), - switcher(pwrSwitcher, theSwitch), - helper(helper) {} + : AssemblyBase(objectId, parentId, 24), switcher(pwrSwitcher, theSwitch), helper(helper) {} void TcsSubsystem::performChildOperation() { switcher.doStateMachine(); diff --git a/mission/system/TcsSubsystem.h b/mission/system/TcsSubsystem.h index 7d023b5b..f7e160bd 100644 --- a/mission/system/TcsSubsystem.h +++ b/mission/system/TcsSubsystem.h @@ -13,12 +13,13 @@ struct TcsBoardHelper { class TcsSubsystem : public AssemblyBase { public: - TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF *pwrSwitcher, + TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, power::Switch_t switcher, TcsBoardHelper helper); ReturnValue_t initialize() override; void performChildOperation() override; + private: static constexpr uint8_t NUMBER_RTDS = 16; PowerSwitcher switcher; @@ -29,7 +30,7 @@ class TcsSubsystem : public AssemblyBase { ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, - uint32_t* msToReachTheMode) override; + uint32_t* msToReachTheMode) override; }; #endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */ diff --git a/tmtc b/tmtc index c2bdb232..46c32710 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit c2bdb2326b14fd05e6360e05c3820bd44d75a9cc +Subproject commit 46c327101e24d61452ddb1cd3dd09cab87674abb From 14d9efce1f883f22940ea5c6277321a09b0fbec1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 18:48:03 +0100 Subject: [PATCH 07/14] continued tcs board assembly --- common/config/commonObjects.h | 3 +- mission/system/CMakeLists.txt | 4 +- mission/system/DualLaneAssemblyBase.h | 2 +- mission/system/RtdFdir.cpp | 6 + mission/system/RtdFdir.h | 11 ++ mission/system/TcsBoardAssembly.cpp | 158 ++++++++++++++++++ .../{TcsSubsystem.h => TcsBoardAssembly.h} | 24 ++- mission/system/TcsSubsystem.cpp | 33 ---- 8 files changed, 199 insertions(+), 42 deletions(-) create mode 100644 mission/system/RtdFdir.cpp create mode 100644 mission/system/RtdFdir.h create mode 100644 mission/system/TcsBoardAssembly.cpp rename mission/system/{TcsSubsystem.h => TcsBoardAssembly.h} (54%) delete mode 100644 mission/system/TcsSubsystem.cpp diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h index 1743dcf7..2e7c8411 100644 --- a/common/config/commonObjects.h +++ b/common/config/commonObjects.h @@ -94,7 +94,8 @@ enum commonObjects: uint32_t { // 0x73 ('s') for assemblies and system/subsystem components ACS_BOARD_ASS = 0x73000001, - SUS_BOARD_ASS = 0x73000002 + SUS_BOARD_ASS = 0x73000002, + TCS_BOARD_ASS = 0x73000003 }; } diff --git a/mission/system/CMakeLists.txt b/mission/system/CMakeLists.txt index 6c284620..27637339 100644 --- a/mission/system/CMakeLists.txt +++ b/mission/system/CMakeLists.txt @@ -2,14 +2,14 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE AcsBoardAssembly.cpp SusAssembly.cpp AcsSubsystem.cpp - TcsSubsystem.cpp EiveSystem.cpp ComSubsystem.cpp - TcsSubsystem.cpp DualLanePowerStateMachine.cpp PowerStateMachineBase.cpp DualLaneAssemblyBase.cpp + TcsBoardAssembly.cpp AcsBoardFdir.cpp SusFdir.cpp + RtdFdir.cpp ) \ No newline at end of file diff --git a/mission/system/DualLaneAssemblyBase.h b/mission/system/DualLaneAssemblyBase.h index f62c521d..e0996848 100644 --- a/mission/system/DualLaneAssemblyBase.h +++ b/mission/system/DualLaneAssemblyBase.h @@ -69,7 +69,7 @@ class DualLaneAssemblyBase : public AssemblyBase, public ConfirmsFailuresIF { virtual void startTransition(Mode_t mode, Submode_t submode) override; virtual void handleChildrenLostMode(ReturnValue_t result) override; virtual void handleModeTransitionFailed(ReturnValue_t result) override; - virtual void handleModeReached(); + virtual void handleModeReached() override; MessageQueueId_t getEventReceptionQueue() override; diff --git a/mission/system/RtdFdir.cpp b/mission/system/RtdFdir.cpp new file mode 100644 index 00000000..f4f9806e --- /dev/null +++ b/mission/system/RtdFdir.cpp @@ -0,0 +1,6 @@ +#include "RtdFdir.h" + +#include + +RtdFdir::RtdFdir(object_id_t sensorId) + : DeviceHandlerFailureIsolation(sensorId, objects::TCS_BOARD_ASS) {} diff --git a/mission/system/RtdFdir.h b/mission/system/RtdFdir.h new file mode 100644 index 00000000..1dedbb82 --- /dev/null +++ b/mission/system/RtdFdir.h @@ -0,0 +1,11 @@ +#ifndef MISSION_SYSTEM_RTDFDIR_H_ +#define MISSION_SYSTEM_RTDFDIR_H_ + +#include + +class RtdFdir : public DeviceHandlerFailureIsolation { + public: + RtdFdir(object_id_t sensorId); +}; + +#endif /* MISSION_SYSTEM_RTDFDIR_H_ */ diff --git a/mission/system/TcsBoardAssembly.cpp b/mission/system/TcsBoardAssembly.cpp new file mode 100644 index 00000000..71964a3c --- /dev/null +++ b/mission/system/TcsBoardAssembly.cpp @@ -0,0 +1,158 @@ +#include "TcsBoardAssembly.h" + +#include +#include + +TcsBoardAssembly::TcsBoardAssembly(object_id_t objectId, object_id_t parentId, + PowerSwitchIF* pwrSwitcher, power::Switch_t theSwitch, + TcsBoardHelper helper) + : AssemblyBase(objectId, parentId, 24), switcher(pwrSwitcher, theSwitch), helper(helper) { + eventQueue = QueueFactory::instance()->createMessageQueue(24); +} + +void TcsBoardAssembly::performChildOperation() { + auto state = switcher.getState(); + if (state != PowerSwitcher::WAIT_OFF and state != PowerSwitcher::WAIT_ON) { + AssemblyBase::performChildOperation(); + return; + } + switcher.doStateMachine(); + if (state == PowerSwitcher::WAIT_OFF and switcher.getState() == PowerSwitcher::SWITCH_IS_OFF) { + // Indicator that a transition to off is finished + AssemblyBase::handleModeReached(); + } else if (state == PowerSwitcher::WAIT_ON and + switcher.getState() == PowerSwitcher::SWITCH_IS_ON) { + // Indicator that mode commanding can be performed now + AssemblyBase::performChildOperation(); + } +} + +ReturnValue_t TcsBoardAssembly::commandChildren(Mode_t mode, Submode_t submode) { + ReturnValue_t result = RETURN_OK; + // Initialize the mode table to ensure all devices are in a defined state + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + modeTable[idx].setMode(MODE_OFF); + modeTable[idx].setSubmode(SUBMODE_NONE); + } + if (recoveryState != RecoveryState::RECOVERY_STARTED) { + if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) { + result = handleNormalOrOnModeCmd(mode, submode); + } + } + HybridIterator tableIter(modeTable.begin(), modeTable.end()); + executeTable(tableIter); + return result; +} + +ReturnValue_t TcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) { + uint8_t devsInWrongMode = 0; + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + if (childrenMap[idx].mode != wantedMode) { + devsInWrongMode++; + } + } + // TODO: Can't really do something other than power cycling if devices in wrong mode. + // Might attempt one power-cycle. In any case, trigger an event + return RETURN_OK; +} + +ReturnValue_t TcsBoardAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) { + if (mode == MODE_ON or mode == MODE_OFF or mode == DeviceHandlerIF::MODE_NORMAL) { + return RETURN_OK; + } + return HasModesIF::INVALID_MODE; +} + +ReturnValue_t TcsBoardAssembly::initialize() { + ReturnValue_t result = RETURN_OK; + for (const auto& obj : helper.rtdIds) { + result = registerChild(obj); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + } + return SubsystemBase::initialize(); +} + +void TcsBoardAssembly::startTransition(Mode_t mode, Submode_t submode) { + if (mode != MODE_OFF) { + switcher.turnOn(); + switcher.doStateMachine(); + if (switcher.getState() == PowerSwitcher::SWITCH_IS_ON) { + AssemblyBase::startTransition(mode, submode); + } else { + // Need to wait with mode commanding until power switcher is done + targetMode = mode; + targetSubmode = submode; + } + } else { + AssemblyBase::startTransition(mode, submode); + } +} + +ReturnValue_t TcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode) { + ReturnValue_t result = RETURN_OK; + bool needsSecondStep = false; + Mode_t devMode = 0; + object_id_t objId = 0; + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + devMode = childrenMap[idx].mode; + objId = helper.rtdIds[idx]; + if (mode == devMode) { + modeTable[idx].setMode(mode); + } else if (mode == DeviceHandlerIF::MODE_NORMAL) { + if (isUseable(objId, devMode)) { + if (devMode == MODE_ON) { + modeTable[idx].setMode(mode); + modeTable[idx].setSubmode(SUBMODE_NONE); + } else { + modeTable[idx].setMode(MODE_ON); + modeTable[idx].setSubmode(SUBMODE_NONE); + if (internalState != STATE_SECOND_STEP) { + needsSecondStep = true; + } + } + } + } else if (mode == MODE_ON) { + if (isUseable(objId, devMode)) { + modeTable[idx].setMode(MODE_ON); + modeTable[idx].setSubmode(SUBMODE_NONE); + } + } + } + if (needsSecondStep) { + result = NEED_SECOND_STEP; + } + return result; +} + +bool TcsBoardAssembly::isUseable(object_id_t object, Mode_t mode) { + if (healthHelper.healthTable->isFaulty(object)) { + return false; + } + + // Check if device is already in target mode + if (childrenMap[object].mode == mode) { + return true; + } + + if (healthHelper.healthTable->isCommandable(object)) { + return true; + } + return false; +} + +MessageQueueId_t TcsBoardAssembly::getEventReceptionQueue() { return eventQueue->getId(); } + +void TcsBoardAssembly::handleModeReached() { + if (targetMode == MODE_OFF) { + switcher.turnOff(); + switcher.doStateMachine(); + // Need to wait with call to AssemblyBase::handleModeReached until power switcher is done + if (switcher.getState() == PowerSwitcher::SWITCH_IS_OFF) { + AssemblyBase::handleModeReached(); + } + } else { + AssemblyBase::handleModeReached(); + } +} diff --git a/mission/system/TcsSubsystem.h b/mission/system/TcsBoardAssembly.h similarity index 54% rename from mission/system/TcsSubsystem.h rename to mission/system/TcsBoardAssembly.h index f7e160bd..f3f32164 100644 --- a/mission/system/TcsSubsystem.h +++ b/mission/system/TcsBoardAssembly.h @@ -11,10 +11,10 @@ struct TcsBoardHelper { std::array rtdIds = {}; }; -class TcsSubsystem : public AssemblyBase { +class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF { public: - TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, - power::Switch_t switcher, TcsBoardHelper helper); + TcsBoardAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, + power::Switch_t switcher, TcsBoardHelper helper); ReturnValue_t initialize() override; @@ -25,12 +25,26 @@ class TcsSubsystem : public AssemblyBase { PowerSwitcher switcher; TcsBoardHelper helper; FixedArrayList modeTable; + MessageQueueIF* eventQueue = nullptr; + ReturnValue_t handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode); + /** + * Check whether it makes sense to send mode commands to the device + * @param object + * @param mode + * @return + */ + bool isUseable(object_id_t object, Mode_t mode); + + // ConfirmFailureIF implementation + MessageQueueId_t getEventReceptionQueue() override; + + // AssemblyBase implementation ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override; ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; - ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, - uint32_t* msToReachTheMode) override; + void startTransition(Mode_t mode, Submode_t submode) override; + void handleModeReached() override; }; #endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */ diff --git a/mission/system/TcsSubsystem.cpp b/mission/system/TcsSubsystem.cpp deleted file mode 100644 index c3e5724f..00000000 --- a/mission/system/TcsSubsystem.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "TcsSubsystem.h" - -#include - -TcsSubsystem::TcsSubsystem(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, - power::Switch_t theSwitch, TcsBoardHelper helper) - : AssemblyBase(objectId, parentId, 24), switcher(pwrSwitcher, theSwitch), helper(helper) {} - -void TcsSubsystem::performChildOperation() { - switcher.doStateMachine(); - if (not switcher.active()) { - AssemblyBase::performChildOperation(); - } -} - -ReturnValue_t TcsSubsystem::checkModeCommand(Mode_t mode, Submode_t submode, - uint32_t* msToReachTheMode) { - if (mode == MODE_ON or mode == MODE_OFF or mode == DeviceHandlerIF::MODE_NORMAL) { - return RETURN_OK; - } - return HasModesIF::INVALID_MODE; -} - -ReturnValue_t TcsSubsystem::initialize() { - ReturnValue_t result = RETURN_OK; - for (const auto& obj : helper.rtdIds) { - result = registerChild(obj); - if (result != HasReturnvaluesIF::RETURN_OK) { - return result; - } - } - return SubsystemBase::initialize(); -} From 5b7dd7c432c180f7e31e423dc695abc68ce1d1e9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 19:10:28 +0100 Subject: [PATCH 08/14] assign rtd fdir , create TCS BOARD ASS --- bsp_q7s/core/ObjectFactory.cpp | 188 ++++++++++----------------------- bsp_q7s/core/ObjectFactory.h | 2 +- 2 files changed, 54 insertions(+), 136 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 4d190b0b..a499363c 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -7,8 +7,10 @@ #include #include #include +#include #include #include +#include #include "OBSWConfig.h" #include "bsp_q7s/boardtest/Q7STestTask.h" @@ -150,7 +152,7 @@ void ObjectFactory::produce(void* args) { #if OBSW_ADD_SYRLINKS == 1 createSyrlinksComponents(); #endif /* OBSW_ADD_SYRLINKS == 1 */ - createRtdComponents(gpioComIF); + createRtdComponents(gpioComIF, pwrSwitcher); #if OBSW_ADD_MGT == 1 I2cCookie* imtqI2cCookie = @@ -824,7 +826,7 @@ void ObjectFactory::createSyrlinksComponents() { new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF, syrlinksUartCookie); } -void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) { +void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher) { using namespace gpio; GpioCookie* rtdGpioCookie = new GpioCookie; @@ -879,142 +881,58 @@ void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) { gpioComIF->addGpios(rtdGpioCookie); + static constexpr uint8_t NUMBER_RTDS = 16; #if OBSW_ADD_RTD_DEVICES == 1 - SpiCookie* spiRtdIc0 = - new SpiCookie(addresses::RTD_IC_3, gpioIds::RTD_IC_3, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc1 = - new SpiCookie(addresses::RTD_IC_4, gpioIds::RTD_IC_4, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc2 = - new SpiCookie(addresses::RTD_IC_5, gpioIds::RTD_IC_5, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc3 = - new SpiCookie(addresses::RTD_IC_6, gpioIds::RTD_IC_6, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc4 = - new SpiCookie(addresses::RTD_IC_7, gpioIds::RTD_IC_7, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc5 = - new SpiCookie(addresses::RTD_IC_8, gpioIds::RTD_IC_8, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc6 = - new SpiCookie(addresses::RTD_IC_9, gpioIds::RTD_IC_9, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc7 = - new SpiCookie(addresses::RTD_IC_10, gpioIds::RTD_IC_10, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc8 = - new SpiCookie(addresses::RTD_IC_11, gpioIds::RTD_IC_11, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc9 = - new SpiCookie(addresses::RTD_IC_12, gpioIds::RTD_IC_12, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc10 = - new SpiCookie(addresses::RTD_IC_13, gpioIds::RTD_IC_13, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc11 = - new SpiCookie(addresses::RTD_IC_14, gpioIds::RTD_IC_14, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc12 = - new SpiCookie(addresses::RTD_IC_15, gpioIds::RTD_IC_15, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc13 = - new SpiCookie(addresses::RTD_IC_16, gpioIds::RTD_IC_16, std::string(q7s::SPI_DEFAULT_DEV), - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc14 = - new SpiCookie(addresses::RTD_IC_17, gpioIds::RTD_IC_17, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - SpiCookie* spiRtdIc15 = - new SpiCookie(addresses::RTD_IC_18, gpioIds::RTD_IC_18, q7s::SPI_DEFAULT_DEV, - Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); - - Max31865PT1000Handler* rtdIc0 = - new Max31865PT1000Handler(objects::RTD_IC_3, objects::SPI_COM_IF, spiRtdIc0); - Max31865PT1000Handler* rtdIc1 = - new Max31865PT1000Handler(objects::RTD_IC_4, objects::SPI_COM_IF, spiRtdIc1); - Max31865PT1000Handler* rtdIc2 = - new Max31865PT1000Handler(objects::RTD_IC_5, objects::SPI_COM_IF, spiRtdIc2); - Max31865PT1000Handler* rtdIc3 = - new Max31865PT1000Handler(objects::RTD_IC_6, objects::SPI_COM_IF, spiRtdIc3); - Max31865PT1000Handler* rtdIc4 = - new Max31865PT1000Handler(objects::RTD_IC_7, objects::SPI_COM_IF, spiRtdIc4); - Max31865PT1000Handler* rtdIc5 = - new Max31865PT1000Handler(objects::RTD_IC_8, objects::SPI_COM_IF, spiRtdIc5); - Max31865PT1000Handler* rtdIc6 = - new Max31865PT1000Handler(objects::RTD_IC_9, objects::SPI_COM_IF, spiRtdIc6); - Max31865PT1000Handler* rtdIc7 = - new Max31865PT1000Handler(objects::RTD_IC_10, objects::SPI_COM_IF, spiRtdIc7); - Max31865PT1000Handler* rtdIc8 = - new Max31865PT1000Handler(objects::RTD_IC_11, objects::SPI_COM_IF, spiRtdIc8); - Max31865PT1000Handler* rtdIc9 = - new Max31865PT1000Handler(objects::RTD_IC_12, objects::SPI_COM_IF, spiRtdIc9); - Max31865PT1000Handler* rtdIc10 = - new Max31865PT1000Handler(objects::RTD_IC_13, objects::SPI_COM_IF, spiRtdIc10); - Max31865PT1000Handler* rtdIc11 = - new Max31865PT1000Handler(objects::RTD_IC_14, objects::SPI_COM_IF, spiRtdIc11); - Max31865PT1000Handler* rtdIc12 = - new Max31865PT1000Handler(objects::RTD_IC_15, objects::SPI_COM_IF, spiRtdIc12); - Max31865PT1000Handler* rtdIc13 = - new Max31865PT1000Handler(objects::RTD_IC_16, objects::SPI_COM_IF, spiRtdIc13); - Max31865PT1000Handler* rtdIc14 = - new Max31865PT1000Handler(objects::RTD_IC_17, objects::SPI_COM_IF, spiRtdIc14); - Max31865PT1000Handler* rtdIc15 = - new Max31865PT1000Handler(objects::RTD_IC_18, objects::SPI_COM_IF, spiRtdIc15); + std::array, NUMBER_RTDS> cookieArgs = {{ + {addresses::RTD_IC_3, gpioIds::RTD_IC_3}, + {addresses::RTD_IC_4, gpioIds::RTD_IC_4}, + {addresses::RTD_IC_5, gpioIds::RTD_IC_5}, + {addresses::RTD_IC_6, gpioIds::RTD_IC_6}, + {addresses::RTD_IC_7, gpioIds::RTD_IC_7}, + {addresses::RTD_IC_8, gpioIds::RTD_IC_8}, + {addresses::RTD_IC_9, gpioIds::RTD_IC_9}, + {addresses::RTD_IC_10, gpioIds::RTD_IC_10}, + {addresses::RTD_IC_11, gpioIds::RTD_IC_11}, + {addresses::RTD_IC_12, gpioIds::RTD_IC_12}, + {addresses::RTD_IC_13, gpioIds::RTD_IC_13}, + {addresses::RTD_IC_14, gpioIds::RTD_IC_14}, + {addresses::RTD_IC_15, gpioIds::RTD_IC_15}, + {addresses::RTD_IC_16, gpioIds::RTD_IC_16}, + {addresses::RTD_IC_17, gpioIds::RTD_IC_17}, + {addresses::RTD_IC_18, gpioIds::RTD_IC_18}, + }}; + std::array rtdIds = { + objects::RTD_IC_3, objects::RTD_IC_4, objects::RTD_IC_5, objects::RTD_IC_6, + objects::RTD_IC_7, objects::RTD_IC_8, objects::RTD_IC_9, objects::RTD_IC_10, + objects::RTD_IC_11, objects::RTD_IC_12, objects::RTD_IC_13, objects::RTD_IC_14, + objects::RTD_IC_15, objects::RTD_IC_16, objects::RTD_IC_17, objects::RTD_IC_18}; + std::array rtdCookies = {}; + std::array rtds = {}; + RtdFdir* rtdFdir = nullptr; + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + rtdCookies[idx] = + new SpiCookie(cookieArgs[idx].first, cookieArgs[idx].second, q7s::SPI_DEFAULT_DEV, + Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); + rtds[idx] = new Max31865PT1000Handler(rtdIds[idx], objects::SPI_COM_IF, rtdCookies[idx]); + rtds[idx]->setParent(objects::TCS_BOARD_ASS); + rtdFdir = new RtdFdir(rtdIds[idx]); + rtds[idx]->setCustomFdir(rtdFdir); + } #if OBSW_TEST_RTD == 1 - rtdIc0->setStartUpImmediately(); - rtdIc1->setStartUpImmediately(); - rtdIc2->setStartUpImmediately(); - rtdIc3->setStartUpImmediately(); - rtdIc4->setStartUpImmediately(); - rtdIc5->setStartUpImmediately(); - rtdIc6->setStartUpImmediately(); - rtdIc7->setStartUpImmediately(); - rtdIc8->setStartUpImmediately(); - rtdIc9->setStartUpImmediately(); - rtdIc10->setStartUpImmediately(); - rtdIc11->setStartUpImmediately(); - rtdIc12->setStartUpImmediately(); - rtdIc13->setStartUpImmediately(); - rtdIc14->setStartUpImmediately(); - rtdIc15->setStartUpImmediately(); - - rtdIc0->setInstantNormal(true); - rtdIc1->setInstantNormal(true); - rtdIc2->setInstantNormal(true); - rtdIc3->setInstantNormal(true); - rtdIc4->setInstantNormal(true); - rtdIc5->setInstantNormal(true); - rtdIc6->setInstantNormal(true); - rtdIc7->setInstantNormal(true); - rtdIc8->setInstantNormal(true); - rtdIc9->setInstantNormal(true); - rtdIc10->setInstantNormal(true); - rtdIc11->setInstantNormal(true); - rtdIc12->setInstantNormal(true); - rtdIc13->setInstantNormal(true); - rtdIc14->setInstantNormal(true); - rtdIc15->setInstantNormal(true); -#endif - - static_cast(rtdIc0); - static_cast(rtdIc1); - static_cast(rtdIc2); - static_cast(rtdIc3); - static_cast(rtdIc4); - static_cast(rtdIc5); - static_cast(rtdIc6); - static_cast(rtdIc7); - static_cast(rtdIc8); - static_cast(rtdIc9); - static_cast(rtdIc10); - static_cast(rtdIc11); - static_cast(rtdIc12); - static_cast(rtdIc13); - static_cast(rtdIc14); - static_cast(rtdIc15); -#endif + for (auto& rtd : rtds) { + if (rtd != nullptr) { + rtd->setStartUpImmediately(); + rtd->setInstantNormal(true); + } + } +#endif // OBSW_TEST_RTD == 1 + TcsBoardHelper helper(rtdIds); + TcsBoardAssembly* tcsBoardAss = + new TcsBoardAssembly(objects::TCS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, + pcduSwitches::Switches::PDU1_CH0_TCS_BOARD_3V3, helper); + static_cast(tcsBoardAss); +#endif // OBSW_ADD_RTD_DEVICES == 1 } void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) { diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index a3ee6a7a..ff88db8e 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -25,7 +25,7 @@ void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF, void createHeaterComponents(); void createSolarArrayDeploymentComponents(); void createSyrlinksComponents(); -void createRtdComponents(LinuxLibgpioIF* gpioComIF); +void createRtdComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher); void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF); void createCcsdsComponents(LinuxLibgpioIF* gpioComIF); void createTestComponents(LinuxLibgpioIF* gpioComIF); From 4afacbe82b75e7d2f69c3e6d81b8ef47a99cb09f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 19:15:13 +0100 Subject: [PATCH 09/14] new system ctl task --- bsp_q7s/core/InitMission.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index df0e096f..689d8404 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -117,20 +117,28 @@ void initmission::initTasks() { #if OBSW_ADD_ACS_HANDLERS == 1 PeriodicTaskIF* acsTask = factory->createPeriodicTask( - "ACS_CTRL", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc); + "ACS_CTRL", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc); result = acsTask->addComponent(objects::GPS_CONTROLLER); if (result != HasReturnvaluesIF::RETURN_OK) { - initmission::printAddObjectError("ACS_CTRL", objects::GPS_CONTROLLER); + initmission::printAddObjectError("GPS_CTRL", objects::GPS_CONTROLLER); } - result = acsTask->addComponent(objects::ACS_BOARD_ASS); + +#endif /* OBSW_ADD_ACS_HANDLERS */ + + PeriodicTaskIF* sysTask = factory->createPeriodicTask( + "SYS_TASK", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc); + result = sysTask->addComponent(objects::ACS_BOARD_ASS); if (result != HasReturnvaluesIF::RETURN_OK) { initmission::printAddObjectError("ACS_ASS", objects::ACS_BOARD_ASS); } - result = acsTask->addComponent(objects::SUS_BOARD_ASS); + result = sysTask->addComponent(objects::SUS_BOARD_ASS); if (result != HasReturnvaluesIF::RETURN_OK) { initmission::printAddObjectError("SUS_ASS", objects::SUS_BOARD_ASS); } -#endif /* OBSW_ADD_ACS_HANDLERS */ + result = sysTask->addComponent(objects::TCS_BOARD_ASS); + if (result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("TCS_BOARD_ASS", objects::TCS_BOARD_ASS); + } #if BOARD_TE0720 == 0 // FS task, task interval does not matter because it runs in permanent loop, priority low @@ -219,6 +227,7 @@ void initmission::initTasks() { #if OBSW_ADD_ACS_HANDLERS == 1 acsTask->startTask(); #endif + sysTask->startTask(); sif::info << "Tasks started.." << std::endl; } From 22154f285118ba33592f1911cbf517c55b0c5101 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 19:30:10 +0100 Subject: [PATCH 10/14] prevent RTD spam --- mission/devices/Max31865PT1000Handler.cpp | 19 +++++++++++-------- mission/devices/Max31865PT1000Handler.h | 1 + tmtc | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mission/devices/Max31865PT1000Handler.cpp b/mission/devices/Max31865PT1000Handler.cpp index 809e669b..259eca6c 100644 --- a/mission/devices/Max31865PT1000Handler.cpp +++ b/mission/devices/Max31865PT1000Handler.cpp @@ -319,14 +319,17 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, switch (id) { case (Max31865Definitions::REQUEST_CONFIG): { if (packet[1] != DEFAULT_CONFIG) { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - // it propably would be better if we at least try one restart.. - sif::error << "Max31865PT1000Handler: 0x" << std::hex << this->getObjectId() - << ": Invalid configuration reply" << std::endl; -#else - sif::printError("Max31865PT1000Handler: %04x: Invalid configuration reply!\n", - this->getObjectId()); -#endif + if(warningSwitch) { + #if FSFW_CPP_OSTREAM_ENABLED == 1 + // it propably would be better if we at least try one restart.. + sif::warning << "Max31865PT1000Handler: 0x" << std::hex << this->getObjectId() + << ": Invalid configuration reply" << std::endl; + #else + sif::printWarning("Max31865PT1000Handler: %04x: Invalid configuration reply!\n", + this->getObjectId()); + #endif + warningSwitch = false; + } return HasReturnvaluesIF::RETURN_OK; } // set to true for invalid configs too for now. diff --git a/mission/devices/Max31865PT1000Handler.h b/mission/devices/Max31865PT1000Handler.h index 44d7a2e7..85cedbd6 100644 --- a/mission/devices/Max31865PT1000Handler.h +++ b/mission/devices/Max31865PT1000Handler.h @@ -85,6 +85,7 @@ class Max31865PT1000Handler : public DeviceHandlerBase { private: uint8_t switchId = 0; bool instantNormal = true; + bool warningSwitch = true; enum class InternalState { NONE, diff --git a/tmtc b/tmtc index 46c32710..cb479cc2 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 46c327101e24d61452ddb1cd3dd09cab87674abb +Subproject commit cb479cc2f48ed15668a5b223529dc1cf1ee5b6ad From 5fb4e468ba79ea78a4fb376b071fc04114d363eb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 19:33:49 +0100 Subject: [PATCH 11/14] update object list, bugfix --- generators/bsp_q7s_objects.csv | 1 + generators/events/translateEvents.cpp | 2 +- generators/objects/translateObjects.cpp | 7 +++++-- linux/fsfwconfig/events/translateEvents.cpp | 2 +- linux/fsfwconfig/objects/translateObjects.cpp | 7 +++++-- mission/system/TcsBoardAssembly.cpp | 1 + tmtc | 2 +- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv index 63116d0f..9f8ce56a 100644 --- a/generators/bsp_q7s_objects.csv +++ b/generators/bsp_q7s_objects.csv @@ -109,6 +109,7 @@ 0x54694269;TEST_TASK 0x73000001;ACS_BOARD_ASS 0x73000002;SUS_BOARD_ASS +0x73000003;TCS_BOARD_ASS 0x73000100;TM_FUNNEL 0x73500000;CCSDS_IP_CORE_BRIDGE 0xFFFFFFFF;NO_OBJECT diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index f04a44e0..00139cc5 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 167 translations. * @details - * Generated on: 2022-03-22 11:15:56 + * Generated on: 2022-03-22 19:33:14 */ #include "translateEvents.h" diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 96167528..9ae9afda 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 114 translations. - * Generated on: 2022-03-22 11:16:03 + * Contains 115 translations. + * Generated on: 2022-03-22 19:33:19 */ #include "translateObjects.h" @@ -117,6 +117,7 @@ const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST"; const char *TEST_TASK_STRING = "TEST_TASK"; const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS"; const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS"; +const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS"; const char *TM_FUNNEL_STRING = "TM_FUNNEL"; const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE"; const char *NO_OBJECT_STRING = "NO_OBJECT"; @@ -345,6 +346,8 @@ const char *translateObject(object_id_t object) { return ACS_BOARD_ASS_STRING; case 0x73000002: return SUS_BOARD_ASS_STRING; + case 0x73000003: + return TCS_BOARD_ASS_STRING; case 0x73000100: return TM_FUNNEL_STRING; case 0x73500000: diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index f04a44e0..00139cc5 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 167 translations. * @details - * Generated on: 2022-03-22 11:15:56 + * Generated on: 2022-03-22 19:33:14 */ #include "translateEvents.h" diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 96167528..9ae9afda 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 114 translations. - * Generated on: 2022-03-22 11:16:03 + * Contains 115 translations. + * Generated on: 2022-03-22 19:33:19 */ #include "translateObjects.h" @@ -117,6 +117,7 @@ const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST"; const char *TEST_TASK_STRING = "TEST_TASK"; const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS"; const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS"; +const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS"; const char *TM_FUNNEL_STRING = "TM_FUNNEL"; const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE"; const char *NO_OBJECT_STRING = "NO_OBJECT"; @@ -345,6 +346,8 @@ const char *translateObject(object_id_t object) { return ACS_BOARD_ASS_STRING; case 0x73000002: return SUS_BOARD_ASS_STRING; + case 0x73000003: + return TCS_BOARD_ASS_STRING; case 0x73000100: return TM_FUNNEL_STRING; case 0x73500000: diff --git a/mission/system/TcsBoardAssembly.cpp b/mission/system/TcsBoardAssembly.cpp index 71964a3c..241c157a 100644 --- a/mission/system/TcsBoardAssembly.cpp +++ b/mission/system/TcsBoardAssembly.cpp @@ -23,6 +23,7 @@ void TcsBoardAssembly::performChildOperation() { } else if (state == PowerSwitcher::WAIT_ON and switcher.getState() == PowerSwitcher::SWITCH_IS_ON) { // Indicator that mode commanding can be performed now + AssemblyBase::startTransition(targetMode, targetSubmode); AssemblyBase::performChildOperation(); } } diff --git a/tmtc b/tmtc index cb479cc2..a5594033 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit cb479cc2f48ed15668a5b223529dc1cf1ee5b6ad +Subproject commit a55940339850e862b05a06a94fa8381bf7da0743 From 3e9910b1d26600e642d21419ffa3f9def60883b2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 20:35:37 +0100 Subject: [PATCH 12/14] tcs assembly working for now --- fsfw | 2 +- mission/devices/Max31865PT1000Handler.cpp | 17 ++-- mission/devices/Max31865PT1000Handler.h | 4 +- mission/system/TcsBoardAssembly.cpp | 100 ++++++++++++++++------ mission/system/TcsBoardAssembly.h | 3 + tmtc | 2 +- 6 files changed, 86 insertions(+), 42 deletions(-) diff --git a/fsfw b/fsfw index bbe21e7e..4b5e3e70 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit bbe21e7e8957a39e6697c6dd4fb2fe044b560044 +Subproject commit 4b5e3e70f7eb65780b697a81ba95ecc2a74a8b84 diff --git a/mission/devices/Max31865PT1000Handler.cpp b/mission/devices/Max31865PT1000Handler.cpp index 259eca6c..21631134 100644 --- a/mission/devices/Max31865PT1000Handler.cpp +++ b/mission/devices/Max31865PT1000Handler.cpp @@ -87,6 +87,7 @@ void Max31865PT1000Handler::doStartUp() { void Max31865PT1000Handler::doShutDown() { commandExecuted = false; + warningSwitch = true; setMode(_MODE_POWER_DOWN); } @@ -319,15 +320,15 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, switch (id) { case (Max31865Definitions::REQUEST_CONFIG): { if (packet[1] != DEFAULT_CONFIG) { - if(warningSwitch) { - #if FSFW_CPP_OSTREAM_ENABLED == 1 + if (warningSwitch) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 // it propably would be better if we at least try one restart.. sif::warning << "Max31865PT1000Handler: 0x" << std::hex << this->getObjectId() - << ": Invalid configuration reply" << std::endl; - #else + << ": Invalid configuration reply" << std::endl; +#else sif::printWarning("Max31865PT1000Handler: %04x: Invalid configuration reply!\n", - this->getObjectId()); - #endif + this->getObjectId()); +#endif warningSwitch = false; } return HasReturnvaluesIF::RETURN_OK; @@ -508,10 +509,6 @@ ReturnValue_t Max31865PT1000Handler::getSwitches(const uint8_t **switches, return DeviceHandlerBase::NO_SWITCH; } -void Max31865PT1000Handler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { - DeviceHandlerBase::doTransition(modeFrom, subModeFrom); -} - ReturnValue_t Max31865PT1000Handler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localDataPoolMap.emplace(Max31865Definitions::PoolIds::RTD_VALUE, new PoolEntry({0})); diff --git a/mission/devices/Max31865PT1000Handler.h b/mission/devices/Max31865PT1000Handler.h index 85cedbd6..1be4c323 100644 --- a/mission/devices/Max31865PT1000Handler.h +++ b/mission/devices/Max31865PT1000Handler.h @@ -74,8 +74,6 @@ class Max31865PT1000Handler : public DeviceHandlerBase { uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override; - void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; - void debugInterface(uint8_t positionTracker = 0, object_id_t objectId = 0, uint32_t parameter = 0) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, @@ -84,7 +82,7 @@ class Max31865PT1000Handler : public DeviceHandlerBase { private: uint8_t switchId = 0; - bool instantNormal = true; + bool instantNormal = false; bool warningSwitch = true; enum class InternalState { diff --git a/mission/system/TcsBoardAssembly.cpp b/mission/system/TcsBoardAssembly.cpp index 241c157a..8a1218f9 100644 --- a/mission/system/TcsBoardAssembly.cpp +++ b/mission/system/TcsBoardAssembly.cpp @@ -8,6 +8,14 @@ TcsBoardAssembly::TcsBoardAssembly(object_id_t objectId, object_id_t parentId, TcsBoardHelper helper) : AssemblyBase(objectId, parentId, 24), switcher(pwrSwitcher, theSwitch), helper(helper) { eventQueue = QueueFactory::instance()->createMessageQueue(24); + ModeListEntry entry; + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + entry.setObject(helper.rtdIds[idx]); + entry.setMode(MODE_OFF); + entry.setSubmode(SUBMODE_NONE); + entry.setInheritSubmode(false); + modeTable.insert(entry); + } } void TcsBoardAssembly::performChildOperation() { @@ -24,7 +32,7 @@ void TcsBoardAssembly::performChildOperation() { switcher.getState() == PowerSwitcher::SWITCH_IS_ON) { // Indicator that mode commanding can be performed now AssemblyBase::startTransition(targetMode, targetSubmode); - AssemblyBase::performChildOperation(); + // AssemblyBase::performChildOperation(); } } @@ -46,14 +54,33 @@ ReturnValue_t TcsBoardAssembly::commandChildren(Mode_t mode, Submode_t submode) } ReturnValue_t TcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) { - uint8_t devsInWrongMode = 0; - for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { - if (childrenMap[idx].mode != wantedMode) { - devsInWrongMode++; + int devsInWrongMode = 0; + try { + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + if (childrenMap.at(helper.rtdIds[idx]).mode != wantedMode) { + devsInWrongMode++; + } } + } catch (const std::out_of_range& e) { + sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl; + } + if (devsInWrongMode == 16) { + if (warningSwitch) { + sif::warning << "TcsBoardAssembly::checkChildrenStateOn: All devices in" + << " wrong mode" << std::endl; + warningSwitch = false; + } + return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE; } // TODO: Can't really do something other than power cycling if devices in wrong mode. // Might attempt one power-cycle. In any case, trigger an event + if (devsInWrongMode > 0) { + if (warningSwitch) { + sif::warning << "TcsBoardAssembly::checkChildrenStateOn: " << devsInWrongMode << " devices in" + << " wrong mode" << std::endl; + warningSwitch = false; + } + } return RETURN_OK; } @@ -77,7 +104,7 @@ ReturnValue_t TcsBoardAssembly::initialize() { void TcsBoardAssembly::startTransition(Mode_t mode, Submode_t submode) { if (mode != MODE_OFF) { - switcher.turnOn(); + switcher.turnOn(true); switcher.doStateMachine(); if (switcher.getState() == PowerSwitcher::SWITCH_IS_ON) { AssemblyBase::startTransition(mode, submode); @@ -87,6 +114,7 @@ void TcsBoardAssembly::startTransition(Mode_t mode, Submode_t submode) { targetSubmode = submode; } } else { + // Perform regular mode commanding first AssemblyBase::startTransition(mode, submode); } } @@ -96,30 +124,34 @@ ReturnValue_t TcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t s bool needsSecondStep = false; Mode_t devMode = 0; object_id_t objId = 0; - for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { - devMode = childrenMap[idx].mode; - objId = helper.rtdIds[idx]; - if (mode == devMode) { - modeTable[idx].setMode(mode); - } else if (mode == DeviceHandlerIF::MODE_NORMAL) { - if (isUseable(objId, devMode)) { - if (devMode == MODE_ON) { - modeTable[idx].setMode(mode); - modeTable[idx].setSubmode(SUBMODE_NONE); - } else { - modeTable[idx].setMode(MODE_ON); - modeTable[idx].setSubmode(SUBMODE_NONE); - if (internalState != STATE_SECOND_STEP) { - needsSecondStep = true; + try { + for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) { + devMode = childrenMap.at(helper.rtdIds[idx]).mode; + objId = helper.rtdIds[idx]; + if (mode == devMode) { + modeTable[idx].setMode(mode); + } else if (mode == DeviceHandlerIF::MODE_NORMAL) { + if (isUseable(objId, devMode)) { + if (devMode == MODE_ON) { + modeTable[idx].setMode(mode); + modeTable[idx].setSubmode(SUBMODE_NONE); + } else { + modeTable[idx].setMode(MODE_ON); + modeTable[idx].setSubmode(SUBMODE_NONE); + if (internalState != STATE_SECOND_STEP) { + needsSecondStep = true; + } } } - } - } else if (mode == MODE_ON) { - if (isUseable(objId, devMode)) { - modeTable[idx].setMode(MODE_ON); - modeTable[idx].setSubmode(SUBMODE_NONE); + } else if (mode == MODE_ON) { + if (isUseable(objId, devMode)) { + modeTable[idx].setMode(MODE_ON); + modeTable[idx].setSubmode(SUBMODE_NONE); + } } } + } catch (const std::out_of_range& e) { + sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl; } if (needsSecondStep) { result = NEED_SECOND_STEP; @@ -147,7 +179,7 @@ MessageQueueId_t TcsBoardAssembly::getEventReceptionQueue() { return eventQueue- void TcsBoardAssembly::handleModeReached() { if (targetMode == MODE_OFF) { - switcher.turnOff(); + switcher.turnOff(true); switcher.doStateMachine(); // Need to wait with call to AssemblyBase::handleModeReached until power switcher is done if (switcher.getState() == PowerSwitcher::SWITCH_IS_OFF) { @@ -157,3 +189,17 @@ void TcsBoardAssembly::handleModeReached() { AssemblyBase::handleModeReached(); } } + +void TcsBoardAssembly::handleChildrenLostMode(ReturnValue_t result) { + // TODO: Maybe trigger event + return; +} + +void TcsBoardAssembly::handleModeTransitionFailed(ReturnValue_t result) { + if (targetMode == MODE_OFF) { + AssemblyBase::handleModeTransitionFailed(result); + } else { + // To avoid transitioning back to off + triggerEvent(MODE_TRANSITION_FAILED, result); + } +} diff --git a/mission/system/TcsBoardAssembly.h b/mission/system/TcsBoardAssembly.h index f3f32164..19fa429b 100644 --- a/mission/system/TcsBoardAssembly.h +++ b/mission/system/TcsBoardAssembly.h @@ -23,6 +23,7 @@ class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF { private: static constexpr uint8_t NUMBER_RTDS = 16; PowerSwitcher switcher; + bool warningSwitch = true; TcsBoardHelper helper; FixedArrayList modeTable; MessageQueueIF* eventQueue = nullptr; @@ -45,6 +46,8 @@ class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF { ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; void startTransition(Mode_t mode, Submode_t submode) override; void handleModeReached() override; + void handleChildrenLostMode(ReturnValue_t result) override; + void handleModeTransitionFailed(ReturnValue_t result) override; }; #endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */ diff --git a/tmtc b/tmtc index a5594033..0abdea98 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit a55940339850e862b05a06a94fa8381bf7da0743 +Subproject commit 0abdea987a677a629173b6ec9cd2fa8dc265cb24 From 9c6f349a089e7a70c97ba10b045650bef0e18dba Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 20:40:30 +0100 Subject: [PATCH 13/14] add children lost mode event --- common/config/commonSubsystemIds.h | 1 + mission/system/TcsBoardAssembly.cpp | 7 ++++--- mission/system/TcsBoardAssembly.h | 7 +++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/common/config/commonSubsystemIds.h b/common/config/commonSubsystemIds.h index 0e64e634..77a3a810 100644 --- a/common/config/commonSubsystemIds.h +++ b/common/config/commonSubsystemIds.h @@ -22,6 +22,7 @@ enum: uint8_t { PL_PCDU_HANDLER = 121, ACS_BOARD_ASS = 122, SUS_BOARD_ASS = 123, + TCS_BOARD_ASS = 124, COMMON_SUBSYSTEM_ID_END }; } diff --git a/mission/system/TcsBoardAssembly.cpp b/mission/system/TcsBoardAssembly.cpp index 8a1218f9..f011c931 100644 --- a/mission/system/TcsBoardAssembly.cpp +++ b/mission/system/TcsBoardAssembly.cpp @@ -64,9 +64,9 @@ ReturnValue_t TcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_ } catch (const std::out_of_range& e) { sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl; } - if (devsInWrongMode == 16) { + if (devsInWrongMode >= 3) { if (warningSwitch) { - sif::warning << "TcsBoardAssembly::checkChildrenStateOn: All devices in" + sif::warning << "TcsBoardAssembly::checkChildrenStateOn: " << devsInWrongMode << " devices in" << " wrong mode" << std::endl; warningSwitch = false; } @@ -191,7 +191,8 @@ void TcsBoardAssembly::handleModeReached() { } void TcsBoardAssembly::handleChildrenLostMode(ReturnValue_t result) { - // TODO: Maybe trigger event + // TODO: Maybe try a reboot once here? + triggerEvent(CHILDREN_LOST_MODE, result); return; } diff --git a/mission/system/TcsBoardAssembly.h b/mission/system/TcsBoardAssembly.h index 19fa429b..cda78317 100644 --- a/mission/system/TcsBoardAssembly.h +++ b/mission/system/TcsBoardAssembly.h @@ -13,6 +13,10 @@ struct TcsBoardHelper { class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF { public: + static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_BOARD_ASS; + static constexpr Event CHILDREN_LOST_MODE = + event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM); + TcsBoardAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher, power::Switch_t switcher, TcsBoardHelper helper); @@ -46,6 +50,9 @@ class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF { ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; void startTransition(Mode_t mode, Submode_t submode) override; void handleModeReached() override; + + // These two overrides prevent a transition of the whole assembly back to off just because + // some devices are not working void handleChildrenLostMode(ReturnValue_t result) override; void handleModeTransitionFailed(ReturnValue_t result) override; }; From 017eaf07f54ebeb1057b5996f0364da2b8a762ab Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Mar 2022 20:43:34 +0100 Subject: [PATCH 14/14] added new event --- generators/bsp_q7s_events.csv | 1 + generators/events/translateEvents.cpp | 7 +++++-- generators/fsfwgen | 2 +- generators/gen.py | 6 +++++- generators/objects/translateObjects.cpp | 2 +- linux/fsfwconfig/events/translateEvents.cpp | 7 +++++-- linux/fsfwconfig/objects/translateObjects.cpp | 2 +- tmtc | 2 +- 8 files changed, 20 insertions(+), 9 deletions(-) diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 17a6b2ea..53d6d6aa 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -161,6 +161,7 @@ 12301;0x300d;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/SusAssembly.h 12302;0x300e;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/SusAssembly.h 12303;0x300f;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/SusAssembly.h +12400;0x3070;CHILDREN_LOST_MODE;MEDIUM;;mission/system/TcsBoardAssembly.h 13600;0x3520;ALLOC_FAILURE;MEDIUM;;bsp_q7s/core/CoreController.h 13601;0x3521;REBOOT_SW;MEDIUM; Software reboot occured. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h 13602;0x3522;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 00139cc5..9ac5c923 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 167 translations. + * @brief Auto-generated event translation file. Contains 168 translations. * @details - * Generated on: 2022-03-22 19:33:14 + * Generated on: 2022-03-22 20:43:04 */ #include "translateEvents.h" @@ -164,6 +164,7 @@ const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED" const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE"; const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT"; const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED"; +const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE"; const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE"; const char *REBOOT_SW_STRING = "REBOOT_SW"; const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED"; @@ -489,6 +490,8 @@ const char *translateEvents(Event event) { return POWER_STATE_MACHINE_TIMEOUT_STRING; case (12203): return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING; + case (12400): + return CHILDREN_LOST_MODE_STRING; case (13600): return ALLOC_FAILURE_STRING; case (13601): diff --git a/generators/fsfwgen b/generators/fsfwgen index 1c9f3ecc..a3ea5dd2 160000 --- a/generators/fsfwgen +++ b/generators/fsfwgen @@ -1 +1 @@ -Subproject commit 1c9f3eccefac3592162be9a1b521a4ae846f2520 +Subproject commit a3ea5dd2e7223c52e4f494e170850609b7b3a572 diff --git a/generators/gen.py b/generators/gen.py index 3d6c1038..f79e7226 100755 --- a/generators/gen.py +++ b/generators/gen.py @@ -31,7 +31,11 @@ def main(): LOGGER.info("Generating returnvalue data") time.sleep(0.05) parse_returnvalues() - pass + elif args.type == "all": + LOGGER.info("Generating all data") + parse_objects() + parse_events() + parse_returnvalues() if __name__ == "__main__": diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 9ae9afda..272de238 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 115 translations. - * Generated on: 2022-03-22 19:33:19 + * Generated on: 2022-03-22 20:43:04 */ #include "translateObjects.h" diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 00139cc5..9ac5c923 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 167 translations. + * @brief Auto-generated event translation file. Contains 168 translations. * @details - * Generated on: 2022-03-22 19:33:14 + * Generated on: 2022-03-22 20:43:04 */ #include "translateEvents.h" @@ -164,6 +164,7 @@ const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED" const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE"; const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT"; const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED"; +const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE"; const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE"; const char *REBOOT_SW_STRING = "REBOOT_SW"; const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED"; @@ -489,6 +490,8 @@ const char *translateEvents(Event event) { return POWER_STATE_MACHINE_TIMEOUT_STRING; case (12203): return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING; + case (12400): + return CHILDREN_LOST_MODE_STRING; case (13600): return ALLOC_FAILURE_STRING; case (13601): diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 9ae9afda..272de238 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 115 translations. - * Generated on: 2022-03-22 19:33:19 + * Generated on: 2022-03-22 20:43:04 */ #include "translateObjects.h" diff --git a/tmtc b/tmtc index 0abdea98..43a534db 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 0abdea987a677a629173b6ec9cd2fa8dc265cb24 +Subproject commit 43a534db9cf8ee14e6c1296dac8b3e2c3c94b240