diff --git a/raspberry-dataserver/CommsCommon.py b/raspberry-dataserver/CommsCommon.py index f6d7941b920e1e47cc322973a9c23207775a75ad..cce2d2e66b1493fcdfe73170c276d6c14f4b1b23 100644 --- a/raspberry-dataserver/CommsCommon.py +++ b/raspberry-dataserver/CommsCommon.py @@ -176,7 +176,7 @@ class PayloadFormat(): return len(self.byteArray) def getType(self) -> Any: - return self.payload_type.name if isinstance(self.payload_type, IntEnum) else PAYLOAD_TYPE(self.payload_type) + return self.payload_type if isinstance(self.payload_type, IntEnum) else PAYLOAD_TYPE(self.payload_type) def getDict(self) -> Dict: return {k: v.name if isinstance(v, IntEnum) or isinstance(v, Enum) else v for k, v in asdict(self).items()} diff --git a/raspberry-dataserver/hevserver.py b/raspberry-dataserver/hevserver.py index a42de48bb525cea1fd554416c6b98153b51b6b53..2b11455026fe3a054e64de92053f0b603563ca88 100755 --- a/raspberry-dataserver/hevserver.py +++ b/raspberry-dataserver/hevserver.py @@ -12,7 +12,7 @@ import argparse import svpi import hevfromtxt from hevtestdata import HEVTestData -import CommsControl +from CommsLLI import CommsLLI from CommsCommon import PAYLOAD_TYPE, CMD_TYPE, CMD_GENERAL, CMD_SET_TIMEOUT, VENTILATION_MODE, ALARM_CODES, CMD_MAP, CommandFormat, AlarmFormat from collections import deque from serial.tools import list_ports @@ -37,13 +37,10 @@ class HEVServer(object): self._datavalid = None # something has been received from arduino. placeholder for asyncio.Event() self._dvlock = threading.Lock() # make datavalid threadsafe self._dvlock.acquire() # come up locked to wait for loop - # start worker thread to send values in background - worker = threading.Thread(target=self.serve_all, daemon=True) - worker.start() def polling(self, payload): # get values when we get a callback from commsControl (lli) - logging.debug(f"Payload received: {payload!r}") + logging.debug(f"Payload received: {payload}") # check if it is data or alarm payload_type = payload.getType() if payload_type == PAYLOAD_TYPE.ALARM: @@ -71,9 +68,6 @@ class HEVServer(object): # invalid packet, don't throw exception just log and pop logging.error("Received invalid packet, ignoring") - # pop from lli queue - self._lli.pop_payloadrecv() - async def handle_request(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: # listen for queries on the request socket data = await reader.readuntil(separator=b'\0') @@ -158,6 +152,7 @@ class HEVServer(object): values: List[float] = self._values alarms = self._alarms if len(self._alarms) > 0 else None + print(values.getType()) data_type = values.getType().name broadcast_packet = {"type": data_type} @@ -209,7 +204,7 @@ class HEVServer(object): async with server: await server.serve_forever() - async def create_sockets(self) -> None: + async def main(self) -> None: self._datavalid = threading.Event() # initially false self._dvlock.release() LOCALHOST = "127.0.0.1" @@ -220,11 +215,9 @@ class HEVServer(object): #tasks = [b1, r1] await asyncio.gather(*tasks, return_exceptions=True) - def serve_all(self) -> None: - asyncio.run(self.create_sockets()) - if __name__ == "__main__": + tasks = [] # asyncio tasks try: #parser to allow us to pass arguments to hevserver parser = argparse.ArgumentParser(description='Arguments to run hevserver') @@ -260,22 +253,30 @@ if __name__ == "__main__": # initialise low level interface try: - lli = CommsControl.CommsControl(port=port_device) + # setup serial device and init server + loop = asyncio.get_event_loop() + lli = CommsLLI(loop) + comms = lli.main(port_device, 115200) + tasks.append(comms) logging.info(f"Serving data from device {port_device}") except NameError: logging.error("Arduino not connected") exit(1) + # create tasks hevsrv = HEVServer(lli) - - # serve forever - loop = asyncio.get_event_loop() - try: - loop.run_forever() - finally: - loop.close() + server = hevsrv.main() + tasks.append(server) + + # run tasks + asyncio.gather(*tasks, return_exceptions=True) + loop.run_forever() + except asyncio.CancelledError: + pass except KeyboardInterrupt: logging.info("Server stopped") except StructError: logging.error("Failed to parse packet") + finally: + loop.close()