Expand description
Receiver functionality
Event / Interrupt based Receiver
Example:
use infrared::{Receiver,
remotecontrol::rc5::CdPlayer, cmd::AddressCommand,
protocol::rc5::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()
.frequency(RESOLUTION)
.pin(input_pin)
.remotecontrol(CdPlayer)
.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 embedded_hal::digital::v2::InputPin;
use dummy_pin::DummyPin;
use infrared::protocol::Nec;
// -------------------------------------------
// Receiver setup
// -------------------------------------------
// The pin connected to the receiver hw
let input_pin = DummyPin::new_low();
// Frequency of the timer interrupt in Hz.
const FREQ: u32 = 20_000;
let mut receiver = infrared::PeriodicPoll::<Nec, DummyPin>::with_pin(FREQ, input_pin);
// -------------------------------------------
// Timer interrupt handler
// -------------------------------------------
if let Ok(Some(cmd)) = receiver.poll() {
println!("{} {}", cmd.addr, cmd.cmd);
}
Construction of receiver
use infrared::{
Receiver,
receiver::{NoPin, Builder},
protocol::{Rc6, Nec},
};
use dummy_pin::DummyPin;
use infrared::receiver::BufferInputReceiver;
// Receiver for Rc6 signals, event based with embedded-hal pin
let pin = DummyPin::new_low();
let r1: Receiver<Rc6, DummyPin> = Receiver::with_pin(40_000, pin);
// Periodic polled Nec Receiver
let pin = DummyPin::new_low();
let r2: infrared::PeriodicPoll<Nec, DummyPin> = infrared::PeriodicPoll::with_pin(40_000, pin);
let mut r3: BufferInputReceiver<Rc6> = BufferInputReceiver::with_frequenzy(20_000);
let buf: &[u32] = &[20, 40, 20];
let cmd_iter = r3.iter(buf);
Modules
Structs
Receiver that takes it input from a buffer
Receiver Builder
Multi Receiver
Don’t use a embedded-hal pin as input
Period poll Receiver
Event based Receiver
Enums
Decode State machine error
MultiReceiver Command
Protocol decoder status
Traits
Used to create a Decoder for a protocol
Protocol decode state machine