data = new byte[bytes.length + 1];
System.arraycopy(bytes, 0, data, 0, bytes.length);
- data[bytes.length] = checksum(data);
+ data[bytes.length] = checksum(bytes);
}
public byte[] getBytes() {
}
public long getResponseTimeout() {
- if (data[2] == EASY_CHECK) {
+ if (isEasyCheck()) {
return 1000;
}
return (byte) (256 - val);
}
+ public boolean isEasyCheck() {
+ return data[2] == EASY_CHECK;
+ }
+
@Override
public String toString() {
return HexUtils.bytesToHex(data);
import org.openhab.core.io.transport.serial.SerialPortIdentifier;
import org.openhab.core.io.transport.serial.SerialPortManager;
import org.openhab.core.io.transport.serial.UnsupportedCommOperationException;
+import org.openhab.core.util.HexUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private boolean open;
private String portName;
private final List<Byte> bytes = new ArrayList<>();
+ private CommandPacket lastSentPacket = null;
private Response response = null;
private final SerialPortManager serialPortManager;
// send a packet to the stick and wait for the response
public synchronized Response sendPacket(CommandPacket p) throws IOException {
if (open) {
- Response r = response;
+ Response r = null;
synchronized (bytes) {
response = null;
+ lastSentPacket = p;
+
logger.debug("Writing packet to stick: {}", p);
serialPort.getOutputStream().write(p.getBytes());
- if (r != null) {
- return r;
- }
-
final long responseTimeout = p.getResponseTimeout();
try {
logger.trace("Waiting {} ms for answer from stick...", responseTimeout);
}
if (logger.isTraceEnabled()) {
- logger.trace("buffer contains {} bytes: {}", bytes.size(),
- ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()])));
+ logger.trace("buffer contains bytes: {}",
+ HexUtils.bytesToHex(ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]))));
}
+
if (bytes.size() > 1) {
// second byte should be length byte (has to be either 0x04 or 0x05)
int len = bytes.get(1);
long val = bytes.get(0) + bytes.get(1) + bytes.get(2) + bytes.get(3) + bytes.get(4)
+ bytes.get(5);
if (val % 256 == 0) {
- response = ResponseUtil.createResponse(bytes.get(3), bytes.get(4));
+ Response r = ResponseUtil.createResponse(bytes.get(3), bytes.get(4));
+ if (lastSentPacket != null && lastSentPacket.isEasyCheck()) {
+ response = r;
+ } else {
+ logger.warn("response type does not match command {}. Skipping response.",
+ lastSentPacket);
+ }
} else {
logger.warn("invalid response checksum. Skipping response.");
}
long val = bytes.get(0) + bytes.get(1) + bytes.get(2) + bytes.get(3) + bytes.get(4)
+ bytes.get(5) + bytes.get(6);
if (val % 256 == 0) {
- response = ResponseUtil.createResponse(bytes.get(3), bytes.get(4), bytes.get(5));
+ Response r = ResponseUtil.createResponse(bytes.get(3), bytes.get(4), bytes.get(5));
+ if (r.isResponseFor(lastSentPacket)) {
+ response = r;
+ } else {
+ logger.warn("response does not match command channels. Skipping response.");
+ }
} else {
logger.warn("invalid response checksum. Skipping response.");
}