SampleFSM.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. """Undocumented Module"""
  2. __all__ = ['ClassicStyle', 'NewStyle', 'ToonEyes']
  3. from . import FSM
  4. from direct.task import Task
  5. class ClassicStyle(FSM.FSM):
  6. def __init__(self, name):
  7. FSM.FSM.__init__(self, name)
  8. self.defaultTransitions = {
  9. 'Red': ['Green'],
  10. 'Yellow': ['Red'],
  11. 'Green': ['Yellow'],
  12. }
  13. def enterRed(self):
  14. print("enterRed(self, '%s', '%s')" % (self.oldState, self.newState))
  15. def exitRed(self):
  16. print("exitRed(self, '%s', '%s')" % (self.oldState, self.newState))
  17. def enterYellow(self):
  18. print("enterYellow(self, '%s', '%s')" % (self.oldState, self.newState))
  19. def exitYellow(self):
  20. print("exitYellow(self, '%s', '%s')" % (self.oldState, self.newState))
  21. def enterGreen(self):
  22. print("enterGreen(self, '%s', '%s')" % (self.oldState, self.newState))
  23. def exitGreen(self):
  24. print("exitGreen(self, '%s', '%s')" % (self.oldState, self.newState))
  25. class NewStyle(FSM.FSM):
  26. def enterRed(self):
  27. print("enterRed(self, '%s', '%s')" % (self.oldState, self.newState))
  28. def filterRed(self, request, args):
  29. print("filterRed(self, '%s', %s)" % (request, args))
  30. if request == 'advance':
  31. return 'Green'
  32. return self.defaultFilter(request, args)
  33. def exitRed(self):
  34. print("exitRed(self, '%s', '%s')" % (self.oldState, self.newState))
  35. def enterYellow(self):
  36. print("enterYellow(self, '%s', '%s')" % (self.oldState, self.newState))
  37. def filterYellow(self, request, args):
  38. print("filterYellow(self, '%s', %s)" % (request, args))
  39. if request == 'advance':
  40. return 'Red'
  41. return self.defaultFilter(request, args)
  42. def exitYellow(self):
  43. print("exitYellow(self, '%s', '%s')" % (self.oldState, self.newState))
  44. def enterGreen(self):
  45. print("enterGreen(self, '%s', '%s')" % (self.oldState, self.newState))
  46. def filterGreen(self, request, args):
  47. print("filterGreen(self, '%s', %s)" % (request, args))
  48. if request == 'advance':
  49. return 'Yellow'
  50. return self.defaultFilter(request, args)
  51. def exitGreen(self):
  52. print("exitGreen(self, '%s', '%s')" % (self.oldState, self.newState))
  53. class ToonEyes(FSM.FSM):
  54. def __init__(self):
  55. FSM.FSM.__init__(self, 'eyes')
  56. self.__unblinkName = "unblink"
  57. # Eyes are initially open.
  58. self.request('Open')
  59. def defaultFilter(self, request, args):
  60. # The default filter accepts any direct state request (these
  61. # start with a capital letter).
  62. if request[0].isupper():
  63. return request
  64. # Unexpected command requests are quietly ignored.
  65. return None
  66. def enterOpen(self):
  67. print("swap in eyes open model")
  68. def filterOpen(self, request, args):
  69. if request == 'blink':
  70. taskMgr.remove(self.__unblinkName)
  71. taskMgr.doMethodLater(0.125, self.__unblink, self.__unblinkName)
  72. return 'Closed'
  73. return self.defaultFilter(request, args)
  74. def __unblink(self, task):
  75. self.request('unblink')
  76. return Task.done
  77. def enterClosed(self):
  78. print("swap in eyes closed model")
  79. def filterClosed(self, request, args):
  80. if request == 'unblink':
  81. return 'Open'
  82. return self.defaultFilter(request, args)
  83. def enterSurprised(self):
  84. print("swap in eyes surprised model")
  85. def enterOff(self):
  86. taskMgr.remove(self.__unblinkName)
  87. ####
  88. #### Example of using ClassicStyle:
  89. ##
  90. ## >>> import SampleFSM
  91. ## >>> foo = SampleFSM.ClassicStyle('foo')
  92. ## >>> foo.request('Red')
  93. ## enterRed(self, 'Off', 'Red')
  94. ## ('Red',)
  95. ## >>> foo.request('Yellow')
  96. ## Traceback (most recent call last):
  97. ## File "<stdin>", line 1, in ?
  98. ## File "/home/drose/player/direct/src/fsm/FSM.py", line 168, in request
  99. ## result = func(request, args)
  100. ## File "/home/drose/player/direct/src/fsm/FSM.py", line 210, in defaultFilter
  101. ## self.notify.error("%s rejecting request %s from state %s." % (self.name, request, self.state))
  102. ## File "/home/drose/player/direct/src/directnotify/Notifier.py", line 99, in error
  103. ## raise exception(errorString)
  104. ## StandardError: foo rejecting request Yellow from state Red.
  105. ## >>> foo.request('Green')
  106. ## exitRed(self, 'Red', 'Green')
  107. ## enterGreen(self, 'Red', 'Green')
  108. ## ('Green',)
  109. ## >>>
  110. ####
  111. #### Example of using NewStyle:
  112. ##
  113. ## >>> import SampleFSM
  114. ## >>> foo = SampleFSM.NewStyle('foo')
  115. ## >>> foo.request('Red')
  116. ## enterRed(self, 'Off', 'Red')
  117. ## ('Red',)
  118. ## >>> foo.request('advance')
  119. ## filterRed(self, 'advance', ())
  120. ## exitRed(self, 'Red', 'Green')
  121. ## enterGreen(self, 'Red', 'Green')
  122. ## ('Green',)
  123. ## >>> foo.request('advance')
  124. ## filterGreen(self, 'advance', ())
  125. ## exitGreen(self, 'Green', 'Yellow')
  126. ## enterYellow(self, 'Green', 'Yellow')
  127. ## ('Yellow',)
  128. ## >>> foo.request('advance')
  129. ## filterYellow(self, 'advance', ())
  130. ## exitYellow(self, 'Yellow', 'Red')
  131. ## enterRed(self, 'Yellow', 'Red')
  132. ## ('Red',)
  133. ## >>> foo.request('advance')
  134. ## filterRed(self, 'advance', ())
  135. ## exitRed(self, 'Red', 'Green')
  136. ## enterGreen(self, 'Red', 'Green')
  137. ## ('Green',)
  138. ## >>>
  139. ####
  140. #### Example of using ToonEyes:
  141. ##
  142. ## >>> from ShowBaseGlobal import *
  143. ## >>> import SampleFSM
  144. ## >>> eyes = SampleFSM.ToonEyes()
  145. ## swap in eyes open model
  146. ## >>> eyes.request('blink')
  147. ## swap in eyes closed model
  148. ## ('Closed',)
  149. ## >>> run()
  150. ## swap in eyes open model
  151. ## >>> eyes.request('Surprised')
  152. ## swap in eyes surprised model
  153. ## ('Surprised',)
  154. ## >>> eyes.request('blink')
  155. ## >>>