psychose/ekgplotter/ekgplotter/main.py

170 lines
6.4 KiB
Python
Raw Normal View History

2014-03-13 03:22:06 +00:00
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
2014-03-11 17:35:45 +00:00
import select
2014-03-13 03:22:06 +00:00
import re
2014-03-11 17:35:45 +00:00
from collections import deque
2014-03-13 03:22:06 +00:00
from PyQt4.QtCore import QBuffer, QByteArray, QIODevice
from PyQt4 import QtGui
import pyqtgraph as pg
2014-03-11 17:35:45 +00:00
2014-03-13 03:22:06 +00:00
from pyqtgraph.widgets.PlotWidget import PlotWidget
try:
from chaosc.c_osc_lib import decode_osc
except ImportError as e:
print(e)
from chaosc.osc_lib import decode_osc
QAPP = None
def mkQApp():
if QtGui.QApplication.instance() is None:
global QAPP
QAPP = QtGui.QApplication([])
class PlotWindow(PlotWidget):
def __init__(self, title=None, **kargs):
mkQApp()
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 MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
print "get"
global plotValues
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()
return
if self.path.endswith(".mjpeg"):
self.send_response(200)
plot_data1 = deque([0] * 100)
plot_data2 = deque([254/3] * 100)
plot_data3 = deque([254/3*2] * 100)
plt = PlotWindow(title="EKG", name="Merle")
plt.addLegend()
#plt = pg.plot(pen=(0, 3*1.3))
plt.resize(1280, 720)
plotItem1 = pg.PlotCurveItem(pen=(0, 3*1.3), name="bjoern")
plotItem2 = pg.PlotCurveItem(pen=(1, 3*1.3), name="merle")
plotItem3 = pg.PlotCurveItem(pen=(2, 3*1.3), name="uwe")
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', "EKG")
plt.setLabel('bottom', "Time")
plt.showGrid(True, True)
ba = plt.getAxis("bottom")
bl = plt.getAxis("left")
ba.setTicks([])
bl.setTicks([])
plt.setYRange(0, 254)
print type(plt)
self.wfile.write("Content-Type: multipart/x-mixed-replace; boundary=--aaboundary")
self.wfile.write("\r\n\r\n")
osc_sock = socket.socket(2, 2, 17)
osc_sock.bind(("", 10000))
osc_sock.setblocking(0)
last = time.time()
now = last
while 1:
for i in xrange(3):
reads, writes, errs = select.select([osc_sock], [], [], 0.01)
#print reads, writes, errs
if reads:
osc_input = reads[0].recv(4096)
osc_address, typetags, args = decode_osc(osc_input, 0, len(osc_input))
#print "osc", osc_address, typetags, args
if osc_address.startswith("/bjoern"):
plot_data1.appendleft(args[0] / 3)
plot_data1.pop()
elif osc_address.startswith("/merle"):
plot_data2.appendleft(args[0] / 3 + 254/3)
plot_data2.pop()
elif osc_address.startswith("/uwe"):
plot_data3.appendleft(args[0] / 3 + 254/3*2)
plot_data3.pop()
plotItem1.setData(y=np.array(plot_data1), clear=True)
plotItem2.setData(y=np.array(plot_data2), clear=True)
plotItem3.setData(y=np.array(plot_data3), clear=True)
#item = plt.plot(plot_data1, pen=(0, 3*1.3), clear=True)
exporter = pg.exporters.ImageExporter.ImageExporter(plt.plotItem)
exporter.parameters()['width'] = 1280
#exporter.parameters()['height'] = 720
name = 'tmpfile'
img = exporter.export(name, True)
buffer = QBuffer()
buffer.open(QIODevice.ReadWrite)
img.save(buffer, "JPG", 100)
JpegData = buffer.data()
self.wfile.write("--aaboundary\r\n")
self.wfile.write("Content-Type: image/jpeg\r\n")
self.wfile.write("Content-length: %d\r\n\r\n" % len(JpegData))
self.wfile.write(JpegData)
self.wfile.write("\r\n\r\n\r\n")
now = time.time()
dur = now - last
print dur
wait = 0.04 - dur
if wait > 0:
time.sleep(wait)
last = now
return
if 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
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
#class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
class ThreadedHTTPServer(HTTPServer, ForkingMixIn):
"""Handle requests in a separate thread."""
2014-03-11 17:35:45 +00:00
def main():
2014-03-13 03:22:06 +00:00
try:
server = ThreadedHTTPServer(('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__':
main()