use moteus::frame::{Query, QueryType};
use moteus::registers::*;
use moteus::Controller;
fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_default_env().init();
let qr = Query::new_with_extra([
ControlPosition::read().into(),
ControlVelocity::read().into(),
ControlTorque::read().into(),
ControlPositionError::read().into(),
ControlVelocityError::read().into(),
ControlTorqueError::read().into(),
]);
let mut transport = fdcanusb::FdCanUSB::open("/dev/fdcanusb").unwrap();
transport.flush()?;
let mut c = Controller::with_query(transport, false, qr);
c.send_no_response(1, moteus::frame::Stop).unwrap();
let elapsed = std::time::Instant::now();
loop {
let position = if elapsed.elapsed().as_secs() % 2 == 0 {
CommandPosition::write(-0.5)
} else {
CommandPosition::write(0.5)
}?;
let command = moteus::frame::Position {
position: Some(position),
velocity: Some(CommandVelocity::write(0.0)?),
velocity_limit: Some(VelocityLimit::write(8.0)?),
acceleration_limit: Some(AccelerationLimit::write(3.0)?),
..Default::default()
};
let state = c.send_with_query(1, command, QueryType::Default)?;
log::debug!("{:?}", state);
log::info!("Position: {:?}\n", state.get::<Position>());
std::thread::sleep(std::time::Duration::from_millis(20));
}
}