crate::endpoints! {
command: Setpoint<Command>;
}
#[derive(
phoxal_macros::DescribeWire, Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize,
)]
pub enum Command {
Position(
#[serde(
deserialize_with = "crate::api::component::motor::deserialize_finite_motor_scalar"
)]
f32,
),
Velocity(
#[serde(
deserialize_with = "crate::api::component::motor::deserialize_finite_motor_scalar"
)]
f32,
),
Torque(
#[serde(
deserialize_with = "crate::api::component::motor::deserialize_finite_motor_scalar"
)]
f32,
),
Stop,
}
pub(crate) fn deserialize_finite_motor_scalar<'de, D>(deserializer: D) -> Result<f32, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = <f32 as serde::Deserialize>::deserialize(deserializer)?;
value
.is_finite()
.then_some(value)
.ok_or_else(|| serde::de::Error::custom("motor command scalar must be finite"))
}