diff --git a/preload/apps/ecg/__init__.py b/preload/apps/ecg/__init__.py index d8ff79e736d3a267a19d7c5e99697231ed9d6543..b6adca37ff1a959840b39578aee84e3084d55bcf 100644 --- a/preload/apps/ecg/__init__.py +++ b/preload/apps/ecg/__init__.py @@ -39,7 +39,6 @@ disp = display.open() leds.dim_top(1) COLORS = [((23 + (15 * i)) % 360, 1.0, 1.0) for i in range(11)] -colors = COLORS def callback_ecg(datasets): @@ -47,22 +46,18 @@ def callback_ecg(datasets): update_screen += len(datasets) # update histogram datalist - if pause_histogram == False: - if len(datasets) > 0: - for value in datasets: - history.append(value) - if len(history) > HISTORY_MAX: - r = len(history) - HISTORY_MAX - for i in range(r): - history.pop(0) + if not pause_histogram: + history += datasets + + # trim old elements + history = history[-HISTORY_MAX:] # buffer for writes if write > 0: - if len(datasets) > 0: - for value in datasets: - filebuffer.extend(struct.pack("h", value)) - if len(filebuffer) >= FILEBUFFERBLOCK: - write_filebuffer() + for value in datasets: + filebuffer.extend(struct.pack("h", value)) + if len(filebuffer) >= FILEBUFFERBLOCK: + write_filebuffer() # don't update on every callback if update_screen >= DRAW_AFTER_SAMPLES: @@ -74,14 +69,7 @@ def write_filebuffer(): # write to file chars = "" lt = utime.localtime(write) - filename = "/ecg-%04d-%02d-%02d_%02d%02d%02d.log" % ( - lt[0], - lt[1], - lt[2], - lt[3], - lt[4], - lt[5], - ) + filename = "/ecg-{:04d}-{:02d}-{:02d}_{:02d}{:02d}{:02d}.log".format(*lt) # write stuff to disk try: @@ -104,13 +92,12 @@ def write_filebuffer(): write = 0 filebuffer = bytearray() - return def open_sensor(): global sensor sensor = max30001.MAX30001( - usb=(False if current_mode == MODE_FINGER else True), + usb=(current_mode == MODE_USB), bias=bias, sample_rate=ECG_RATE, callback=callback_ecg, @@ -132,9 +119,8 @@ def toggle_mode(): def toggle_bias(): global bias close_sensor() - bias = False if bias == True else True + bias = not bias open_sensor() - return def toggle_write(): @@ -153,12 +139,11 @@ def toggle_write(): disp.print("logging", posx=30, posy=40, fg=COLOR_TEXT) disp.update() - return def toggle_pause(): global pause_histogram, histogram_offset, history - if pause_histogram == True: + if pause_histogram: pause_histogram = False history = [] else: @@ -167,7 +152,6 @@ def toggle_pause(): def draw_leds(val): - global colors # val should be in [0, 11] for i in range(11): leds.prep_hsv(10 - i, COLORS[10 - i] if i < val else (0, 0, 0)) @@ -190,47 +174,30 @@ def draw_histogram(): disp.clear(COLOR_BACKGROUND) # offset in pause_histogram mode - samples = len(history) - s_start = samples - (histogram_offset + (ECG_RATE * 2)) - s_end = samples - (histogram_offset + 1) - s_draw = s_end - (WIDTH - 1) + window_end = int(len(history) - histogram_offset) + s_start = max(0, window_end - (ECG_RATE * 2)) + s_end = max(0, window_end) + s_draw = max(0, s_end - WIDTH) # get max value and calc scale - value_max = 0 - for i, value in enumerate(history): - if i >= s_start and i <= s_end and abs(value) > value_max: - value_max = abs(value) + value_max = max(abs(x) for x in history[s_start:s_end]) scale = SCALE_FACTOR / (value_max if value_max > 0 else 1) # draw histogram - old = False - x = 0 - for i, value in enumerate(history): - if old == False: - old = value - x += 1 - continue - elif i > s_start and i > s_draw and i < s_end: - - oldy = int(old * scale) - if oldy < -SCALE_FACTOR: - oldy = -SCALE_FACTOR - elif oldy > SCALE_FACTOR: - oldy = SCALE_FACTOR - - disp.line( - x - 1, oldy + OFFSET_Y, x, int(value * scale) + OFFSET_Y, col=COLOR_LINE - ) - old = value - x += 1 + # values need to be inverted so high values are drawn with low pixel coordinates (at the top of the screen) + draw_points = (int(-x * scale + OFFSET_Y) for x in history[s_draw:s_end]) + + prev = next(draw_points) + for x, value in enumerate(draw_points): + disp.line(x, prev, x + 1, value, col=COLOR_LINE) + prev = value - draw_leds((60 - int((max(history[-3:]) * scale + OFFSET_Y) - 20)) * 11 / 60) # draw text: mode/bias/write - if pause_histogram == True: + if pause_histogram: disp.print( "Pause" + ( - " -%0.1fs" % (histogram_offset / ECG_RATE) + " -{:0.1f}s".format(histogram_offset / ECG_RATE) if histogram_offset > 0 else "" ), @@ -239,6 +206,7 @@ def draw_histogram(): fg=COLOR_TEXT, ) else: + draw_leds((max(history[-5:]) * scale + SCALE_FACTOR) * 11 / (SCALE_FACTOR * 2)) disp.print( current_mode + ("+Bias" if bias else ""), posx=0, @@ -277,11 +245,11 @@ def main(): buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT ) - # BUTTOM LEFT + # BOTTOM LEFT if button_pressed["BOTTOM_LEFT"] == 0 and v & buttons.BOTTOM_LEFT != 0: button_pressed["BOTTOM_LEFT"] = utime.time_ms() - if pause_histogram == False: + if not pause_histogram: toggle_write() else: l = len(history) @@ -293,11 +261,11 @@ def main(): duration = utime.time_ms() - button_pressed["BOTTOM_LEFT"] button_pressed["BOTTOM_LEFT"] = 0 - # BUTTOM RIGHT + # BOTTOM RIGHT if button_pressed["BOTTOM_RIGHT"] == 0 and v & buttons.BOTTOM_RIGHT != 0: button_pressed["BOTTOM_RIGHT"] = utime.time_ms() - if pause_histogram == False: + if not pause_histogram: toggle_bias() else: histogram_offset -= ECG_RATE / 2 @@ -330,13 +298,11 @@ def main(): elif button_pressed["TOP_RIGHT"] > 0 and v & buttons.TOP_RIGHT == 0: duration = utime.time_ms() - button_pressed["TOP_RIGHT"] button_pressed["TOP_RIGHT"] = 0 - if pause_histogram == True: + if pause_histogram: toggle_pause() else: toggle_mode() - pass - if __name__ == "__main__": main()