From 3bd434bbc3b28dc52e0e157a4230d0fe44e91c09 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 16:50:33 +0200 Subject: [PATCH 01/12] I2C reboot procedure for EIVE system --- bsp_q7s/em/emObjectFactory.cpp | 2 +- bsp_q7s/obsw.cpp | 2 +- mission/system/CMakeLists.txt | 4 +- mission/system/EiveSystem.cpp | 203 ++++++++++++++++++ mission/system/EiveSystem.h | 46 ++++ mission/system/acs/acsModeTree.cpp | 2 +- mission/system/com/comModeTree.cpp | 2 +- mission/system/objects/CMakeLists.txt | 9 +- mission/system/objects/EiveSystem.cpp | 111 ---------- mission/system/objects/EiveSystem.h | 21 -- .../{tree/system.cpp => systemTree.cpp} | 8 +- .../system/{tree/system.h => systemTree.h} | 2 +- mission/system/tree/CMakeLists.txt | 3 +- mission/system/tree/payloadModeTree.cpp | 2 +- mission/system/tree/tcsModeTree.cpp | 2 +- .../system/{tree/util.cpp => treeUtil.cpp} | 2 +- mission/system/{tree/util.h => treeUtil.h} | 0 17 files changed, 267 insertions(+), 154 deletions(-) create mode 100644 mission/system/EiveSystem.cpp create mode 100644 mission/system/EiveSystem.h delete mode 100644 mission/system/objects/EiveSystem.cpp delete mode 100644 mission/system/objects/EiveSystem.h rename mission/system/{tree/system.cpp => systemTree.cpp} (98%) rename mission/system/{tree/system.h => systemTree.h} (82%) rename mission/system/{tree/util.cpp => treeUtil.cpp} (96%) rename mission/system/{tree/util.h => treeUtil.h} (100%) diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index ad520441..ca1a54ae 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include "OBSWConfig.h" diff --git a/bsp_q7s/obsw.cpp b/bsp_q7s/obsw.cpp index d2d640f3..dc547b03 100644 --- a/bsp_q7s/obsw.cpp +++ b/bsp_q7s/obsw.cpp @@ -16,7 +16,7 @@ #include "fsfw/version.h" #include "mission/acs/defs.h" #include "mission/com/defs.h" -#include "mission/system/tree/system.h" +#include "mission/system/systemTree.h" #include "q7sConfig.h" #include "watchdog/definitions.h" diff --git a/mission/system/CMakeLists.txt b/mission/system/CMakeLists.txt index 44122d7e..51e47ef4 100644 --- a/mission/system/CMakeLists.txt +++ b/mission/system/CMakeLists.txt @@ -5,4 +5,6 @@ add_subdirectory(com) add_subdirectory(fdir) add_subdirectory(power) -target_sources(${LIB_EIVE_MISSION} PRIVATE DualLanePowerStateMachine.cpp) +target_sources( + ${LIB_EIVE_MISSION} PRIVATE systemTree.cpp DualLanePowerStateMachine.cpp + EiveSystem.cpp treeUtil.cpp) diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp new file mode 100644 index 00000000..9e01e7b2 --- /dev/null +++ b/mission/system/EiveSystem.cpp @@ -0,0 +1,203 @@ +#include "EiveSystem.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "mission/power/bpxBattDefs.h" +#include "mission/power/defs.h" +#include "mission/sysDefs.h" + +EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, + uint32_t maxNumberOfTables) + : Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables), + actionHelper(this, commandQueue) { + auto mqArgs = MqArgs(SubsystemBase::getObjectId(), static_cast(this)); + eventQueue = + QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); +} + +void EiveSystem::announceMode(bool recursive) { + const char* modeStr = "UNKNOWN"; + switch (mode) { + case (satsystem::Mode::BOOT): { + modeStr = "OFF/BOOT"; + break; + } + case (satsystem::Mode::SAFE): { + modeStr = "SAFE"; + break; + } + case (satsystem::Mode::PTG_IDLE): { + modeStr = "POINTING IDLE"; + break; + } + case (acs::AcsMode::PTG_INERTIAL): { + modeStr = "POINTING INERTIAL"; + break; + } + case (acs::AcsMode::PTG_TARGET): { + modeStr = "POINTING TARGET"; + break; + } + case (acs::AcsMode::PTG_TARGET_GS): { + modeStr = "POINTING TARGET GS"; + break; + } + } + sif::info << "EIVE system is now in " << modeStr << " mode" << std::endl; + return Subsystem::announceMode(recursive); +} + +void EiveSystem::performChildOperation() { + ReturnValue_t result; + Subsystem::performChildOperation(); + handleEventMessages(); + if (not isInTransition and performSafeRecovery) { + commandSelfToSafe(); + performSafeRecovery = false; + return; + } + if (not isInTransition and performI2cReboot) { + if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) { + startTransition(satsystem::Mode::BOOT, 0); + i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; + i2cRebootCountdown.resetTimer(); + } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) { + if (mode == satsystem::Mode::BOOT) { + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_OFF); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + performI2cReboot = false; + } + CommandMessage msg; + ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t()); + result = commandQueue->sendMessage(bpxBattQueueId, &msg); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + performI2cReboot = false; + } + i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON; + } + if (i2cRebootCountdown.hasTimedOut()) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); + performI2cReboot = false; + } + } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_ON) { + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_ON); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + performI2cReboot = false; + } + i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; + } else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) { + if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == + PowerSwitchIF::SWITCH_ON) { + // This should always be accepted + commandSelfToSafe(); + i2cRebootState = I2cRebootState::NONE; + performI2cReboot = false; + actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); + } + } + + // Timeout handling for the internal procedure. + if (i2cRebootState != I2cRebootState::NONE and i2cRebootCountdown.hasTimedOut()) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); + powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_ON); + // This should always be accepted + commandSelfToSafe(); + } + } +} + +ReturnValue_t EiveSystem::initialize() { + if (powerSwitcher == nullptr) { + return ObjectManager::CHILD_INIT_FAILED; + } + ReturnValue_t result = actionHelper.initialize(); + if (result != returnvalue::OK) { + return result; + } + auto* bpxDest = ObjectManager::instance()->get(objects::BPX_BATT_HANDLER); + if (bpxDest == nullptr) { + return ObjectManager::CHILD_INIT_FAILED; + } + bpxBattQueueId = bpxDest->getCommandQueue(); + auto* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); + if (manager == nullptr) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "AcsSubsystem::initialize: Invalid event manager" << std::endl; +#endif + return ObjectManagerIF::CHILD_INIT_FAILED; + } + result = manager->registerListener(eventQueue->getId()); + if (result != returnvalue::OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "AcsSubsystem::registerListener: Failed to register as " + "listener" + << std::endl; +#endif + return ObjectManagerIF::CHILD_INIT_FAILED; + } + manager->subscribeToEvent(eventQueue->getId(), + event::getEventId(tcsCtrl::PCDU_SYSTEM_OVERHEATING)); + manager->subscribeToEvent(eventQueue->getId(), event::getEventId(tcsCtrl::OBC_OVERHEATING)); + + return Subsystem::initialize(); +} + +void EiveSystem::handleEventMessages() { + EventMessage event; + for (ReturnValue_t status = eventQueue->receiveMessage(&event); status == returnvalue::OK; + status = eventQueue->receiveMessage(&event)) { + switch (event.getMessageId()) { + case EventMessage::EVENT_MESSAGE: + switch (event.getEvent()) { + case tcsCtrl::OBC_OVERHEATING: + case tcsCtrl::PCDU_SYSTEM_OVERHEATING: { + if (isInTransition) { + performSafeRecovery = true; + return; + } + + commandSelfToSafe(); + break; + } + } + break; + default: + sif::debug << "EiveSystem: Did not subscribe to event " << event.getEvent() << std::endl; + break; + } + } +} + +MessageQueueId_t EiveSystem::getCommandQueue() const { return Subsystem::getCommandQueue(); } + +ReturnValue_t EiveSystem::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, + const uint8_t* data, size_t size) { + switch (actionId) { + case (EXECUTE_I2C_REBOOT): { + performI2cReboot = true; + i2cRebootState = I2cRebootState::SYSTEM_MODE_BOOT; + this->actionCommandedBy = commandedBy; + return returnvalue::OK; + } + default: { + return HasActionsIF::INVALID_ACTION_ID; + } + } + return returnvalue::OK; +} + +void EiveSystem::setPowerSwitcher(PowerSwitchIF* pwrSwitcher) {} + +void EiveSystem::commandSelfToSafe() { startTransition(satsystem::Mode::SAFE, 0); } diff --git a/mission/system/EiveSystem.h b/mission/system/EiveSystem.h new file mode 100644 index 00000000..cc720828 --- /dev/null +++ b/mission/system/EiveSystem.h @@ -0,0 +1,46 @@ +#ifndef MISSION_SYSTEM_EIVESYSTEM_H_ +#define MISSION_SYSTEM_EIVESYSTEM_H_ + +#include +#include +#include + +class EiveSystem : public Subsystem, public HasActionsIF { + public: + static constexpr ActionId_t EXECUTE_I2C_REBOOT = 10; + + EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables); + + void setPowerSwitcher(PowerSwitchIF* pwrSwitcher); + + [[nodiscard]] MessageQueueId_t getCommandQueue() const override; + + private: + enum class I2cRebootState { + NONE, + SYSTEM_MODE_BOOT, + SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT, + SWITCH_3V3_STACK_ON, + SYSTEM_MODE_SAFE + } i2cRebootState = I2cRebootState::NONE; + + MessageQueueIF* eventQueue = nullptr; + bool performSafeRecovery = false; + bool performI2cReboot = false; + ActionHelper actionHelper; + PowerSwitchIF* powerSwitcher = nullptr; + MessageQueueId_t bpxBattQueueId = MessageQueueIF::NO_QUEUE; + MessageQueueId_t actionCommandedBy = MessageQueueIF::NO_QUEUE; + Countdown i2cRebootCountdown = Countdown(10000); + + ReturnValue_t initialize() override; + void performChildOperation() override; + void announceMode(bool recursive) override; + + ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, + const uint8_t* data, size_t size) override; + void handleEventMessages(); + void commandSelfToSafe(); +}; + +#endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */ diff --git a/mission/system/acs/acsModeTree.cpp b/mission/system/acs/acsModeTree.cpp index 85d2ea45..185ad9eb 100644 --- a/mission/system/acs/acsModeTree.cpp +++ b/mission/system/acs/acsModeTree.cpp @@ -11,7 +11,7 @@ #include "eive/objects.h" #include "mission/acs/defs.h" #include "mission/power/defs.h" -#include "mission/system/tree/util.h" +#include "mission/system/treeUtil.h" AcsSubsystem satsystem::acs::ACS_SUBSYSTEM(objects::ACS_SUBSYSTEM, 12, 24); diff --git a/mission/system/com/comModeTree.cpp b/mission/system/com/comModeTree.cpp index bb9a8d10..23611ea2 100644 --- a/mission/system/com/comModeTree.cpp +++ b/mission/system/com/comModeTree.cpp @@ -6,7 +6,7 @@ #include "eive/objects.h" #include "mission/com/defs.h" -#include "mission/system/tree/util.h" +#include "mission/system/treeUtil.h" const auto check = subsystem::checkInsert; diff --git a/mission/system/objects/CMakeLists.txt b/mission/system/objects/CMakeLists.txt index 53cc200d..b2fe6056 100644 --- a/mission/system/objects/CMakeLists.txt +++ b/mission/system/objects/CMakeLists.txt @@ -1,9 +1,4 @@ target_sources( ${LIB_EIVE_MISSION} - PRIVATE EiveSystem.cpp - CamSwitcher.cpp - TcsSubsystem.cpp - PayloadSubsystem.cpp - Stack5VHandler.cpp - PowerStateMachineBase.cpp - TcsBoardAssembly.cpp) + PRIVATE CamSwitcher.cpp TcsSubsystem.cpp PayloadSubsystem.cpp + Stack5VHandler.cpp PowerStateMachineBase.cpp TcsBoardAssembly.cpp) diff --git a/mission/system/objects/EiveSystem.cpp b/mission/system/objects/EiveSystem.cpp deleted file mode 100644 index f6b99b1e..00000000 --- a/mission/system/objects/EiveSystem.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "EiveSystem.h" - -#include -#include -#include -#include -#include -#include - -#include "mission/sysDefs.h" - -EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, - uint32_t maxNumberOfTables) - : Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables) { - auto mqArgs = MqArgs(SubsystemBase::getObjectId(), static_cast(this)); - eventQueue = - QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); -} - -void EiveSystem::announceMode(bool recursive) { - const char* modeStr = "UNKNOWN"; - switch (mode) { - case (satsystem::Mode::BOOT): { - modeStr = "OFF/BOOT"; - break; - } - case (satsystem::Mode::SAFE): { - modeStr = "SAFE"; - break; - } - case (satsystem::Mode::PTG_IDLE): { - modeStr = "POINTING IDLE"; - break; - } - case (acs::AcsMode::PTG_INERTIAL): { - modeStr = "POINTING INERTIAL"; - break; - } - case (acs::AcsMode::PTG_TARGET): { - modeStr = "POINTING TARGET"; - break; - } - case (acs::AcsMode::PTG_TARGET_GS): { - modeStr = "POINTING TARGET GS"; - break; - } - } - sif::info << "EIVE system is now in " << modeStr << " mode" << std::endl; - return Subsystem::announceMode(recursive); -} - -void EiveSystem::performChildOperation() { - Subsystem::performChildOperation(); - handleEventMessages(); - if (not isInTransition and performSafeRecovery) { - commandSelfToSafe(); - performSafeRecovery = false; - } -} - -ReturnValue_t EiveSystem::initialize() { - auto* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); - if (manager == nullptr) { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "AcsSubsystem::initialize: Invalid event manager" << std::endl; -#endif - return ObjectManagerIF::CHILD_INIT_FAILED; - } - ReturnValue_t result = manager->registerListener(eventQueue->getId()); - if (result != returnvalue::OK) { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::warning << "AcsSubsystem::registerListener: Failed to register as " - "listener" - << std::endl; -#endif - return ObjectManagerIF::CHILD_INIT_FAILED; - } - manager->subscribeToEvent(eventQueue->getId(), - event::getEventId(tcsCtrl::PCDU_SYSTEM_OVERHEATING)); - manager->subscribeToEvent(eventQueue->getId(), event::getEventId(tcsCtrl::OBC_OVERHEATING)); - - return Subsystem::initialize(); -} - -void EiveSystem::handleEventMessages() { - EventMessage event; - for (ReturnValue_t status = eventQueue->receiveMessage(&event); status == returnvalue::OK; - status = eventQueue->receiveMessage(&event)) { - switch (event.getMessageId()) { - case EventMessage::EVENT_MESSAGE: - switch (event.getEvent()) { - case tcsCtrl::OBC_OVERHEATING: - case tcsCtrl::PCDU_SYSTEM_OVERHEATING: { - if (isInTransition) { - performSafeRecovery = true; - return; - } - - commandSelfToSafe(); - break; - } - } - break; - default: - sif::debug << "EiveSystem: Did not subscribe to event " << event.getEvent() << std::endl; - break; - } - } -} - -void EiveSystem::commandSelfToSafe() { startTransition(satsystem::Mode::SAFE, 0); } diff --git a/mission/system/objects/EiveSystem.h b/mission/system/objects/EiveSystem.h deleted file mode 100644 index 06110775..00000000 --- a/mission/system/objects/EiveSystem.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef MISSION_SYSTEM_EIVESYSTEM_H_ -#define MISSION_SYSTEM_EIVESYSTEM_H_ - -#include - -class EiveSystem : public Subsystem { - public: - EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables); - - private: - MessageQueueIF* eventQueue = nullptr; - bool performSafeRecovery = false; - - ReturnValue_t initialize() override; - void performChildOperation() override; - void announceMode(bool recursive) override; - void handleEventMessages(); - void commandSelfToSafe(); -}; - -#endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */ diff --git a/mission/system/tree/system.cpp b/mission/system/systemTree.cpp similarity index 98% rename from mission/system/tree/system.cpp rename to mission/system/systemTree.cpp index 6e3b3f72..2cecf244 100644 --- a/mission/system/tree/system.cpp +++ b/mission/system/systemTree.cpp @@ -1,4 +1,4 @@ -#include "system.h" +#include "systemTree.h" #include #include @@ -9,9 +9,9 @@ #include "eive/objects.h" #include "mission/com/defs.h" #include "mission/system/acs/acsModeTree.h" -#include "payloadModeTree.h" -#include "tcsModeTree.h" -#include "util.h" +#include "mission/system/tree/payloadModeTree.h" +#include "mission/system/tree/tcsModeTree.h" +#include "treeUtil.h" namespace { // Alias for checker function diff --git a/mission/system/tree/system.h b/mission/system/systemTree.h similarity index 82% rename from mission/system/tree/system.h rename to mission/system/systemTree.h index b1c90c82..9d769277 100644 --- a/mission/system/tree/system.h +++ b/mission/system/systemTree.h @@ -1,7 +1,7 @@ #ifndef MISSION_SYSTEM_TREE_SYSTEM_H_ #define MISSION_SYSTEM_TREE_SYSTEM_H_ -#include +#include namespace satsystem { diff --git a/mission/system/tree/CMakeLists.txt b/mission/system/tree/CMakeLists.txt index a6764013..8715d8e1 100644 --- a/mission/system/tree/CMakeLists.txt +++ b/mission/system/tree/CMakeLists.txt @@ -1,2 +1 @@ -target_sources(${LIB_EIVE_MISSION} PRIVATE payloadModeTree.cpp tcsModeTree.cpp - system.cpp util.cpp) +target_sources(${LIB_EIVE_MISSION} PRIVATE payloadModeTree.cpp tcsModeTree.cpp) diff --git a/mission/system/tree/payloadModeTree.cpp b/mission/system/tree/payloadModeTree.cpp index ab67852d..b2d74dd2 100644 --- a/mission/system/tree/payloadModeTree.cpp +++ b/mission/system/tree/payloadModeTree.cpp @@ -10,7 +10,7 @@ #include "eive/objects.h" #include "mission/power/defs.h" #include "mission/system/objects/PayloadSubsystem.h" -#include "util.h" +#include "mission/system/treeUtil.h" namespace { void initOffSequence(Subsystem& ss, ModeListEntry& eh); diff --git a/mission/system/tree/tcsModeTree.cpp b/mission/system/tree/tcsModeTree.cpp index b7188b17..2cdb5052 100644 --- a/mission/system/tree/tcsModeTree.cpp +++ b/mission/system/tree/tcsModeTree.cpp @@ -3,7 +3,7 @@ #include "eive/objects.h" #include "fsfw/devicehandlers/DeviceHandlerIF.h" #include "fsfw/subsystem/Subsystem.h" -#include "mission/system/tree/util.h" +#include "mission/system/treeUtil.h" TcsSubsystem satsystem::tcs::SUBSYSTEM(objects::TCS_SUBSYSTEM, 12, 24); diff --git a/mission/system/tree/util.cpp b/mission/system/treeUtil.cpp similarity index 96% rename from mission/system/tree/util.cpp rename to mission/system/treeUtil.cpp index 935e9d79..0e95f273 100644 --- a/mission/system/tree/util.cpp +++ b/mission/system/treeUtil.cpp @@ -1,4 +1,4 @@ -#include "util.h" +#include "treeUtil.h" #include "fsfw/container/FixedMap.h" #include "fsfw/serviceinterface.h" diff --git a/mission/system/tree/util.h b/mission/system/treeUtil.h similarity index 100% rename from mission/system/tree/util.h rename to mission/system/treeUtil.h From 9020014245bd0e99478884d3026c0c72b2847e48 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 17:01:28 +0200 Subject: [PATCH 02/12] added some more safety features --- bsp_q7s/fmObjectFactory.cpp | 5 +- mission/system/EiveSystem.cpp | 123 ++++++++++++++++++---------------- mission/system/EiveSystem.h | 6 +- 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index 963c897b..699c2569 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "OBSWConfig.h" #include "bsp_q7s/core/CoreController.h" @@ -13,7 +14,7 @@ #include "linux/ObjectFactory.h" #include "linux/callbacks/gpioCallbacks.h" #include "mission/genericFactory.h" -#include "mission/system/tree/system.h" +#include "mission/system/systemTree.h" #include "mission/tmtc/tmFilters.h" void ObjectFactory::produce(void* args) { @@ -45,6 +46,8 @@ void ObjectFactory::produce(void* args) { new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS, enableHkSets); createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets); + satsystem::EIVE_SYSTEM.setPowerSwitcher(pwrSwitcher); + auto* stackHandler = new Stack5VHandler(*pwrSwitcher); #if OBSW_ADD_RAD_SENSORS == 1 diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index 9e01e7b2..1a29507c 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -54,7 +54,6 @@ void EiveSystem::announceMode(bool recursive) { } void EiveSystem::performChildOperation() { - ReturnValue_t result; Subsystem::performChildOperation(); handleEventMessages(); if (not isInTransition and performSafeRecovery) { @@ -62,60 +61,7 @@ void EiveSystem::performChildOperation() { performSafeRecovery = false; return; } - if (not isInTransition and performI2cReboot) { - if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) { - startTransition(satsystem::Mode::BOOT, 0); - i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; - i2cRebootCountdown.resetTimer(); - } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) { - if (mode == satsystem::Mode::BOOT) { - result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_OFF); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - performI2cReboot = false; - } - CommandMessage msg; - ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t()); - result = commandQueue->sendMessage(bpxBattQueueId, &msg); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - performI2cReboot = false; - } - i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON; - } - if (i2cRebootCountdown.hasTimedOut()) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); - performI2cReboot = false; - } - } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_ON) { - result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_ON); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - performI2cReboot = false; - } - i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; - } else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) { - if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == - PowerSwitchIF::SWITCH_ON) { - // This should always be accepted - commandSelfToSafe(); - i2cRebootState = I2cRebootState::NONE; - performI2cReboot = false; - actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); - } - } - - // Timeout handling for the internal procedure. - if (i2cRebootState != I2cRebootState::NONE and i2cRebootCountdown.hasTimedOut()) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); - powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_ON); - // This should always be accepted - commandSelfToSafe(); - } - } + i2cRecoveryLogic(); } ReturnValue_t EiveSystem::initialize() { @@ -198,6 +144,71 @@ ReturnValue_t EiveSystem::executeAction(ActionId_t actionId, MessageQueueId_t co return returnvalue::OK; } -void EiveSystem::setPowerSwitcher(PowerSwitchIF* pwrSwitcher) {} +void EiveSystem::setPowerSwitcher(PowerSwitchIF* pwrSwitcher) { this->powerSwitcher = pwrSwitcher; } + +void EiveSystem::i2cRecoveryLogic() { + ReturnValue_t result; + if (alreadyTriedI2cRecovery and i2cRecoveryClearCountdown.hasTimedOut()) { + alreadyTriedI2cRecovery = false; + } + if (not isInTransition and performI2cReboot) { + if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) { + startTransition(satsystem::Mode::BOOT, 0); + i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; + i2cRebootCountdown.resetTimer(); + } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) { + if (mode == satsystem::Mode::BOOT) { + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_OFF); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + performI2cReboot = false; + } + CommandMessage msg; + ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t()); + result = commandQueue->sendMessage(bpxBattQueueId, &msg); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + performI2cReboot = false; + } + i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON; + } + if (i2cRebootCountdown.hasTimedOut()) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); + performI2cReboot = false; + } + } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_ON) { + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_ON); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + performI2cReboot = false; + } + i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; + } else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) { + if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == + PowerSwitchIF::SWITCH_ON) { + // This should always be accepted + commandSelfToSafe(); + i2cRebootState = I2cRebootState::NONE; + alreadyTriedI2cRecovery = true; + i2cRecoveryClearCountdown.resetTimer(); + performI2cReboot = false; + actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); + } + } + + // Timeout handling for the internal procedure. + if (i2cRebootState != I2cRebootState::NONE and i2cRebootCountdown.hasTimedOut()) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); + powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_ON); + alreadyTriedI2cRecovery = true; + i2cRecoveryClearCountdown.resetTimer(); + // This should always be accepted + commandSelfToSafe(); + } + } +} void EiveSystem::commandSelfToSafe() { startTransition(satsystem::Mode::SAFE, 0); } diff --git a/mission/system/EiveSystem.h b/mission/system/EiveSystem.h index cc720828..c06fa910 100644 --- a/mission/system/EiveSystem.h +++ b/mission/system/EiveSystem.h @@ -27,18 +27,22 @@ class EiveSystem : public Subsystem, public HasActionsIF { MessageQueueIF* eventQueue = nullptr; bool performSafeRecovery = false; bool performI2cReboot = false; + bool alreadyTriedI2cRecovery = false; + ActionHelper actionHelper; PowerSwitchIF* powerSwitcher = nullptr; MessageQueueId_t bpxBattQueueId = MessageQueueIF::NO_QUEUE; MessageQueueId_t actionCommandedBy = MessageQueueIF::NO_QUEUE; Countdown i2cRebootCountdown = Countdown(10000); - + // After 1 minute, clear the flag to avoid full reboots on I2C issues. + Countdown i2cRecoveryClearCountdown = Countdown(60000); ReturnValue_t initialize() override; void performChildOperation() override; void announceMode(bool recursive) override; ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) override; + void i2cRecoveryLogic(); void handleEventMessages(); void commandSelfToSafe(); }; From 58aef99bbc93d013f4286abde25dfb60a490ca1a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 17:49:34 +0200 Subject: [PATCH 03/12] theoretically done --- bsp_q7s/core/CoreController.cpp | 28 ++++----- bsp_q7s/core/CoreController.h | 60 +----------------- bsp_q7s/core/ObjectFactory.h | 1 - bsp_q7s/em/emObjectFactory.cpp | 2 +- bsp_q7s/fmObjectFactory.cpp | 2 +- mission/sysDefs.h | 64 ++++++++++++++++++++ mission/system/EiveSystem.cpp | 74 +++++++++++++++++------ mission/system/EiveSystem.h | 16 +++-- mission/system/systemTree.cpp | 4 +- unittest/rebootLogic/src/CoreController.h | 7 +-- 10 files changed, 149 insertions(+), 109 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index c895106b..5f3333f4 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -9,6 +9,7 @@ #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw/timemanager/Stopwatch.h" #include "fsfw/version.h" +#include "mission/sysDefs.h" #include "watchdog/definitions.h" #if OBSW_ADD_TMTC_UDP_SERVER == 1 #include "fsfw/osal/common/UdpTmTcBridge.h" @@ -31,8 +32,7 @@ xsc::Chip CoreController::CURRENT_CHIP = xsc::Chip::NO_CHIP; xsc::Copy CoreController::CURRENT_COPY = xsc::Copy::NO_COPY; -CoreController::CoreController(object_id_t objectId, const std::atomic_uint16_t &i2cErrors, - bool enableHkSet) +CoreController::CoreController(object_id_t objectId, bool enableHkSet) : ExtendedControllerBase(objectId, 5), enableHkSet(enableHkSet), cmdExecutor(4096), @@ -40,8 +40,7 @@ CoreController::CoreController(object_id_t objectId, const std::atomic_uint16_t cmdRepliesSizes(128), opDivider5(5), opDivider10(10), - hkSet(this), - i2cErrors(i2cErrors) { + hkSet(this) { cmdExecutor.setRingBuffer(&cmdReplyBuf, &cmdRepliesSizes); try { sdcMan = SdCardManager::instance(); @@ -110,17 +109,12 @@ void CoreController::performControlOperation() { sdStateMachine(); performMountedSdCardOperations(); readHkData(); - if (i2cErrors >= 5) { - bool protOpPerformed = false; - triggerEvent(I2C_UNAVAILABLE_REBOOT); - gracefulShutdownTasks(CURRENT_CHIP, CURRENT_COPY, protOpPerformed); - std::system("xsc_boot_copy -r"); - } + if (shellCmdIsExecuting) { bool replyReceived = false; // TODO: We could read the data in the ring buffer and send it as an action data reply. if (cmdExecutor.check(replyReceived) == CommandExecutor::EXECUTION_FINISHED) { - actionHelper.finish(true, successRecipient, EXECUTE_SHELL_CMD); + actionHelper.finish(true, successRecipient, core::EXECUTE_SHELL_CMD); shellCmdIsExecuting = false; cmdReplyBuf.clear(); while (not cmdRepliesSizes.empty()) { @@ -163,7 +157,7 @@ ReturnValue_t CoreController::initialize() { sdStateMachine(); - triggerEvent(REBOOT_SW, CURRENT_CHIP, CURRENT_COPY); + triggerEvent(core::REBOOT_SW, CURRENT_CHIP, CURRENT_COPY); EventManagerIF *eventManager = ObjectManager::instance()->get(objects::EVENT_MANAGER); if (eventManager == nullptr or eventQueue == nullptr) { @@ -202,6 +196,7 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() { ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t *data, size_t size) { + using namespace core; switch (actionId) { case (ANNOUNCE_VERSION): { uint32_t p1 = (common::OBSW_VERSION_MAJOR << 24) | (common::OBSW_VERSION_MINOR << 16) | @@ -1324,7 +1319,7 @@ ReturnValue_t CoreController::performSdCardCheck() { someSdCardActive = true; } if (not someSdCardActive and remountAttemptFlag) { - triggerEvent(NO_SD_CARD_ACTIVE); + triggerEvent(core::NO_SD_CARD_ACTIVE); initSdCardBlocking(); remountAttemptFlag = false; } @@ -1378,7 +1373,7 @@ void CoreController::performRebootFileHandling(bool recreateFile) { if (rebootFile.bootFlag) { // Trigger event to inform ground that a reboot was triggered uint32_t p1 = rebootFile.lastChip << 16 | rebootFile.lastCopy; - triggerEvent(REBOOT_MECHANISM_TRIGGERED, p1, 0); + triggerEvent(core::REBOOT_MECHANISM_TRIGGERED, p1, 0); // Clear the boot flag rebootFile.bootFlag = false; } @@ -2047,8 +2042,9 @@ void CoreController::announceBootCounts() { rebootFile.img00Cnt + rebootFile.img01Cnt + rebootFile.img10Cnt + rebootFile.img11Cnt; uint32_t individualBootCountsP1 = (rebootFile.img00Cnt << 16) | rebootFile.img01Cnt; uint32_t individualBootCountsP2 = (rebootFile.img10Cnt << 16) | rebootFile.img11Cnt; - triggerEvent(INDIVIDUAL_BOOT_COUNTS, individualBootCountsP1, individualBootCountsP2); - triggerEvent(REBOOT_COUNTER, (totalBootCount >> 32) & 0xffffffff, totalBootCount & 0xffffffff); + triggerEvent(core::INDIVIDUAL_BOOT_COUNTS, individualBootCountsP1, individualBootCountsP2); + triggerEvent(core::REBOOT_COUNTER, (totalBootCount >> 32) & 0xffffffff, + totalBootCount & 0xffffffff); } bool CoreController::isNumber(const std::string &s) { diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index 72d63b15..53a96cc3 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -78,64 +78,7 @@ class CoreController : public ExtendedControllerBase { static constexpr dur_millis_t INIT_SD_CARD_CHECK_TIMEOUT = 5000; static constexpr dur_millis_t DEFAULT_SD_CARD_CHECK_TIMEOUT = 60000; - static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0; - static constexpr ActionId_t ANNOUNCE_VERSION = 1; - static constexpr ActionId_t ANNOUNCE_CURRENT_IMAGE = 2; - static constexpr ActionId_t ANNOUNCE_BOOT_COUNTS = 3; - static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5; - static constexpr ActionId_t RESET_REBOOT_COUNTERS = 6; - static constexpr ActionId_t SWITCH_IMG_LOCK = 7; - static constexpr ActionId_t SET_MAX_REBOOT_CNT = 8; - - static constexpr ActionId_t OBSW_UPDATE_FROM_SD_0 = 10; - static constexpr ActionId_t OBSW_UPDATE_FROM_SD_1 = 11; - static constexpr ActionId_t OBSW_UPDATE_FROM_TMP = 12; - - static constexpr ActionId_t SWITCH_TO_SD_0 = 16; - static constexpr ActionId_t SWITCH_TO_SD_1 = 17; - static constexpr ActionId_t SWITCH_TO_BOTH_SD_CARDS = 18; - - //! Reboot using the xsc_boot_copy command - static constexpr ActionId_t XSC_REBOOT_OBC = 32; - static constexpr ActionId_t MOUNT_OTHER_COPY = 33; - //! Reboot using the reboot command - static constexpr ActionId_t REBOOT_OBC = 34; - - static constexpr ActionId_t EXECUTE_SHELL_CMD = 40; - - static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE; - - static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM); - //! [EXPORT] : [COMMENT] Software reboot occurred. Can also be a systemd reboot. - //! P1: Current Chip, P2: Current Copy - static constexpr Event REBOOT_SW = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW); - //! [EXPORT] : [COMMENT] 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 - static constexpr Event REBOOT_MECHANISM_TRIGGERED = - event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM); - //! Trying to find a way how to determine that the reboot came from ProASIC3 or PCDU.. - static constexpr Event REBOOT_HW = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM); - //! [EXPORT] : [COMMENT] No SD card was active. Core controller will attempt to re-initialize - //! a SD card. - static constexpr Event NO_SD_CARD_ACTIVE = event::makeEvent(SUBSYSTEM_ID, 4, severity::HIGH); - //! [EXPORT] : [COMMENT] - //! P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash - //! P2: First four letters of Git SHA is the last byte of P1 is set. - static constexpr Event VERSION_INFO = event::makeEvent(SUBSYSTEM_ID, 5, severity::INFO); - //! [EXPORT] : [COMMENT] P1: Current Chip, P2: Current Copy - static constexpr Event CURRENT_IMAGE_INFO = event::makeEvent(SUBSYSTEM_ID, 6, severity::INFO); - //! [EXPORT] : [COMMENT] Total reboot counter, which is the sum of the boot count of all - //! individual images. - static constexpr Event REBOOT_COUNTER = event::makeEvent(SUBSYSTEM_ID, 7, severity::INFO); - //! [EXPORT] : [COMMENT] Get the boot count of the individual images. - //! P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. - //! P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1. - static constexpr Event INDIVIDUAL_BOOT_COUNTS = event::makeEvent(SUBSYSTEM_ID, 8, severity::INFO); - static constexpr Event I2C_UNAVAILABLE_REBOOT = - event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); - - CoreController(object_id_t objectId, const std::atomic_uint16_t& i2cErrors, bool enableHkSet); + CoreController(object_id_t objectId, bool enableHkSet); virtual ~CoreController(); ReturnValue_t initialize() override; @@ -266,7 +209,6 @@ class CoreController : public ExtendedControllerBase { PoolEntry plVoltageEntry = PoolEntry(0.0); core::HkSet hkSet; - const std::atomic_uint16_t& i2cErrors; #if OBSW_SD_CARD_MUST_BE_ON == 1 bool remountAttemptFlag = true; diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index 9daa4d01..b5685389 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -23,7 +23,6 @@ class HealthTableIF; class AcsBoardAssembly; class GpioIF; -extern std::atomic_uint16_t I2C_FATAL_ERRORS; extern std::atomic_bool PTME_LOCKED; namespace ObjectFactory { diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index ca1a54ae..e43d34f2 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -71,7 +71,7 @@ void ObjectFactory::produce(void* args) { dummy::createDummies(dummyCfg, *pwrSwitcher, gpioComIF); - new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS, enableHkSets); + new CoreController(objects::CORE_CONTROLLER, enableHkSets); // Regular FM code, does not work for EM if the hardware is not connected // createPcduComponents(gpioComIF, &pwrSwitcher); diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index 699c2569..050dc9d3 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -46,7 +46,7 @@ void ObjectFactory::produce(void* args) { new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS, enableHkSets); createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets); - satsystem::EIVE_SYSTEM.setPowerSwitcher(pwrSwitcher); + satsystem::EIVE_SYSTEM.setI2cRecoveryParams(I2C_FATAL_ERRORS, pwrSwitcher); auto* stackHandler = new Stack5VHandler(*pwrSwitcher); diff --git a/mission/sysDefs.h b/mission/sysDefs.h index 70ff8138..2b542c82 100644 --- a/mission/sysDefs.h +++ b/mission/sysDefs.h @@ -1,12 +1,76 @@ #ifndef MISSION_SYSDEFS_H_ #define MISSION_SYSDEFS_H_ +#include + #include "acs/defs.h" +extern std::atomic_uint16_t I2C_FATAL_ERRORS; + namespace satsystem { enum Mode : Mode_t { BOOT = 5, SAFE = acs::AcsMode::SAFE, PTG_IDLE = acs::AcsMode::PTG_IDLE }; } +namespace core { +static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0; +static constexpr ActionId_t ANNOUNCE_VERSION = 1; +static constexpr ActionId_t ANNOUNCE_CURRENT_IMAGE = 2; +static constexpr ActionId_t ANNOUNCE_BOOT_COUNTS = 3; +static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5; +static constexpr ActionId_t RESET_REBOOT_COUNTERS = 6; +static constexpr ActionId_t SWITCH_IMG_LOCK = 7; +static constexpr ActionId_t SET_MAX_REBOOT_CNT = 8; + +static constexpr ActionId_t OBSW_UPDATE_FROM_SD_0 = 10; +static constexpr ActionId_t OBSW_UPDATE_FROM_SD_1 = 11; +static constexpr ActionId_t OBSW_UPDATE_FROM_TMP = 12; + +static constexpr ActionId_t SWITCH_TO_SD_0 = 16; +static constexpr ActionId_t SWITCH_TO_SD_1 = 17; +static constexpr ActionId_t SWITCH_TO_BOTH_SD_CARDS = 18; + +//! Reboot using the xsc_boot_copy command +static constexpr ActionId_t XSC_REBOOT_OBC = 32; +static constexpr ActionId_t MOUNT_OTHER_COPY = 33; +//! Reboot using the reboot command +static constexpr ActionId_t REBOOT_OBC = 34; + +static constexpr ActionId_t EXECUTE_SHELL_CMD = 40; + +static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE; + +static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM); +//! [EXPORT] : [COMMENT] Software reboot occurred. Can also be a systemd reboot. +//! P1: Current Chip, P2: Current Copy +static constexpr Event REBOOT_SW = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW); +//! [EXPORT] : [COMMENT] 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 +static constexpr Event REBOOT_MECHANISM_TRIGGERED = + event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM); +//! Trying to find a way how to determine that the reboot came from ProASIC3 or PCDU.. +static constexpr Event REBOOT_HW = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM); +//! [EXPORT] : [COMMENT] No SD card was active. Core controller will attempt to re-initialize +//! a SD card. +static constexpr Event NO_SD_CARD_ACTIVE = event::makeEvent(SUBSYSTEM_ID, 4, severity::HIGH); +//! [EXPORT] : [COMMENT] +//! P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash +//! P2: First four letters of Git SHA is the last byte of P1 is set. +static constexpr Event VERSION_INFO = event::makeEvent(SUBSYSTEM_ID, 5, severity::INFO); +//! [EXPORT] : [COMMENT] P1: Current Chip, P2: Current Copy +static constexpr Event CURRENT_IMAGE_INFO = event::makeEvent(SUBSYSTEM_ID, 6, severity::INFO); +//! [EXPORT] : [COMMENT] Total reboot counter, which is the sum of the boot count of all +//! individual images. +static constexpr Event REBOOT_COUNTER = event::makeEvent(SUBSYSTEM_ID, 7, severity::INFO); +//! [EXPORT] : [COMMENT] Get the boot count of the individual images. +//! P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. +//! P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1. +static constexpr Event INDIVIDUAL_BOOT_COUNTS = event::makeEvent(SUBSYSTEM_ID, 8, severity::INFO); +//! [EXPORT] : [COMMENT] I2C is unavailable. Triggered to system object can take further steps +//! like I2C reboot or reboot. +static constexpr Event I2C_UNAVAILABLE = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); +} // namespace core + #endif /* MISSION_SYSDEFS_H_ */ diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index 1a29507c..c7a6f021 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -13,9 +13,10 @@ #include "mission/sysDefs.h" EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, - uint32_t maxNumberOfTables) + uint32_t maxNumberOfTables, std::atomic_uint16_t& i2cErrors) : Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables), - actionHelper(this, commandQueue) { + actionHelper(this, commandQueue), + i2cErrors(i2cErrors) { auto mqArgs = MqArgs(SubsystemBase::getObjectId(), static_cast(this)); eventQueue = QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); @@ -97,6 +98,7 @@ ReturnValue_t EiveSystem::initialize() { event::getEventId(tcsCtrl::PCDU_SYSTEM_OVERHEATING)); manager->subscribeToEvent(eventQueue->getId(), event::getEventId(tcsCtrl::OBC_OVERHEATING)); + // manager->subscribeToEvent(eventQueue->getId(), event::getEventId(CoreController::)) return Subsystem::initialize(); } @@ -133,6 +135,9 @@ ReturnValue_t EiveSystem::executeAction(ActionId_t actionId, MessageQueueId_t co switch (actionId) { case (EXECUTE_I2C_REBOOT): { performI2cReboot = true; + // This flag is more related to autonomous recovery handling, so we reset it here if this + // reboot sequence is commanded manually. + alreadyTriedI2cRecovery = false; i2cRebootState = I2cRebootState::SYSTEM_MODE_BOOT; this->actionCommandedBy = commandedBy; return returnvalue::OK; @@ -144,36 +149,58 @@ ReturnValue_t EiveSystem::executeAction(ActionId_t actionId, MessageQueueId_t co return returnvalue::OK; } -void EiveSystem::setPowerSwitcher(PowerSwitchIF* pwrSwitcher) { this->powerSwitcher = pwrSwitcher; } +void EiveSystem::setI2cRecoveryParams(PowerSwitchIF* pwrSwitcher) { + this->powerSwitcher = pwrSwitcher; +} void EiveSystem::i2cRecoveryLogic() { ReturnValue_t result; - if (alreadyTriedI2cRecovery and i2cRecoveryClearCountdown.hasTimedOut()) { - alreadyTriedI2cRecovery = false; + if (not performI2cReboot) { + // If a recovery worked, need to reset these flags and the error count after some time. + if (i2cRecoveryClearCountdown.hasTimedOut()) { + i2cErrors = 0; + alreadyTriedI2cRecovery = false; + } + // If an I2C recovery is not ongoing and the I2C error counter is above a threshold, try + // recovery or reboot if recovery was already attempted. + if (i2cErrors >= 5) { + if (not alreadyTriedI2cRecovery) { + // Try recovery. + executeAction(EXECUTE_I2C_REBOOT, MessageQueueIF::NO_QUEUE, nullptr, 0); + } else { + // We already tried an I2C recovery but the bus is still broken. + // Send full reboot request to core controller. + CommandMessage msg; + ActionMessage::setCommand(&msg, core::REBOOT_OBC, store_address_t()); + result = commandQueue->sendMessage(coreCtrlQueueId, &msg); + } + } } if (not isInTransition and performI2cReboot) { if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) { startTransition(satsystem::Mode::BOOT, 0); i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; - i2cRebootCountdown.resetTimer(); + i2cRebootHandlingCountdown.resetTimer(); } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) { if (mode == satsystem::Mode::BOOT) { result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, PowerSwitchIF::SWITCH_OFF); if (result != returnvalue::OK) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - performI2cReboot = false; + commonI2cRecoverySequenceFinish(); + return; } CommandMessage msg; ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t()); result = commandQueue->sendMessage(bpxBattQueueId, &msg); if (result != returnvalue::OK) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - performI2cReboot = false; + commonI2cRecoverySequenceFinish(); + return; } i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON; } - if (i2cRebootCountdown.hasTimedOut()) { + if (i2cRebootHandlingCountdown.hasTimedOut()) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); performI2cReboot = false; } @@ -182,33 +209,40 @@ void EiveSystem::i2cRecoveryLogic() { PowerSwitchIF::SWITCH_ON); if (result != returnvalue::OK) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - performI2cReboot = false; + commonI2cRecoverySequenceFinish(); + return; } i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; } else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) { if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == PowerSwitchIF::SWITCH_ON) { // This should always be accepted - commandSelfToSafe(); - i2cRebootState = I2cRebootState::NONE; - alreadyTriedI2cRecovery = true; - i2cRecoveryClearCountdown.resetTimer(); - performI2cReboot = false; + commonI2cRecoverySequenceFinish(); actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); } } // Timeout handling for the internal procedure. - if (i2cRebootState != I2cRebootState::NONE and i2cRebootCountdown.hasTimedOut()) { + if (i2cRebootState != I2cRebootState::NONE and i2cRebootHandlingCountdown.hasTimedOut()) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); + // Command stack back on in any case. powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, PowerSwitchIF::SWITCH_ON); - alreadyTriedI2cRecovery = true; - i2cRecoveryClearCountdown.resetTimer(); - // This should always be accepted - commandSelfToSafe(); + commonI2cRecoverySequenceFinish(); } } } void EiveSystem::commandSelfToSafe() { startTransition(satsystem::Mode::SAFE, 0); } + +void EiveSystem::commonI2cRecoverySequenceFinish() { + alreadyTriedI2cRecovery = true; + performI2cReboot = false; + i2cRecoveryClearCountdown.resetTimer(); + i2cRebootState = I2cRebootState::NONE; + // Reset this counter. If I2C devices are still problematic, we will get a full reboot + // next time this count goes above 5. + i2cErrors = 0; + // This should always be accepted + commandSelfToSafe(); +} diff --git a/mission/system/EiveSystem.h b/mission/system/EiveSystem.h index c06fa910..d31db17d 100644 --- a/mission/system/EiveSystem.h +++ b/mission/system/EiveSystem.h @@ -5,13 +5,16 @@ #include #include +#include + class EiveSystem : public Subsystem, public HasActionsIF { public: static constexpr ActionId_t EXECUTE_I2C_REBOOT = 10; - EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables); + EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables, + std::atomic_uint16_t& i2cErrors); - void setPowerSwitcher(PowerSwitchIF* pwrSwitcher); + void setI2cRecoveryParams(PowerSwitchIF* pwrSwitcher); [[nodiscard]] MessageQueueId_t getCommandQueue() const override; @@ -31,10 +34,14 @@ class EiveSystem : public Subsystem, public HasActionsIF { ActionHelper actionHelper; PowerSwitchIF* powerSwitcher = nullptr; + std::atomic_uint16_t& i2cErrors; + MessageQueueId_t bpxBattQueueId = MessageQueueIF::NO_QUEUE; + MessageQueueId_t coreCtrlQueueId = MessageQueueIF::NO_QUEUE; MessageQueueId_t actionCommandedBy = MessageQueueIF::NO_QUEUE; - Countdown i2cRebootCountdown = Countdown(10000); - // After 1 minute, clear the flag to avoid full reboots on I2C issues. + Countdown i2cRebootHandlingCountdown = Countdown(10000); + // Countdown i2cUnavailableCountdown = Countdown(30000); + // After 1 minute, clear the flag to avoid full reboots on I2C issues. Countdown i2cRecoveryClearCountdown = Countdown(60000); ReturnValue_t initialize() override; void performChildOperation() override; @@ -45,6 +52,7 @@ class EiveSystem : public Subsystem, public HasActionsIF { void i2cRecoveryLogic(); void handleEventMessages(); void commandSelfToSafe(); + void commonI2cRecoverySequenceFinish(); }; #endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */ diff --git a/mission/system/systemTree.cpp b/mission/system/systemTree.cpp index 2cecf244..73a6b4b7 100644 --- a/mission/system/systemTree.cpp +++ b/mission/system/systemTree.cpp @@ -6,6 +6,8 @@ #include #include +#include + #include "eive/objects.h" #include "mission/com/defs.h" #include "mission/system/acs/acsModeTree.h" @@ -41,7 +43,7 @@ void satsystem::init() { EIVE_SYSTEM.setInitialMode(satsystem::Mode::BOOT, 0); } -EiveSystem satsystem::EIVE_SYSTEM = EiveSystem(objects::EIVE_SYSTEM, 12, 24); +EiveSystem satsystem::EIVE_SYSTEM = EiveSystem(objects::EIVE_SYSTEM, 12, 24, I2C_FATAL_ERRORS); auto EIVE_SEQUENCE_BOOT = std::make_pair(satsystem::Mode::BOOT, FixedArrayList()); auto EIVE_TABLE_BOOT_TGT = diff --git a/unittest/rebootLogic/src/CoreController.h b/unittest/rebootLogic/src/CoreController.h index 1846c27f..0229a10e 100644 --- a/unittest/rebootLogic/src/CoreController.h +++ b/unittest/rebootLogic/src/CoreController.h @@ -47,11 +47,6 @@ class CoreController { static xsc::Chip CURRENT_CHIP; static xsc::Copy CURRENT_COPY; - static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5; - static constexpr ActionId_t RESET_REBOOT_COUNTERS = 6; - static constexpr ActionId_t SWITCH_IMG_LOCK = 7; - static constexpr ActionId_t SET_MAX_REBOOT_CNT = 8; - CoreController(); static void setCurrentBootCopy(xsc::Chip chip, xsc::Copy copy); @@ -76,4 +71,4 @@ class CoreController { SdCardManager* sdcMan = nullptr; RebootFile rebootFile = {}; bool doPerformRebootFileHandling = true; -}; \ No newline at end of file +}; From bfb91f1baafddd5d2b559822d4e7b5fec8e4a844 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 18:06:56 +0200 Subject: [PATCH 04/12] fix for FM build --- bsp_q7s/fmObjectFactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index 050dc9d3..3047d28d 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -44,7 +44,7 @@ void ObjectFactory::produce(void* args) { q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF); gpioCallbacks::disableAllDecoder(gpioComIF); - new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS, enableHkSets); + new CoreController(objects::CORE_CONTROLLER, enableHkSets); createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets); satsystem::EIVE_SYSTEM.setI2cRecoveryParams(I2C_FATAL_ERRORS, pwrSwitcher); From aa78d744b4181e3d1785422cc37f26d26029fda6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 19:23:45 +0200 Subject: [PATCH 05/12] compile fix --- bsp_q7s/fmObjectFactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index 3047d28d..5cb7c751 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -46,7 +46,7 @@ void ObjectFactory::produce(void* args) { new CoreController(objects::CORE_CONTROLLER, enableHkSets); createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets); - satsystem::EIVE_SYSTEM.setI2cRecoveryParams(I2C_FATAL_ERRORS, pwrSwitcher); + satsystem::EIVE_SYSTEM.setI2cRecoveryParams(pwrSwitcher); auto* stackHandler = new Stack5VHandler(*pwrSwitcher); From 103800e40c1c59f0ef5dc3720d79ac8e91c3e12a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 19:26:57 +0200 Subject: [PATCH 06/12] oopsie --- unittest/rebootLogic/src/CoreController.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/unittest/rebootLogic/src/CoreController.h b/unittest/rebootLogic/src/CoreController.h index 0229a10e..1846c27f 100644 --- a/unittest/rebootLogic/src/CoreController.h +++ b/unittest/rebootLogic/src/CoreController.h @@ -47,6 +47,11 @@ class CoreController { static xsc::Chip CURRENT_CHIP; static xsc::Copy CURRENT_COPY; + static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5; + static constexpr ActionId_t RESET_REBOOT_COUNTERS = 6; + static constexpr ActionId_t SWITCH_IMG_LOCK = 7; + static constexpr ActionId_t SET_MAX_REBOOT_CNT = 8; + CoreController(); static void setCurrentBootCopy(xsc::Chip chip, xsc::Copy copy); @@ -71,4 +76,4 @@ class CoreController { SdCardManager* sdcMan = nullptr; RebootFile rebootFile = {}; bool doPerformRebootFileHandling = true; -}; +}; \ No newline at end of file From e4530544c27a3530aedc285623ff90174878d320 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 19:29:51 +0200 Subject: [PATCH 07/12] trigger dedicated events --- mission/sysDefs.h | 3 ++- mission/system/EiveSystem.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mission/sysDefs.h b/mission/sysDefs.h index 2b542c82..f60cdfd6 100644 --- a/mission/sysDefs.h +++ b/mission/sysDefs.h @@ -70,7 +70,8 @@ static constexpr Event REBOOT_COUNTER = event::makeEvent(SUBSYSTEM_ID, 7, severi static constexpr Event INDIVIDUAL_BOOT_COUNTS = event::makeEvent(SUBSYSTEM_ID, 8, severity::INFO); //! [EXPORT] : [COMMENT] I2C is unavailable. Triggered to system object can take further steps //! like I2C reboot or reboot. -static constexpr Event I2C_UNAVAILABLE = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); +static constexpr Event TRYING_I2C_RECOVERY = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); + } // namespace core #endif /* MISSION_SYSDEFS_H_ */ diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index c7a6f021..a6f7f0b3 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -134,6 +134,7 @@ ReturnValue_t EiveSystem::executeAction(ActionId_t actionId, MessageQueueId_t co const uint8_t* data, size_t size) { switch (actionId) { case (EXECUTE_I2C_REBOOT): { + triggerEvent(core::TRYING_I2C_RECOVERY); performI2cReboot = true; // This flag is more related to autonomous recovery handling, so we reset it here if this // reboot sequence is commanded manually. From 2968856d713ae924d545cf8a3834e2a9d4c9239c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 22:35:23 +0200 Subject: [PATCH 08/12] finally works --- dummies/BpxDummy.cpp | 26 +++--- fsfw | 2 +- linux/boardtest/I2cTestClass.cpp | 4 +- mission/controller/ThermalController.h | 12 +-- mission/power/BpxBatteryHandler.cpp | 124 +++++++++++++------------ mission/power/BpxBatteryHandler.h | 2 +- mission/power/bpxBattDefs.h | 47 +++++----- mission/system/EiveSystem.cpp | 111 ++++++++++++++-------- mission/system/EiveSystem.h | 3 + mission/tcs/HeaterHandler.cpp | 1 - mission/tcs/HeaterHandler.h | 4 +- tmtc | 2 +- 12 files changed, 184 insertions(+), 154 deletions(-) diff --git a/dummies/BpxDummy.cpp b/dummies/BpxDummy.cpp index ca546285..085bd841 100644 --- a/dummies/BpxDummy.cpp +++ b/dummies/BpxDummy.cpp @@ -37,19 +37,19 @@ uint32_t BpxDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return ReturnValue_t BpxDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_1, &battTemp1); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_2, &battTemp2); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_3, &battTemp3); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_4, &battTemp4); - localDataPoolMap.emplace(BpxBattery::CHARGE_CURRENT, &chargeCurrent); - localDataPoolMap.emplace(BpxBattery::DISCHARGE_CURRENT, &dischargeCurrent); - localDataPoolMap.emplace(BpxBattery::HEATER_CURRENT, &heaterCurrent); - localDataPoolMap.emplace(BpxBattery::BATT_VOLTAGE, &battVolt); - localDataPoolMap.emplace(BpxBattery::REBOOT_COUNTER, &rebootCounter); - localDataPoolMap.emplace(BpxBattery::BOOTCAUSE, &bootCause); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_1, &battTemp1); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_2, &battTemp2); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_3, &battTemp3); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_4, &battTemp4); + localDataPoolMap.emplace(bpxBat::CHARGE_CURRENT, &chargeCurrent); + localDataPoolMap.emplace(bpxBat::DISCHARGE_CURRENT, &dischargeCurrent); + localDataPoolMap.emplace(bpxBat::HEATER_CURRENT, &heaterCurrent); + localDataPoolMap.emplace(bpxBat::BATT_VOLTAGE, &battVolt); + localDataPoolMap.emplace(bpxBat::REBOOT_COUNTER, &rebootCounter); + localDataPoolMap.emplace(bpxBat::BOOTCAUSE, &bootCause); - localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh); + localDataPoolMap.emplace(bpxBat::BATTERY_HEATER_MODE, &battheatMode); + localDataPoolMap.emplace(bpxBat::BATTHEAT_LOW_LIMIT, &battheatLow); + localDataPoolMap.emplace(bpxBat::BATTHEAT_HIGH_LIMIT, &battheatHigh); return returnvalue::OK; } diff --git a/fsfw b/fsfw index 6650c293..5a930476 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 6650c293da09d8851c2bd6c4d6e6c5a8390d003e +Subproject commit 5a9304765f670685b6ca27cc9e6064012a17bab7 diff --git a/linux/boardtest/I2cTestClass.cpp b/linux/boardtest/I2cTestClass.cpp index 4d4e6267..1b9f82fe 100644 --- a/linux/boardtest/I2cTestClass.cpp +++ b/linux/boardtest/I2cTestClass.cpp @@ -37,7 +37,7 @@ void I2cTestClass::battInit() { if (ioctl(bpxInfo.fd, I2C_SLAVE, bpxInfo.addr) < 0) { sif::error << "Failed to acquire bus access and/or talk to slave" << std::endl; } - cmdBuf[0] = BpxBattery::PORT_PING; + cmdBuf[0] = bpxBat::PORT_PING; cmdBuf[1] = 0x42; sendLen = 2; ReturnValue_t result = i2cWrite(bpxInfo.fd, cmdBuf.data(), sendLen); @@ -66,7 +66,7 @@ void I2cTestClass::battPeriodic() { if (ioctl(bpxInfo.fd, I2C_SLAVE, bpxInfo.addr) < 0) { sif::error << "Failed to acquire bus access and/or talk to slave" << std::endl; } - cmdBuf[0] = BpxBattery::PORT_GET_HK; + cmdBuf[0] = bpxBat::PORT_GET_HK; sendLen = 1; ReturnValue_t result = i2cWrite(bpxInfo.fd, cmdBuf.data(), sendLen); if (result != returnvalue::OK) { diff --git a/mission/controller/ThermalController.h b/mission/controller/ThermalController.h index d531e813..631a37aa 100644 --- a/mission/controller/ThermalController.h +++ b/mission/controller/ThermalController.h @@ -182,14 +182,10 @@ class ThermalController : public ExtendedControllerBase { susMax1227::SusDataset susSet11; lp_var_t tempQ7s = lp_var_t(objects::CORE_CONTROLLER, core::PoolIds::TEMPERATURE); - lp_var_t battTemp1 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_1); - lp_var_t battTemp2 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_2); - lp_var_t battTemp3 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_3); - lp_var_t battTemp4 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_4); + lp_var_t battTemp1 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_1); + lp_var_t battTemp2 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_2); + lp_var_t battTemp3 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_3); + lp_var_t battTemp4 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_4); lp_var_t tempRw1 = lp_var_t(objects::RW1, rws::TEMPERATURE_C); lp_var_t tempRw2 = lp_var_t(objects::RW2, rws::TEMPERATURE_C); lp_var_t tempRw3 = lp_var_t(objects::RW3, rws::TEMPERATURE_C); diff --git a/mission/power/BpxBatteryHandler.cpp b/mission/power/BpxBatteryHandler.cpp index 6b258ab2..b4aece40 100644 --- a/mission/power/BpxBatteryHandler.cpp +++ b/mission/power/BpxBatteryHandler.cpp @@ -27,54 +27,56 @@ void BpxBatteryHandler::doStartUp() { void BpxBatteryHandler::doShutDown() { // Perform a COM check on reboot state = States::CHECK_COM; + setMode(MODE_OFF); } ReturnValue_t BpxBatteryHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { - *id = BpxBattery::GET_HK; + *id = bpxBat::GET_HK; return buildCommandFromCommand(*id, nullptr, 0); } ReturnValue_t BpxBatteryHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { if (state == States::CHECK_COM) { - *id = BpxBattery::PING; + *id = bpxBat::PING; return buildCommandFromCommand(*id, nullptr, 0); } return returnvalue::OK; } void BpxBatteryHandler::fillCommandAndReplyMap() { - using namespace BpxBattery; + using namespace bpxBat; insertInCommandAndReplyMap(GET_HK, 1, &hkSet, GET_HK_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::PING, 1, nullptr, PING_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::REBOOT, 1, nullptr, 0); - insertInCommandAndReplyMap(BpxBattery::RESET_COUNTERS, 1, nullptr, EMPTY_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::CONFIG_CMD, 1, nullptr, EMPTY_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::CONFIG_GET, 1, &cfgSet, CONFIG_GET_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::PING, 1, nullptr, PING_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::REBOOT, 1, nullptr, 0); + insertInCommandAndReplyMap(bpxBat::RESET_COUNTERS, 1, nullptr, EMPTY_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::CONFIG_CMD, 1, nullptr, EMPTY_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::CONFIG_GET, 1, &cfgSet, CONFIG_GET_REPLY_LEN); } ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, size_t commandDataLen) { switch (deviceCommand) { - case (BpxBattery::GET_HK): { - cmdBuf[0] = BpxBattery::PORT_GET_HK; + case (bpxBat::GET_HK): { + cmdBuf[0] = bpxBat::PORT_GET_HK; this->rawPacketLen = 1; break; } - case (BpxBattery::PING): { + case (bpxBat::PING): { if (commandDataLen == 1 and commandData != nullptr) { sentPingByte = commandData[0]; } else { - sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE; + sentPingByte = bpxBat::DEFAULT_PING_SENT_BYTE; } - cmdBuf[0] = BpxBattery::PORT_PING; + cmdBuf[0] = bpxBat::PORT_PING; cmdBuf[1] = sentPingByte; this->rawPacketLen = 2; break; } - case (BpxBattery::REBOOT): { - cmdBuf[0] = BpxBattery::PORT_REBOOT; + case (bpxBat::REBOOT): { + sif::info << "BPX BATT: Executing reboot command" << std::endl; + cmdBuf[0] = bpxBat::PORT_REBOOT; cmdBuf[1] = 0x80; cmdBuf[2] = 0x07; cmdBuf[3] = 0x80; @@ -85,26 +87,26 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic triggerEvent(DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT); break; } - case (BpxBattery::RESET_COUNTERS): { - cmdBuf[0] = BpxBattery::PORT_RESET_COUNTERS; - cmdBuf[1] = BpxBattery::RESET_COUNTERS_MAGIC_VALUE; + case (bpxBat::RESET_COUNTERS): { + cmdBuf[0] = bpxBat::PORT_RESET_COUNTERS; + cmdBuf[1] = bpxBat::RESET_COUNTERS_MAGIC_VALUE; this->rawPacketLen = 2; break; } - case (BpxBattery::CONFIG_CMD): { - cmdBuf[0] = BpxBattery::PORT_CONFIG_CMD; + case (bpxBat::CONFIG_CMD): { + cmdBuf[0] = bpxBat::PORT_CONFIG_CMD; // Needs to be set to 0x01 according to datasheet cmdBuf[1] = 0x01; this->rawPacketLen = 2; break; } - case (BpxBattery::CONFIG_GET): { - cmdBuf[0] = BpxBattery::PORT_CONFIG_GET; + case (bpxBat::CONFIG_GET): { + cmdBuf[0] = bpxBat::PORT_CONFIG_GET; this->rawPacketLen = 1; break; } - case (BpxBattery::CONFIG_SET): { - cmdBuf[0] = BpxBattery::PORT_CONFIG_SET; + case (bpxBat::CONFIG_SET): { + cmdBuf[0] = bpxBat::PORT_CONFIG_SET; if (commandDataLen != 3) { return DeviceHandlerIF::INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS; } @@ -114,8 +116,8 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic this->rawPacketLen = 4; break; } - case (BpxBattery::MAN_HEAT_ON): { - cmdBuf[0] = BpxBattery::PORT_MAN_HEAT_ON; + case (bpxBat::MAN_HEAT_ON): { + cmdBuf[0] = bpxBat::PORT_MAN_HEAT_ON; if (commandDataLen != 2) { return DeviceHandlerIF::INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS; } @@ -125,8 +127,8 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic this->rawPacketLen = 3; break; } - case (BpxBattery::MAN_HEAT_OFF): { - cmdBuf[0] = BpxBattery::PORT_MAN_HEAT_OFF; + case (bpxBat::MAN_HEAT_OFF): { + cmdBuf[0] = bpxBat::PORT_MAN_HEAT_OFF; this->rawPacketLen = 1; break; } @@ -142,35 +144,35 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic ReturnValue_t BpxBatteryHandler::scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) { - using namespace BpxBattery; + using namespace bpxBat; switch (lastCmd) { - case (BpxBattery::GET_HK): { + case (bpxBat::GET_HK): { if (remainingSize != GET_HK_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } break; } - case (BpxBattery::PING): - case (BpxBattery::MAN_HEAT_ON): - case (BpxBattery::MAN_HEAT_OFF): { + case (bpxBat::PING): + case (bpxBat::MAN_HEAT_ON): + case (bpxBat::MAN_HEAT_OFF): { if (remainingSize != PING_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } break; } - case (BpxBattery::REBOOT): { + case (bpxBat::REBOOT): { // Ignore break; } - case (BpxBattery::RESET_COUNTERS): - case (BpxBattery::CONFIG_CMD): - case (BpxBattery::CONFIG_SET): { + case (bpxBat::RESET_COUNTERS): + case (bpxBat::CONFIG_CMD): + case (bpxBat::CONFIG_SET): { if (remainingSize != EMPTY_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } break; } - case (BpxBattery::CONFIG_GET): { + case (bpxBat::CONFIG_GET): { if (remainingSize != CONFIG_GET_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } @@ -187,11 +189,11 @@ ReturnValue_t BpxBatteryHandler::scanForReply(const uint8_t* start, size_t remai } ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { - if (id != BpxBattery::REBOOT and packet[1] != 0) { + if (id != bpxBat::REBOOT and packet[1] != 0) { return DeviceHandlerIF::DEVICE_REPORTED_ERROR; } switch (id) { - case (BpxBattery::GET_HK): { + case (bpxBat::GET_HK): { PoolReadGuard rg(&hkSet); ReturnValue_t result = hkSet.parseRawHk(packet + 2, 21); hkSet.setValidity(true, true); @@ -213,7 +215,7 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons } break; } - case (BpxBattery::PING): { + case (bpxBat::PING): { if (packet[2] != sentPingByte) { return DeviceHandlerIF::INVALID_DATA; } @@ -222,19 +224,19 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons } break; } - case (BpxBattery::RESET_COUNTERS): - case (BpxBattery::CONFIG_CMD): - case (BpxBattery::CONFIG_SET): { + case (bpxBat::RESET_COUNTERS): + case (bpxBat::CONFIG_CMD): + case (bpxBat::CONFIG_SET): { break; } - case (BpxBattery::MAN_HEAT_ON): - case (BpxBattery::MAN_HEAT_OFF): { + case (bpxBat::MAN_HEAT_ON): + case (bpxBat::MAN_HEAT_OFF): { if (packet[2] != 0x01) { return DeviceHandlerIF::DEVICE_DID_NOT_EXECUTE; } break; } - case (BpxBattery::CONFIG_GET): { + case (bpxBat::CONFIG_GET): { PoolReadGuard rg(&cfgSet); ReturnValue_t result = cfgSet.parseRawHk(packet + 2, 3); if (result != returnvalue::OK) { @@ -243,7 +245,7 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons cfgSet.setValidity(true, true); break; } - case (BpxBattery::REBOOT): { + case (bpxBat::REBOOT): { break; } default: { @@ -257,20 +259,20 @@ uint32_t BpxBatteryHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) ReturnValue_t BpxBatteryHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_1, &battTemp1); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_2, &battTemp2); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_3, &battTemp3); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_4, &battTemp4); - localDataPoolMap.emplace(BpxBattery::CHARGE_CURRENT, &chargeCurrent); - localDataPoolMap.emplace(BpxBattery::DISCHARGE_CURRENT, &dischargeCurrent); - localDataPoolMap.emplace(BpxBattery::HEATER_CURRENT, &heaterCurrent); - localDataPoolMap.emplace(BpxBattery::BATT_VOLTAGE, &battVolt); - localDataPoolMap.emplace(BpxBattery::REBOOT_COUNTER, &rebootCounter); - localDataPoolMap.emplace(BpxBattery::BOOTCAUSE, &bootCause); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_1, &battTemp1); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_2, &battTemp2); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_3, &battTemp3); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_4, &battTemp4); + localDataPoolMap.emplace(bpxBat::CHARGE_CURRENT, &chargeCurrent); + localDataPoolMap.emplace(bpxBat::DISCHARGE_CURRENT, &dischargeCurrent); + localDataPoolMap.emplace(bpxBat::HEATER_CURRENT, &heaterCurrent); + localDataPoolMap.emplace(bpxBat::BATT_VOLTAGE, &battVolt); + localDataPoolMap.emplace(bpxBat::REBOOT_COUNTER, &rebootCounter); + localDataPoolMap.emplace(bpxBat::BOOTCAUSE, &bootCause); - localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh); + localDataPoolMap.emplace(bpxBat::BATTERY_HEATER_MODE, &battheatMode); + localDataPoolMap.emplace(bpxBat::BATTHEAT_LOW_LIMIT, &battheatLow); + localDataPoolMap.emplace(bpxBat::BATTHEAT_HIGH_LIMIT, &battheatHigh); poolManager.subscribeForRegularPeriodicPacket( subdp::RegularHkPeriodicParams(hkSet.getSid(), enableHkSets, 20.0)); diff --git a/mission/power/BpxBatteryHandler.h b/mission/power/BpxBatteryHandler.h index 0f6d835c..d01691a9 100644 --- a/mission/power/BpxBatteryHandler.h +++ b/mission/power/BpxBatteryHandler.h @@ -25,7 +25,7 @@ class BpxBatteryHandler : public DeviceHandlerBase { bool commandExecuted = false; bool debugMode = false; bool goToNormalModeImmediately = false; - uint8_t sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE; + uint8_t sentPingByte = bpxBat::DEFAULT_PING_SENT_BYTE; #if OBSW_THREAD_TRACING == 1 uint32_t opCounter = 0; #endif diff --git a/mission/power/bpxBattDefs.h b/mission/power/bpxBattDefs.h index 1808c94a..6df87efd 100644 --- a/mission/power/bpxBattDefs.h +++ b/mission/power/bpxBattDefs.h @@ -8,7 +8,7 @@ #include "fsfw/devicehandlers/DeviceHandlerIF.h" -namespace BpxBattery { +namespace bpxBat { enum LocalPoolIds { CHARGE_CURRENT = 0, @@ -114,18 +114,18 @@ class BpxHkDeserializer : public SerialLinkedListAdapter { } }; -}; // namespace BpxBattery +}; // namespace bpxBat /** * @brief BPX HK data holder */ -class BpxBatteryHk : public StaticLocalDataSet { +class BpxBatteryHk : public StaticLocalDataSet { public: /** * Constructor for data users * @param gyroId */ - BpxBatteryHk(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, BpxBattery::HK_SET_ID)) { + BpxBatteryHk(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, bpxBat::HK_SET_ID)) { setAllVariablesReadOnly(); } @@ -176,28 +176,25 @@ class BpxBatteryHk : public StaticLocalDataSet { } //! Charge current in mA - lp_var_t chargeCurrent = - lp_var_t(sid.objectId, BpxBattery::CHARGE_CURRENT, this); + lp_var_t chargeCurrent = lp_var_t(sid.objectId, bpxBat::CHARGE_CURRENT, this); //! Discharge current in mA lp_var_t dischargeCurrent = - lp_var_t(sid.objectId, BpxBattery::DISCHARGE_CURRENT, this); + lp_var_t(sid.objectId, bpxBat::DISCHARGE_CURRENT, this); //! Heater current in mA - lp_var_t heaterCurrent = - lp_var_t(sid.objectId, BpxBattery::HEATER_CURRENT, this); + lp_var_t heaterCurrent = lp_var_t(sid.objectId, bpxBat::HEATER_CURRENT, this); //! Battery voltage in mV - lp_var_t battVoltage = lp_var_t(sid.objectId, BpxBattery::BATT_VOLTAGE, this); + lp_var_t battVoltage = lp_var_t(sid.objectId, bpxBat::BATT_VOLTAGE, this); //! Battery temperature 1 in degC - lp_var_t battTemp1 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_1, this); + lp_var_t battTemp1 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_1, this); //! Battery temperature 2 in degC - lp_var_t battTemp2 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_2, this); + lp_var_t battTemp2 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_2, this); //! Battery temperature 3 in degC - lp_var_t battTemp3 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_3, this); + lp_var_t battTemp3 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_3, this); //! Battery temperature 4 in degC - lp_var_t battTemp4 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_4, this); - lp_var_t rebootCounter = - lp_var_t(sid.objectId, BpxBattery::REBOOT_COUNTER, this); - lp_var_t bootcause = lp_var_t(sid.objectId, BpxBattery::BOOTCAUSE, this); + lp_var_t battTemp4 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_4, this); + lp_var_t rebootCounter = lp_var_t(sid.objectId, bpxBat::REBOOT_COUNTER, this); + lp_var_t bootcause = lp_var_t(sid.objectId, bpxBat::BOOTCAUSE, this); private: friend class BpxBatteryHandler; @@ -205,16 +202,16 @@ class BpxBatteryHk : public StaticLocalDataSet { * Constructor for data creator * @param hkOwner */ - BpxBatteryHk(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, BpxBattery::HK_SET_ID) {} + BpxBatteryHk(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, bpxBat::HK_SET_ID) {} }; -class BpxBatteryCfg : public StaticLocalDataSet { +class BpxBatteryCfg : public StaticLocalDataSet { public: /** * Constructor for data users * @param gyroId */ - BpxBatteryCfg(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, BpxBattery::CFG_SET_ID)) { + BpxBatteryCfg(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, bpxBat::CFG_SET_ID)) { setAllVariablesReadOnly(); } @@ -230,13 +227,12 @@ class BpxBatteryCfg : public StaticLocalDataSet { //! Mode for battheater [0=OFF,1=Auto] lp_var_t battheatermode = - lp_var_t(sid.objectId, BpxBattery::BATTERY_HEATER_MODE, this); + lp_var_t(sid.objectId, bpxBat::BATTERY_HEATER_MODE, this); //! Turn heater on at [degC] - lp_var_t battheaterLow = - lp_var_t(sid.objectId, BpxBattery::BATTHEAT_LOW_LIMIT, this); + lp_var_t battheaterLow = lp_var_t(sid.objectId, bpxBat::BATTHEAT_LOW_LIMIT, this); //! Turn heater off at [degC] lp_var_t battheaterHigh = - lp_var_t(sid.objectId, BpxBattery::BATTHEAT_HIGH_LIMIT, this); + lp_var_t(sid.objectId, bpxBat::BATTHEAT_HIGH_LIMIT, this); private: friend class BpxBatteryHandler; @@ -244,8 +240,7 @@ class BpxBatteryCfg : public StaticLocalDataSet { * Constructor for data creator * @param hkOwner */ - BpxBatteryCfg(HasLocalDataPoolIF* hkOwner) - : StaticLocalDataSet(hkOwner, BpxBattery::CFG_SET_ID) {} + BpxBatteryCfg(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, bpxBat::CFG_SET_ID) {} }; #endif /* MISSION_POWER_BPXBATTDEFS_H_ */ diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index a6f7f0b3..fd8c170d 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -73,11 +73,19 @@ ReturnValue_t EiveSystem::initialize() { if (result != returnvalue::OK) { return result; } + auto* bpxDest = ObjectManager::instance()->get(objects::BPX_BATT_HANDLER); if (bpxDest == nullptr) { return ObjectManager::CHILD_INIT_FAILED; } bpxBattQueueId = bpxDest->getCommandQueue(); + + auto* coreCtrl = ObjectManager::instance()->get(objects::CORE_CONTROLLER); + if (coreCtrl == nullptr) { + return ObjectManager::CHILD_INIT_FAILED; + } + coreCtrlQueueId = coreCtrl->getCommandQueue(); + auto* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); if (manager == nullptr) { #if FSFW_CPP_OSTREAM_ENABLED == 1 @@ -178,51 +186,71 @@ void EiveSystem::i2cRecoveryLogic() { } } if (not isInTransition and performI2cReboot) { - if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) { - startTransition(satsystem::Mode::BOOT, 0); - i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; - i2cRebootHandlingCountdown.resetTimer(); - } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) { - if (mode == satsystem::Mode::BOOT) { - result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_OFF); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - commonI2cRecoverySequenceFinish(); - return; - } - CommandMessage msg; - ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t()); - result = commandQueue->sendMessage(bpxBattQueueId, &msg); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - commonI2cRecoverySequenceFinish(); - return; + switch (i2cRebootState) { + case (I2cRebootState::NONE): { + break; + } + case (I2cRebootState::SYSTEM_MODE_BOOT): { + sif::debug << "going to boot mode" << std::endl; + startTransition(satsystem::Mode::BOOT, 0); + i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; + i2cRebootHandlingCountdown.resetTimer(); + break; + } + case (I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT): { + sif::debug << "3v3 stack off and batt reboot" << std::endl; + if (mode == satsystem::Mode::BOOT) { + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_OFF); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + commonI2cRecoverySequenceFinish(); + return; + } + CommandMessage msg; + store_address_t dummy{}; + ActionMessage::setCommand(&msg, bpxBat::REBOOT, dummy); + result = commandQueue->sendMessage(bpxBattQueueId, &msg); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + commonI2cRecoverySequenceFinish(); + return; + } + i2cRebootState = I2cRebootState::WAIT_CYCLE; } + break; + } + case (I2cRebootState::WAIT_CYCLE): { i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON; + break; } - if (i2cRebootHandlingCountdown.hasTimedOut()) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); - performI2cReboot = false; + case (I2cRebootState::SWITCH_3V3_STACK_ON): { + sif::debug << "3v3 stack on" << std::endl; + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_ON); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + commonI2cRecoverySequenceFinish(); + return; + } + i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; + break; } - } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_ON) { - result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_ON); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - commonI2cRecoverySequenceFinish(); - return; + case (I2cRebootState::SYSTEM_MODE_SAFE): { + if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == + PowerSwitchIF::SWITCH_ON) { + // This should always be accepted + commonI2cRecoverySequenceFinish(); + sif::debug << "going back to safe" << std::endl; + actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); + } + break; } - i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; - } else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) { - if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == - PowerSwitchIF::SWITCH_ON) { - // This should always be accepted - commonI2cRecoverySequenceFinish(); - actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); + default: { + sif::error << "EiveSystem: Unexpected I2C reboot state" << std::endl; + break; } } - // Timeout handling for the internal procedure. if (i2cRebootState != I2cRebootState::NONE and i2cRebootHandlingCountdown.hasTimedOut()) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); @@ -247,3 +275,10 @@ void EiveSystem::commonI2cRecoverySequenceFinish() { // This should always be accepted commandSelfToSafe(); } + +ReturnValue_t EiveSystem::handleCommandMessage(CommandMessage* message) { + if (message->getMessageType() == messagetypes::ACTION) { + return actionHelper.handleActionMessage(message); + } + return Subsystem::handleCommandMessage(message); +} diff --git a/mission/system/EiveSystem.h b/mission/system/EiveSystem.h index d31db17d..fd1d540c 100644 --- a/mission/system/EiveSystem.h +++ b/mission/system/EiveSystem.h @@ -23,6 +23,7 @@ class EiveSystem : public Subsystem, public HasActionsIF { NONE, SYSTEM_MODE_BOOT, SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT, + WAIT_CYCLE, SWITCH_3V3_STACK_ON, SYSTEM_MODE_SAFE } i2cRebootState = I2cRebootState::NONE; @@ -49,6 +50,8 @@ class EiveSystem : public Subsystem, public HasActionsIF { ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) override; + ReturnValue_t handleCommandMessage(CommandMessage* message) override; + void i2cRecoveryLogic(); void handleEventMessages(); void commandSelfToSafe(); diff --git a/mission/tcs/HeaterHandler.cpp b/mission/tcs/HeaterHandler.cpp index 4ec82c08..9105e380 100644 --- a/mission/tcs/HeaterHandler.cpp +++ b/mission/tcs/HeaterHandler.cpp @@ -331,7 +331,6 @@ void HeaterHandler::handleSwitchOffCommand(heater::Switchers heaterIdx) { } } } else { - sif::info << "HeaterHandler::handleSwitchOffCommand: Switch already off" << std::endl; triggerEvent(SWITCH_ALREADY_OFF, heaterIdx); } if (heater.replyQueue != NO_COMMANDER) { diff --git a/mission/tcs/HeaterHandler.h b/mission/tcs/HeaterHandler.h index 6787b660..5bbd85f4 100644 --- a/mission/tcs/HeaterHandler.h +++ b/mission/tcs/HeaterHandler.h @@ -101,8 +101,8 @@ class HeaterHandler : public ExecutableObjectIF, static constexpr Event GPIO_PULL_LOW_FAILED = MAKE_EVENT(1, severity::LOW); static constexpr Event HEATER_WENT_ON = event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); static constexpr Event HEATER_WENT_OFF = event::makeEvent(SUBSYSTEM_ID, 3, severity::INFO); - static constexpr Event SWITCH_ALREADY_ON = MAKE_EVENT(4, severity::LOW); - static constexpr Event SWITCH_ALREADY_OFF = MAKE_EVENT(5, severity::LOW); + static constexpr Event SWITCH_ALREADY_ON = MAKE_EVENT(4, severity::INFO); + static constexpr Event SWITCH_ALREADY_OFF = MAKE_EVENT(5, severity::INFO); static constexpr Event MAIN_SWITCH_TIMEOUT = MAKE_EVENT(6, severity::MEDIUM); //! A faulty heater was one. The SW will autonomously attempt to shut it down. P1: Heater Index static constexpr Event FAULTY_HEATER_WAS_ON = event::makeEvent(SUBSYSTEM_ID, 7, severity::LOW); diff --git a/tmtc b/tmtc index 7e5fa2e6..ad082760 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 7e5fa2e61a3f2b50860fe2e3427f31f7ebaf854f +Subproject commit ad0827607958d0bfbe3dfb903cdd8a65a71e0e7a From ca44b541b16e32159b73fd64fd81aa9fcc81ac4b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 22:37:38 +0200 Subject: [PATCH 09/12] remove debug statements --- mission/system/EiveSystem.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index fd8c170d..1f373a62 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -191,14 +191,12 @@ void EiveSystem::i2cRecoveryLogic() { break; } case (I2cRebootState::SYSTEM_MODE_BOOT): { - sif::debug << "going to boot mode" << std::endl; startTransition(satsystem::Mode::BOOT, 0); i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; i2cRebootHandlingCountdown.resetTimer(); break; } case (I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT): { - sif::debug << "3v3 stack off and batt reboot" << std::endl; if (mode == satsystem::Mode::BOOT) { result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, PowerSwitchIF::SWITCH_OFF); @@ -225,7 +223,6 @@ void EiveSystem::i2cRecoveryLogic() { break; } case (I2cRebootState::SWITCH_3V3_STACK_ON): { - sif::debug << "3v3 stack on" << std::endl; result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, PowerSwitchIF::SWITCH_ON); if (result != returnvalue::OK) { @@ -241,7 +238,6 @@ void EiveSystem::i2cRecoveryLogic() { PowerSwitchIF::SWITCH_ON) { // This should always be accepted commonI2cRecoverySequenceFinish(); - sif::debug << "going back to safe" << std::endl; actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); } break; From e9fc0c453d8ee0dad915ee8da7e2fd4d8283a62a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 22:39:57 +0200 Subject: [PATCH 10/12] that should do the job --- mission/sysDefs.h | 6 ++++-- mission/system/EiveSystem.cpp | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mission/sysDefs.h b/mission/sysDefs.h index f60cdfd6..1abff6c6 100644 --- a/mission/sysDefs.h +++ b/mission/sysDefs.h @@ -68,9 +68,11 @@ static constexpr Event REBOOT_COUNTER = event::makeEvent(SUBSYSTEM_ID, 7, severi //! P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. //! P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1. static constexpr Event INDIVIDUAL_BOOT_COUNTS = event::makeEvent(SUBSYSTEM_ID, 8, severity::INFO); -//! [EXPORT] : [COMMENT] I2C is unavailable. Triggered to system object can take further steps -//! like I2C reboot or reboot. +//! [EXPORT] : [COMMENT] I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C +//! devices. static constexpr Event TRYING_I2C_RECOVERY = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); +//! [EXPORT] : [COMMENT] I2C is unavailable. Recovery did not work, performing full reboot. +static constexpr Event I2C_REBOOT = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); } // namespace core diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index 1f373a62..8eced106 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -169,6 +169,7 @@ void EiveSystem::i2cRecoveryLogic() { if (i2cRecoveryClearCountdown.hasTimedOut()) { i2cErrors = 0; alreadyTriedI2cRecovery = false; + i2cRebootHandlingCountdown.resetTimer(); } // If an I2C recovery is not ongoing and the I2C error counter is above a threshold, try // recovery or reboot if recovery was already attempted. From f9ed42f8a5bb7ce5cefbbdfc6767167e4be04630 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 7 Apr 2023 11:04:13 +0200 Subject: [PATCH 11/12] re-ran generators --- .../fsfwconfig/events/translateEvents.cpp | 6 ++--- .../fsfwconfig/objects/translateObjects.cpp | 2 +- fsfw | 2 +- generators/bsp_hosted_events.csv | 24 +++++++++---------- generators/bsp_hosted_returnvalues.csv | 10 ++++---- generators/bsp_q7s_events.csv | 24 +++++++++---------- generators/bsp_q7s_returnvalues.csv | 13 ++++------ generators/events/translateEvents.cpp | 6 ++--- generators/objects/translateObjects.cpp | 2 +- linux/acs/ImtqPollingTask.h | 1 + linux/com/SyrlinksComHandler.h | 1 + linux/fsfwconfig/events/translateEvents.cpp | 6 ++--- linux/fsfwconfig/objects/translateObjects.cpp | 2 +- linux/payload/ScexHelper.h | 1 + tmtc | 2 +- 15 files changed, 51 insertions(+), 51 deletions(-) diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index 25c6c39d..9cfe0a1d 100644 --- a/bsp_hosted/fsfwconfig/events/translateEvents.cpp +++ b/bsp_hosted/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 284 translations. * @details - * Generated on: 2023-04-04 13:59:07 + * Generated on: 2023-04-07 11:03:10 */ #include "translateEvents.h" @@ -266,7 +266,7 @@ const char *VERSION_INFO_STRING = "VERSION_INFO"; const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO"; const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER"; const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS"; -const char *I2C_UNAVAILABLE_REBOOT_STRING = "I2C_UNAVAILABLE_REBOOT"; +const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING"; @@ -815,7 +815,7 @@ const char *translateEvents(Event event) { case (14008): return INDIVIDUAL_BOOT_COUNTS_STRING; case (14010): - return I2C_UNAVAILABLE_REBOOT_STRING; + return I2C_REBOOT_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; case (14101): diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 8962edfc..7349542a 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 171 translations. - * Generated on: 2023-04-04 13:59:07 + * Generated on: 2023-04-07 11:03:10 */ #include "translateObjects.h" diff --git a/fsfw b/fsfw index 5a930476..e97fa5ac 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 5a9304765f670685b6ca27cc9e6064012a17bab7 +Subproject commit e97fa5ac84db7ab5c10a31c2c78b26057cfacb71 diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index d7265738..678b1935 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -101,8 +101,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/tcs/HeaterHandler.h 11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/tcs/HeaterHandler.h 11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/tcs/HeaterHandler.h -11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/tcs/HeaterHandler.h -11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/tcs/HeaterHandler.h +11404;0x2c8c;SWITCH_ALREADY_ON;INFO;No description;mission/tcs/HeaterHandler.h +11405;0x2c8d;SWITCH_ALREADY_OFF;INFO;No description;mission/tcs/HeaterHandler.h 11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/tcs/HeaterHandler.h 11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/tcs/HeaterHandler.h 11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h @@ -251,16 +251,16 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13904;0x3650;WRITE_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13905;0x3651;READ_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h -14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;bsp_q7s/core/CoreController.h -14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h -14002;0x36b2;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 -14003;0x36b3;REBOOT_HW;MEDIUM;No description;bsp_q7s/core/CoreController.h -14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;bsp_q7s/core/CoreController.h -14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;bsp_q7s/core/CoreController.h -14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h -14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;bsp_q7s/core/CoreController.h -14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;bsp_q7s/core/CoreController.h -14010;0x36ba;I2C_UNAVAILABLE_REBOOT;MEDIUM;No description;bsp_q7s/core/CoreController.h +14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;mission/sysDefs.h +14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;mission/sysDefs.h +14002;0x36b2;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;mission/sysDefs.h +14003;0x36b3;REBOOT_HW;MEDIUM;No description;mission/sysDefs.h +14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;mission/sysDefs.h +14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h +14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;mission/sysDefs.h +14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;mission/sysDefs.h +14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;mission/sysDefs.h +14010;0x36ba;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h 14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h 14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h 14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h diff --git a/generators/bsp_hosted_returnvalues.csv b/generators/bsp_hosted_returnvalues.csv index 0b20221c..e43bf523 100644 --- a/generators/bsp_hosted_returnvalues.csv +++ b/generators/bsp_hosted_returnvalues.csv @@ -371,8 +371,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e03;HKM_PeriodicHelperInvalid;No description;3;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3e04;HKM_PoolobjectNotFound;No description;4;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h -0x3f01;DLEE_NoPacketFound;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h -0x3f02;DLEE_PossiblePacketLoss;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h +0x3f01;DLEE_StreamTooShort;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h +0x3f02;DLEE_DecodingError;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -402,9 +402,9 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4403;UXOS_CommandError;Command execution failed;3;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4404;UXOS_NoCommandLoadedOrPending;;4;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4406;UXOS_PcloseCallError;No description;6;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h -0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h -0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h -0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h +0x4500;HSPI_HalTimeoutRetval;No description;0;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4501;HSPI_HalBusyRetval;No description;1;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4502;HSPI_HalErrorRetval;No description;2;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h 0x4601;HURT_UartReadFailure;No description;1;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h 0x4602;HURT_UartReadSizeMissmatch;No description;2;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h 0x4603;HURT_UartRxBufferTooSmall;No description;3;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index d7265738..678b1935 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -101,8 +101,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/tcs/HeaterHandler.h 11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/tcs/HeaterHandler.h 11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/tcs/HeaterHandler.h -11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/tcs/HeaterHandler.h -11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/tcs/HeaterHandler.h +11404;0x2c8c;SWITCH_ALREADY_ON;INFO;No description;mission/tcs/HeaterHandler.h +11405;0x2c8d;SWITCH_ALREADY_OFF;INFO;No description;mission/tcs/HeaterHandler.h 11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/tcs/HeaterHandler.h 11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/tcs/HeaterHandler.h 11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h @@ -251,16 +251,16 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13904;0x3650;WRITE_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13905;0x3651;READ_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h -14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;bsp_q7s/core/CoreController.h -14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h -14002;0x36b2;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 -14003;0x36b3;REBOOT_HW;MEDIUM;No description;bsp_q7s/core/CoreController.h -14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;bsp_q7s/core/CoreController.h -14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;bsp_q7s/core/CoreController.h -14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h -14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;bsp_q7s/core/CoreController.h -14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;bsp_q7s/core/CoreController.h -14010;0x36ba;I2C_UNAVAILABLE_REBOOT;MEDIUM;No description;bsp_q7s/core/CoreController.h +14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;mission/sysDefs.h +14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;mission/sysDefs.h +14002;0x36b2;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;mission/sysDefs.h +14003;0x36b3;REBOOT_HW;MEDIUM;No description;mission/sysDefs.h +14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;mission/sysDefs.h +14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h +14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;mission/sysDefs.h +14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;mission/sysDefs.h +14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;mission/sysDefs.h +14010;0x36ba;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h 14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h 14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h 14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h diff --git a/generators/bsp_q7s_returnvalues.csv b/generators/bsp_q7s_returnvalues.csv index 0f87fdbe..b2f65c7f 100644 --- a/generators/bsp_q7s_returnvalues.csv +++ b/generators/bsp_q7s_returnvalues.csv @@ -371,8 +371,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e03;HKM_PeriodicHelperInvalid;No description;3;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3e04;HKM_PoolobjectNotFound;No description;4;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h -0x3f01;DLEE_NoPacketFound;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h -0x3f02;DLEE_PossiblePacketLoss;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h +0x3f01;DLEE_StreamTooShort;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h +0x3f02;DLEE_DecodingError;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -402,9 +402,9 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4403;UXOS_CommandError;Command execution failed;3;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4404;UXOS_NoCommandLoadedOrPending;;4;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4406;UXOS_PcloseCallError;No description;6;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h -0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h -0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h -0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h +0x4500;HSPI_HalTimeoutRetval;No description;0;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4501;HSPI_HalBusyRetval;No description;1;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4502;HSPI_HalErrorRetval;No description;2;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h 0x4601;HURT_UartReadFailure;No description;1;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h 0x4602;HURT_UartReadSizeMissmatch;No description;2;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h 0x4603;HURT_UartRxBufferTooSmall;No description;3;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h @@ -493,8 +493,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x58a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h 0x58a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h 0x58a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h -0x5900;IPCI_NoReplyAvailable;No description;0;CCSDS_IP_CORE_BRIDGE;linux/acs/ImtqPollingTask.h -0x5901;IPCI_NoPacketFound;No description;1;CCSDS_IP_CORE_BRIDGE;linux/com/SyrlinksComHandler.h 0x59a0;IPCI_PapbBusy;No description;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h 0x5aa0;PTME_UnknownVcId;No description;160;PTME;linux/ipcore/Ptme.h 0x5c01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/acs/StrComHandler.h @@ -542,7 +540,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NvmParameterBase.h 0x64a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;160;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h 0x64a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;161;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h -0x6502;PLMPHLP_InvalidCrc;No description;2;PLOC_MPSOC_HELPER;linux/payload/ScexHelper.h 0x65a0;PLMPHLP_FileClosedAccidentally;File accidentally close;160;PLOC_MPSOC_HELPER;linux/payload/PlocMpsocHelper.h 0x66a0;SADPL_CommandNotSupported;No description;160;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h 0x66a1;SADPL_DeploymentAlreadyExecuting;No description;161;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 25c6c39d..9cfe0a1d 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 284 translations. * @details - * Generated on: 2023-04-04 13:59:07 + * Generated on: 2023-04-07 11:03:10 */ #include "translateEvents.h" @@ -266,7 +266,7 @@ const char *VERSION_INFO_STRING = "VERSION_INFO"; const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO"; const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER"; const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS"; -const char *I2C_UNAVAILABLE_REBOOT_STRING = "I2C_UNAVAILABLE_REBOOT"; +const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING"; @@ -815,7 +815,7 @@ const char *translateEvents(Event event) { case (14008): return INDIVIDUAL_BOOT_COUNTS_STRING; case (14010): - return I2C_UNAVAILABLE_REBOOT_STRING; + return I2C_REBOOT_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; case (14101): diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index c579b741..8c9bbbe6 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2023-04-04 13:59:07 + * Generated on: 2023-04-07 11:03:10 */ #include "translateObjects.h" diff --git a/linux/acs/ImtqPollingTask.h b/linux/acs/ImtqPollingTask.h index 8ffe307b..914343d6 100644 --- a/linux/acs/ImtqPollingTask.h +++ b/linux/acs/ImtqPollingTask.h @@ -22,6 +22,7 @@ class ImtqPollingTask : public SystemObject, ReturnValue_t initialize() override; private: + //! [EXPORT] : [SKIP] static constexpr ReturnValue_t NO_REPLY_AVAILABLE = returnvalue::makeCode(2, 0); enum class InternalState { IDLE, IS_BUSY } state = InternalState::IDLE; diff --git a/linux/com/SyrlinksComHandler.h b/linux/com/SyrlinksComHandler.h index 39e8f312..bab1af48 100644 --- a/linux/com/SyrlinksComHandler.h +++ b/linux/com/SyrlinksComHandler.h @@ -20,6 +20,7 @@ class SyrlinksComHandler : public DeviceCommunicationIF, //! [EXPORT] : [SKIP] static constexpr ReturnValue_t NO_SERIAL_DATA_READ = returnvalue::makeCode(2, 0); + //! [EXPORT] : [SKIP] static constexpr ReturnValue_t NO_PACKET_FOUND = returnvalue::makeCode(2, 1); enum class State { SLEEPING, ACTIVE } state = State::SLEEPING; diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 25c6c39d..9cfe0a1d 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** * @brief Auto-generated event translation file. Contains 284 translations. * @details - * Generated on: 2023-04-04 13:59:07 + * Generated on: 2023-04-07 11:03:10 */ #include "translateEvents.h" @@ -266,7 +266,7 @@ const char *VERSION_INFO_STRING = "VERSION_INFO"; const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO"; const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER"; const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS"; -const char *I2C_UNAVAILABLE_REBOOT_STRING = "I2C_UNAVAILABLE_REBOOT"; +const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING"; @@ -815,7 +815,7 @@ const char *translateEvents(Event event) { case (14008): return INDIVIDUAL_BOOT_COUNTS_STRING; case (14010): - return I2C_UNAVAILABLE_REBOOT_STRING; + return I2C_REBOOT_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; case (14101): diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index c579b741..8c9bbbe6 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 175 translations. - * Generated on: 2023-04-04 13:59:07 + * Generated on: 2023-04-07 11:03:10 */ #include "translateObjects.h" diff --git a/linux/payload/ScexHelper.h b/linux/payload/ScexHelper.h index b95c605b..649ee7e9 100644 --- a/linux/payload/ScexHelper.h +++ b/linux/payload/ScexHelper.h @@ -10,6 +10,7 @@ class ScexHelper : public SerializeIF { public: + //! [EXPORT] : [SKIP] static const ReturnValue_t INVALID_CRC = returnvalue::makeCode(0, 2); ScexHelper(); diff --git a/tmtc b/tmtc index ad082760..e503450d 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit ad0827607958d0bfbe3dfb903cdd8a65a71e0e7a +Subproject commit e503450ddad66b8d29f0234947badbeb52eefa6a From 55dd4b28ee7811ea2cad7eeeec49b8a27915bbbc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 7 Apr 2023 11:06:43 +0200 Subject: [PATCH 12/12] added missing event --- bsp_hosted/fsfwconfig/events/translateEvents.cpp | 7 +++++-- bsp_hosted/fsfwconfig/objects/translateObjects.cpp | 2 +- generators/bsp_hosted_events.csv | 3 ++- generators/bsp_q7s_events.csv | 3 ++- generators/events/translateEvents.cpp | 7 +++++-- generators/objects/translateObjects.cpp | 2 +- linux/fsfwconfig/events/translateEvents.cpp | 7 +++++-- linux/fsfwconfig/objects/translateObjects.cpp | 2 +- mission/sysDefs.h | 2 +- tmtc | 2 +- 10 files changed, 24 insertions(+), 13 deletions(-) diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index 9cfe0a1d..bd1bd27f 100644 --- a/bsp_hosted/fsfwconfig/events/translateEvents.cpp +++ b/bsp_hosted/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 284 translations. + * @brief Auto-generated event translation file. Contains 285 translations. * @details - * Generated on: 2023-04-07 11:03:10 + * Generated on: 2023-04-07 11:06:14 */ #include "translateEvents.h" @@ -266,6 +266,7 @@ const char *VERSION_INFO_STRING = "VERSION_INFO"; const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO"; const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER"; const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS"; +const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY"; const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; @@ -815,6 +816,8 @@ const char *translateEvents(Event event) { case (14008): return INDIVIDUAL_BOOT_COUNTS_STRING; case (14010): + return TRYING_I2C_RECOVERY_STRING; + case (14011): return I2C_REBOOT_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 7349542a..6301c323 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 171 translations. - * Generated on: 2023-04-07 11:03:10 + * Generated on: 2023-04-07 11:06:14 */ #include "translateObjects.h" diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index 678b1935..af15edff 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -260,7 +260,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;mission/sysDefs.h 14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;mission/sysDefs.h 14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;mission/sysDefs.h -14010;0x36ba;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h +14010;0x36ba;TRYING_I2C_RECOVERY;MEDIUM;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;mission/sysDefs.h +14011;0x36bb;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h 14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h 14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h 14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 678b1935..af15edff 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -260,7 +260,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;mission/sysDefs.h 14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;mission/sysDefs.h 14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;mission/sysDefs.h -14010;0x36ba;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h +14010;0x36ba;TRYING_I2C_RECOVERY;MEDIUM;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;mission/sysDefs.h +14011;0x36bb;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h 14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h 14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h 14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 9cfe0a1d..bd1bd27f 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 284 translations. + * @brief Auto-generated event translation file. Contains 285 translations. * @details - * Generated on: 2023-04-07 11:03:10 + * Generated on: 2023-04-07 11:06:14 */ #include "translateEvents.h" @@ -266,6 +266,7 @@ const char *VERSION_INFO_STRING = "VERSION_INFO"; const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO"; const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER"; const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS"; +const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY"; const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; @@ -815,6 +816,8 @@ const char *translateEvents(Event event) { case (14008): return INDIVIDUAL_BOOT_COUNTS_STRING; case (14010): + return TRYING_I2C_RECOVERY_STRING; + case (14011): return I2C_REBOOT_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 8c9bbbe6..fc30b268 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2023-04-07 11:03:10 + * Generated on: 2023-04-07 11:06:14 */ #include "translateObjects.h" diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 9cfe0a1d..bd1bd27f 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 284 translations. + * @brief Auto-generated event translation file. Contains 285 translations. * @details - * Generated on: 2023-04-07 11:03:10 + * Generated on: 2023-04-07 11:06:14 */ #include "translateEvents.h" @@ -266,6 +266,7 @@ const char *VERSION_INFO_STRING = "VERSION_INFO"; const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO"; const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER"; const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS"; +const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY"; const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; @@ -815,6 +816,8 @@ const char *translateEvents(Event event) { case (14008): return INDIVIDUAL_BOOT_COUNTS_STRING; case (14010): + return TRYING_I2C_RECOVERY_STRING; + case (14011): return I2C_REBOOT_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 8c9bbbe6..fc30b268 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 175 translations. - * Generated on: 2023-04-07 11:03:10 + * Generated on: 2023-04-07 11:06:14 */ #include "translateObjects.h" diff --git a/mission/sysDefs.h b/mission/sysDefs.h index 1abff6c6..7a729d6e 100644 --- a/mission/sysDefs.h +++ b/mission/sysDefs.h @@ -72,7 +72,7 @@ static constexpr Event INDIVIDUAL_BOOT_COUNTS = event::makeEvent(SUBSYSTEM_ID, 8 //! devices. static constexpr Event TRYING_I2C_RECOVERY = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); //! [EXPORT] : [COMMENT] I2C is unavailable. Recovery did not work, performing full reboot. -static constexpr Event I2C_REBOOT = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); +static constexpr Event I2C_REBOOT = event::makeEvent(SUBSYSTEM_ID, 11, severity::MEDIUM); } // namespace core diff --git a/tmtc b/tmtc index e503450d..91a8a2e8 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit e503450ddad66b8d29f0234947badbeb52eefa6a +Subproject commit 91a8a2e89519ac20d9ddabec2d8eaeb7707718d5