package com.o3dr.services.android.lib.drone.companion.solo.button;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* Created by djmedina on 4/15/15.
*/
public class ButtonPacket implements Parcelable {
public static final ByteOrder BYTE_ORDER = ByteOrder.LITTLE_ENDIAN;
private static final String TAG = ButtonPacket.class.getSimpleName();
private double timestamp = -1;
private byte eventType = -1;
private byte buttonId = -1;
private short pressedMask = -1;
private final ByteBuffer byteBuffer;
public ButtonPacket(short pressedMask, byte buttonId, byte eventType, double timestamp) {
this.pressedMask = pressedMask;
this.buttonId = buttonId;
this.eventType = eventType;
this.timestamp = timestamp;
byteBuffer = ByteBuffer.allocate(ButtonTypes.MESSAGE_LENGTH);
byteBuffer.order(BYTE_ORDER);
}
/**
* Construc a ButtonPacket from a Parcel
* @param in a Parcel of a button
*/
private ButtonPacket(Parcel in) {
this.timestamp = in.readDouble();
this.eventType = in.readByte();
this.buttonId = in.readByte();
this.pressedMask = (short) in.readValue(short.class.getClassLoader());
byteBuffer = ByteBuffer.allocate(ButtonTypes.MESSAGE_LENGTH);
byteBuffer.order(BYTE_ORDER);
}
public final int getEventType() {
return eventType;
}
public final byte[] toBytes(){
byteBuffer.clear();
/**
* Message format
* Byte Size Description
* 0 8 Timestamp, since epoch
* 8 1 Button ID
* 9 1 Button event
* 10 2 Buttons-pressed mask
* 12 (packet length)
*/
byteBuffer.putDouble(timestamp);
byteBuffer.put(buttonId);
byteBuffer.put(eventType);
byteBuffer.putShort(pressedMask);
final byte[] bytes = new byte[byteBuffer.position()];
byteBuffer.rewind();
byteBuffer.get(bytes);
return bytes;
}
public double getTimestamp() {
return timestamp;
}
public byte getButtonId() {
return buttonId;
}
public short getPressedMask() {
return pressedMask;
}
public static ButtonPacket parseButtonPacket(ByteBuffer packetBuffer) {
if (packetBuffer == null || packetBuffer.limit() <= 0)
return null;
final ByteOrder originalOrder = packetBuffer.order();
/**
* Message format
* Byte Size Description
* 0 8 Timestamp, usec since epoch
* 8 1 Button ID
* 9 1 Button event
* 10 2 Buttons-pressed mask
* 12 (packet length)
*/
try {
packetBuffer.order(ButtonPacket.BYTE_ORDER);
final double timestamp = packetBuffer.getDouble();
final byte buttonId = packetBuffer.get();
final byte eventType = packetBuffer.get();
final short pressedMask = packetBuffer.getShort();
return new ButtonPacket(pressedMask,buttonId, eventType,timestamp);
} catch (BufferUnderflowException e) {
Log.e(TAG, "Invalid data for button packet", e);
return null;
} finally {
packetBuffer.order(originalOrder);
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble(this.timestamp);
dest.writeByte(this.eventType);
dest.writeByte(this.buttonId);
dest.writeValue(this.pressedMask);
}
public static final Parcelable.Creator<ButtonPacket> CREATOR = new Parcelable.Creator<ButtonPacket>() {
public ButtonPacket createFromParcel(Parcel source) {
return new ButtonPacket(source);
}
public ButtonPacket[] newArray(int size) {
return new ButtonPacket[size];
}
};
}