updates
This commit is contained in:
@@ -6,6 +6,7 @@ from dataclasses import dataclass
|
||||
from h8536.bench_connect_lcd import BenchLogger, format_frame
|
||||
|
||||
from .frames import ACTIVE_SEED_COMMAND0
|
||||
from .modules import CcuModule, ModuleDecision
|
||||
from .policy import AckPolicy
|
||||
from .refresh import PeriodicRefresh
|
||||
from .serial_link import RxFrame, SerialLink
|
||||
@@ -16,6 +17,7 @@ class CcuStats:
|
||||
rx_frames: int = 0
|
||||
tx_frames: int = 0
|
||||
ack_frames: int = 0
|
||||
module_frames: int = 0
|
||||
seed_frames: int = 0
|
||||
refresh_frames: int = 0
|
||||
started_at: float = 0.0
|
||||
@@ -48,12 +50,14 @@ class CcuEmulator:
|
||||
config: CcuConfig | None = None,
|
||||
ack_policy: AckPolicy | None = None,
|
||||
refresh: PeriodicRefresh | None = None,
|
||||
modules: tuple[CcuModule, ...] = (),
|
||||
) -> None:
|
||||
self.link = link
|
||||
self.logger = logger
|
||||
self.config = config or CcuConfig()
|
||||
self.ack_policy = ack_policy or AckPolicy()
|
||||
self.refresh = refresh or PeriodicRefresh()
|
||||
self.modules = modules
|
||||
self.stats = CcuStats()
|
||||
|
||||
def run(self, duration: float) -> CcuStats:
|
||||
@@ -61,7 +65,7 @@ class CcuEmulator:
|
||||
self.logger.event(
|
||||
"CCU_START "
|
||||
f"duration={duration:.3f}s seed_frames={len(self.config.seed_frames)} "
|
||||
f"ack={format_frame(self.ack_policy.ack_frame)}"
|
||||
f"ack={format_frame(self.ack_policy.ack_frame)} modules={len(self.modules)}"
|
||||
)
|
||||
self._wait_ready()
|
||||
self._send_seed_frames()
|
||||
@@ -115,6 +119,9 @@ class CcuEmulator:
|
||||
def _service_rx(self) -> None:
|
||||
for item in self.link.read_available():
|
||||
self._record_rx(item)
|
||||
suppress_default_ack = self._service_modules(item)
|
||||
if suppress_default_ack:
|
||||
continue
|
||||
decision = self.ack_policy.decide(item.frame, item.label)
|
||||
if not decision.should_ack:
|
||||
self.logger.event(f"ACK_SKIP reason={decision.reason} frame={format_frame(item.frame)}")
|
||||
@@ -125,6 +132,28 @@ class CcuEmulator:
|
||||
self.stats.ack_frames += 1
|
||||
self.stats.tx_frames += 1
|
||||
|
||||
def _service_modules(self, item: RxFrame) -> bool:
|
||||
suppress_default_ack = False
|
||||
for module in self.modules:
|
||||
decision = module.on_rx(item.frame, item.label)
|
||||
if decision is None:
|
||||
continue
|
||||
if decision.reason:
|
||||
self.logger.event(
|
||||
f"MODULE {module.name} reason={decision.reason} frame={format_frame(item.frame)}"
|
||||
)
|
||||
self._send_module_decision(decision)
|
||||
suppress_default_ack = suppress_default_ack or decision.suppress_default_ack
|
||||
return suppress_default_ack
|
||||
|
||||
def _send_module_decision(self, decision: ModuleDecision) -> None:
|
||||
for tx in decision.tx:
|
||||
if tx.delay > 0:
|
||||
time.sleep(tx.delay)
|
||||
self.link.send(tx.frame, tx.label)
|
||||
self.stats.module_frames += 1
|
||||
self.stats.tx_frames += 1
|
||||
|
||||
def _service_refresh(self) -> None:
|
||||
for frame in self.refresh.due_frames():
|
||||
self.link.send(frame, "refresh")
|
||||
@@ -141,6 +170,7 @@ class CcuEmulator:
|
||||
self.logger.emit(f"rx_frames={self.stats.rx_frames}")
|
||||
self.logger.emit(f"tx_frames={self.stats.tx_frames}")
|
||||
self.logger.emit(f"ack_frames={self.stats.ack_frames}")
|
||||
self.logger.emit(f"module_frames={self.stats.module_frames}")
|
||||
self.logger.emit(f"seed_frames={self.stats.seed_frames}")
|
||||
self.logger.emit(f"refresh_frames={self.stats.refresh_frames}")
|
||||
self.logger.emit(f"resync_events={self.link.detector.resync_events}")
|
||||
|
||||
Reference in New Issue
Block a user