#![warn(missing_docs)]
use mad_gaze::MadGazeGlow;
use rokid::RokidAir;
pub mod mad_gaze;
pub mod rokid;
#[derive(Debug)]
pub enum Error {
IoError(std::io::Error),
UsbError(rusb::Error),
SerialPortError(serialport::Error),
NotFound,
Other(&'static str),
}
type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, Clone)]
pub enum GlassesEvent {
Accelerometer(SensorData3D),
Gyroscope(SensorData3D),
Magnetometer(SensorData3D),
Misc(MiscSensors),
}
#[derive(Debug, Clone)]
pub struct SensorData3D {
pub timestamp: u64,
pub x: f32,
pub y: f32,
pub z: f32,
}
#[derive(Debug, Clone)]
pub struct MiscSensors {
pub keys: u8,
pub proximity: bool,
}
pub enum DisplayMode {
SameOnBoth = 0,
Stereo = 1,
}
pub trait ARGlasses {
fn serial(&mut self) -> Result<String>;
fn read_event(&mut self) -> Result<GlassesEvent>;
fn set_display_mode(&mut self, display_mode: DisplayMode) -> Result<()>;
}
pub fn any_glasses() -> Result<Box<dyn ARGlasses>> {
if let Ok(glasses) = RokidAir::new() {
return Ok(Box::new(glasses));
};
if let Ok(glasses) = MadGazeGlow::new() {
return Ok(Box::new(glasses));
};
Err(Error::NotFound)
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::IoError(e)
}
}
impl From<rusb::Error> for Error {
fn from(e: rusb::Error) -> Self {
Error::UsbError(e)
}
}
impl From<serialport::Error> for Error {
fn from(e: serialport::Error) -> Self {
Error::SerialPortError(e)
}
}
impl From<&'static str> for Error {
fn from(e: &'static str) -> Self {
Error::Other(e)
}
}