use alloc::ffi::CString;
use crate::{bindings, error::{PROSErr, PROSResult}};
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum Controller {
Master = 0,
Partner = 1,
}
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum ControllerAnalog {
LeftX = 0,
LeftY = 1,
RightX = 2,
RightY = 3,
}
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum ControllerDigital {
L1 = 6,
L2,
R1,
R2,
Up,
Down,
Left,
Right,
X,
B,
Y,
A,
}
pub fn get_analog(controller: Controller, analog: ControllerAnalog) -> Result<i8, PROSErr> {
unsafe {
bindings::controller_get_analog(controller as u32, analog as u32)
}.check().map(|x| x as i8)
}
pub fn get_digital(controller: Controller, digital: ControllerDigital) -> Result<bool, PROSErr> {
unsafe {
bindings::controller_get_digital(controller as u32, digital as u32)
}.check().map(|x| x != 0)
}
pub fn rumble(controller: Controller, rumble_pattern: &str) -> Result<(), PROSErr> {
unsafe {
let rumble_pattern = CString::new(rumble_pattern).unwrap();
bindings::controller_rumble(controller as u32, rumble_pattern.as_ptr() as *const u8)
}.check().map(|_| ())
}