# time that must pass between two bell_ringing events to buzz the door again (seconds)
AUF_BELLBUZZ_REPEAT_TIME = 2
+# Timeout we wait after the switch was switched to "Closed", until we assume nobody will open the door and we just lock it
+LEAVE_TIMEOUT = 30
+
# play_sound constants
SOUNDS_DIRECTORY = "/opt/tuer/sounds/"
SOUNDS_PLAYER = "/usr/bin/mplayer"
# handle_wakeup_event intentionally not overwritten
class StateClosing(State):
+ # FIXME: Why does this even have callbacks?
# TODO: share code with StateOpening, and possibly also with the nerv-mechanism from StateAboutToOpen
- def __init__(self,callback,sm):
+ def __init__(self,sm):
super().__init__(sm)
- self.callbacks=[callback]
+ self.callbacks=[]
# FIXME: can we send "202 processing: Trying to close the door" here? Are the callbacks multi-use?
self.tries = 0
+ assert self.pins().door_closed, "Door is open while we should close it, this must not happen"
self.actor().act(Actor.CMD_CLOSE)
def notify(self, did_it_work):
s = "200 okay: door closed" if did_it_work else ("500 internal server error: Couldn't close door with %d tries à %f seconds" % (CLOSE_REPEAT_NUMBER,CLOSE_REPEAT_TIMEOUT))
return StateAboutToOpen(self.state_machine)
class StateAboutToLeave(State):
- #TODO Ralf
- pass
+ def handle_pins_event(self):
+ if not self.pins().door_closed:
+ return StateLeaving(self.state_machine)
+ if self.pins().door_locked:
+ return StateZu(self.state_machine)
+ def handle_wakeup_event(self):
+ over = time.time() - self.time_entered
+ if over >= LEAVE_TIMEOUT:
+ return StateClosing(self.state_machine)
class StateLeaving(State):
- #TODO Ralf
- pass
+ def handle_pins_event(self):
+ if self.pins().door_closed:
+ return StateClosing(self.state_machine)
+ if self.pins().door_locked:
+ return StateZu(self.state_machine)
+ def handle_wakeup_event(self):
+ over = time.time() - self.time_entered
+ if over >= LEAVE_TIMEOUT:
+ return StateAboutToOpen(self.state_machine)
def __init__(self, actor):
self.actor = actor