Infrared remote library for Arduino: send and receive infrared signals with multiple protocols Port from Arduino-IRremote https://github.com/z3t0/Arduino-IRremote

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ir_Whynter.cpp Source File

ir_Whynter.cpp

00001 #include "IRremote.h"
00002 #include "IRremoteInt.h"
00003 
00004 //==============================================================================
00005 //               W   W  H   H  Y   Y N   N TTTTT EEEEE  RRRRR
00006 //               W   W  H   H   Y Y  NN  N   T   E      R   R
00007 //               W W W  HHHHH    Y   N N N   T   EEE    RRRR
00008 //               W W W  H   H    Y   N  NN   T   E      R  R
00009 //                WWW   H   H    Y   N   N   T   EEEEE  R   R
00010 //==============================================================================
00011 
00012 #define WHYNTER_BITS          32
00013 #define WHYNTER_HDR_MARK    2850
00014 #define WHYNTER_HDR_SPACE   2850
00015 #define WHYNTER_BIT_MARK     750
00016 #define WHYNTER_ONE_MARK     750
00017 #define WHYNTER_ONE_SPACE   2150
00018 #define WHYNTER_ZERO_MARK    750
00019 #define WHYNTER_ZERO_SPACE   750
00020 
00021 //+=============================================================================
00022 #if SEND_WHYNTER
00023 void  IRsend::sendWhynter (unsigned long data,  int nbits)
00024 {
00025     // Set IR carrier frequency
00026     enableIROut(38);
00027 
00028     // Start
00029     mark(WHYNTER_ZERO_MARK);
00030     space(WHYNTER_ZERO_SPACE);
00031 
00032     // Header
00033     mark(WHYNTER_HDR_MARK);
00034     space(WHYNTER_HDR_SPACE);
00035 
00036     // Data
00037     for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
00038         if (data & mask) {
00039             mark(WHYNTER_ONE_MARK);
00040             space(WHYNTER_ONE_SPACE);
00041         } else {
00042             mark(WHYNTER_ZERO_MARK);
00043             space(WHYNTER_ZERO_SPACE);
00044         }
00045     }
00046 
00047     // Footer
00048     mark(WHYNTER_ZERO_MARK);
00049     space(WHYNTER_ZERO_SPACE);  // Always end with the LED off
00050 }
00051 #endif
00052 
00053 //+=============================================================================
00054 #if DECODE_WHYNTER
00055 bool  IRrecv::decodeWhynter (decode_results *results)
00056 {
00057     long  data   = 0;
00058     int   offset = 1;  // skip initial space
00059 
00060     // Check we have the right amount of data
00061     if (irparams.rawlen < (2 * WHYNTER_BITS) + 6)  return false ;
00062 
00063     // Sequence begins with a bit mark and a zero space
00064     if (!MATCH_MARK (results->rawbuf[offset++], WHYNTER_BIT_MARK  ))  return false ;
00065     if (!MATCH_SPACE(results->rawbuf[offset++], WHYNTER_ZERO_SPACE))  return false ;
00066 
00067     // header mark and space
00068     if (!MATCH_MARK (results->rawbuf[offset++], WHYNTER_HDR_MARK ))  return false ;
00069     if (!MATCH_SPACE(results->rawbuf[offset++], WHYNTER_HDR_SPACE))  return false ;
00070 
00071     // data bits
00072     for (int i = 0;  i < WHYNTER_BITS;  i++) {
00073         if (!MATCH_MARK(results->rawbuf[offset++], WHYNTER_BIT_MARK))  return false ;
00074 
00075         if      (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ONE_SPACE ))  data = (data << 1) | 1 ;
00076         else if (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ZERO_SPACE))  data = (data << 1) | 0 ;
00077         else                                                                return false ;
00078         offset++;
00079     }
00080 
00081     // trailing mark
00082     if (!MATCH_MARK(results->rawbuf[offset], WHYNTER_BIT_MARK))  return false ;
00083 
00084     // Success
00085     results->bits = WHYNTER_BITS;
00086     results->value = data;
00087     results->decode_type = WHYNTER;
00088     return true;
00089 }
00090 #endif
00091