1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #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
|