use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::authority::Operation;
use crate::sensor::SignedSensorReading;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Command {
pub timestamp: DateTime<Utc>,
pub source: String,
pub sequence: u64,
pub joint_states: Vec<JointState>,
pub delta_time: f64,
#[serde(default)]
pub end_effector_positions: Vec<EndEffectorPosition>,
#[serde(default)]
pub center_of_mass: Option<[f64; 3]>,
pub authority: CommandAuthority,
#[serde(default)]
pub metadata: HashMap<String, String>,
#[serde(default)]
pub locomotion_state: Option<LocomotionState>,
#[serde(default)]
pub end_effector_forces: Vec<EndEffectorForce>,
#[serde(default)]
pub estimated_payload_kg: Option<f64>,
#[serde(default)]
pub signed_sensor_readings: Vec<SignedSensorReading>,
#[serde(default)]
pub zone_overrides: HashMap<String, bool>,
#[serde(default)]
pub environment_state: Option<EnvironmentState>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnvironmentState {
#[serde(default)]
pub imu_pitch_rad: Option<f64>,
#[serde(default)]
pub imu_roll_rad: Option<f64>,
#[serde(default)]
pub actuator_temperatures: Vec<ActuatorTemperature>,
#[serde(default)]
pub battery_percentage: Option<f64>,
#[serde(default)]
pub communication_latency_ms: Option<f64>,
#[serde(default)]
pub e_stop_engaged: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ActuatorTemperature {
pub joint_name: String,
pub temperature_celsius: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LocomotionState {
pub base_velocity: [f64; 3],
pub heading_rate: f64,
pub feet: Vec<FootState>,
pub step_length: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FootState {
pub name: String,
pub position: [f64; 3],
pub contact: bool,
#[serde(default)]
pub ground_reaction_force: Option<[f64; 3]>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JointState {
pub name: String,
pub position: f64,
pub velocity: f64,
pub effort: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EndEffectorPosition {
pub name: String,
pub position: [f64; 3],
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CommandAuthority {
pub pca_chain: String,
pub required_ops: Vec<Operation>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EndEffectorForce {
pub name: String,
pub force: [f64; 3],
pub torque: [f64; 3],
#[serde(default)]
pub grasp_force: Option<f64>,
}