reattempt power switching at least once
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:
@ -53,9 +53,7 @@ void AcsBoardAssembly::startTransition(Mode_t mode, Submode_t submode) {
|
||||
using namespace duallane;
|
||||
// If anything other than MODE_OFF is commanded, perform power state machine first
|
||||
if (mode != MODE_OFF) {
|
||||
if (state != PwrStates::IDLE) {
|
||||
state = PwrStates::IDLE;
|
||||
}
|
||||
pwrStateMachine.reset();
|
||||
// Cache the target modes, required by power state machine
|
||||
targetMode = mode;
|
||||
targetSubmode = submode;
|
||||
@ -74,7 +72,10 @@ ReturnValue_t AcsBoardAssembly::commandChildren(Mode_t mode, Submode_t submode)
|
||||
using namespace duallane;
|
||||
ReturnValue_t result = RETURN_OK;
|
||||
refreshHelperModes();
|
||||
pwrStateMachineWrapper(mode, submode);
|
||||
result = pwrStateMachineWrapper(mode, submode);
|
||||
if (result != RETURN_OK) {
|
||||
return result;
|
||||
}
|
||||
if (state == PwrStates::MODE_COMMANDING) {
|
||||
if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) {
|
||||
result = handleNormalOrOnModeCmd(mode, submode);
|
||||
@ -276,9 +277,7 @@ bool AcsBoardAssembly::isUseable(object_id_t object, Mode_t mode) {
|
||||
void AcsBoardAssembly::handleModeReached() {
|
||||
using namespace duallane;
|
||||
if (targetMode == MODE_OFF) {
|
||||
if (state != PwrStates::IDLE) {
|
||||
state = PwrStates::IDLE;
|
||||
}
|
||||
pwrStateMachine.reset();
|
||||
state = PwrStates::SWITCHING_POWER;
|
||||
// Now we can switch off the power. After that, the AssemblyBase::handleModeReached function
|
||||
// will be called
|
||||
@ -383,21 +382,34 @@ void AcsBoardAssembly::initModeTableEntry(object_id_t id, ModeListEntry& entry)
|
||||
void AcsBoardAssembly::finishModeOp() {
|
||||
using namespace duallane;
|
||||
AssemblyBase::handleModeReached();
|
||||
state = PwrStates::IDLE;
|
||||
pwrStateMachine.reset();
|
||||
powerRetryCounter = 0;
|
||||
tryingOtherSide = false;
|
||||
dualModeErrorSwitch = true;
|
||||
}
|
||||
|
||||
void AcsBoardAssembly::pwrStateMachineWrapper(Mode_t mode, Submode_t submode) {
|
||||
ReturnValue_t AcsBoardAssembly::pwrStateMachineWrapper(Mode_t mode, Submode_t submode) {
|
||||
using namespace duallane;
|
||||
OpCodes opCode = pwrStateMachine.powerStateMachine(mode, submode);
|
||||
if (opCode == OpCodes::NONE) {
|
||||
return;
|
||||
return RETURN_OK;
|
||||
} else if (opCode == OpCodes::FINISH_OP) {
|
||||
finishModeOp();
|
||||
} else if (opCode == OpCodes::START_TRANSITION) {
|
||||
AssemblyBase::startTransition(mode, submode);
|
||||
} else if (opCode == OpCodes::TIMEOUT_OCCURED) {
|
||||
if (powerRetryCounter == 0) {
|
||||
powerRetryCounter++;
|
||||
pwrStateMachine.reset();
|
||||
} else {
|
||||
#if OBSW_VERBOSE_LEVEL >= 1
|
||||
sif::warning << "Timeout occured in power state machine" << std::endl;
|
||||
#endif
|
||||
triggerEvent(POWER_STATE_MACHINE_TIMEOUT, 0, 0);
|
||||
return RETURN_FAILED;
|
||||
}
|
||||
}
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
ReturnValue_t AcsBoardAssembly::initialize() {
|
||||
|
Reference in New Issue
Block a user