-
Notifications
You must be signed in to change notification settings - Fork 146
HierarchicalFsm
Nikhil Motiani edited this page Apr 12, 2019
·
2 revisions
Both machina.Fsm and machina.BehavioralFsm instances support hierarchical relationships. Any state object under the states property can be given a _child member, which can be one of the following:
- an actual FSM instance
- a function which returns an FSM instance
- an object with a
factorymethod, which returns an FSM instance
Here's an example of two of these approaches:
var crosswalk = new machina.Fsm( {
namespace: "crosswalk",
initialState: "vehiclesEnabled",
states: {
vehiclesEnabled: {
_onEnter: function() {
this.emit( "pedestrians", { status: DO_NOT_WALK } );
},
timeout: "pedestriansEnabled",
_child: vehicleSignal, // already-existing FSM instance
},
pedestriansEnabled: {
_onEnter: function() {
this.emit( "vehicles", { status: RED } );
},
timeout: "vehiclesEnabled",
// factory function which returns an instance of an FSM
_child: function() {
return new PedestrianSignalFsm();
}
}
}
} );- Input fed to the parent is passed to a child FSM (if one exists). If the child has a handler for the input, it handles it and any events emitted are bubbled up to the parent FSM and emitted from there (except for
nohandlerevents). - If the child FSM does not have a handler for the input, it emits a
nohandlerevent (just like any FSM normally would). The parent will detect this event and attempt to handle the input instead. If it doesn't have a handler, it will emit anohandlerevent as well. - If input originates at a child FSM (e.g. - through a setTimeout call set up in the child), and the child does not have a handler for that input, it will bubble up to the parent to be handled there. (The parent will not attempt to delegate bubbled input back to the child that bubbled it up to begin with.)
- Whenever the parent FSM transitions to a new state, if the new state has a child FSM, it's told to handle a
_resetinput just after the new state's_onEnter(if one exists) has completed execution.