diff --git a/preload/apps/ecg/__init__.py b/preload/apps/ecg/__init__.py index ccc38843d0201298e5933318c2f5124c220e732d..474b0654bd2617082771b0c126a208da83e7be6f 100644 --- a/preload/apps/ecg/__init__.py +++ b/preload/apps/ecg/__init__.py @@ -8,9 +8,9 @@ import struct WIDTH = 160 HEIGHT = 80 -OFFSET = 50 +OFFSET_Y = 49 ECG_RATE = 128 -HISTORY_MAX = ECG_RATE * 2 +HISTORY_MAX = ECG_RATE * 4 DRAW_AFTER_SAMPLES = 5 SCALE_FACTOR = 30 MODE_USB = "USB" @@ -31,20 +31,26 @@ write = 0 bias = True update_screen = 0 pause_screen = 0 +pause_histogram = False +histogram_offset = 0 sensor = 0 disp = display.open() def callback_ecg(datasets): global update_screen, history, filebuffer, write - if len(datasets) > 0: - for value in datasets: - history.append(value) - update_screen += len(datasets) - if len(history) > HISTORY_MAX: - r = len(history) - HISTORY_MAX - for i in range(r): - history.pop(0) + update_screen += len(datasets) + # print("callback_ecg(%i)" % 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) # buffer for writes if write > 0: @@ -57,8 +63,8 @@ def callback_ecg(datasets): # don't update on every callback if update_screen >= DRAW_AFTER_SAMPLES: # print("history: %i, filebuffer: %i" % (len(history), len(filebuffer))) + # print("draw_histogram(%i) via callback" % histogram_offset) draw_histogram() - update_screen = 0 def write_filebuffer(): @@ -149,8 +155,19 @@ def toggle_write(): return +def toggle_pause(): + global pause_histogram, histogram_offset, history + if pause_histogram == True: + pause_histogram = False + history = [] + else: + pause_histogram = True + histogram_offset = 0 + # print("toggle_pause()", pause_histogram) + + def draw_histogram(): - global disp, history, current_mode, bias, write, pause_screen + global disp, history, current_mode, bias, write, pause_screen, update_screen # skip rendering due to message beeing shown if pause_screen == -1: @@ -164,34 +181,64 @@ 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) + # get max value and calc scale value_max = 0 - for value in history: - if abs(value) > value_max: + for i, value in enumerate(history): + if i >= s_start and i <= s_end and abs(value) > value_max: value_max = abs(value) scale = SCALE_FACTOR / (value_max if value_max > 0 else 1) # draw histogram old = False x = 0 - samples = len(history) for i, value in enumerate(history): if old == False: - old = (x, int(value * scale) + OFFSET) + old = value x += 1 continue - elif i > samples - WIDTH: - disp.line(old[0], old[1], x, int(value * scale) + OFFSET, col=COLOR_LINE) - old = (x, int(value * scale) + OFFSET) + 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 # draw text: mode/bias/write - disp.print( - current_mode + ("+Bias" if bias else ""), - posx=0, - posy=0, - fg=(COLOR_MODE_FINGER if current_mode == MODE_FINGER else COLOR_MODE_USB), - ) + if pause_histogram == True: + disp.print( + "Pause" + ( + " -%0.1fs" % (histogram_offset / ECG_RATE) + if histogram_offset > 0 + else "" + ), + posx=0, + posy=0, + fg=COLOR_TEXT + ) + else: + disp.print( + current_mode + ("+Bias" if bias else ""), + posx=0, + posy=0, + fg=(COLOR_MODE_FINGER if current_mode == MODE_FINGER else COLOR_MODE_USB), + ) # announce writing ecg log if write > 0: @@ -200,9 +247,12 @@ def draw_histogram(): disp.print("LOG", posx=0, posy=60, fg=COLOR_WRITE_FG, bg=COLOR_WRITE_BG) disp.update() + update_screen = 0 def main(): + global pause_histogram, histogram_offset + # show button layout disp.clear(COLOR_BACKGROUND) disp.print(" BUTTONS ", posx=0, posy=0, fg=COLOR_TEXT) @@ -215,25 +265,81 @@ def main(): # start ecg open_sensor() while True: - button_pressed = False + button_pressed = { + "BOTTOM_LEFT": 0, + "BOTTOM_RIGHT": 0, + "TOP_RIGHT": 0, + } while True: v = buttons.read( buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT ) - if v == 0: - button_pressed = False - - if not button_pressed and v & buttons.BOTTOM_LEFT != 0: - button_pressed = True - toggle_write() - - elif not button_pressed and v & buttons.BOTTOM_RIGHT != 0: - button_pressed = True - toggle_bias() - - elif not button_pressed and v & buttons.TOP_RIGHT != 0: - button_pressed = True - toggle_mode() + # print("button.read(%i)" % v) + + # BUTTOM LEFT + + if button_pressed["BOTTOM_LEFT"] == 0 and v & buttons.BOTTOM_LEFT != 0: + button_pressed["BOTTOM_LEFT"] = utime.time_ms() + if pause_histogram == False: + toggle_write() + else: + l = len(history) + histogram_offset += ECG_RATE / 2 + if l - histogram_offset < WIDTH: + histogram_offset = l - WIDTH + # print ("LEFT: ", histogram_offset, len(history)) + + if button_pressed["BOTTOM_LEFT"] > 0 and v & buttons.BOTTOM_LEFT == 0: + duration = utime.time_ms() - button_pressed["BOTTOM_LEFT"] + button_pressed["BOTTOM_LEFT"] = 0 + # print("BOTTOM_LEFT up (%ims)" % duration) + + # BUTTOM RIGHT + + if button_pressed["BOTTOM_RIGHT"] == 0 and v & buttons.BOTTOM_RIGHT != 0: + button_pressed["BOTTOM_RIGHT"] = utime.time_ms() + if pause_histogram == False: + toggle_bias() + else: + histogram_offset -= ECG_RATE / 2 + histogram_offset -= histogram_offset % (ECG_RATE / 2) + if histogram_offset < 0: + histogram_offset = 0 + # print ("RIGHT: ", histogram_offset, len(history)) + + if button_pressed["BOTTOM_RIGHT"] > 0 and v & buttons.BOTTOM_RIGHT == 0: + duration = utime.time_ms() - button_pressed["BOTTOM_RIGHT"] + button_pressed["BOTTOM_RIGHT"] = 0 + # print("BOTTOM_RIGHT up (%ims)" % duration) + + # TOP RIGHT + + # down, and still pressed + if button_pressed["TOP_RIGHT"] > 0 and v & buttons.TOP_RIGHT != 0: + duration = utime.time_ms() - button_pressed["TOP_RIGHT"] + if duration > 1000: + button_pressed["TOP_RIGHT"] = -1 + # print("TOP_RIGHT down longer then 1000ms (%ims)" % duration) + toggle_pause() + + # register down event + elif button_pressed["TOP_RIGHT"] == 0 and v & buttons.TOP_RIGHT != 0: + button_pressed["TOP_RIGHT"] = utime.time_ms() + # print("TOP_RIGHT down") + + # register up event but event already called + if button_pressed["TOP_RIGHT"] == -1 and v & buttons.TOP_RIGHT == 0: + button_pressed["TOP_RIGHT"] = 0 + + # register normal up event + 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 + # print("TOP_RIGHT up (%ims)" % duration) + if pause_histogram == True: + toggle_pause() + else: + toggle_mode() pass