kcan 0.1.8

CAN controller primitives for actuator and motor control.
Documentation
use kcan::protocol::{DirectCommand, OriginMode, direct_command_frame};

fn main() -> Result<(), kcan::Error> {
    let motor_id = 0x03;
    let commands = [
        ("duty", DirectCommand::DutyCycle(0.2)),
        ("current", DirectCommand::Current(1.0)),
        ("brake", DirectCommand::BrakeCurrent(0.5)),
        ("velocity", DirectCommand::Velocity(1_000)),
        ("position", DirectCommand::Position(90.0)),
        (
            "position-velocity",
            DirectCommand::PositionVelocity {
                position_degrees: 180.0,
                velocity_erpm: 5_000,
                acceleration_erpm_per_sec: 30_000,
            },
        ),
        ("origin", DirectCommand::SetOrigin(OriginMode::Temporary)),
    ];

    for (name, command) in commands {
        let frame = direct_command_frame(motor_id, command)?;
        println!(
            "{name:<17} id={:?} len={} data={}",
            frame.id(),
            frame.len(),
            hex(frame.data())
        );
    }

    Ok(())
}

fn hex(data: &[u8]) -> String {
    data.iter()
        .map(|byte| format!("{byte:02X}"))
        .collect::<Vec<_>>()
        .join(" ")
}