mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2025-12-11 08:56:14 +00:00
parameters changed from int to unsigned int to allow longer mark/space durations and signal length. hz changed to allow for potential future use of 455kHz carrier frequency. (Ther may be existing modes to the library, using this frequency)
333 lines
11 KiB
C++
333 lines
11 KiB
C++
|
|
//******************************************************************************
|
|
// IRremote
|
|
// Version 0.1 July, 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-110WD added by Francesco Meschia
|
|
//******************************************************************************
|
|
|
|
#ifndef IRremote_h
|
|
#define IRremote_h
|
|
|
|
//------------------------------------------------------------------------------
|
|
// 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 0 // NOT WRITTEN
|
|
|
|
#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
|
|
|
|
//------------------------------------------------------------------------------
|
|
// 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,
|
|
}
|
|
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
|
|
} ;
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Main class for sending IR
|
|
//
|
|
class IRsend
|
|
{
|
|
public:
|
|
IRsend () { }
|
|
|
|
void custom_delay_usec (unsigned long uSecs);
|
|
void enableIROut (int khz) ;
|
|
void mark (unsigned int usec) ;
|
|
void space (unsigned int usec) ;
|
|
void sendRaw (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 ( ) ; // NOT WRITTEN
|
|
# 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
|
|
} ;
|
|
|
|
#endif
|