QFsm Class Reference

Finite State Machine base class. More...

#include <qep.h>

List of all members.

Public Member Functions

virtual ~QFsm ()
 virtual destructor
void init (QEvent const *e=(QEvent *) 0)
 Performs the second step of FSM initialization by triggering the top-most initial transition.
void dispatch (QEvent const *e)
 Dispatches an event to a FSM.

Protected Member Functions

 QFsm (QStateHandler initial)
 Protected constructor of a FSM.

Protected Attributes

QStateHandler m_state
 current active state (state-variable)

Detailed Description

Finite State Machine base class.

QFsm represents a traditional non-hierarchical Finite State Machine (FSM) without state hierarchy, but with entry/exit actions.

QFsm is also a base structure for the QHsm class.

Note:
QFsm is not intended to be instantiated directly, but rather serves as the base class for derivation of state machines in the application code.

The following example illustrates how to derive a state machine class from QFsm.

class QBomb : public QFsm {
    uint8_t m_timeout;                     // number of seconds till explosion
    uint8_t m_defuse;                                // the secret defuse code
    uint8_t m_code;                           // the current defuse code entry

public:
    QBomb() : QFsm((QStateHandler)&QBomb::initial) {
    }

protected:
    static QState initial(QBomb *me, QEvent const *e);
    static QState setting(QBomb *me, QEvent const *e);
    static QState timing(QBomb *me, QEvent const *e);
    static QState blast(QBomb *me, QEvent const *e);
};

Definition at line 76 of file qep.h.


Constructor & Destructor Documentation

QFsm::QFsm ( QStateHandler  initial  )  [inline, protected]

Protected constructor of a FSM.

Performs the first step of FSM initialization by assigning the initial pseudostate to the currently active state of the state machine.

Note:
The constructor is protected to prevent direct instantiating of QFsm objects. This class is intended for subclassing only.
See also:
The QFsm example illustrates how to use the QHsm constructor in the constructor initializer list of the derived state machines.

Definition at line 121 of file qep.h.


Member Function Documentation

void QFsm::dispatch ( QEvent const *  e  ) 

Dispatches an event to a FSM.

Processes one event at a time in Run-to-Completion (RTC) fashion. The argument e is a constant pointer the QEvent or a class derived from QEvent.

Note:
Must be called after QFsm::init().
See also:
example for QFsm::init()

Definition at line 35 of file qfsm_dis.cpp.

References m_state, Q_ENTRY_SIG, Q_EXIT_SIG, Q_RET_HANDLED, Q_RET_TRAN, QEP_TRIG_, QS_BEGIN_, QS_END_, QS_FUN_, QS_INT_LOCK_KEY_, QS_OBJ_, QS_QEP_IGNORED, QS_QEP_INTERN_TRAN, QS_QEP_TRAN, QS_SIG_, QEvent::sig, and QS::smObj_.

void QFsm::init ( QEvent const *  e = (QEvent *)0  ) 

Performs the second step of FSM initialization by triggering the top-most initial transition.

The argument e is constant pointer to QEvent or a class derived from QEvent.

Note:
Must be called only ONCE before QFsm::dispatch()

The following example illustrates how to initialize a FSM, and dispatch events to it:

#include "qep.h"                                     // QEP/C public interface
#include "qbomb.h"                              // QBomb FSM derived from QFsm

static QBomb l_qbomb;                              // an instance of QBomb FSM

int main() {
    QBombInitEvt ie;
    ie.defuse = 0x0D;                                           // 1101 binary
    l_qbomb.init(&ie);                           // trigger initial transition

    for (;;) {                                                   // event loop
        QEvent e;
        . . .
        // wait for the next event and assign it to the event object e
        . . .
        l_qbomb.dispatch(&e);                            // dispatch the event
    }
    return 0;
}

Definition at line 41 of file qfsm_ini.cpp.

References m_state, Q_ALLEGE, Q_ENTRY_SIG, Q_RET_TRAN, QEP_TRIG_, QS_BEGIN_, QS_END_, QS_FUN_, QS_INT_LOCK_KEY_, QS_OBJ_, QS_QEP_INIT_TRAN, QS_QEP_STATE_INIT, and QS::smObj_.


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 19:39:10 2010 for QP/C++ by  doxygen 1.6.3