It can learn and transmit signals of infrared communication.

IR_Communication.cpp

Committer:
shimotoriharuki
Date:
2019-03-11
Revision:
1:ecde41301a4d
Parent:
0:2d87ed532eff

File content as of revision 1:ecde41301a4d:

#include "mbed.h"
#include "IR_Communication.h"

IR_Comm::IR_Comm(PinName in, PinName out, const int data_size):IR_in(in), IR_LED(out) ,size(data_size) {
    IR_LED.period(0.000026315); //38KHz
    
    //reference https://os.mbed.com/questions/75943/Deprecated-method-mbedInterruptInfall/
    IR_in.rise(callback (this, &IR_Comm::ir_rise));
    IR_in.fall(callback (this, &IR_Comm::ir_fall));
    timer.start();
}

void IR_Comm::receive_start(){
    receive_flag = 1;
    timer.reset();
    i = 0;
}

void IR_Comm::receive_stop(){
    receive_flag = 0;
    i = 0; 
}

void IR_Comm::IR_send(int *data){    
    for (i = 1; i < size; i++){
        timer.reset();
        if(i % 2 != 0){  //奇数番
            while(timer.read_us() <= data[i])    IR_LED = IR_ON;
        }
        else{
            while(timer.read_us() <= data[i])    IR_LED = IR_OFF;
        }
        
    }
    i = 0;
    IR_LED = IR_OFF;
}

void IR_Comm::ir_rise(void){
    if(receive_flag == 1){
        temp_data[i] = timer.read_us();
        timer.reset();
        i++;
        if(i > size) i = size;
    }
}

void IR_Comm::ir_fall(void){ 
    if(receive_flag == 1){
        temp_data[i] = timer.read_us();
        timer.reset();
        i++;
        if(i > size) i = size;
    }
}

void IR_Comm::IR_data_reset(int *data){
    for (i = 0; i < size; i++){
        data[i] = 0;
        temp_data[i] = 0;
    }
    i = 0;    
}

void IR_Comm::get_data(int *data){
    for (i = 0; i < size; i++){
        data[i] = temp_data[i];
    }  
    i = 0;
}