Commit 98411bd4 authored by Constantin's avatar Constantin
Browse files

fallback mode usable from tyshell

parent 5c494522
......@@ -83,6 +83,9 @@ class StateMachine():
CMD_UNLOCK = 2
CMD_WAKEUP = 3
CMD_LAST = 4
CMD_LOCK = 5
CMD_FALLBACK_ON = 6
CMD_FALLBACK_OFF = 7
class State():
def __init__(self, state_machine, nervlist = None):
......@@ -99,6 +102,14 @@ class StateMachine():
def handle_wakeup_event(self):
if self._nerver is not None:
return self._nerver.nerv()
def handle_cmd_lock_event(self,arg):
arg("412 Precondition Failed: If not in fallback mode, use the hardware switch to lock the space.")
def handle_cmd_fallback_on_event(self,arg):
arg("200 okay: Entering fallback mode and notifying admins.")
logger.critical("Entering fallback mode. Somebody thinks, the hardware sensors are broken.")
return StateMachine.StateFallback(self.state_machine)
def handle_cmd_fallback_off_event(self,arg):
arg("412 Precondition Failed: Not in fallback mode!")
def on_leave(self):
pass
def pins(self):
......@@ -118,6 +129,12 @@ class StateMachine():
return self.handle_cmd_unlock_event(arg)
elif ev == StateMachine.CMD_WAKEUP:
return self.handle_wakeup_event()
elif ev == StateMachine.CMD_LOCK:
return self.handle_cmd_lock_event(arg)
elif ev == StateMachine.CMD_FALLBACK_ON:
return self.handle_cmd_fallback_on_event(arg)
elif ev == StateMachine.CMD_FALLBACK_OFF:
return self.handle_cmd_fallback_off_event(arg)
else:
raise Exception("Unknown command number: %d" % ev)
......@@ -178,10 +195,6 @@ class StateMachine():
self._red_state = False
def handle_pins_event(self):
pins = self.pins()
# buzz if open and bell rang
if pins.space_active and pins.bell_ringing and not self.old_pins().bell_ringing:
logger.info("StateFallback: Space switch on and door bell rung => buzzing")
self.actor().act(Actor.CMD_BUZZ)
# set green LED according to space switch
if pins.space_active:
self.actor().act(Actor.CMD_GREEN_ON)
......@@ -204,8 +217,18 @@ class StateMachine():
self._red_state = True
def handle_cmd_unlock_event(self,arg):
if arg is not None:
arg("298 Fallback Okay: Trying to unlock the door. The System is in fallback mode, success information is not available.")
arg("200 okay: Trying to unlock the door. The System is in fallback mode, success information is not available.")
self.actor().act(Actor.CMD_UNLOCK)
def handle_cmd_lock_event(self,arg):
if arg is not None:
arg("200 okay: Trying to lock the door. The System is in fallback mode, success information is not available.")
self.actor().act(Actor.CMD_LOCK)
def handle_cmd_fallback_on_event(self,arg):
arg("412 Precondition Failed: Fallback mode already active.")
def handle_cmd_fallback_off_event(self,arg):
arg("200 okay: Leaving fallback mode and notifying admins.")
logger.critical("Leaving fallback mode. Somebody thinks, the sensors are working again.")
return StateMachine.StateStart(self.state_machine)
class StateZu(AbstractLockedState):
def handle_cmd_unlock_event(self,callback):
......@@ -340,6 +363,7 @@ class StateMachine():
def stop (self):
self.callback.stop()
# actually call this.callback (is set in the constructor to make this thread safe)
def _callback(self, cmd, arg=None):
# update pins
if cmd == StateMachine.CMD_PINS:
......
......@@ -64,14 +64,28 @@ def alias (cmds, aliases):
cmds[newname] = cmds[oldname]
return cmds
def prompt_sure(f,msg):
def run(c):
try:
command = input("%s Are you sure? (yes/no) > " % msg)
except EOFError:
print()
return
if command[0] == 'y':
return f(c)
return run
CmdEntry = namedtuple('CmdEntry','function helpstring')
commands = alias({
'exit': CmdEntry(exitcmd, 'Quits this shell'),
'help': CmdEntry(helpcmd, 'Helps you getting to know the available commands'),
'unlock': CmdEntry(sendcmd(tuerSock, 'unlock'), 'Will try to unlock the apartment door'),
'lock': CmdEntry(sendcmd(tuerSock, 'lock'), 'If in fallback mode, try to lock the apartment door. If not in fallback mode, you must use the switch near the door.'),
'buzz': CmdEntry(sendcmd(tuerSock, 'buzz'), 'Will buzz the buzzer for the street door'),
'who': CmdEntry(whocmd, 'Shows the list of people, who are allowed to control this system'),
'fallback_mode_on': CmdEntry(prompt_sure(sendcmd(tuerSock, 'fallback_mode_on'),'WARNING: This action will be reported to the admins. Use this only in case of Sphinx hardware failure when you need to ignore erroneous sensor input!'), 'Sets the system in a state where it is less dependent on sensoric input. Use it only when sensors are broken.'),
'fallback_mode_off': CmdEntry(prompt_sure(sendcmd(tuerSock, 'fallback_mode_off'),'WARNING: This action will be reported to the admins. Use this only if you have fixed the sensors of the Sphinx or activated fallback mode by accident!'), 'Resets the system to the default state. Use this when you have just repaired the sensors of the Sphinx.'),
},{
# aliases
'open': 'unlock',
......
......@@ -27,6 +27,9 @@ class TySocket():
CMDs = {
b'buzz': StateMachine.CMD_BUZZ,
b'unlock': StateMachine.CMD_UNLOCK,
b'lock': StateMachine.CMD_LOCK,
b'fallback_mode_on': StateMachine.CMD_FALLBACK_ON,
b'fallback_mode_off': StateMachine.CMD_FALLBACK_OFF,
}
def __init__(self, sm):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment