Rework radar system

This commit is contained in:
Ayzen
2026-10-06 12:32:26 +03:00
parent 552cdc688a
commit 5bb86b7165
299 changed files with 13537 additions and 27763 deletions
+21 -25
View File
@@ -3,11 +3,12 @@
from __future__ import annotations
from dataclasses import dataclass, field
from collections.abc import Callable
import time
from typing import TYPE_CHECKING
from python_app.hardware_full.switch_drivers import (
H7992Driver,
HMC349ADriver,
MockSwitchDriver,
SwitchDriverProtocol,
)
@@ -23,11 +24,9 @@ class SwitchService:
name: str
positions: int
mode: str = "mock"
driver: str = "h7992"
gpio_chip: str = "/dev/gpiochip0"
pin_a: int = 17
pin_b: int = 27
invert_logic: bool = False
default_position: int = 0
_driver: SwitchDriverProtocol = field(init=False, repr=False)
@@ -46,11 +45,9 @@ class SwitchService:
name=model.name,
positions=model.positions,
mode=model.driver_mode,
driver=model.driver,
gpio_chip=model.gpio_chip,
pin_a=model.pin_a,
pin_b=model.pin_b,
invert_logic=model.invert_logic,
default_position=model.default_position,
)
@@ -78,7 +75,6 @@ class SwitchService:
def _build_driver(self) -> SwitchDriverProtocol:
"""Instantiate concrete driver according to configured mode and driver kind."""
mode = self.mode.strip().lower()
driver_kind = self.driver.strip().lower()
if mode == "mock":
return MockSwitchDriver(
@@ -90,23 +86,23 @@ class SwitchService:
if mode != "native":
raise RuntimeError(f"Unsupported switch mode: {self.mode}")
if driver_kind == "h7992":
return H7992Driver(
name=self.name,
positions=self.positions,
default_position=self.default_position,
gpio_chip=self.gpio_chip,
pin_a=self.pin_a,
pin_b=self.pin_b,
)
if driver_kind == "hmc349a":
return HMC349ADriver(
name=self.name,
positions=self.positions,
default_position=self.default_position,
gpio_chip=self.gpio_chip,
pin_a=self.pin_a,
invert_logic=self.invert_logic,
)
return H7992Driver(
name=self.name,
positions=self.positions,
default_position=self.default_position,
gpio_chip=self.gpio_chip,
pin_a=self.pin_a,
pin_b=self.pin_b,
)
raise RuntimeError(f"Unsupported switch driver: {self.driver}")
def select_and_settle(
output_switch: SwitchDriverProtocol | None, input_switch: SwitchDriverProtocol | None,
output: int, input: int, settling_ms: int, *, wait: Callable[[float], object] = time.sleep,
) -> bool:
"""Drive both switches and settle; return False when an interruptible wait stops."""
if output_switch is not None:
output_switch.switch_to(output)
if input_switch is not None:
input_switch.switch_to(input)
return not (settling_ms > 0 and wait(settling_ms / 1000.0))