diff --git a/preload/apps/analog_clock/__init__.py b/preload/apps/analog_clock/__init__.py index c679a82ec20191acec37fa99519f1cb81e52fc71..543a0aba756015032a09448579c16ee011efc298 100644 --- a/preload/apps/analog_clock/__init__.py +++ b/preload/apps/analog_clock/__init__.py @@ -11,28 +11,6 @@ import os CONFIG_NAME = "clock.json" -class Time: - def __init__(self, start=0): - self.time = start - self.wait_time = 0.95 - - def tick(self): - sleep(self.wait_time) - self.time += 1 - - @property - def second(self): - return self.time % 60 - - @property - def minute(self): - return (self.time / 60) % 60 - - @property - def hour(self): - return (self.time / 3600) % 24 - - class Clock: def __init__( self, @@ -60,7 +38,6 @@ class Clock: ) self.run_once = run_once self.offsetx = offsetx - self.time = Time() self.theme = 0 self.default_themes = [ { @@ -181,46 +158,36 @@ class Clock: colored = False try: with display.open() as disp: - button_pressed = False while True: - self.updateClock(disp) + localtime = utime.localtime() + self.updateClock(disp, localtime) if self.run_once: break # check for button presses - v = buttons.read(buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT) - if v == 0: - button_pressed = False + v = buttons.read( + buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT + ) + button_pressed = v != 0 - if not button_pressed and v & buttons.BOTTOM_LEFT != 0: - button_pressed = True + if button_pressed and v & buttons.BOTTOM_LEFT != 0: self.setTheme(self.theme - 1) self.writeConfig() - elif not button_pressed and v & buttons.BOTTOM_RIGHT != 0: - button_pressed = True + elif button_pressed and v & buttons.BOTTOM_RIGHT != 0: self.setTheme(self.theme + 1) self.writeConfig() + elif button_pressed and v & buttons.TOP_RIGHT != 0: + self.setTime(disp, localtime) + + utime.sleep_ms(23) except KeyboardInterrupt: for i in range(11): leds.set(i, (0, 0, 0)) return - def drawImage(self, image): - with display.open() as d: - d.clear() - for x in range(len(image)): - for y in range(len(image[x])): - d.pixel( - x + self.offsetx, - y, - col=(255, 255, 255) if image[x][y] else (0, 0, 0), - ) - d.update() - - def updateClock(self, disp): + def updateClock(self, disp, localtime): disp.clear(self.background_col) - localtime = utime.localtime() disp.pixel(self.center[0] + self.offsetx, self.center[1], col=self.center_col) hour_coords = self.circlePoint( @@ -284,6 +251,49 @@ class Clock: disp.update() + def setTime(self, disp, localtime): + accepted = False + previously_pressed_button = buttons.TOP_RIGHT + button_repeat_counter = 0 + set_seconds = utime.mktime(localtime) + + while not accepted: + v = buttons.read( + buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT + ) + button_pressed = v != 0 + + if button_pressed: + if v & previously_pressed_button != 0: + button_repeat_counter += 1 + else: + if v & buttons.BOTTOM_LEFT != 0: + previously_pressed_button = buttons.BOTTOM_LEFT + elif v & buttons.BOTTOM_RIGHT != 0: + previously_pressed_button = buttons.BOTTOM_RIGHT + elif ( + v & buttons.TOP_RIGHT != 0 + and previously_pressed_button != buttons.TOP_RIGHT + ): + accepted = True + else: + previously_pressed_button = 0 + else: + previously_pressed_button = 0 + button_repeat_counter = 0 + + seconds_change = int(min(1.1 ** button_repeat_counter, 60 * 23 + 1)) + if previously_pressed_button == buttons.BOTTOM_LEFT: + set_seconds -= seconds_change + elif previously_pressed_button == buttons.BOTTOM_RIGHT: + set_seconds += seconds_change + + self.updateClock(disp, utime.localtime(set_seconds)) + utime.sleep_ms(23) + + utime.set_time(int(set_seconds)) + utime.sleep_ms(123) + def circlePoint(self, t): return ( int(round(self.radius * math.cos(t))) + self.center[0],