Struct infrared::Receiver [−][src]
pub struct Receiver<SM: DecoderStateMachine, MD = Event, IN = DefaultInput, C: From<<SM as Protocol>::Cmd> = <SM as Protocol>::Cmd> { /* fields omitted */ }
Expand description
Receiver
Event / Interrupt based Receiver
Example:
use infrared::{Receiver,
receiver::Builder, remotecontrol::rc5::CdPlayer, cmd::AddressCommand,
protocol::Rc5Command,
};
use dummy_pin::DummyPin;
// -------------------------------------------
// Receiver setup
// -------------------------------------------
// The pin connected to the receiver
let input_pin = DummyPin::new_high();
// Resolution of the clock used
const RESOLUTION: u32 = 1_000_000;
let mut receiver = Receiver::builder()
.rc5()
.remotecontrol(CdPlayer)
.event_driven()
.resolution(RESOLUTION)
.pin(input_pin)
.build();
// -------------------------------------------
// Input interrupt handler
// -------------------------------------------
let dt = 0; // Time since last pin flip
if let Ok(Some(button)) = receiver.event(dt) {
// Get the command associated with this button
let cmd = button.command();
println!(
"Action: {:?} - (Address, Command) = ({}, {})",
button.action(), cmd.address(), cmd.command()
);
}
Polled
-
Setup a CountDown-timer at a frequency of something like 20 kHz. How to setup the timer and enable interrupts is HAL-specific but most HALs have examples showing you how to do it.
-
Create a Polled
infrared::Receiver
with the desired Decoder state machine. -
Periodically call the poll method in the timer interrupt and it should give you a valid command eventually
Something like this:
Polled example
use infrared::{Receiver, receiver::Builder};
use embedded_hal::digital::v2::InputPin;
use dummy_pin::DummyPin;
// -------------------------------------------
// Receiver setup
// -------------------------------------------
// The pin connected to the receiver hw
let input_pin = DummyPin::new_high();
// Resolution of the timer interrupt in Hz.
const RESOLUTION: u32 = 20_000;
let mut receiver = Receiver::builder()
.rc5()
.polled()
.resolution(RESOLUTION)
.pin(input_pin)
.build();
// -------------------------------------------
// Timer interrupt handler
// -------------------------------------------
if let Ok(Some(cmd)) = receiver.poll() {
println!("{} {}", cmd.addr, cmd.cmd);
}
Construction of receiver
use infrared::{
Receiver,
receiver::{Event, Poll, DefaultInput, PinInput, BufferInput, Builder},
protocol::{Rc6, Nec},
};
use dummy_pin::DummyPin;
// Receiver for Rc6 signals, event based with embedded-hal pin
let pin = DummyPin::new_low();
let r1: Receiver<Rc6, Event, PinInput<DummyPin>> = Receiver::with_pin(40_000, pin);
// Periodic polled Nec Receiver
let r2: Receiver<Nec, Poll, DefaultInput> = Receiver::builder().nec().resolution(40_000).polled().build();
let buf = &[20, 40, 20];
let mut r3: Receiver<Rc6, Event, BufferInput> = Receiver::builder().rc6().buffer(buf).build();
let cmd_iter = r3.iter();