use std::collections::BTreeMap;
use async_trait::async_trait;
use rmpv::Value;
use super::{Bus, DriverResult, SampleStream};
#[derive(Debug, Clone, PartialEq)]
pub struct EscCandidate {
pub driver_id: String,
pub device_id: String,
pub label: String,
pub bus: Bus,
pub motor_count: u8,
pub vid_pid: Option<(u16, u16)>,
pub metadata: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct EscCapabilities {
pub protocol: String,
pub motor_count: u8,
pub has_rpm: bool,
pub has_temperature: bool,
pub has_voltage: bool,
pub has_current: bool,
pub update_hz: f32,
}
#[derive(Debug, Clone, PartialEq)]
pub struct EscTelemetry {
pub timestamp_ns: i64,
pub motor_index: u8,
pub rpm: f32,
pub temp_c: f32,
pub voltage_v: f32,
pub current_a: f32,
pub throttle_pct: f32,
pub metadata: BTreeMap<String, Value>,
}
#[async_trait]
pub trait EscDriver: Send + Sync {
type Session: Send + Sync;
async fn discover(&self) -> DriverResult<Vec<EscCandidate>>;
async fn open(
&self,
candidate: &EscCandidate,
config: &BTreeMap<String, Value>,
) -> DriverResult<Self::Session>;
async fn close(&self, session: Self::Session) -> DriverResult<()>;
fn capabilities(&self, session: &Self::Session) -> EscCapabilities;
async fn telemetry_iterator(
&self,
session: &Self::Session,
) -> DriverResult<SampleStream<EscTelemetry>>;
}