Exposing serial data functionally through a plugin

This commit is contained in:
Fabio Manganiello 2018-04-08 18:16:24 +02:00
parent 8ae22726ed
commit 2bf4ff136b
2 changed files with 37 additions and 11 deletions
platypush
backend/serial
plugins/serial

View file

@ -1,40 +1,50 @@
import logging
import serial
import tempfile
import time
from platypush.backend import Backend
from platypush.message.event.serial import SerialDataEvent
class SerialBackend(Backend):
state = None
def __init__(self, device, baud_rate=9600, **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_state(self):
return self.state
def get_data(self):
self.tmp_file.seek(0)
data = self.tmp_file.read()
self.tmp_file.seek(0)
return data.decode('utf-8')
def run(self):
super().run()
self.serial = serial.Serial(self.device, self.baud_rate)
prev_value = None
logging.info('Initialized serial backend on device {}'.format(self.device))
while not self.should_stop():
value = self.serial.readline().decode('utf-8').strip()
if prev_value is None or value != prev_value:
self.bus.post(SerialDataEvent(data=value, device=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))
prev_value = value
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()
# vim:sw=4:ts=4:et:

View file

@ -0,0 +1,16 @@
from platypush.context import get_backend
from platypush.message.response import Response
from .. import Plugin
class SerialPlugin(Plugin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def get_data(self):
backend = get_backend('serial')
return Response(output=backend.get_data())
# vim:sw=4:ts=4:et: