diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 23:53:51 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 23:53:51 +0200 |
commit | 1599d900a498f7575b47b3dbfe8d52613cbe3f50 (patch) | |
tree | 48b840dda99c5c93daca3765486391af660b50ad | |
parent | 6b837ae98b61813ce59162992d278662bb5a9f18 (diff) | |
download | glutte-serial-web-1599d900a498f7575b47b3dbfe8d52613cbe3f50.tar.gz glutte-serial-web-1599d900a498f7575b47b3dbfe8d52613cbe3f50.tar.bz2 glutte-serial-web-1599d900a498f7575b47b3dbfe8d52613cbe3f50.zip |
Add first version with simple data streaming
-rw-r--r-- | LICENCE | 21 | ||||
-rwxr-xr-x | glutte_serial_web.py | 51 | ||||
-rw-r--r-- | serialrx.py | 79 |
3 files changed, 151 insertions, 0 deletions
@@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Matthias P. Braendli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/glutte_serial_web.py b/glutte_serial_web.py new file mode 100755 index 0000000..2154599 --- /dev/null +++ b/glutte_serial_web.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# +# The MIT License (MIT) +# +# Copyright (c) 2016 Matthias P. Braendli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from time import sleep +from flask import Flask, render_template +import serialrx + +app = Flask(__name__) + +ser = serialrx.SerialRX() + +@app.route('/') +def index(): + def generate(): + while True: + line = ser.get_line() + if line is not None: + yield line + sleep(0.1) + + return app.response_class(generate(), mimetype='text/plain') + + +try: + ser.start() + app.run() +except KeyboardInterrupt: + print("Ctrl-C received, quitting") +finally: + ser.stop() diff --git a/serialrx.py b/serialrx.py new file mode 100644 index 0000000..f4510da --- /dev/null +++ b/serialrx.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# +# The MIT License (MIT) +# +# Copyright (c) 2016 Matthias P. Braendli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from time import sleep +import serial +import threading +import collections + +SERIALPORT="/dev/ttyACM0" +BAUDRATE=9600 +LINES_TO_KEEP=2000 + +class SerialRX(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + + print("Open Serial on {} at {}".format(SERIALPORT, BAUDRATE)) + self.ser = serial.Serial(SERIALPORT, baudrate=BAUDRATE) + + self.event_stop = threading.Event() + + self.data_lock = threading.Lock() + self.data_queue = collections.deque() + + self.line_accumulator = [] + + print("Serial port ready") + + def run(self): + print("Serial port starting reception") + while not self.event_stop.is_set(): + databyte = self.ser.read() + self.line_accumulator.append(databyte) + + if databyte == "\n": + self.data_lock.acquire() + try: + self.data_queue.append("".join(self.line_accumulator)) + + if len(self.data_queue) > LINES_TO_KEEP: + self.data_queue.popleft() + except: + raise + finally: + self.data_lock.release() + self.line_accumulator = [] + + + def stop(self): + self.event_stop.set() + self.join() + + def get_line(self): + try: + return self.data_queue.popleft() + except IndexError: + return None + |