*/
package org.openhab.binding.bluetooth.enoceanble.internal;
+import java.nio.ByteBuffer;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
private static final byte BUTTON2_DIR2 = 0x2;
private final byte byteState;
+ private final int sequence;
public EnoceanBlePtm215Event(byte[] manufacturerData) {
byteState = manufacturerData[6];
+
+ byte[] sequenceBytes = new byte[] { manufacturerData[5], manufacturerData[4], manufacturerData[3],
+ manufacturerData[2] };
+ ByteBuffer sequenceBytesBuffered = ByteBuffer.wrap(sequenceBytes); // big-endian by default
+ sequence = sequenceBytesBuffered.getInt();
}
public boolean isPressed() {
return (byteState & flag) == flag;
}
+ public int getSequence() {
+ return sequence;
+ }
+
@Override
public String toString() {
return "Button " + (isButton1() ? 1 : 2) + " Dir " + (isDir1() ? 1 : 2) + " "
- + (isPressed() ? "PRESSED" : "RELEASED");
+ + (isPressed() ? "PRESSED" : "RELEASED") + " (seq. " + this.sequence + ")";
}
}
public class EnoceanBleRockerHandler extends BeaconBluetoothHandler {
private final Logger logger = LoggerFactory.getLogger(EnoceanBleRockerHandler.class);
+ private int lastSequence = Integer.MIN_VALUE;
public EnoceanBleRockerHandler(Thing thing) {
super(thing);
if (manufacturerData != null && manufacturerData.length > 0) {
EnoceanBlePtm215Event event = new EnoceanBlePtm215Event(manufacturerData);
logger.debug("Parsed manufacturer data to PTM215B event: {}", event);
- triggerChannel(resolveChannel(event), resolveTriggerEvent(event));
+ synchronized (this) {
+ if (event.getSequence() > lastSequence) {
+ lastSequence = event.getSequence();
+ triggerChannel(resolveChannel(event), resolveTriggerEvent(event));
+ }
+ }
}
} catch (IllegalStateException e) {
logger.warn("PTM215B event could not be parsed correctly, exception occured:", e);