mirror of
https://github.com/digistump/DigistumpArduino.git
synced 2025-04-28 07:39:02 -07:00
84 lines
3.8 KiB
C
84 lines
3.8 KiB
C
/* IRLibMatch.h from IRLib – 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
|