|
- #include "IRremote.h"
- #include "IRremoteInt.h"
-
- //==============================================================================
- // SSSS AAA MMM SSSS U U N N GGGG
- // S A A M M M S U U NN N G
- // SSS AAAAA M M M SSS U U N N N G GG
- // S A A M M S U U N NN G G
- // SSSS A A M M SSSS UUU N N GGG
- //==============================================================================
-
- #define SAMSUNG_BITS 32
- #define SAMSUNG_HDR_MARK 5000
- #define SAMSUNG_HDR_SPACE 5000
- #define SAMSUNG_BIT_MARK 560
- #define SAMSUNG_ONE_SPACE 1600
- #define SAMSUNG_ZERO_SPACE 560
- #define SAMSUNG_RPT_SPACE 2250
-
- //+=============================================================================
- #if SEND_SAMSUNG
- void IRsend::sendSAMSUNG (unsigned long data, int nbits)
- {
- // Set IR carrier frequency
- enableIROut(38);
-
- // Header
- mark(SAMSUNG_HDR_MARK);
- space(SAMSUNG_HDR_SPACE);
-
- // Data
- for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
- if (data & mask) {
- mark(SAMSUNG_BIT_MARK);
- space(SAMSUNG_ONE_SPACE);
- } else {
- mark(SAMSUNG_BIT_MARK);
- space(SAMSUNG_ZERO_SPACE);
- }
- }
-
- // Footer
- mark(SAMSUNG_BIT_MARK);
- space(0); // Always end with the LED off
- }
- #endif
-
- //+=============================================================================
- // SAMSUNGs have a repeat only 4 items long
- //
- #if DECODE_SAMSUNG
- bool IRrecv::decodeSAMSUNG (decode_results *results)
- {
- long data = 0;
- int offset = 1; // Skip first space
-
- // Initial mark
- if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG_HDR_MARK)) return false ;
- offset++;
-
- // Check for repeat
- if ( (irparams.rawlen == 4)
- && MATCH_SPACE(results->rawbuf[offset], SAMSUNG_RPT_SPACE)
- && MATCH_MARK(results->rawbuf[offset+1], SAMSUNG_BIT_MARK)
- ) {
- results->bits = 0;
- results->value = REPEAT;
- results->decode_type = SAMSUNG;
- return true;
- }
- if (irparams.rawlen < (2 * SAMSUNG_BITS) + 4) return false ;
-
- // Initial space
- if (!MATCH_SPACE(results->rawbuf[offset++], SAMSUNG_HDR_SPACE)) return false ;
-
- for (int i = 0; i < SAMSUNG_BITS; i++) {
- if (!MATCH_MARK(results->rawbuf[offset++], SAMSUNG_BIT_MARK)) return false ;
-
- if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ONE_SPACE)) data = (data << 1) | 1 ;
- else if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ZERO_SPACE)) data = (data << 1) | 0 ;
- else return false ;
- offset++;
- }
-
- // Success
- results->bits = SAMSUNG_BITS;
- results->value = data;
- results->decode_type = SAMSUNG;
- return true;
- }
- #endif
-
|