From 6a73b7622d12514212f3e9fff8b9173759b35bc9 Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Wed, 29 Jul 2026 17:30:43 +0100 Subject: [PATCH] Moved state to mutable dataclass --- main.py | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/main.py b/main.py index 0975ba2..3ff3638 100644 --- a/main.py +++ b/main.py @@ -23,12 +23,19 @@ class DiskEvent: DiskState = Literal["disconnected", "pairing", "connecting", "connected"] -def onButtonPressed(diskState: DiskState) -> None: - diskState = "pairing" +@dataclass +class AppState: + stopEvent = Event() + diskEventQueue: Queue[DiskEvent] = Queue() + diskState: DiskState = "disconnected" + + +def onButtonPressed(state: AppState) -> None: + state.diskState = "pairing" print("Changing disk state") -def diskPollWorker(stopEvent: Event, eventQueue: Queue) -> None: +def diskPollWorker(state) -> None: context = pyudev.Context() monitor = pyudev.Monitor.from_netlink(context) @@ -38,7 +45,7 @@ def diskPollWorker(stopEvent: Event, eventQueue: Queue) -> None: for device in iter(monitor.poll, None): if device.action == "add" and device.device_type == "disk": - eventQueue.put( + state.diskEventQueue.put( DiskEvent( event="connected", node=f"{device.device_node}", @@ -47,7 +54,7 @@ def diskPollWorker(stopEvent: Event, eventQueue: Queue) -> None: ) elif device.action == "remove" and device.device_type == "disk": - eventQueue.put( + state.diskEventQueue.put( DiskEvent( event="disconnected", node=f"{device.device_node}", @@ -55,32 +62,32 @@ def diskPollWorker(stopEvent: Event, eventQueue: Queue) -> None: ) ) - if stopEvent.is_set(): + if state.stopEvent.is_set(): return -def ledWorker(stopEvent: Event, diskState: DiskState) -> None: +def ledWorker(state: AppState) -> None: yellowCtr = 0 previousState: DiskState | None = None - while not stopEvent.is_set(): - if diskState != previousState: + while not state.stopEvent.is_set(): + if state.diskState != previousState: yellowCtr = 0 - previousState = diskState + previousState = state.diskState - if diskState == "disconnected": + if state.diskState == "disconnected": yellow.off() - elif diskState == "connected": + elif state.diskState == "connected": yellow.on() - elif diskState == "pairing": + elif state.diskState == "pairing": if yellowCtr % 2 == 0: yellow.on() else: yellow.off() - elif diskState == "connecting": + elif state.diskState == "connecting": if yellowCtr % 4 < 2: yellow.on() else: @@ -88,20 +95,18 @@ def ledWorker(stopEvent: Event, diskState: DiskState) -> None: yellowCtr += 1 - stopEvent.wait(0.25) + state.stopEvent.wait(0.25) def main() -> None: try: - stopEvent = Event() - diskEventQueue: Queue[DiskEvent] = Queue() - diskState: DiskState = "disconnected" - button.when_activated = partial(onButtonPressed, diskState) + state = AppState() + button.when_activated = partial(onButtonPressed, state) diskPollThread = Thread( target=diskPollWorker, name="disk_poll_thread", - args=(stopEvent, diskEventQueue), + args=(state), daemon=True, ) @@ -110,7 +115,7 @@ def main() -> None: ledThread = Thread( target=ledWorker, name="led_thread", - args=(stopEvent, diskState), + args=(state), daemon=True, ) @@ -118,13 +123,13 @@ def main() -> None: while True: try: - event = diskEventQueue.get_nowait() + event = state.diskEventQueue.get_nowait() print(event) except Empty: sleep(1) finally: - stopEvent.set() + state.stopEvent.set() return