use sdl3::{
gamepad::{Axis, Button},
joystick::{HatState, VirtualJoystickDescription},
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("\n<===> VIRTUAL JOYSTICKS <===>\n");
let sdl_context = sdl3::init()?;
let joystick_subsystem = sdl_context.joystick()?;
let axes: Vec<Axis> = vec![Axis::LeftX, Axis::LeftY];
let buttons: Vec<Button> = vec![Button::North, Button::South, Button::East, Button::West];
{
let desc = VirtualJoystickDescription::new()
.num_hats(1)
.with_axes(axes.clone())
.with_buttons(buttons.clone())
.name("My Virtual Joystick");
println!(
"Current number of joysticks: {}\n",
joystick_subsystem.joysticks().unwrap().len()
);
let connection = joystick_subsystem.attach_virtual_joystick(desc)?;
println!("Successfully built a new virtual joystick.");
println!(
"New number of joysticks: {}\n",
joystick_subsystem.joysticks().unwrap().len()
);
let id = connection.id();
let joystick = joystick_subsystem.open(id)?;
println!(
"Joystick:\n Name: {}\n Number of Axes: {}\n Number of Buttons: {}\n Number of Hats: {}\n",
joystick.name(),
joystick.num_axes(),
joystick.num_buttons(),
joystick.num_hats()
);
let axes_iter = axes.iter();
let buttons_iter = buttons.iter();
let axis_codes: Vec<u32> = axes_iter.map(|axis| axis.to_ll().0 as u32).collect();
let button_codes: Vec<u32> = buttons_iter.map(|button| button.to_ll().0 as u32).collect();
println!("Values before write:");
println!(
"{:<3}Axes (LX/LY): {}/{}",
"",
joystick.axis(axis_codes[0]).unwrap(), joystick.axis(axis_codes[1]).unwrap() );
println!(
"{:<3}Buttons (N/S/E/W): {}/{}/{}/{}",
"",
joystick.button(button_codes[0]).unwrap(), joystick.button(button_codes[1]).unwrap(), joystick.button(button_codes[2]).unwrap(), joystick.button(button_codes[3]).unwrap() );
println!(
"{:<3}Hat 0: {:?}\n",
"",
joystick.hat(0).unwrap()
);
println!("Writing new states to the virtual joystick...\n");
joystick.set_virtual_axis(axis_codes[0], 100)?; joystick.set_virtual_axis(axis_codes[1], 200)?; joystick.set_virtual_button(button_codes[0], true)?; joystick.set_virtual_button(button_codes[1], true)?; joystick.set_virtual_button(button_codes[2], true)?; joystick.set_virtual_button(button_codes[3], true)?; joystick.set_virtual_hat(0, HatState::Up)?;
joystick_subsystem.update();
println!("Values after write:");
println!(
"{:<3}Axes (LX/LY): {}/{}",
"",
joystick.axis(axis_codes[0]).unwrap(), joystick.axis(axis_codes[1]).unwrap() );
println!(
"{:<3}Buttons (N/S/E/W): {}/{}/{}/{}",
"",
joystick.button(button_codes[0]).unwrap(), joystick.button(button_codes[1]).unwrap(), joystick.button(button_codes[2]).unwrap(), joystick.button(button_codes[3]).unwrap() );
println!(
"{:<3}Hat 0: {:?}\n",
"",
joystick.hat(0).unwrap()
);
println!("Lifetime of Virtual Joystick Connection ends here.")
}
println!(
"Final number of joysticks: {}",
joystick_subsystem.joysticks().unwrap().len()
);
Ok(())
}