add health handling for TCS ASSY #436
@ -32,6 +32,8 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
|
- Command TCS controller off first for TCS subsystem transition to off.
|
||||||
|
- Health handling for TCS board assembly
|
||||||
- Mode fallback from IDLE mode to SAFE mode due to ACS errors/events now works properly for
|
- Mode fallback from IDLE mode to SAFE mode due to ACS errors/events now works properly for
|
||||||
the ACS subsystem
|
the ACS subsystem
|
||||||
- Bugfix in IDLE transition for system.
|
- Bugfix in IDLE transition for system.
|
||||||
|
@ -40,6 +40,12 @@ ReturnValue_t TcsBoardAssembly::commandChildren(Mode_t mode, Submode_t submode)
|
|||||||
modeTable[idx].setMode(MODE_OFF);
|
modeTable[idx].setMode(MODE_OFF);
|
||||||
modeTable[idx].setSubmode(SUBMODE_NONE);
|
modeTable[idx].setSubmode(SUBMODE_NONE);
|
||||||
}
|
}
|
||||||
|
if (recoveryState == RecoveryState::RECOVERY_IDLE) {
|
||||||
|
result = checkAndHandleHealthStates(mode, submode);
|
||||||
|
if (result == NEED_TO_CHANGE_HEALTH) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (recoveryState != RecoveryState::RECOVERY_STARTED) {
|
if (recoveryState != RecoveryState::RECOVERY_STARTED) {
|
||||||
if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) {
|
if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) {
|
||||||
result = handleNormalOrOnModeCmd(mode, submode);
|
result = handleNormalOrOnModeCmd(mode, submode);
|
||||||
@ -61,10 +67,10 @@ ReturnValue_t TcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_
|
|||||||
} catch (const std::out_of_range& e) {
|
} catch (const std::out_of_range& e) {
|
||||||
sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl;
|
sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
if (devsInWrongMode >= 3) {
|
if (devsInWrongMode == NUMBER_RTDS) {
|
||||||
if (warningSwitch) {
|
if (warningSwitch) {
|
||||||
sif::warning << "TcsBoardAssembly::checkChildrenStateOn: " << devsInWrongMode << " devices in"
|
sif::warning << "TcsBoardAssembly::checkChildrenStateOn: All devices in wrong mode"
|
||||||
<< " wrong mode" << std::endl;
|
<< std::endl;
|
||||||
warningSwitch = false;
|
warningSwitch = false;
|
||||||
}
|
}
|
||||||
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
||||||
@ -179,9 +185,29 @@ void TcsBoardAssembly::handleModeReached() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TcsBoardAssembly::handleChildrenLostMode(ReturnValue_t result) {
|
void TcsBoardAssembly::handleChildrenLostMode(ReturnValue_t result) {
|
||||||
// TODO: Maybe try a reboot once here?
|
|
||||||
triggerEvent(CHILDREN_LOST_MODE, result);
|
triggerEvent(CHILDREN_LOST_MODE, result);
|
||||||
return;
|
startTransition(mode, submode);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t TcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode,
|
||||||
|
Submode_t deviceSubmode) {
|
||||||
|
ReturnValue_t status = returnvalue::OK;
|
||||||
|
for (const auto& dev : helper.rtdInfos) {
|
||||||
|
HealthState health = healthHelper.healthTable->getHealth(dev.first);
|
||||||
|
if (health == HealthState::HEALTHY) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& dev : helper.rtdInfos) {
|
||||||
|
HealthState health = healthHelper.healthTable->getHealth(dev.first);
|
||||||
|
if (health == FAULTY or health == PERMANENT_FAULTY) {
|
||||||
|
status = NEED_TO_CHANGE_HEALTH;
|
||||||
|
} else if (health == EXTERNAL_CONTROL) {
|
||||||
|
modeHelper.setForced(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TcsBoardAssembly::handleModeTransitionFailed(ReturnValue_t result) {
|
void TcsBoardAssembly::handleModeTransitionFailed(ReturnValue_t result) {
|
||||||
|
@ -52,6 +52,7 @@ class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF {
|
|||||||
ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override;
|
ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override;
|
||||||
void startTransition(Mode_t mode, Submode_t submode) override;
|
void startTransition(Mode_t mode, Submode_t submode) override;
|
||||||
void handleModeReached() override;
|
void handleModeReached() override;
|
||||||
|
ReturnValue_t checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode);
|
||||||
|
|
||||||
// These two overrides prevent a transition of the whole assembly back to off just because
|
// These two overrides prevent a transition of the whole assembly back to off just because
|
||||||
// some devices are not working
|
// some devices are not working
|
||||||
|
@ -19,8 +19,8 @@ static const auto NML = DeviceHandlerIF::MODE_NORMAL;
|
|||||||
|
|
||||||
auto TCS_SEQUENCE_OFF = std::make_pair(OFF, FixedArrayList<ModeListEntry, 3>());
|
auto TCS_SEQUENCE_OFF = std::make_pair(OFF, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto TCS_TABLE_OFF_TGT = std::make_pair((OFF << 24) | 1, FixedArrayList<ModeListEntry, 2>());
|
auto TCS_TABLE_OFF_TGT = std::make_pair((OFF << 24) | 1, FixedArrayList<ModeListEntry, 2>());
|
||||||
auto TCS_TABLE_OFF_TRANS_0 = std::make_pair((OFF << 24) | 2, FixedArrayList<ModeListEntry, 7>());
|
auto TCS_TABLE_OFF_TRANS_0 = std::make_pair((OFF << 24) | 2, FixedArrayList<ModeListEntry, 2>());
|
||||||
auto TCS_TABLE_OFF_TRANS_1 = std::make_pair((OFF << 24) | 3, FixedArrayList<ModeListEntry, 2>());
|
auto TCS_TABLE_OFF_TRANS_1 = std::make_pair((OFF << 24) | 3, FixedArrayList<ModeListEntry, 7>());
|
||||||
|
|
||||||
auto TCS_SEQUENCE_NORMAL = std::make_pair(NML, FixedArrayList<ModeListEntry, 3>());
|
auto TCS_SEQUENCE_NORMAL = std::make_pair(NML, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto TCS_TABLE_NORMAL_TGT = std::make_pair((NML << 24) | 1, FixedArrayList<ModeListEntry, 2>());
|
auto TCS_TABLE_NORMAL_TGT = std::make_pair((NML << 24) | 1, FixedArrayList<ModeListEntry, 2>());
|
||||||
@ -59,18 +59,19 @@ void buildOffSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
// OFF target table is empty
|
// OFF target table is empty
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TGT.first, &TCS_TABLE_OFF_TGT.second)), ctxc);
|
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TGT.first, &TCS_TABLE_OFF_TGT.second)), ctxc);
|
||||||
|
|
||||||
iht(objects::TCS_BOARD_ASS, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
// Transition 1
|
||||||
iht(objects::TMP1075_HANDLER_TCS_0, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
iht(objects::THERMAL_CONTROLLER, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
||||||
iht(objects::TMP1075_HANDLER_TCS_1, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
|
||||||
iht(objects::TMP1075_HANDLER_PLPCDU_0, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
|
||||||
// damaged
|
|
||||||
// iht(objects::TMP1075_HANDLER_PLPCDU_1, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
|
||||||
iht(objects::TMP1075_HANDLER_IF_BOARD, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TRANS_0.first, &TCS_TABLE_OFF_TRANS_0.second)), ctxc);
|
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TRANS_0.first, &TCS_TABLE_OFF_TRANS_0.second)), ctxc);
|
||||||
|
|
||||||
iht(objects::THERMAL_CONTROLLER, OFF, 0, TCS_TABLE_OFF_TRANS_0.second);
|
iht(objects::TCS_BOARD_ASS, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
|
iht(objects::TMP1075_HANDLER_TCS_0, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
|
iht(objects::TMP1075_HANDLER_TCS_1, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
|
iht(objects::TMP1075_HANDLER_PLPCDU_0, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
|
// TMP PL PCDU 1 is damaged
|
||||||
|
iht(objects::TMP1075_HANDLER_IF_BOARD, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TRANS_1.first, &TCS_TABLE_OFF_TRANS_1.second)), ctxc);
|
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TRANS_1.first, &TCS_TABLE_OFF_TRANS_1.second)), ctxc);
|
||||||
|
|
||||||
|
|
||||||
ihs(TCS_SEQUENCE_OFF.second, TCS_TABLE_OFF_TGT.first, 0, false);
|
ihs(TCS_SEQUENCE_OFF.second, TCS_TABLE_OFF_TGT.first, 0, false);
|
||||||
ihs(TCS_SEQUENCE_OFF.second, TCS_TABLE_OFF_TRANS_0.first, 0, false);
|
ihs(TCS_SEQUENCE_OFF.second, TCS_TABLE_OFF_TRANS_0.first, 0, false);
|
||||||
ihs(TCS_SEQUENCE_OFF.second, TCS_TABLE_OFF_TRANS_1.first, 0, false);
|
ihs(TCS_SEQUENCE_OFF.second, TCS_TABLE_OFF_TRANS_1.first, 0, false);
|
||||||
@ -98,20 +99,20 @@ void buildNormalSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
check(sequence.insert(eh), ctxc);
|
check(sequence.insert(eh), ctxc);
|
||||||
};
|
};
|
||||||
|
|
||||||
// OFF target table is empty
|
// Normal target table is empty
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TGT.first, &TCS_TABLE_NORMAL_TGT.second)), ctxc);
|
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TGT.first, &TCS_TABLE_NORMAL_TGT.second)), ctxc);
|
||||||
|
|
||||||
iht(objects::TCS_BOARD_ASS, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TCS_BOARD_ASS, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
iht(objects::TMP1075_HANDLER_TCS_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_TCS_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
iht(objects::TMP1075_HANDLER_TCS_1, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_TCS_1, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
iht(objects::TMP1075_HANDLER_PLPCDU_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_PLPCDU_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
// damaged
|
// TMP PL PCDU 1 is damaged
|
||||||
// iht(objects::TMP1075_HANDLER_PLPCDU_1, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
|
||||||
iht(objects::TMP1075_HANDLER_IF_BOARD, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_IF_BOARD, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TRANS_0.first, &TCS_TABLE_NORMAL_TRANS_0.second)),
|
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TRANS_0.first, &TCS_TABLE_NORMAL_TRANS_0.second)),
|
||||||
ctxc);
|
ctxc);
|
||||||
|
|
||||||
iht(objects::THERMAL_CONTROLLER, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
// Transition 1
|
||||||
|
iht(objects::THERMAL_CONTROLLER, NML, 0, TCS_TABLE_NORMAL_TRANS_1.second);
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TRANS_1.first, &TCS_TABLE_NORMAL_TRANS_1.second)),
|
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TRANS_1.first, &TCS_TABLE_NORMAL_TRANS_1.second)),
|
||||||
ctxc);
|
ctxc);
|
||||||
|
|
||||||
|
2
tmtc
2
tmtc
@ -1 +1 @@
|
|||||||
Subproject commit af17e30676b3c4e364b6969873519951453181e2
|
Subproject commit d758a1f11ac4d39eda08918c124d8736da104687
|
Loading…
Reference in New Issue
Block a user