Module infrared::receiver

source ·
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

  1. 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.

  2. Create a Polled infrared::Receiver with the desired Decoder state machine.

  3. 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