aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2016-09-10 23:53:51 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2016-09-10 23:53:51 +0200
commit1599d900a498f7575b47b3dbfe8d52613cbe3f50 (patch)
tree48b840dda99c5c93daca3765486391af660b50ad
parent6b837ae98b61813ce59162992d278662bb5a9f18 (diff)
downloadglutte-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--LICENCE21
-rwxr-xr-xglutte_serial_web.py51
-rw-r--r--serialrx.py79
3 files changed, 151 insertions, 0 deletions
diff --git a/LICENCE b/LICENCE
new file mode 100644
index 0000000..0069ec0
--- /dev/null
+++ b/LICENCE
@@ -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
+