Files
Arduino-IRremote/ir_Whynter.cpp
Bluechip 315aecdada Broken the source in to manageable chunks - 2KLOC files are not fun to debug!
Utterly failed to reduce the MARK_?? functions back down to MACROs - every time I try, the decoders start failing ...However, I have found a considerable number of bugs in the toolchain, so I'm starting to wonder if the fault is not mine.
2015-06-20 04:29:28 +01:00

97 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
//+=============================================================================
#ifdef 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 = 1 << (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
//+=============================================================================
#ifdef DECODE_WHYNTER
long IRrecv::decodeWhynter (decode_results *results)
{
long data = 0;
if (irparams.rawlen < 2 * WHYNTER_BITS + 6) return false ;
int offset = 1; // skip initial space
// sequence begins with a bit mark and a zero space
if (!MATCH_MARK(results->rawbuf[offset], WHYNTER_BIT_MARK)) return false ;
offset++;
if (!MATCH_SPACE(results->rawbuf[offset], WHYNTER_ZERO_SPACE)) return false ;
offset++;
// header mark and space
if (!MATCH_MARK(results->rawbuf[offset], WHYNTER_HDR_MARK)) return false ;
offset++;
if (!MATCH_SPACE(results->rawbuf[offset], WHYNTER_HDR_SPACE)) return false ;
offset++;
// data bits
for (int i = 0; i < WHYNTER_BITS; i++) {
if (!MATCH_MARK(results->rawbuf[offset], WHYNTER_BIT_MARK)) return false ;
offset++;
if (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ONE_SPACE)) data = (data << 1) | 1 ;
else if (MATCH_SPACE(results->rawbuf[offset],WHYNTER_ZERO_SPACE)) data <<= 1 ;
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