170 lines
6.4 KiB
Python
170 lines
6.4 KiB
Python
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
|
|
|
|
|
|
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."""
|
|
|
|
def main():
|
|
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()
|