use async_trait::async_trait;
use anyhow::{Result, bail};
use chrono::Utc;
use super::{Sensor, SensorReading, SensorType, SensorStatus, CalibrationData};
pub struct InfrasoundSensor {
id: String,
status: SensorStatus,
sample_rate: f64,
sequence: u64,
}
impl InfrasoundSensor {
pub fn new(id: &str) -> Self {
Self {
id: id.to_string(),
status: SensorStatus::Disconnected,
sample_rate: 48000.0,
sequence: 0,
}
}
}
#[async_trait]
impl Sensor for InfrasoundSensor {
fn id(&self) -> &str { &self.id }
fn sensor_type(&self) -> SensorType { SensorType::Infrasound }
fn status(&self) -> SensorStatus { self.status }
async fn connect(&mut self) -> Result<()> { self.status = SensorStatus::Connected; Ok(()) }
async fn disconnect(&mut self) -> Result<()> { self.status = SensorStatus::Disconnected; Ok(()) }
async fn calibrate(&mut self) -> Result<CalibrationData> {
self.status = SensorStatus::Active;
Ok(CalibrationData {
offset: vec![0.0],
scale: vec![1.0],
noise_floor: -80.0, timestamp: Utc::now(),
temperature: None,
notes: "Infrasound microphone calibration".to_string(),
signature: vec![],
})
}
async fn read(&mut self) -> Result<SensorReading> { bail!("Hardware not connected") }
fn sample_rate(&self) -> f64 { self.sample_rate }
fn set_sample_rate(&mut self, rate: f64) -> Result<()> { self.sample_rate = rate; Ok(()) }
fn config(&self) -> serde_json::Value { serde_json::json!({}) }
fn set_config(&mut self, _config: serde_json::Value) -> Result<()> { Ok(()) }
}
pub struct UltrasonicSensor {
id: String,
status: SensorStatus,
sample_rate: f64,
sequence: u64,
frequency_range: (f64, f64), }
impl UltrasonicSensor {
pub fn new(id: &str) -> Self {
Self {
id: id.to_string(),
status: SensorStatus::Disconnected,
sample_rate: 192000.0, sequence: 0,
frequency_range: (20000.0, 100000.0),
}
}
}
#[async_trait]
impl Sensor for UltrasonicSensor {
fn id(&self) -> &str { &self.id }
fn sensor_type(&self) -> SensorType { SensorType::Ultrasonic }
fn status(&self) -> SensorStatus { self.status }
async fn connect(&mut self) -> Result<()> { self.status = SensorStatus::Connected; Ok(()) }
async fn disconnect(&mut self) -> Result<()> { self.status = SensorStatus::Disconnected; Ok(()) }
async fn calibrate(&mut self) -> Result<CalibrationData> {
self.status = SensorStatus::Active;
Ok(CalibrationData {
offset: vec![0.0],
scale: vec![1.0],
noise_floor: -70.0,
timestamp: Utc::now(),
temperature: None,
notes: "Ultrasonic transducer calibration".to_string(),
signature: vec![],
})
}
async fn read(&mut self) -> Result<SensorReading> { bail!("Hardware not connected") }
fn sample_rate(&self) -> f64 { self.sample_rate }
fn set_sample_rate(&mut self, rate: f64) -> Result<()> { self.sample_rate = rate; Ok(()) }
fn config(&self) -> serde_json::Value {
serde_json::json!({
"frequency_range": self.frequency_range
})
}
fn set_config(&mut self, _config: serde_json::Value) -> Result<()> { Ok(()) }
}
pub struct FullSpectrumSensor {
id: String,
status: SensorStatus,
sample_rate: f64,
sequence: u64,
}
impl FullSpectrumSensor {
pub fn new(id: &str) -> Self {
Self {
id: id.to_string(),
status: SensorStatus::Disconnected,
sample_rate: 384000.0, sequence: 0,
}
}
}
#[async_trait]
impl Sensor for FullSpectrumSensor {
fn id(&self) -> &str { &self.id }
fn sensor_type(&self) -> SensorType { SensorType::FullSpectrum }
fn status(&self) -> SensorStatus { self.status }
async fn connect(&mut self) -> Result<()> { self.status = SensorStatus::Connected; Ok(()) }
async fn disconnect(&mut self) -> Result<()> { self.status = SensorStatus::Disconnected; Ok(()) }
async fn calibrate(&mut self) -> Result<CalibrationData> {
self.status = SensorStatus::Active;
Ok(CalibrationData {
offset: vec![0.0],
scale: vec![1.0],
noise_floor: -85.0,
timestamp: Utc::now(),
temperature: None,
notes: "Full spectrum audio calibration".to_string(),
signature: vec![],
})
}
async fn read(&mut self) -> Result<SensorReading> { bail!("Hardware not connected") }
fn sample_rate(&self) -> f64 { self.sample_rate }
fn set_sample_rate(&mut self, rate: f64) -> Result<()> { self.sample_rate = rate; Ok(()) }
fn config(&self) -> serde_json::Value { serde_json::json!({}) }
fn set_config(&mut self, _config: serde_json::Value) -> Result<()> { Ok(()) }
}
pub struct ParabolicMicSensor {
id: String,
status: SensorStatus,
sample_rate: f64,
sequence: u64,
gain: f64,
direction: [f64; 2], }
impl ParabolicMicSensor {
pub fn new(id: &str) -> Self {
Self {
id: id.to_string(),
status: SensorStatus::Disconnected,
sample_rate: 96000.0,
sequence: 0,
gain: 30.0, direction: [0.0, 0.0],
}
}
}
#[async_trait]
impl Sensor for ParabolicMicSensor {
fn id(&self) -> &str { &self.id }
fn sensor_type(&self) -> SensorType { SensorType::ParabolicMic }
fn status(&self) -> SensorStatus { self.status }
async fn connect(&mut self) -> Result<()> { self.status = SensorStatus::Connected; Ok(()) }
async fn disconnect(&mut self) -> Result<()> { self.status = SensorStatus::Disconnected; Ok(()) }
async fn calibrate(&mut self) -> Result<CalibrationData> {
self.status = SensorStatus::Active;
Ok(CalibrationData {
offset: vec![0.0],
scale: vec![1.0],
noise_floor: -90.0,
timestamp: Utc::now(),
temperature: None,
notes: "Parabolic mic calibration".to_string(),
signature: vec![],
})
}
async fn read(&mut self) -> Result<SensorReading> { bail!("Hardware not connected") }
fn sample_rate(&self) -> f64 { self.sample_rate }
fn set_sample_rate(&mut self, rate: f64) -> Result<()> { self.sample_rate = rate; Ok(()) }
fn config(&self) -> serde_json::Value {
serde_json::json!({
"gain": self.gain,
"direction": self.direction
})
}
fn set_config(&mut self, config: serde_json::Value) -> Result<()> {
if let Some(g) = config.get("gain").and_then(|v| v.as_f64()) {
self.gain = g;
}
Ok(())
}
}
pub struct MicArraySensor {
id: String,
status: SensorStatus,
sample_rate: f64,
sequence: u64,
num_mics: usize,
}
impl MicArraySensor {
pub fn new(id: &str, num_mics: usize) -> Self {
Self {
id: id.to_string(),
status: SensorStatus::Disconnected,
sample_rate: 48000.0,
sequence: 0,
num_mics,
}
}
}
#[async_trait]
impl Sensor for MicArraySensor {
fn id(&self) -> &str { &self.id }
fn sensor_type(&self) -> SensorType { SensorType::MicArray }
fn status(&self) -> SensorStatus { self.status }
async fn connect(&mut self) -> Result<()> { self.status = SensorStatus::Connected; Ok(()) }
async fn disconnect(&mut self) -> Result<()> { self.status = SensorStatus::Disconnected; Ok(()) }
async fn calibrate(&mut self) -> Result<CalibrationData> {
self.status = SensorStatus::Active;
Ok(CalibrationData {
offset: vec![0.0; self.num_mics],
scale: vec![1.0; self.num_mics],
noise_floor: -80.0,
timestamp: Utc::now(),
temperature: None,
notes: format!("{}-mic array calibration", self.num_mics),
signature: vec![],
})
}
async fn read(&mut self) -> Result<SensorReading> { bail!("Hardware not connected") }
fn sample_rate(&self) -> f64 { self.sample_rate }
fn set_sample_rate(&mut self, rate: f64) -> Result<()> { self.sample_rate = rate; Ok(()) }
fn config(&self) -> serde_json::Value { serde_json::json!({"num_mics": self.num_mics}) }
fn set_config(&mut self, _config: serde_json::Value) -> Result<()> { Ok(()) }
}