6#include <QtStateMachine/QStateMachine>
11template<
typename... Args>
18 using Guard = std::function<bool(Args...)>;
19 using Action = std::function<void(Args...)>;
27 template<
typename Sender,
typename Func>
31 , _guard(std::move(guard))
32 , _action(std::move(action))
34 setTargetState(target);
38 std::tuple<Args...>
signalArgs()
const {
return _lastArgs; }
43 if (!QGCSignalTransition::eventTest(event)) {
48 auto* signalEvent =
static_cast<QStateMachine::SignalEvent*
>(event);
49 const QList<QVariant>& arguments = signalEvent->arguments();
52 _lastArgs = extractArgs(arguments, std::index_sequence_for<Args...>{});
55 bool allowed = std::apply(_guard, _lastArgs);
57 qCDebug(QGCStateMachineLog) <<
"SignalDataTransition blocked by guard";
70 std::apply(_action, _lastArgs);
75 template<std::size_t... Is>
76 std::tuple<Args...> extractArgs(
const QList<QVariant>& arguments, std::index_sequence<Is...>)
78 return std::make_tuple(
79 (Is <
static_cast<std::size_t
>(arguments.size())
80 ? arguments[Is].value<std::tuple_element_t<Is, std::tuple<Args...>>>()
81 : std::tuple_element_t<Is, std::tuple<Args...>>{})...
87 mutable std::tuple<Args...> _lastArgs;
92template<
typename... Args,
typename Sender,
typename Func>
94 const Sender* sender, Func signalFn, QAbstractState* target,
98 return new SignalDataTransition<Args...>(sender, signalFn, target, std::move(guard), std::move(action));
SignalDataTransition< Args... > * makeSignalDataTransition(const Sender *sender, Func signalFn, QAbstractState *target, typename SignalDataTransition< Args... >::Guard guard=nullptr, typename SignalDataTransition< Args... >::Action action=nullptr)
Base class for signal-based transitions that need access to QGCStateMachine and Vehicle.
SignalDataTransition(const SignalDataTransition &)=delete
SignalDataTransition(const Sender *sender, Func signalFn, QAbstractState *target, Guard guard=nullptr, Action action=nullptr)
std::tuple< Args... > signalArgs() const
Get the arguments from the last matched signal.
std::function< void(Args...)> Action
void onTransition(QEvent *event) override
SignalDataTransition & operator=(const SignalDataTransition &)=delete
std::function< bool(Args...)> Guard
bool eventTest(QEvent *event) override