use crate::flags::MotorCommand;
use asyn_rs::interfaces::motor::MotorStatus;
use std::sync::{Arc, Mutex};
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct StampedStatus {
pub seq: u64,
pub status: MotorStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum PollDirective {
#[default]
None,
Start,
Stop,
}
#[derive(Debug, Clone)]
pub struct DelayRequest {
pub id: u64,
pub duration: Duration,
}
#[derive(Debug, Default)]
pub struct DeviceActions {
pub commands: Vec<MotorCommand>,
pub poll: PollDirective,
pub schedule_delay: Option<DelayRequest>,
pub status_refresh: bool,
}
#[derive(Debug)]
pub struct MotorDeviceState {
pub latest_status: Option<StampedStatus>,
pub expired_delay_id: Option<u64>,
pub pending_actions: Option<DeviceActions>,
}
impl Default for MotorDeviceState {
fn default() -> Self {
Self {
latest_status: None,
expired_delay_id: None,
pending_actions: None,
}
}
}
pub type SharedDeviceState = Arc<Mutex<MotorDeviceState>>;
pub fn new_shared_state() -> SharedDeviceState {
Arc::new(Mutex::new(MotorDeviceState::default()))
}