5#include <QtCore/QRandomGenerator>
11 const QString& stateName,
12 QAbstractState* nextState,
13 const QString& message)
15 auto* state =
new FunctionState(stateName, machine, [machine, message, stateName]() {
16 if (message.isEmpty()) {
17 qCWarning(QGCStateMachineLog) << machine->objectName() <<
"error handled in" << stateName;
19 qCWarning(QGCStateMachineLog) << machine->objectName() << message;
29 const QString& stateName,
30 const QString& message)
32 auto* state =
new FunctionState(stateName, machine, [machine, message, stateName]() {
33 if (message.isEmpty()) {
34 qCWarning(QGCStateMachineLog) << machine->objectName() <<
"stopping due to error in" << stateName;
36 qCWarning(QGCStateMachineLog) << machine->objectName() << message;
48 return [=](
int attempt) {
50 return initialDelayMsecs;
52 double delay = initialDelayMsecs * std::pow(multiplier, attempt - 1);
53 return qMin(
static_cast<int>(delay), maxDelayMsecs);
61 return [=](
int attempt) {
62 int delay = initialDelayMsecs + (attempt - 1) * incrementMsecs;
63 return qMin(delay, maxDelayMsecs);
77 double jitterFraction)
79 return [=](
int attempt) {
82 baseDelay = initialDelayMsecs;
84 baseDelay = initialDelayMsecs * std::pow(multiplier, attempt - 1);
87 baseDelay = qMin(baseDelay,
static_cast<double>(maxDelayMsecs));
90 double jitter = baseDelay * jitterFraction;
91 double randomJitter = QRandomGenerator::global()->generateDouble() * jitter * 2 - jitter;
93 return qMax(1,
static_cast<int>(baseDelay + randomJitter));
QGroundControl specific state machine with enhanced error handling.
std::function< int(int)> exponentialBackoff(int initialDelayMsecs, double multiplier, int maxDelayMsecs)
std::function< int(int)> jitteredExponentialBackoff(int initialDelayMsecs, double multiplier, int maxDelayMsecs, double jitterFraction)
std::function< int(int)> constantDelay(int delayMsecs)
FunctionState * logAndContinue(QGCStateMachine *machine, const QString &stateName, QAbstractState *nextState, const QString &message)
FunctionState * logAndStop(QGCStateMachine *machine, const QString &stateName, const QString &message)
std::function< int(int)> linearBackoff(int initialDelayMsecs, int incrementMsecs, int maxDelayMsecs)