implemented osc data retrieval
This commit is contained in:
parent
fd64ce55db
commit
258fd02822
|
@ -1,238 +0,0 @@
|
||||||
import numpy as np
|
|
||||||
import string,cgi,time, random
|
|
||||||
from os import curdir, sep
|
|
||||||
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
|
|
||||||
from SocketServer import ThreadingMixIn, ForkingMixIn
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
plotValues = [448, 979, 301, 82, 664, 1016, 786, 752, 890, 862, 779, 566, 902, 167, 698,
|
|
||||||
176, 356, 764, 418, 542, 1013, 179, 184, 89, 556, 806, 514, 315, 702, 297, 166,
|
|
||||||
933, 969, 105, 444, 938, 469, 444, 413, 153, 62, 1000, 27, 195, 41, 53, 885, 541, 41, 397,
|
|
||||||
64, 164, 117, 93, 345, 374, 327, 709, 772, 443, 483, 100, 941, 1002, 179, 269, 594, 258,
|
|
||||||
188, 970, 360, 268, 924, 238, 633, 564, 644, 373, 279, 392, 646, 543, 295, 892, 70, 675, 675,
|
|
||||||
173, 112, 359, 77, 831, 323, 433, 929, 790, 208, 85, 351, 266, 631, 948, 427, 991, 388, 82, 342,
|
|
||||||
679, 492, 923, 825, 395, 357, 788, 514, 248, 153, 1002, 702, 797, 636, 200, 58, 449, 986, 979,
|
|
||||||
461, 11, 636, 70, 874, 414, 950, 853, 561, 267, 436, 267, 349, 12, 325, 38, 322, 805, 255, 790,
|
|
||||||
1000, 151, 621, 119, 4, 278, 699, 529, 777, 711, 791, 20, 516, 141, 728, 662, 916, 593, 362, 975,
|
|
||||||
276, 715, 262, 988, 949, 132, 568, 618, 802, 998, 845, 238, 376, 525, 972, 1017, 985, 162, 500, 875,
|
|
||||||
500, 944, 813, 140, 766, 750, 172, 758, 58, 140, 616, 435, 892, 811, 422, 238, 181, 638, 798,
|
|
||||||
282, 236, 462, 308, 98, 248, 539, 925, 311, 626, 411, 113, 507, 847, 220, 439, 349, 924, 1008,
|
|
||||||
567, 606, 402, 393, 504, 520, 910, 910, 291, 670, 598, 900, 599, 734, 637, 1009, 477, 749, 236,
|
|
||||||
249, 9, 553, 550, 758, 801, 230, 303, 164, 412, 139, 414, 224, 348, 927, 843, 222, 98, 759, 473,
|
|
||||||
574, 197, 988, 647, 575, 395, 715, 587, 618, 380, 599, 752, 401, 608, 875, 1002, 910, 472, 228,
|
|
||||||
510, 734, 447, 725, 196, 31, 925, 883, 912, 797, 741, 367, 177, 16, 151, 989, 81, 574, 541, 171,
|
|
||||||
355, 169, 56, 198, 45, 143, 694, 669, 366, 982, 1019, 350, 195, 761, 277, 1020, 202, 216, 55,
|
|
||||||
437, 612, 144, 370, 830, 1016, 206, 1014, 306, 786, 583, 333, 366, 213, 714, 89, 907, 800,
|
|
||||||
905, 24, 409, 163, 563, 910, 478, 328, 929, 936, 1005, 237, 705, 189, 179, 172, 958, 18, 285,
|
|
||||||
874, 223, 667, 297, 476, 953, 124, 474, 739, 289, 656, 485, 210, 680, 110, 353, 217, 347, 8,
|
|
||||||
1000, 607, 741, 440, 600, 170, 167, 173, 702, 105, 991, 120, 594, 567, 997, 588, 56, 480, 556,
|
|
||||||
601, 66, 580, 625, 221, 927, 72, 710, 910, 866, 28, 440, 769, 314, 888, 615, 554, 811,
|
|
||||||
218, 407, 763, 58, 186, 607, 212, 879, 193, 669, 371, 866, 80, 667, 730, 223, 232, 309,
|
|
||||||
205, 329, 723, 964, 747, 718, 377, 638, 856, 440, 709, 695, 57, 72, 462, 397, 569, 811,
|
|
||||||
999, 753, 174, 231, 638, 614, 389, 310, 789, 274, 799, 121, 762, 5, 524, 872, 401, 788,
|
|
||||||
795, 510, 250, 740, 890, 58, 826, 352, 703, 833, 789, 373, 243, 380, 18, 753, 752, 302,
|
|
||||||
1001, 447, 555, 666, 1023, 459, 257, 917, 29, 85, 391, 742, 575, 515, 664, 167, 336, 349,
|
|
||||||
414, 676, 573, 165, 955, 903, 67, 863, 119, 814, 374, 181, 990, 17, 343, 549, 198, 655,
|
|
||||||
230, 515, 671, 655, 412, 124, 963, 412, 168, 863, 149, 263, 163, 101, 889, 659, 342, 671,
|
|
||||||
632, 342, 210, 502, 531, 1000, 661, 76, 19, 390, 569, 958, 4, 922, 979, 381, 597, 786, 138,
|
|
||||||
110, 799, 457, 356, 648, 995, 839, 39, 241, 249, 516, 343, 166, 814, 86, 832, 125, 836, 246,
|
|
||||||
40, 131, 907, 226, 247, 423, 390, 328, 203, 329, 209, 332, 167, 765, 506, 881, 118, 68, 15,
|
|
||||||
593, 749, 971, 860, 268, 715, 577, 393, 999, 571, 446, 432, 488, 495, 253, 782, 371, 534, 489,
|
|
||||||
213, 424, 136, 324, 441, 50, 669, 258, 863, 404, 1017, 132, 177, 369, 87, 763, 723, 694, 191,
|
|
||||||
798, 98, 250, 207, 395, 586, 62, 402, 758, 9, 447, 362, 810, 57, 595, 489, 332, 559, 48, 491,
|
|
||||||
263, 593, 6, 172, 979, 422, 798, 167, 713, 1012, 552, 8, 1, 489, 91, 613, 650, 196, 100, 402,
|
|
||||||
429, 1023, 160, 613, 380, 756, 850, 981, 910, 66, 445, 759, 427, 699, 207, 519, 980, 789, 816,
|
|
||||||
740, 605, 602, 816, 493, 50, 516, 738, 435, 918, 681, 626, 117, 942, 513, 686, 826, 449, 588,
|
|
||||||
576, 116, 567, 923, 265, 646, 95, 426, 592, 67, 747, 762, 612, 286, 96, 34, 520, 1007, 817, 833,
|
|
||||||
210, 905, 783, 866, 419, 669, 760, 215, 398, 298, 889, 867, 534, 584, 117, 34, 673, 113, 718,
|
|
||||||
1009, 253, 554, 83, 183, 975, 463, 372, 163, 584, 446, 241, 545, 799, 316, 200, 382, 709, 311,
|
|
||||||
340, 439, 314, 78, 603, 972, 567, 899, 88, 929, 89, 82, 387, 951, 289, 605, 337, 940, 242, 902,
|
|
||||||
845, 494, 141, 210, 336, 636, 307, 772, 595, 500, 513, 456, 159, 823, 343, 805, 947, 12, 438,
|
|
||||||
219, 223, 248, 675, 146, 503, 489, 1012, 644, 458, 126, 989, 505, 783, 576, 879, 367,
|
|
||||||
442, 525, 124, 178, 831, 259, 613, 167, 71, 118, 131, 413, 355, 337, 437, 928, 636, 692, 282,
|
|
||||||
423, 100, 191, 713, 433, 408, 794, 867, 848, 852, 551, 790, 625, 824, 998, 269, 499, 936, 483,
|
|
||||||
687, 179, 444, 211, 999, 31, 7, 588, 232, 798, 690, 528, 288, 788, 546, 23, 594, 40, 270, 109,
|
|
||||||
231, 484, 413, 586, 23, 81, 94, 281, 458, 494, 173, 898, 1007, 465, 516, 625, 386, 505, 348,
|
|
||||||
348, 621, 956, 527, 293, 460, 169, 955, 136, 70, 2, 949, 997, 555, 327, 1006, 241, 13, 576,
|
|
||||||
860, 265, 944, 26, 732, 983, 21, 135, 574, 342, 270, 687, 799, 439, 52, 84, 706, 337, 920, 717,
|
|
||||||
764, 457, 263, 554, 651, 672, 622, 245, 739, 702, 623, 587, 332, 285, 113, 227, 659, 77, 725,
|
|
||||||
813, 989, 925, 439, 759, 622, 545, 779, 250, 862, 511, 288, 559, 592, 819, 903, 815, 671, 226,
|
|
||||||
83, 1007, 229, 391, 597, 608, 937, 480, 911, 208, 1004, 727, 654, 293, 107, 866, 418, 169, 333,
|
|
||||||
462, 313, 164, 293, 22, 577, 812, 113, 926, 121, 709, 599, 434, 751, 75, 229, 399, 854, 17,
|
|
||||||
686, 287, 212, 441, 156, 321, 888, 120, 380, 188, 696, 671, 577, 863, 1013, 294, 525, 872,
|
|
||||||
879, 88, 30, 73, 590, 755, 647, 908, 217, 326, 804, 447, 865, 641, 730, 423, 952, 748, 867,
|
|
||||||
482, 883, 370, 723, 7, 1020, 718, 499, 671, 21, 692, 10, 150, 359, 718, 635, 14, 111, 199,
|
|
||||||
426, 735, 90, 797, 718, 546, 735, 160, 662, 57, 394, 834, 218, 641, 104, 542, 905, 980, 476,
|
|
||||||
407, 436, 549, 298, 219, 10, 816, 208, 385, 504, 420, 427, 90, 328, 75, 485, 63, 389, 693, 75,
|
|
||||||
127, 314, 318, 440, 585, 481, 91, 508, 670, 518, 890, 401, 535, 111, 725, 397, 707, 974,
|
|
||||||
702, 323, 379, 147, 125, 248, 142, 277, 97, 370, 792, 488, 427, 324, 514, 46, 729, 41, 165,
|
|
||||||
174, 505, 234, 744, 637, 423, 76, 558, 219, 964, 505, 663, 896, 245, 188, 347, 750, 121,
|
|
||||||
262, 809, 905, 197, 452, 18, 901, 122, 30, 836, 908, 510, 665, 995, 774, 981, 928, 962,
|
|
||||||
766, 459, 204, 581, 597, 739, 741, 14, 25, 169, 139, 157, 283, 299, 54, 286, 241, 184,
|
|
||||||
320, 371, 962, 288, 261, 807, 263, 241, 969, 186, 835, 666, 97, 950, 90, 794, 111, 479,
|
|
||||||
118, 271, 109, 247, 921, 623, 139, 450, 99, 171, 906, 604, 255, 516, 676, 888, 378, 912,
|
|
||||||
462, 684, 974, 1002, 636, 368, 114, 237, 524, 632, 142, 963, 900, 360, 16, 987, 901,
|
|
||||||
684, 763, 257, 528, 615, 742, 507, 230, 814, 135, 872, 253, 737, 408, 909, 491, 110,
|
|
||||||
45, 419, 847, 788, 503, 250, 954, 271, 585, 131, 847, 880, 2, 979, 437, 513, 318,
|
|
||||||
365, 627, 993, 558, 757, 381, 796, 119, 657, 148, 964, 495, 177, 532, 39, 69, 391, 852, 597,
|
|
||||||
849, 283, 98, 777, 902, 749, 396, 209, 531, 142, 836, 147, 697, 189, 511, 65, 352, 867, 687,
|
|
||||||
192, 780, 165, 413, 199, 722, 872, 326, 685, 83, 148, 353, 863, 724, 805, 549, 583, 820, 765,
|
|
||||||
450, 224, 340, 852, 598, 128, 1014, 787, 943, 761, 790, 313, 822, 744, 18, 979, 807, 558, 964,
|
|
||||||
679, 549, 714, 971, 767, 325, 396, 167, 70, 857, 254, 484, 640, 364, 215, 227, 244, 207, 592,
|
|
||||||
651, 675, 307, 300, 283, 959, 286, 177, 161, 816, 790, 610, 934, 916, 998, 113, 62, 711, 663,
|
|
||||||
71, 986, 777, 80, 56, 716, 369, 256, 524, 807, 576, 651, 292, 728, 456, 808, 1015, 26, 787,
|
|
||||||
117, 661, 5, 298, 974, 708, 589, 113, 549, 563, 383, 1023, 531, 989, 636, 471, 820, 678, 511,
|
|
||||||
525, 205, 255, 202, 134, 175, 799, 269, 110, 846, 27, 682, 447, 693, 122, 552, 270, 394,
|
|
||||||
284, 606, 472, 302, 975, 796, 157, 322, 845, 955, 576, 600, 390, 82, 41, 754, 641, 87, 650,
|
|
||||||
441, 999, 806, 349, 310, 364, 408, 30, 720, 396, 731, 959, 957, 204, 208, 1011, 644, 806, 552]
|
|
||||||
|
|
||||||
cameraQuality=75
|
|
||||||
class MyHandler(BaseHTTPRequestHandler):
|
|
||||||
def do_GET(self):
|
|
||||||
global cameraQuality
|
|
||||||
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)
|
|
||||||
|
|
||||||
steps = 100
|
|
||||||
count = 0
|
|
||||||
plot_data1 = deque([0] * 100)
|
|
||||||
plot_data2 = deque([0] * 100)
|
|
||||||
plot_data3 = deque([0] * 100)
|
|
||||||
plt = PlotWindow(title="EKG", name="Merle")
|
|
||||||
plt.resize(1920, 1080)
|
|
||||||
plotItem1 = pg.PlotCurveItem(pen=(0, 3*1.3))
|
|
||||||
plotItem2 = pg.PlotCurveItem(pen=(1, 3*1.3))
|
|
||||||
plotItem3 = pg.PlotCurveItem(pen=(2, 3*1.3))
|
|
||||||
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, 1023)
|
|
||||||
print type(plt)
|
|
||||||
self.wfile.write("Content-Type: multipart/x-mixed-replace; boundary=--aaboundary")
|
|
||||||
self.wfile.write("\r\n\r\n")
|
|
||||||
|
|
||||||
while 1:
|
|
||||||
plot_data1.appendleft(plotValues[count] / 3)
|
|
||||||
plot_data2.appendleft((plot_data1[0] + random.randint(-1000, 1000)) % 1023 / 3 + 1023/3)
|
|
||||||
plot_data3.appendleft((plot_data1[0] + random.randint(-1000, 1000)) % 1023 / 3 + 1023/3*2)
|
|
||||||
plot_data1.pop()
|
|
||||||
plot_data2.pop()
|
|
||||||
plot_data3.pop()
|
|
||||||
plotItem1.setData(np.array(plot_data1), clear=True)
|
|
||||||
plotItem2.setData(np.array(plot_data2), clear=True)
|
|
||||||
plotItem3.setData(np.array(plot_data3), clear=True)
|
|
||||||
exporter = pg.exporters.ImageExporter.ImageExporter(plt.plotItem)
|
|
||||||
#exporter.parameters()['width'] = 1920
|
|
||||||
name = '/tmp/tmpfs/fileName.jpg'
|
|
||||||
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")
|
|
||||||
time.sleep(0.02)
|
|
||||||
count = (count +1) % 1500
|
|
||||||
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)
|
|
||||||
def do_POST(self):
|
|
||||||
global rootnode, cameraQuality
|
|
||||||
try:
|
|
||||||
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
|
|
||||||
if ctype == 'multipart/form-data':
|
|
||||||
query=cgi.parse_multipart(self.rfile, pdict)
|
|
||||||
self.send_response(301)
|
|
||||||
|
|
||||||
self.end_headers()
|
|
||||||
upfilecontent = query.get('upfile')
|
|
||||||
print "filecontent", upfilecontent[0]
|
|
||||||
value=int(upfilecontent[0])
|
|
||||||
cameraQuality=max(2, min(99, value))
|
|
||||||
self.wfile.write("<HTML>POST OK. Camera Set to<BR><BR>");
|
|
||||||
self.wfile.write(str(cameraQuality));
|
|
||||||
|
|
||||||
except :
|
|
||||||
pass
|
|
||||||
|
|
||||||
#class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
|
|
||||||
class ThreadedHTTPServer(HTTPServer, ForkingMixIn):
|
|
||||||
"""Handle requests in a separate thread."""
|
|
||||||
|
|
||||||
def main():
|
|
||||||
try:
|
|
||||||
server = ThreadedHTTPServer(('0.0.0.0', 8080), MyHandler)
|
|
||||||
print 'started httpserver...'
|
|
||||||
server.serve_forever()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print '^C received, shutting down server'
|
|
||||||
server.socket.close()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
|
@ -1,151 +1,169 @@
|
||||||
#!/usr/bin/python
|
import numpy as np
|
||||||
# -*- coding: utf-8 -*-
|
import string,cgi,time, random, socket
|
||||||
|
from os import curdir, sep
|
||||||
|
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
|
||||||
from __future__ import absolute_import
|
from SocketServer import ThreadingMixIn, ForkingMixIn
|
||||||
|
|
||||||
|
|
||||||
import pyqtgraph as pg
|
|
||||||
import select
|
import select
|
||||||
import socket
|
import re
|
||||||
import cStringIO
|
|
||||||
import subprocess
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
from PyQt4.QtCore import QBuffer, QByteArray, QIODevice
|
|
||||||
|
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
|
from PyQt4.QtCore import QBuffer, QByteArray, QIODevice
|
||||||
|
from PyQt4 import QtGui
|
||||||
|
import pyqtgraph as pg
|
||||||
|
|
||||||
"""This module implements the standalone filtering tool in the chaosc framework.
|
from pyqtgraph.widgets.PlotWidget import PlotWidget
|
||||||
|
|
||||||
It uses the chaosc osc_lib but does not depend on chaosc features, so it can
|
|
||||||
be used with other osc compatible gear.
|
|
||||||
|
|
||||||
We provide here osc message filtering based on python regex defined in a file
|
|
||||||
and a very flexible transcoding toolchain, but it's up to your python skills
|
|
||||||
to master them. The TranscoderBaseHandler subclasses should be defined in the
|
|
||||||
appropriate python module you place in the config directory. Please refer for
|
|
||||||
a howto/examples to our comprehensive docs or look into the provided example
|
|
||||||
transcoding.py file.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# This file is part of chaosc
|
|
||||||
#
|
|
||||||
# chaosc is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# chaosc is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with chaosc. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2012-2014 Stefan Kögl
|
|
||||||
|
|
||||||
|
|
||||||
import atexit
|
try:
|
||||||
import sys, argparse
|
from chaosc.c_osc_lib import decode_osc
|
||||||
|
except ImportError as e:
|
||||||
|
print(e)
|
||||||
|
from chaosc.osc_lib import decode_osc
|
||||||
|
|
||||||
from datetime import datetime
|
QAPP = None
|
||||||
from chaosc.simpleOSCServer import SimpleOSCServer
|
|
||||||
import chaosc._version
|
def mkQApp():
|
||||||
|
if QtGui.QApplication.instance() is None:
|
||||||
|
global QAPP
|
||||||
|
QAPP = QtGui.QApplication([])
|
||||||
|
|
||||||
|
|
||||||
class ChaoscLogger(SimpleOSCServer):
|
class PlotWindow(PlotWidget):
|
||||||
"""OSC filtering/transcoding middleware
|
def __init__(self, title=None, **kargs):
|
||||||
"""
|
mkQApp()
|
||||||
|
self.win = QtGui.QMainWindow()
|
||||||
def __init__(self, args):
|
PlotWidget.__init__(self, **kargs)
|
||||||
"""ctor for filter server
|
self.win.setCentralWidget(self)
|
||||||
|
for m in ['resize']:
|
||||||
starts the server, loads scene filters and transcoders and chooses
|
setattr(self, m, getattr(self.win, m))
|
||||||
the request handler, which is one of
|
if title is not None:
|
||||||
forward only, forward and dump, dump only.
|
self.win.setWindowTitle(title)
|
||||||
|
|
||||||
:param result: return value of argparse.parse_args
|
|
||||||
:type result: namespace object
|
|
||||||
"""
|
|
||||||
|
|
||||||
d = datetime.now().strftime("%x %X")
|
|
||||||
print "%s: starting up chaosc_dump-%s..." % (d, chaosc._version.__version__)
|
|
||||||
SimpleOSCServer.__init__(self, (args.own_host, args.own_port))
|
|
||||||
self.args = args
|
|
||||||
self.chaosc_address = (args.chaosc_host, args.chaosc_port)
|
|
||||||
|
|
||||||
if args.subscribe:
|
|
||||||
self.subscribe_me(self.chaosc_address, (args.own_host, args.own_port),
|
|
||||||
args.token, args.subscriber_label)
|
|
||||||
|
|
||||||
self.plot_data = deque([0] * 100)
|
|
||||||
self.plt = pg.plot()
|
|
||||||
|
|
||||||
|
|
||||||
def dispatchMessage(self, osc_address, typetags, args, packet,
|
class MyHandler(BaseHTTPRequestHandler):
|
||||||
client_address):
|
def do_GET(self):
|
||||||
"""Handles this filtering, transcoding steps and forwards the result
|
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)
|
||||||
|
|
||||||
:param osc_address: the OSC address string.
|
plot_data1 = deque([0] * 100)
|
||||||
:type osc_address: str
|
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)
|
||||||
|
|
||||||
:param typetags: the typetags of args
|
plt.setLabel('left', "EKG")
|
||||||
:type typetags: list
|
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
|
||||||
|
|
||||||
:param args: the osc message args
|
while 1:
|
||||||
:type args: list
|
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()
|
||||||
|
|
||||||
:param packet: the binary representation of a osc message
|
plotItem1.setData(y=np.array(plot_data1), clear=True)
|
||||||
:type packet: str
|
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)
|
||||||
|
|
||||||
:param client_address: (host, port) of the requesting client
|
exporter = pg.exporters.ImageExporter.ImageExporter(plt.plotItem)
|
||||||
:type client_address: tuple
|
exporter.parameters()['width'] = 1280
|
||||||
"""
|
#exporter.parameters()['height'] = 720
|
||||||
|
name = 'tmpfile'
|
||||||
|
img = exporter.export(name, True)
|
||||||
if osc_address == "/uwe/ekg":
|
buffer = QBuffer()
|
||||||
self.plot_data.appendleft(args[0])
|
buffer.open(QIODevice.ReadWrite)
|
||||||
self.plot_data.pop()
|
img.save(buffer, "JPG", 100)
|
||||||
self.plt.plot(self.plot_data, clear=True)
|
JpegData = buffer.data()
|
||||||
exporter = pg.exporters.ImageExporter.ImageExporter(self.plt.plotItem)
|
self.wfile.write("--aaboundary\r\n")
|
||||||
exporter.parameters()['width'] = 1024
|
self.wfile.write("Content-Type: image/jpeg\r\n")
|
||||||
name = '/tmp/plotImage.jpg'
|
self.wfile.write("Content-length: %d\r\n\r\n" % len(JpegData))
|
||||||
exporter.export(name)
|
self.wfile.write(JpegData)
|
||||||
|
self.wfile.write("\r\n\r\n\r\n")
|
||||||
|
now = time.time()
|
||||||
|
dur = now - last
|
||||||
def unsubscribe(self):
|
print dur
|
||||||
self.unsubscribe_me(self.chaosc_address, (self.args.own_host, self.args.own_port),
|
wait = 0.04 - dur
|
||||||
self.args.token)
|
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():
|
def main():
|
||||||
parser = argparse.ArgumentParser(prog='ekgplotter')
|
try:
|
||||||
main_args_group = parser.add_argument_group('main flags', 'flags for chaosc_transcoder')
|
server = ThreadedHTTPServer(('0.0.0.0', 9000), MyHandler)
|
||||||
chaosc_args_group = parser.add_argument_group('chaosc', 'flags relevant for interacting with chaosc')
|
print 'started httpserver...'
|
||||||
|
|
||||||
main_args_group.add_argument('-o', "--own_host", required=True,
|
|
||||||
type=str, help='my host')
|
|
||||||
main_args_group.add_argument('-p', "--own_port", required=True,
|
|
||||||
type=int, help='my port')
|
|
||||||
|
|
||||||
chaosc_args_group.add_argument('-s', '--subscribe', action="store_true",
|
|
||||||
help='if True, this transcoder subscribes itself to chaosc. If you use this, you need to provide more flags in this group')
|
|
||||||
chaosc_args_group.add_argument('-S', '--subscriber_label', type=str, default="chaosc_transcoder",
|
|
||||||
help='the string to use for subscription label, default="chaosc_transcoder"')
|
|
||||||
chaosc_args_group.add_argument('-t', '--token', type=str, default="sekret",
|
|
||||||
help='token to authorize subscription command, default="sekret"')
|
|
||||||
chaosc_args_group.add_argument("-H", '--chaosc_host',
|
|
||||||
type=str, help='host of chaosc instance')
|
|
||||||
chaosc_args_group.add_argument("-P", '--chaosc_port',
|
|
||||||
type=int, help='port of chaosc instance')
|
|
||||||
|
|
||||||
server = ChaoscLogger(parser.parse_args(sys.argv[1:]))
|
|
||||||
|
|
||||||
atexit.register(server.unsubscribe)
|
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print '^C received, shutting down server'
|
||||||
|
server.socket.close()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
Loading…
Reference in New Issue