#include "IRremote.h" #include "IRremoteInt.h" //============================================================================== // SSSS OOO N N Y Y // S O O NN N Y Y // SSS O O N N N Y // S O O N NN Y // SSSS OOO N N Y //============================================================================== #define SONY_BITS 12 #define SONY_HDR_MARK 2400 #define SONY_HDR_SPACE 600 #define SONY_ONE_MARK 1200 #define SONY_ZERO_MARK 600 #define SONY_RPT_LENGTH 45000 #define SONY_DOUBLE_SPACE_USECS 500 // usually ssee 713 - not using ticks as get number wrapround //+============================================================================= #if SEND_SONY void IRsend::sendSony (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(40); // Header mark(SONY_HDR_MARK); space(SONY_HDR_SPACE); // Data for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) { if (data & mask) { mark(SONY_ONE_MARK); space(SONY_HDR_SPACE); } else { mark(SONY_ZERO_MARK); space(SONY_HDR_SPACE); } } // We will have ended with LED off } #endif //+============================================================================= #if DECODE_SONY bool IRrecv::decodeSony (decode_results *results) { long data = 0; int offset = 0; // Dont skip first space, check its size if (irparams.rawlen < (2 * SONY_BITS) + 2) return false ; // Some Sony's deliver repeats fast after first // unfortunately can't spot difference from of repeat from two fast clicks if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) { // Serial.print("IR Gap found: "); results->bits = 0; results->value = REPEAT; # ifdef DECODE_SANYO results->decode_type = SANYO; # else results->decode_type = UNKNOWN; # endif return true; } offset++; // Initial mark if (!MATCH_MARK(results->rawbuf[offset++], SONY_HDR_MARK)) return false ; while (offset + 1 < irparams.rawlen) { if (!MATCH_SPACE(results->rawbuf[offset++], SONY_HDR_SPACE)) break ; if (MATCH_MARK(results->rawbuf[offset], SONY_ONE_MARK)) data = (data << 1) | 1 ; else if (MATCH_MARK(results->rawbuf[offset], SONY_ZERO_MARK)) data = (data << 1) | 0 ; else return false ; offset++; } // Success results->bits = (offset - 1) / 2; if (results->bits < 12) { results->bits = 0; return false; } results->value = data; results->decode_type = SONY; return true; } #endif