From a06d90daad87504392916fb0b42866a568392341 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 4 Apr 2023 18:29:07 +0200 Subject: [PATCH 1/7] remove duplicate code --- fsfw | 2 +- mission/system/acs/SusAssembly.cpp | 20 ++------------------ mission/system/acs/SusAssembly.h | 7 ------- tmtc | 2 +- 4 files changed, 4 insertions(+), 27 deletions(-) diff --git a/fsfw b/fsfw index 9fca7581..6650c293 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 9fca7581dd75d074df343802c922e48f95b677eb +Subproject commit 6650c293da09d8851c2bd6c4d6e6c5a8390d003e diff --git a/mission/system/acs/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp index 13946c13..75a3cb57 100644 --- a/mission/system/acs/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -50,7 +50,7 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod if (mode == devMode) { modeTable[tableIdx].setMode(mode); } else if (mode == DeviceHandlerIF::MODE_NORMAL) { - if (isUseable(objectId, devMode)) { + if (isModeCommandable(objectId, devMode)) { if (devMode == MODE_ON) { modeTable[tableIdx].setMode(mode); modeTable[tableIdx].setSubmode(SUBMODE_NONE); @@ -63,7 +63,7 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod } } } else if (mode == MODE_ON) { - if (isUseable(objectId, devMode)) { + if (isModeCommandable(objectId, devMode)) { modeTable[tableIdx].setMode(MODE_ON); modeTable[tableIdx].setSubmode(SUBMODE_NONE); } @@ -134,22 +134,6 @@ ReturnValue_t SusAssembly::initialize() { return AssemblyBase::initialize(); } -bool SusAssembly::isUseable(object_id_t object, Mode_t mode) { - if (healthHelper.healthTable->isFaulty(object)) { - return false; - } - - // Check if device is already in target mode - if (childrenMap[object].mode == mode) { - return true; - } - - if (healthHelper.healthTable->isCommandable(object)) { - return true; - } - return false; -} - void SusAssembly::refreshHelperModes() { for (uint8_t idx = 0; idx < helper.susModes.size(); idx++) { helper.susModes[idx] = childrenMap[helper.susIds[idx]].mode; diff --git a/mission/system/acs/SusAssembly.h b/mission/system/acs/SusAssembly.h index 15f347dd..2002fac0 100644 --- a/mission/system/acs/SusAssembly.h +++ b/mission/system/acs/SusAssembly.h @@ -56,13 +56,6 @@ class SusAssembly : public DualLaneAssemblyBase { ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override; ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; - /** - * Check whether it makes sense to send mode commands to the device - * @param object - * @param mode - * @return - */ - bool isUseable(object_id_t object, Mode_t mode); void powerStateMachine(Mode_t mode, Submode_t submode); ReturnValue_t handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode); void refreshHelperModes(); diff --git a/tmtc b/tmtc index 6975fae5..50668ca7 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 6975fae511ca7b2fdef70858f8715908f300f434 +Subproject commit 50668ca7a74edd4219456e393cd10f7858591130 From 845548ed2524dc7a1ad0f61d8c09d1ddaacbd2f4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 5 Apr 2023 10:27:19 +0200 Subject: [PATCH 2/7] maybe that fixes the issues --- mission/system/acs/AcsBoardAssembly.cpp | 11 ++++++++++- mission/system/acs/SusAssembly.cpp | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/mission/system/acs/AcsBoardAssembly.cpp b/mission/system/acs/AcsBoardAssembly.cpp index befe82e0..56bfe506 100644 --- a/mission/system/acs/AcsBoardAssembly.cpp +++ b/mission/system/acs/AcsBoardAssembly.cpp @@ -260,6 +260,7 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; + bool healthNeedsToBeOverwritten = false; auto checkAcsBoardSensorGroup = [&](object_id_t o0, object_id_t o1, object_id_t o2, object_id_t o3) { HealthState h0 = healthHelper.healthTable->getHealth(o0); @@ -272,6 +273,7 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, overwriteDeviceHealth(o1, h1); overwriteDeviceHealth(o2, h2); overwriteDeviceHealth(o3, h3); + healthNeedsToBeOverwritten = true; } if (h0 == EXTERNAL_CONTROL or h1 == EXTERNAL_CONTROL or h2 == EXTERNAL_CONTROL or h3 == EXTERNAL_CONTROL) { @@ -285,22 +287,29 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, if (healthHelper.healthTable->getHealth(helper.healthDevGps0) == PERMANENT_FAULTY and healthHelper.healthTable->getHealth(helper.healthDevGps1) == FAULTY) { overwriteDeviceHealth(helper.healthDevGps1, FAULTY); + healthNeedsToBeOverwritten = true; } else if (healthHelper.healthTable->getHealth(helper.healthDevGps1) == PERMANENT_FAULTY and healthHelper.healthTable->getHealth(helper.healthDevGps0) == FAULTY) { overwriteDeviceHealth(helper.healthDevGps0, FAULTY); + healthNeedsToBeOverwritten = true; } else if (healthHelper.healthTable->isFaulty(helper.healthDevGps0) or healthHelper.healthTable->isFaulty(helper.healthDevGps1)) { overwriteDeviceHealth(helper.healthDevGps0, healthHelper.healthTable->getHealth(helper.healthDevGps0)); overwriteDeviceHealth(helper.healthDevGps1, healthHelper.healthTable->getHealth(helper.healthDevGps1)); + healthNeedsToBeOverwritten = true; } if (deviceSubmode == duallane::DUAL_MODE) { checkAcsBoardSensorGroup(helper.mgm0Lis3IdSideA, helper.mgm1Rm3100IdSideA, helper.mgm2Lis3IdSideB, helper.mgm3Rm3100IdSideB); checkAcsBoardSensorGroup(helper.gyro0AdisIdSideA, helper.gyro1L3gIdSideA, - helper.gyro2AdisIdSideB, helper.gyro3L3gIdSideB); + + helper.gyro2AdisIdSideB, helper.gyro3L3gIdSideB); + } + if(healthNeedsToBeOverwritten) { + return NEED_TO_CHANGE_HEALTH; } return status; } diff --git a/mission/system/acs/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp index 75a3cb57..124c41b0 100644 --- a/mission/system/acs/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -143,6 +143,7 @@ void SusAssembly::refreshHelperModes() { ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; + bool needsHealthOverwritten = false; auto checkSusGroup = [&](object_id_t devNom, object_id_t devRed) { HealthState healthNom = healthHelper.healthTable->getHealth(devNom); HealthState healthRed = healthHelper.healthTable->getHealth(devRed); @@ -150,6 +151,7 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { overwriteDeviceHealth(devNom, healthNom); overwriteDeviceHealth(devRed, healthRed); + needsHealthOverwritten = true; } }; auto checkHealthForOneDev = [&](object_id_t dev) { @@ -168,5 +170,8 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode checkHealthForOneDev(helper.susIds[idx]); } } + if(needsHealthOverwritten) { + return NEED_TO_CHANGE_HEALTH; + } return status; } From 5e932826626f7e1bcc204cb830166d5a0c1c2510 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 5 Apr 2023 14:41:34 +0200 Subject: [PATCH 3/7] seems to work now, but the whole printout crap needs to be removed --- mission/system/acs/AcsBoardAssembly.cpp | 11 +++- mission/system/acs/DualLaneAssemblyBase.cpp | 7 ++ mission/system/acs/SusAssembly.cpp | 64 ++++++++++++------- .../system/objects/PowerStateMachineBase.cpp | 3 + tmtc | 2 +- 5 files changed, 60 insertions(+), 27 deletions(-) diff --git a/mission/system/acs/AcsBoardAssembly.cpp b/mission/system/acs/AcsBoardAssembly.cpp index 14681604..0f060c19 100644 --- a/mission/system/acs/AcsBoardAssembly.cpp +++ b/mission/system/acs/AcsBoardAssembly.cpp @@ -256,8 +256,8 @@ ReturnValue_t AcsBoardAssembly::initialize() { return AssemblyBase::initialize(); } -ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, - Submode_t deviceSubmode) { +ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t commandedMode, + Submode_t commandedSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; bool healthNeedsToBeOverwritten = false; @@ -300,7 +300,7 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, healthNeedsToBeOverwritten = true; } - if (deviceSubmode == duallane::DUAL_MODE) { + if (commandedSubmode == duallane::DUAL_MODE) { checkAcsBoardSensorGroup(helper.mgm0Lis3IdSideA, helper.mgm1Rm3100IdSideA, helper.mgm2Lis3IdSideB, helper.mgm3Rm3100IdSideB); checkAcsBoardSensorGroup(helper.gyro0AdisIdSideA, helper.gyro1L3gIdSideA, @@ -308,6 +308,11 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, helper.gyro2AdisIdSideB, helper.gyro3L3gIdSideB); } if(healthNeedsToBeOverwritten) { + // If we are overwriting the health states, we are already in a transition to dual mode, + // and we would like that transition to complete. The default behaviour is to go back to the + // old mode. We force our behaviour by overwriting the internal modes. + mode = commandedMode; + submode = commandedSubmode; return NEED_TO_CHANGE_HEALTH; } return status; diff --git a/mission/system/acs/DualLaneAssemblyBase.cpp b/mission/system/acs/DualLaneAssemblyBase.cpp index ecb91689..b732bf10 100644 --- a/mission/system/acs/DualLaneAssemblyBase.cpp +++ b/mission/system/acs/DualLaneAssemblyBase.cpp @@ -36,6 +36,8 @@ void DualLaneAssemblyBase::performChildOperation() { void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) { using namespace duallane; pwrStateMachine.reset(); + dualToSingleSideTransition = false; + sideSwitchState = SideSwitchState::NONE; if (mode != MODE_OFF) { // Special exception: A transition from dual side to single mode must be handled like @@ -84,12 +86,15 @@ ReturnValue_t DualLaneAssemblyBase::pwrStateMachineWrapper() { if (opCode == OpCodes::NONE) { return returnvalue::OK; } else if (opCode == OpCodes::TO_OFF_DONE) { + sif::debug << "to off done" << std::endl; // Will be called for transitions to MODE_OFF, where everything is done after power switching finishModeOp(); } else if (opCode == OpCodes::TO_NOT_OFF_DONE) { if (dualToSingleSideTransition) { + sif::debug << "finishing dual to single side transition" << std::endl; finishModeOp(); } else { + sif::debug << "starting ASM base transition with submode " << (int) targetSubmode << std::endl; // Will be called for transitions from MODE_OFF to anything else, where the mode still has // to be commanded after power switching AssemblyBase::startTransition(targetMode, targetSubmode); @@ -181,7 +186,9 @@ void DualLaneAssemblyBase::handleModeTransitionFailed(ReturnValue_t result) { startTransition(mode, nextSubmode); tryingOtherSide = true; } else { + sif::debug << "starting dual side transition" << std::endl; triggerEvent(transitionOtherSideFailedEvent, mode, targetSubmode); + // If we have just attempted side swichting, this flag needs to be reset! startTransition(mode, Submodes::DUAL_MODE); } } diff --git a/mission/system/acs/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp index 124c41b0..e15e8baa 100644 --- a/mission/system/acs/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -17,6 +17,8 @@ SusAssembly::SusAssembly(object_id_t objectId, PowerSwitchIF* pwrSwitcher, SusAs } ReturnValue_t SusAssembly::commandChildren(Mode_t mode, Submode_t submode) { + sif::debug << "commanding children to mode " << mode << " and submode " << (int) submode + << std::endl; ReturnValue_t result = returnvalue::OK; refreshHelperModes(); // Initialize the mode table to ensure all devices are in a defined state @@ -25,13 +27,16 @@ ReturnValue_t SusAssembly::commandChildren(Mode_t mode, Submode_t submode) { modeTable[idx].setSubmode(SUBMODE_NONE); } if (recoveryState == RecoveryState::RECOVERY_IDLE) { + sif::debug << "checking health states, recovery not ongoing. Commanded submode: " << + (int) submode << std::endl; result = checkAndHandleHealthStates(mode, submode); - if (result == NEED_TO_CHANGE_HEALTH) { - return returnvalue::OK; + if (result != returnvalue::OK) { + return result; } } if (recoveryState != RecoveryState::RECOVERY_STARTED) { if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) { + sif::debug << "handling on or normal cmd. Submode: " << (int) submode << std::endl; result = handleNormalOrOnModeCmd(mode, submode); } } @@ -47,30 +52,35 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod bool needsSecondStep = false; handleSideSwitchStates(submode, needsSecondStep); auto cmdSeq = [&](object_id_t objectId, Mode_t devMode, uint8_t tableIdx) { - if (mode == devMode) { + if(isModeCommandable(objectId, devMode)) { modeTable[tableIdx].setMode(mode); - } else if (mode == DeviceHandlerIF::MODE_NORMAL) { - if (isModeCommandable(objectId, devMode)) { - if (devMode == MODE_ON) { - modeTable[tableIdx].setMode(mode); - modeTable[tableIdx].setSubmode(SUBMODE_NONE); - } else { - modeTable[tableIdx].setMode(MODE_ON); - modeTable[tableIdx].setSubmode(SUBMODE_NONE); - if (internalState != STATE_SECOND_STEP) { - needsSecondStep = true; - } - } - } - } else if (mode == MODE_ON) { - if (isModeCommandable(objectId, devMode)) { - modeTable[tableIdx].setMode(MODE_ON); - modeTable[tableIdx].setSubmode(SUBMODE_NONE); - } + modeTable[tableIdx].setSubmode(SUBMODE_NONE); } +// if (mode == devMode) { +// modeTable[tableIdx].setMode(mode); +// } else if (mode == DeviceHandlerIF::MODE_NORMAL) { +// if (isModeCommandable(objectId, devMode)) { +// if (devMode == MODE_ON) { +// modeTable[tableIdx].setMode(mode); +// modeTable[tableIdx].setSubmode(SUBMODE_NONE); +// } else { +// modeTable[tableIdx].setMode(MODE_ON); +// modeTable[tableIdx].setSubmode(SUBMODE_NONE); +// if (internalState != STATE_SECOND_STEP) { +// needsSecondStep = true; +// } +// } +// } +// } else if (mode == MODE_ON) { +// if (isModeCommandable(objectId, devMode)) { +// modeTable[tableIdx].setMode(MODE_ON); +// modeTable[tableIdx].setSubmode(SUBMODE_NONE); +// } +// } }; switch (submode) { case (A_SIDE): { + sif::debug << "commanding a side" << std::endl; for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS_ONE_SIDE; idx++) { cmdSeq(helper.susIds[idx], helper.susModes[idx], idx); // Switch off devices on redundant side @@ -80,6 +90,7 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod break; } case (B_SIDE): { + sif::debug << "commanding b side" << std::endl; for (uint8_t idx = NUMBER_SUN_SENSORS_ONE_SIDE; idx < NUMBER_SUN_SENSORS; idx++) { cmdSeq(helper.susIds[idx], helper.susModes[idx], idx); // Switch devices on nominal side @@ -89,6 +100,7 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod break; } case (DUAL_MODE): { + sif::debug << "commanding dual mode for all sensors" << std::endl; for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS; idx++) { cmdSeq(helper.susIds[idx], helper.susModes[idx], idx); } @@ -140,7 +152,7 @@ void SusAssembly::refreshHelperModes() { } } -ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode) { +ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, Submode_t commandedSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; bool needsHealthOverwritten = false; @@ -151,6 +163,7 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { overwriteDeviceHealth(devNom, healthNom); overwriteDeviceHealth(devRed, healthRed); + sif::debug << "SUS module health was overwritten" << std::endl; needsHealthOverwritten = true; } }; @@ -160,8 +173,9 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode modeHelper.setForced(true); } }; - if (deviceSubmode == duallane::DUAL_MODE) { + if (commandedSubmode == duallane::DUAL_MODE) { uint8_t idx = 0; + sif::debug << "doing dual mode health handling" << std::endl; for (idx = 0; idx < 6; idx++) { checkSusGroup(helper.susIds[idx], helper.susIds[idx + 6]); checkHealthForOneDev(helper.susIds[idx]); @@ -171,6 +185,10 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode } } if(needsHealthOverwritten) { + mode = commandedMode; + submode = commandedSubmode; + // We need second step instead of NEED_TO_CHANGE_HEALTH because we do not want recovery + // handling. return NEED_TO_CHANGE_HEALTH; } return status; diff --git a/mission/system/objects/PowerStateMachineBase.cpp b/mission/system/objects/PowerStateMachineBase.cpp index 37bd91f2..e3b09e14 100644 --- a/mission/system/objects/PowerStateMachineBase.cpp +++ b/mission/system/objects/PowerStateMachineBase.cpp @@ -1,4 +1,5 @@ #include "PowerStateMachineBase.h" +#include "fsfw/serviceinterface.h" PowerStateMachineBase::PowerStateMachineBase(PowerSwitchIF *pwrSwitcher, dur_millis_t checkTimeout) : pwrSwitcher(pwrSwitcher), checkTimeout(checkTimeout) {} @@ -20,6 +21,8 @@ void PowerStateMachineBase::start(Mode_t mode, Submode_t submode) { checkTimeout.resetTimer(); targetMode = mode; targetSubmode = submode; + sif::debug << "starting power fsm with mode " << mode << " and submode " << (int) submode + << std::endl; state = power::States::SWITCHING_POWER; } diff --git a/tmtc b/tmtc index 50668ca7..dcf7d0af 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 50668ca7a74edd4219456e393cd10f7858591130 +Subproject commit dcf7d0af71f6ba9d569f9f56604e9245a0233427 From 65c231e92da38245ef6fde9027f4cb62c9ed149e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 5 Apr 2023 14:46:45 +0200 Subject: [PATCH 4/7] that was a lot of printouts --- mission/system/acs/AcsBoardAssembly.cpp | 4 +- mission/system/acs/DualLaneAssemblyBase.cpp | 4 -- mission/system/acs/SusAssembly.cpp | 38 ++----------------- .../system/objects/PowerStateMachineBase.cpp | 5 ++- 4 files changed, 9 insertions(+), 42 deletions(-) diff --git a/mission/system/acs/AcsBoardAssembly.cpp b/mission/system/acs/AcsBoardAssembly.cpp index 0f060c19..62fe316a 100644 --- a/mission/system/acs/AcsBoardAssembly.cpp +++ b/mission/system/acs/AcsBoardAssembly.cpp @@ -305,9 +305,9 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t commandedMode, helper.mgm2Lis3IdSideB, helper.mgm3Rm3100IdSideB); checkAcsBoardSensorGroup(helper.gyro0AdisIdSideA, helper.gyro1L3gIdSideA, - helper.gyro2AdisIdSideB, helper.gyro3L3gIdSideB); + helper.gyro2AdisIdSideB, helper.gyro3L3gIdSideB); } - if(healthNeedsToBeOverwritten) { + if (healthNeedsToBeOverwritten) { // If we are overwriting the health states, we are already in a transition to dual mode, // and we would like that transition to complete. The default behaviour is to go back to the // old mode. We force our behaviour by overwriting the internal modes. diff --git a/mission/system/acs/DualLaneAssemblyBase.cpp b/mission/system/acs/DualLaneAssemblyBase.cpp index b732bf10..85121b57 100644 --- a/mission/system/acs/DualLaneAssemblyBase.cpp +++ b/mission/system/acs/DualLaneAssemblyBase.cpp @@ -86,15 +86,12 @@ ReturnValue_t DualLaneAssemblyBase::pwrStateMachineWrapper() { if (opCode == OpCodes::NONE) { return returnvalue::OK; } else if (opCode == OpCodes::TO_OFF_DONE) { - sif::debug << "to off done" << std::endl; // Will be called for transitions to MODE_OFF, where everything is done after power switching finishModeOp(); } else if (opCode == OpCodes::TO_NOT_OFF_DONE) { if (dualToSingleSideTransition) { - sif::debug << "finishing dual to single side transition" << std::endl; finishModeOp(); } else { - sif::debug << "starting ASM base transition with submode " << (int) targetSubmode << std::endl; // Will be called for transitions from MODE_OFF to anything else, where the mode still has // to be commanded after power switching AssemblyBase::startTransition(targetMode, targetSubmode); @@ -186,7 +183,6 @@ void DualLaneAssemblyBase::handleModeTransitionFailed(ReturnValue_t result) { startTransition(mode, nextSubmode); tryingOtherSide = true; } else { - sif::debug << "starting dual side transition" << std::endl; triggerEvent(transitionOtherSideFailedEvent, mode, targetSubmode); // If we have just attempted side swichting, this flag needs to be reset! startTransition(mode, Submodes::DUAL_MODE); diff --git a/mission/system/acs/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp index e15e8baa..2c7f881d 100644 --- a/mission/system/acs/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -17,8 +17,6 @@ SusAssembly::SusAssembly(object_id_t objectId, PowerSwitchIF* pwrSwitcher, SusAs } ReturnValue_t SusAssembly::commandChildren(Mode_t mode, Submode_t submode) { - sif::debug << "commanding children to mode " << mode << " and submode " << (int) submode - << std::endl; ReturnValue_t result = returnvalue::OK; refreshHelperModes(); // Initialize the mode table to ensure all devices are in a defined state @@ -27,8 +25,6 @@ ReturnValue_t SusAssembly::commandChildren(Mode_t mode, Submode_t submode) { modeTable[idx].setSubmode(SUBMODE_NONE); } if (recoveryState == RecoveryState::RECOVERY_IDLE) { - sif::debug << "checking health states, recovery not ongoing. Commanded submode: " << - (int) submode << std::endl; result = checkAndHandleHealthStates(mode, submode); if (result != returnvalue::OK) { return result; @@ -36,7 +32,6 @@ ReturnValue_t SusAssembly::commandChildren(Mode_t mode, Submode_t submode) { } if (recoveryState != RecoveryState::RECOVERY_STARTED) { if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) { - sif::debug << "handling on or normal cmd. Submode: " << (int) submode << std::endl; result = handleNormalOrOnModeCmd(mode, submode); } } @@ -52,35 +47,13 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod bool needsSecondStep = false; handleSideSwitchStates(submode, needsSecondStep); auto cmdSeq = [&](object_id_t objectId, Mode_t devMode, uint8_t tableIdx) { - if(isModeCommandable(objectId, devMode)) { + if (isModeCommandable(objectId, devMode)) { modeTable[tableIdx].setMode(mode); modeTable[tableIdx].setSubmode(SUBMODE_NONE); } -// if (mode == devMode) { -// modeTable[tableIdx].setMode(mode); -// } else if (mode == DeviceHandlerIF::MODE_NORMAL) { -// if (isModeCommandable(objectId, devMode)) { -// if (devMode == MODE_ON) { -// modeTable[tableIdx].setMode(mode); -// modeTable[tableIdx].setSubmode(SUBMODE_NONE); -// } else { -// modeTable[tableIdx].setMode(MODE_ON); -// modeTable[tableIdx].setSubmode(SUBMODE_NONE); -// if (internalState != STATE_SECOND_STEP) { -// needsSecondStep = true; -// } -// } -// } -// } else if (mode == MODE_ON) { -// if (isModeCommandable(objectId, devMode)) { -// modeTable[tableIdx].setMode(MODE_ON); -// modeTable[tableIdx].setSubmode(SUBMODE_NONE); -// } -// } }; switch (submode) { case (A_SIDE): { - sif::debug << "commanding a side" << std::endl; for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS_ONE_SIDE; idx++) { cmdSeq(helper.susIds[idx], helper.susModes[idx], idx); // Switch off devices on redundant side @@ -90,7 +63,6 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod break; } case (B_SIDE): { - sif::debug << "commanding b side" << std::endl; for (uint8_t idx = NUMBER_SUN_SENSORS_ONE_SIDE; idx < NUMBER_SUN_SENSORS; idx++) { cmdSeq(helper.susIds[idx], helper.susModes[idx], idx); // Switch devices on nominal side @@ -100,7 +72,6 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod break; } case (DUAL_MODE): { - sif::debug << "commanding dual mode for all sensors" << std::endl; for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS; idx++) { cmdSeq(helper.susIds[idx], helper.susModes[idx], idx); } @@ -152,7 +123,8 @@ void SusAssembly::refreshHelperModes() { } } -ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, Submode_t commandedSubmode) { +ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, + Submode_t commandedSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; bool needsHealthOverwritten = false; @@ -163,7 +135,6 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, Subm (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { overwriteDeviceHealth(devNom, healthNom); overwriteDeviceHealth(devRed, healthRed); - sif::debug << "SUS module health was overwritten" << std::endl; needsHealthOverwritten = true; } }; @@ -175,7 +146,6 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, Subm }; if (commandedSubmode == duallane::DUAL_MODE) { uint8_t idx = 0; - sif::debug << "doing dual mode health handling" << std::endl; for (idx = 0; idx < 6; idx++) { checkSusGroup(helper.susIds[idx], helper.susIds[idx + 6]); checkHealthForOneDev(helper.susIds[idx]); @@ -184,7 +154,7 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, Subm checkHealthForOneDev(helper.susIds[idx]); } } - if(needsHealthOverwritten) { + if (needsHealthOverwritten) { mode = commandedMode; submode = commandedSubmode; // We need second step instead of NEED_TO_CHANGE_HEALTH because we do not want recovery diff --git a/mission/system/objects/PowerStateMachineBase.cpp b/mission/system/objects/PowerStateMachineBase.cpp index e3b09e14..3f51c533 100644 --- a/mission/system/objects/PowerStateMachineBase.cpp +++ b/mission/system/objects/PowerStateMachineBase.cpp @@ -1,4 +1,5 @@ #include "PowerStateMachineBase.h" + #include "fsfw/serviceinterface.h" PowerStateMachineBase::PowerStateMachineBase(PowerSwitchIF *pwrSwitcher, dur_millis_t checkTimeout) @@ -21,8 +22,8 @@ void PowerStateMachineBase::start(Mode_t mode, Submode_t submode) { checkTimeout.resetTimer(); targetMode = mode; targetSubmode = submode; - sif::debug << "starting power fsm with mode " << mode << " and submode " << (int) submode - << std::endl; + sif::debug << "starting power fsm with mode " << mode << " and submode " << (int)submode + << std::endl; state = power::States::SWITCHING_POWER; } From b050047d9a8eb6437cb48e50ccf0e43d5b40c64e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 5 Apr 2023 14:50:33 +0200 Subject: [PATCH 5/7] special handling for sus groups --- mission/system/acs/SusAssembly.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mission/system/acs/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp index 2c7f881d..60fc21a1 100644 --- a/mission/system/acs/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -131,7 +131,13 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, auto checkSusGroup = [&](object_id_t devNom, object_id_t devRed) { HealthState healthNom = healthHelper.healthTable->getHealth(devNom); HealthState healthRed = healthHelper.healthTable->getHealth(devRed); - if ((healthNom == FAULTY or healthNom == PERMANENT_FAULTY) and + if(healthNom == PERMANENT_FAULTY and healthRed == FAULTY) { + overwriteDeviceHealth(devRed, healthRed); + needsHealthOverwritten = true; + } else if(healthNom == FAULTY and healthRed == PERMANENT_FAULTY) { + overwriteDeviceHealth(devNom, healthNom); + needsHealthOverwritten = true; + } else if ((healthNom == FAULTY or healthNom == PERMANENT_FAULTY) and (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { overwriteDeviceHealth(devNom, healthNom); overwriteDeviceHealth(devRed, healthRed); From 2e0a685507fe55b5ee5e66db898abce7522712d0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 5 Apr 2023 15:06:41 +0200 Subject: [PATCH 6/7] overwrite health corrections --- mission/system/acs/SusAssembly.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mission/system/acs/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp index 60fc21a1..8d25acdd 100644 --- a/mission/system/acs/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -131,14 +131,14 @@ ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t commandedMode, auto checkSusGroup = [&](object_id_t devNom, object_id_t devRed) { HealthState healthNom = healthHelper.healthTable->getHealth(devNom); HealthState healthRed = healthHelper.healthTable->getHealth(devRed); - if(healthNom == PERMANENT_FAULTY and healthRed == FAULTY) { + if (healthNom == PERMANENT_FAULTY and healthRed == FAULTY) { overwriteDeviceHealth(devRed, healthRed); needsHealthOverwritten = true; - } else if(healthNom == FAULTY and healthRed == PERMANENT_FAULTY) { + } else if (healthNom == FAULTY and healthRed == PERMANENT_FAULTY) { overwriteDeviceHealth(devNom, healthNom); needsHealthOverwritten = true; } else if ((healthNom == FAULTY or healthNom == PERMANENT_FAULTY) and - (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { + (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { overwriteDeviceHealth(devNom, healthNom); overwriteDeviceHealth(devRed, healthRed); needsHealthOverwritten = true; From 3c38410643a0152eaa4e59a86f0fd7a95094dff4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 5 Apr 2023 15:08:07 +0200 Subject: [PATCH 7/7] some more tweaks --- mission/system/acs/DualLaneAssemblyBase.cpp | 1 - mission/system/objects/PowerStateMachineBase.cpp | 2 -- 2 files changed, 3 deletions(-) diff --git a/mission/system/acs/DualLaneAssemblyBase.cpp b/mission/system/acs/DualLaneAssemblyBase.cpp index 85121b57..a5fedfca 100644 --- a/mission/system/acs/DualLaneAssemblyBase.cpp +++ b/mission/system/acs/DualLaneAssemblyBase.cpp @@ -184,7 +184,6 @@ void DualLaneAssemblyBase::handleModeTransitionFailed(ReturnValue_t result) { tryingOtherSide = true; } else { triggerEvent(transitionOtherSideFailedEvent, mode, targetSubmode); - // If we have just attempted side swichting, this flag needs to be reset! startTransition(mode, Submodes::DUAL_MODE); } } diff --git a/mission/system/objects/PowerStateMachineBase.cpp b/mission/system/objects/PowerStateMachineBase.cpp index 3f51c533..510f6e84 100644 --- a/mission/system/objects/PowerStateMachineBase.cpp +++ b/mission/system/objects/PowerStateMachineBase.cpp @@ -22,8 +22,6 @@ void PowerStateMachineBase::start(Mode_t mode, Submode_t submode) { checkTimeout.resetTimer(); targetMode = mode; targetSubmode = submode; - sif::debug << "starting power fsm with mode " << mode << " and submode " << (int)submode - << std::endl; state = power::States::SWITCHING_POWER; }