Module Fsm
This module contains the FSM class and derived FSM_ classes.
This development is based on a state machine implementation made by Conroy Kyle. The state machine can be found here: https://github.com/kyleconroy/lua-state-machine
I've taken the development and enhanced it (actually rewrote it) to make the state machine hierarchical... It is a fantastic development, this module.

1) Core.Fsm#FSM class, extends Core.Base#BASE
A Finite State Machine (FSM) defines the rules of transitioning between various States triggered by Events.
- A State defines a moment in the process.
- An Event describes an action, that can be triggered both internally as externally in the FSM.
1.1) Event Handling

An FSM transitions in 4 moments when an Event is being handled.
Each moment can be catched by handling methods defined by the mission designer,
that will be called by the FSM while executing the transition.
These methods define the flow of the FSM process; because in those methods the FSM Internal Events will be fired.
- To handle State moments, create methods starting with OnLeave or OnEnter concatenated with the State name.
- To handle Event moments, create methods starting with OnBefore or OnAfter concatenated with the Event name.
* The OnLeave and OnBefore transition methods may return false to cancel the transition.*
1.2) Event Triggers

The FSM creates for each Event two Event Trigger methods.
There are two modes how Events can be triggered, which is embedded and delayed:
- The method FSM:Event() triggers an Event that will be processed embedded or immediately.
- The method FSM:__Event( seconds ) triggers an Event that will be processed delayed over time, waiting x seconds.
1.3) FSM Transition Rules
The FSM has transition rules that it follows and validates, as it walks the process. These rules define when an FSM can transition from a specific state towards an other specific state upon a triggered event.
The method FSM.AddTransition() specifies a new possible Transition Rule for the FSM.
The initial state can be defined using the method FSM.SetStartState(). The default start state of an FSM is "None".
1.4) FSM Process Rules
The FSM can implement sub-processes that will execute and return multiple possible states.
Depending upon which state is returned, the main FSM can continue tiggering different events.
The method FSM.AddProcess() adds a new Sub-Process FSM to the FSM.
A Sub-Process will start the Sub-Process of the FSM upon the defined triggered Event,
with multiple possible States as a result.
API CHANGE HISTORY
The underlying change log documents the API changes. Please read this carefully. The following notation is used:
- Added parts are expressed in bold type face.
- Removed parts are expressed in italic type face.
YYYY-MM-DD: CLASS:NewFunction( Params ) replaces CLASS:OldFunction( Params ) YYYY-MM-DD: CLASS:NewFunction( Params ) added
Hereby the change log:
- 2016-12-18: Released.
AUTHORS and CONTRIBUTIONS
Contributions:
- None.
Authors:
- FlightControl: Design & Programming
Global(s)
| FSM | |
| FSM_CONTROLLABLE | |
| FSM_PROCESS | |
| FSM_SET | |
| FSM_TASK |
Type FSM
Type FSM_CONTROLLABLE
| FSM_CONTROLLABLE.ClassName | |
| FSM_CONTROLLABLE.Controllable | |
| FSM_CONTROLLABLE:GetControllable() |
Gets the CONTROLLABLE object that the FSM_CONTROLLABLE governs. |
| FSM_CONTROLLABLE:New(FSMT, Controllable) |
Creates a new FSM_CONTROLLABLE object. |
| FSM_CONTROLLABLE:SetControllable(FSMControllable) |
Sets the CONTROLLABLE object that the FSM_CONTROLLABLE governs. |
| FSM_CONTROLLABLE:_call_handler(handler, params) |
Type FSM_PROCESS
| FSM_PROCESS:AddScore(State, ScoreText, Score) |
Adds a score for the FSM_PROCESS to be achieved. |
| FSM_PROCESS:Assign(Task, ProcessUnit) |
Assign the process to a Unit and activate the process. |
| FSM_PROCESS.ClassName | |
| FSM_PROCESS:Copy(Controllable, Task) |
Creates a new FSMPROCESS object based on this FSMPROCESS. |
| FSM_PROCESS:GetCommandCenter() |
Gets the mission of the process. |
| FSM_PROCESS:GetMission() |
Gets the mission of the process. |
| FSM_PROCESS:GetTask() |
Gets the task of the process. |
| FSM_PROCESS:Init(FsmProcess) | |
| FSM_PROCESS:Message(Message) |
Send a message of the Task to the Group of the Unit. |
| FSM_PROCESS:New(Controllable, Task) |
Creates a new FSM_PROCESS object. |
| FSM_PROCESS:SetTask(Task) |
Sets the task of the process. |
| FSM_PROCESS.Task | |
| FSM_PROCESS:onenterAssigned(ProcessUnit) | |
| FSM_PROCESS:onenterFailed(ProcessUnit) | |
| FSM_PROCESS:onenterSuccess(ProcessUnit) | |
| FSM_PROCESS:onstatechange(ProcessUnit, Event, From, To, Dummy) |
StateMachine callback function for a FSM_PROCESS |
Type FSM_SET
| FSM_SET.ClassName | |
| FSM_SET:Get() |
Gets the SETBASE object that the FSMSET governs. |
| FSM_SET:New(FSMT, Set_SET_BASE, FSMSet) |
Creates a new FSM_SET object. |
| FSM_SET.Set | |
| FSM_SET:_call_handler(handler, params) |
Type FSM_TASK
| FSM_TASK.ClassName | |
| FSM_TASK:New(FSMT, Task, TaskUnit) |
Creates a new FSM_TASK object. |
| FSM_TASK.Task | |
| FSM_TASK:_call_handler(handler, params) |
Global(s)
Type Fsm
Type FSM
FSM class
Field(s)
- FSM:AddEndState(State)
-
Adds an End state.
Parameter
-
State:
-
- FSM:AddProcess(From, Event, Process, ReturnEvents)
-
Set the default Process template with key ProcessName providing the ProcessClass and the process object when it is assigned to a Controllable by the task.
Parameters
-
#table From: Can contain a string indicating the From state or a table of strings containing multiple From states. -
#string Event: The Event name. -
Core.Fsm#FSM_PROCESS Process: An sub-process FSM. -
#table ReturnEvents: A table indicating for which returned events of the SubFSM which Event must be triggered in the FSM.
Return value
Core.Fsm#FSM_PROCESS: The SubFSM.
-
- FSM:AddScore(State, ScoreText, Score)
-
Adds a score for the FSM to be achieved.
Parameters
-
#string State: is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). -
#string ScoreText: is a text describing the score that is given according the status. -
#number Score: is a number providing the score of the status.
Return value
#FSM: self
-
- FSM:AddScoreProcess(From, Event, State, ScoreText, Score)
-
Adds a score for the FSM_PROCESS to be achieved.
Parameters
-
#string From: is the From State of the main process. -
#string Event: is the Event of the main process. -
#string State: is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). -
#string ScoreText: is a text describing the score that is given according the status. -
#number Score: is a number providing the score of the status.
Return value
#FSM: self
-
- FSM:AddTransition(From, Event, To)
-
Add a new transition rule to the FSM.
A transition rule defines when and if the FSM can transition from a state towards another state upon a triggered event.
Parameters
-
#table From: Can contain a string indicating the From state or a table of strings containing multiple From states. -
#string Event: The Event name. -
#string To: The To state.
-
- #string FSM.ClassName
- FSM:GetEndStates()
-
Returns the End states.
- FSM:GetProcess(From, Event)
-
Parameters
-
From: -
Event:
-
- FSM:GetProcesses()
-
Returns a table of the SubFSM rules defined within the FSM.
Return value
#table:
- FSM:GetScores()
-
Returns a table with the scores defined.
- FSM:GetStartState()
-
Returns the start state of the FSM.
Return value
#string: A string containing the start state.
- FSM:GetSubs()
-
Returns a table with the Subs defined.
- FSM:GetTransitions()
-
Returns a table of the transition rules defined within the FSM.
Return value
#table:
- FSM:Is(State)
-
Parameter
-
State:
-
- FSM:LoadCallBacks(CallBackTable)
-
Parameter
-
CallBackTable:
-
- FSM:New(FsmT)
-
Creates a new FSM object.
Parameter
-
FsmT:
Return value
#FSM:
-
- FSM:SetStartState(State)
-
Sets the start state of the FSM.
Parameter
-
#string State: A string defining the start state.
-
- FSM:_add_to_map(Map, Event)
-
Parameters
-
Map: -
Event:
-
- FSM:_call_handler(handler, params)
-
Parameters
-
handler: -
params:
-
- FSM:_create_transition(EventName)
-
Parameter
-
EventName:
-
- FSM:_delayed_transition(EventName)
-
Parameter
-
EventName:
-
- FSM:_eventmap(Events, EventStructure)
-
Parameters
-
Events: -
EventStructure:
-
- FSM:_gosub(ParentFrom, ParentEvent)
-
Parameters
-
ParentFrom: -
ParentEvent:
-
- FSM:_handler(EventName, ...)
-
Parameters
-
EventName: -
...:
-
- FSM:_isendstate(Current)
-
Parameter
-
Current:
-
- FSM:_submap(subs, sub, name)
-
Parameters
-
subs: -
sub: -
name:
-
- FSM:can(e)
-
Parameter
-
e:
-
- FSM:cannot(e)
-
Parameter
-
e:
-
- FSM:is(state)
-
Parameter
-
state:
-
Type FSM_CONTROLLABLE
FSM_CONTROLLABLE class
Field(s)
- #string FSM_CONTROLLABLE.ClassName
- FSM_CONTROLLABLE:GetControllable()
-
Gets the CONTROLLABLE object that the FSM_CONTROLLABLE governs.
Return value
- FSM_CONTROLLABLE:New(FSMT, Controllable)
-
Creates a new FSM_CONTROLLABLE object.
Parameters
-
#table FSMT: Finite State Machine Table -
Wrapper.Controllable#CONTROLLABLE Controllable: (optional) The CONTROLLABLE object that the FSM_CONTROLLABLE governs.
Return value
-
- FSM_CONTROLLABLE:SetControllable(FSMControllable)
-
Sets the CONTROLLABLE object that the FSM_CONTROLLABLE governs.
Parameter
-
Wrapper.Controllable#CONTROLLABLE FSMControllable:
Return value
-
- FSM_CONTROLLABLE:_call_handler(handler, params)
-
Parameters
-
handler: -
params:
-
Type FSM_PROCESS
FSM_PROCESS class
Field(s)
- FSM_PROCESS:AddScore(State, ScoreText, Score)
-
Adds a score for the FSM_PROCESS to be achieved.
Parameters
-
#string State: is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). -
#string ScoreText: is a text describing the score that is given according the status. -
#number Score: is a number providing the score of the status.
Return value
#FSM_PROCESS: self
-
- FSM_PROCESS:Assign(Task, ProcessUnit)
-
Assign the process to a Unit and activate the process.
Parameters
-
Task.Tasking#TASK Task: -
Wrapper.Unit#UNIT ProcessUnit:
Return value
#FSM_PROCESS: self
-
- #string FSM_PROCESS.ClassName
- FSM_PROCESS:Copy(Controllable, Task)
-
Creates a new FSMPROCESS object based on this FSMPROCESS.
Parameters
-
Controllable: -
Task:
Return value
-
- FSM_PROCESS:GetCommandCenter()
-
Gets the mission of the process.
Return value
- FSM_PROCESS:GetMission()
-
Gets the mission of the process.
Return value
- FSM_PROCESS:GetTask()
-
Gets the task of the process.
Return value
- FSM_PROCESS:Init(FsmProcess)
-
Parameter
-
FsmProcess:
-
- FSM_PROCESS:Message(Message)
-
Send a message of the Task to the Group of the Unit.
Parameter
-
Message:
-
- FSM_PROCESS:New(Controllable, Task)
-
Creates a new FSM_PROCESS object.
Parameters
-
Controllable: -
Task:
Return value
-
- FSM_PROCESS:SetTask(Task)
-
Sets the task of the process.
Parameter
-
Tasking.Task#TASK Task:
Return value
-
- FSM_PROCESS:onenterAssigned(ProcessUnit)
-
Parameter
-
ProcessUnit:
-
- FSM_PROCESS:onenterFailed(ProcessUnit)
-
Parameter
-
ProcessUnit:
-
- FSM_PROCESS:onenterSuccess(ProcessUnit)
-
Parameter
-
ProcessUnit:
-
- FSM_PROCESS:onstatechange(ProcessUnit, Event, From, To, Dummy)
-
StateMachine callback function for a FSM_PROCESS
Parameters
-
Wrapper.Controllable#CONTROLLABLE ProcessUnit: -
#string Event: -
#string From: -
#string To: -
Dummy:
-
Type FSM_SET
FSM_SET class
Field(s)
- #string FSM_SET.ClassName
- FSM_SET:Get()
-
Gets the SETBASE object that the FSMSET governs.
Return value
- FSM_SET:New(FSMT, Set_SET_BASE, FSMSet)
-
Creates a new FSM_SET object.
Parameters
-
#table FSMT: Finite State Machine Table -
SetSETBASE: FSMSet (optional) The Set object that the FSM_SET governs. -
FSMSet:
Return value
-
- FSM_SET:_call_handler(handler, params)
-
Parameters
-
handler: -
params:
-
Type FSM_TASK
FSM_TASK class
Field(s)
- #string FSM_TASK.ClassName
- FSM_TASK:New(FSMT, Task, TaskUnit)
-
Creates a new FSM_TASK object.
Parameters
-
#table FSMT: -
Tasking.Task#TASK Task: -
Wrapper.Unit#UNIT TaskUnit:
Return value
-
- FSM_TASK:_call_handler(handler, params)
-
Parameters
-
handler: -
params:
-