use makcu::{Button, ButtonMask, Device, LockTarget, Result, VERSION};
fn main() -> Result<()> {
println!("=== makcu v{} — Mock Example ===\n", VERSION);
let (device, mock) = Device::mock();
println!("Mock device created (port: {})", device.port_name());
mock.on_command(b"km.version()\r\n", b"km.MAKCU v3.7");
mock.on_command(b"km.left()\r\n", b"km.left()\r\n0");
mock.on_command(b"km.lock_mx()\r\n", b"km.lock_mx()\r\n0");
let version = device.version()?;
println!("version() -> {}", version);
let left_state = device.button_state(Button::Left)?;
println!("button_state(Left) -> {}", left_state);
let x_locked = device.lock_state(LockTarget::X)?;
println!("lock_state(X) -> {}", x_locked);
device.move_xy(100, -50)?;
device.button_down(Button::Left)?;
device.button_up(Button::Left)?;
device.button_up_force(Button::Right)?;
device.silent_move(10, 20)?;
device.wheel(3)?;
device.set_lock(LockTarget::Y, true)?;
device.set_lock(LockTarget::Y, false)?;
println!("Execute commands work with no setup");
let ff = device.ff();
ff.move_xy(50, 50)?;
ff.button_down(Button::Right)?;
ff.button_up(Button::Right)?;
println!("Fire-and-forget commands sent");
device.enable_button_stream()?;
let rx = device.button_events();
mock.inject_button_event(ButtonMask::default());
device.move_xy(0, 0)?;
match rx.try_recv() {
Ok(mask) => println!(
"Received injected event: left={}, right={}",
mask.left(),
mask.right()
),
Err(_) => println!("No event received (timing dependent)"),
}
device.disable_button_stream()?;
let commands = mock.sent_commands();
println!("\nTotal commands sent: {}", commands.len());
println!("First 5 commands:");
for (i, cmd) in commands.iter().take(5).enumerate() {
let text = String::from_utf8_lossy(cmd);
println!(" [{}] {}", i, text.trim());
}
mock.clear_sent();
device.move_xy(1, 1)?;
assert_eq!(mock.sent_commands().len(), 1);
println!(
"\nAfter clear + 1 command: {} sent",
mock.sent_commands().len()
);
device.disconnect();
println!("\nDisconnected");
println!("\n=== Done! ===");
Ok(())
}