use heapless::{FnvIndexMap, String};
use serde::Deserialize;
use super::motor::MotorConfig;
use super::trajectory::{TrajectoryConfig, WaypointTrajectory};
#[derive(Debug, Clone, Deserialize)]
pub struct SystemConfig {
pub motors: FnvIndexMap<String<32>, MotorConfig, 8>,
#[serde(default)]
pub trajectories: FnvIndexMap<String<32>, TrajectoryConfig, 64>,
#[serde(default)]
pub sequences: FnvIndexMap<String<32>, WaypointTrajectory, 16>,
}
impl SystemConfig {
pub fn motor(&self, name: &str) -> Option<&MotorConfig> {
self.motors
.iter()
.find(|(k, _)| k.as_str() == name)
.map(|(_, v)| v)
}
pub fn trajectory(&self, name: &str) -> Option<&TrajectoryConfig> {
self.trajectories
.iter()
.find(|(k, _)| k.as_str() == name)
.map(|(_, v)| v)
}
pub fn sequence(&self, name: &str) -> Option<&WaypointTrajectory> {
self.sequences
.iter()
.find(|(k, _)| k.as_str() == name)
.map(|(_, v)| v)
}
pub fn motor_names(&self) -> impl Iterator<Item = &str> {
self.motors.keys().map(|s| s.as_str())
}
pub fn trajectory_names(&self) -> impl Iterator<Item = &str> {
self.trajectories.keys().map(|s| s.as_str())
}
pub fn sequence_names(&self) -> impl Iterator<Item = &str> {
self.sequences.keys().map(|s| s.as_str())
}
}
impl Default for SystemConfig {
fn default() -> Self {
Self {
motors: FnvIndexMap::new(),
trajectories: FnvIndexMap::new(),
sequences: FnvIndexMap::new(),
}
}
}