SampleFSM.py 5.5 KB

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