keepass2android/src/java/InputStickAPI/app/src/main/java/com/inputstick/api/Packet.java

145 lines
3.9 KiB
Java

package com.inputstick.api;
public class Packet {
public static final byte NONE = 0x00;
public static final byte START_TAG = 0x55;
public static final byte FLAG_RESPOND = (byte)0x80;
public static final byte FLAG_ENCRYPTED = 0x40;
public static final int MAX_SUBPACKETS = 17;
public static final int MAX_LENGTH = MAX_SUBPACKETS * 16;
public static final byte CMD_IDENTIFY = 0x01;
public static final byte CMD_LED = 0x02;
public static final byte CMD_RUN_BL = 0x03;
public static final byte CMD_RUN_FW = 0x04;
public static final byte CMD_GET_INFO = 0x05;
public static final byte CMD_BL_ERASE = 0x06;
public static final byte CMD_ADD_DATA = 0x07;
public static final byte CMD_BL_WRITE = 0x08;
public static final byte CMD_FW_INFO = 0x10;
public static final byte CMD_INIT = 0x11;
public static final byte CMD_INIT_AUTH = 0x12;
public static final byte CMD_INIT_CON = 0x13;
public static final byte CMD_SET_VALUE = 0x14;
public static final byte CMD_RESTORE_DEFAULTS = 0x15;
public static final byte CMD_RESTORE_STATUS = 0x16;
public static final byte CMD_GET_VALUE = 0x17;
public static final byte CMD_SET_PIN = 0x18;
public static final byte CMD_USB_RESUME = 0x19;
public static final byte CMD_USB_POWER = 0x1A;
public static final byte CMD_SYSTEM_NOTIFICATION = 0x1F;
public static final byte CMD_HID_STATUS_REPORT = 0x20;
public static final byte CMD_HID_DATA_KEYB = 0x21;
public static final byte CMD_HID_DATA_CONSUMER = 0x22;
public static final byte CMD_HID_DATA_MOUSE = 0x23;
public static final byte CMD_HID_DATA_GAMEPAD = 0x24;
public static final byte CMD_HID_DATA_ENDP = 0x2B;
public static final byte CMD_HID_DATA_KEYB_FAST = 0x2C;
public static final byte CMD_HID_DATA_KEYB_FASTEST = 0x2D;
//out
public static final byte CMD_HID_STATUS = 0x2F;
public static final byte CMD_DUMMY = (byte)0xFF;
public static final byte RESP_OK = 0x01;
public static final byte RESP_UNKNOWN_CMD = (byte)0xFF;
public static final byte[] RAW_OLD_BOOTLOADER = new byte[] {START_TAG, (byte)0x00, (byte)0x02, (byte)0x83, (byte)0x00, (byte)0xDA};
public static final byte[] RAW_DELAY_1_MS = new byte[] {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
private byte[] mData;
private int mPos;
private boolean mRespond;
//do not modify
public Packet(boolean respond, byte[] data) {
mRespond = respond;
mData = data;
mPos = data.length;
}
public Packet(boolean respond, byte cmd, byte param, byte[] data) {
mRespond = respond;
mData = new byte[MAX_LENGTH];
mData[0] = cmd;
mData[1] = param;
mPos = 2;
if (data != null) {
addBytes(data);
}
}
public Packet(boolean respond, byte cmd, byte param) {
this(respond, cmd, param, null);
}
public Packet(boolean respond, byte cmd) {
mRespond = respond;
mData = new byte[MAX_LENGTH];
mData[0] = cmd;
mPos = 1;
}
public void modifyByte(int pos, byte b) {
mData[pos] = b;
}
public void addBytes(byte[] data) {
//TODO check null pointer / available size (MAX_PAYLOAD - mPos)
System.arraycopy(data, 0, mData, mPos, data.length);
mPos += data.length;
}
public void addByte(byte b) {
mData[mPos++] = b;
}
public void addInt16(int val) {
mData[mPos + 0] = Util.getMSB(val);
mData[mPos + 1] = Util.getLSB(val);
mPos += 2;
}
public void addInt32(long val) {
mData[mPos + 3] = (byte)val;
val >>= 8;
mData[mPos + 2] = (byte)val;
val >>= 8;
mData[mPos + 1] = (byte)val;
val >>= 8;
mData[mPos + 0] = (byte)val;
val >>= 8;
mPos += 4;
}
public byte[] getBytes() {
byte[] result;
result = new byte[mPos];
System.arraycopy(mData, 0, result, 0, mPos);
return result;
}
public boolean getRespond() {
return mRespond;
}
public void print() {
Util.printHex(mData, "PACKET DATA:");
}
}