Taguchi Yuuki / IRremote

Dependents:   Lilnija_29012017 NucleoF042K6_IRReceiver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ir_NEC.cpp Source File

ir_NEC.cpp

00001 #include "IRremote.h"
00002 #include "IRremoteInt.h"
00003 
00004 //==============================================================================
00005 //                           N   N  EEEEE   CCCC
00006 //                           NN  N  E      C
00007 //                           N N N  EEE    C
00008 //                           N  NN  E      C
00009 //                           N   N  EEEEE   CCCC
00010 //==============================================================================
00011 
00012 #define NEC_BITS          32
00013 #define NEC_HDR_MARK    9000
00014 #define NEC_HDR_SPACE   4500
00015 #define NEC_BIT_MARK     560
00016 #define NEC_ONE_SPACE   1690
00017 #define NEC_ZERO_SPACE   560
00018 #define NEC_RPT_SPACE   2250
00019 
00020 //+=============================================================================
00021 #if SEND_NEC
00022 void  IRsend::sendNEC (unsigned long data,  int nbits)
00023 {
00024     // Set IR carrier frequency
00025     enableIROut(38);
00026 
00027     // Header
00028     mark(NEC_HDR_MARK);
00029     space(NEC_HDR_SPACE);
00030 
00031     // Data
00032     for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
00033         if (data & mask) {
00034             mark(NEC_BIT_MARK);
00035             space(NEC_ONE_SPACE);
00036         } else {
00037             mark(NEC_BIT_MARK);
00038             space(NEC_ZERO_SPACE);
00039         }
00040     }
00041 
00042     // Footer
00043     mark(NEC_BIT_MARK);
00044     space(0);  // Always end with the LED off
00045 }
00046 #endif
00047 
00048 //+=============================================================================
00049 // NECs have a repeat only 4 items long
00050 //
00051 #if DECODE_NEC
00052 bool  IRrecv::decodeNEC (decode_results *results)
00053 {
00054     long  data   = 0;  // We decode in to here; Start with nothing
00055     int   offset = 1;  // Index in to results; Skip first entry!?
00056 
00057     // Check header "mark"
00058     if (!MATCH_MARK(results->rawbuf[offset], NEC_HDR_MARK))  return false ;
00059     offset++;
00060 
00061     // Check for repeat
00062     if ( (irparams.rawlen == 4)
00063         && MATCH_SPACE(results->rawbuf[offset  ], NEC_RPT_SPACE)
00064         && MATCH_MARK (results->rawbuf[offset+1], NEC_BIT_MARK )
00065        ) {
00066         results->bits        = 0;
00067         results->value       = REPEAT;
00068         results->decode_type = NEC;
00069         return true;
00070     }
00071 
00072     // Check we have enough data
00073     if (irparams.rawlen < (2 * NEC_BITS) + 4)  return false ;
00074 
00075     // Check header "space"
00076     if (!MATCH_SPACE(results->rawbuf[offset], NEC_HDR_SPACE))  return false ;
00077     offset++;
00078 
00079     // Build the data
00080     for (int i = 0;  i < NEC_BITS;  i++) {
00081         // Check data "mark"
00082         if (!MATCH_MARK(results->rawbuf[offset], NEC_BIT_MARK))  return false ;
00083         offset++;
00084         // Suppend this bit
00085         if      (MATCH_SPACE(results->rawbuf[offset], NEC_ONE_SPACE ))  data = (data << 1) | 1 ;
00086         else if (MATCH_SPACE(results->rawbuf[offset], NEC_ZERO_SPACE))  data = (data << 1) | 0 ;
00087         else                                                            return false ;
00088         offset++;
00089     }
00090 
00091     // Success
00092     results->bits        = NEC_BITS;
00093     results->value       = data;
00094     results->decode_type = NEC;
00095 
00096     return true;
00097 }
00098 #endif