Read IR data from TV Remote

Ir.cpp

Committer:
jdonnal
Date:
2020-02-03
Revision:
1:0fadd6080445

File content as of revision 1:0fadd6080445:

#include "Ir.h"
 
 
IrIn::IrIn(PinName input): ir_(input){
    ir_.rise(this, &IrIn::rising_edge_);
    ir_.fall(this, &IrIn::falling_edge_);
    ir_.disable_irq();
    rx_bits_ = 0;
    msg_ = 0x0;
    rx_in_progress_ = 0;
    rx_complete_ = 0;
    t_.start();
}

int IrIn::read(){
    ir_.enable_irq();
    while(!rx_complete_)
        wait(0.1);
    int rx_msg = msg_;
    msg_ = 0x0;
    rx_complete_ = 0;
    rx_bits_ = 0;
    return rx_msg;
}

void IrIn::rising_edge_(){
    char rx_bit = 0x0;
    int dt = t_.read_us();
    
    //make sure we align to a start condition
    if(!rx_in_progress_){
        if(dt>2000 && dt < 2500){
            rx_in_progress_ = 1;
        }
        return;
    }
    if(dt>700)
        rx_bit = 0x1;
    else
        rx_bit = 0x0;
    rx_bits_++;
    msg_ = (msg_ << 1) | rx_bit;
    if(rx_bits_ == 12){
        rx_in_progress_ = 0;
        rx_complete_ = 1;
        ir_.disable_irq();
    }
    
}

void IrIn::falling_edge_(){
    t_.reset();
}