From 95f93e639eba2fa111a4d45b2c277003d2730790 Mon Sep 17 00:00:00 2001 From: Piotr Dobrowolski Date: Wed, 17 Sep 2014 21:30:36 +0200 Subject: [PATCH] Cleanup sendSharp and fix reliability --- IRremote.cpp | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/IRremote.cpp b/IRremote.cpp index deb2307..2c0f90d 100644 --- a/IRremote.cpp +++ b/IRremote.cpp @@ -1109,35 +1109,27 @@ linked LIRC file. void IRsend::sendSharp(unsigned long data, int nbits) { unsigned long invertdata = data ^ SHARP_TOGGLE_MASK; enableIROut(38); - for (int i = 0; i < nbits; i++) { - if (data & 0x4000) { - mark(SHARP_BIT_MARK); - space(SHARP_ONE_SPACE); + + // Sending codes in bursts of 3 (normal, inverted, normal) makes transmission + // much more reliable. That's the exact behaviour of CD-S6470 remote control. + for (int n = 0; n < 3; n++) { + for (int i = 1 << (nbits-1); i > 0; i>>=1) { + if (data & i) { + mark(SHARP_BIT_MARK); + space(SHARP_ONE_SPACE); + } + else { + mark(SHARP_BIT_MARK); + space(SHARP_ZERO_SPACE); + } } - else { - mark(SHARP_BIT_MARK); - space(SHARP_ZERO_SPACE); - } - data <<= 1; + + mark(SHARP_BIT_MARK); + space(SHARP_ZERO_SPACE); + delay(40); + + data = data ^ SHARP_TOGGLE_MASK; } - - mark(SHARP_BIT_MARK); - space(SHARP_ZERO_SPACE); - delay(46); - for (int i = 0; i < nbits; i++) { - if (invertdata & 0x4000) { - mark(SHARP_BIT_MARK); - space(SHARP_ONE_SPACE); - } - else { - mark(SHARP_BIT_MARK); - space(SHARP_ZERO_SPACE); - } - invertdata <<= 1; - } - mark(SHARP_BIT_MARK); - space(SHARP_ZERO_SPACE); - delay(46); } void IRsend::sendDISH(unsigned long data, int nbits)