2017-03-29 17:24:57 +01:00
/***************************************************
* IRremote for ESP8266
2017-04-03 14:07:49 +01:00
*
* Based on the IRremote library for Arduino by Ken Shirriff
2017-03-29 17:24:57 +01:00
* Version 0.11 August , 2009
* Copyright 2009 Ken Shirriff
* For details , see http : //arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
*
* Edited by Mitra to add new controller SANYO
*
* Interrupt code based on NECIRrcv by Joe Knapp
* http : //www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
* Also influenced by http : //zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
*
* JVC and Panasonic protocol added by Kristian Lauszus ( Thanks to zenwheel and other people at the original blog post )
* LG added by Darryl Smith ( based on the JVC protocol )
* Whynter A / C ARC - 110 WD added by Francesco Meschia
2017-04-03 14:07:49 +01:00
* Coolix A / C / heatpump added by bakrus
* Denon : sendDenon , decodeDenon added by Massimiliano Pinto
( from https : //github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp)
* Kelvinator A / C and Sherwood added by crankyoldgit
2017-03-29 17:24:57 +01:00
* Updated by markszabo ( https : //github.com/markszabo/IRremoteESP8266) for sending IR code on ESP8266
* Updated by Sebastien Warin ( http : //sebastien.warin.fr) for receiving IR code on ESP8266
*
2017-04-03 14:07:49 +01:00
* Updated by sillyfrog for Daikin , adopted from
* ( https : //github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/)
*
* GPL license , all text above must be included in any redistribution
2017-03-29 17:24:57 +01:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef IRremote_h
# define IRremote_h
2017-04-03 14:07:49 +01:00
# include <stdint.h>
2017-03-29 17:24:57 +01:00
// The following are compile-time library options.
// If you change them, recompile the library.
// If DEBUG is defined, a lot of debugging output will be printed during decoding.
// TEST must be defined for the IRtest unittests to work. It will make some
// methods virtual, which will be slightly slower, which is why it is optional.
//#define DEBUG
//#define TEST
2017-04-03 14:07:49 +01:00
/*
* Always add to the end of the list and should never remove entries
* or change order . Projects may save the type number for later usage
* so numbering should always stay the same .
*/
2017-03-29 17:24:57 +01:00
enum decode_type_t {
2017-04-03 14:07:49 +01:00
UNKNOWN = - 1 ,
UNUSED = 0 ,
RC5 ,
RC6 ,
NEC ,
SONY ,
PANASONIC ,
JVC ,
SAMSUNG ,
WHYNTER ,
AIWA_RC_T501 ,
LG ,
SANYO ,
MITSUBISHI ,
DISH ,
SHARP ,
COOLIX ,
DAIKIN ,
DENON ,
KELVINATOR ,
SHERWOOD ,
MITSUBISHI_AC
2017-03-29 17:24:57 +01:00
} ;
// Results returned from the decoder
class decode_results {
public :
int decode_type ; // NEC, SONY, RC5, UNKNOWN
union { // This is used for decoding Panasonic and Sharp data
unsigned int panasonicAddress ;
unsigned int sharpAddress ;
} ;
unsigned long value ; // Decoded value
int bits ; // Number of bits in decoded value
volatile unsigned int * rawbuf ; // Raw intervals in .5 us ticks
int rawlen ; // Number of records in rawbuf.
2017-04-03 14:07:49 +01:00
bool overflow ;
2017-03-29 17:24:57 +01:00
} ;
// Decoded value for NEC when a repeat code is received
# define REPEAT 0xffffffff
2017-04-03 14:07:49 +01:00
# define SEND_PROTOCOL_NEC case NEC: sendNEC(data, nbits); break;
# define SEND_PROTOCOL_SONY case SONY: sendSony(data, nbits); break;
# define SEND_PROTOCOL_RC5 case RC5: sendRC5(data, nbits); break;
# define SEND_PROTOCOL_RC6 case RC6: sendRC6(data, nbits); break;
# define SEND_PROTOCOL_DISH case DISH: sendDISH(data, nbits); break;
# define SEND_PROTOCOL_JVC case JVC: sendJVC(data, nbits, 0); break;
# define SEND_PROTOCOL_SAMSUNG case SAMSUNG: sendSAMSUNG(data, nbits); break;
# define SEND_PROTOCOL_LG case LG: sendLG(data, nbits); break;
# define SEND_PROTOCOL_WHYNTER case WHYNTER: sendWhynter(data, nbits); break;
# define SEND_PROTOCOL_COOLIX case COOLIX: sendCOOLIX(data, nbits); break;
# define SEND_PROTOCOL_DENON case DENON: sendDenon(data, nbits); break;
# define SEND_PROTOCOL_SHERWOOD case SHERWOOD: sendSherwood(data, nbits); break;
2017-03-29 17:24:57 +01:00
// main class for receiving IR
class IRrecv
{
public :
IRrecv ( int recvpin ) ;
2017-04-03 14:07:49 +01:00
bool decode ( decode_results * results ) ;
2017-03-29 17:24:57 +01:00
void enableIRIn ( ) ;
void disableIRIn ( ) ;
void resume ( ) ;
private :
// These are called by decode
int getRClevel ( decode_results * results , int * offset , int * used , int t1 ) ;
2017-04-03 14:07:49 +01:00
bool decodeNEC ( decode_results * results ) ;
bool decodeSony ( decode_results * results ) ;
bool decodeSanyo ( decode_results * results ) ;
bool decodeMitsubishi ( decode_results * results ) ;
bool decodeRC5 ( decode_results * results ) ;
bool decodeRC6 ( decode_results * results ) ;
bool decodePanasonic ( decode_results * results ) ;
bool decodeLG ( decode_results * results ) ;
bool decodeJVC ( decode_results * results ) ;
bool decodeSAMSUNG ( decode_results * results ) ;
bool decodeWhynter ( decode_results * results ) ;
bool decodeHash ( decode_results * results ) ;
// COOLIX decode is not implemented yet
// bool decodeCOOLIX(decode_results *results);
bool decodeDaikin ( decode_results * results ) ;
bool decodeDenon ( decode_results * results ) ;
2017-03-29 17:24:57 +01:00
int compare ( unsigned int oldval , unsigned int newval ) ;
} ;
// Only used for testing; can remove virtual for shorter code
# ifdef TEST
# define VIRTUAL virtual
# else
# define VIRTUAL
# endif
class IRsend
{
public :
IRsend ( int IRsendPin ) ;
void begin ( ) ;
2017-04-03 14:07:49 +01:00
void send ( int type , unsigned long data , int nbits ) {
switch ( type ) {
SEND_PROTOCOL_NEC
SEND_PROTOCOL_SONY
SEND_PROTOCOL_RC5
SEND_PROTOCOL_RC6
SEND_PROTOCOL_DISH
SEND_PROTOCOL_JVC
SEND_PROTOCOL_SAMSUNG
SEND_PROTOCOL_LG
SEND_PROTOCOL_WHYNTER
SEND_PROTOCOL_COOLIX
SEND_PROTOCOL_DENON
SEND_PROTOCOL_SHERWOOD
}
} ;
void sendCOOLIX ( unsigned long data , int nbits ) ;
2017-03-29 17:24:57 +01:00
void sendWhynter ( unsigned long data , int nbits ) ;
2017-04-03 14:07:49 +01:00
void sendNEC ( unsigned long data , int nbits = 32 , unsigned int repeat = 0 ) ;
void sendLG ( unsigned long data , int nbits ) ;
// sendSony() should typically be called with repeat=2 as Sony devices
// expect the code to be sent at least 3 times. (code + 2 repeats = 3 codes)
// As the legacy use of this procedure was only to send a single code
// it defaults to repeat=0 for backward compatiblity.
void sendSony ( unsigned long data , int nbits , unsigned int repeat = 0 ) ;
2017-03-29 17:24:57 +01:00
// Neither Sanyo nor Mitsubishi send is implemented yet
// void sendSanyo(unsigned long data, int nbits);
// void sendMitsubishi(unsigned long data, int nbits);
void sendRaw ( unsigned int buf [ ] , int len , int hz ) ;
2017-04-03 14:07:49 +01:00
void sendGC ( unsigned int buf [ ] , int len ) ;
2017-03-29 17:24:57 +01:00
void sendRC5 ( unsigned long data , int nbits ) ;
void sendRC6 ( unsigned long data , int nbits ) ;
void sendDISH ( unsigned long data , int nbits ) ;
void sendSharp ( unsigned int address , unsigned int command ) ;
void sendSharpRaw ( unsigned long data , int nbits ) ;
void sendPanasonic ( unsigned int address , unsigned long data ) ;
void sendJVC ( unsigned long data , int nbits , int repeat ) ; // *Note instead of sending the REPEAT constant if you want the JVC repeat signal sent, send the original code value and change the repeat argument from 0 to 1. JVC protocol repeats by skipping the header NOT by sending a separate code value like NEC does.
void sendSAMSUNG ( unsigned long data , int nbits ) ;
2017-04-03 14:07:49 +01:00
void sendDaikin ( unsigned char daikin [ ] ) ;
void sendDaikinChunk ( unsigned char buf [ ] , int len , int start ) ;
void sendDenon ( unsigned long data , int nbits ) ;
void sendKelvinator ( unsigned char data [ ] ) ;
void sendSherwood ( unsigned long data , int nbits = 32 , unsigned int repeat = 1 ) ;
void sendMitsubishiAC ( unsigned char data [ ] ) ;
2017-03-29 17:24:57 +01:00
void enableIROut ( int khz ) ;
2017-04-03 14:07:49 +01:00
VIRTUAL void mark ( unsigned int usec ) ;
VIRTUAL void space ( unsigned long usec ) ;
2017-03-29 17:24:57 +01:00
private :
int halfPeriodicTime ;
int IRpin ;
2017-04-03 14:07:49 +01:00
void sendMitsubishiACChunk ( unsigned char data ) ;
void sendData ( uint16_t onemark , uint32_t onespace ,
uint16_t zeromark , uint32_t zerospace ,
uint32_t data , uint8_t nbits , bool MSBfirst = true ) ;
void ledOff ( ) ;
2017-03-29 17:24:57 +01:00
} ;
2017-04-03 14:07:49 +01:00
class IRtimer {
public :
IRtimer ( ) ;
void reset ( ) ;
uint32_t elapsed ( ) ;
private :
uint32_t start ;
} ;
2017-03-29 17:24:57 +01:00
// Some useful constants
# define USECPERTICK 50 // microseconds per clock interrupt tick
# define RAWBUF 100 // Length of raw duration buffer
// Marks tend to be 100us too long, and spaces 100us too short
// when received due to sensor lag.
# define MARK_EXCESS 100
# endif