Improved sensor logic, added identify pipe

poll_rate can now be modified by clients
unsubscribe_all call added for disconnecting clients ("unsubscribe")
Improved logic that determines which sensors need to be queried

Identify plays a sound when it receives data
This commit is contained in:
Philip Trauner 2016-12-07 23:37:12 +01:00
parent 7748c30f6a
commit ef51b29ecb

View file

@ -3,7 +3,6 @@ import Logging
import Config import Config
import Utils import Utils
import socket import socket
import time import time
import os import os
@ -72,13 +71,24 @@ class SensorReadout:
if peer in self.peers: if peer in self.peers:
if port in self.peers[peer][mode]: if port in self.peers[peer][mode]:
del self.peers[peer][mode][self.peers[peer][mode].index(port)] del self.peers[peer][mode][self.peers[peer][mode].index(port)]
readout_still_required = False self.determine_required_readouts()
def determine_required_readouts(self):
readout_required = {SensorReadout.ANALOG : [],
SensorReadout.DIGITAL : []}
for peer in self.peers: for peer in self.peers:
if port in self.peers[peer][mode]: for mode in (SensorReadout.ANALOG, SensorReadout.DIGITAL):
readout_required = True for port in self.peers[peer][mode]:
break if not port in readout_required[mode]:
if not readout_required: readout_required[mode].append(port)
del self.readout_required[mode][self.readout_required[mode].index(port)] self.readout_required = readout_required
def unsubscribe_all(self, peer):
if peer in self.peers:
del self.peers[peer]
self.determine_required_readouts()
def __get_sensor_value(self, port, mode): def __get_sensor_value(self, port, mode):
@ -120,14 +130,22 @@ class SensorReadout:
return False return False
class Identify(Pipe):
def run(self, data, peer, handler):
Utils.play_sound(config.identify_sound)
class Sensor(Pipe): class Sensor(Pipe):
""" """
{"subscribe" : {"analog" : [1, 2, 3], "digital" : [1, 2, 3]}} {"subscribe" : {"analog" : [1, 2, 3], "digital" : [1, 2, 3]}}
{"unsubscribe" : {"analog" : [1, 2, 3], "digital" : [1, 2, 3]}} {"unsubscribe" : {"analog" : [1, 2, 3], "digital" : [1, 2, 3]}}
{"poll_rate" : 10}
""" """
def run(self, data, peer, handler): def run(self, data, peer, handler):
if type(data) is dict: if type(data) is dict:
if "poll_rate" in data:
if type(data["poll_rate"]) in (int, float) and data["poll_rate"] >= 0.1:
self.sensor_readout.poll_rate = data["poll_rate"]
for event in ("subscribe", "unsubscribe"): for event in ("subscribe", "unsubscribe"):
if event in data: if event in data:
for mode in ("analog", "digital"): for mode in ("analog", "digital"):
@ -143,6 +161,10 @@ class Sensor(Pipe):
self.sensor_readout.subscribe(port, mode, peer) self.sensor_readout.subscribe(port, mode, peer)
elif event == "unsubscribe": elif event == "unsubscribe":
self.sensor_readout.unsubscribe(port, mode, peer) self.sensor_readout.unsubscribe(port, mode, peer)
elif type(data) is str:
if data == "unsubscribe":
self.sensor_readout.unsubscribe_all(peer)
def start(self, handler): def start(self, handler):
self.sensor_readout = SensorReadout(handler) self.sensor_readout = SensorReadout(handler)
@ -236,6 +258,8 @@ config = Config.Config()
config.add(Config.Option("server_address", "ws://127.0.0.1:3077")) config.add(Config.Option("server_address", "ws://127.0.0.1:3077"))
config.add(Config.Option("debug", False, validator=lambda x: True if True or False else False)) config.add(Config.Option("debug", False, validator=lambda x: True if True or False else False))
config.add(Config.Option("output_unbuffer", "stdbuf")) config.add(Config.Option("output_unbuffer", "stdbuf"))
config.add(Config.Option("identify_sound", "Wallaby/identify.wav",
validator=lambda x: os.path.isfile(x)))
try: try:
config = config.read_from_file(CONFIG_PATH) config = config.read_from_file(CONFIG_PATH)
@ -248,7 +272,8 @@ try:
ws = Handler(config.server_address) ws = Handler(config.server_address)
# setup has to be called before the connection is established # setup has to be called before the connection is established
ws.setup({"subscribe" : Subscribe(), "hostname" : Hostname(), ws.setup({"subscribe" : Subscribe(), "hostname" : Hostname(),
"processes" : Processes(), "sensor" : Sensor()}, "processes" : Processes(), "sensor" : Sensor(),
"identify" : Identify()},
debug=config.debug) debug=config.debug)
ws.connect() ws.connect()
ws.run_forever() ws.run_forever()