blob: fa78d335ebbbfe527ea98de3f0d1b286d6fd7dac [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 Orange.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*******************************************************************************/
package org.eclipse.om2m.sdt.home.lifx.impl.lan.frame;
import java.util.Arrays;
public class LIFXFrameAddress {
private static int CURRENT_SEQUENCE_NUMBER = 0;
private static synchronized int getNextSequenceNumber() {
int toBeReturned = CURRENT_SEQUENCE_NUMBER;
CURRENT_SEQUENCE_NUMBER++;
if (CURRENT_SEQUENCE_NUMBER == 256) {
CURRENT_SEQUENCE_NUMBER = 0;
}
return toBeReturned;
}
private byte[] target;
private boolean ackRequired = false;
public boolean isAckRequired() {
return ackRequired;
}
public void setAckRequired(boolean ackRequired) {
this.ackRequired = ackRequired;
}
public boolean isResRequired() {
return resRequired;
}
public void setResRequired(boolean resRequired) {
this.resRequired = resRequired;
}
public int getSequenceNumber() {
return sequenceNumber;
}
private boolean resRequired = false;
private int sequenceNumber = 0;
public byte[] getTarget() {
return target;
}
public String getTargetAsString() {
if (target != null) {
StringBuffer sb = new StringBuffer();
for (byte b : target) {
sb.append(Integer.toHexString((int) b & 0xff));
sb.append(":");
}
sb.setLength(sb.length() - 1);
return sb.toString();
}
return null;
}
public void setTarget(byte[] target) {
this.target = target;
}
public byte[] getBytes() {
byte[] frameAddress = new byte[16];
Arrays.fill(frameAddress, (byte) 0);
// target (6 bits)
if (target != null) {
frameAddress[0] = target[0];
frameAddress[1] = target[1];
frameAddress[2] = target[2];
frameAddress[3] = target[3];
frameAddress[4] = target[4];
frameAddress[5] = target[5];
}
// 000000 bits + ack_required (1 bit) + res_required (1 bit)
frameAddress[14] = (byte) ((ackRequired ? 1 : 0) << 1 | (resRequired ? 1 : 0));
sequenceNumber = getNextSequenceNumber();
frameAddress[15] = (byte) (sequenceNumber & 0xff);
return frameAddress;
}
public void setBytes(byte[] frameAddress) throws Exception {
if (frameAddress.length != 16) {
throw new Exception("expecting 16 bytes, found " + frameAddress.length + " bytes");
}
target = Arrays.copyOfRange(frameAddress, 0, 6);
// ack_required
ackRequired = ((frameAddress[14] >> 1) & 0x1) == 1;
resRequired = (frameAddress[14] & 0x1) == 1;
// sequence number
sequenceNumber = (frameAddress[15] & 0xff);
}
@Override
public String toString() {
return "frameAddress(target=" + getTargetAsString() + ", ack_required=" + ackRequired + ", res_required="
+ resRequired + ", sequenceNumber=" + sequenceNumber + ")";
}
}