use crate::{
device::PulseTransmitter,
protocols::{SingleOutputCommand, SingleOutputProtocol},
Channel, Output, Result,
};
pub struct SpeedRemoteController<'a, T: PulseTransmitter> {
channel: Channel,
output: Output,
pulse_transmitter: &'a T,
protocol: SingleOutputProtocol,
}
impl<'a, T: PulseTransmitter> SpeedRemoteController<'a, T> {
pub fn new(pulse_transmitter: &'a T, channel: Channel, output: Output) -> Result<Self> {
let protocol = SingleOutputProtocol::new()?;
Ok(Self {
protocol,
pulse_transmitter,
channel,
output,
})
}
pub fn send(&mut self, cmd: SingleOutputCommand) -> Result<()> {
let pulses = self.protocol.encode_cmd(self.channel, self.output, cmd)?;
self.pulse_transmitter.send_pulses(&pulses)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::device::PulseTransmitter;
use crate::Error;
use crate::{Channel, Output};
use crate::{SingleOutputCommand, SingleOutputDiscrete};
struct MockTransmitterSuccess;
impl PulseTransmitter for MockTransmitterSuccess {
fn send_pulses(&self, pulses: &[u32]) -> crate::Result<()> {
assert!(!pulses.is_empty());
Ok(())
}
}
struct MockTransmitterFail;
impl PulseTransmitter for MockTransmitterFail {
fn send_pulses(&self, _pulses: &[u32]) -> crate::Result<()> {
Err(Error::Transmitting("Mock failure".to_string()))
}
}
#[test]
fn test_speed_remote_controller_pwm_success() {
let transmitter = MockTransmitterSuccess;
let mut controller = SpeedRemoteController::new(&transmitter, Channel::One, Output::RED)
.expect("Should create SpeedRemoteController");
let result = controller.send(SingleOutputCommand::PWM(5));
assert!(result.is_ok());
}
#[test]
fn test_speed_remote_controller_discrete_success() {
let transmitter = MockTransmitterSuccess;
let mut controller = SpeedRemoteController::new(&transmitter, Channel::One, Output::BLUE)
.expect("Should create SpeedRemoteController");
let result = controller.send(SingleOutputCommand::Discrete(
SingleOutputDiscrete::ToggleDirection,
));
assert!(result.is_ok());
}
#[test]
fn test_speed_remote_controller_failure() {
let transmitter = MockTransmitterFail;
let mut controller = SpeedRemoteController::new(&transmitter, Channel::One, Output::RED)
.expect("Should create SpeedRemoteController");
let result = controller.send(SingleOutputCommand::PWM(5));
assert!(result.is_err());
if let Err(Error::Transmitting(msg)) = result {
assert!(msg.contains("Mock failure"));
} else {
panic!("Unexpected error variant");
}
}
}