mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2025-12-12 17:36:15 +00:00
Optimise send() loops
Query accuracy of sendAiwaRCT501() [see inline comment]
This commit is contained in:
65
IRremote.cpp
65
IRremote.cpp
@@ -106,8 +106,8 @@ void IRsend::sendNEC (unsigned long data, int nbits)
|
||||
enableIROut(38);
|
||||
mark(NEC_HDR_MARK);
|
||||
space(NEC_HDR_SPACE);
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(NEC_BIT_MARK);
|
||||
space(NEC_ONE_SPACE);
|
||||
}
|
||||
@@ -115,7 +115,6 @@ void IRsend::sendNEC (unsigned long data, int nbits)
|
||||
mark(NEC_BIT_MARK);
|
||||
space(NEC_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
mark(NEC_BIT_MARK);
|
||||
space(0);
|
||||
@@ -131,8 +130,8 @@ void IRsend::sendWhynter (unsigned long data, int nbits)
|
||||
space(WHYNTER_ZERO_SPACE);
|
||||
mark(WHYNTER_HDR_MARK);
|
||||
space(WHYNTER_HDR_SPACE);
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(WHYNTER_ONE_MARK);
|
||||
space(WHYNTER_ONE_SPACE);
|
||||
}
|
||||
@@ -140,7 +139,6 @@ void IRsend::sendWhynter (unsigned long data, int nbits)
|
||||
mark(WHYNTER_ZERO_MARK);
|
||||
space(WHYNTER_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
mark(WHYNTER_ZERO_MARK);
|
||||
space(WHYNTER_ZERO_SPACE);
|
||||
@@ -154,9 +152,8 @@ void IRsend::sendSony (unsigned long data, int nbits)
|
||||
enableIROut(40);
|
||||
mark(SONY_HDR_MARK);
|
||||
space(SONY_HDR_SPACE);
|
||||
data = data << (32 - nbits);
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(SONY_ONE_MARK);
|
||||
space(SONY_HDR_SPACE);
|
||||
}
|
||||
@@ -164,7 +161,6 @@ void IRsend::sendSony (unsigned long data, int nbits)
|
||||
mark(SONY_ZERO_MARK);
|
||||
space(SONY_HDR_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -187,12 +183,11 @@ void IRsend::sendRaw (unsigned int buf[], int len, int hz)
|
||||
void IRsend::sendRC5 (unsigned long data, int nbits)
|
||||
{
|
||||
enableIROut(36);
|
||||
data = data << (32 - nbits);
|
||||
mark(RC5_T1); // First start bit
|
||||
space(RC5_T1); // Second start bit
|
||||
mark(RC5_T1); // Second start bit
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
space(RC5_T1); // 1 is space, then mark
|
||||
mark(RC5_T1);
|
||||
}
|
||||
@@ -200,7 +195,6 @@ void IRsend::sendRC5 (unsigned long data, int nbits)
|
||||
mark(RC5_T1);
|
||||
space(RC5_T1);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
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)
|
||||
{
|
||||
enableIROut(36);
|
||||
data = data << (32 - nbits);
|
||||
mark(RC6_HDR_MARK);
|
||||
space(RC6_HDR_SPACE);
|
||||
mark(RC6_T1); // start bit
|
||||
space(RC6_T1);
|
||||
int t;
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
int t;
|
||||
if (i == 3) t = RC6_T1 * 2 ; // double-wide trailer bit
|
||||
else t = RC6_T1 ;
|
||||
if (data & TOPBIT) {
|
||||
if (data & mask) {
|
||||
mark(t);
|
||||
space(t);
|
||||
}
|
||||
@@ -230,8 +223,6 @@ void IRsend::sendRC6 (unsigned long data, int nbits)
|
||||
space(t);
|
||||
mark(t);
|
||||
}
|
||||
|
||||
data <<= 1;
|
||||
}
|
||||
space(0); // Turn off at end
|
||||
}
|
||||
@@ -245,18 +236,16 @@ void IRsend::sendPanasonic (unsigned int address, unsigned long data)
|
||||
mark(PANASONIC_HDR_MARK);
|
||||
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);
|
||||
if (address & 0x8000) space(PANASONIC_ONE_SPACE) ;
|
||||
else space(PANASONIC_ZERO_SPACE) ;
|
||||
address <<= 1;
|
||||
if (address & mask) space(PANASONIC_ONE_SPACE) ;
|
||||
else space(PANASONIC_ZERO_SPACE) ;
|
||||
}
|
||||
for (int i = 0; i < 32; i++) {
|
||||
for (unsigned long mask = 1 << (32 - 1); mask; mask >>= 1) {
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
if (data & TOPBIT) space(PANASONIC_ONE_SPACE) ;
|
||||
else space(PANASONIC_ZERO_SPACE) ;
|
||||
data <<= 1;
|
||||
if (data & mask) space(PANASONIC_ONE_SPACE) ;
|
||||
else space(PANASONIC_ZERO_SPACE) ;
|
||||
}
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
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)
|
||||
{
|
||||
enableIROut(38);
|
||||
data = data << (32 - nbits);
|
||||
if (!repeat){
|
||||
mark(JVC_HDR_MARK);
|
||||
space(JVC_HDR_SPACE);
|
||||
}
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(JVC_BIT_MARK);
|
||||
space(JVC_ONE_SPACE);
|
||||
}
|
||||
@@ -282,7 +270,6 @@ void IRsend::sendJVC (unsigned long data, int nbits, int repeat)
|
||||
mark(JVC_BIT_MARK);
|
||||
space(JVC_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
mark(JVC_BIT_MARK);
|
||||
space(0);
|
||||
@@ -296,8 +283,8 @@ void IRsend::sendSAMSUNG (unsigned long data, int nbits)
|
||||
enableIROut(38);
|
||||
mark(SAMSUNG_HDR_MARK);
|
||||
space(SAMSUNG_HDR_SPACE);
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(SAMSUNG_BIT_MARK);
|
||||
space(SAMSUNG_ONE_SPACE);
|
||||
}
|
||||
@@ -305,7 +292,6 @@ void IRsend::sendSAMSUNG (unsigned long data, int nbits)
|
||||
mark(SAMSUNG_BIT_MARK);
|
||||
space(SAMSUNG_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
mark(SAMSUNG_BIT_MARK);
|
||||
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
|
||||
// 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) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(SHARP_BIT_MARK);
|
||||
space(SHARP_ONE_SPACE);
|
||||
}
|
||||
@@ -1207,8 +1193,8 @@ void IRsend::sendDISH (unsigned long data, int nbits)
|
||||
enableIROut(56);
|
||||
mark(DISH_HDR_MARK);
|
||||
space(DISH_HDR_SPACE);
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & DISH_TOP_BIT) {
|
||||
for (unsigned long mask = 1 << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mark) {
|
||||
mark(DISH_BIT_MARK);
|
||||
space(DISH_ONE_SPACE);
|
||||
}
|
||||
@@ -1216,7 +1202,6 @@ void IRsend::sendDISH (unsigned long data, int nbits)
|
||||
mark(DISH_BIT_MARK);
|
||||
space(DISH_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user