changed technical incident approach
This commit is contained in:
parent
3c4b6bb0e0
commit
ade9949377
2 changed files with 35 additions and 22 deletions
|
@ -87,6 +87,7 @@ private:
|
||||||
|
|
||||||
enum LoopExitTypes {
|
enum LoopExitTypes {
|
||||||
LoopAutomaticExit = 0,
|
LoopAutomaticExit = 0,
|
||||||
|
LoopReadyStateChangeExit = 1,
|
||||||
LoopManualExit = 2,
|
LoopManualExit = 2,
|
||||||
LoopCancelExit = 3
|
LoopCancelExit = 3
|
||||||
};
|
};
|
||||||
|
|
|
@ -194,13 +194,44 @@ ScStw::StatusCode ScStwRace::cancel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScStwRace::technicalIncident() {
|
void ScStwRace::technicalIncident() {
|
||||||
|
|
||||||
|
bool raceIsRunning = this->state == RUNNING;
|
||||||
|
|
||||||
|
qDebug() << "[ERROR][RACE] Got a technical incident";
|
||||||
|
|
||||||
foreach(ScStwTimer *timer, this->timers){
|
foreach(ScStwTimer *timer, this->timers){
|
||||||
timer->cancel();
|
if(raceIsRunning && timer->getReadyState() == ScStwTimer::ExtensionBatteryNotFine)
|
||||||
|
continue;
|
||||||
|
else if(timer->getReadyState() == ScStwTimer::ExtensionIsNotConnected || timer->getReadyState() == ScStwTimer::ExtensionBatteryNotFine)
|
||||||
|
timer->technicalIncident();
|
||||||
|
else if(!raceIsRunning)
|
||||||
|
timer->setState(ScStwTimer::CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!raceIsRunning) {
|
||||||
|
this->startWaitLoop->exit(LoopCancelExit);
|
||||||
this->soundPlayer->cancel();
|
this->soundPlayer->cancel();
|
||||||
this->setState(INCIDENT);
|
this->setState(INCIDENT);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScStwRace::handleTimerReadyStateChange(ScStwTimer::ReadyState readyState) {
|
||||||
|
|
||||||
|
if(!this->competitionMode || this->state == IDLE || this->state == STOPPED || this->state == INCIDENT )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// cancel as a technical incident if extensions are disconnected or run low on battery
|
||||||
|
if(readyState == ScStwTimer::ExtensionBatteryNotFine || readyState == ScStwTimer::ExtensionBatteryNotFine) {
|
||||||
|
this->technicalIncident();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// only continue if the current state is waiting
|
||||||
|
if(this->state == WAITING) {
|
||||||
|
this->startWaitLoop->exit(ScStwRace::LoopReadyStateChangeExit);
|
||||||
|
emit this->timersChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ScStwRace::handleFalseStart() {
|
int ScStwRace::handleFalseStart() {
|
||||||
if(this->getState() != STARTING && this->getState() != RUNNING)
|
if(this->getState() != STARTING && this->getState() != RUNNING)
|
||||||
|
@ -466,15 +497,6 @@ bool ScStwRace::getIsReadyForNextState() {
|
||||||
|
|
||||||
if(timer->getReadyState() == ScStwTimer::ExtensionIsNotConnected || timer->getReadyState() == ScStwTimer::ExtensionBatteryNotFine) {
|
if(timer->getReadyState() == ScStwTimer::ExtensionIsNotConnected || timer->getReadyState() == ScStwTimer::ExtensionBatteryNotFine) {
|
||||||
|
|
||||||
timer->technicalIncident();
|
|
||||||
|
|
||||||
foreach (ScStwTimer *subTimer, this->timers) {
|
|
||||||
if(timer != subTimer && (timer->getReadyState() == ScStwTimer::ExtensionIsNotConnected || timer->getReadyState() == ScStwTimer::ExtensionBatteryNotFine))
|
|
||||||
subTimer->technicalIncident();
|
|
||||||
else if(timer != subTimer)
|
|
||||||
subTimer->setState(ScStwTimer::CANCELLED);
|
|
||||||
}
|
|
||||||
|
|
||||||
this->technicalIncident();
|
this->technicalIncident();
|
||||||
|
|
||||||
qDebug() << "[ERROR][RACE] Could not start due to not-ready timers";
|
qDebug() << "[ERROR][RACE] Could not start due to not-ready timers";
|
||||||
|
@ -603,7 +625,6 @@ bool ScStwRace::addTimer(ScStwTimer *timer) {
|
||||||
connect(timer, &ScStwTimer::stateChanged, this, &ScStwRace::timersChanged);
|
connect(timer, &ScStwTimer::stateChanged, this, &ScStwRace::timersChanged);
|
||||||
connect(timer, &ScStwTimer::wantsToBeDisabledChanged, this, &ScStwRace::handleTimerWantsToBeDisabledChange);
|
connect(timer, &ScStwTimer::wantsToBeDisabledChanged, this, &ScStwRace::handleTimerWantsToBeDisabledChange);
|
||||||
connect(timer, &ScStwTimer::reactionTimeChanged, this, &ScStwRace::timersChanged);
|
connect(timer, &ScStwTimer::reactionTimeChanged, this, &ScStwRace::timersChanged);
|
||||||
connect(timer, &ScStwTimer::readyStateChanged, this->startWaitLoop, &QEventLoop::quit);
|
|
||||||
connect(timer, &ScStwTimer::readyStateChanged, this, &ScStwRace::handleTimerReadyStateChange);
|
connect(timer, &ScStwTimer::readyStateChanged, this, &ScStwRace::handleTimerReadyStateChange);
|
||||||
|
|
||||||
connect(timer, &ScStwTimer::readyStateChanged, this, &ScStwRace::isReadyForNextStateChanged);
|
connect(timer, &ScStwTimer::readyStateChanged, this, &ScStwRace::isReadyForNextStateChanged);
|
||||||
|
@ -719,15 +740,6 @@ QVariantMap ScStwRace::getDetails() {
|
||||||
bool ScStwRace::isStarting() {
|
bool ScStwRace::isStarting() {
|
||||||
return this->state == PREPAIRING || this->state == WAITING || this->state == STARTING;
|
return this->state == PREPAIRING || this->state == WAITING || this->state == STARTING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScStwRace::handleTimerReadyStateChange(ScStwTimer::ReadyState readyState) {
|
|
||||||
Q_UNUSED(readyState)
|
|
||||||
|
|
||||||
// only continue if the current state is waiting
|
|
||||||
if(this->state == WAITING)
|
|
||||||
emit this->timersChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ScStwRace::getCompetitionMode() {
|
bool ScStwRace::getCompetitionMode() {
|
||||||
return this->competitionMode;
|
return this->competitionMode;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue