added arduino, modified build
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
/* IRLib_P03_RC5.h
|
||||
* Part of IRLib Library for Arduino receiving, decoding, and sending
|
||||
* infrared signals. See COPYRIGHT.txt and LICENSE.txt for more information.
|
||||
*/
|
||||
/*
|
||||
* The RC5 protocol was invented by Phillips but is used by wide variety of manufacturers.
|
||||
* It uses a phase encoding of data bits. A space/mark pair indicates "1"
|
||||
* and a mark/space indicates a "0". It begins with a single "1" bit which is not encoded
|
||||
* in the data. The second highest order data bit is a toggle bit that indicates individual
|
||||
* keypresses. You must toggle this bit yourself when sending data. The protocol uses 36 kHz
|
||||
* modulation however 38 kHz receivers can typically receive the codes okay.
|
||||
* There are three supported varieties as follows:
|
||||
* RC5 13 bits, 36 kHz (default, most common variety.
|
||||
* RC5-F7 14 bits, 36 kHz
|
||||
* RC5-F7-57 14 bits, 57 kHz
|
||||
* There's also a 19 bit variety called RC5x that is not supported here but may be a separate
|
||||
* module eventually.
|
||||
*/
|
||||
|
||||
#ifndef IRLIB_PROTOCOL_03_H
|
||||
#define IRLIB_PROTOCOL_03_H
|
||||
#define IR_SEND_PROTOCOL_03 case 03: if(khz==38)khz=36; IRsendRC5::send(data,data2,khz); break;
|
||||
#define IR_DECODE_PROTOCOL_03 if(IRdecodeRC5::decode()) return true;
|
||||
#ifdef IRLIB_HAVE_COMBO
|
||||
#define PV_IR_DECODE_PROTOCOL_03 ,public virtual IRdecodeRC5
|
||||
#define PV_IR_SEND_PROTOCOL_03 ,public virtual IRsendRC5
|
||||
#else
|
||||
#define PV_IR_DECODE_PROTOCOL_03 public virtual IRdecodeRC5
|
||||
#define PV_IR_SEND_PROTOCOL_03 public virtual IRsendRC5
|
||||
#endif
|
||||
#define RC5_T1 889
|
||||
|
||||
#ifdef IRLIBSENDBASE_H
|
||||
|
||||
class IRsendRC5: public virtual IRsendBase {
|
||||
public:
|
||||
void send(uint32_t data, uint8_t nBits=13, uint8_t kHz=36) {
|
||||
if(nBits==0)nBits=13;
|
||||
if(kHz==0)kHz=36;
|
||||
enableIROut(kHz);
|
||||
data = data << (32 - nBits);
|
||||
extent=0;
|
||||
mark(RC5_T1); // First start bit
|
||||
//Note: Original IRremote library incorrectly assumed second bit was
|
||||
//always a "1". Bit patterns from this decoder are not backward compatible
|
||||
//with patterns produced by the original library. Uncomment the following two
|
||||
//lines to maintain backward compatibility.
|
||||
//space(RC5_T1); // Second start bit
|
||||
//mark(RC5_T1); // Second start bit
|
||||
for (uint8_t i = 0; i < nBits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
space(RC5_T1); mark(RC5_T1);// 1 is space, then mark
|
||||
} else {
|
||||
mark(RC5_T1); space(RC5_T1);// 0 is mark, then space
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
space(114000-extent); // Turn off at end
|
||||
}
|
||||
};
|
||||
#endif //IRLIBSENDBASE_H
|
||||
|
||||
#ifdef IRLIBDECODEBASE_H
|
||||
|
||||
/* Note this decoder is a derived class from the IRdecodeRC base class
|
||||
* rather than IRdecodeBase. The base class defines the method "getRClevel"
|
||||
* which is common to both RC5 and RC6 protocols. It facilitates the decoding
|
||||
* of phase encoded data.
|
||||
*/
|
||||
|
||||
class IRdecodeRC5: public virtual IRdecodeRC {
|
||||
public:
|
||||
virtual bool decode(void) {
|
||||
IRLIB_ATTEMPT_MESSAGE(F("RC5"));
|
||||
resetDecoder();//This used to be in the receiver getResults.
|
||||
if (recvGlobal.decodeLength < 13) return RAW_COUNT_ERROR;
|
||||
offset = 1; // Skip gap space
|
||||
data = 0;
|
||||
used = 0;
|
||||
// Get start bits
|
||||
if (getRClevel(&used, RC5_T1) != MARK) return HEADER_MARK_ERROR(RC5_T1);
|
||||
//Note: Original IRremote library incorrectly assumed second bit was always
|
||||
// a "1". Bit patterns from this decoder are not backward compatible with
|
||||
// patterns produced by original library. Uncomment the following two lines
|
||||
// to maintain backward compatibility.
|
||||
//if (getRClevel(&used, RC5_T1) != SPACE) return HEADER_SPACE_ERROR(RC5_T1);
|
||||
//if (getRClevel(&used, RC5_T1) != MARK) return HEADER_MARK_ERROR(RC5_T1);
|
||||
for (nBits = 0; offset < recvGlobal.decodeLength; nBits++) {
|
||||
RCLevel levelA = getRClevel(&used, RC5_T1);
|
||||
RCLevel levelB = getRClevel(&used, RC5_T1);
|
||||
if (levelA == SPACE && levelB == MARK) {
|
||||
data = (data << 1) | 1; // 1 bit
|
||||
} else if (levelA == MARK && levelB == SPACE) {
|
||||
data <<= 1; // zero bit
|
||||
} else return DATA_MARK_ERROR(RC5_T1);
|
||||
}
|
||||
// Success
|
||||
bits = nBits;
|
||||
value = data;
|
||||
protocolNum = RC5;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
#endif //IRLIBDECODEBASE_H
|
||||
|
||||
#define IRLIB_HAVE_COMBO
|
||||
|
||||
#endif //IRLIB_PROTOCOL_03_H
|
||||
Reference in New Issue
Block a user