You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
5.2 KiB

/* IRLibDecodeBase.h
* Part of IRLib Library for Arduino receiving, decoding, and sending
* infrared signals. See COPYRIGHT.txt and LICENSE.txt for more information.
*/
/*
* This module contains the base classes for decoding. You will not create instances
* of these classes, rather you will use them as base classes in creating derived
* protocol specific decoders.
*/
#ifndef IRLIBDECODEBASE_H
#define IRLIBDECODEBASE_H
#include "IRLibGlobals.h"
#include "IRLibProtocols.h"
// Base class for decoding raw results
class IRdecodeBase {
public:
IRdecodeBase(void);
uint8_t protocolNum; // NEC, SONY, RC5, UNKNOWN etc.
uint32_t value; // Decoded value
uint16_t address; // Additional data for protocols using more than 32 bits
uint8_t bits; // Number of bits in decoded value
bool ignoreHeader; // Relaxed header detection allows AGC to settle
bool decodeGeneric(uint8_t expectedLength, uint16_t headMark, uint16_t headSpace,
uint16_t markData, uint16_t spaceOne, uint16_t spaceZero);
void dumpResults(bool verbose=true);//full dump of all timing values
bool MATCH(int16_t val,int16_t expected);
bool ABS_MATCH(int16_t val,int16_t expected,int16_t tolerance);
protected:
virtual void resetDecoder(void); // Initializes the decoder
bufIndex_t offset; // Index into decodeBuffer used various places
};
// Base class used by RC5 and RC6 protocols
class IRdecodeRC: public virtual IRdecodeBase {
public:
enum RCLevel {MARK, SPACE, ERROR};//used by decoders for RC5/RC6
RCLevel getRClevel(uint8_t *used, const uint16_t t1);
protected:
uint8_t nBits;
uint8_t used;
uint32_t data;
};
/* The remainder of this file a variety of default values and macros which are
* used internally. They used to be in a separate file IRLibMatch.h but it's easier
* to include them here. You need not worry about them unless you are creating
* your own decoding routines. See the documentation how to implement new protocols
* for a more detailed explanation of these definitions and routines.
*/
/*
* Originally all timing comparisons for decoding were based on a percent of the
* target value. However when target values are relatively large, the percent tolerance
* is too much. In some instances an absolute tolerance is needed. In order to maintain
* backward compatibility, the default will be to continue to use percent. If you wish
* to default to an absolute tolerance, you should comment out the line below.
*/
#define IRLIB_USE_PERCENT
/*
* These are some miscellaneous definitions that are 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.
*/
#define TOPBIT 0x80000000
#define PERCENT_TOLERANCE 25 // percent tolerance in measurements
#define DEFAULT_ABS_TOLERANCE 75 //absolute tolerance in microseconds
/* If you insert #define IRLIB_TRACE in your sketch before including this file,
* various debugging routines will be enabled in the dumpResults() method.
*/
#ifdef IRLIB_TRACE
void IRLIB_ATTEMPT_MESSAGE(const __FlashStringHelper * s) {Serial.print(F("Attempting ")); Serial.print(s); Serial.println(F(" decode:"));};
void IRLIB_TRACE_MESSAGE(const __FlashStringHelper * s) {Serial.print(F("Executing ")); Serial.println(s);};
uint8_t IRLIB_REJECTION_MESSAGE(const __FlashStringHelper * s) { Serial.print(F(" Protocol failed because ")); Serial.print(s); Serial.println(F(" wrong.")); return false;};
uint8_t IRLIB_DATA_ERROR_MESSAGE(const __FlashStringHelper * s, uint8_t index, uint16_t value, uint16_t expected) {
IRLIB_REJECTION_MESSAGE(s); Serial.print(F("Error occurred with decodeBuffer[")); Serial.print(index,DEC); Serial.print(F("]=")); Serial.print(value,DEC);
Serial.print(F(" expected:")); Serial.println(expected,DEC); return false;
};
#define RAW_COUNT_ERROR IRLIB_REJECTION_MESSAGE(F("number of raw samples"));
#define HEADER_MARK_ERROR(expected) IRLIB_DATA_ERROR_MESSAGE(F("header mark"),1,recvGlobal.decodeBuffer[1],expected);
#define HEADER_SPACE_ERROR(expected) IRLIB_DATA_ERROR_MESSAGE(F("header space"),2,recvGlobal.decodeBuffer[2],expected);
#define DATA_MARK_ERROR(expected) IRLIB_DATA_ERROR_MESSAGE(F("data mark"),offset,recvGlobal.decodeBuffer[offset],expected);
#define DATA_SPACE_ERROR(expected) IRLIB_DATA_ERROR_MESSAGE(F("data space"),offset,recvGlobal.decodeBuffer[offset],expected);
#define TRAILER_BIT_ERROR(expected) IRLIB_DATA_ERROR_MESSAGE(F("RC6 trailer bit length"),offset,recvGlobal.decodeBuffer[offset],expected);
#define BIT_COUNT_ERROR IRLIB_REJECTION_MESSAGE(F("invalid number of bits"));
#else
#define IRLIB_ATTEMPT_MESSAGE(s)
#define IRLIB_TRACE_MESSAGE(s)
#define IRLIB_REJECTION_MESSAGE(s) false
#define IRLIB_DATA_ERROR_MESSAGE(s,i,v,e) false
#define RAW_COUNT_ERROR false
#define HEADER_MARK_ERROR(expected) false
#define HEADER_SPACE_ERROR(expected) false
#define DATA_MARK_ERROR(expected) false
#define DATA_SPACE_ERROR(expected) false
#define TRAILER_BIT_ERROR(expected) false
#define BIT_COUNT_ERROR false
#endif
#endif //IRLIBDECODEBASE_H