use crate::spectrum::SpectralData;
use crate::{MeasurementMode, Result};
#[derive(Debug, Clone)]
pub struct DeviceInfo {
pub model: String,
pub serial: String,
pub firmware: String,
}
#[derive(Debug, Clone)]
pub struct DeviceStatus {
pub position: DevicePosition,
pub button_pressed: bool,
pub is_calibrated: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevicePosition {
Projector,
Surface,
Calibration,
Ambient,
Unknown(u8),
}
impl DevicePosition {
pub fn name(&self) -> &'static str {
match self {
DevicePosition::Projector => "Projector",
DevicePosition::Surface => "Surface",
DevicePosition::Calibration => "Calibration",
DevicePosition::Ambient => "Ambient",
DevicePosition::Unknown(_) => "Unknown",
}
}
}
pub trait Spectrometer {
fn info(&self) -> Result<DeviceInfo>;
fn status(&self) -> Result<DeviceStatus>;
fn calibrate(&mut self) -> Result<()>;
fn measure(&mut self, mode: MeasurementMode) -> Result<SpectralData>;
fn supported_modes(&self) -> Vec<MeasurementMode>;
fn is_calibrated(&self, mode: MeasurementMode) -> bool;
}
pub type BoxedSpectrometer = Box<dyn Spectrometer + Send>;