diff --git a/CHANGELOG.md b/CHANGELOG.md index 5754910c..5f11fbb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ will consitute of a breaking change warranting a new major release: - Syrlinks assembly - Dual Lane Assembly +## Fixed + +- Dual lane assemblies: Fix handling when health states are overwritten. Also add better handling + when some devices are permanent faulty and some are only faulty. In that case, only the faulty + devices will be restored. + # [v1.43.1] 2023-04-04 ## Fixed diff --git a/mission/system/acs/AcsBoardAssembly.cpp b/mission/system/acs/AcsBoardAssembly.cpp index 62fe316a..4893ce98 100644 --- a/mission/system/acs/AcsBoardAssembly.cpp +++ b/mission/system/acs/AcsBoardAssembly.cpp @@ -267,12 +267,45 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t commandedMode, HealthState h1 = healthHelper.healthTable->getHealth(o1); HealthState h2 = healthHelper.healthTable->getHealth(o2); HealthState h3 = healthHelper.healthTable->getHealth(o3); + // All device are faulty or permanent faulty, but this is a safe mode assembly, so we need + // to restore the devices. if ((h0 == FAULTY or h0 == PERMANENT_FAULTY) and (h1 == FAULTY or h1 == PERMANENT_FAULTY) and (h2 == FAULTY or h2 == PERMANENT_FAULTY) and (h3 == FAULTY or h3 == PERMANENT_FAULTY)) { - overwriteDeviceHealth(o0, h0); - overwriteDeviceHealth(o1, h1); - overwriteDeviceHealth(o2, h2); - overwriteDeviceHealth(o3, h3); + uint8_t numPermFaulty = 0; + if (h0 == PERMANENT_FAULTY) { + numPermFaulty++; + } + if (h1 == PERMANENT_FAULTY) { + numPermFaulty++; + } + if (h2 == PERMANENT_FAULTY) { + numPermFaulty++; + } + if (h3 == PERMANENT_FAULTY) { + numPermFaulty++; + } + if (numPermFaulty < 4) { + // Some are faulty and some are permanent faulty, so only set faulty ones to + // EXTERNAL_CONTROL. + if (h0 == FAULTY) { + overwriteDeviceHealth(o0, h0); + } + if (h1 == FAULTY) { + overwriteDeviceHealth(o0, h0); + } + if (h2 == FAULTY) { + overwriteDeviceHealth(o0, h0); + } + if (h3 == FAULTY) { + overwriteDeviceHealth(o0, h0); + } + } else { + // All permanent faulty, so set all to EXTERNAL_CONTROL + overwriteDeviceHealth(o0, h0); + overwriteDeviceHealth(o1, h1); + overwriteDeviceHealth(o2, h2); + overwriteDeviceHealth(o3, h3); + } healthNeedsToBeOverwritten = true; } if (h0 == EXTERNAL_CONTROL or h1 == EXTERNAL_CONTROL or h2 == EXTERNAL_CONTROL or diff --git a/mission/system/acs/DualLaneAssemblyBase.cpp b/mission/system/acs/DualLaneAssemblyBase.cpp index 788ec34e..7d22fbd1 100644 --- a/mission/system/acs/DualLaneAssemblyBase.cpp +++ b/mission/system/acs/DualLaneAssemblyBase.cpp @@ -117,7 +117,7 @@ ReturnValue_t DualLaneAssemblyBase::isModeCombinationValid(Mode_t mode, Submode_ if (mode != MODE_OFF and (submode != A_SIDE and submode != B_SIDE and submode != DUAL_MODE)) { return HasModesIF::INVALID_SUBMODE; } - if(mode == MODE_OFF and submode != SUBMODE_NONE) { + if (mode == MODE_OFF and submode != SUBMODE_NONE) { return HasModesIF::INVALID_SUBMODE; } return returnvalue::OK; diff --git a/mission/system/acs/ImtqAssembly.cpp b/mission/system/acs/ImtqAssembly.cpp index c2e99171..e973a11b 100644 --- a/mission/system/acs/ImtqAssembly.cpp +++ b/mission/system/acs/ImtqAssembly.cpp @@ -35,7 +35,7 @@ ReturnValue_t ImtqAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wa ReturnValue_t ImtqAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) { if (mode == MODE_ON or mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_OFF) { - if(submode != SUBMODE_NONE) { + if (submode != SUBMODE_NONE) { return HasModesIF::INVALID_SUBMODE; } return returnvalue::OK; diff --git a/mission/system/com/SyrlinksAssembly.cpp b/mission/system/com/SyrlinksAssembly.cpp index c79e1f8f..b8063bbf 100644 --- a/mission/system/com/SyrlinksAssembly.cpp +++ b/mission/system/com/SyrlinksAssembly.cpp @@ -41,7 +41,7 @@ ReturnValue_t SyrlinksAssembly::isModeCombinationValid(Mode_t mode, Submode_t su } return returnvalue::OK; } - if(mode == MODE_OFF and submode != SUBMODE_NONE) { + if (mode == MODE_OFF and submode != SUBMODE_NONE) { return HasModesIF::INVALID_SUBMODE; } return returnvalue::OK;