Просмотр исходного кода

refactor: split class _AlarmTime from App

Fabian Peter Hammerle 2 лет назад
Родитель
Сommit
670d672343
1 измененных файлов с 52 добавлено и 38 удалено
  1. 52 38
      vibrating_alarm_m5stickc.py

+ 52 - 38
vibrating_alarm_m5stickc.py

@@ -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:
     # pylint: disable=too-few-public-methods,too-many-instance-attributes
     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  # type: ignore
-
-    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")
         # TODO configure wake from sleep
         self._alarm_timer.init(  # type: ignore
@@ -121,26 +140,24 @@ class App:
     def _update_alarm_time(self, event_arg: None) -> None:
         # pylint: disable=unused-argument; callback
         self._alarm_hour_text_box.setText(  # type: ignore
-            "{:02d}".format(self._alarm_hour)  # type: ignore
+            "{:02d}".format(self._alarm_time.hour)
         )
         self._alarm_minute_text_box.setText(  # type: ignore
-            "{:02d}".format(self._alarm_minute)  # type: ignore
+            "{: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  # type: ignore
+            self._alarm_time.shift_hour(1)
         elif self._menu_position == 2:
-            self._alarm_hour -= 1  # type: ignore
+            self._alarm_time.shift_hour(-1)
         elif self._menu_position == 3:
-            self._alarm_minute += 1  # type: ignore
+            self._alarm_time.shift_minute(1)
         elif self._menu_position == 4:
-            self._alarm_minute -= 1  # type: ignore
-        self._alarm_hour %= 24  # type: ignore
-        self._alarm_minute %= 60  # type: ignore
+            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  # type: ignore
-            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),  # type: ignore
+            "{: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),  # type: ignore
+            "{:02d}".format(self._alarm_time.minute),
             _LARGE_FONT,
             _DEFAULT_FONT_COLOR,
             rotate=90,