use crate::device::PulseTransmitter;
use crate::{Error, Result};
use cir::lirc::Lirc;
use std::path::Path;
use std::sync::{Arc, Mutex};
pub struct CirPulseTransmitter {
tx_device: Arc<Mutex<Lirc>>,
}
impl CirPulseTransmitter {
pub fn new(tx_device_path: impl AsRef<Path>) -> Result<Self> {
let tx_device = cir::lirc::open(tx_device_path)?;
Ok(Self {
tx_device: Arc::new(Mutex::new(tx_device)),
})
}
}
impl PulseTransmitter for CirPulseTransmitter {
fn send_pulses(&self, pulses: &[u32]) -> Result<()> {
let mut tx_device = self
.tx_device
.lock()
.map_err(|e| Error::Transmitting(format!("Lock error: {}", e)))?;
tx_device
.send(pulses)
.map_err(|e| Error::Transmitting(e.to_string()))?;
Ok(())
}
}
#[cfg(test)]
#[cfg(feature = "cir")]
mod tests {
use super::*;
#[test]
fn test_cir_transmitter_send_pulses_non_empty() {
let transmitter = CirPulseTransmitter::new("/dev/lirc0").expect("Should open /dev/lirc0");
let pulses = vec![157, 263, 157, 1026];
let result = transmitter.send_pulses(&pulses);
assert!(
result.is_ok(),
"Transmitter should return Ok for non-empty pulses"
);
}
#[test]
fn test_cir_transmitter_new_invalid_path() {
let result = CirPulseTransmitter::new("/invalid/path");
assert!(result.is_err());
}
}