mirror of
https://github.com/digistump/DigistumpArduino.git
synced 2025-04-28 15:49:02 -07:00
84 lines
3.8 KiB
C
84 lines
3.8 KiB
C
![]() |
/* IRLibMatch.h from IRLib <20> an Arduino library for infrared encoding and decoding
|
|||
|
* Version 1.0 January 2013
|
|||
|
* Copyright 2013 by Chris Young http://cyborg5.com
|
|||
|
*
|
|||
|
* This library is a major rewrite of IRemote by Ken Shirriff which was covered by
|
|||
|
* GNU LESSER GENERAL PUBLIC LICENSE which as I read it allows me to make modified versions.
|
|||
|
* That same license applies to this modified version. See his original copyright below.
|
|||
|
* The latest Ken Shirriff code can be found at https://github.com/shirriff/Arduino-IRremote
|
|||
|
* My purpose was to reorganize the code to make it easier to add or remove protocols.
|
|||
|
* As a result I have separated the act of receiving a set of raw timing codes from the act of decoding them
|
|||
|
* by making them separate classes. That way the receiving aspect can be more black box and implementers
|
|||
|
* of decoders and senders can just deal with the decoding of protocols.
|
|||
|
* Also added provisions to make the classes base classes that could be extended with new protocols
|
|||
|
* which would not require recompiling of the original library nor understanding of its detailed contents.
|
|||
|
* Some of the changes were made to reduce code size such as unnecessary use of long versus bool.
|
|||
|
* Some changes were just my weird programming style. Also extended debugging information added.
|
|||
|
*/
|
|||
|
/*
|
|||
|
* 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
|
|||
|
*
|
|||
|
* 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/
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef IRLibMatch_h
|
|||
|
#define IRLibMatch_h
|
|||
|
|
|||
|
/*
|
|||
|
* This is some miscellaneous definition that is needed by the decoding routines.
|
|||
|
* You need not include this file unless you are creating custom decode routines
|
|||
|
* which will require these macros and definitions. Even if you include it, you probably
|
|||
|
* don't need to be intimately familiar with the internal details.
|
|||
|
*/
|
|||
|
|
|||
|
// Marks tend to be 100us too long, and spaces 100us too short
|
|||
|
// when received due to sensor lag.
|
|||
|
#define MARK_EXCESS 100
|
|||
|
#define USECPERTICK 50 // microseconds per clock interrupt tick
|
|||
|
#if 0
|
|||
|
#define TOLERANCE 25 // percent tolerance in measurements
|
|||
|
#define TICKS_LOW(us) (int) (((us)*(1.0 - TOLERANCE/100.)/USECPERTICK))
|
|||
|
#define TICKS_HIGH(us) (int) (((us)*(1.0 + TOLERANCE/100.)/USECPERTICK + 1))
|
|||
|
#else
|
|||
|
#define TICKS_LOW(us) (((us) - (us>>2))/USECPERTICK)
|
|||
|
#define TICKS_HIGH(us) (((us) + (us>>2))/USECPERTICK)
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef DEBUG
|
|||
|
int MATCH(int measured, int desired);
|
|||
|
int MATCH_MARK(int measured_ticks, int desired_us);
|
|||
|
int MATCH_SPACE(int measured_ticks, int desired_us);
|
|||
|
#else
|
|||
|
#define MATCH(measured_ticks, desired_us) ((measured_ticks) >= TICKS_LOW(desired_us) && (measured_ticks) <= TICKS_HIGH(desired_us))
|
|||
|
#define MATCH_MARK(measured_ticks, desired_us) MATCH(measured_ticks, (desired_us) + MARK_EXCESS)
|
|||
|
#define MATCH_SPACE(measured_ticks, desired_us) MATCH((measured_ticks), (desired_us) - MARK_EXCESS)
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#ifdef TRACE
|
|||
|
void ATTEMPT_MESSAGE(const __FlashStringHelper * s);
|
|||
|
byte REJECTION_MESSAGE(const __FlashStringHelper * s);
|
|||
|
#define RAW_COUNT_ERROR REJECTION_MESSAGE(F("number of raw samples"));
|
|||
|
#define HEADER_MARK_ERROR REJECTION_MESSAGE(F("header mark"));
|
|||
|
#define HEADER_SPACE_ERROR REJECTION_MESSAGE(F("header space"));
|
|||
|
#define DATA_MARK_ERROR REJECTION_MESSAGE(F("data mark"));
|
|||
|
#define DATA_SPACE_ERROR REJECTION_MESSAGE(F("data space"));
|
|||
|
#define TRAILER_BIT_ERROR REJECTION_MESSAGE(F("RC5/RC6 trailer bit length"));
|
|||
|
#else
|
|||
|
#define ATTEMPT_MESSAGE(s)
|
|||
|
#define REJECTION_MESSAGE(s) false
|
|||
|
#define RAW_COUNT_ERROR false
|
|||
|
#define HEADER_MARK_ERROR false
|
|||
|
#define HEADER_SPACE_ERROR false
|
|||
|
#define DATA_MARK_ERROR false
|
|||
|
#define DATA_SPACE_ERROR false
|
|||
|
#define TRAILER_BIT_ERROR false
|
|||
|
#endif
|
|||
|
|
|||
|
#endif //IRLibMatch_h
|