use super::buttons::Buttons;
use super::crank::Crank;
use crate::capi_state::CApiState;
use crate::ctypes::*;
use crate::geometry::Vector3;
use crate::system::System;
#[derive(Debug)]
pub struct Inputs {
peripherals_enabled: Peripherals,
buttons: Buttons,
crank: Crank,
}
impl Inputs {
pub(crate) fn new(
peripherals_enabled: Peripherals,
button_state_per_frame: &[PDButtonsSet; 2],
) -> Self {
let state = CApiState::get();
let crank = if unsafe { state.csystem.isCrankDocked.unwrap()() != 0 } {
Crank::Docked
} else {
Crank::Undocked {
angle: unsafe { state.csystem.getCrankAngle.unwrap()() },
change: unsafe { state.csystem.getCrankChange.unwrap()() },
}
};
Inputs {
peripherals_enabled,
buttons: Buttons::new(button_state_per_frame),
crank,
}
}
pub fn accelerometer(&self) -> Option<Vector3<f32>> {
if self.peripherals_enabled & Peripherals::kAccelerometer == Peripherals::kAccelerometer {
let mut v = Vector3::default();
unsafe { System::fns().getAccelerometer.unwrap()(&mut v.x, &mut v.y, &mut v.z) }
Some(v)
} else {
None
}
}
pub fn buttons(&self) -> &Buttons {
&self.buttons
}
pub fn crank(&self) -> &Crank {
&self.crank
}
}