From e99d4446af1d2f2419c4de4fe3874f17b0873a48 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 10 Oct 2013 19:06:16 +0200 Subject: [PATCH 1/1] name some things a bit clearer: open -> unlock, close -> lock --- actor.py | 8 ++++---- statemachine.odg | Bin 16440 -> 16453 bytes statemachine.py | 42 +++++++++++++++++++++--------------------- tyshell | 4 ++-- tysock.py | 2 +- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/actor.py b/actor.py index 3abd232..248edeb 100644 --- a/actor.py +++ b/actor.py @@ -3,13 +3,13 @@ import RPi.GPIO as GPIO class Actor: CMD_BUZZ = 0 - CMD_OPEN = 1 - CMD_CLOSE = 2 + CMD_UNLOCK = 1 + CMD_LOCK = 2 CMDs = { CMD_BUZZ: ("buzz", 12, [(True, 0.3), (False, 2.0)]), - CMD_OPEN: ("open", 16, [(None, 0.2), (True, 0.3), (False, 1.0)]), - CMD_CLOSE: ("close", 22, [(None, 0.2), (True, 0.3), (False, 1.0)]), + CMD_UNLOCK: ("unlock", 16, [(None, 0.2), (True, 0.3), (False, 1.0)]), + CMD_LOCK: ("lock", 22, [(None, 0.2), (True, 0.3), (False, 1.0)]), } def __init__(self): diff --git a/statemachine.odg b/statemachine.odg index 3201b4288b15c73cc4c24aee8d92f4bf9333b7e6..64b3cebbac907a6b1941c82b35deab817b6c0882 100644 GIT binary patch delta 13146 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 diff --git a/statemachine.py b/statemachine.py index 1be022b..6a3e889 100644 --- a/statemachine.py +++ b/statemachine.py @@ -14,11 +14,11 @@ def play_sound (what): fire_and_forget ([SOUNDS_PLAYER,soundfile], logger.error, "StateMachine: ") -# StateOpening constants +# StateUnlocking constants OPEN_REPEAT_TIMEOUT = 8 OPEN_REPEAT_NUMBER = 3 -# StateClosing constants +# StateLocking constants CLOSE_REPEAT_TIMEOUT = 8 CLOSE_REPEAT_NUMBER = 3 @@ -58,7 +58,7 @@ class StateMachine(): # commands you can send CMD_PINS = 0 CMD_BUZZ = 1 - CMD_OPEN = 2 + CMD_UNLOCK = 2 CMD_WAKEUP = 3 CMD_LAST = 4 @@ -72,7 +72,7 @@ class StateMachine(): def handle_buzz_event(self,arg): # this shouldn't be overwritten self.actor.act(Actor.CMD_BUZZ) arg("200 okay: buzz executed") - def handle_open_event(self,arg): + def handle_cmd_unlock_event(self,arg): if arg is not None: arg("412 Precondition Failed: The current state (%s) cannot handle the OPEN event" % self.__class__.__name__) def handle_wakeup_event(self): @@ -87,8 +87,8 @@ class StateMachine(): self.handle_pins_event() elif arg is CMD_BUZZ: self.handle_buzz_event(arg) - elif arg is CMD_OPEN: - self.handle_open_event(arg) + elif arg is CMD_UNLOCK: + self.handle_cmd_unlock_event(arg) elif arg is CMD_WAKEUP: self.handle_wakeup_event() else: @@ -112,19 +112,19 @@ class StateMachine(): pins = self.pins() if not pins.door_locked: return StateAboutToOpen(self.state_machine) - def handle_open_event(self,callback): + def handle_cmd_unlock_event(self,callback): # intentionally not calling super() implementation - return StateOpening(callback,self.state_machine) + return StateUnlocking(callback,self.state_machine) - class StateOpening(State): + class StateUnlocking(State): def __init__(self,callback,sm): # construct a nervlist - nervlist = [(t*OPEN_REPEAT_TIMEOUT, lambda: self.actor().act(Actor.CMD_OPEN)) for t in xrange(1, OPEN_REPEAT_NUMBER+1)] + nervlist = [(t*OPEN_REPEAT_TIMEOUT, lambda: self.actor().act(Actor.CMD_UNLOCK)) for t in xrange(1, OPEN_REPEAT_NUMBER+1)] nervlist += [((OPEN_REPEAT_NUMBER+1)*OPEN_REPEAT_TIMEOUT, self.could_not_open)] super().__init__(sm,nervlist) self.callbacks=[callback] # FIXME: can we send "202 processing: Trying to open the door" here? Are the callbacks multi-use? - self.actor().act(Actor.CMD_OPEN) + self.actor().act(Actor.CMD_UNLOCK) def notify(self, did_it_work): s = "200 okay: door open" if did_it_work else ("500 internal server error: Couldn't open door with %d tries à %f seconds" % (OPEN_REPEAT_NUMBER,OPEN_REPEAT_TIMEOUT)) for cb in self.callbacks: @@ -136,7 +136,7 @@ class StateMachine(): if not pins.door_locked: self.notify(True) return StateAboutToOpen(self.state_machine) - def handle_open_event(self,callback): + def handle_cmd_unlock_event(self,callback): # intentionally not calling super() implementation # FIXME: 202 notification also here if possible self.callbacks.append(callback) @@ -146,11 +146,11 @@ class StateMachine(): return StateZu(self.state_machine) class AbstractStateWhereOpeningIsRedundant(State): - def handle_open_event(self, callback): + def handle_cmd_unlock_event(self, callback): # intentionally not calling super() implementation callback("299 redundant: Space seems to be already open. Still processing your request tough.") logger.warning("Received OPEN command in StateAboutToOpen. This should not be necessary.") - self.actor().act(Actor.CMD_OPEN) + self.actor().act(Actor.CMD_UNLOCK) class StateAboutToOpen(AbstractStateWhereOpeningIsRedundant): def __init__(self, sm): @@ -185,19 +185,19 @@ class StateMachine(): return StateZu(self.state_machine) # handle_wakeup_event intentionally not overwritten - class StateClosing(State): + class StateLocking(State): # FIXME: Why does this even have callbacks? - # TODO: share code with StateOpening + # TODO: share code with StateUnlocking def __init__(self,sm): # construct a nervlist - nervlist = [(t*CLOSE_REPEAT_TIMEOUT, lambda: self.actor().act(Actor.CMD_CLOSE)) for t in xrange(1, CLOSE_REPEAT_NUMBER+1)] + nervlist = [(t*CLOSE_REPEAT_TIMEOUT, lambda: self.actor().act(Actor.CMD_LOCK)) for t in xrange(1, CLOSE_REPEAT_NUMBER+1)] nervlist += [((CLOSE_REPEAT_NUMBER+1)*CLOSE_REPEAT_TIMEOUT, self.could_not_close)] super().__init__(sm, nervlist) 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) + self.actor().act(Actor.CMD_LOCK) 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)) for cb in self.callbacks: @@ -211,7 +211,7 @@ class StateMachine(): return StateAboutToOpen(self.state_machine) if pins.door_locked: return SpaceZu(self.state_machine) - def handle_open_event(self,callback): + def handle_cmd_unlock_event(self,callback): callback("409 conflict: The server is currently trying to close the door. Try again later.") def could_not_close(self): logger.critical("Couldn't close door after %d tries. Going back to StateAboutToOpen." % CLOSE_REPEAT_NUMBER) @@ -227,12 +227,12 @@ class StateMachine(): def handle_wakeup_event(self): over = time.time() - self.time_entered if over >= LEAVE_TIMEOUT: - return StateClosing(self.state_machine) + return StateLocking(self.state_machine) class StateLeaving(State): def handle_pins_event(self): if self.pins().door_closed: - return StateClosing(self.state_machine) + return StateLocking(self.state_machine) if self.pins().door_locked: return StateZu(self.state_machine) def handle_wakeup_event(self): diff --git a/tyshell b/tyshell index 2280926..1ffccfe 100755 --- a/tyshell +++ b/tyshell @@ -47,8 +47,8 @@ def exitcmd(c): commands = { 'exit': exitcmd, 'help': helpcmd, - 'open': sendcmd(tuerSock, 'open'), - 'close': sendcmd(tuerSock, 'close'), + 'open': sendcmd(tuerSock, 'unlock'), + 'unlock': sendcmd(tuerSock, 'unlock'), 'buzz': sendcmd(tuerSock, 'buzz'), } diff --git a/tysock.py b/tysock.py index 3951d1f..3a0cc3a 100644 --- a/tysock.py +++ b/tysock.py @@ -26,7 +26,7 @@ def forcerm(name): class TySocket(): CMDs = { b'buzz': StateMachine.CMD_BUZZ, - b'open': StateMachine.CMD_OPEN, + b'unlock': StateMachine.CMD_UNLOCK, } def __init__(self, sm): -- 2.30.2