QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
ParallelState.cc
Go to the documentation of this file.
1#include "ParallelState.h"
3
4#include <QtStateMachine/QFinalState>
5
6ParallelState::ParallelState(const QString& stateName, QState* parent)
7 : QGCState(stateName, parent)
8{
9 setChildMode(QState::ParallelStates);
10}
11
12void ParallelState::addParallelState(QAbstractState* state)
13{
14 state->setParent(this);
15}
16
17void ParallelState::onEntry(QEvent* event)
18{
20
21 _completedChildren = 0;
22 _activeChildren = 0;
23
24 const auto children = findChildren<QAbstractState*>(Qt::FindDirectChildrenOnly);
25 for (QAbstractState* child : children) {
26 _activeChildren++;
27
28 if (auto* finalState = qobject_cast<QFinalState*>(child)) {
29 connect(finalState, &QFinalState::entered, this, &ParallelState::_onChildFinished, Qt::UniqueConnection);
30 } else if (auto* state = qobject_cast<QState*>(child)) {
31 connect(state, &QState::finished, this, &ParallelState::_onChildFinished, Qt::UniqueConnection);
32 }
33 }
34
35 qCDebug(QGCStateMachineLog) << stateName() << "entered with" << _activeChildren << "parallel children";
36
37 if (_activeChildren == 0) {
38 emit allComplete();
39 emit advance();
40 }
41}
42
43void ParallelState::onExit(QEvent* event)
44{
46 qCDebug(QGCStateMachineLog) << stateName() << "exited";
47}
48
49void ParallelState::_onChildFinished()
50{
51 _completedChildren++;
52 qCDebug(QGCStateMachineLog) << stateName() << "child finished:" << _completedChildren << "/" << _activeChildren;
53 _checkAllComplete();
54}
55
56void ParallelState::_checkAllComplete()
57{
58 if (_completedChildren >= _activeChildren && _activeChildren > 0) {
59 qCDebug(QGCStateMachineLog) << stateName() << "all parallel children complete";
60 emit allComplete();
61 emit advance();
62 }
63}
void addParallelState(QAbstractState *state)
void onEntry(QEvent *event) override
void onExit(QEvent *event) override
ParallelState(const QString &stateName, QState *parent)
void allComplete()
Emitted when all parallel child states have completed.
void onExit(QEvent *event) override
void onEntry(QEvent *event) override
QString stateName() const
bool event(QEvent *event) override