372 lines
12 KiB
C
372 lines
12 KiB
C
|
|
||
|
//******************************************************************************
|
||
|
// 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
|