instructions unclear, wrote a whole state machine
Some checks are pending
EIVE/eive-obsw/pipeline/head Build queued...
EIVE/eive-obsw/pipeline/pr-main This commit looks good

This commit is contained in:
Robin Müller 2023-10-19 13:42:54 +02:00
parent 4ee84c0a78
commit f4abb3fed6
Signed by: muellerr
GPG Key ID: A649FB78196E3849
2 changed files with 43 additions and 25 deletions

View File

@ -70,6 +70,9 @@ void EiveSystem::performChildOperation() {
} }
pdecRecoveryLogic(); pdecRecoveryLogic();
i2cRecoveryLogic(); i2cRecoveryLogic();
if (forcePlOffState != ForcePlOffState::NONE) {
forceOffPayload();
}
} }
ReturnValue_t EiveSystem::initialize() { ReturnValue_t EiveSystem::initialize() {
@ -203,7 +206,7 @@ void EiveSystem::handleEventMessages() {
break; break;
} }
case power::POWER_LEVEL_LOW: { case power::POWER_LEVEL_LOW: {
forceOffPayload(); forcePlOffState = ForcePlOffState::FORCE_ALL_EXCEPT_SUPV_OFF;
break; break;
} }
case power::POWER_LEVEL_CRITICAL: case power::POWER_LEVEL_CRITICAL:
@ -403,38 +406,46 @@ void EiveSystem::pdecRecoveryLogic() {
void EiveSystem::forceOffPayload() { void EiveSystem::forceOffPayload() {
CommandMessage msg; CommandMessage msg;
ReturnValue_t result;
// set PL to faulty // set PL to faulty
HealthMessage::setHealthMessage(&msg, HealthMessage::HEALTH_SET, HasHealthIF::FAULTY); HealthMessage::setHealthMessage(&msg, HealthMessage::HEALTH_SET, HasHealthIF::FAULTY);
ReturnValue_t result = commandQueue->sendMessage(plPcduQueueId, &msg); if (forcePlOffState == ForcePlOffState::FORCE_ALL_EXCEPT_SUPV_OFF) {
if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to PL PCDU failed" << std::endl;
}
result = commandQueue->sendMessage(plocMpsocQueueId, &msg); result = commandQueue->sendMessage(plocMpsocQueueId, &msg);
if (result != returnvalue::OK) { if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to PLOC MPSOC failed" << std::endl; sif::error << "EIVE System: Sending FAULTY command to PLOC MPSOC failed" << std::endl;
} }
result = commandQueue->sendMessage(plocSupervisorQueueId, &msg);
if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to PLOC SUPERVISOR failed" << std::endl;
}
result = commandQueue->sendMessage(cameraQueueId, &msg); result = commandQueue->sendMessage(cameraQueueId, &msg);
if (result != returnvalue::OK) { if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to PL CAM failed" << std::endl; sif::error << "EIVE System: Sending FAULTY command to PL CAM failed" << std::endl;
} }
result = commandQueue->sendMessage(scexQueueId, &msg); result = commandQueue->sendMessage(scexQueueId, &msg);
if (result != returnvalue::OK) { if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to SCEX failed" << std::endl; sif::error << "EIVE System: Sending FAULTY command to SCEX failed" << std::endl;
} }
result = commandQueue->sendMessage(radSensorQueueId, &msg); result = commandQueue->sendMessage(radSensorQueueId, &msg);
if (result != returnvalue::OK) { if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to RAD SENSOR failed" << std::endl; sif::error << "EIVE System: Sending FAULTY command to RAD SENSOR failed" << std::endl;
} }
result = commandQueue->sendMessage(plPcduQueueId, &msg);
if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to PL PCDU failed" << std::endl;
}
forcePlOffState = ForcePlOffState::WAITING;
supvOffDelay.resetTimer();
}
if (forcePlOffState == ForcePlOffState::WAITING and supvOffDelay.hasTimedOut()) {
forcePlOffState == ForcePlOffState::FORCE_SUPV_OFF;
}
if (forcePlOffState == ForcePlOffState::FORCE_SUPV_OFF) {
result = commandQueue->sendMessage(plocSupervisorQueueId, &msg);
if (result != returnvalue::OK) {
sif::error << "EIVE System: Sending FAULTY command to PLOC SUPERVISOR failed" << std::endl;
}
forcePlOffState = ForcePlOffState::NONE;
}
} }
void EiveSystem::commonI2cRecoverySequenceFinish() { void EiveSystem::commonI2cRecoverySequenceFinish() {

View File

@ -22,6 +22,12 @@ class EiveSystem : public Subsystem, public HasActionsIF {
[[nodiscard]] MessageQueueId_t getCommandQueue() const override; [[nodiscard]] MessageQueueId_t getCommandQueue() const override;
private: private:
enum class ForcePlOffState {
NONE,
FORCE_ALL_EXCEPT_SUPV_OFF,
WAITING,
FORCE_SUPV_OFF
} forcePlOffState = ForcePlOffState::NONE;
enum class I2cRebootState { enum class I2cRebootState {
NONE, NONE,
SYSTEM_MODE_BOOT, SYSTEM_MODE_BOOT,
@ -37,6 +43,7 @@ class EiveSystem : public Subsystem, public HasActionsIF {
bool alreadyTriedI2cRecovery = false; bool alreadyTriedI2cRecovery = false;
uint8_t frameDirtyErrorCounter = 0; uint8_t frameDirtyErrorCounter = 0;
Countdown supvOffDelay = Countdown(3000);
Countdown frameDirtyCheckCd = Countdown(10000); Countdown frameDirtyCheckCd = Countdown(10000);
// If the PDEC reset was already attempted in the last 2 minutes, there is a high chance that // If the PDEC reset was already attempted in the last 2 minutes, there is a high chance that
// only a full reboot will fix the issue. // only a full reboot will fix the issue.