|
@@ -39,6 +39,43 @@ def _get_current_daytime() -> int:
|
|
|
return (hour * 60 + minute) * 60 + seconds
|
|
|
|
|
|
|
|
|
+class _AlarmTime:
|
|
|
+ def __init__(self):
|
|
|
+ self._hour = 0
|
|
|
+ self._minute = 0
|
|
|
+
|
|
|
+ @property
|
|
|
+ def hour(self) -> int:
|
|
|
+ return self._hour
|
|
|
+
|
|
|
+ @property
|
|
|
+ def minute(self) -> int:
|
|
|
+ return self._minute
|
|
|
+
|
|
|
+ def shift_hour(self, delta: int) -> None:
|
|
|
+ self._hour = (self._hour + delta) % 24
|
|
|
+
|
|
|
+ def shift_minute(self, delta: int) -> None:
|
|
|
+ self._minute = (self._minute + delta) % 60
|
|
|
+
|
|
|
+ @property
|
|
|
+ def daytime(self) -> int:
|
|
|
+ return (self._hour * 60 + self._minute) * 60
|
|
|
+
|
|
|
+ def load(self, path: str) -> None:
|
|
|
+ with open(path, "r") as alarm_time_file:
|
|
|
+ alarm_time = json.load(alarm_time_file)
|
|
|
+ self._hour = alarm_time["hour"]
|
|
|
+ self._minute = alarm_time["minute"]
|
|
|
+
|
|
|
+ def save(self, path: str) -> None:
|
|
|
+ with open(path, "w") as alarm_time_file:
|
|
|
+ json.dump(
|
|
|
+ {"hour": self._hour, "minute": self._minute},
|
|
|
+ alarm_time_file,
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
class App:
|
|
|
|
|
|
def __init__(self) -> None:
|
|
@@ -46,30 +83,12 @@ class App:
|
|
|
self._menu_position = 0
|
|
|
self._wait_for_sleep_start_time_update = False
|
|
|
self._sleep_start_time_seconds = 0.0
|
|
|
- self._alarm_hour = None
|
|
|
- self._alarm_minute = None
|
|
|
+ self._alarm_time = _AlarmTime()
|
|
|
self._alarm_hour_text_box = None
|
|
|
self._alarm_minute_text_box = None
|
|
|
self._alarm_timer = None
|
|
|
self._battery_status_text_box = None
|
|
|
|
|
|
- @property
|
|
|
- def _alarm_daytime(self) -> int:
|
|
|
- return (self._alarm_hour * 60 + self._alarm_minute) * 60
|
|
|
-
|
|
|
- def _load_alarm_time(self) -> None:
|
|
|
- with open(_ALARM_TIME_PATH, "r") as alarm_time_file:
|
|
|
- alarm_time = json.load(alarm_time_file)
|
|
|
- self._alarm_hour = alarm_time["hour"]
|
|
|
- self._alarm_minute = alarm_time["minute"]
|
|
|
-
|
|
|
- def _save_alarm_time(self) -> None:
|
|
|
- with open(_ALARM_TIME_PATH, "w") as alarm_time_file:
|
|
|
- json.dump(
|
|
|
- {"hour": self._alarm_hour, "minute": self._alarm_minute},
|
|
|
- alarm_time_file,
|
|
|
- )
|
|
|
-
|
|
|
def _reschedule_sleep(self, interrupt: bool) -> None:
|
|
|
if interrupt:
|
|
|
self._wait_for_sleep_start_time_update = True
|
|
@@ -107,9 +126,9 @@ class App:
|
|
|
micropython.schedule(lambda n: self._configure_alarm_timer(), None)
|
|
|
|
|
|
def _configure_alarm_timer(self) -> None:
|
|
|
- seconds_until_alarm = (self._alarm_daytime - _get_current_daytime() - 1) % (
|
|
|
- 24 * 60 * 60
|
|
|
- ) + 1
|
|
|
+ seconds_until_alarm = (
|
|
|
+ self._alarm_time.daytime - _get_current_daytime() - 1
|
|
|
+ ) % (24 * 60 * 60) + 1
|
|
|
print("alarm in ", seconds_until_alarm / 60, " min")
|
|
|
|
|
|
self._alarm_timer.init(
|
|
@@ -121,26 +140,24 @@ class App:
|
|
|
def _update_alarm_time(self, event_arg: None) -> None:
|
|
|
|
|
|
self._alarm_hour_text_box.setText(
|
|
|
- "{:02d}".format(self._alarm_hour)
|
|
|
+ "{:02d}".format(self._alarm_time.hour)
|
|
|
)
|
|
|
self._alarm_minute_text_box.setText(
|
|
|
- "{:02d}".format(self._alarm_minute)
|
|
|
+ "{:02d}".format(self._alarm_time.minute)
|
|
|
)
|
|
|
- self._save_alarm_time()
|
|
|
+ self._alarm_time.save(_ALARM_TIME_PATH)
|
|
|
self._configure_alarm_timer()
|
|
|
|
|
|
def _button_b_pressed(self) -> None:
|
|
|
self._reschedule_sleep(interrupt=True)
|
|
|
if self._menu_position == 1:
|
|
|
- self._alarm_hour += 1
|
|
|
+ self._alarm_time.shift_hour(1)
|
|
|
elif self._menu_position == 2:
|
|
|
- self._alarm_hour -= 1
|
|
|
+ self._alarm_time.shift_hour(-1)
|
|
|
elif self._menu_position == 3:
|
|
|
- self._alarm_minute += 1
|
|
|
+ self._alarm_time.shift_minute(1)
|
|
|
elif self._menu_position == 4:
|
|
|
- self._alarm_minute -= 1
|
|
|
- self._alarm_hour %= 24
|
|
|
- self._alarm_minute %= 60
|
|
|
+ self._alarm_time.shift_minute(-1)
|
|
|
micropython.schedule(self._update_alarm_time, None)
|
|
|
|
|
|
@staticmethod
|
|
@@ -164,15 +181,12 @@ class App:
|
|
|
)
|
|
|
|
|
|
def _setup_alarm(self) -> None:
|
|
|
- if not utils.exists(_ALARM_TIME_PATH):
|
|
|
- self._alarm_hour = self._alarm_minute = 0
|
|
|
- self._save_alarm_time()
|
|
|
- else:
|
|
|
- self._load_alarm_time()
|
|
|
+ if utils.exists(_ALARM_TIME_PATH):
|
|
|
+ self._alarm_time.load(_ALARM_TIME_PATH)
|
|
|
self._alarm_hour_text_box = m5ui.M5TextBox(
|
|
|
_SCREEN_WIDTH // 2,
|
|
|
_LEFT_PADDING,
|
|
|
- "{:02d}".format(self._alarm_hour),
|
|
|
+ "{:02d}".format(self._alarm_time.hour),
|
|
|
_LARGE_FONT,
|
|
|
_DEFAULT_FONT_COLOR,
|
|
|
rotate=90,
|
|
@@ -188,7 +202,7 @@ class App:
|
|
|
self._alarm_minute_text_box = m5ui.M5TextBox(
|
|
|
_SCREEN_WIDTH // 2,
|
|
|
_LEFT_PADDING + 66,
|
|
|
- "{:02d}".format(self._alarm_minute),
|
|
|
+ "{:02d}".format(self._alarm_time.minute),
|
|
|
_LARGE_FONT,
|
|
|
_DEFAULT_FONT_COLOR,
|
|
|
rotate=90,
|