Assembly and FDIR updates #572
@ -27,6 +27,12 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
- RWs are no longer commanded by the ACS Controller during safe mode. Instead the RW speed command
|
- RWs are no longer commanded by the ACS Controller during safe mode. Instead the RW speed command
|
||||||
is set to 0 as part or the `doShutDown` of the RW handler.
|
is set to 0 as part or the `doShutDown` of the RW handler.
|
||||||
|
|
||||||
|
## 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
|
# [v1.43.1] 2023-04-04
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
@ -267,12 +267,45 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t commandedMode,
|
|||||||
HealthState h1 = healthHelper.healthTable->getHealth(o1);
|
HealthState h1 = healthHelper.healthTable->getHealth(o1);
|
||||||
HealthState h2 = healthHelper.healthTable->getHealth(o2);
|
HealthState h2 = healthHelper.healthTable->getHealth(o2);
|
||||||
HealthState h3 = healthHelper.healthTable->getHealth(o3);
|
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
|
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)) {
|
(h2 == FAULTY or h2 == PERMANENT_FAULTY) and (h3 == FAULTY or h3 == PERMANENT_FAULTY)) {
|
||||||
|
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(o1, h1);
|
||||||
meggert marked this conversation as resolved
|
|||||||
|
}
|
||||||
|
if (h2 == FAULTY) {
|
||||||
|
overwriteDeviceHealth(o2, h2);
|
||||||
meggert marked this conversation as resolved
meggert
commented
copy pasta copy pasta
|
|||||||
|
}
|
||||||
|
if (h3 == FAULTY) {
|
||||||
|
overwriteDeviceHealth(o3, h3);
|
||||||
meggert marked this conversation as resolved
meggert
commented
copy pasta copy pasta
|
|||||||
|
}
|
||||||
|
} else {
|
||||||
|
// All permanent faulty, so set all to EXTERNAL_CONTROL
|
||||||
overwriteDeviceHealth(o0, h0);
|
overwriteDeviceHealth(o0, h0);
|
||||||
overwriteDeviceHealth(o1, h1);
|
overwriteDeviceHealth(o1, h1);
|
||||||
overwriteDeviceHealth(o2, h2);
|
overwriteDeviceHealth(o2, h2);
|
||||||
overwriteDeviceHealth(o3, h3);
|
overwriteDeviceHealth(o3, h3);
|
||||||
|
}
|
||||||
healthNeedsToBeOverwritten = true;
|
healthNeedsToBeOverwritten = true;
|
||||||
}
|
}
|
||||||
if (h0 == EXTERNAL_CONTROL or h1 == EXTERNAL_CONTROL or h2 == EXTERNAL_CONTROL or
|
if (h0 == EXTERNAL_CONTROL or h1 == EXTERNAL_CONTROL or h2 == EXTERNAL_CONTROL or
|
||||||
|
@ -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)) {
|
if (mode != MODE_OFF and (submode != A_SIDE and submode != B_SIDE and submode != DUAL_MODE)) {
|
||||||
return HasModesIF::INVALID_SUBMODE;
|
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 HasModesIF::INVALID_SUBMODE;
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
|
@ -18,7 +18,7 @@ ReturnValue_t ImtqAssembly::commandChildren(Mode_t mode, Submode_t submode) {
|
|||||||
if (recoveryState == RECOVERY_IDLE) {
|
if (recoveryState == RECOVERY_IDLE) {
|
||||||
ReturnValue_t result = checkAndHandleHealthState(mode, submode);
|
ReturnValue_t result = checkAndHandleHealthState(mode, submode);
|
||||||
if (result == NEED_TO_CHANGE_HEALTH) {
|
if (result == NEED_TO_CHANGE_HEALTH) {
|
||||||
return OK;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HybridIterator<ModeListEntry> iter(commandTable.begin(), commandTable.end());
|
HybridIterator<ModeListEntry> iter(commandTable.begin(), commandTable.end());
|
||||||
@ -35,7 +35,7 @@ ReturnValue_t ImtqAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wa
|
|||||||
|
|
||||||
ReturnValue_t ImtqAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) {
|
ReturnValue_t ImtqAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) {
|
||||||
if (mode == MODE_ON or mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_OFF) {
|
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 HasModesIF::INVALID_SUBMODE;
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
|
@ -20,7 +20,7 @@ ReturnValue_t SyrlinksAssembly::commandChildren(Mode_t mode, Submode_t submode)
|
|||||||
if (recoveryState == RECOVERY_IDLE) {
|
if (recoveryState == RECOVERY_IDLE) {
|
||||||
ReturnValue_t result = checkAndHandleHealthState(mode, submode);
|
ReturnValue_t result = checkAndHandleHealthState(mode, submode);
|
||||||
if (result == NEED_TO_CHANGE_HEALTH) {
|
if (result == NEED_TO_CHANGE_HEALTH) {
|
||||||
return OK;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
executeTable(iter);
|
executeTable(iter);
|
||||||
@ -41,7 +41,7 @@ ReturnValue_t SyrlinksAssembly::isModeCombinationValid(Mode_t mode, Submode_t su
|
|||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
if(mode == MODE_OFF and submode != SUBMODE_NONE) {
|
if (mode == MODE_OFF and submode != SUBMODE_NONE) {
|
||||||
return HasModesIF::INVALID_SUBMODE;
|
return HasModesIF::INVALID_SUBMODE;
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
|
Loading…
Reference in New Issue
Block a user
copy pasta