# FourStateAI

from direct.fsm.FourStateAI import FourStateAI

Generic four state ClassicFSM base class.
This is a mix-in class that expects that your derived class is a DistributedObjectAI.
Inherit from FourStateFSM and pass in your states. Two of the states should be oposites of each other and the other two should be the transition states between the first two. E.g.
+--------+
-->| closed | --
| +--------+ | | | | v +---------+ +---------+ | closing |<----->| opening | +---------+ +---------+ ^ | | | | +------+ |
----| open |<---
+------+
There is a fifth off state, but that is an implementation detail (and that's why it's not called a five state ClassicFSM).
I found that this pattern repeated in several things I was working on, so this base class was created.

## Inheritance:

FourStateAI:

## Methods of FourStateAI:

__init__
changedOnState
delete
distributeStateChange
enterState0
enterState1
enterState2
enterState3
enterState4
enterStateN
exitState0
exitState1
exitState2
exitState3
exitState4
exitStateN
getState
isOn
sendState
setIsOn
switchToNextStateTask

__init__ def __init__(self, names, durations=[0, 1, None, 1, 1]) names is a list of state names E.g. ['off', 'opening', 'open', 'closing', 'closed',] e.g. 2: ['off', 'locking', 'locked', 'unlocking', 'unlocked',] e.g. 3: ['off', 'deactivating', 'deactive', 'activating', 'activated',] durations is a list of durations in seconds or None values. The list of duration values should be the same length as the list of state names and the lists correspond. For each state, after n seconds, the ClassicFSM will move to the next state. That does not happen for any duration values of None. More Details Here is a diagram showing the where the names from the list are used: +---------+ | 0 (off) |----> (any other state and vice versa). +---------+ +--------+ -->| 4 (on) |--- | +--------+ | | | | v +---------+ +---------+ | 3 (off) |<----->| 1 (off) | +---------+ +---------+ ^ | | | | +---------+ | --| 2 (off) |<-- +---------+ Each states also has an associated on or off value. The only state that is 'on' is state 4. So, the transition states between off and on (states 1 and 3) are also considered off (and so is state 2 which is oposite of state 4 and therefore oposite of 'on').

changedOnState def changedOnState(self, isOn) Allow derived classes to overide this. The self.isOn value has toggled. Call getIsOn() to get the current state.

delete def delete(self) Undocumented function.

distributeStateChange def distributeStateChange(self) This function is intentionaly simple so that derived classes may easily alter the network message.

enterState0 def enterState0(self) Undocumented function.

enterState1 def enterState1(self) Undocumented function.

enterState2 def enterState2(self) Undocumented function.

enterState3 def enterState3(self) Undocumented function.

enterState4 def enterState4(self) Undocumented function.

enterStateN def enterStateN(self, stateIndex, nextStateIndex) Undocumented function.

exitState0 def exitState0(self) Undocumented function.

exitState1 def exitState1(self) Undocumented function.

exitState2 def exitState2(self) Undocumented function.

exitState3 def exitState3(self) Undocumented function.

exitState4 def exitState4(self) Undocumented function.

exitStateN def exitStateN(self) Undocumented function.

getState def getState(self) Undocumented function.

isOn def isOn(self) Undocumented function.

sendState def sendState(self) Undocumented function.

setIsOn def setIsOn(self, isOn) Undocumented function.

switchToNextStateTask def switchToNextStateTask(self, task) Undocumented function.