From 4d3b73d5e7615041b55b6d4751ac9a164f16ee19 Mon Sep 17 00:00:00 2001 From: Lars Weje Hangstrup Date: Tue, 12 Sep 2017 22:28:23 +0200 Subject: [PATCH 1/6] Modifications added to get the sony2lava project. --- IRremote.h | 3 +- irSend.cpp | 6 ++++ ir_NEC.cpp | 3 ++ ir_RC5_RC6.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 89 insertions(+), 2 deletions(-) diff --git a/IRremote.h b/IRremote.h index fe1a87029..ff6f6640e 100644 --- a/IRremote.h +++ b/IRremote.h @@ -1,4 +1,3 @@ - //****************************************************************************** // IRremote // Version 2.0.1 June, 2015 @@ -263,6 +262,7 @@ class IRsend void custom_delay_usec (unsigned long uSecs); void enableIROut (int khz) ; + void disableIROut ( ) ; void mark (unsigned int usec) ; void space (unsigned int usec) ; void sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz) ; @@ -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/irSend.cpp b/irSend.cpp index c3ef3ffac..d9b32a0ca 100644 --- a/irSend.cpp +++ b/irSend.cpp @@ -71,6 +71,12 @@ void IRsend::enableIROut (int khz) #endif } +void IRsend::disableIROut () +{ + TIMER_ENABLE_INTR; + TIMER_CONFIG_NORMAL(); +} + //+============================================================================= // Custom delay function that circumvents Arduino's delayMicroseconds limit diff --git a/ir_NEC.cpp b/ir_NEC.cpp index 3b4932100..d9f162a75 100644 --- a/ir_NEC.cpp +++ b/ir_NEC.cpp @@ -23,6 +23,7 @@ void IRsend::sendNEC (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(38); + delay(200); // Added by LWH // Header mark(NEC_HDR_MARK); @@ -42,6 +43,8 @@ void IRsend::sendNEC (unsigned long data, int nbits) // Footer mark(NEC_BIT_MARK); space(0); // Always end with the LED off + disableIROut(); // Added by LWH + } #endif diff --git a/ir_RC5_RC6.cpp b/ir_RC5_RC6.cpp index 10e79278e..7fd6e36a4 100644 --- a/ir_RC5_RC6.cpp +++ b/ir_RC5_RC6.cpp @@ -50,7 +50,7 @@ int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int // NB: First bit must be a one (start bit) // #define MIN_RC5_SAMPLES 11 -#define RC5_T1 889 +#define RC5_T1 830 //LWH originally: 889 #define RC5_RPT_LENGTH 46000 //+============================================================================= @@ -59,6 +59,7 @@ void IRsend::sendRC5 (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(36); + delay(84); // Added by LWH // Start mark(RC5_T1); @@ -77,7 +78,83 @@ void IRsend::sendRC5 (unsigned long data, int nbits) } space(0); // Always end with the LED off + + //delay(1000); // Added by LWH + disableIROut(); // Added by LWH + +} + +void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle) +{ + // Set IR carrier frequency + enableIROut(36); + delay(80); // Added by LWH + + unsigned long addressBits = 5; + unsigned long commandBits = 7; + unsigned long nbits = addressBits + commandBits; + + + // Start + mark(RC5_T1); + + // Bit #6 og 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 + + disableIROut(); // Added by LWH + } + #endif //+============================================================================= From 7d0e8da7f055e3d7396c9bad22fad26e5933dcdd Mon Sep 17 00:00:00 2001 From: Lars Weje Hangstrup Date: Tue, 12 Sep 2017 22:34:27 +0200 Subject: [PATCH 2/6] Revert "Modifications added to get the sony2lava project." This reverts commit 4d3b73d5e7615041b55b6d4751ac9a164f16ee19. --- IRremote.h | 3 +- irSend.cpp | 6 ---- ir_NEC.cpp | 3 -- ir_RC5_RC6.cpp | 79 +------------------------------------------------- 4 files changed, 2 insertions(+), 89 deletions(-) diff --git a/IRremote.h b/IRremote.h index ff6f6640e..fe1a87029 100644 --- a/IRremote.h +++ b/IRremote.h @@ -1,3 +1,4 @@ + //****************************************************************************** // IRremote // Version 2.0.1 June, 2015 @@ -262,7 +263,6 @@ class IRsend void custom_delay_usec (unsigned long uSecs); void enableIROut (int khz) ; - void disableIROut ( ) ; void mark (unsigned int usec) ; void space (unsigned int usec) ; void sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz) ; @@ -270,7 +270,6 @@ 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/irSend.cpp b/irSend.cpp index d9b32a0ca..c3ef3ffac 100644 --- a/irSend.cpp +++ b/irSend.cpp @@ -71,12 +71,6 @@ void IRsend::enableIROut (int khz) #endif } -void IRsend::disableIROut () -{ - TIMER_ENABLE_INTR; - TIMER_CONFIG_NORMAL(); -} - //+============================================================================= // Custom delay function that circumvents Arduino's delayMicroseconds limit diff --git a/ir_NEC.cpp b/ir_NEC.cpp index d9f162a75..3b4932100 100644 --- a/ir_NEC.cpp +++ b/ir_NEC.cpp @@ -23,7 +23,6 @@ void IRsend::sendNEC (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(38); - delay(200); // Added by LWH // Header mark(NEC_HDR_MARK); @@ -43,8 +42,6 @@ void IRsend::sendNEC (unsigned long data, int nbits) // Footer mark(NEC_BIT_MARK); space(0); // Always end with the LED off - disableIROut(); // Added by LWH - } #endif diff --git a/ir_RC5_RC6.cpp b/ir_RC5_RC6.cpp index 7fd6e36a4..10e79278e 100644 --- a/ir_RC5_RC6.cpp +++ b/ir_RC5_RC6.cpp @@ -50,7 +50,7 @@ int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int // NB: First bit must be a one (start bit) // #define MIN_RC5_SAMPLES 11 -#define RC5_T1 830 //LWH originally: 889 +#define RC5_T1 889 #define RC5_RPT_LENGTH 46000 //+============================================================================= @@ -59,7 +59,6 @@ void IRsend::sendRC5 (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(36); - delay(84); // Added by LWH // Start mark(RC5_T1); @@ -78,83 +77,7 @@ void IRsend::sendRC5 (unsigned long data, int nbits) } space(0); // Always end with the LED off - - //delay(1000); // Added by LWH - disableIROut(); // Added by LWH - -} - -void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle) -{ - // Set IR carrier frequency - enableIROut(36); - delay(80); // Added by LWH - - unsigned long addressBits = 5; - unsigned long commandBits = 7; - unsigned long nbits = addressBits + commandBits; - - - // Start - mark(RC5_T1); - - // Bit #6 og 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 - - disableIROut(); // Added by LWH - } - #endif //+============================================================================= From 7fc9795d4ae2ae5aa8a953cad696e65e5510c213 Mon Sep 17 00:00:00 2001 From: Lars Weje Hangstrup Date: Tue, 12 Sep 2017 22:59:51 +0200 Subject: [PATCH 3/6] OK (in, out, auto) --- IRremote.h | 3 +- irSend.cpp | 6 ++++ ir_RC5_RC6.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/IRremote.h b/IRremote.h index fe1a87029..ff6f6640e 100644 --- a/IRremote.h +++ b/IRremote.h @@ -1,4 +1,3 @@ - //****************************************************************************** // IRremote // Version 2.0.1 June, 2015 @@ -263,6 +262,7 @@ class IRsend void custom_delay_usec (unsigned long uSecs); void enableIROut (int khz) ; + void disableIROut ( ) ; void mark (unsigned int usec) ; void space (unsigned int usec) ; void sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz) ; @@ -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/irSend.cpp b/irSend.cpp index c3ef3ffac..d9b32a0ca 100644 --- a/irSend.cpp +++ b/irSend.cpp @@ -71,6 +71,12 @@ void IRsend::enableIROut (int khz) #endif } +void IRsend::disableIROut () +{ + TIMER_ENABLE_INTR; + TIMER_CONFIG_NORMAL(); +} + //+============================================================================= // Custom delay function that circumvents Arduino's delayMicroseconds limit diff --git a/ir_RC5_RC6.cpp b/ir_RC5_RC6.cpp index 10e79278e..26cb4aabe 100644 --- a/ir_RC5_RC6.cpp +++ b/ir_RC5_RC6.cpp @@ -50,7 +50,7 @@ int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int // NB: First bit must be a one (start bit) // #define MIN_RC5_SAMPLES 11 -#define RC5_T1 889 +#define RC5_T1 830 //LWH originally: 889 #define RC5_RPT_LENGTH 46000 //+============================================================================= @@ -59,6 +59,7 @@ void IRsend::sendRC5 (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(36); + delay(84); // Added by LWH // Start mark(RC5_T1); @@ -77,7 +78,82 @@ void IRsend::sendRC5 (unsigned long data, int nbits) } space(0); // Always end with the LED off + + disableIROut(); // Added by LWH + +} + +void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle) +{ + // Set IR carrier frequency + enableIROut(36); + delay(80); // Added by LWH + + unsigned long addressBits = 5; + unsigned long commandBits = 7; + unsigned long nbits = addressBits + commandBits; + + + // Start + mark(RC5_T1); + + // Bit #6 og 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 + + disableIROut(); // Added by LWH + } + #endif //+============================================================================= From 1975b23a8e8171ca48c8c909c9038da4d9f69536 Mon Sep 17 00:00:00 2001 From: Lars Weje Hangstrup Date: Wed, 13 Sep 2017 21:37:18 +0200 Subject: [PATCH 4/6] Removed the inserted delays --- ir_RC5_RC6.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/ir_RC5_RC6.cpp b/ir_RC5_RC6.cpp index 26cb4aabe..e16a334aa 100644 --- a/ir_RC5_RC6.cpp +++ b/ir_RC5_RC6.cpp @@ -50,7 +50,7 @@ int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int // NB: First bit must be a one (start bit) // #define MIN_RC5_SAMPLES 11 -#define RC5_T1 830 //LWH originally: 889 +#define RC5_T1 889 #define RC5_RPT_LENGTH 46000 //+============================================================================= @@ -59,7 +59,6 @@ void IRsend::sendRC5 (unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(36); - delay(84); // Added by LWH // Start mark(RC5_T1); @@ -78,26 +77,21 @@ void IRsend::sendRC5 (unsigned long data, int nbits) } space(0); // Always end with the LED off - - disableIROut(); // Added by LWH - } void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle) { // Set IR carrier frequency enableIROut(36); - delay(80); // Added by LWH unsigned long addressBits = 5; unsigned long commandBits = 7; unsigned long nbits = addressBits + commandBits; - // Start mark(RC5_T1); - // Bit #6 og the command part, but inverted! + // Bit #6 of the command part, but inverted! unsigned long cmdBit6 = (1UL << (commandBits-1)) & cmd; if (cmdBit6) { // Inverted (1 -> 0 = mark-to-space) @@ -149,9 +143,6 @@ void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle) } space(0); // Always end with the LED off - - disableIROut(); // Added by LWH - } #endif From ff997259b8fb1969ee5a7e35e22cacd1700ba18a Mon Sep 17 00:00:00 2001 From: Lars Weje Hangstrup Date: Thu, 14 Sep 2017 20:12:21 +0200 Subject: [PATCH 5/6] Added support for RC5 extended --- IRremote.h | 1 + ir_RC5_RC6.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) 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/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 //+============================================================================= From 7f96421da1e9c2d8ac8261be6917960f73f0d789 Mon Sep 17 00:00:00 2001 From: Lars Weje Hangstrup Date: Tue, 19 Sep 2017 20:16:37 +0200 Subject: [PATCH 6/6] Updated changelog.md --- changelog.md | 3 +++ 1 file changed, 3 insertions(+) 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)