Files
autopilot/crates/shared/src/models/poi.rs
T
Oleksandr Bezdieniezhnykh e56d428753 [AZ-649] [AZ-674] [AZ-667] telemetry + vlm schema + mapobjects hydrate batch 6
AZ-649 mission_executor telemetry forwarding:
- shared::models::telemetry::UavTelemetry canonical model
- TelemetryForwarder with atomic ArcSwap snapshot + 3 lossy
  tokio::sync::broadcast channels (MissionExecutor, ScanController,
  MavlinkUplink) + per-consumer drop counters
- MavlinkProjection::from_mavlink for HEARTBEAT/GLOBAL_POSITION_INT/
  ATTITUDE/SYS_STATUS
- spawn_mavlink_pump bridges mavlink_layer into the forwarder at the
  binary edge

AZ-674 vlm_client schema validation + model_version tracking:
- AssessmentParser owns schema validation + model-version state
- wire::read_response_raw splits raw bytes from parsing so invalid
  payloads can be logged size-capped
- VlmStatus gains an Inconclusive variant; exhaustive-match test
  guards downstream consumers
- VlmPipelineStatus mirrors the new variant in shared::models::poi

AZ-667 mapobjects_store hydrate + pending logs + cascade:
- SyncState enum aligned with description.md (FreshBoot, Synced,
  CachedFallback, Degraded, Failed)
- Store::hydrate(MapObjectsBundle) replaces in-memory map atomically;
  freshness=Stale -> CachedFallback
- classify() + end_of_pass append MapObjectObservation events to
  pending_observations (New/Moved/Existing/RemovedCandidate)
- apply_decline + LocalAppended ignored items append to pending_ignored
- drain_pending() returns and clears both logs
- cascade_mission(id) purges by_cell + IgnoredSet + pending logs
- Health surface reports sync_state, pending_obs, pending_ign

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 17:40:43 +03:00

52 lines
1.3 KiB
Rust

//! `POI` — per `data_model.md §3 Decision entities`.
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use super::tier2::Tier2Evidence;
use super::vlm::VlmStatus;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VlmPipelineStatus {
NotRequested,
Pending,
Ok,
Inconclusive,
Timeout,
SchemaInvalid,
IpcError,
Disabled,
}
impl From<VlmStatus> for VlmPipelineStatus {
fn from(s: VlmStatus) -> Self {
match s {
VlmStatus::Ok => Self::Ok,
VlmStatus::Inconclusive => Self::Inconclusive,
VlmStatus::Timeout => Self::Timeout,
VlmStatus::SchemaInvalid => Self::SchemaInvalid,
VlmStatus::IpcError => Self::IpcError,
VlmStatus::Disabled => Self::Disabled,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Poi {
pub id: Uuid,
pub confidence: f32,
pub mgrs: String,
pub class: String,
pub class_group: String,
pub source_detection_ids: Vec<Uuid>,
pub enqueued_at: DateTime<Utc>,
pub priority: f32,
pub decline_suppressed: bool,
pub vlm_status: VlmPipelineStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub tier2_evidence: Option<Tier2Evidence>,
pub deadline: DateTime<Utc>,
}