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

  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 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();

Implementations

Create a Receiver with buf as input

Create a Receiver with pin as input

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.