feat(fleet): add board observation center with live sources and maps

Add adaptive per-vehicle layouts, full-panel dragging, source controls and automatic preview recovery for RealSense, Insta360 X4 and XGRIDS K1 observation views. Integrate cached Cesium map layers through the private NAS gateway link, retain bounded sensor command receipts, and document validation and operational handoff.
This commit is contained in:
DCCONSTRUCTIONS
2026-09-10 22:12:05 +03:00
parent 5f75afb720
commit be58d589e2
48 changed files with 1575 additions and 83 deletions
+68
View File
@@ -0,0 +1,68 @@
import copy
import threading
import time
from datetime import UTC, datetime, timedelta
from uuid import uuid4
import pytest
from k1link.fleet import sensors
from k1link.fleet.trust import PairingError
class Fleet:
def __init__(self):
self.lock = threading.RLock()
self.row = {"sensor_state": {"items": [{"id": "synthetic-camera", "snapshot": {"context": {"session_id": "synthetic-session"}}}]}}
def find(self, _):
return self.row
def public(self, _):
return {"connectivity": "online"}
def save(self, _):
pass
def request():
now = datetime.now(UTC)
identifier = "op_" + uuid4().hex
return {"api_version": "missioncore.nodedc/plugin-sdk/v0alpha2", "kind": "OperationRequest", "operation_id": identifier, "idempotency_key": identifier, "session": {"device_id": "synthetic-camera", "session_id": "synthetic-session"}, "requested_at": now.isoformat(), "deadline_at": (now + timedelta(seconds=60)).isoformat(), "action_id": "preview.stop", "parameters": {}}
def test_completed_viewing_receipts_do_not_block_stop_and_remain_idempotent():
fleet = Fleet()
for _ in range(32):
value = request()
receipt = sensors.submit(fleet, "vehicle", value)
receipt["state"] = "complete"
assert sensors.submit(fleet, "vehicle", value) is receipt
assert sensors.submit(fleet, "vehicle", request())["state"] == "queued"
def test_pending_commands_still_have_the_original_32_slot_limit():
fleet = Fleet()
for _ in range(32):
sensors.submit(fleet, "vehicle", request())
with pytest.raises(PairingError, match="Слишком много"):
sensors.submit(fleet, "vehicle", request())
def test_receipt_storage_is_bounded_and_only_expired_terminal_receipts_are_reclaimable():
fleet = Fleet()
for _ in range(sensors.MAX_COMMAND_RECEIPTS):
value = request()
receipt = sensors.submit(fleet, "vehicle", value)
receipt["state"] = "complete"
with pytest.raises(PairingError, match="Слишком много"):
sensors.submit(fleet, "vehicle", request())
expired = next(iter(fleet.row["sensor_commands"].values()))
expired["command"]["requested_at"] = (datetime.now(UTC) - timedelta(seconds=61)).isoformat()
expired["command"]["deadline_at"] = (datetime.now(UTC) - timedelta(seconds=1)).isoformat()
expired["updated_at"] = time.time() - 60
replay = copy.deepcopy(expired["command"])
sensors.submit(fleet, "vehicle", request())
assert len(fleet.row["sensor_commands"]) == sensors.MAX_COMMAND_RECEIPTS
with pytest.raises(PairingError, match="Срок команды"):
sensors.submit(fleet, "vehicle", replay)