OMNeT++ API 6.1
Discrete Event Simulation Library
All Classes Functions Variables Typedefs Enumerations Enumerator Modules Pages
FSM Support

Description

Macros and classes for writing Finite State Machines. An FSM is defined with the FSM_Switch() macro.

Classes

class  cFSM
 Store the state of an FSM. This class is used in conjunction with the FSM_Switch() and other FSM_ macros. More...
 

Macros

#define FSM_MAXT   64
 After this many transitions without reaching a steady state we assume the FSM is in an infinite loop. More...
 
#define FSM_Switch(fsm)
 Implements a Finite State Machine. FSM state is stored in an object of type cFSM. More...
 
#define FSM_Transient(state)
 Declares a transient state; to be used in enum which declares states. More...
 
#define FSM_Steady(state)
 Declares a steady state; to be used in enum which declares states. More...
 
#define FSM_Enter(state)
 Within an FSM_Switch() case branch, declares code to be executed on entering the given state. More...
 
#define FSM_Exit(state)
 Within an FSM_Switch() case branch, declares code to be executed on exiting the given state. More...
 
#define FSM_Goto(fsm, state)
 To be used in state exit code, to transition to another state. More...
 

Macro Definition Documentation

◆ FSM_MAXT

#define FSM_MAXT   64

After this many transitions without reaching a steady state we assume the FSM is in an infinite loop.

◆ FSM_Switch

#define FSM_Switch (   fsm)

Implements a Finite State Machine. FSM state is stored in an object of type cFSM.

There are two kinds of states: transient and steady. At each execution of the FSM_Switch() statement, the FSM transitions out of the current (steady) state, potentially undergoes a series of state changes to transient states, and arrives at another steady state.

The actual FSM is embedded in an FSM_Switch(), which has cases for entering and leaving each state:

FSM_Switch(fsm)
{
    case FSM_Exit(state1):
        //...
        break;
    case FSM_Enter(state1):
        //...
        break;
    case FSM_Exit(state2):
        //...
        break;
    case FSM_Enter(state2):
        //...
        break;
    //...
}

States are declared in enums, using the FSM_Transient() and FSM_Steady() macros.

State transitions are done via calls to FSM_Goto(), which simply stores the new state in the cFSM object.

See also
cFSM, FSM_Transient, FSM_Steady, FSM_Goto, FSM_Debug, FSM_Print

◆ FSM_Transient

#define FSM_Transient (   state)

Declares a transient state; to be used in enum which declares states.

Example:

enum {
   INIT = 0,
   SLEEP = FSM_Steady(1),
   ACTIVE = FSM_Steady(2),
   SEND = FSM_Transient(1),
};

The numbers in parens must be unique within the state type and they are used for constructing numeric IDs for the states.

See also
FSM_Steady, FSM_Switch

◆ FSM_Steady

#define FSM_Steady (   state)

Declares a steady state; to be used in enum which declares states.

See example in FSM_Transient.

See also
FSM_Transient, FSM_Switch

◆ FSM_Enter

#define FSM_Enter (   state)

Within an FSM_Switch() case branch, declares code to be executed on entering the given state.

Calls to FSM_Goto() are not allowed within a state's Enter block.

See also
FSM_Switch

◆ FSM_Exit

#define FSM_Exit (   state)

Within an FSM_Switch() case branch, declares code to be executed on exiting the given state.

See also
FSM_Switch

◆ FSM_Goto

#define FSM_Goto (   fsm,
  state 
)

To be used in state exit code, to transition to another state.

Uses stringize (#state), so it only works correctly if 'state' is the enum name itself and not some variable that contains the state code.

See also
FSM_Switch