use crate::channel::ChannelConfig;
use crate::error::Result;
use crate::sample::SampleBuffer;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DeviceState {
Disconnected,
Connected,
Streaming,
}
#[derive(Debug, Clone)]
pub struct DeviceInfo {
pub name: String,
pub manufacturer: String,
pub sample_rate: u16,
pub channels: ChannelConfig,
}
impl DeviceInfo {
pub fn new(
name: impl Into<String>,
manufacturer: impl Into<String>,
sample_rate: u16,
channels: ChannelConfig,
) -> Self {
Self {
name: name.into(),
manufacturer: manufacturer.into(),
sample_rate,
channels,
}
}
}
pub trait EegDevice {
fn info(&self) -> DeviceInfo;
fn state(&self) -> DeviceState;
fn connect(&mut self) -> Result<()>;
fn disconnect(&mut self) -> Result<()>;
fn start_stream(&mut self) -> Result<()>;
fn stop_stream(&mut self) -> Result<()>;
fn read_samples(&mut self, buffer: &mut SampleBuffer) -> Result<usize>;
fn is_connected(&self) -> bool {
matches!(
self.state(),
DeviceState::Connected | DeviceState::Streaming
)
}
fn is_streaming(&self) -> bool {
self.state() == DeviceState::Streaming
}
}
pub trait ConfigurableDevice: EegDevice {
fn set_sample_rate(&mut self, rate: u16) -> Result<()>;
fn set_channels_enabled(&mut self, enabled: &[bool]) -> Result<()>;
}