QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SubMachineState.cc
Go to the documentation of this file.
1#include "SubMachineState.h"
2#include "QGCStateMachine.h"
4
5SubMachineState::SubMachineState(const QString& stateName, QState* parent, MachineFactory factory)
6 : QGCState(stateName, parent)
7 , _factory(std::move(factory))
8{
9}
10
11void SubMachineState::onEntry(QEvent* event)
12{
14
15 if (!_factory) {
16 qCCritical(QGCStateMachineLog) << stateName() << "no machine factory provided";
17 emit error();
18 return;
19 }
20
21 _childMachine = _factory(this);
22 if (!_childMachine) {
23 qCCritical(QGCStateMachineLog) << stateName() << "factory returned null machine";
24 emit error();
25 return;
26 }
27
28 qCDebug(QGCStateMachineLog) << stateName() << "starting child machine:" << _childMachine->machineName();
29
30 connect(_childMachine, &QStateMachine::finished, this, &SubMachineState::_onChildFinished);
31 connect(_childMachine, &QGCStateMachine::error, this, &SubMachineState::_onChildError);
32
33 _childMachine->start();
34}
35
36void SubMachineState::onExit(QEvent* event)
37{
38 if (_childMachine && _childMachine->isRunning()) {
39 qCDebug(QGCStateMachineLog) << stateName() << "stopping child machine on exit";
40 _childMachine->stop();
41 }
42
43 if (_childMachine) {
44 _childMachine->deleteLater();
45 _childMachine = nullptr;
46 }
47
49}
50
51void SubMachineState::_onChildFinished()
52{
53 qCDebug(QGCStateMachineLog) << stateName() << "child machine finished";
54 emit advance();
55}
56
57void SubMachineState::_onChildError()
58{
59 qCDebug(QGCStateMachineLog) << stateName() << "child machine error";
60 emit childError();
61 emit error();
62}
void onExit(QEvent *event) override
void onEntry(QEvent *event) override
QString stateName() const
bool event(QEvent *event) override
void start()
Start the state machine with debug logging.
void childError()
Emitted when the child machine encounters an error.
void onEntry(QEvent *event) override
void onExit(QEvent *event) override
SubMachineState(const QString &stateName, QState *parent, MachineFactory factory)
std::function< QGCStateMachine *(SubMachineState *parent)> MachineFactory