use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct State {
pub active_source: Option<MotionSource>,
pub selected: Option<crate::api::drive::v1::Target>,
pub reason: Option<MotionReason>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct ManualCommand {
pub linear_x_mps: f64,
pub angular_z_radps: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MotionSource {
Manual,
Follow,
MissionStop,
Recovery,
EmergencyStop,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MotionReason {
SafetyEmergencyStop,
ManualEscapeUnderStop,
SafetyConstrained(crate::api::safety::v1::SafetyDecision),
NoFollowTarget,
FollowTargetStale,
SafetyAuthorizationUnavailable,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Arbitration {
pub candidates: Vec<ArbitrationCandidate>,
pub selected_source: Option<MotionSource>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArbitrationCandidate {
pub source: MotionSource,
pub target: Option<crate::api::drive::v1::Target>,
pub accepted: bool,
pub reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceFreshness {
pub sources: Vec<SourceStatus>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceStatus {
pub source: MotionSource,
pub fresh: bool,
pub reason: Option<String>,
}