Infrared remote library for Arduino: send and receive infrared signals with multiple protocols Port from Arduino-IRremote https://github.com/z3t0/Arduino-IRremote

Revision:
0:70c8e56bac45
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ir_Denon.cpp	Sat Jan 23 06:16:48 2016 +0000
@@ -0,0 +1,94 @@
+#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