//****************************************************************************** // IRremote // Version 2.0.1 June, 2015 // 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-110WD added by Francesco Meschia //****************************************************************************** #ifndef IRremote_h #define IRremote_h #define VERSION_IRREMOTE "2.4.0" //------------------------------------------------------------------------------ // The ISR header contains several useful macros the user may wish to use // #include "IRremoteInt.h" //------------------------------------------------------------------------------ // Supported IR protocols // Each protocol you include costs memory and, during decode, costs time // Disable (set to 0) all the protocols you do not need/want! // #define DECODE_RC5 1 #define SEND_RC5 1 #define DECODE_RC6 1 #define SEND_RC6 1 #define DECODE_NEC 1 #define SEND_NEC 1 #define DECODE_SONY 1 #define SEND_SONY 1 #define DECODE_PANASONIC 1 #define SEND_PANASONIC 1 #define DECODE_JVC 1 #define SEND_JVC 1 #define DECODE_SAMSUNG 1 #define SEND_SAMSUNG 1 #define DECODE_WHYNTER 1 #define SEND_WHYNTER 1 #define DECODE_AIWA_RC_T501 1 #define SEND_AIWA_RC_T501 1 #define DECODE_LG 1 #define SEND_LG 1 #define DECODE_SANYO 1 #define SEND_SANYO 0 // NOT WRITTEN #define DECODE_MITSUBISHI 1 #define SEND_MITSUBISHI 0 // NOT WRITTEN #define DECODE_DISH 0 // NOT WRITTEN #define SEND_DISH 1 #define DECODE_SHARP 0 // NOT WRITTEN #define SEND_SHARP 1 #define DECODE_DENON 1 #define SEND_DENON 1 #define DECODE_PRONTO 0 // This function doe not logically make sense #define SEND_PRONTO 1 #define DECODE_LEGO_PF 0 // NOT WRITTEN #define SEND_LEGO_PF 1 //------------------------------------------------------------------------------ // When sending a Pronto code we request to send either the "once" code // or the "repeat" code // If the code requested does not exist we can request to fallback on the // other code (the one we did not explicitly request) // // I would suggest that "fallback" will be the standard calling method // The last paragraph on this page discusses the rationale of this idea: // http://www.remotecentral.com/features/irdisp2.htm // #define PRONTO_ONCE false #define PRONTO_REPEAT true #define PRONTO_FALLBACK true #define PRONTO_NOFALLBACK false //------------------------------------------------------------------------------ // An enumerated list of all supported formats // You do NOT need to remove entries from this list when disabling protocols! // typedef enum { UNKNOWN = -1, UNUSED = 0, RC5, RC6, NEC, SONY, PANASONIC, JVC, SAMSUNG, WHYNTER, AIWA_RC_T501, LG, SANYO, MITSUBISHI, DISH, SHARP, DENON, PRONTO, LEGO_PF, } decode_type_t; //------------------------------------------------------------------------------ // Set DEBUG to 1 for lots of lovely debug output // #define DEBUG 0 //------------------------------------------------------------------------------ // Debug directives // #if DEBUG # define DBG_PRINT(...) Serial.print(__VA_ARGS__) # define DBG_PRINTLN(...) Serial.println(__VA_ARGS__) #else # define DBG_PRINT(...) # define DBG_PRINTLN(...) #endif //------------------------------------------------------------------------------ // Mark & Space matching functions // int MATCH (int measured, int desired) ; int MATCH_MARK (int measured_ticks, int desired_us) ; int MATCH_SPACE (int measured_ticks, int desired_us) ; //------------------------------------------------------------------------------ // Results returned from the decoder // class decode_results { public: decode_type_t decode_type; // UNKNOWN, NEC, SONY, RC5, ... unsigned int address; // Used by Panasonic & Sharp [16-bits] unsigned long value; // Decoded value [max 32-bits] int bits; // Number of bits in decoded value volatile unsigned int *rawbuf; // Raw intervals in 50uS ticks int rawlen; // Number of records in rawbuf int overflow; // true iff IR raw code too long }; //------------------------------------------------------------------------------ // Decoded value for NEC when a repeat code is received // #define REPEAT 0xFFFFFFFF //------------------------------------------------------------------------------ // Main class for receiving IR // class IRrecv { public: IRrecv (int recvpin) ; IRrecv (int recvpin, int blinkpin); void blink13 (int blinkflag) ; int decode (decode_results *results) ; void enableIRIn ( ) ; bool isIdle ( ) ; void resume ( ) ; private: long decodeHash (decode_results *results) ; int compare (unsigned int oldval, unsigned int newval) ; //...................................................................... # if (DECODE_RC5 || DECODE_RC6) // This helper function is shared by RC5 and RC6 int getRClevel (decode_results *results, int *offset, int *used, int t1) ; # endif # if DECODE_RC5 bool decodeRC5 (decode_results *results) ; # endif # if DECODE_RC6 bool decodeRC6 (decode_results *results) ; # endif //...................................................................... # if DECODE_NEC bool decodeNEC (decode_results *results) ; # endif //...................................................................... # if DECODE_SONY bool decodeSony (decode_results *results) ; # endif //...................................................................... # if DECODE_PANASONIC bool decodePanasonic (decode_results *results) ; # endif //...................................................................... # if DECODE_JVC bool decodeJVC (decode_results *results) ; # endif //...................................................................... # if DECODE_SAMSUNG bool decodeSAMSUNG (decode_results *results) ; # endif //...................................................................... # if DECODE_WHYNTER bool decodeWhynter (decode_results *results) ; # endif //...................................................................... # if DECODE_AIWA_RC_T501 bool decodeAiwaRCT501 (decode_results *results) ; # endif //...................................................................... # if DECODE_LG bool decodeLG (decode_results *results) ; # endif //...................................................................... # if DECODE_SANYO bool decodeSanyo (decode_results *results) ; # endif //...................................................................... # if DECODE_MITSUBISHI bool decodeMitsubishi (decode_results *results) ; # endif //...................................................................... # if DECODE_DISH bool decodeDish (decode_results *results) ; // NOT WRITTEN # endif //...................................................................... # if DECODE_SHARP bool decodeSharp (decode_results *results) ; // NOT WRITTEN # endif //...................................................................... # if DECODE_DENON bool decodeDenon (decode_results *results) ; # endif //...................................................................... # if DECODE_LEGO_PF bool decodeLegoPowerFunctions (decode_results *results) ; # endif } ; //------------------------------------------------------------------------------ // Main class for sending IR // class IRsend { public: #ifdef USE_SOFT_CARRIER IRsend(int pin = SEND_PIN) { sendPin = pin; } #else IRsend() { } #endif void custom_delay_usec (unsigned long uSecs); void enableIROut (int khz) ; void mark (unsigned int usec) ; void space (unsigned int usec) ; void sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz) ; //...................................................................... # if SEND_RC5 void sendRC5 (unsigned long data, int nbits) ; # endif # if SEND_RC6 void sendRC6 (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_NEC void sendNEC (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_SONY void sendSony (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_PANASONIC void sendPanasonic (unsigned int address, unsigned long data) ; # endif //...................................................................... # if SEND_JVC // JVC does NOT repeat by sending a separate code (like NEC does). // The JVC protocol repeats by skipping the header. // To send a JVC repeat signal, send the original code value // and set 'repeat' to true void sendJVC (unsigned long data, int nbits, bool repeat) ; # endif //...................................................................... # if SEND_SAMSUNG void sendSAMSUNG (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_WHYNTER void sendWhynter (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_AIWA_RC_T501 void sendAiwaRCT501 (int code) ; # endif //...................................................................... # if SEND_LG void sendLG (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_SANYO void sendSanyo ( ) ; // NOT WRITTEN # endif //...................................................................... # if SEND_MISUBISHI void sendMitsubishi ( ) ; // NOT WRITTEN # endif //...................................................................... # if SEND_DISH void sendDISH (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_SHARP void sendSharpRaw (unsigned long data, int nbits) ; void sendSharp (unsigned int address, unsigned int command) ; # endif //...................................................................... # if SEND_DENON void sendDenon (unsigned long data, int nbits) ; # endif //...................................................................... # if SEND_PRONTO void sendPronto (char* code, bool repeat, bool fallback) ; # endif //...................................................................... # if SEND_LEGO_PF void sendLegoPowerFunctions (uint16_t data, bool repeat = true) ; # endif #ifdef USE_SOFT_CARRIER private: int sendPin; unsigned int periodTime; unsigned int periodOnTime; void sleepMicros(unsigned long us); void sleepUntilMicros(unsigned long targetTime); #else const int sendPin = SEND_PIN; #endif } ; #endif