Hierarchical State Machine class (QHsm-style state machine implementation strategy)
More...
#include "qp.hpp"
|
enum | QStateRet : QState {
Q_RET_SUPER
, Q_RET_UNHANDLED
, Q_RET_HANDLED
, Q_RET_IGNORED
,
Q_RET_ENTRY
, Q_RET_EXIT
, Q_RET_NULL
, Q_RET_TRAN
,
Q_RET_TRAN_INIT
, Q_RET_TRAN_HIST
} |
|
enum | ReservedSig : QSignal { Q_EMPTY_SIG
, Q_ENTRY_SIG
, Q_EXIT_SIG
, Q_INIT_SIG
} |
| Reserved signals by the QP-framework. More...
|
|
static QState | top (void *const me, QEvt const *const e) noexcept |
| Top state handler that ignores all events.
|
|
QAsmAttr | m_state |
| Current state (pointer to the current state-handler function)
|
|
QAsmAttr | m_temp |
| Temporary storage for target/act-table etc.
|
|
Hierarchical State Machine class (QHsm-style state machine implementation strategy)
- Details
- QP::QHsm represents a Hierarchical State Machine (HSM) with full support for hierarchical nesting of states, entry/exit actions, initial transitions, and transitions to history in any composite state. This class is designed for ease of manual coding of HSMs in C++, but it is also supported by the QM modeling tool.
- Note
- QP::QHsm is not intended to be instantiated directly, but rather serves as the abstract base class for derivation of state machines in the QP Application.
- Backward Traceability
- SRS_QP_SM_00 : QP Framework shall provide support for hierarchical state machines both for Active Objects and for passive event-driven objects in the Application
- SRS_QP_SM_10 : QP Framework shall support multiple and interchangeable State Machine Implementation Strategies
- SDS_QP_QHsm : QHsm State machine class.
- Usage
- The following example illustrates how to derive a state machine class from QHsm. Please note that the QHsm member
super
is defined as the FIRST member of the derived class.
public:
static Calc inst;
private:
double m_op1;
double m_op2;
uint8_t m_oper1;
uint8_t m_oper2;
public:
protected:
. . .
};
Hierarchical State Machine class (QHsm-style state machine implementation strategy)
#define Q_STATE_CAST(handler_)
#define Q_STATE_DECL(state_)
Definition at line 361 of file qp.hpp.
◆ QHsm()
|
explicitprotectednoexcept |
◆ init() [1/2]
void QP::QHsm::init |
( |
void const *const | e, |
|
|
std::uint_fast8_t const | qsId ) |
|
overridevirtual |
Virtual function to take the top-most initial transition in the state machine.
- Details
- Synchronously executes the top-most initial transition in a state machine (must be overridden in the subclasses).
- Parameters
-
[in] | e | pointer to an initialization parameter (might be nullptr) |
[in] | qsId | QS-id of this state machine (for QS local filter) |
Implements QP::QAsm.
Definition at line 123 of file qep_hsm.cpp.
◆ init() [2/2]
void QP::QHsm::init |
( |
std::uint_fast8_t const | qsId | ) |
|
|
inlineoverridevirtual |
Virtual function to take the top-most initial transition in the state machine (overloaded).
- Details
- Synchronously executes the top-most initial transition in a state machine. This overloaded version takes no initialization parameter.
- Parameters
-
[in] | qsId | QS-id of this state machine (for QS local filter) |
Reimplemented from QP::QAsm.
Definition at line 369 of file qp.hpp.
◆ dispatch()
void QP::QHsm::dispatch |
( |
QEvt const *const | e, |
|
|
std::uint_fast8_t const | qsId ) |
|
overridevirtual |
Virtual function to dispatch an event to the state machine.
- Details
- Synchronously dispatches an event for processing to a state machine (must be overridden in the subclasses). The processing of an event represents one run-to-completion (RTC) step.
- Parameters
-
[in] | e | pointer to the event to be dispatched to the MSM |
[in] | qsId | QS-id of this state machine (for QS local filter) |
Implements QP::QAsm.
Definition at line 245 of file qep_hsm.cpp.
◆ isIn()
- Details
- Check if a given state is part of the current active state configuration in QHsm subclasses. Please note that in a hierarchical state machine, to "be in a state" means also to be in a superstate of of the state.
- See also
- QP::QAsm::isIn()
- Attention
- This function must be called only on a state machine that is in the "stable state configuration". Among others, this means that the state machine cannot call it in the middle of its own transition.
- Precondition
qep_hsm:602
- internal integrity check (Software Self-Monitoring (SSM))
- Backward Traceability
-
Reimplemented from QP::QAsm.
Definition at line 450 of file qep_hsm.cpp.
◆ childState()
Obtain the current active child state of a given parent in QP::QMsm
- Details
- Finds the child state of the given
parent
, such that this child state is an ancestor of the currently active state. The main purpose of this function is to support **shallow history*transitions in state machines derived from QMsm.
- Parameters
-
[in] | parent | pointer to the state-handler |
- Returns
- the child of a given
parent
state-handler, which is an ancestor of the currently active state. For the corner case when the currently active state is the given parent
state, function returns the parent
state.
- Postcondition
qep_hsm:890
-
- Note
- This function is used in QM for auto-generating code for state history (shallow history)
Definition at line 486 of file qep_hsm.cpp.
◆ getStateHandler()
|
inlineoverridevirtualnoexcept |
Obtain the current active state from a HSM (read only)
- Returns
- the current active state-handler
- Note
- This function is used for state history (deep history) in the auto-generated code by the QM modeling tool.
Reimplemented from QP::QAsm.
Definition at line 379 of file qp.hpp.
◆ hsm_tran()
std::int_fast8_t QP::QHsm::hsm_tran |
( |
QStateHandler *const | path, |
|
|
std::uint_fast8_t const | qsId ) |
|
private |
Internal implementation of the transition given the path to the target.
- Parameters
-
[in] | path | array of handler function pointers leading to the target |
Definition at line 525 of file qep_hsm.cpp.
The documentation for this class was generated from the following files: