From a907c9ad63b44d424e165d880dfafe3fb228fbad Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Sun, 29 Apr 2018 16:14:43 +0200 Subject: [PATCH] Refactored serial, the entry point for querying serial devices should be the serial plugin, the backend should only be a client. Also, if the serial output is a JSON, parse it --- platypush/backend/serial/__init__.py | 34 ++++++++-------------------- platypush/plugins/serial/__init__.py | 21 +++++++++++++---- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/platypush/backend/serial/__init__.py b/platypush/backend/serial/__init__.py index 3164ad4f5..35d904954 100644 --- a/platypush/backend/serial/__init__.py +++ b/platypush/backend/serial/__init__.py @@ -1,30 +1,21 @@ import logging import serial -import tempfile -import time from platypush.backend import Backend +from platypush.context import get_plugin from platypush.message.event.serial import SerialDataEvent class SerialBackend(Backend): - def __init__(self, device, baud_rate=9600, **kwargs): + def __init__(self, **kwargs): super().__init__(**kwargs) - - self.device = device - self.baud_rate = baud_rate - self.serial = None self.data = None - self.tmp_file = tempfile.TemporaryFile() def send_message(self, msg): pass def get_data(self): - self.tmp_file.seek(0) - data = self.tmp_file.read() - self.tmp_file.seek(0) - - return data.decode('utf-8') + plugin = get_plugin('serial') + return plugin.get_data() def run(self): super().run() @@ -32,19 +23,12 @@ class SerialBackend(Backend): self.serial = serial.Serial(self.device, self.baud_rate) logging.info('Initialized serial backend on device {}'.format(self.device)) - try: - while not self.should_stop(): - new_data = self.serial.readline().decode('utf-8').strip() - if self.data is None or self.data != new_data: - self.bus.post(SerialDataEvent(data=new_data, device=self.device)) + while not self.should_stop(): + new_data = self.get_data() + if self.data is None or self.data != new_data: + self.bus.post(SerialDataEvent(data=new_data, device=self.device)) - self.data = new_data - - self.tmp_file.seek(0) - self.tmp_file.write(self.data.encode('utf-8')) - self.tmp_file.seek(0) - finally: - self.tmp_file.close() + self.data = new_data # vim:sw=4:ts=4:et: diff --git a/platypush/plugins/serial/__init__.py b/platypush/plugins/serial/__init__.py index 2e352b2d2..04a365729 100644 --- a/platypush/plugins/serial/__init__.py +++ b/platypush/plugins/serial/__init__.py @@ -1,15 +1,28 @@ -from platypush.context import get_backend +import json + from platypush.message.response import Response from .. import Plugin + class SerialPlugin(Plugin): - def __init__(self, *args, **kwargs): + def __init__(self, device, baud_rate=9600, *args, **kwargs): super().__init__(*args, **kwargs) + self.device = device + self.baud_rate = baud_rate + + def get_data(self): - backend = get_backend('serial') - return Response(output=backend.get_data()) + serial = serial.Serial(self.device, self.baud_rate) + + try: data = serial.readline().decode('utf-8').strip() + finally: serial.close() + + try: data = json.loads(data) + except: pass + + return Response(data) # vim:sw=4:ts=4:et: