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_Samsung.cpp Source File

ir_Samsung.cpp

00001 #include "IRremote.h"
00002 #include "IRremoteInt.h"
00003 
00004 //==============================================================================
00005 //              SSSS   AAA    MMM    SSSS  U   U  N   N   GGGG
00006 //             S      A   A  M M M  S      U   U  NN  N  G
00007 //              SSS   AAAAA  M M M   SSS   U   U  N N N  G  GG
00008 //                 S  A   A  M   M      S  U   U  N  NN  G   G
00009 //             SSSS   A   A  M   M  SSSS    UUU   N   N   GGG
00010 //==============================================================================
00011 
00012 #define SAMSUNG_BITS          32
00013 #define SAMSUNG_HDR_MARK    5000
00014 #define SAMSUNG_HDR_SPACE   5000
00015 #define SAMSUNG_BIT_MARK     560
00016 #define SAMSUNG_ONE_SPACE   1600
00017 #define SAMSUNG_ZERO_SPACE   560
00018 #define SAMSUNG_RPT_SPACE   2250
00019 
00020 //+=============================================================================
00021 #if SEND_SAMSUNG
00022 void  IRsend::sendSAMSUNG (unsigned long data,  int nbits)
00023 {
00024     // Set IR carrier frequency
00025     enableIROut(38);
00026 
00027     // Header
00028     mark(SAMSUNG_HDR_MARK);
00029     space(SAMSUNG_HDR_SPACE);
00030 
00031     // Data
00032     for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
00033         if (data & mask) {
00034             mark(SAMSUNG_BIT_MARK);
00035             space(SAMSUNG_ONE_SPACE);
00036         } else {
00037             mark(SAMSUNG_BIT_MARK);
00038             space(SAMSUNG_ZERO_SPACE);
00039         }
00040     }
00041 
00042     // Footer
00043     mark(SAMSUNG_BIT_MARK);
00044     space(0);  // Always end with the LED off
00045 }
00046 #endif
00047 
00048 //+=============================================================================
00049 // SAMSUNGs have a repeat only 4 items long
00050 //
00051 #if DECODE_SAMSUNG
00052 bool  IRrecv::decodeSAMSUNG (decode_results *results)
00053 {
00054     long  data   = 0;
00055     int   offset = 1;  // Skip first space
00056 
00057     // Initial mark
00058     if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG_HDR_MARK))   return false ;
00059     offset++;
00060 
00061     // Check for repeat
00062     if (    (irparams.rawlen == 4)
00063          && MATCH_SPACE(results->rawbuf[offset], SAMSUNG_RPT_SPACE)
00064          && MATCH_MARK(results->rawbuf[offset+1], SAMSUNG_BIT_MARK)
00065        ) {
00066         results->bits        = 0;
00067         results->value       = REPEAT;
00068         results->decode_type = SAMSUNG;
00069         return true;
00070     }
00071     if (irparams.rawlen < (2 * SAMSUNG_BITS) + 4)  return false ;
00072 
00073     // Initial space
00074     if (!MATCH_SPACE(results->rawbuf[offset++], SAMSUNG_HDR_SPACE))  return false ;
00075 
00076     for (int i = 0;  i < SAMSUNG_BITS;   i++) {
00077         if (!MATCH_MARK(results->rawbuf[offset++], SAMSUNG_BIT_MARK))  return false ;
00078 
00079         if      (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ONE_SPACE))   data = (data << 1) | 1 ;
00080         else if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ZERO_SPACE))  data = (data << 1) | 0 ;
00081         else                                                                return false ;
00082         offset++;
00083     }
00084 
00085     // Success
00086     results->bits        = SAMSUNG_BITS;
00087     results->value       = data;
00088     results->decode_type = SAMSUNG;
00089     return true;
00090 }
00091 #endif
00092