split config into its own file and add threading lock
This commit is contained in:
parent
d6356bbfc5
commit
c543cebf57
21
auxilary.py
21
auxilary.py
|
@ -2,30 +2,11 @@
|
||||||
Various helper functions and classes
|
Various helper functions and classes
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import time, yaml, os
|
import time, os
|
||||||
from subprocess import check_output, DEVNULL, CalledProcessError
|
from subprocess import check_output, DEVNULL, CalledProcessError
|
||||||
from threading import Event
|
from threading import Event
|
||||||
from exceptionThreading import ExceptionThread
|
from exceptionThreading import ExceptionThread
|
||||||
|
|
||||||
class ConfigFile():
|
|
||||||
'''
|
|
||||||
Presents a config yaml file as a dict-like object
|
|
||||||
'''
|
|
||||||
def __init__(self, path):
|
|
||||||
self._path = path
|
|
||||||
with open(self._path, 'r') as f:
|
|
||||||
self._dict = yaml.safe_load(f)
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
|
||||||
return self._dict[key]
|
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
|
||||||
self._dict[key] = value
|
|
||||||
|
|
||||||
def sync(self):
|
|
||||||
with open(self._path, 'w') as f:
|
|
||||||
yaml.dump(self._dict, f, default_flow_style=False)
|
|
||||||
|
|
||||||
class CountdownTimer(ExceptionThread):
|
class CountdownTimer(ExceptionThread):
|
||||||
'''
|
'''
|
||||||
Launches thread which self terminates after some time (given in seconds).
|
Launches thread which self terminates after some time (given in seconds).
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
'''
|
||||||
|
Presents an interface for yaml files as a dict-like object
|
||||||
|
'''
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
from threading import Lock
|
||||||
|
|
||||||
|
class _ConfigFile():
|
||||||
|
def __init__(self, path):
|
||||||
|
self._path = path
|
||||||
|
self._lock = Lock()
|
||||||
|
with open(self._path, 'r') as f:
|
||||||
|
self._dict = yaml.safe_load(f)
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self._dict[key]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
with self._lock:
|
||||||
|
self._dict[key] = value
|
||||||
|
self._sync()
|
||||||
|
|
||||||
|
def _sync(self):
|
||||||
|
with open(self._path, 'w') as f:
|
||||||
|
yaml.dump(self._dict, f, default_flow_style=False)
|
||||||
|
|
||||||
|
configFile = _ConfigFile('config.yaml')
|
4
gmail.py
4
gmail.py
|
@ -1,5 +1,5 @@
|
||||||
import logging, time
|
import logging, time
|
||||||
from auxilary import ConfigFile
|
from config import configFile
|
||||||
from exceptionThreading import async
|
from exceptionThreading import async
|
||||||
from smtplib import SMTP
|
from smtplib import SMTP
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
@ -8,7 +8,7 @@ from email.mime.text import MIMEText
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
gmail = ConfigFile('config.yaml')['gmail']
|
gmail = configFile['gmail']
|
||||||
|
|
||||||
def _getNextDate():
|
def _getNextDate():
|
||||||
m = datetime.now().month + 1
|
m = datetime.now().month + 1
|
||||||
|
|
|
@ -4,7 +4,8 @@ from threading import Lock
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
from auxilary import CountdownTimer, ConfigFile, resetUSBDevice
|
from auxilary import CountdownTimer, resetUSBDevice
|
||||||
|
from config import configFile
|
||||||
from sensors import setupDoorSensor, setupMotionSensor
|
from sensors import setupDoorSensor, setupMotionSensor
|
||||||
from gmail import intruderAlert
|
from gmail import intruderAlert
|
||||||
from listeners import KeypadListener, PipeListener
|
from listeners import KeypadListener, PipeListener
|
||||||
|
@ -69,7 +70,6 @@ class State:
|
||||||
class StateMachine:
|
class StateMachine:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.soundLib = SoundLib()
|
self.soundLib = SoundLib()
|
||||||
self._cfg = ConfigFile('config.yaml')
|
|
||||||
|
|
||||||
def startTimer(t, sound):
|
def startTimer(t, sound):
|
||||||
self._timer = CountdownTimer(t, partial(self.selectState, SIGNALS.TIMOUT), sound)
|
self._timer = CountdownTimer(t, partial(self.selectState, SIGNALS.TIMOUT), sound)
|
||||||
|
@ -110,7 +110,7 @@ class StateMachine:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.currentState = getattr(self.states, self._cfg['state'])
|
self.currentState = getattr(self.states, configFile['state'])
|
||||||
|
|
||||||
self.transitionTable = {
|
self.transitionTable = {
|
||||||
(self.states.disarmed, SIGNALS.ARM): self.states.disarmedCountdown,
|
(self.states.disarmed, SIGNALS.ARM): self.states.disarmedCountdown,
|
||||||
|
@ -191,15 +191,14 @@ class StateMachine:
|
||||||
self.currentState.entry()
|
self.currentState.entry()
|
||||||
|
|
||||||
def selectState(self, signal):
|
def selectState(self, signal):
|
||||||
with self._lock
|
with self._lock:
|
||||||
nextState = self.currentState.next(signal)
|
nextState = self.currentState.next(signal)
|
||||||
if nextState != self.currentState:
|
if nextState != self.currentState:
|
||||||
self.currentState.exit()
|
self.currentState.exit()
|
||||||
self.currentState = nextState
|
self.currentState = nextState
|
||||||
self.currentState.entry()
|
self.currentState.entry()
|
||||||
|
|
||||||
self._cfg['state'] = self.currentState.name
|
configFile['state'] = self.currentState.name
|
||||||
self._cfg.sync()
|
|
||||||
|
|
||||||
logger.info('state changed to %s', self.currentState)
|
logger.info('state changed to %s', self.currentState)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue