From 807bab8f259dfac0dafa971c7663e0e54b871cf1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 30 Dec 2025 18:53:30 +0100 Subject: [PATCH] Refactor forwarder and implement clock service --- api/mosquitto/data/mosquitto.db | Bin 164 -> 164 bytes rpi/broker_starter.py | 50 -------------------- rpi/controllers/mqtt_forwarder.py | 6 +-- rpi/hardware/screen/screen.py | 1 - rpi/main.py | 76 +++++++++++++++++++++--------- rpi/models/clock.py | 28 +++++++++-- rpi/services/clock_service.py | 55 +++++++++++++++++++++ rpi/services/forwarder_service.py | 37 +++++++++++++++ 8 files changed, 171 insertions(+), 82 deletions(-) delete mode 100644 rpi/broker_starter.py create mode 100644 rpi/services/clock_service.py create mode 100644 rpi/services/forwarder_service.py diff --git a/api/mosquitto/data/mosquitto.db b/api/mosquitto/data/mosquitto.db index e2c978b7822645ef18c9a0801710103403dcbf23..6c634b9963c6cdf2c37d29f670dccd6fdc8864fb 100644 GIT binary patch delta 12 TcmZ3&xP) None: self.millis = value * 1000 self.increment = increment * 1000 @@ -14,8 +22,6 @@ class Clock: self.thread = threading.Thread(target=self._update_clock, daemon=True) - # ---------- time computation ---------- - def _compute_seconds(self) -> int: return (self.millis // 1000) % 60 @@ -25,8 +31,6 @@ class Clock: def _add_increment(self) -> None: self.millis += self.increment - # ---------- thread logic ---------- - def _update_clock(self): while not self._terminate_event.is_set(): self._run_event.wait() @@ -35,12 +39,26 @@ class Clock: if self.millis <= 0: self.millis = 0 self._run_event.clear() + self.__notify_update() break self.millis -= 1 + self.__notify_update() time.sleep(0.001) - # ---------- public API ---------- + + def __notify_update(self): + self.on_update(self.clock_to_str()) + + def __notify_terminated(self): + self.on_terminated() + + def set_on_update(self, callback : Callable[[str], None]): + self.on_update = callback + + def set_on_terminated(self, callback: Callable[[], None]): + self.on_terminated = callback + def is_running(self) -> bool: return self._run_event.is_set() diff --git a/rpi/services/clock_service.py b/rpi/services/clock_service.py new file mode 100644 index 00000000..d1f9b016 --- /dev/null +++ b/rpi/services/clock_service.py @@ -0,0 +1,55 @@ +from typing import Callable + +from hardware.screen.screen import Screen +from models.clock import Clock + +class ClockService: + + screen : Screen + white_clock : Clock + black_clock : Clock + + on_terminated : Callable[[], None] + + def __init__(self): + self.screen = Screen() + self.screen.enableBackground() + self.screen.displayMessage("Waiting for start...") + + def start(self, time_control : int, increment : int ): + self.white_clock = self.__init_clock(time_control, increment) + self.black_clock = self.__init_clock(time_control, increment) + + self.white_clock.start() + + def stop(self): + self.white_clock.stop() + self.black_clock.stop() + + def switch(self): + if self.white_clock.is_running(): + self.white_clock.stop() + self.black_clock.start() + + elif self.black_clock.is_running(): + self.black_clock.stop() + self.white_clock.start() + + def set_on_terminated(self, callback : Callable[[], None]): + self.on_terminated = callback + + def __init_clock(self, time_control : int, increment : int) -> Clock: + clock = Clock(time_control, increment) + clock.set_on_update(self.__tick) + clock.set_on_terminated(self.__terminate) + return clock + + def __tick(self, formatted_time : str) -> None: + self.__update_screen(formatted_time) + + def __terminate(self) -> None: + self.__update_screen("Time is over !") + self.on_terminated() + + def __update_screen(self, message : str) -> None: + self.screen.displayMessage(message) \ No newline at end of file diff --git a/rpi/services/forwarder_service.py b/rpi/services/forwarder_service.py new file mode 100644 index 00000000..2c2becaa --- /dev/null +++ b/rpi/services/forwarder_service.py @@ -0,0 +1,37 @@ +import os + +from dotenv import load_dotenv + +from controllers.mqtt_forwarder import MQTTForwarder +from services.mqtt_service import MQTTService + + +class ForwarderService: + + src_broker_service: MQTTService + dst_broker_service: MQTTService + forwards: dict[MQTTForwarder, tuple[str, str]] + + def __init__(self, src_broker: MQTTService, dst_broker: MQTTService): + self.src_broker_service = src_broker + self.dst_broker_service = dst_broker + self.forwards = {} + + def register_forwarder(self, client_id: str, src_topic: str, dst_topic: str) -> None: + forwarder = MQTTForwarder( + client_id, + self.src_broker_service, + self.dst_broker_service + ) + self.forwards[forwarder] = (src_topic, dst_topic) + + def start_all(self): + self.src_broker_service.connect() + self.dst_broker_service.connect() + + for forwarder, (src_topic, dst_topic) in self.forwards.items(): + forwarder.start(src_topic, dst_topic) + + def stop_all(self): + self.src_broker_service.disconnect() + self.dst_broker_service.disconnect()