Skip to content

Commit 996173a

Browse files
authored
Fix checksum error in FIND_DEVICE_CONFIRM on CC2531 and improve logging (#985)
Signed-off-by: Witold Sowa <[email protected]>
1 parent 29d6ce9 commit 996173a

File tree

3 files changed

+19
-26
lines changed

3 files changed

+19
-26
lines changed

com.zsmartsystems.zigbee.dongle.cc2531/src/main/java/com/zsmartsystems/zigbee/dongle/cc2531/network/packet/ZToolPacketStream.java

+6-22
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
package com.zsmartsystems.zigbee.dongle.cc2531.network.packet;
3434

3535
import java.io.IOException;
36+
import java.util.Arrays;
3637

3738
import org.slf4j.Logger;
3839
import org.slf4j.LoggerFactory;
@@ -94,8 +95,6 @@ public class ZToolPacketStream implements IIntArrayInputStream {
9495

9596
private Checksum checksum = new Checksum();
9697

97-
private boolean generic = false;
98-
9998
private final ZigBeePort port;
10099

101100
public ZToolPacketStream(ZigBeePort port) {
@@ -108,36 +107,21 @@ public ZToolPacket parsePacket() throws IOException {
108107
done = false;
109108
bytesRead = 0;
110109
try {
111-
final ZToolPacket response;
112110
// int byteLength = this.read("Length");
113111
this.length = read("Length");
114112
// log.debug("data length is " + ByteUtils.formatByte(length.getLength()));
115-
final int[] frameData;
116113
final int apiIdMSB = this.read("API PROFILE_ID_HOME_AUTOMATION MSB");
117114
final int apiIdLSB = this.read("API PROFILE_ID_HOME_AUTOMATION LSB");
118115
final DoubleByte apiId = new DoubleByte(apiIdMSB, apiIdLSB);
119-
// TODO Remove generic never used
120-
// generic = true;
121-
if (generic) {
122-
// log.info("Parsing data as generic");
123-
int i = 0;
124-
frameData = new int[length];
125-
// Read all data bytes without parsing
126-
while (i < frameData.length) {
127-
frameData[i] = this.read("Data " + i + "-th");
128-
i++;
129-
}
130-
131-
response = new ZToolPacket(apiId, frameData);
132-
} else {
133-
frameData = this.readRemainingBytes();
134-
response = parsePayload(apiId, frameData);
135-
}
116+
final int[] frameData = this.readRemainingBytes();
117+
final ZToolPacket response = parsePayload(apiId, frameData);
118+
136119
// response.setFCS(this.read("Checksum"));
137120
int fcs = this.read("Checksum");
138121
// setDone(true);
139122
if (fcs != response.getFCS()) {
140-
// log.debug("Checksum of packet failed: received =" + fcs + " expected = " + response.getFCS());
123+
logger.error("Checksum of packet failed: received =" + fcs + " expected = " + response.getFCS() +
124+
". Len = " + this.length + ", ApiId = " + apiId + ", Packet = " + Arrays.toString(frameData));
141125
throw new ZToolParseException("Packet checksum failed");
142126
}
143127
if (!this.isDone()) {

com.zsmartsystems.zigbee.dongle.cc2531/src/main/java/com/zsmartsystems/zigbee/dongle/cc2531/network/packet/simple/ZB_FIND_DEVICE_CONFIRM.java

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
package com.zsmartsystems.zigbee.dongle.cc2531.network.packet.simple;
3232

33+
import com.zsmartsystems.zigbee.dongle.cc2531.network.packet.ZToolCMD;
3334
import com.zsmartsystems.zigbee.dongle.cc2531.network.packet.ZToolPacket;
3435
import com.zsmartsystems.zigbee.dongle.cc2531.zigbee.util.DoubleByte;
3536

@@ -62,6 +63,7 @@ public ZB_FIND_DEVICE_CONFIRM(int[] framedata) {
6263
for (int i = 0; i < 8; i++) {
6364
this.Result[i] = framedata[i + 3];
6465
}
66+
super.buildPacket(new DoubleByte(ZToolCMD.ZB_FIND_DEVICE_CONFIRM), framedata);
6567
}
6668

6769
}

com.zsmartsystems.zigbee.serial/src/main/java/com/zsmartsystems/zigbee/serial/ZigBeeSerialPort.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ public void serialEvent(SerialPortEvent event) {
225225
try {
226226
int[] input = serialPort.readIntArray();
227227
if (input == null) {
228+
logger.warn("Nothing read from serial port.");
228229
return;
229230
}
230231

@@ -234,15 +235,21 @@ public void serialEvent(SerialPortEvent event) {
234235
if (end >= maxLength) {
235236
end = 0;
236237
}
238+
if (end == start) {
239+
logger.warn("Serial buffer overrun.");
240+
if (++start == maxLength) {
241+
start = 0;
242+
}
243+
}
237244
}
238245
}
239-
240-
synchronized (this) {
241-
this.notify();
242-
}
243246
} catch (SerialPortException e) {
244247
logger.error("Error while handling serial event.", e);
245248
}
249+
250+
synchronized (this) {
251+
this.notify();
252+
}
246253
}
247254
}
248255

0 commit comments

Comments
 (0)