Web based Jalousie control.

mc_statemachine.py 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. '''
  2. Created on 24.06.2014
  3. @author: volkma_s
  4. implementation for motor control state machine
  5. list of states:
  6. idle - idle state
  7. Move_UP - move up
  8. UP - in up position
  9. Move_DOWN - move down
  10. DOWN - in down position
  11. '''
  12. from queue import Queue
  13. import threading
  14. from mc_control.mc_timer import mc_timer
  15. #from pyface_simulation import pifacedigitalio
  16. class Position():
  17. def __init__(self, min_value=0, max_value=100, step=1):
  18. self.step=step
  19. self.min=min_value
  20. self.max=max_value
  21. self.position=self.min
  22. def increase(self):
  23. if self.position+self.step > self.max:
  24. self.position = self.max
  25. else:
  26. self.position = self.position+self.step
  27. def decrease(self):
  28. if self.position-self.step < self.min:
  29. self.position = self.min
  30. else:
  31. self.position = self.position-self.step
  32. def reset(self):
  33. self.position=self.min
  34. def SetPosition(self, position):
  35. self.position = position
  36. class mc_event():
  37. Up=0
  38. Down=1
  39. Stop=2
  40. Timeout=3
  41. UpdatePosition=4
  42. class mc_states():
  43. idle=0
  44. move_up=1
  45. move_down=2
  46. state_up=3
  47. state_down=4
  48. class mc_state_machine(threading.Thread):
  49. def __init__(self, Port_Up, Port_Down, timeout_value=60):
  50. threading.Thread.__init__(self)
  51. self.MailBox = Queue()
  52. self.__running = True
  53. self.Port_Up = Port_Up
  54. self.Port_Down = Port_Down
  55. #self.pfd = pifacedigitalio.PiFaceDigital() # creates a PiFace Digtal object
  56. self.timeout_value = timeout_value # sec.
  57. self.PositionUpdateTimerPeriode = timeout_value/10 # sec.
  58. self.MotorTimeout = mc_timer()
  59. self.PositionUpdate = mc_timer()
  60. self.states = []
  61. self.states.append( mc_state_idle(self))
  62. self.states.append( State_Move_UP(self))
  63. self.states.append( State_Move_DOWN(self))
  64. self.states.append( State_UP(self))
  65. self.states.append( State_DOWN(self))
  66. self.current_state = mc_states.idle
  67. self.Start()
  68. self.position=Position(0, 100, 10);
  69. pass
  70. def EventHandler(self, event):
  71. print("event: {} position: {}".format(event, self.position.position))
  72. if(event == mc_event.Up):
  73. self.states[self.current_state].Up()
  74. elif(event == mc_event.Down):
  75. self.states[self.current_state].Down()
  76. elif(event == mc_event.Stop):
  77. self.states[self.current_state].Stop()
  78. elif(event == mc_event.Timeout):
  79. self.states[self.current_state].Timeout()
  80. elif(event == mc_event.UpdatePosition):
  81. self.states[self.current_state].UpdatePosition()
  82. def set_state(self, state):
  83. self.current_state = state
  84. self.states[self.current_state].entry()
  85. # actions
  86. def MotorUp(self):
  87. print('MotorUp')
  88. print('Switch Port={} on'.format(self.Port_Up))
  89. print('Switch Port={} off'.format(self.Port_Down))
  90. self.Port_Up.on()
  91. self.Port_Down.off()
  92. def MotorDown(self):
  93. print('MotorDown')
  94. print('Switch Port={} off'.format(self.Port_Up))
  95. print('Switch Port={} on'.format(self.Port_Down))
  96. self.Port_Up.off()
  97. self.Port_Down.on()
  98. def MotorStop(self):
  99. print('MotorStop')
  100. print('Switch Port={} off'.format(self.Port_Up))
  101. print('Switch Port={} off'.format(self.Port_Down))
  102. self.Port_Up.off()
  103. self.Port_Down.off()
  104. def run(self):
  105. print("leave StateMachine")
  106. while self.__running==True:
  107. #try:
  108. event = self.MailBox.get()#timeout=1)
  109. if(event != None):
  110. self.EventHandler(event)
  111. #except:
  112. # pass
  113. print("leave StateMachine")
  114. def Start(self):
  115. self.__running=True
  116. self.start()
  117. def Stop(self):
  118. self.__running=False
  119. self.MailBox.put(mc_event.Stop)
  120. self.join()
  121. class State():
  122. # event handlers
  123. def Up(self):
  124. self.mc_sm.set_state(mc_states.move_up)
  125. def Down(self):
  126. self.mc_sm.set_state(mc_states.move_down)
  127. def Stop(self):
  128. self.mc_sm.set_state(mc_states.idle)
  129. def Timeout(self):
  130. pass
  131. def UpdatePosition(self):
  132. pass
  133. def entry(self):
  134. pass
  135. ##########################################################################
  136. class mc_state_idle(State):
  137. def __init__(self, mc_sm):
  138. self.mc_sm = mc_sm
  139. def entry(self):
  140. self.mc_sm.MotorStop()
  141. self.mc_sm.MotorTimeout.StopTimer()
  142. self.mc_sm.PositionUpdate.StopTimer()
  143. def UpdatePosition(self):
  144. self.mc_sm.PositionUpdate.StopTimer()
  145. ##########################################################################
  146. class State_Move_UP(State):
  147. def __init__(self, mc_sm):
  148. self.mc_sm=mc_sm
  149. def entry(self):
  150. self.mc_sm.MotorUp()
  151. self.mc_sm.MotorTimeout.StartTimer(self.mc_sm.timeout_value, self.mc_sm.MailBox, mc_event.Timeout)
  152. self.mc_sm.PositionUpdate.StartTimer(self.mc_sm.PositionUpdateTimerPeriode, self.mc_sm.MailBox, mc_event.UpdatePosition)
  153. def Timeout(self):
  154. self.mc_sm.set_state(mc_states.state_up)
  155. def UpdatePosition(self):
  156. self.mc_sm.PositionUpdate.StartTimer(self.mc_sm.PositionUpdateTimerPeriode, self.mc_sm.MailBox, mc_event.UpdatePosition)
  157. self.mc_sm.position.increase()
  158. ##########################################################################
  159. class State_UP(State):
  160. def __init__(self, mc_sm):
  161. self.mc_sm=mc_sm
  162. def entry(self):
  163. self.mc_sm.MotorStop()
  164. #self.mc_sm.Position = 100
  165. self.mc_sm.position.SetPosition(self.mc_sm.position.max)
  166. def UpdatePosition(self):
  167. self.mc_sm.PositionUpdate.StopTimer()
  168. ##########################################################################
  169. class State_Move_DOWN(State):
  170. def __init__(self, mc_sm):
  171. self.mc_sm=mc_sm
  172. def entry(self):
  173. self.mc_sm.MotorDown()
  174. self.mc_sm.MotorTimeout.StartTimer(self.mc_sm.timeout_value, self.mc_sm.MailBox, mc_event.Timeout)
  175. self.mc_sm.PositionUpdate.StartTimer(self.mc_sm.PositionUpdateTimerPeriode, self.mc_sm.MailBox, mc_event.UpdatePosition)
  176. def Timeout(self):
  177. self.mc_sm.set_state(mc_states.state_down)
  178. def UpdatePosition(self):
  179. self.mc_sm.PositionUpdate.StartTimer(self.mc_sm.PositionUpdateTimerPeriode, self.mc_sm.MailBox, mc_event.UpdatePosition)
  180. self.mc_sm.position.decrease()
  181. ##########################################################################
  182. class State_DOWN(State):
  183. def __init__(self, mc_sm):
  184. self.mc_sm=mc_sm
  185. def entry(self):
  186. self.mc_sm.MotorStop()
  187. #self.mc_sm.Position = 0
  188. self.mc_sm.position.SetPosition(self.mc_sm.position.min)
  189. def UpdatePosition(self):
  190. self.mc_sm.PositionUpdate.StopTimer()