autoscaling ekg plotter

This commit is contained in:
Stefan Kögl 2014-03-21 00:19:09 +01:00
parent 335352e7bd
commit 989a04e975
1 changed files with 86 additions and 34 deletions

View File

@ -145,6 +145,10 @@ queue = Queue.Queue()
class MyHandler(BaseHTTPRequestHandler):
def __del__(self):
self.thread.running = False
self.thread.join()
def do_GET(self):
print "get"
@ -166,37 +170,71 @@ class MyHandler(BaseHTTPRequestHandler):
scale = 254 / max_items * ix
return [value / max_items + scale for value in data]
def set_point(plotPoint, pos, value, ix, max_items):
scale = 254 / max_items * ix
plotPoint.setData(x = [pos], y = [6*ix + value / max_items + scale])
y = 6 * ix + value / max_items + scale
plotPoint.setData(x = [pos], y = [y])
def setValue(dataItem, pos, maxPos, value):
dataItem[pos] = value
return (pos + 1) % maxPos
def find_max_value(item_data):
max_index = -1
for ix, i in enumerate(item_data):
if i > 250:
return ix, i
return None, None
def findMax(dataItem):
max_value = 0
max_index = 0
for ix, i in enumerate(dataItem):
if i > max_value:
max_value = i
max_index = ix
return max_index
def rearrange(data, index, max_items):
max_value = findMax(data)
def rearrange(item_data, actual_pos, max_items):
max_value_index, max_value = find_max_value(item_data)
if max_value_index is None:
return actual_pos
mean = int(max_items / 2.)
start = mean - max_value
data.rotate(start)
pos = (index + start) % max_items
print "rearrange", index, max_items, pos
start = mean - max_value_index
if start != 0:
item_data.rotate(start)
pos = (actual_pos + start) % max_items
else:
pos = actual_pos
print "rearrange", mean, start, actual_pos, pos, item_data
return pos
def checkDataPoints(value, data_max_value):
if value > max_value and value > 200:
return True, value
return False, data_max_value
def set_value(item_data, pos, max_pos, value):
print "setValue before", pos, None, max_pos, value, item_data, len(item_data)
item_data[pos] = value
new_pos = (pos + 1) % max_pos
print "setValue after ", pos, new_pos, max_pos, value, item_data, len(item_data)
return new_pos
def resize(item_data, max_length, new_max_length, pos):
print "resize", max_length, new_max_length
if new_max_length < 15:
return max_length, pos
if new_max_length > max_length:
pad = (new_max_length - max_length)
print "pad", pad
for i in range(pad):
if i % 2 == 0:
item_data.append(0)
else:
item_data.appendleft(0)
pos += 1
return new_max_length, pos
elif new_max_length < max_length:
pad = (max_length - new_max_length)
for i in range(pad):
if i % 2 == 0:
item_data.pop()
if pos >= new_max_length:
pos = 0
else:
item_data.popleft()
if pos > 0:
pos -= 1
return new_max_length, pos
return max_length, pos
try:
self.path=re.sub('[^.a-zA-Z0-9]', "",str(self.path))
@ -218,6 +256,8 @@ class MyHandler(BaseHTTPRequestHandler):
pos2 = 0
pos3 = 0
lengths1 = [0]
data1_max_value = 0
data2_max_value = 0
data3_max_value = 0
@ -229,7 +269,7 @@ class MyHandler(BaseHTTPRequestHandler):
plot_data1 = deque([0] * data_points)
plot_data2 = deque([0] * data_points)
plot_data3 = deque([0] * data_points)
plt = PlotWidget(title="<h1>EKG</h1>", name="Merle")
plt = PlotWidget(title="<h1>EKG</h1>")
plt.hide()
plotItem1 = pg.PlotCurveItem(pen=pg.mkPen('r', width=2), width=2, name="bjoern")
plotItem2 = pg.PlotCurveItem(pen=pg.mkPen('g', width=2), width=2, name="merle")
@ -257,12 +297,16 @@ class MyHandler(BaseHTTPRequestHandler):
plt.addItem(plotPoint3)
plt.setLabel('left', "<h2>Amplitude</h2>")
plt.setLabel('bottom', "<h2>Time</h2>")
plt.setLabel('bottom', "<h2><sup>Time</sup></h2>")
plt.showGrid(True, True)
ba = plt.getAxis("bottom")
bl = plt.getAxis("left")
ba.setTicks([])
bl.setTicks([])
ba.setWidth(0)
ba.setHeight(0)
bl.setWidth(0)
bl.setHeight(0)
plt.setYRange(0, 254)
self.wfile.write("Content-Type: multipart/x-mixed-replace; boundary=--aaboundary")
@ -281,32 +325,40 @@ class MyHandler(BaseHTTPRequestHandler):
value = args[0]
if osc_address == "/bjoern/ekg":
if value > 250:
data_points, pos1 = resize(plot_data1, len(plot_data1), lengths1[-1], pos1)
foo, pos2 = resize(plot_data2, len(plot_data2), lengths1[-1], pos2)
foo, pos3 = resize(plot_data3, len(plot_data3), lengths1[-1], pos3)
print "length1", lengths1
lengths1.append(0)
else:
lengths1[-1] += 1
ix = actors.index(plotItem1)
res, tmp = checkDataPoints(value, data1_max_value)
if res and res > 20:
data_points = tmp
data1_maxdata1_max_value = 0
set_point(plotPoint1, pos1, value, ix, max_items)
pos1 = setValue(plot_data1, pos1, data_points, value)
pos1 = rearrange(plot_data1, pos1, data_points)
set_point(plotPoint1, pos1, value, ix, max_items)
pos1 = set_value(plot_data1, pos1, data_points, value)
try:
plotItem1.setData(y=np.array(scale_data(plot_data1, ix, max_items)), clear=True)
except ValueError:
pass
elif osc_address == "/merle/ekg":
ix = actors.index(plotItem2)
set_point(plotPoint2, pos2, value, ix, max_items)
pos2 = setValue(plot_data2, pos2, data_points, value)
pos2 = rearrange(plot_data2, pos2, data_points)
set_point(plotPoint2, pos2, value, ix, max_items)
pos2 = set_value(plot_data2, pos2, data_points, value)
try:
plotItem2.setData(y=np.array(scale_data(plot_data2, ix, max_items)), clear=True)
except ValueError:
pass
elif osc_address == "/uwe/ekg":
ix = actors.index(plotItem3)
set_point(plotPoint3, pos3, value, ix, max_items)
pos3 = setValue(plot_data3, pos3, data_points, value)
pos3 = rearrange(plot_data3, pos3, data_points)
set_point(plotPoint3, pos3, value, ix, max_items)
pos3 = set_value(plot_data3, pos3, data_points, value)
try:
plotItem3.setData(y=np.array(scale_data(plot_data3, ix, max_items)), clear=True)
except ValueError: