From 838869c0b1ce88f9a680e5224f203434d3b25d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20K=C3=B6gl?= Date: Sat, 15 Mar 2014 02:49:35 +0100 Subject: [PATCH] recent version of ekgplotter --- ekgplotter/ekgplotter/recent.py | 261 ++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 ekgplotter/ekgplotter/recent.py diff --git a/ekgplotter/ekgplotter/recent.py b/ekgplotter/ekgplotter/recent.py new file mode 100644 index 0000000..75319c8 --- /dev/null +++ b/ekgplotter/ekgplotter/recent.py @@ -0,0 +1,261 @@ +import threading +import Queue +import numpy as np +import string,cgi,time, random, socket +from os import curdir, sep +from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer +from SocketServer import ThreadingMixIn, ForkingMixIn +import select +import re + +from collections import deque + +from PyQt4.QtCore import QBuffer, QByteArray, QIODevice +from PyQt4 import QtGui +import pyqtgraph as pg + +from pyqtgraph.widgets.PlotWidget import PlotWidget + +QtGui.QApplication.setGraphicsSystem('raster') + + +try: + from chaosc.c_osc_lib import decode_osc +except ImportError as e: + print(e) + from chaosc.osc_lib import decode_osc + +QAPP = QtGui.QApplication([]) + + +class PlotWindow(PlotWidget): + def __init__(self, title=None, **kargs): + self.win = QtGui.QMainWindow() + PlotWidget.__init__(self, **kargs) + self.win.setCentralWidget(self) + for m in ['resize']: + setattr(self, m, getattr(self.win, m)) + if title is not None: + self.win.setWindowTitle(title) + + +class OSCThread(threading.Thread): + def __init__(self): + super(OSCThread, self).__init__() + self.running = True + def run(self): + osc_sock = socket.socket(2, 2, 17) + osc_sock.bind(("", 10000)) + osc_sock.setblocking(0) + while self.running: + reads, writes, errs = select.select([osc_sock], [], [], 0.05) + if reads: + osc_input = reads[0].recv(4096) + osc_address, typetags, messages = decode_osc(osc_input, 0, len(osc_input)) + if osc_address.find("ekg") > -1 or osc_address.find("plot") != -1: + queue.put_nowait((osc_address, messages)) + else: + queue.put_nowait(("/bjoern/ekg", [0])) + queue.put_nowait(("/merle/ekg", [0])) + queue.put_nowait(("/uwe/ekg", [0])) + print "OSCThread is going down" + +queue = Queue.Queue() + +class MyHandler(BaseHTTPRequestHandler): + + def do_GET(self): + + self.thread = thread = OSCThread() + thread.daemon = True + thread.start() + + actors = list() + is_item1 = True + is_item2 = True + is_item3 = True + + def setPositions(): + for ix, item in enumerate(actors): + item.setPos(0, ix*6) + + + def scale_data(data, ix, max_items): + scale = 254 / max_items * ix + return [value / max_items + scale for value in data] + + + try: + + self.path=re.sub('[^.a-zA-Z0-9]', "",str(self.path)) + if self.path=="" or self.path==None or self.path[:1]==".": + return + + if self.path.endswith(".html"): + f = open(curdir + sep + self.path) + self.send_response(200) + self.send_header('Content-type', 'text/html') + self.end_headers() + self.wfile.write(f.read()) + f.close() + elif self.path.endswith(".mjpeg"): + data_points = 1000 + + self.send_response(200) + plot_data1 = data = deque([0] * data_points) + plot_data2 = data = deque([0] * data_points) + plot_data3 = data = deque([0] * data_points) + plt = PlotWidget(title="

EKG

", name="Merle") + plt.hide() + plotItem1 = pg.PlotCurveItem(pen=pg.mkPen('r', width=2), name="bjoern") + plotItem2 = pg.PlotCurveItem(pen=pg.mkPen('g', width=2), name="merle") + plotItem3 = pg.PlotCurveItem(pen=pg.mkPen('b', width=2), name="uwe") + print type(plotItem1) + pen = pg.mkPen(254, 254, 254) + plotItem1.setShadowPen(pen=pen, width=6, cosmetic=True) + plotItem2.setShadowPen(pen=pen, width=6, cosmetic=True) + plotItem3.setShadowPen(pen=pen, width=6, cosmetic=True) + actors.append(plotItem1) + actors.append(plotItem2) + actors.append(plotItem3) + plotItem1.setPos(0, 0*6) + plotItem2.setPos(0, 1*6) + plotItem3.setPos(0, 2*6) + plt.addItem(plotItem1) + plt.addItem(plotItem2) + plt.addItem(plotItem3) + + plt.setLabel('left', "

Amplitude

") + plt.setLabel('bottom', "

Time

") + plt.showGrid(True, True) + ba = plt.getAxis("bottom") + bl = plt.getAxis("left") + ba.setTicks([]) + bl.setTicks([]) + plt.setYRange(0, 254) + + self.wfile.write("Content-Type: multipart/x-mixed-replace; boundary=--aaboundary") + self.wfile.write("\r\n\r\n") + + + plt.resize(1280, 720) + + while 1: + while 1: + try: + osc_address, args = queue.get_nowait() + except Queue.Empty: + break + + value = args[0] + if osc_address == "/bjoern/ekg": + plot_data1.append(value) + plot_data1.popleft() + try: + plotItem1.setData(y=np.array(scale_data(plot_data1, actors.index(plotItem1), len(actors))), clear=True) + except ValueError: + pass + elif osc_address == "/merle/ekg": + plot_data2.append(value) + plot_data2.popleft() + try: + plotItem2.setData(y=np.array(scale_data(plot_data2, actors.index(plotItem2), len(actors))), clear=True) + except ValueError: + pass + elif osc_address == "/uwe/ekg": + plot_data3.append(value) + plot_data3.popleft() + try: + plotItem3.setData(y=np.array(scale_data(plot_data3, actors.index(plotItem3), len(actors))), clear=True) + except ValueError: + pass + elif osc_address == "/plot/uwe": + if value == 1 and is_item3 == False: + print "uwe on" + plt.addItem(plotItem3) + is_item3 = True + actors.append(plotItem3) + setPositions() + elif value == 0 and is_item3 == True: + print "uwe off" + plt.removeItem(plotItem3) + is_item3 = False + actors.remove(plotItem3) + setPositions() + elif osc_address == "/plot/merle": + if value == 1 and is_item2 == False: + print "merle on" + plt.addItem(plotItem2) + is_item2 = True + actors.append(plotItem2) + setPositions() + elif value == 0 and is_item2 == True: + print "merle off" + plt.removeItem(plotItem2) + is_item2 = False + actors.remove(plotItem2) + setPositions() + elif osc_address == "/plot/bjoern": + if value == 1 and is_item1 == False: + print "bjoern on" + plt.addItem(plotItem1) + is_item1 = True + actors.append(plotItem1) + setPositions() + elif value == 0 and is_item1 == True: + print "bjoern off" + plt.removeItem(plotItem1) + is_item1 = False + actors.remove(plotItem1) + setPositions() + + exporter = pg.exporters.ImageExporter.ImageExporter(plt.plotItem) + img = exporter.export("tmpfile", True) + buffer = QBuffer() + buffer.open(QIODevice.WriteOnly) + img.save(buffer, "JPG", 100) + JpegData = buffer.data() + del buffer + self.wfile.write("--aaboundary\r\nContent-Type: image/jpeg\r\nContent-length: %d\r\n\r\n%s\r\n\r\n\r\n" % (len(JpegData), JpegData)) + + elif self.path.endswith(".jpeg"): + f = open(curdir + sep + self.path) + self.send_response(200) + self.send_header('Content-type','image/jpeg') + self.end_headers() + self.wfile.write(f.read()) + f.close() + return + except (KeyboardInterrupt, SystemError): + thread.running = False + thread.join() + except IOError: + self.send_error(404,'File Not Found: %s' % self.path) + + def __del__(self): + self.thread.running = False + self.thread.join() + + +class JustAHTTPServer(HTTPServer): + pass + + +def main(): + try: + + server = JustAHTTPServer(('0.0.0.0', 9000), MyHandler) + print 'started httpserver...' + server.serve_forever() + except KeyboardInterrupt: + print '^C received, shutting down server' + server.socket.close() + + +if __name__ == '__main__': + #import cProfile + #import re + #cProfile.run('main()') + + main() +