diff --git a/init.py b/init.py index d2d1046..8ca096f 100644 --- a/init.py +++ b/init.py @@ -27,6 +27,11 @@ class AlarmClock: lastButtonPressTime: float = 0.0 lastButtonStateChangeTime: float = 0.0 debounceDelay: float = 0.05 # 50ms debounce delay + longPressThreshold: float = 2.0 # 2 seconds for long press + buttonPressStartTime: float = 0.0 + configMode: str = "normal" # modes: normal, set_hour, set_minute + alarmHour: int = 7 + alarmMinute: int = 0 def __init__(self, pins: dict = {}): self.ledGpio = GPIO(pins.get("led", 5), GPIO.OUT) self.buttonGpio = GPIO(pins.get("button", 6), GPIO.IN) @@ -54,13 +59,64 @@ class AlarmClock: self.lastButtonStateChangeTime = currentTime self.onButtonPress("button", currentButtonState) + # Check for long press while button is held + if currentButtonState and self.buttonPressStartTime > 0: + pressDuration = currentTime - self.buttonPressStartTime + if pressDuration >= self.longPressThreshold: + self.onLongPress() + self.buttonPressStartTime = 0.0 # Reset to prevent repeated triggers + + def setLcdTime(self, hours: int, minutes: int): + self.lcd.clear() + # write the time on spanning both rows of the LCD + timeString = f"{hours:02}:{minutes:02}" + self.lcd.write(timeString) def onButtonPress(self, button: str, state: bool): print(f"Button '{button}' pressed state: {state}") - if button == "button" and state == True: - self.lastButtonPressTime = time() + currentTime = time() + + if button == "button": + if state: # Button pressed down + self.buttonPressStartTime = currentTime + else: # Button released + if self.buttonPressStartTime > 0: + pressDuration = currentTime - self.buttonPressStartTime + self.buttonPressStartTime = 0.0 + + # Only handle as short press if it wasn't a long press + if pressDuration < self.longPressThreshold: + self.onShortPress() + + def onShortPress(self): + """Handle short button press based on current mode""" + if self.configMode == "normal": + # Normal mode: toggle relay self.setRelayState(not self.relayGpio.read()) - self.setLcdText(self.lastButtonPressTime.__str__()) + self.setLcdText(f"Relay: {'ON' if self.relayGpio.read() else 'OFF'}") + elif self.configMode == "set_hour": + # Increment hour + self.alarmHour = (self.alarmHour + 1) % 24 + self.setLcdText(f"Set Hour: {self.alarmHour:02d}") + elif self.configMode == "set_minute": + # Increment minute + self.alarmMinute = (self.alarmMinute + 1) % 60 + self.setLcdText(f"Set Min: {self.alarmMinute:02d}") + + def onLongPress(self): + """Handle long button press - cycle through configuration modes""" + if self.configMode == "normal": + self.configMode = "set_hour" + self.setLcdText(f"Set Hour: {self.alarmHour:02d}") + print(f"Entering hour setting mode") + elif self.configMode == "set_hour": + self.configMode = "set_minute" + self.setLcdText(f"Set Min: {self.alarmMinute:02d}") + print(f"Switching to minute setting mode") + elif self.configMode == "set_minute": + self.configMode = "normal" + self.setLcdText(f"Saved: {self.alarmHour:02d}:{self.alarmMinute:02d}") + print(f"Alarm time saved: {self.alarmHour:02d}:{self.alarmMinute:02d}") def setLcdText(self, text: str): self.lcd.clear()