feat(k1): complete primary acquisition lifecycle
This commit is contained in:
@@ -24,6 +24,12 @@ class MetricsSnapshot(TypedDict):
|
||||
mqtt_to_publish_p95_ms: float | None
|
||||
decode_publish_ms: float | None
|
||||
trajectory_poses: int
|
||||
device_elapsed_seconds: float | None
|
||||
device_route_distance_meters: float | None
|
||||
device_speed_meters_per_second: float | None
|
||||
device_pgo_progress: int | None
|
||||
modeling_reports: int
|
||||
modeling_decode_errors: int
|
||||
|
||||
|
||||
class BridgeMetrics:
|
||||
@@ -44,6 +50,12 @@ class BridgeMetrics:
|
||||
self._pose_times: deque[int] = deque()
|
||||
self._latencies_ms: deque[float] = deque(maxlen=512)
|
||||
self._decode_publish_ms: float | None = None
|
||||
self._device_elapsed_seconds: float | None = None
|
||||
self._device_route_distance_meters: float | None = None
|
||||
self._device_speed_meters_per_second: float | None = None
|
||||
self._device_pgo_progress: int | None = None
|
||||
self._modeling_reports = 0
|
||||
self._modeling_decode_errors = 0
|
||||
|
||||
def received(self, payload_bytes: int) -> None:
|
||||
with self._lock:
|
||||
@@ -81,6 +93,33 @@ class BridgeMetrics:
|
||||
with self._lock:
|
||||
self._preview_dropped += 1
|
||||
|
||||
def acquisition_telemetry(
|
||||
self,
|
||||
*,
|
||||
elapsed_seconds: float,
|
||||
route_distance_meters: float,
|
||||
speed_meters_per_second: float,
|
||||
pgo_progress: int,
|
||||
) -> None:
|
||||
values = (elapsed_seconds, route_distance_meters, speed_meters_per_second)
|
||||
if any(not math.isfinite(value) or value < 0 for value in values):
|
||||
return
|
||||
if pgo_progress < 0:
|
||||
return
|
||||
with self._lock:
|
||||
self._device_elapsed_seconds = elapsed_seconds
|
||||
# This is the device's current scan generation. FW 3.0.2 resets
|
||||
# ScanTime and MoveDistance together; carrying an earlier project's
|
||||
# route across that boundary would be false precision.
|
||||
self._device_route_distance_meters = route_distance_meters
|
||||
self._device_speed_meters_per_second = speed_meters_per_second
|
||||
self._device_pgo_progress = pgo_progress
|
||||
self._modeling_reports += 1
|
||||
|
||||
def modeling_decode_error(self) -> None:
|
||||
with self._lock:
|
||||
self._modeling_decode_errors += 1
|
||||
|
||||
def snapshot(self) -> MetricsSnapshot:
|
||||
now_ns = time.monotonic_ns()
|
||||
with self._lock:
|
||||
@@ -106,6 +145,12 @@ class BridgeMetrics:
|
||||
"mqtt_to_publish_p95_ms": _rounded(p95),
|
||||
"decode_publish_ms": _rounded(self._decode_publish_ms),
|
||||
"trajectory_poses": self._trajectory_poses,
|
||||
"device_elapsed_seconds": _rounded(self._device_elapsed_seconds),
|
||||
"device_route_distance_meters": _rounded(self._device_route_distance_meters),
|
||||
"device_speed_meters_per_second": _rounded(self._device_speed_meters_per_second),
|
||||
"device_pgo_progress": self._device_pgo_progress,
|
||||
"modeling_reports": self._modeling_reports,
|
||||
"modeling_decode_errors": self._modeling_decode_errors,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user