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.

85 lines
3.5 KiB

/* IRLib_P00_HashRaw.h
* Part of IRLib Library for Arduino receiving, decoding, and sending
* infrared signals. See COPYRIGHT.txt and LICENSE.txt for more information.
*/
/*
* If you have a protocol which is unsupported by this library, you can still receive
* and transmit the data. You can store the raw data values in a buffer and retransmit the
* data exactly as you received it. Of course it takes a lot of memory to store such data
* so it is inefficient but it is better than nothing.
* If all you need to do is detect a unique value for an unsupported protocol and you do
* not need to resend the data, you can use the hash code decoder. It looks at the
* array of raw timing values and create a 32 bit value based on the data. It is
* highly likely to be unique however you cannot reverse engineer the process.
* You cannot re-create the original data stream for 32 bit hash code.
* This module also implements the raw send method. You have to have the original
* timing values.
*/
#ifndef IRLIB_HASHRAW_H
#define IRLIB_HASHRAW_H
#define IR_SEND_RAW case 0: IRsendRaw::send((uint16_t*)data,data2,khz); break;
#define IR_DECODE_HASH if(IRdecodeHash::decode()) return true;
#ifdef IRLIB_HAVE_COMBO
#define PV_IR_DECODE_HASH ,public virtual IRdecodeHash
#define PV_IR_SEND_RAW ,public virtual IRsendRaw
#else
#define PV_IR_DECODE_HASH public virtual IRdecodeHash
#define PV_IR_SEND_RAW public virtual IRsendRaw
#endif
#ifdef IRLIBSENDBASE_H
/* The first parameter to the "IRendRaw" method is a pointer to the first element of an
* array of uint16_t values. These values are the raw timing values in microseconds. Note
* it is possible to simply pass "(uint16_t*) &My_Decoder.decodeBuffer[1]" if you have just
* received a code and wish to echo it. You have to point to the index "1" because index "0"
* of that buffer contains the gap between successive frames data and it should be ignored.
* If the frequency to be used in transmission is not specified, it defaults to 38kHz.
*/
class IRsendRaw: public virtual IRsendBase {
public:
void send(uint16_t *buf, uint8_t len, uint8_t khz) {
enableIROut(khz);
for (uint8_t i = 0; i < len; i++) {
if (i & 1) {
space(buf[i]);
}
else {
mark(buf[i]);
}
}
space(0); // Just to be sure
}
};
#endif //IRLIBSENDBASE_H
#ifdef IRLIBDECODEBASE_H
/* This Hash decoder is based on IRhashcode Copyright 2010 Ken Shirriff
* For details see http://www.righto.com/2010/01/using-arbitrary-remotes-with-arduino.html
* Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
* Converts the raw code values into a 32-bit hash code.
* Hopefully this code is unique for each button.
*/
#define FNV_PRIME_32 16777619
#define FNV_BASIS_32 2166136261
// Compare two tick values, return 0 if v1 is lower, 1 if equal, and 2 if v2 is higher
#define TICKS_COMPARE(v1,v2) ( (v2< v1*0.8)?0:( (v1< v2*0.8)?2:1) )
class IRdecodeHash: public virtual IRdecodeBase {
public:
bool decode(void) {
value = FNV_BASIS_32;
for (int i = 1; i+2 < recvGlobal.decodeLength; i++) {
value = (value * FNV_PRIME_32) ^ TICKS_COMPARE(recvGlobal.decodeBuffer[i], recvGlobal.decodeBuffer[i+2]);
}
protocolNum = UNKNOWN;
bits= (recvGlobal.decodeLength-3)/2;//Estimated number of bits of unknown protocol
//Note that value is always 32 bit hash code.
return true;
}
};
#endif //IRLIBDECODEBASE_H
#define IRLIB_HAVE_COMBO
#endif //IRLIB_HASHRAW_H