finally works
This commit is contained in:
@ -73,11 +73,19 @@ ReturnValue_t EiveSystem::initialize() {
|
||||
if (result != returnvalue::OK) {
|
||||
return result;
|
||||
}
|
||||
|
||||
auto* bpxDest = ObjectManager::instance()->get<HasActionsIF>(objects::BPX_BATT_HANDLER);
|
||||
if (bpxDest == nullptr) {
|
||||
return ObjectManager::CHILD_INIT_FAILED;
|
||||
}
|
||||
bpxBattQueueId = bpxDest->getCommandQueue();
|
||||
|
||||
auto* coreCtrl = ObjectManager::instance()->get<HasActionsIF>(objects::CORE_CONTROLLER);
|
||||
if (coreCtrl == nullptr) {
|
||||
return ObjectManager::CHILD_INIT_FAILED;
|
||||
}
|
||||
coreCtrlQueueId = coreCtrl->getCommandQueue();
|
||||
|
||||
auto* manager = ObjectManager::instance()->get<EventManagerIF>(objects::EVENT_MANAGER);
|
||||
if (manager == nullptr) {
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
@ -178,51 +186,71 @@ void EiveSystem::i2cRecoveryLogic() {
|
||||
}
|
||||
}
|
||||
if (not isInTransition and performI2cReboot) {
|
||||
if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) {
|
||||
startTransition(satsystem::Mode::BOOT, 0);
|
||||
i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT;
|
||||
i2cRebootHandlingCountdown.resetTimer();
|
||||
} else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) {
|
||||
if (mode == satsystem::Mode::BOOT) {
|
||||
result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK,
|
||||
PowerSwitchIF::SWITCH_OFF);
|
||||
if (result != returnvalue::OK) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result);
|
||||
commonI2cRecoverySequenceFinish();
|
||||
return;
|
||||
}
|
||||
CommandMessage msg;
|
||||
ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t());
|
||||
result = commandQueue->sendMessage(bpxBattQueueId, &msg);
|
||||
if (result != returnvalue::OK) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result);
|
||||
commonI2cRecoverySequenceFinish();
|
||||
return;
|
||||
switch (i2cRebootState) {
|
||||
case (I2cRebootState::NONE): {
|
||||
break;
|
||||
}
|
||||
case (I2cRebootState::SYSTEM_MODE_BOOT): {
|
||||
sif::debug << "going to boot mode" << std::endl;
|
||||
startTransition(satsystem::Mode::BOOT, 0);
|
||||
i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT;
|
||||
i2cRebootHandlingCountdown.resetTimer();
|
||||
break;
|
||||
}
|
||||
case (I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT): {
|
||||
sif::debug << "3v3 stack off and batt reboot" << std::endl;
|
||||
if (mode == satsystem::Mode::BOOT) {
|
||||
result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK,
|
||||
PowerSwitchIF::SWITCH_OFF);
|
||||
if (result != returnvalue::OK) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result);
|
||||
commonI2cRecoverySequenceFinish();
|
||||
return;
|
||||
}
|
||||
CommandMessage msg;
|
||||
store_address_t dummy{};
|
||||
ActionMessage::setCommand(&msg, bpxBat::REBOOT, dummy);
|
||||
result = commandQueue->sendMessage(bpxBattQueueId, &msg);
|
||||
if (result != returnvalue::OK) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result);
|
||||
commonI2cRecoverySequenceFinish();
|
||||
return;
|
||||
}
|
||||
i2cRebootState = I2cRebootState::WAIT_CYCLE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (I2cRebootState::WAIT_CYCLE): {
|
||||
i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON;
|
||||
break;
|
||||
}
|
||||
if (i2cRebootHandlingCountdown.hasTimedOut()) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED);
|
||||
performI2cReboot = false;
|
||||
case (I2cRebootState::SWITCH_3V3_STACK_ON): {
|
||||
sif::debug << "3v3 stack on" << std::endl;
|
||||
result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK,
|
||||
PowerSwitchIF::SWITCH_ON);
|
||||
if (result != returnvalue::OK) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result);
|
||||
commonI2cRecoverySequenceFinish();
|
||||
return;
|
||||
}
|
||||
i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE;
|
||||
break;
|
||||
}
|
||||
} else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_ON) {
|
||||
result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK,
|
||||
PowerSwitchIF::SWITCH_ON);
|
||||
if (result != returnvalue::OK) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result);
|
||||
commonI2cRecoverySequenceFinish();
|
||||
return;
|
||||
case (I2cRebootState::SYSTEM_MODE_SAFE): {
|
||||
if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) ==
|
||||
PowerSwitchIF::SWITCH_ON) {
|
||||
// This should always be accepted
|
||||
commonI2cRecoverySequenceFinish();
|
||||
sif::debug << "going back to safe" << std::endl;
|
||||
actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT);
|
||||
}
|
||||
break;
|
||||
}
|
||||
i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE;
|
||||
} else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) {
|
||||
if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) ==
|
||||
PowerSwitchIF::SWITCH_ON) {
|
||||
// This should always be accepted
|
||||
commonI2cRecoverySequenceFinish();
|
||||
actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT);
|
||||
default: {
|
||||
sif::error << "EiveSystem: Unexpected I2C reboot state" << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Timeout handling for the internal procedure.
|
||||
if (i2cRebootState != I2cRebootState::NONE and i2cRebootHandlingCountdown.hasTimedOut()) {
|
||||
actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED);
|
||||
@ -247,3 +275,10 @@ void EiveSystem::commonI2cRecoverySequenceFinish() {
|
||||
// This should always be accepted
|
||||
commandSelfToSafe();
|
||||
}
|
||||
|
||||
ReturnValue_t EiveSystem::handleCommandMessage(CommandMessage* message) {
|
||||
if (message->getMessageType() == messagetypes::ACTION) {
|
||||
return actionHelper.handleActionMessage(message);
|
||||
}
|
||||
return Subsystem::handleCommandMessage(message);
|
||||
}
|
||||
|
Reference in New Issue
Block a user