diff --git a/IRremote.cpp b/IRremote.cpp index deb2307..f8ccedb 100644 --- a/IRremote.cpp +++ b/IRremote.cpp @@ -1106,42 +1106,37 @@ i.e. use 0x1C10 instead of 0x0000000000001C10 which is listed in the linked LIRC file. */ -void IRsend::sendSharp(unsigned long data, int nbits) { - unsigned long invertdata = data ^ SHARP_TOGGLE_MASK; +void IRsend::sendSharpRaw(unsigned long data, int nbits) { 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) -{ +// Sharp send compatible with data obtained through decodeSharp +void IRsend::sendSharp(unsigned int address, unsigned int command) { + sendSharpRaw((address << 10) | (command << 2) | 2, 15); +} + +void IRsend::sendDISH(unsigned long data, int nbits) { enableIROut(56); mark(DISH_HDR_MARK); space(DISH_HDR_SPACE); diff --git a/IRremote.h b/IRremote.h index e4463e8..17d5e81 100644 --- a/IRremote.h +++ b/IRremote.h @@ -28,7 +28,10 @@ class decode_results { public: int decode_type; // NEC, SONY, RC5, UNKNOWN - unsigned int panasonicAddress; // This is only used for decoding Panasonic data + union { // This is used for decoding Panasonic and Sharp data + unsigned int panasonicAddress; + unsigned int sharpAddress; + }; unsigned long value; // Decoded value int bits; // Number of bits in decoded value volatile unsigned int *rawbuf; // Raw intervals in .5 us ticks @@ -101,7 +104,8 @@ public: void sendRC5(unsigned long data, int nbits); void sendRC6(unsigned long data, int nbits); void sendDISH(unsigned long data, int nbits); - void sendSharp(unsigned long data, int nbits); + void sendSharp(unsigned int address, unsigned int command); + void sendSharpRaw(unsigned long data, int nbits); void sendPanasonic(unsigned int address, unsigned long data); void sendJVC(unsigned long data, int nbits, int repeat); // *Note instead of sending the REPEAT constant if you want the JVC repeat signal sent, send the original code value and change the repeat argument from 0 to 1. JVC protocol repeats by skipping the header NOT by sending a separate code value like NEC does. // private: diff --git a/keywords.txt b/keywords.txt index 74010c4..6e77362 100644 --- a/keywords.txt +++ b/keywords.txt @@ -28,6 +28,7 @@ sendRC5 KEYWORD2 sendRC6 KEYWORD2 sendDISH KEYWORD2 sendSharp KEYWORD2 +sendSharpRaw KEYWORD2 sendPanasonic KEYWORD2 sendJVC KEYWORD2 @@ -47,4 +48,4 @@ SHARP LITERAL1 PANASONIC LITERAL1 JVC LITERAL1 UNKNOWN LITERAL1 -REPEAT LITERAL1 \ No newline at end of file +REPEAT LITERAL1