92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
|
#include "IRremote.h"
|
||
|
#include "IRremoteInt.h"
|
||
|
|
||
|
//==============================================================================
|
||
|
// W W H H Y Y N N TTTTT EEEEE RRRRR
|
||
|
// W W H H Y Y NN N T E R R
|
||
|
// W W W HHHHH Y N N N T EEE RRRR
|
||
|
// W W W H H Y N NN T E R R
|
||
|
// WWW H H Y N N T EEEEE R R
|
||
|
//==============================================================================
|
||
|
|
||
|
#define WHYNTER_BITS 32
|
||
|
#define WHYNTER_HDR_MARK 2850
|
||
|
#define WHYNTER_HDR_SPACE 2850
|
||
|
#define WHYNTER_BIT_MARK 750
|
||
|
#define WHYNTER_ONE_MARK 750
|
||
|
#define WHYNTER_ONE_SPACE 2150
|
||
|
#define WHYNTER_ZERO_MARK 750
|
||
|
#define WHYNTER_ZERO_SPACE 750
|
||
|
|
||
|
//+=============================================================================
|
||
|
#if SEND_WHYNTER
|
||
|
void IRsend::sendWhynter (unsigned long data, int nbits)
|
||
|
{
|
||
|
// Set IR carrier frequency
|
||
|
enableIROut(38);
|
||
|
|
||
|
// Start
|
||
|
mark(WHYNTER_ZERO_MARK);
|
||
|
space(WHYNTER_ZERO_SPACE);
|
||
|
|
||
|
// Header
|
||
|
mark(WHYNTER_HDR_MARK);
|
||
|
space(WHYNTER_HDR_SPACE);
|
||
|
|
||
|
// Data
|
||
|
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||
|
if (data & mask) {
|
||
|
mark(WHYNTER_ONE_MARK);
|
||
|
space(WHYNTER_ONE_SPACE);
|
||
|
} else {
|
||
|
mark(WHYNTER_ZERO_MARK);
|
||
|
space(WHYNTER_ZERO_SPACE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Footer
|
||
|
mark(WHYNTER_ZERO_MARK);
|
||
|
space(WHYNTER_ZERO_SPACE); // Always end with the LED off
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//+=============================================================================
|
||
|
#if DECODE_WHYNTER
|
||
|
bool IRrecv::decodeWhynter (decode_results *results)
|
||
|
{
|
||
|
long data = 0;
|
||
|
int offset = 1; // skip initial space
|
||
|
|
||
|
// Check we have the right amount of data
|
||
|
if (irparams.rawlen < (2 * WHYNTER_BITS) + 6) return false ;
|
||
|
|
||
|
// Sequence begins with a bit mark and a zero space
|
||
|
if (!MATCH_MARK (results->rawbuf[offset++], WHYNTER_BIT_MARK )) return false ;
|
||
|
if (!MATCH_SPACE(results->rawbuf[offset++], WHYNTER_ZERO_SPACE)) return false ;
|
||
|
|
||
|
// header mark and space
|
||
|
if (!MATCH_MARK (results->rawbuf[offset++], WHYNTER_HDR_MARK )) return false ;
|
||
|
if (!MATCH_SPACE(results->rawbuf[offset++], WHYNTER_HDR_SPACE)) return false ;
|
||
|
|
||
|
// data bits
|
||
|
for (int i = 0; i < WHYNTER_BITS; i++) {
|
||
|
if (!MATCH_MARK(results->rawbuf[offset++], WHYNTER_BIT_MARK)) return false ;
|
||
|
|
||
|
if (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ONE_SPACE )) data = (data << 1) | 1 ;
|
||
|
else if (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||
|
else return false ;
|
||
|
offset++;
|
||
|
}
|
||
|
|
||
|
// trailing mark
|
||
|
if (!MATCH_MARK(results->rawbuf[offset], WHYNTER_BIT_MARK)) return false ;
|
||
|
|
||
|
// Success
|
||
|
results->bits = WHYNTER_BITS;
|
||
|
results->value = data;
|
||
|
results->decode_type = WHYNTER;
|
||
|
return true;
|
||
|
}
|
||
|
#endif
|
||
|
|