Files
Arduino-IRremote/IRremote.h
2015-06-20 14:42:59 +01:00

234 lines
6.7 KiB
C++

#ifndef IRremote_h
#define IRremote_h
#define DEBUG
#undef DEBUG
//------------------------------------------------------------------------------
int MATCH_SPACE (int measured_ticks, int desired_us) ;
int MATCH_MARK (int measured_ticks, int desired_us) ;
int MATCH (int measured, int desired) ;
//------------------------------------------------------------------------------
// Debug directives
#ifdef DEBUG
# define DBG_PRINT(...) Serial.print(__VA_ARGS__)
# define DBG_PRINTLN(...) Serial.println(__VA_ARGS__)
#else
# define DBG_PRINT(...)
# define DBG_PRINTLN(...)
#endif
//------------------------------------------------------------------------------
#define SEND_NEC
#define DECODE_NEC
#define SEND_WHYNTER
#define DECODE_WHYNTER
#define SEND_SONY
#define DECODE_SONY
#define DECODE_SANYO
#define SEND_RC5
#define DECODE_RC5
#define SEND_RC6
#define DECODE_RC6
#define SEND_PANASONIC
#define DECODE_PANASONIC
#define SEND_JVC
#define DECODE_JVC
#define SEND_SAMSUNG
#define DECODE_SAMSUNG
#define DECODE_LG
#define DECODE_MITSUBISHI
#define SEND_AIWA_RC_T501
#define DECODE_AIWA_RC_T501
#define SEND_SHARP
#define SEND_DISH
/*
* IRremote
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.htm http://arcfn.com
* 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
*/
// 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
//------------------------------------------------------------------------------
enum decode_type_t {
UNKNOWN = -1,
UNUSED = 0,
NEC = 1,
SONY = 2,
RC5 = 3,
RC6 = 4,
DISH = 5,
SHARP = 6,
PANASONIC = 7,
JVC = 8,
SANYO = 9,
MITSUBISHI = 10,
SAMSUNG = 11,
LG = 12,
WHYNTER = 13,
AIWA_RC_T501 = 14,
};
//------------------------------------------------------------------------------
// Results returned from the decoder
class decode_results {
public:
decode_type_t 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.
};
//------------------------------------------------------------------------------
// Decoded value for NEC when a repeat code is received
#define REPEAT 0xffffffff
//------------------------------------------------------------------------------
// main class for receiving IR
class IRrecv
{
public:
IRrecv(int recvpin);
void blink13(int blinkflag);
int decode(decode_results *results);
void enableIRIn();
void resume();
private:
// These are called by decode
int getRClevel(decode_results *results, int *offset, int *used, int t1);
#ifdef DECODE_NEC
long decodeNEC(decode_results *results);
#endif
#ifdef DECODE_SONY
long decodeSony(decode_results *results);
#endif
#ifdef DECODE_SANYO
long decodeSanyo(decode_results *results);
#endif
#ifdef DECODE_MITSUBISHI
long decodeMitsubishi(decode_results *results);
#endif
#ifdef DECODE_RC5
long decodeRC5(decode_results *results);
#endif
#ifdef DECODE_RC6
long decodeRC6(decode_results *results);
#endif
#ifdef DECODE_PANASONIC
long decodePanasonic(decode_results *results);
#endif
#ifdef DECODE_LG
long decodeLG(decode_results *results);
#endif
#ifdef DECODE_JVC
long decodeJVC(decode_results *results);
#endif
#ifdef DECODE_SAMSUNG
long decodeSAMSUNG(decode_results *results);
#endif
#ifdef DECODE_WHYNTER
long decodeWhynter(decode_results *results);
#endif
#ifdef DECODE_AIWA_RC_T501
long decodeAiwaRCT501(decode_results *results);
#endif
long decodeHash(decode_results *results);
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() {}
void sendRaw(unsigned int buf[], int len, int hz);
#ifdef SEND_RC5
void sendRC5(unsigned long data, int nbits);
#endif
#ifdef SEND_RC6
void sendRC6(unsigned long data, int nbits);
#endif
#ifdef SEND_WHYNTER
void sendWhynter(unsigned long data, int nbits);
#endif
#ifdef SEND_NEC
void sendNEC(unsigned long data, int nbits);
#endif
#ifdef SEND_SONY
void sendSony(unsigned long data, int nbits);
// Neither Sanyo nor Mitsubishi send is implemented yet
// void sendSanyo(unsigned long data, int nbits);
// void sendMitsubishi(unsigned long data, int nbits);
#endif
#ifdef SEND_DISH
void sendDISH(unsigned long data, int nbits);
#endif
#ifdef SEND_SHARP
void sendSharpRaw(unsigned long data, int nbits);
void sendSharp(unsigned int address, unsigned int command);
#endif
#ifdef SEND_PANASONIC
void sendPanasonic(unsigned int address, unsigned long data);
#endif
#ifdef SEND_JVC
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.
#endif
#ifdef SEND_AIWA_RC_T501
void sendAiwaRCT501(int code);
#endif
#ifdef SEND_SAMSUNG
void sendSAMSUNG(unsigned long data, int nbits);
#endif
void enableIROut(int khz);
VIRTUAL void mark(int usec);
VIRTUAL void space(int usec);
} ;
//------------------------------------------------------------------------------
// 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