use binread::BinRead;
#[derive(BinRead, Debug, Default)]
pub struct SignedAxis(u8);
impl SignedAxis {
pub fn from_raw(val: u8) -> Self {
Self(val)
}
pub fn raw(&self) -> u8 {
self.0
}
pub fn float(&self) -> f32 {
((self.0 as f32) - 127.5) / 127.5
}
pub fn double(&self) -> f64 {
((self.0 as f64) - 127.5) / 127.5
}
pub fn float_centered(&self, center: u8) -> f32 {
let center_offset = ((self.0 as i16) - (center as i16)) as f32;
let scale = if self.0 > center { (u8::MAX - center).max(1) } else { center } as f32;
center_offset / scale
}
pub fn double_centered(&self, center: u8) -> f64 {
let center_offset = ((self.0 as i16) - (center as i16)) as f64;
let scale = if self.0 > center { (u8::MAX - center).max(1) } else { center } as f64;
center_offset / scale
}
}
#[derive(BinRead, Debug, Default)]
pub struct UnsignedAxis(u8);
impl UnsignedAxis {
pub fn from_raw(val: u8) -> Self {
Self(val)
}
pub fn raw(&self) -> u8 {
self.0
}
pub fn float(&self) -> f32 {
(self.0 as f32) / 255.0
}
pub fn double(&self) -> f64 {
(self.0 as f64) / 255.0
}
}
#[cfg(test)]
mod tests {
use super::*;
}