95 lines
3.1 KiB
C++
95 lines
3.1 KiB
C++
|
#include "IRremote.h"
|
||
|
#include "IRremoteInt.h"
|
||
|
|
||
|
// Reverse Engineered by looking at RAW dumps generated by IRremote
|
||
|
|
||
|
// I have since discovered that Denon publish all their IR codes:
|
||
|
// https://www.google.co.uk/search?q=DENON+MASTER+IR+Hex+Command+Sheet
|
||
|
// -> http://assets.denon.com/documentmaster/us/denon%20master%20ir%20hex.xls
|
||
|
|
||
|
// Having looked at the official Denon Pronto sheet and reverse engineered
|
||
|
// the timing values from it, it is obvious that Denon have a range of
|
||
|
// different timings and protocols ...the values here work for my AVR-3801 Amp!
|
||
|
|
||
|
//==============================================================================
|
||
|
// DDDD EEEEE N N OOO N N
|
||
|
// D D E NN N O O NN N
|
||
|
// D D EEE N N N O O N N N
|
||
|
// D D E N NN O O N NN
|
||
|
// DDDD EEEEE N N OOO N N
|
||
|
//==============================================================================
|
||
|
|
||
|
#define BITS 14 // The number of bits in the command
|
||
|
|
||
|
#define HDR_MARK 300 // The length of the Header:Mark
|
||
|
#define HDR_SPACE 750 // The lenght of the Header:Space
|
||
|
|
||
|
#define BIT_MARK 300 // The length of a Bit:Mark
|
||
|
#define ONE_SPACE 1800 // The length of a Bit:Space for 1's
|
||
|
#define ZERO_SPACE 750 // The length of a Bit:Space for 0's
|
||
|
|
||
|
//+=============================================================================
|
||
|
//
|
||
|
#if SEND_DENON
|
||
|
void IRsend::sendDenon (unsigned long data, int nbits)
|
||
|
{
|
||
|
// Set IR carrier frequency
|
||
|
enableIROut(38);
|
||
|
|
||
|
// Header
|
||
|
mark (HDR_MARK);
|
||
|
space(HDR_SPACE);
|
||
|
|
||
|
// Data
|
||
|
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||
|
if (data & mask) {
|
||
|
mark (BIT_MARK);
|
||
|
space(ONE_SPACE);
|
||
|
} else {
|
||
|
mark (BIT_MARK);
|
||
|
space(ZERO_SPACE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Footer
|
||
|
mark(BIT_MARK);
|
||
|
space(0); // Always end with the LED off
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//+=============================================================================
|
||
|
//
|
||
|
#if DECODE_DENON
|
||
|
bool IRrecv::decodeDenon (decode_results *results)
|
||
|
{
|
||
|
unsigned long data = 0; // Somewhere to build our code
|
||
|
int offset = 1; // Skip the Gap reading
|
||
|
|
||
|
// Check we have the right amount of data
|
||
|
if (irparams.rawlen != 1 + 2 + (2 * BITS) + 1) return false ;
|
||
|
|
||
|
// Check initial Mark+Space match
|
||
|
if (!MATCH_MARK (results->rawbuf[offset++], HDR_MARK )) return false ;
|
||
|
if (!MATCH_SPACE(results->rawbuf[offset++], HDR_SPACE)) return false ;
|
||
|
|
||
|
// Read the bits in
|
||
|
for (int i = 0; i < BITS; i++) {
|
||
|
// Each bit looks like: MARK + SPACE_1 -> 1
|
||
|
// or : MARK + SPACE_0 -> 0
|
||
|
if (!MATCH_MARK(results->rawbuf[offset++], BIT_MARK)) return false ;
|
||
|
|
||
|
// IR data is big-endian, so we shuffle it in from the right:
|
||
|
if (MATCH_SPACE(results->rawbuf[offset], ONE_SPACE)) data = (data << 1) | 1 ;
|
||
|
else if (MATCH_SPACE(results->rawbuf[offset], ZERO_SPACE)) data = (data << 1) | 0 ;
|
||
|
else return false ;
|
||
|
offset++;
|
||
|
}
|
||
|
|
||
|
// Success
|
||
|
results->bits = BITS;
|
||
|
results->value = data;
|
||
|
results->decode_type = DENON;
|
||
|
return true;
|
||
|
}
|
||
|
#endif
|