mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2026-01-09 11:12:49 +00:00
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.
This commit is contained in:
98
ir_NEC.cpp
Normal file
98
ir_NEC.cpp
Normal file
@@ -0,0 +1,98 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// N N EEEEE CCCC
|
||||
// NN N E C
|
||||
// N N N EEE C
|
||||
// N NN E C
|
||||
// N N EEEEE CCCC
|
||||
//==============================================================================
|
||||
|
||||
#define NEC_BITS 32
|
||||
#define NEC_HDR_MARK 9000
|
||||
#define NEC_HDR_SPACE 4500
|
||||
#define NEC_BIT_MARK 560
|
||||
#define NEC_ONE_SPACE 1690
|
||||
#define NEC_ZERO_SPACE 560
|
||||
#define NEC_RPT_SPACE 2250
|
||||
|
||||
//+=============================================================================
|
||||
#ifdef SEND_NEC
|
||||
void IRsend::sendNEC (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Header
|
||||
mark(NEC_HDR_MARK);
|
||||
space(NEC_HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(NEC_BIT_MARK);
|
||||
space(NEC_ONE_SPACE);
|
||||
} else {
|
||||
mark(NEC_BIT_MARK);
|
||||
space(NEC_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(NEC_BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
// NECs have a repeat only 4 items long
|
||||
//
|
||||
#ifdef DECODE_NEC
|
||||
long IRrecv::decodeNEC (decode_results *results)
|
||||
{
|
||||
long data = 0; // We decode in to here; Start with nothing
|
||||
int offset = 1; // Index in to results; Skip first entry!?
|
||||
|
||||
// Check header "mark"
|
||||
if (!MATCH_MARK(results->rawbuf[offset], NEC_HDR_MARK)) return false ;
|
||||
offset++;
|
||||
|
||||
// Check for repeat
|
||||
if ( (irparams.rawlen == 4)
|
||||
&& MATCH_SPACE(results->rawbuf[offset ], NEC_RPT_SPACE)
|
||||
&& MATCH_MARK (results->rawbuf[offset+1], NEC_BIT_MARK )
|
||||
) {
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = NEC;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check we have enough data
|
||||
if (irparams.rawlen < (2 * NEC_BITS) + 4) return false ;
|
||||
|
||||
// Check header "space"
|
||||
if (!MATCH_SPACE(results->rawbuf[offset], NEC_HDR_SPACE)) return false ;
|
||||
offset++;
|
||||
|
||||
// Build the data
|
||||
for (int i = 0; i < NEC_BITS; i++) {
|
||||
// Check data "mark"
|
||||
if (!MATCH_MARK(results->rawbuf[offset], NEC_BIT_MARK)) return false ;
|
||||
offset++;
|
||||
// Suppend this bit
|
||||
if (MATCH_SPACE(results->rawbuf[offset], NEC_ONE_SPACE )) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], NEC_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = NEC_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = NEC;
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user