|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #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
-
- //+=============================================================================
- #if 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 = 1UL << (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
- //
- #if DECODE_NEC
- bool 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
|