Skip to content

Commit 78d06a7

Browse files
committed
Stop bit handling. closes Arduino-IRremote#717
1 parent ac60e45 commit 78d06a7

File tree

8 files changed

+48
-110
lines changed

8 files changed

+48
-110
lines changed

src/ir_LG.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ bool IRrecv::decodeLG() {
2222
long data = 0;
2323
int offset = 1; // Skip first space
2424

25-
// Check we have the right amount of data
26-
if (irparams.rawlen < (2 * LG_BITS) + 1)
25+
// Check we have the right amount of data +3 for start bit mark and space + stop bit mark
26+
if (irparams.rawlen <= (2 * LG_BITS) + 3)
2727
return false;
2828

2929
// Initial mark/space
@@ -40,7 +40,8 @@ bool IRrecv::decodeLG() {
4040
data = decodePulseDistanceData(LG_BITS, offset, LG_BIT_MARK, LG_ONE_SPACE, LG_ZERO_SPACE);
4141

4242
// Stop bit
43-
if (!MATCH_MARK(results.rawbuf[offset], LG_BIT_MARK)) {
43+
if (!MATCH_MARK(results.rawbuf[offset + (2 * LG_BITS)], LG_BIT_MARK)) {
44+
DBG_PRINT("Stop bit verify failed");
4445
return false;
4546
}
4647

@@ -50,6 +51,7 @@ bool IRrecv::decodeLG() {
5051
results.decode_type = LG;
5152
return true;
5253
}
54+
5355
bool IRrecv::decodeLG(decode_results *aResults) {
5456
bool aReturnValue = decodeLG();
5557
*aResults = results;
@@ -70,15 +72,6 @@ void IRsend::sendLG(unsigned long data, int nbits) {
7072

7173
// Data
7274
sendPulseDistanceWidthData(LG_BIT_MARK, LG_ONE_SPACE, LG_BIT_MARK, LG_ZERO_SPACE, data, nbits);
73-
// for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
74-
// if (data & mask) {
75-
// space(LG_ONE_SPACE);
76-
// mark(LG_BIT_MARK);
77-
// } else {
78-
// space(LG_ZERO_SPACE);
79-
// mark(LG_BIT_MARK);
80-
// }
81-
// }
8275

8376
mark(LG_BIT_MARK);
8477
space(0); // Always end with the LED off

src/ir_NEC.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void IRsend::sendNEC(unsigned long data, int nbits, bool repeat) {
6868
// Data
6969
sendPulseDistanceWidthData(NEC_BIT_MARK, NEC_ONE_SPACE, NEC_BIT_MARK, NEC_ZERO_SPACE, data, nbits);
7070

71-
// Footer
71+
// Stop bit
7272
mark(NEC_BIT_MARK);
7373
space(0); // Always end with the LED off
7474
}
@@ -95,7 +95,7 @@ void IRsend::sendNECStandard(uint16_t aAddress, uint8_t aCommand, uint8_t aNumbe
9595
uint16_t tCommand = ((~aCommand) << 8) | aCommand;
9696
// Command 16 bit LSB first
9797
sendPulseDistanceWidthData(NEC_BIT_MARK, NEC_ONE_SPACE, NEC_BIT_MARK, NEC_ZERO_SPACE, tCommand, 16, false);
98-
mark(NEC_BIT_MARK);
98+
mark(NEC_BIT_MARK); // Stop bit
9999
space(0); // Always end with the LED off
100100

101101
for (uint8_t i = 0; i < aNumberOfRepeats; ++i) {
@@ -131,8 +131,8 @@ bool IRrecv::decodeNEC() {
131131
return true;
132132
}
133133

134-
// Check we have enough data
135-
if (results.rawlen < (2 * NEC_BITS) + 4) {
134+
// Check we have enough data - +3 for start bit mark and space + stop bit mark
135+
if (results.rawlen <= (2 * NEC_BITS) + 3) {
136136
return false;
137137
}
138138
// Check header "space"
@@ -143,13 +143,20 @@ bool IRrecv::decodeNEC() {
143143

144144
data = decodePulseDistanceData(NEC_BITS, offset, NEC_BIT_MARK, NEC_ONE_SPACE, NEC_ZERO_SPACE);
145145

146+
// Stop bit
147+
if (!MATCH_MARK(results.rawbuf[offset + (2 * NEC_BITS)], NEC_BIT_MARK)) {
148+
DBG_PRINT("Stop bit verify failed");
149+
return false;
150+
}
151+
146152
// Success
147153
results.bits = NEC_BITS;
148154
results.value = data;
149155
results.decode_type = NEC;
150156

151157
return true;
152158
}
159+
153160
bool IRrecv::decodeNEC(decode_results *aResults) {
154161
bool aReturnValue = decodeNEC();
155162
*aResults = results;
@@ -179,8 +186,8 @@ bool IRrecv::decodeNECStandard() {
179186
return true;
180187
}
181188

182-
// Check we have enough data
183-
if (results.rawlen < (2 * NEC_BITS) + 4) {
189+
// Check we have enough data - +3 for start bit mark and space + stop bit mark
190+
if (results.rawlen <= (2 * NEC_BITS) + 3) {
184191
return false;
185192
}
186193
// Check header "space"
@@ -191,6 +198,12 @@ bool IRrecv::decodeNECStandard() {
191198

192199
data = decodePulseDistanceData(NEC_BITS, offset, NEC_BIT_MARK, NEC_ONE_SPACE, NEC_ZERO_SPACE, false);
193200

201+
// Stop bit
202+
if (!MATCH_MARK(results.rawbuf[offset + (2 * NEC_BITS)], NEC_BIT_MARK)) {
203+
DBG_PRINT("Stop bit verify failed");
204+
return false;
205+
}
206+
194207
// Success
195208
uint16_t tCommand = data >> 16;
196209
uint8_t tCommandNotInverted = tCommand & 0xFF;

src/ir_Panasonic.cpp

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,10 @@ void IRsend::sendPanasonic(unsigned int address, unsigned long data) {
3030
// Address
3131
sendPulseDistanceWidthData(PANASONIC_BIT_MARK, PANASONIC_ONE_SPACE, PANASONIC_BIT_MARK, PANASONIC_ZERO_SPACE, address,
3232
PANASONIC_ADDRESS_BITS);
33-
// for (unsigned long mask = 1UL << (16 - 1); mask; mask >>= 1) {
34-
// mark(PANASONIC_BIT_MARK);
35-
// if (address & mask)
36-
// space(PANASONIC_ONE_SPACE);
37-
// else
38-
// space(PANASONIC_ZERO_SPACE);
39-
// }
4033

4134
// Data
4235
sendPulseDistanceWidthData(PANASONIC_BIT_MARK, PANASONIC_ONE_SPACE, PANASONIC_BIT_MARK,
4336
PANASONIC_ZERO_SPACE, data, PANASONIC_DATA_BITS);
44-
// for (unsigned long mask = 1UL << (32 - 1); mask; mask >>= 1) {
45-
// mark(PANASONIC_BIT_MARK);
46-
// if (data & mask)
47-
// space(PANASONIC_ONE_SPACE);
48-
// else
49-
// space(PANASONIC_ZERO_SPACE);
50-
// }
5137

5238
// Footer
5339
mark(PANASONIC_BIT_MARK);
@@ -75,22 +61,6 @@ bool IRrecv::decodePanasonic() {
7561
PANASONIC_ZERO_SPACE);
7662
data = decodePulseDistanceData(PANASONIC_DATA_BITS, offset + PANASONIC_ADDRESS_BITS, PANASONIC_BIT_MARK,
7763
PANASONIC_ONE_SPACE, PANASONIC_ZERO_SPACE);
78-
// // decode address
79-
// for (int i = 0; i < PANASONIC_BITS; i++) {
80-
// if (!MATCH_MARK(results.rawbuf[offset], PANASONIC_BIT_MARK)) {
81-
// return false;
82-
// }
83-
// offset++;
84-
//
85-
// if (MATCH_SPACE(results.rawbuf[offset], PANASONIC_ONE_SPACE)) {
86-
// data = (data << 1) | 1;
87-
// } else if (MATCH_SPACE(results.rawbuf[offset], PANASONIC_ZERO_SPACE)) {
88-
// data = (data << 1) | 0;
89-
// } else {
90-
// return false;
91-
// }
92-
// offset++;
93-
// }
9464

9565
results.value = data;
9666
results.address = address;
@@ -99,6 +69,7 @@ bool IRrecv::decodePanasonic() {
9969

10070
return true;
10171
}
72+
10273
bool IRrecv::decodePanasonic(decode_results *aResults) {
10374
bool aReturnValue = decodePanasonic();
10475
*aResults = results;

src/ir_Samsung.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ bool IRrecv::decodeSAMSUNG() {
7676
results.decode_type = SAMSUNG;
7777
return true;
7878
}
79+
7980
bool IRrecv::decodeSAMSUNG(decode_results *aResults) {
8081
bool aReturnValue = decodeSAMSUNG();
8182
*aResults = results;

src/ir_Sanyo.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@
1212
// Looks like Sony except for timings, 48 chars of data and time/space different
1313

1414
#define SANYO_BITS 12
15-
#define SANYO_HEADER_MARK 3500 // seen range 3500
16-
#define SANYO_HEADER_SPACE 950 // seen 950
15+
#define SANYO_HEADER_MARK 3500 // seen range 3500
16+
#define SANYO_HEADER_SPACE 950 // seen 950
1717
#define SANYO_ONE_MARK 2400 // seen 2400
1818
#define SANYO_ZERO_MARK 700 // seen 700
19+
#define SANYO_RPT_LENGTH 45000 // Not used. Commands are repeated every 45ms(measured from start to start) for as long as the key on the remote control is held down.
1920
#define SANYO_DOUBLE_SPACE_USECS 800 // usually see 713 - not using ticks as get number wrap around
20-
#define SANYO_RPT_LENGTH 45000
2121

2222
//+=============================================================================
2323
#if DECODE_SANYO
2424
bool IRrecv::decodeSanyo() {
2525
long data = 0;
26-
unsigned int offset = 0; // Skip first space <-- CHECK THIS!
26+
unsigned int offset = 0; // Dont skip first space, check its size
2727

2828
if (results.rawlen < (2 * SANYO_BITS) + 2) {
2929
return false;
@@ -38,7 +38,7 @@ bool IRrecv::decodeSanyo() {
3838
#endif
3939

4040
// Initial space
41-
if (results.rawbuf[offset] < SANYO_DOUBLE_SPACE_USECS / MICROS_PER_TICK) {
41+
if (results.rawbuf[offset] < (SANYO_DOUBLE_SPACE_USECS / MICROS_PER_TICK)) {
4242
//Serial.print("IR Gap found: ");
4343
results.bits = 0;
4444
results.value = REPEAT;

src/ir_Sharp.cpp

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ void IRsend::sendSharp(unsigned int address, unsigned int command) {
9494

9595
#if DECODE_SHARP
9696
bool IRrecv::decodeSharp() {
97-
unsigned long addr = 0; // Somewhere to build our address
98-
unsigned long data = 0; // Somewhere to build our data
99-
unsigned long lastData = 0; // Somewhere to store last data
97+
unsigned long addr = 0; // to build our address
98+
unsigned long data = 0; // to build our data
99+
unsigned long lastData = 0; // to store last data
100100
int offset = 1; //skip long space
101101
int loops = 1; //number of bursts
102102

@@ -122,39 +122,10 @@ bool IRrecv::decodeSharp() {
122122
data = 0;
123123
addr = 0;
124124
addr = decodePulseDistanceData(SHARP_ADDR_BITS, offset, SHARP_BIT_MARK_SEND, SHARP_ONE_SPACE, SHARP_ZERO_SPACE);
125-
// for (int i = 0; i < SHARP_ADDR_BITS; i++) {
126-
// // Each bit looks like: SHARP_BIT_MARK_RECV + SHARP_ONE_SPACE -> 1
127-
// // or : SHARP_BIT_MARK_RECV + SHARP_ZERO_SPACE -> 0
128-
// if (!MATCH_MARK(results.rawbuf[offset++], SHARP_BIT_MARK_RECV))
129-
// return false;
130-
// // IR data is big-endian, so we shuffle it in from the right:
131-
// if (MATCH_SPACE(results.rawbuf[offset], SHARP_ONE_SPACE))
132-
// addr += 1 << i;
133-
// else if (MATCH_SPACE(results.rawbuf[offset], SHARP_ZERO_SPACE))
134-
// addr = addr;
135-
// else
136-
// return false;
137-
// offset++;
138-
// }
125+
139126
data = decodePulseDistanceData( SHARP_DATA_BITS, offset + SHARP_ADDR_BITS, SHARP_BIT_MARK_SEND, SHARP_ONE_SPACE,
140127
SHARP_ZERO_SPACE);
141-
// for (int i = 0; i < SHARP_DATA_BITS; i++) {
142-
// // Each bit looks like: SHARP_BIT_MARK_RECV + SHARP_ONE_SPACE -> 1
143-
// // or : SHARP_BIT_MARK_RECV + SHARP_ZERO_SPACE -> 0
144-
// if (!MATCH_MARK(results.rawbuf[offset++], SHARP_BIT_MARK_RECV))
145-
// return false;
146-
// // IR data is big-endian, so we shuffle it in from the right:
147-
// if (MATCH_SPACE(results.rawbuf[offset], SHARP_ONE_SPACE))
148-
// data += 1 << i;
149-
// else if (MATCH_SPACE(results.rawbuf[offset], SHARP_ZERO_SPACE))
150-
// data = data;
151-
// else
152-
// return false;
153-
// offset++;
154-
// //Serial.print(i);
155-
// //Serial.print(":");
156-
// //Serial.println(data, HEX);
157-
// }
128+
158129
//skip exp bit (mark+pause), chk bit (mark+pause), mark and long pause before next burst
159130
offset += 6;
160131

@@ -172,6 +143,7 @@ bool IRrecv::decodeSharp() {
172143
results.decode_type = SHARP;
173144
return true;
174145
}
146+
175147
bool IRrecv::decodeSharp(decode_results *aResults) {
176148
bool aReturnValue = decodeSharp();
177149
*aResults = results;

src/ir_Sony.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
// SSSS OOO N N Y
99
//==============================================================================
1010

11+
// see https://www.sbprojects.net/knowledge/ir/sirc.php
12+
1113
#define SONY_BITS 12
1214
#define SONY_HEADER_MARK 2400
1315
#define SONY_HEADER_SPACE 600
1416
#define SONY_ONE_MARK 1200
1517
#define SONY_ZERO_MARK 600
16-
#define SONY_RPT_LENGTH 45000
17-
#define SONY_DOUBLE_SPACE_USECS 500 // usually see 713 - not using ticks as get number wrap around
18+
#define SONY_RPT_LENGTH 45000 // Not used. Commands are repeated every 45ms(measured from start to start) for as long as the key on the remote control is held down.
19+
#define SONY_DOUBLE_SPACE_USECS 500 // usually see 713 - not using ticks as get number wrap around
1820

1921
//+=============================================================================
2022
#if SEND_SONY
@@ -54,7 +56,7 @@ bool IRrecv::decodeSony() {
5456

5557
// Some Sony's deliver repeats fast after first
5658
// unfortunately can't spot difference from of repeat from two fast clicks
57-
if (results.rawbuf[offset] < SONY_DOUBLE_SPACE_USECS / MICROS_PER_TICK) {
59+
if (results.rawbuf[offset] < (SONY_DOUBLE_SPACE_USECS / MICROS_PER_TICK)) {
5860
DBG_PRINTLN("IR Gap found");
5961
results.bits = 0;
6062
results.value = REPEAT;

src/ir_Whynter.cpp

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ bool IRrecv::decodeWhynter() {
5353
long data = 0;
5454
int offset = 1; // skip initial space
5555

56-
// Check we have the right amount of data
57-
if (results.rawlen < (2 * WHYNTER_BITS) + 6) {
56+
// Check we have the right amount of data +5 for (start bit + header) mark and space + stop bit mark
57+
if (results.rawlen <= (2 * WHYNTER_BITS) + 5) {
5858
return false;
5959
}
6060

@@ -81,25 +81,10 @@ bool IRrecv::decodeWhynter() {
8181
offset++;
8282

8383
data = decodePulseDistanceData(WHYNTER_BITS, offset, WHYNTER_BIT_MARK, WHYNTER_ONE_SPACE, WHYNTER_ZERO_SPACE);
84-
// // data bits
85-
// for (int i = 0; i < WHYNTER_BITS; i++) {
86-
// if (!MATCH_MARK(results.rawbuf[offset], WHYNTER_BIT_MARK)) {
87-
// return false;
88-
// }
89-
// offset++;
90-
//
91-
// if (MATCH_SPACE(results.rawbuf[offset], WHYNTER_ONE_SPACE)) {
92-
// data = (data << 1) | 1;
93-
// } else if (MATCH_SPACE(results.rawbuf[offset], WHYNTER_ZERO_SPACE)) {
94-
// data = (data << 1) | 0;
95-
// } else {
96-
// return false;
97-
// }
98-
// offset++;
99-
// }
10084

101-
// trailing mark
102-
if (!MATCH_MARK(results.rawbuf[offset], WHYNTER_BIT_MARK)) {
85+
// trailing mark / stop bit
86+
if (!MATCH_MARK(results.rawbuf[offset+ (2* WHYNTER_BITS)], WHYNTER_BIT_MARK)) {
87+
DBG_PRINT("Stop bit verify failed");
10388
return false;
10489
}
10590

@@ -109,6 +94,7 @@ bool IRrecv::decodeWhynter() {
10994
results.decode_type = WHYNTER;
11095
return true;
11196
}
97+
11298
bool IRrecv::decodeWhynter(decode_results *aResults) {
11399
bool aReturnValue = decodeWhynter();
114100
*aResults = results;

0 commit comments

Comments
 (0)