diff --git a/ekgplotter/ekgplotter/main.py b/ekgplotter/ekgplotter/main.py index 3cee49d..c47b5a9 100644 --- a/ekgplotter/ekgplotter/main.py +++ b/ekgplotter/ekgplotter/main.py @@ -25,13 +25,15 @@ from __future__ import absolute_import -#import objgraph - from datetime import datetime import threading import Queue +import traceback import numpy as np -import string,cgi,time, random, socket +import string +import time +import random +import socket from os import curdir, sep from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from SocketServer import ThreadingMixIn, ForkingMixIn @@ -51,14 +53,13 @@ from pyqtgraph.widgets.PlotWidget import PlotWidget from chaosc.argparser_groups import * from chaosc.lib import resolve_host -#try: - #from chaosc.c_osc_lib import * -#except ImportError: -from chaosc.osc_lib import * +try: + from chaosc.c_osc_lib import * +except ImportError: + from chaosc.osc_lib import * QtGui.QApplication.setGraphicsSystem('opengl') -print "systemInfo", pg.systemInfo() try: from chaosc.c_osc_lib import decode_osc @@ -80,16 +81,18 @@ class PlotWindow(PlotWidget): self.win.setWindowTitle(title) + class OSCThread(threading.Thread): def __init__(self, args): super(OSCThread, self).__init__() self.args = args self.running = True - self.own_address = socket.getaddrinfo(args.own_host, args.own_port, socket.AF_INET6, socket.SOCK_DGRAM, 0, socket.AI_V4MAPPED | socket.AI_ALL | socket.AI_CANONNAME)[-1][4][:2] - self.chaosc_address = chaosc_host, chaosc_port = socket.getaddrinfo(args.chaosc_host, args.chaosc_port, socket.AF_INET6, socket.SOCK_DGRAM, 0, socket.AI_V4MAPPED | socket.AI_ALL | socket.AI_CANONNAME)[-1][4][:2] + self.own_address = resolve_host(args.own_host, args.own_port, args.address_family) - self.osc_sock = socket.socket(10, 2, 17) + self.chaosc_address = chaosc_host, chaosc_port = resolve_host(args.chaosc_host, args.chaosc_port, args.address_family) + + self.osc_sock = socket.socket(args.address_family, 2, 17) self.osc_sock.bind(self.own_address) self.osc_sock.setblocking(0) @@ -136,7 +139,7 @@ class OSCThread(threading.Thread): while self.running: reads, writes, errs = select.select([self.osc_sock], [], [], 0.05) if reads: - osc_input = reads[0].recv(4096) + osc_input = reads[0].recv(128) osc_address, typetags, messages = decode_osc(osc_input, 0, len(osc_input)) #print "thread osc_address", osc_address if osc_address.find("ekg") > -1 or osc_address.find("plot") != -1: @@ -231,7 +234,6 @@ class Actor(object): class EkgPlot(object): def __init__(self, actor_names, num_data, colors): - self.plot = pg.PlotWidget(title="

EKG

") self.plot.hide() self.plot.setLabel('left', "

Amplitude

") @@ -279,24 +281,31 @@ class EkgPlot(object): def update(self, osc_address, value): + print "update", osc_address res = self.ekg_regex.match(osc_address) if res: + #print("matched data") actor_name = res.group(1) actor_obj = self.actors[actor_name] max_actors = len(self.active_actors) - ix = self.active_actors.index(actor_obj) actor_data = actor_obj.data data_pointer = actor_obj.data_pointer actor_data[data_pointer] = value - actor_obj.set_point(value, ix, max_actors) + try: + ix = self.active_actors.index(actor_obj) + actor_obj.set_point(value, ix, max_actors) + actor_obj.plotItem.setData(y=np.array(actor_obj.scale_data(ix, max_actors)), clear=True) + except ValueError as e: + #print("data", e) + pass actor_obj.data_pointer = (data_pointer + 1) % self.num_data - actor_obj.plotItem.setData(y=np.array(actor_obj.scale_data(ix, max_actors)), clear=True) return res = self.ctl_regex.match(osc_address) if res: actor_name = res.group(1) actor_obj = self.actors[actor_name] + #print("matched ctl", value, actor_name, actor_obj.active) if value == 1 and not actor_obj.active: print "actor on", actor_name self.plot.addItem(actor_obj) @@ -306,7 +315,22 @@ class EkgPlot(object): print "actor off", actor_name self.plot.removeItem(actor_obj) actor_obj.active = True - self.active_actors.remove(actor_obj) + if actor_obj not in self.active_actors: + self.plot.addItem(actor_obj.plotItem) + self.plot.addItem(actor_obj.plotPoint) + self.active_actors.append(actor_obj) + assert actor_obj in self.active_actors + elif value == 0 and actor_obj.active: + #print("actor off", actor_name, actor_obj, self.active_actors) + actor_obj.active = False + self.plot.removeItem(actor_obj.plotItem) + self.plot.removeItem(actor_obj.plotPoint) + try: + self.active_actors.remove(actor_obj) + except ValueError as e: + #print("ctl", e) + pass + assert actor_obj not in self.active_actors self.set_positions() @@ -361,8 +385,10 @@ class MyHandler(BaseHTTPRequestHandler): buffer = QBuffer() buffer.open(QIODevice.WriteOnly) img.save(buffer, "JPG", 100) + JpegData = buffer.data() 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)) + del JpegData del buffer del img @@ -389,54 +415,47 @@ class MyHandler(BaseHTTPRequestHandler): print "queue size", queue.qsize() thread.running = False thread.join() - except IOError: + except IOError, e: + print "ioerror", e + print '-'*40 + print 'Exception happened during processing of request from' + traceback.print_exc() # XXX But this goes to stderr! + print '-'*40 self.send_error(404,'File Not Found: %s' % self.path) class JustAHTTPServer(HTTPServer): - address_family = socket.AF_INET6 pass def main(): - a = create_arg_parser("ekgplotter") - own_group = add_main_group(a) + arg_parser = create_arg_parser("ekgplotter") + own_group = add_main_group(arg_parser) own_group.add_argument('-x', "--http_host", default="::", - help='my host, defaults to "socket.gethostname()"') + help='my host, defaults to "::"') own_group.add_argument('-X', "--http_port", default=9000, type=int, help='my port, defaults to 9000') - add_chaosc_group(a) - add_subscriber_group(a, "ekgplotter") - args = finalize_arg_parser(a) + add_chaosc_group(arg_parser) + add_subscriber_group(arg_parser, "ekgplotter") + args = finalize_arg_parser(arg_parser) + qtapp = QtGui.QApplication([]) - http_host, http_port = resolve_host(args.http_host, args.http_port) - print http_host, http_port + http_host, http_port = resolve_host(args.http_host, args.http_port, args.address_family) server = JustAHTTPServer((http_host, http_port), MyHandler) + server.address_family = args.address_family server.args = args print "%s: starting up http server on '%s:%d'" % ( datetime.now().strftime("%x %X"), http_host, http_port) - print "before start:" - #objgraph.show_growth() try: server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down server' - #print "queue size", queue.qsize() - #print "show growth", objgraph.show_growth() - #import random - #objgraph.show_chain( - #objgraph.find_backref_chain( - #random.choice(objgraph.by_type('function')), - #objgraph.is_proper_module), - #filename='chain.png') - #roots = objgraph.get_leaking_objects() - #print "root", len(roots) - #objgraph.show_most_common_types(objects=roots) - #objgraph.show_refs(roots[:3], refcounts=True, filename='roots.png') server.socket.close() + sys.exit(0) + if __name__ == '__main__':