Optimise send() loops

Query accuracy of sendAiwaRCT501() [see inline comment]
This commit is contained in:
Bluechip
2015-06-18 19:24:21 +01:00
parent 6af9a1b485
commit 001ccf9425

View File

@@ -106,8 +106,8 @@ void IRsend::sendNEC (unsigned long data, int nbits)
enableIROut(38); enableIROut(38);
mark(NEC_HDR_MARK); mark(NEC_HDR_MARK);
space(NEC_HDR_SPACE); space(NEC_HDR_SPACE);
for (int i = 0; i < nbits; i++) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & TOPBIT) { if (data & mask) {
mark(NEC_BIT_MARK); mark(NEC_BIT_MARK);
space(NEC_ONE_SPACE); space(NEC_ONE_SPACE);
} }
@@ -115,7 +115,6 @@ void IRsend::sendNEC (unsigned long data, int nbits)
mark(NEC_BIT_MARK); mark(NEC_BIT_MARK);
space(NEC_ZERO_SPACE); space(NEC_ZERO_SPACE);
} }
data <<= 1;
} }
mark(NEC_BIT_MARK); mark(NEC_BIT_MARK);
space(0); space(0);
@@ -131,8 +130,8 @@ void IRsend::sendWhynter (unsigned long data, int nbits)
space(WHYNTER_ZERO_SPACE); space(WHYNTER_ZERO_SPACE);
mark(WHYNTER_HDR_MARK); mark(WHYNTER_HDR_MARK);
space(WHYNTER_HDR_SPACE); space(WHYNTER_HDR_SPACE);
for (int i = 0; i < nbits; i++) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & TOPBIT) { if (data & mask) {
mark(WHYNTER_ONE_MARK); mark(WHYNTER_ONE_MARK);
space(WHYNTER_ONE_SPACE); space(WHYNTER_ONE_SPACE);
} }
@@ -140,7 +139,6 @@ void IRsend::sendWhynter (unsigned long data, int nbits)
mark(WHYNTER_ZERO_MARK); mark(WHYNTER_ZERO_MARK);
space(WHYNTER_ZERO_SPACE); space(WHYNTER_ZERO_SPACE);
} }
data <<= 1;
} }
mark(WHYNTER_ZERO_MARK); mark(WHYNTER_ZERO_MARK);
space(WHYNTER_ZERO_SPACE); space(WHYNTER_ZERO_SPACE);
@@ -154,9 +152,8 @@ void IRsend::sendSony (unsigned long data, int nbits)
enableIROut(40); enableIROut(40);
mark(SONY_HDR_MARK); mark(SONY_HDR_MARK);
space(SONY_HDR_SPACE); space(SONY_HDR_SPACE);
data = data << (32 - nbits); for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
for (int i = 0; i < nbits; i++) { if (data & mask) {
if (data & TOPBIT) {
mark(SONY_ONE_MARK); mark(SONY_ONE_MARK);
space(SONY_HDR_SPACE); space(SONY_HDR_SPACE);
} }
@@ -164,7 +161,6 @@ void IRsend::sendSony (unsigned long data, int nbits)
mark(SONY_ZERO_MARK); mark(SONY_ZERO_MARK);
space(SONY_HDR_SPACE); space(SONY_HDR_SPACE);
} }
data <<= 1;
} }
} }
#endif #endif
@@ -187,12 +183,11 @@ void IRsend::sendRaw (unsigned int buf[], int len, int hz)
void IRsend::sendRC5 (unsigned long data, int nbits) void IRsend::sendRC5 (unsigned long data, int nbits)
{ {
enableIROut(36); enableIROut(36);
data = data << (32 - nbits);
mark(RC5_T1); // First start bit mark(RC5_T1); // First start bit
space(RC5_T1); // Second start bit space(RC5_T1); // Second start bit
mark(RC5_T1); // Second start bit mark(RC5_T1); // Second start bit
for (int i = 0; i < nbits; i++) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & TOPBIT) { if (data & mask) {
space(RC5_T1); // 1 is space, then mark space(RC5_T1); // 1 is space, then mark
mark(RC5_T1); mark(RC5_T1);
} }
@@ -200,7 +195,6 @@ void IRsend::sendRC5 (unsigned long data, int nbits)
mark(RC5_T1); mark(RC5_T1);
space(RC5_T1); space(RC5_T1);
} }
data <<= 1;
} }
space(0); // Turn off at end space(0); // Turn off at end
} }
@@ -213,16 +207,15 @@ void IRsend::sendRC5 (unsigned long data, int nbits)
void IRsend::sendRC6 (unsigned long data, int nbits) void IRsend::sendRC6 (unsigned long data, int nbits)
{ {
enableIROut(36); enableIROut(36);
data = data << (32 - nbits);
mark(RC6_HDR_MARK); mark(RC6_HDR_MARK);
space(RC6_HDR_SPACE); space(RC6_HDR_SPACE);
mark(RC6_T1); // start bit mark(RC6_T1); // start bit
space(RC6_T1); space(RC6_T1);
int t; for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
for (int i = 0; i < nbits; i++) { int t;
if (i == 3) t = RC6_T1 * 2 ; // double-wide trailer bit if (i == 3) t = RC6_T1 * 2 ; // double-wide trailer bit
else t = RC6_T1 ; else t = RC6_T1 ;
if (data & TOPBIT) { if (data & mask) {
mark(t); mark(t);
space(t); space(t);
} }
@@ -230,8 +223,6 @@ void IRsend::sendRC6 (unsigned long data, int nbits)
space(t); space(t);
mark(t); mark(t);
} }
data <<= 1;
} }
space(0); // Turn off at end space(0); // Turn off at end
} }
@@ -245,18 +236,16 @@ void IRsend::sendPanasonic (unsigned int address, unsigned long data)
mark(PANASONIC_HDR_MARK); mark(PANASONIC_HDR_MARK);
space(PANASONIC_HDR_SPACE); space(PANASONIC_HDR_SPACE);
for (int i = 0; i < 16; i++) for (unsigned long mask = 1 << (16 - 1); mask; mask >>= 1) {
{ {
mark(PANASONIC_BIT_MARK); mark(PANASONIC_BIT_MARK);
if (address & 0x8000) space(PANASONIC_ONE_SPACE) ; if (address & mask) space(PANASONIC_ONE_SPACE) ;
else space(PANASONIC_ZERO_SPACE) ; else space(PANASONIC_ZERO_SPACE) ;
address <<= 1;
} }
for (int i = 0; i < 32; i++) { for (unsigned long mask = 1 << (32 - 1); mask; mask >>= 1) {
mark(PANASONIC_BIT_MARK); mark(PANASONIC_BIT_MARK);
if (data & TOPBIT) space(PANASONIC_ONE_SPACE) ; if (data & mask) space(PANASONIC_ONE_SPACE) ;
else space(PANASONIC_ZERO_SPACE) ; else space(PANASONIC_ZERO_SPACE) ;
data <<= 1;
} }
mark(PANASONIC_BIT_MARK); mark(PANASONIC_BIT_MARK);
space(0); space(0);
@@ -268,13 +257,12 @@ void IRsend::sendPanasonic (unsigned int address, unsigned long data)
void IRsend::sendJVC (unsigned long data, int nbits, int repeat) void IRsend::sendJVC (unsigned long data, int nbits, int repeat)
{ {
enableIROut(38); enableIROut(38);
data = data << (32 - nbits);
if (!repeat){ if (!repeat){
mark(JVC_HDR_MARK); mark(JVC_HDR_MARK);
space(JVC_HDR_SPACE); space(JVC_HDR_SPACE);
} }
for (int i = 0; i < nbits; i++) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & TOPBIT) { if (data & mask) {
mark(JVC_BIT_MARK); mark(JVC_BIT_MARK);
space(JVC_ONE_SPACE); space(JVC_ONE_SPACE);
} }
@@ -282,7 +270,6 @@ void IRsend::sendJVC (unsigned long data, int nbits, int repeat)
mark(JVC_BIT_MARK); mark(JVC_BIT_MARK);
space(JVC_ZERO_SPACE); space(JVC_ZERO_SPACE);
} }
data <<= 1;
} }
mark(JVC_BIT_MARK); mark(JVC_BIT_MARK);
space(0); space(0);
@@ -296,8 +283,8 @@ void IRsend::sendSAMSUNG (unsigned long data, int nbits)
enableIROut(38); enableIROut(38);
mark(SAMSUNG_HDR_MARK); mark(SAMSUNG_HDR_MARK);
space(SAMSUNG_HDR_SPACE); space(SAMSUNG_HDR_SPACE);
for (int i = 0; i < nbits; i++) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & TOPBIT) { if (data & mask) {
mark(SAMSUNG_BIT_MARK); mark(SAMSUNG_BIT_MARK);
space(SAMSUNG_ONE_SPACE); space(SAMSUNG_ONE_SPACE);
} }
@@ -305,7 +292,6 @@ void IRsend::sendSAMSUNG (unsigned long data, int nbits)
mark(SAMSUNG_BIT_MARK); mark(SAMSUNG_BIT_MARK);
space(SAMSUNG_ZERO_SPACE); space(SAMSUNG_ZERO_SPACE);
} }
data <<= 1;
} }
mark(SAMSUNG_BIT_MARK); mark(SAMSUNG_BIT_MARK);
space(0); space(0);
@@ -1171,8 +1157,8 @@ void IRsend::sendSharp (unsigned long data, int nbits)
// Sending codes in bursts of 3 (normal, inverted, normal) makes transmission // Sending codes in bursts of 3 (normal, inverted, normal) makes transmission
// much more reliable. That's the exact behaviour of CD-S6470 remote control. // much more reliable. That's the exact behaviour of CD-S6470 remote control.
for (int n = 0; n < 3; n++) { for (int n = 0; n < 3; n++) {
for (int i = 1 << (nbits - 1); i > 0; i >>= 1) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & i) { if (data & mask) {
mark(SHARP_BIT_MARK); mark(SHARP_BIT_MARK);
space(SHARP_ONE_SPACE); space(SHARP_ONE_SPACE);
} }
@@ -1207,8 +1193,8 @@ void IRsend::sendDISH (unsigned long data, int nbits)
enableIROut(56); enableIROut(56);
mark(DISH_HDR_MARK); mark(DISH_HDR_MARK);
space(DISH_HDR_SPACE); space(DISH_HDR_SPACE);
for (int i = 0; i < nbits; i++) { for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
if (data & DISH_TOP_BIT) { if (data & mark) {
mark(DISH_BIT_MARK); mark(DISH_BIT_MARK);
space(DISH_ONE_SPACE); space(DISH_ONE_SPACE);
} }
@@ -1216,7 +1202,6 @@ void IRsend::sendDISH (unsigned long data, int nbits)
mark(DISH_BIT_MARK); mark(DISH_BIT_MARK);
space(DISH_ZERO_SPACE); space(DISH_ZERO_SPACE);
} }
data <<= 1;
} }
} }
#endif #endif