96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
|
#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
|
||
|
|