use serde::{Deserialize, Serialize};
pub const AXIS_CENTER: f32 = 0.5;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RegisterAxis {
pub id: String,
}
impl RegisterAxis {
pub fn new(id: impl Into<String>) -> Self {
Self { id: id.into() }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct SpringForce {
pub coefficient: f32,
pub saturation: f32,
pub offset: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct AxisVibration {
pub magnitude: f32,
pub frequency_hz: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default, Serialize, Deserialize)]
pub struct AxisForceFeedback {
pub spring: Option<SpringForce>,
pub friction: f32,
pub vibration: Option<AxisVibration>,
}
pub fn clamp_unit(value: f32) -> f32 {
if value.is_finite() {
value.clamp(0.0, 1.0)
} else {
0.0
}
}
pub fn clamp_frequency_hz(value: f32) -> f32 {
if value.is_finite() {
value.max(0.0)
} else {
0.0
}
}