/** * * IRDEKODER.cpp * Jan Dvorak z Vozerovic - dvorkaman@centrum.cz - dvorkaman.php5.cz */ #ifndef irdekoder_cpp #define irdekoder_cpp #include "WProgram.h" #include "irdekoder.h" /*************************************************** /** * Constructor * @param int input pin */ IrDekoder::IrDekoder(int pin) { inputPin=pin; init(); } /*************************************************** /** * Inicialize input pin, implicit values * PRIVATE */ inline void IrDekoder::init() { pinMode(inputPin,INPUT); } /*************************************************** /** * Indication of recieved data - data and negated data */ boolean IrDekoder::recievedData() { if( recieveData() ) { data1=data; //save original data i=0; while( !recieveData() ) { i=i+1; if( i>10000 )return false; } data2=data; //save negated data data=data1; //restore //check data first five are same, others negated if( (data1 ^ data2)!=1023 )return false; //success return true; }else return false; } /*************************************************** /** * Recieve - decode data from IR pin * PRIVATE */ boolean IrDekoder::recieveData() { d=digitalRead(inputPin); if( d==1 ) return false; //no data //dekod code recieved=0; //0 bit-in yet time1=micros(); //actual clock time data=0; //clear register while(true) { d2=digitalRead(inputPin); if( d2!=d ) { //data-in changed d=d2; //move bit frame time2=micros(); dt=time2-time1; time1=time2; //move time frame if( (recieved%2)==1 ) { if( dt<1000 )i=0; else i=1; data=data<<1; data+=i; } recieved++; //check for T-out }else{ if( micros()-time1>4000 ) break; } }//END WHILE // return true; } /*************************************************** /** * Print recieved data to Serial console */ void IrDekoder::printRecievedData() { Serial.print("SB"); Serial.print(data,BIN); Serial.println(" "); } /*************************************************** /** * Get recieved data * @returns int recieved data */ int IrDekoder::getRecievedData() { return data & 1023; //clear first 5 bits } #endif