diff --git a/IRremote.h b/IRremote.h index fe1a87029..4ce810ec7 100644 --- a/IRremote.h +++ b/IRremote.h @@ -270,6 +270,7 @@ class IRsend //...................................................................... # if SEND_RC5 void sendRC5 (unsigned long data, int nbits) ; + void sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle); # endif # if SEND_RC6 void sendRC6 (unsigned long data, int nbits) ; diff --git a/changelog.md b/changelog.md index 81339f2e6..6273309f7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,6 @@ +## ? +- Added Philips Extended RC-5 protocol support [PR #522] (https://github.com/z3t0/Arduino-IRremote/pull/522) + ## 2.3.3 - 2017/03/31 - Added ESP32 IR receive support [PR #427](https://github.com/z3t0/Arduino-IRremote/pull/425) diff --git a/ir_RC5_RC6.cpp b/ir_RC5_RC6.cpp index 10e79278e..e16a334aa 100644 --- a/ir_RC5_RC6.cpp +++ b/ir_RC5_RC6.cpp @@ -78,6 +78,73 @@ void IRsend::sendRC5 (unsigned long data, int nbits) space(0); // Always end with the LED off } + +void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle) +{ + // Set IR carrier frequency + enableIROut(36); + + unsigned long addressBits = 5; + unsigned long commandBits = 7; + unsigned long nbits = addressBits + commandBits; + + // Start + mark(RC5_T1); + + // Bit #6 of the command part, but inverted! + unsigned long cmdBit6 = (1UL << (commandBits-1)) & cmd; + if (cmdBit6) { + // Inverted (1 -> 0 = mark-to-space) + mark(RC5_T1); + space(RC5_T1); + } else { + space(RC5_T1); + mark(RC5_T1); + } + commandBits--; + + // Toggle bit + static int toggleBit = 1; + if (toggle) { + if (toggleBit == 0) { + toggleBit = 1; + } else { + toggleBit = 0; + } + } + if (toggleBit) { + space(RC5_T1); + mark(RC5_T1); + } else { + mark(RC5_T1); + space(RC5_T1); + } + + // Address + for (unsigned long mask = 1UL << (addressBits - 1); mask; mask >>= 1) { + if (addr & mask) { + space(RC5_T1); // 1 is space, then mark + mark(RC5_T1); + } else { + mark(RC5_T1); + space(RC5_T1); + } + } + + // Command + for (unsigned long mask = 1UL << (commandBits - 1); mask; mask >>= 1) { + if (cmd & mask) { + space(RC5_T1); // 1 is space, then mark + mark(RC5_T1); + } else { + mark(RC5_T1); + space(RC5_T1); + } + } + + space(0); // Always end with the LED off +} + #endif //+=============================================================================