Web based Jalousie control.

mc_statemachine.py 7.7KB

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