QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
ErrorHandlers.cc
Go to the documentation of this file.
1#include "ErrorHandlers.h"
2#include "QGCStateMachine.h"
4
5#include <QtCore/QRandomGenerator>
6
7namespace ErrorHandlers
8{
9
11 const QString& stateName,
12 QAbstractState* nextState,
13 const QString& message)
14{
15 auto* state = new FunctionState(stateName, machine, [machine, message, stateName]() {
16 if (message.isEmpty()) {
17 qCWarning(QGCStateMachineLog) << machine->objectName() << "error handled in" << stateName;
18 } else {
19 qCWarning(QGCStateMachineLog) << machine->objectName() << message;
20 }
21 });
22
23 state->addTransition(state, &QGCState::advance, nextState);
24
25 return state;
26}
27
29 const QString& stateName,
30 const QString& message)
31{
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;
35 } else {
36 qCWarning(QGCStateMachineLog) << machine->objectName() << message;
37 }
38 machine->stop();
39 });
40
41 return state;
42}
43
44std::function<int(int)> exponentialBackoff(int initialDelayMsecs,
45 double multiplier,
46 int maxDelayMsecs)
47{
48 return [=](int attempt) {
49 if (attempt <= 1) {
50 return initialDelayMsecs;
51 }
52 double delay = initialDelayMsecs * std::pow(multiplier, attempt - 1);
53 return qMin(static_cast<int>(delay), maxDelayMsecs);
54 };
55}
56
57std::function<int(int)> linearBackoff(int initialDelayMsecs,
58 int incrementMsecs,
59 int maxDelayMsecs)
60{
61 return [=](int attempt) {
62 int delay = initialDelayMsecs + (attempt - 1) * incrementMsecs;
63 return qMin(delay, maxDelayMsecs);
64 };
65}
66
67std::function<int(int)> constantDelay(int delayMsecs)
68{
69 return [=](int) {
70 return delayMsecs;
71 };
72}
73
74std::function<int(int)> jitteredExponentialBackoff(int initialDelayMsecs,
75 double multiplier,
76 int maxDelayMsecs,
77 double jitterFraction)
78{
79 return [=](int attempt) {
80 double baseDelay;
81 if (attempt <= 1) {
82 baseDelay = initialDelayMsecs;
83 } else {
84 baseDelay = initialDelayMsecs * std::pow(multiplier, attempt - 1);
85 }
86
87 baseDelay = qMin(baseDelay, static_cast<double>(maxDelayMsecs));
88
89 // Add random jitter
90 double jitter = baseDelay * jitterFraction;
91 double randomJitter = QRandomGenerator::global()->generateDouble() * jitter * 2 - jitter;
92
93 return qMax(1, static_cast<int>(baseDelay + randomJitter));
94 };
95}
96
97} // namespace ErrorHandlers
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)