78 using EntryCallback = std::function<void()>;
79 using ExitCallback = std::function<void()>;
84 Vehicle *vehicle()
const {
return _vehicle; }
85 QString machineName()
const {
return objectName(); }
94 bool active()
const {
return isRunning(); }
98 QString currentStateName()
const;
102 QStringList stateHistory()
const {
return _stateHistory; }
105 void setStateHistoryLimit(
int limit) { _stateHistoryLimit = limit; }
112 void setOnEntry(EntryCallback callback) { _entryCallback = std::move(callback); }
115 void setOnExit(ExitCallback callback) { _exitCallback = std::move(callback); }
118 void setCallbacks(EntryCallback
onEntry, ExitCallback
onExit =
nullptr);
126 void setEventHandler(
EventHandler handler) { _eventHandler = std::move(handler); }
131 void enablePropertyRestore();
134 bool isPropertyRestoreEnabled()
const;
138 void setGlobalErrorState(QAbstractState* errorState);
141 QAbstractState* globalErrorState()
const {
return _globalErrorState; }
146 void registerState(
QGCState* state);
156 FunctionState* addFunctionState(
const QString& stateName, std::function<
void()> function);
165 int timeoutMsecs = 0);
177 QGCState* addErrorRecoveryState(
const QString& stateName,
180 int retryDelayMsecs = 1000,
184 int timeoutMsecs = 0);
200 void postEvent(
const QString& eventName,
const QVariant& data = QVariant(),
201 EventPriority priority = NormalPriority);
208 int postDelayedEvent(
const QString& eventName,
int delayMsecs,
const QVariant& data = QVariant());
213 bool cancelDelayedEvent(
int eventId);
222 void setInitialState(QAbstractState* state,
bool autoStart =
false);
227 QGCFinalState* addFinalState(
const QString& stateName = QString());
244 template<
typename Func>
246 const QObject* sender,
248 int timeoutMsecs = 0)
251 registerState(state);
267 const QString& eventName,
268 int timeoutMsecs = 0);
290 QState* createTimedActionState(
const QString& stateName,
292 std::function<
void()>
onEntry =
nullptr,
293 std::function<
void()>
onExit =
nullptr);
302 bool isStateActive(QAbstractState* state)
const;
306 QSet<QAbstractState*> activeStates()
const {
return configuration(); }
311 QAbstractState* findState(
const QString& stateName)
const;
315 QList<T*> findStates()
const
317 return findChildren<T*>();
325 bool isInErrorState()
const;
328 FunctionState* addLogAndContinueErrorState(
const QString& stateName,
329 QAbstractState* nextState,
330 const QString& message = QString());
333 FunctionState* addLogAndStopErrorState(
const QString& stateName,
334 const QString& message = QString());
337 QString lastError()
const {
return errorString(); }
341 void clearError(
bool restart =
false);
347 bool resetToState(QAbstractState* state);
352 bool recoverFromError();
358 void setRecoveryState(QAbstractState* state) { _recoveryState = state; }
361 QAbstractState* recoveryState()
const {
return _recoveryState; }
365 bool attemptRecovery();
372 void ensureRunning();
376 void stopMachine(
bool deleteOnStop =
true);
390 template<
typename Func>
391 QSignalTransition* addTransition(QState* from, Func signal, QAbstractState* to,
392 QAbstractAnimation* animation =
nullptr)
394 auto* transition = from->addTransition(from, signal, to);
396 transition->addAnimation(animation);
407 template<
typename Func>
408 GuardedTransition* addGuardedTransition(QState* from, Func signal, QAbstractState* to,
410 QAbstractAnimation* animation =
nullptr)
413 from->addTransition(transition);
415 transition->addAnimation(animation);
426 QAbstractAnimation* animation =
nullptr);
433 TimeoutTransition* addTimeoutTransition(QState* from,
int timeoutMsecs, QAbstractState* to,
434 QAbstractAnimation* animation =
nullptr);
442 template<
typename SenderType,
typename Func>
445 std::function<
void()> retryAction,
448 auto* transition =
new RetryTransition(from, signal, to, std::move(retryAction), maxRetries);
449 from->addTransition(transition);
459 template<
typename SenderType,
typename Func>
462 std::function<
bool()> guard)
465 from->addTransition(transition);
491 template<
typename Sender,
typename Signal>
492 QSignalTransition* addSelfLoopTransition(QState* state,
495 std::function<
void()> action)
497 auto* transition = state->addTransition(sender, signal, state);
499 connect(transition, &QAbstractTransition::triggered,
this, std::move(action));
513 template<
typename Sender,
typename Signal>
517 std::function<
void()> action)
520 state->addTransition(transition);
531 QList<QAbstractTransition*> transitionsFrom(QAbstractState* state)
const;
536 QList<QAbstractTransition*> transitionsTo(QAbstractState* state)
const;
541 QList<QAbstractState*> reachableFrom(QAbstractState* state)
const;
546 QList<QAbstractState*> predecessorsOf(QAbstractState* state)
const;
555 QString dumpCurrentState()
const;
560 QString dumpConfiguration()
const;
563 void logCurrentState()
const;
566 void logConfiguration()
const;
569 void setHistoryRecordingEnabled(
bool enabled,
int maxEntries = 1000);
570 bool historyRecordingEnabled()
const;
571 QString dumpRecordedHistory()
const;
572 QJsonArray recordedHistoryJson()
const;
575 void setProfilingEnabled(
bool enabled);
576 bool profilingEnabled()
const;
577 QString profilingSummary()
const;
580 void setStructuredLoggingEnabled(
bool enabled);
581 bool structuredLoggingEnabled()
const;
586 QString exportAsDot()
const;
591 QList<QAbstractState*> unreachableStates()
const;
596 int maxPathLength()
const;
601 QList<QAbstractState*> deadEndStates()
const;
622 void setProgressWeights(
const QList<QPair<QAbstractState*, int>>& stateWeights);
627 void setSubProgress(
float subProgress);
630 float progress()
const;
633 void resetProgress();
643 void setTimeoutOverride(
const QString& stateName,
int timeoutMsecs);
647 void removeTimeoutOverride(
const QString& stateName);
650 int timeoutOverride(
const QString& stateName)
const;
653 QHash<QString, int> allTimeoutOverrides()
const {
return _timeoutOverrides; }
656 void clearTimeoutOverrides() { _timeoutOverrides.clear(); }
659 QHash<QString, int> timeoutStats()
const {
return _timeoutStats; }
662 void recordTimeout(
const QString& stateName);
665 void clearTimeoutStats() { _timeoutStats.clear(); }
705 void _onStateEntered();
706 float _calculateProgress()
const;
709 QAbstractState* _globalErrorState =
nullptr;
710 QAbstractState* _recoveryState =
nullptr;
711 bool _deleteOnStop =
false;
712 EntryCallback _entryCallback;
713 ExitCallback _exitCallback;
717 QList<QAbstractState*> _progressStates;
718 QList<int> _progressWeights;
719 int _progressTotalWeight = 0;
720 int _progressCurrentIndex = -1;
721 float _progressSubProgress = 0.0f;
722 float _progressLastEmitted = 0.0f;
728 QStringList _stateHistory;
729 int _stateHistoryLimit = 20;
732 QHash<QString, int> _timeoutOverrides;
733 QHash<QString, int> _timeoutStats;