diff --git a/ekgplotter/ekgplotter/initial.py b/ekgplotter/ekgplotter/initial.py
deleted file mode 100644
index c3bddea..0000000
--- a/ekgplotter/ekgplotter/initial.py
+++ /dev/null
@@ -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("POST OK. Camera Set to
");
- 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()
\ No newline at end of file
diff --git a/ekgplotter/ekgplotter/main.py b/ekgplotter/ekgplotter/main.py
index 247e02a..1cd2542 100644
--- a/ekgplotter/ekgplotter/main.py
+++ b/ekgplotter/ekgplotter/main.py
@@ -1,151 +1,169 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-
-from __future__ import absolute_import
-
-
-import pyqtgraph as pg
+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 socket
-import cStringIO
-import subprocess
-import threading
-import time
-from PyQt4.QtCore import QBuffer, QByteArray, QIODevice
+import re
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.
-
-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 .
-#
-# Copyright (C) 2012-2014 Stefan Kögl
+from pyqtgraph.widgets.PlotWidget import PlotWidget
-import atexit
-import sys, argparse
+try:
+ 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
-from chaosc.simpleOSCServer import SimpleOSCServer
-import chaosc._version
+QAPP = None
+
+def mkQApp():
+ if QtGui.QApplication.instance() is None:
+ global QAPP
+ QAPP = QtGui.QApplication([])
-class ChaoscLogger(SimpleOSCServer):
- """OSC filtering/transcoding middleware
- """
-
- def __init__(self, args):
- """ctor for filter server
-
- starts the server, loads scene filters and transcoders and chooses
- the request handler, which is one of
- forward only, forward and dump, dump only.
-
- :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()
+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)
- def dispatchMessage(self, osc_address, typetags, args, packet,
- client_address):
- """Handles this filtering, transcoding steps and forwards the result
+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)
- :param osc_address: the OSC address string.
- :type osc_address: str
+ 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)
- :param typetags: the typetags of args
- :type typetags: list
+ 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
- :param args: the osc message args
- :type args: list
+ 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()
- :param packet: the binary representation of a osc message
- :type packet: str
+ 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)
- :param client_address: (host, port) of the requesting client
- :type client_address: tuple
- """
-
-
- if osc_address == "/uwe/ekg":
- self.plot_data.appendleft(args[0])
- self.plot_data.pop()
- self.plt.plot(self.plot_data, clear=True)
- exporter = pg.exporters.ImageExporter.ImageExporter(self.plt.plotItem)
- exporter.parameters()['width'] = 1024
- name = '/tmp/plotImage.jpg'
- exporter.export(name)
-
-
-
- def unsubscribe(self):
- self.unsubscribe_me(self.chaosc_address, (self.args.own_host, self.args.own_port),
- self.args.token)
+ 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():
- parser = argparse.ArgumentParser(prog='ekgplotter')
- main_args_group = parser.add_argument_group('main flags', 'flags for chaosc_transcoder')
- chaosc_args_group = parser.add_argument_group('chaosc', 'flags relevant for interacting with chaosc')
-
- 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()
+ 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()