From a907c9ad63b44d424e165d880dfafe3fb228fbad Mon Sep 17 00:00:00 2001
From: Fabio Manganiello <blacklight86@gmail.com>
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: