Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: ir_Denon.cpp
- 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