everything except SDC switch looking good..
This commit is contained in:
@ -440,6 +440,19 @@ ReturnValue_t CoreController::sdStateMachine() {
|
||||
}
|
||||
result = sdcMan->getSdCardsStatus(sdInfo.currentState);
|
||||
updateInternalSdInfo();
|
||||
auto currentlyActiveSdc = sdcMan->getActiveSdCard();
|
||||
// Used/active SD card switches, so mark SD card unusable so other tasks have some time
|
||||
// registering the unavailable SD card.
|
||||
if (not currentlyActiveSdc.has_value() or
|
||||
((currentlyActiveSdc.value() == sd::SdCard::SLOT_0) and
|
||||
(sdInfo.active == sd::SdCard::SLOT_1)) or
|
||||
((currentlyActiveSdc.value() == sd::SdCard::SLOT_1) and
|
||||
(sdInfo.active == sd::SdCard::SLOT_0))) {
|
||||
sdInfo.lockSdCardUsage = true;
|
||||
}
|
||||
if (sdInfo.lockSdCardUsage) {
|
||||
sdcMan->markUnusable();
|
||||
}
|
||||
if (sdInfo.active != sd::SdCard::SLOT_0 and sdInfo.active != sd::SdCard::SLOT_1) {
|
||||
sif::warning << "Preferred SD card invalid. Setting to card 0.." << std::endl;
|
||||
sdInfo.active = sd::SdCard::SLOT_0;
|
||||
@ -451,7 +464,11 @@ ReturnValue_t CoreController::sdStateMachine() {
|
||||
sif::info << "Cold redundant SD card configuration, target SD card: "
|
||||
<< static_cast<int>(sdInfo.active) << std::endl;
|
||||
}
|
||||
SdStates tgtState = SdStates::IDLE;
|
||||
bool skipCycles = sdInfo.lockSdCardUsage;
|
||||
// Need to do different things depending on state of SD card which will be active.
|
||||
if (sdInfo.activeState == sd::SdState::MOUNTED) {
|
||||
// Already mounted, so we can perform handling of the other side.
|
||||
#if OBSW_VERBOSE_LEVEL >= 1
|
||||
std::string mountString;
|
||||
if (sdInfo.active == sd::SdCard::SLOT_0) {
|
||||
@ -464,21 +481,50 @@ ReturnValue_t CoreController::sdStateMachine() {
|
||||
#endif
|
||||
sdcMan->setActiveSdCard(sdInfo.active);
|
||||
currMntPrefix = sdcMan->getCurrentMountPrefix();
|
||||
sdFsmState = SdStates::DETERMINE_OTHER;
|
||||
tgtState = SdStates::DETERMINE_OTHER;
|
||||
} else if (sdInfo.activeState == sd::SdState::OFF) {
|
||||
// It's okay to do the delay after swichting active SD on, no one can use it anyway..
|
||||
sdCardSetup(sdInfo.active, sd::SdState::ON, sdInfo.activeChar, false);
|
||||
sdInfo.commandPending = true;
|
||||
// Do not skip cycles here, would mess up the state machine. We skip the cycles after
|
||||
// the SD card was switched on.
|
||||
skipCycles = false;
|
||||
} else if (sdInfo.activeState == sd::SdState::ON) {
|
||||
sdFsmState = SdStates::MOUNT_SELF;
|
||||
// We can do the delay before mounting where applicable.
|
||||
tgtState = SdStates::MOUNT_SELF;
|
||||
}
|
||||
if (skipCycles) {
|
||||
sdFsmState = SdStates::SKIP_TWO_CYCLES_IF_SD_LOCKED;
|
||||
fsmStateAfterDelay = tgtState;
|
||||
sdInfo.skippedCyclesCount = 0;
|
||||
} else {
|
||||
sdFsmState = tgtState;
|
||||
}
|
||||
} else {
|
||||
if (nonBlockingSdcOpChecking(SdStates::MOUNT_SELF, 10, "Setting SDC state")) {
|
||||
sdInfo.activeState = sd::SdState::ON;
|
||||
currentStateSetter(sdInfo.active, sd::SdState::ON);
|
||||
// Skip the two cycles now.
|
||||
if (sdInfo.lockSdCardUsage) {
|
||||
sdFsmState = SdStates::SKIP_TWO_CYCLES_IF_SD_LOCKED;
|
||||
fsmStateAfterDelay = SdStates::MOUNT_SELF;
|
||||
sdInfo.skippedCyclesCount = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sdFsmState == SdStates::SKIP_TWO_CYCLES_IF_SD_LOCKED) {
|
||||
sif::debug << "skipping cycle.." << std::endl;
|
||||
sdInfo.skippedCyclesCount++;
|
||||
// Count to three because this branch will run in the same FSM cycle.
|
||||
if (sdInfo.skippedCyclesCount == 3) {
|
||||
sdFsmState = fsmStateAfterDelay;
|
||||
fsmStateAfterDelay = SdStates::IDLE;
|
||||
sdInfo.skippedCyclesCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (sdFsmState == SdStates::MOUNT_SELF) {
|
||||
if (not sdInfo.commandPending) {
|
||||
result = sdCardSetup(sdInfo.active, sd::SdState::MOUNTED, sdInfo.activeChar);
|
||||
@ -583,6 +629,8 @@ ReturnValue_t CoreController::sdStateMachine() {
|
||||
sif::warning << "CoreController: Updating SD card state file failed" << std::endl;
|
||||
}
|
||||
updateInternalSdInfo();
|
||||
// Mark usable again in any case.
|
||||
sdcMan->markUsable();
|
||||
sdInfo.commandPending = false;
|
||||
sdFsmState = SdStates::IDLE;
|
||||
sdInfo.cycleCount = 0;
|
||||
@ -2032,6 +2080,11 @@ bool CoreController::startSdStateMachine(sd::SdCard targetActiveSd, SdCfgMode mo
|
||||
}
|
||||
sdFsmState = SdStates::START;
|
||||
sdInfo.active = targetActiveSd;
|
||||
// If we are going from 2 SD cards to one, lock SD card usage in any case because 1 SD card is
|
||||
// going off.
|
||||
if (sdInfo.cfgMode == SdCfgMode::HOT_REDUNDANT and mode == SdCfgMode::COLD_REDUNDANT) {
|
||||
sdInfo.lockSdCardUsage = true;
|
||||
}
|
||||
sdInfo.cfgMode = mode;
|
||||
sdCommandingInfo.actionId = actionId;
|
||||
sdCommandingInfo.commander = commander;
|
||||
|
Reference in New Issue
Block a user