byte sizeToggle = buffer.get();
// read length of command and check if makes sense
- if ((sizeToggle < 1 || sizeToggle > 3) && ((sizeToggle & 0xFF) < 0x81 || (sizeToggle & 0xFF) > 0x83)) {
+ int size = (sizeToggle & 0x7F);
+
+ if (!isSizeToggleValid(sizeToggle, module)) {
if (logger.isDebugEnabled()) {
logger.debug("get invalid sizeToggle: {}", new String(HexUtils.byteToHex(sizeToggle)));
}
}
// read toggle, size and command
- int size = (sizeToggle & 0x7F);
boolean toggle = (sizeToggle & 0x80) == 0x80;
logger.debug("get toggle: {}", toggle);
}
}
+ private boolean isSizeToggleValid(byte sizeToggle, byte module) {
+ int unsigned = sizeToggle & 0xFF;
+
+ if (unsigned > 0 && unsigned < 4) {
+ return true;
+ } else if (unsigned > 0x80 && unsigned < 0x84) {
+ return true;
+ } else if ((module & 0xE0) == 0x00) {
+ if (unsigned > 0 && unsigned < 16) {
+ return true;
+ } else if (unsigned > 0x80 && unsigned < 0x90) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private int handleCrcFault(int faultCounter) throws InterruptedException {
if (faultCounter > 0) {
// Normally in this case we read the message repeatedly offset to the real -> skip one to 6 bytes
// EM command / update
} else {
- if (((module & 0xE0) == 0x00)) {
+ if ((module & 0xE0) == 0x00) {
sendEmAcknowledge(module, toggle);
logger.debug("send acknowledge (modul, toggle) {} {}", module, toggle);
- byte channel = (byte) ((command[0] >>> 4) & 0x0F);
+ for (byte cmdByte : command) {
+ byte channel = (byte) ((cmdByte >>> 4) & 0x0F);
- OnOffType onOff = OnOffType.OFF;
+ OnOffType onOff = OnOffType.OFF;
- if ((command[0] & 0x0F) == 2) {
- onOff = OnOffType.ON;
- }
+ byte cmd = (byte) (cmdByte & 0x0F);
+ if (cmd % 2 == 0) {
+ if (cmd == 2) {
+ onOff = OnOffType.ON;
+ } else {
+ logger.debug("Command {} isn't implemented for EM", cmd);
+ continue;
+ }
+ }
- QueueObject qo = new QueueObject(PHCBindingConstants.CHANNELS_EM, module, channel, onOff);
+ QueueObject qo = new QueueObject(PHCBindingConstants.CHANNELS_EM, module, channel, onOff);
- // put recognized message into queue
- if (!receiveQueue.contains(qo)) {
- receiveQueue.offer(qo);
+ // put recognized message into queue
+ if (!receiveQueue.contains(qo)) {
+ receiveQueue.offer(qo);
+ }
}
// ignore if message not from EM module