added mutex protection for power switches
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
This commit is contained in:
@ -56,40 +56,61 @@ void SusAssembly::powerStateMachine(Mode_t mode, Submode_t submode) {
|
||||
ReturnValue_t switchStateNom = RETURN_OK;
|
||||
ReturnValue_t switchStateRed = RETURN_OK;
|
||||
if (state == States::IDLE or state == States::SWITCHING_POWER) {
|
||||
switchStateNom = pwrSwitcher->getSwitchState(pcduSwitches::PDU1_CH4_SUS_NOMINAL_3V3);
|
||||
switchStateRed = pwrSwitcher->getSwitchState(pcduSwitches::PDU2_CH4_SUS_REDUNDANT_3V3);
|
||||
if (mode == MODE_OFF) {
|
||||
if (switchStateNom == PowerSwitchIF::SWITCH_OFF and
|
||||
switchStateRed == PowerSwitchIF::SWITCH_OFF) {
|
||||
state = States::MODE_COMMANDING;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
switch (submode) {
|
||||
case (NOMINAL): {
|
||||
if (switchStateNom == PowerSwitchIF::SWITCH_ON and
|
||||
switchStateRed == PowerSwitchIF::SWITCH_OFF) {
|
||||
state = States::MODE_COMMANDING;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
switchStateNom = pwrSwitcher->getSwitchState(SWITCH_NOM);
|
||||
switchStateRed = pwrSwitcher->getSwitchState(SWITCH_RED);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == MODE_OFF) {
|
||||
if (switchStateNom == PowerSwitchIF::SWITCH_OFF and
|
||||
switchStateRed == PowerSwitchIF::SWITCH_OFF) {
|
||||
state = States::MODE_COMMANDING;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (state == States::IDLE) {
|
||||
if (mode == MODE_OFF) {
|
||||
if (switchStateNom != PowerSwitchIF::SWITCH_OFF) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_NOM, false);
|
||||
}
|
||||
case (REDUNDANT): {
|
||||
if (switchStateNom == PowerSwitchIF::SWITCH_OFF and
|
||||
switchStateRed == PowerSwitchIF::SWITCH_ON) {
|
||||
state = States::MODE_COMMANDING;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
if (switchStateRed != PowerSwitchIF::SWITCH_OFF) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_RED, false);
|
||||
}
|
||||
case (DUAL_MODE): {
|
||||
if (switchStateNom == PowerSwitchIF::SWITCH_ON and
|
||||
switchStateRed == PowerSwitchIF::SWITCH_ON) {
|
||||
state = States::MODE_COMMANDING;
|
||||
return;
|
||||
} else {
|
||||
switch (submode) {
|
||||
case (NOMINAL): {
|
||||
if (switchStateNom != PowerSwitchIF::SWITCH_ON) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_NOM, true);
|
||||
}
|
||||
if (switchStateRed != PowerSwitchIF::SWITCH_OFF) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_RED, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (REDUNDANT): {
|
||||
if (switchStateRed != PowerSwitchIF::SWITCH_OFF) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_RED, false);
|
||||
}
|
||||
if (switchStateNom != PowerSwitchIF::SWITCH_ON) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_NOM, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (DUAL_MODE): {
|
||||
if (switchStateNom != PowerSwitchIF::SWITCH_ON) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_NOM, true);
|
||||
}
|
||||
if (switchStateRed != PowerSwitchIF::SWITCH_ON) {
|
||||
pwrSwitcher->sendSwitchCommand(SWITCH_RED, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
state = States::SWITCHING_POWER;
|
||||
}
|
||||
if (state == States::SWITCHING_POWER) {
|
||||
// TODO: Could check for a timeout (temporal or cycles) here and resend command
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user