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
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
|
|
|