|
|
|
@ -14,197 +14,164 @@
|
|
|
|
|
|
|
|
|
|
PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie,
|
|
|
|
|
GpioIF* gpioIF, SdCardMountedIF* sdcMan,
|
|
|
|
|
bool periodicPrintout)
|
|
|
|
|
PowerSwitchIF* pwrSwitcher, power::Switch_t switchA,
|
|
|
|
|
power::Switch_t switchB, bool periodicPrintout)
|
|
|
|
|
: DeviceHandlerBase(objectId, comIF, cookie),
|
|
|
|
|
adcSet(this),
|
|
|
|
|
periodicPrintout(periodicPrintout),
|
|
|
|
|
gpioIF(gpioIF),
|
|
|
|
|
sdcMan(sdcMan) {}
|
|
|
|
|
sdcMan(sdcMan),
|
|
|
|
|
pwrStateMachine(switchA, switchB, pwrSwitcher) {}
|
|
|
|
|
|
|
|
|
|
void PayloadPcduHandler::doStartUp() {
|
|
|
|
|
if ((state != States::PCDU_OFF) and (state != States::ON_TRANS_SSR)) {
|
|
|
|
|
if ((state != States::PL_PCDU_OFF) and (state != States::ON_TRANS_SSR)) {
|
|
|
|
|
// Config error
|
|
|
|
|
sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl;
|
|
|
|
|
}
|
|
|
|
|
if (state == States::PCDU_OFF) {
|
|
|
|
|
// Switch on relays here
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0);
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1);
|
|
|
|
|
state = States::ON_TRANS_SSR;
|
|
|
|
|
transitionOk = true;
|
|
|
|
|
if (pwrStateMachine.getState() == power::States::IDLE) {
|
|
|
|
|
pwrStateMachine.start(MODE_ON, pwrSubmode);
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_SSR) {
|
|
|
|
|
// If necessary, check whether a certain amount of time has elapsed
|
|
|
|
|
if (transitionOk) {
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
state = States::ON_TRANS_ADC_CLOSE_ZERO;
|
|
|
|
|
// We are now in ON mode
|
|
|
|
|
startTransition(MODE_NORMAL, 0);
|
|
|
|
|
adcCountdown.setTimeout(50);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
adcState = AdcStates::BOOT_DELAY;
|
|
|
|
|
// The ADC can now be read. If the values are not close to zero, we should not allow
|
|
|
|
|
// transition
|
|
|
|
|
monMode = MonitoringMode::CLOSE_TO_ZERO;
|
|
|
|
|
}
|
|
|
|
|
auto opCode = pwrStateMachine.fsm();
|
|
|
|
|
if (opCode == power::OpCodes::TO_NOT_OFF_DONE or opCode == power::OpCodes::TIMEOUT_OCCURED) {
|
|
|
|
|
pwrStateMachine.reset();
|
|
|
|
|
quickTransitionAlreadyCalled = false;
|
|
|
|
|
state = States::POWER_CHANNELS_ON;
|
|
|
|
|
setMode(_MODE_TO_ON);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PayloadPcduHandler::stateMachineToNormal() {
|
|
|
|
|
using namespace plpcdu;
|
|
|
|
|
if (adcState == AdcStates::BOOT_DELAY) {
|
|
|
|
|
if (adcCountdown.hasTimedOut()) {
|
|
|
|
|
adcState = AdcStates::SEND_SETUP;
|
|
|
|
|
adcCmdExecuted = false;
|
|
|
|
|
}
|
|
|
|
|
void PayloadPcduHandler::doShutDown() {
|
|
|
|
|
if (not quickTransitionAlreadyCalled) {
|
|
|
|
|
quickTransitionBackToOff(false, false);
|
|
|
|
|
quickTransitionAlreadyCalled = true;
|
|
|
|
|
}
|
|
|
|
|
if (adcState == AdcStates::SEND_SETUP) {
|
|
|
|
|
if (adcCmdExecuted) {
|
|
|
|
|
adcState = AdcStates::NORMAL;
|
|
|
|
|
setMode(MODE_NORMAL, NORMAL_ADC_ONLY);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
adcCmdExecuted = false;
|
|
|
|
|
}
|
|
|
|
|
if (pwrStateMachine.getState() == power::States::IDLE) {
|
|
|
|
|
pwrStateMachine.start(MODE_OFF, 0);
|
|
|
|
|
}
|
|
|
|
|
if (submode == plpcdu::NORMAL_ALL_ON) {
|
|
|
|
|
if (state == States::ON_TRANS_ADC_CLOSE_ZERO) {
|
|
|
|
|
if (not commandExecuted) {
|
|
|
|
|
float waitTime = DFT_SSR_TO_DRO_WAIT_TIME;
|
|
|
|
|
params.getValue(PARAM_KEY_MAP[SSR_TO_DRO_WAIT_TIME], waitTime);
|
|
|
|
|
countdown.setTimeout(std::round(waitTime * 1000));
|
|
|
|
|
countdown.resetTimer();
|
|
|
|
|
commandExecuted = true;
|
|
|
|
|
// TODO: For now, skip ADC check
|
|
|
|
|
transitionOk = true;
|
|
|
|
|
}
|
|
|
|
|
// ADC values are ok, 5 seconds have elapsed
|
|
|
|
|
if (transitionOk and countdown.hasTimedOut()) {
|
|
|
|
|
state = States::ON_TRANS_DRO;
|
|
|
|
|
// Now start monitoring for negative voltages instead
|
|
|
|
|
monMode = MonitoringMode::NEGATIVE;
|
|
|
|
|
commandExecuted = false;
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_DRO) {
|
|
|
|
|
if (not commandExecuted) {
|
|
|
|
|
float waitTime = DFT_DRO_TO_X8_WAIT_TIME;
|
|
|
|
|
params.getValue(PARAM_KEY_MAP[DRO_TO_X8_WAIT_TIME], waitTime);
|
|
|
|
|
countdown.setTimeout(std::round(waitTime * 1000));
|
|
|
|
|
countdown.resetTimer();
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU DRO module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on DRO and start monitoring for negative voltages
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
commandExecuted = true;
|
|
|
|
|
}
|
|
|
|
|
// ADC values are ok, 5 seconds have elapsed
|
|
|
|
|
if (transitionOk and countdown.hasTimedOut()) {
|
|
|
|
|
state = States::ON_TRANS_X8;
|
|
|
|
|
commandExecuted = false;
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_X8) {
|
|
|
|
|
if (not commandExecuted) {
|
|
|
|
|
float waitTime = DFT_X8_TO_TX_WAIT_TIME;
|
|
|
|
|
params.getValue(PARAM_KEY_MAP[X8_TO_TX_WAIT_TIME], waitTime);
|
|
|
|
|
countdown.setTimeout(std::round(waitTime * 1000));
|
|
|
|
|
countdown.resetTimer();
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU X8 module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on X8
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_X8);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
commandExecuted = true;
|
|
|
|
|
}
|
|
|
|
|
// ADC values are ok, 5 seconds have elapsed
|
|
|
|
|
if (transitionOk and countdown.hasTimedOut()) {
|
|
|
|
|
state = States::ON_TRANS_TX;
|
|
|
|
|
commandExecuted = false;
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_TX) {
|
|
|
|
|
if (not commandExecuted) {
|
|
|
|
|
float waitTime = DFT_TX_TO_MPA_WAIT_TIME;
|
|
|
|
|
params.getValue(PARAM_KEY_MAP[TX_TO_MPA_WAIT_TIME], waitTime);
|
|
|
|
|
countdown.setTimeout(std::round(waitTime * 1000));
|
|
|
|
|
countdown.resetTimer();
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU TX module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on TX
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX);
|
|
|
|
|
// Wait for 100 ms before checking ADC values
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
commandExecuted = true;
|
|
|
|
|
}
|
|
|
|
|
// ADC values are ok, 5 seconds have elapsed
|
|
|
|
|
if (transitionOk and countdown.hasTimedOut()) {
|
|
|
|
|
state = States::ON_TRANS_MPA;
|
|
|
|
|
commandExecuted = false;
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_MPA) {
|
|
|
|
|
if (not commandExecuted) {
|
|
|
|
|
float waitTime = DFT_MPA_TO_HPA_WAIT_TIME;
|
|
|
|
|
params.getValue(PARAM_KEY_MAP[MPA_TO_HPA_WAIT_TIME], waitTime);
|
|
|
|
|
countdown.setTimeout(std::round(waitTime * 1000));
|
|
|
|
|
countdown.resetTimer();
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU MPA module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on MPA
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA);
|
|
|
|
|
// Wait for 100 ms before checking ADC values
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
commandExecuted = true;
|
|
|
|
|
}
|
|
|
|
|
// ADC values are ok, 5 seconds have elapsed
|
|
|
|
|
if (transitionOk and countdown.hasTimedOut()) {
|
|
|
|
|
state = States::ON_TRANS_HPA;
|
|
|
|
|
commandExecuted = false;
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_HPA) {
|
|
|
|
|
if (not commandExecuted) {
|
|
|
|
|
// Switch on HPA
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_HPA);
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU HPA module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
commandExecuted = true;
|
|
|
|
|
}
|
|
|
|
|
// ADC values are ok, 5 seconds have elapsed
|
|
|
|
|
if (transitionOk and countdown.hasTimedOut()) {
|
|
|
|
|
state = States::PCDU_ON;
|
|
|
|
|
setMode(MODE_NORMAL, plpcdu::NORMAL_ALL_ON);
|
|
|
|
|
countdown.resetTimer();
|
|
|
|
|
commandExecuted = false;
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
auto opCode = pwrStateMachine.fsm();
|
|
|
|
|
if (opCode == power::OpCodes::TO_OFF_DONE or opCode == power::OpCodes::TIMEOUT_OCCURED) {
|
|
|
|
|
pwrStateMachine.reset();
|
|
|
|
|
// No need to set mode _MODE_POWER_DOWN, power switching was already handled
|
|
|
|
|
setMode(MODE_OFF);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) {
|
|
|
|
|
if (mode == _MODE_TO_NORMAL) {
|
|
|
|
|
stateMachineToNormal();
|
|
|
|
|
stateMachineToNormal(modeFrom, subModeFrom);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
DeviceHandlerBase::doTransition(modeFrom, subModeFrom);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PayloadPcduHandler::doShutDown() { transitionBackToOff(false); }
|
|
|
|
|
ReturnValue_t PayloadPcduHandler::stateMachineToNormal(Mode_t modeFrom, Submode_t subModeFrom) {
|
|
|
|
|
using namespace plpcdu;
|
|
|
|
|
if (submode == NormalSubmodes::SOLID_STATE_RELAYS_ADC_ON) {
|
|
|
|
|
if (state == States::PL_PCDU_OFF) {
|
|
|
|
|
sif::error << "PayloadPcduHandler::stateMachineToNormal: Unexpected state PL_PCDU_OFF"
|
|
|
|
|
<< "detected" << std::endl;
|
|
|
|
|
setMode(MODE_OFF);
|
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
|
}
|
|
|
|
|
if (state == States::POWER_CHANNELS_ON) {
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Switching on SSR VBAT0 & VBAT1 GPIOs" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on relays here
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0);
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1);
|
|
|
|
|
state = States::ON_TRANS_SSR;
|
|
|
|
|
transitionOk = true;
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_SSR) {
|
|
|
|
|
// If necessary, check whether a certain amount of time has elapsed
|
|
|
|
|
if (transitionOk) {
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
state = States::ON_TRANS_ADC_CLOSE_ZERO;
|
|
|
|
|
|
|
|
|
|
adcCountdown.setTimeout(50);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
adcState = AdcStates::BOOT_DELAY;
|
|
|
|
|
// If the values are not close to zero, we should not allow transition
|
|
|
|
|
monMode = MonitoringMode::CLOSE_TO_ZERO;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state == States::ON_TRANS_ADC_CLOSE_ZERO) {
|
|
|
|
|
if (adcState == AdcStates::BOOT_DELAY) {
|
|
|
|
|
if (adcCountdown.hasTimedOut()) {
|
|
|
|
|
adcState = AdcStates::SEND_SETUP;
|
|
|
|
|
adcCmdExecuted = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (adcState == AdcStates::SEND_SETUP) {
|
|
|
|
|
if (adcCmdExecuted) {
|
|
|
|
|
adcState = AdcStates::NORMAL;
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
adcCmdExecuted = false;
|
|
|
|
|
setMode(MODE_NORMAL, submode);
|
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (submode == NormalSubmodes::DRO_ON) {
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU DRO module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on DRO and start monitoring for negative voltages
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
setMode(MODE_NORMAL, submode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (submode == NormalSubmodes::X8_ON) {
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU X8 module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on DRO and start monitoring for negative voltages
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_X8);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
setMode(MODE_NORMAL, submode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (submode == NormalSubmodes::TX_ON) {
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU TX module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on DRO and start monitoring for negative voltages
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
setMode(MODE_NORMAL, submode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (submode == NormalSubmodes::MPA_ON) {
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU MPA module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on DRO and start monitoring for negative voltages
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
setMode(MODE_NORMAL, submode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (submode == NormalSubmodes::HPA_ON) {
|
|
|
|
|
#if OBSW_VERBOSE_LEVEL >= 1
|
|
|
|
|
sif::info << "Enabling PL PCDU HPA module" << std::endl;
|
|
|
|
|
#endif
|
|
|
|
|
// Switch on DRO and start monitoring for negative voltages
|
|
|
|
|
gpioIF->pullHigh(gpioIds::PLPCDU_ENB_HPA);
|
|
|
|
|
adcCountdown.setTimeout(100);
|
|
|
|
|
adcCountdown.resetTimer();
|
|
|
|
|
setMode(MODE_NORMAL, submode);
|
|
|
|
|
}
|
|
|
|
|
return RETURN_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t PayloadPcduHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) {
|
|
|
|
|
switch (adcState) {
|
|
|
|
@ -388,7 +355,7 @@ void PayloadPcduHandler::enablePeriodicPrintout(bool enable, uint8_t divider) {
|
|
|
|
|
opDivider.setDivider(divider);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PayloadPcduHandler::transitionBackToOff(bool notifyFdir) {
|
|
|
|
|
void PayloadPcduHandler::quickTransitionBackToOff(bool startTransitionToOff, bool notifyFdir) {
|
|
|
|
|
States currentState = state;
|
|
|
|
|
gpioIF->pullLow(gpioIds::PLPCDU_ENB_HPA);
|
|
|
|
|
gpioIF->pullLow(gpioIds::PLPCDU_ENB_MPA);
|
|
|
|
@ -398,9 +365,11 @@ void PayloadPcduHandler::transitionBackToOff(bool notifyFdir) {
|
|
|
|
|
gpioIF->pullLow(gpioIds::PLPCDU_ENB_TX);
|
|
|
|
|
gpioIF->pullLow(gpioIds::PLPCDU_ENB_VBAT0);
|
|
|
|
|
gpioIF->pullLow(gpioIds::PLPCDU_ENB_VBAT1);
|
|
|
|
|
state = States::PCDU_OFF;
|
|
|
|
|
state = States::PL_PCDU_OFF;
|
|
|
|
|
adcState = AdcStates::OFF;
|
|
|
|
|
setMode(MODE_OFF);
|
|
|
|
|
if (startTransitionToOff) {
|
|
|
|
|
startTransition(MODE_OFF, 0);
|
|
|
|
|
}
|
|
|
|
|
if (notifyFdir) {
|
|
|
|
|
triggerEvent(TRANSITION_BACK_TO_OFF, static_cast<uint32_t>(currentState));
|
|
|
|
|
}
|
|
|
|
@ -556,7 +525,8 @@ bool PayloadPcduHandler::checkVoltage(float val, float lowerBound, float upperBo
|
|
|
|
|
serializeFloat(p2, val);
|
|
|
|
|
triggerEvent(event, tooLarge, p2);
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
transitionBackToOff(true);
|
|
|
|
|
quickTransitionBackToOff(true, true);
|
|
|
|
|
quickTransitionAlreadyCalled = true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
@ -568,14 +538,37 @@ bool PayloadPcduHandler::checkCurrent(float val, float upperBound, Event event)
|
|
|
|
|
serializeFloat(p2, val);
|
|
|
|
|
triggerEvent(event, true, p2);
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
transitionBackToOff(true);
|
|
|
|
|
quickTransitionBackToOff(true, true);
|
|
|
|
|
quickTransitionAlreadyCalled = true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t PayloadPcduHandler::isModeCombinationValid(Mode_t mode, Submode_t submode) {
|
|
|
|
|
if (mode == MODE_NORMAL and submode <= 1) {
|
|
|
|
|
using namespace plpcdu;
|
|
|
|
|
if (mode == MODE_NORMAL) {
|
|
|
|
|
// Also deals with the case where the mode is MODE_ON, submode should be 0 here
|
|
|
|
|
if (submode == NormalSubmodes::SOLID_STATE_RELAYS_ADC_ON and
|
|
|
|
|
(this->mode == MODE_NORMAL and this->submode != NormalSubmodes::ALL_OFF)) {
|
|
|
|
|
return TRANS_NOT_ALLOWED;
|
|
|
|
|
}
|
|
|
|
|
if ((submode == NormalSubmodes::DRO_ON and
|
|
|
|
|
this->submode != NormalSubmodes::SOLID_STATE_RELAYS_ADC_ON)) {
|
|
|
|
|
return TRANS_NOT_ALLOWED;
|
|
|
|
|
}
|
|
|
|
|
if ((submode == NormalSubmodes::X8_ON and this->submode != NormalSubmodes::DRO_ON)) {
|
|
|
|
|
return TRANS_NOT_ALLOWED;
|
|
|
|
|
}
|
|
|
|
|
if ((submode == NormalSubmodes::TX_ON and this->submode != NormalSubmodes::X8_ON)) {
|
|
|
|
|
return TRANS_NOT_ALLOWED;
|
|
|
|
|
}
|
|
|
|
|
if ((submode == NormalSubmodes::MPA_ON and this->submode != NormalSubmodes::TX_ON)) {
|
|
|
|
|
return TRANS_NOT_ALLOWED;
|
|
|
|
|
}
|
|
|
|
|
if ((submode == NormalSubmodes::HPA_ON and this->submode != NormalSubmodes::MPA_ON)) {
|
|
|
|
|
return TRANS_NOT_ALLOWED;
|
|
|
|
|
}
|
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
|
}
|
|
|
|
|
return DeviceHandlerBase::isModeCombinationValid(mode, submode);
|
|
|
|
@ -658,7 +651,8 @@ void PayloadPcduHandler::handleFailureInjection(std::string output, Event event)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
triggerEvent(event, 0, 0);
|
|
|
|
|
transitionOk = false;
|
|
|
|
|
transitionBackToOff(true);
|
|
|
|
|
quickTransitionBackToOff(true, true);
|
|
|
|
|
quickTransitionAlreadyCalled = true;
|
|
|
|
|
droToX8InjectionRequested = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|