diff --git a/Algorithm/menu_updated_.py b/Algorithm/menu_updated_.py new file mode 100644 index 0000000000000000000000000000000000000000..bc1499ebfec98cbc7571d9c3252f14ffd138c1f5 --- /dev/null +++ b/Algorithm/menu_updated_.py @@ -0,0 +1,135 @@ +#menu.py + +from machine import Pin, I2C +from ssd1306 import SSD1306_I2C +import time + +class MenuSystem: + def __init__(self): + # Initialize I2C and OLED + self.i2c = I2C(1, scl=Pin(15), sda=Pin(14), freq=400000) + self.oled = SSD1306_I2C(128, 64, self.i2c) + + # Menu configuration + self.menu_items = ["Measure Heart", "HRV Analysis"] + self.selected = 0 + self.state = "menu" + + # Configure pins + self.pin_a = Pin(10, Pin.IN, Pin.PULL_UP) # CLK + self.pin_b = Pin(11, Pin.IN, Pin.PULL_UP) # DT + self.btn_ok = Pin(12, Pin.IN, Pin.PULL_UP) # Button press + + # State tracking + self.last_state = self.pin_a.value() + self.last_press = time.ticks_ms() + + # Heart rate monitor + self.heart_monitor = None + self.measuring_heart_rate = False + + # Set up interrupts + self.pin_a.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=self._on_rotate) + self.btn_ok.irq(trigger=Pin.IRQ_FALLING, handler=self._on_press) + + def set_heart_monitor(self, monitor): + """Set the heart rate monitor instance""" + self.heart_monitor = monitor + + def start(self): + """Start the menu system and enter the main loop""" + self.draw_menu() + while True: + if self.measuring_heart_rate and self.heart_monitor: + bpm = self.heart_monitor.update() + if bpm: + self.display_heart_rate(bpm) + time.sleep(0.1) + + def draw_menu(self): + """Display the main menu on OLED""" + self.oled.fill(0) + for i, item in enumerate(self.menu_items): + prefix = "> " if i == self.selected else " " + self.oled.text(prefix + item, 0, i * 12) + self.oled.show() + + def show_selected_screen(self): + """Display the selected menu item screen""" + self.oled.fill(0) + + # Start measuring heart rate if first option selected + if self.selected == 0 and self.heart_monitor: + self.measuring_heart_rate = True + self.oled.text("Measuring...", 0, 0) + self.oled.text("Please wait", 0, 20) + self.oled.text("Press to return", 0, 50) + self.oled.show() + elif self.selected == 1 and self.heart_monitor: + self.measuring_heart_rate = True + self.oled.text("Collecting data", 0, 0) + self.oled.text("Please wait", 0, 20) + self.oled.text("Press to return", 0, 50) + self.oled.show() + hrv_analysis = self.heart_monitor.generate_analysis() + self.display_hrv_analysis(hrv_analysis) + else: + self.measuring_heart_rate = False + self.oled.text("Selected:", 0, 0) + self.oled.text(self.menu_items[self.selected], 0, 20) + self.oled.text("Press to return", 0, 50) + self.oled.show() + while self.btn_ok.value() == 1: + time.sleep_ms(1) + + def display_heart_rate(self, bpm): + """Display the heart rate reading""" + if self.state == "selected" and self.selected == 0: + self.oled.fill(0) + self.oled.text("Heart Rate:", 0, 0) + self.oled.text(str(bpm) + " BPM", 0, 20) + self.oled.text("Press to return", 0, 50) + self.oled.show() + + def display_hrv_analysis(self, analysis_results): + if self.state == "selected" and self.selected == 1: + self.oled.fill(0) + + if isinstance(analysis_results, dict): + mean_hr = analysis_results.get("mean_hr", 0) + else: + # Backward compatibility for old code + mean_hr = analysis_results + + # Display the results + self.oled.text("Mean HR:", 0, 0) + self.oled.text(str(mean_hr) + " BPM", 0, 12) + self.oled.text("Press to return", 0, 54) + self.oled.show() + + def _on_rotate(self, pin): + """Handle rotary encoder rotation interrupt""" + if self.state != "menu": + return + + new_state = self.pin_a.value() + if new_state != self.last_state and new_state == 1: + if self.pin_b.value() != new_state: + self.selected = (self.selected + 1) % len(self.menu_items) + else: + self.selected = (self.selected - 1) % len(self.menu_items) + self.draw_menu() + self.last_state = new_state + + def _on_press(self, pin): + """Handle button press interrupt""" + now = time.ticks_ms() + if time.ticks_diff(now, self.last_press) > 200: + if self.state == "menu": + self.state = "selected" + self.show_selected_screen() + else: + self.state = "menu" + self.measuring_heart_rate = False + self.draw_menu() + self.last_press = now