diff --git a/buttonreader.py b/buttonreader.py index 564675b..a7aeb3f 100644 --- a/buttonreader.py +++ b/buttonreader.py @@ -5,6 +5,7 @@ from __future__ import print_function import os import serial +import socket from PySide import QtCore _inputs = {} @@ -139,5 +140,51 @@ class FifoInput(BaseInput): _add_input("Fifo", FifoInput) +class UnixInput(BaseInput): + def __init__(self, app, socketPath, debug=False): + super(UnixInput, self).__init__(app) + self._path = socketPath + self._debug = debug + self._currConn = None + try: + os.unlink(self._path) + except OSError as e: + if os.path.exists(self._path): + raise InputException("Could not create domain socket '%s': %s" % (self._path, e)) + + self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.bind(self._path) + print(" >> Unix domain socket initialized, using '%s'" % self._path) + + def run(self): + self.sock.listen(1) + while True: + self._currConn, cli = self.sock.accept() + try: + while True: + c = self._currConn.recv(1) + if c == '': + break + if len(c) == 1 and ord(c) > ord('0') and ord(c) <= ord('9'): + self._sendButtonEvent(c) + finally: + self._currConn.close() + self._currConn = None + + @QtCore.Slot(bool) + def buzzersOpen(self, isOpen): + if self._currConn: + if isOpen: + self._currConn.send("O") + else: + self._currConn.send("C") + + @QtCore.Slot(int) + def playerGotQuestion(self, playerNo): + if self._currConn: + self._currConn.send("T%d" % playerNo) + +_add_input("Unix", UnixInput) + class InputException(Exception): pass