use crate::joint::{
joint_data,
jointbuilder::JointBuilder,
smartjointbuilder::{smart_joint_datatraits, SmartJointBuilder},
};
pub trait MimicAllowed {}
#[derive(Debug, Default, Clone)]
pub struct NoMimic;
impl smart_joint_datatraits::MimicDataType for NoMimic {}
#[derive(Debug, Default, Clone)]
pub struct WithMimic {
joint_name: String,
multiplier: Option<f32>,
offset: Option<f32>,
}
impl From<WithMimic> for joint_data::MimicBuilderData {
fn from(value: WithMimic) -> Self {
Self {
joint_name: value.joint_name,
multiplier: value.multiplier,
offset: value.offset,
}
}
}
impl smart_joint_datatraits::MimicDataType for WithMimic {
fn simplify(&self, joint_builder: &mut JointBuilder) {
joint_builder.with_mimic_data(self.clone().into())
}
}
impl<Type, Axis, Calibration, Dynamics, Limit, SafetyController>
SmartJointBuilder<Type, Axis, Calibration, Dynamics, Limit, NoMimic, SafetyController>
where
Type: MimicAllowed,
Axis: smart_joint_datatraits::AxisDataType,
Calibration: smart_joint_datatraits::CalibrationDataType,
Dynamics: smart_joint_datatraits::DynamicsDataType,
Limit: smart_joint_datatraits::LimitDataType,
SafetyController: smart_joint_datatraits::SafetyControllerDataType,
{
pub fn with_mimic(
self,
mimiced_joint_name: impl Into<String>,
) -> SmartJointBuilder<Type, Axis, Calibration, Dynamics, Limit, WithMimic, SafetyController> {
SmartJointBuilder {
name: self.name,
joint_type: self.joint_type,
transform: self.transform,
axis: self.axis,
calibration: self.calibration,
dynamics: self.dynamics,
limit: self.limit,
mimic: WithMimic {
joint_name: mimiced_joint_name.into(),
..Default::default()
},
safety_controller: self.safety_controller,
}
}
}
impl<Type, Axis, Calibration, Dynamics, Limit, SafetyController>
SmartJointBuilder<Type, Axis, Calibration, Dynamics, Limit, WithMimic, SafetyController>
where
Type: MimicAllowed,
Axis: smart_joint_datatraits::AxisDataType,
Calibration: smart_joint_datatraits::CalibrationDataType,
Dynamics: smart_joint_datatraits::DynamicsDataType,
Limit: smart_joint_datatraits::LimitDataType,
SafetyController: smart_joint_datatraits::SafetyControllerDataType,
{
pub fn set_mimiced_joint_name(mut self, mimiced_joint_name: impl Into<String>) -> Self {
self.mimic.joint_name = mimiced_joint_name.into();
self
}
pub fn mimiced_joint_name(&self) -> &String {
&self.mimic.joint_name
}
pub fn set_mimic_multiplier(mut self, multiplier: f32) -> Self {
self.mimic.multiplier = Some(multiplier);
self
}
pub fn mimic_multiplier(&self) -> Option<f32> {
self.mimic.multiplier
}
pub fn set_mimic_offset(mut self, offset: f32) -> Self {
self.mimic.offset = Some(offset);
self
}
pub fn mimic_offset(&self) -> Option<f32> {
self.mimic.offset
}
}