keepass2android/src/java/InputStickAPI/src/com/inputstick/api/bluetooth/PacketReader.java

89 lines
2.0 KiB
Java

package com.inputstick.api.bluetooth;
import android.os.Handler;
import com.inputstick.api.InputStickError;
import com.inputstick.api.Packet;
import com.inputstick.api.Util;
public class PacketReader {
private static final int RX_TIMEOUT = 3000;
private static final int RX_TAG = 0;
private static final int RX_LENGTH = 1;
private static final int RX_DATA = 2;
private long lastRxTime;
private int rxState;
private int rxPos;
private int rxLength;
private byte[] rxData;
private int rxWdgCnt;
private final BTService mBTService;
private final Handler mHandler;
public PacketReader(BTService btService, Handler handler) {
mBTService = btService;
mHandler = handler;
}
public void rxByte(byte b) {
//byte b = (byte)rxByte;
long time = System.currentTimeMillis();
if (time > lastRxTime + RX_TIMEOUT) {
rxState = RX_TAG;
}
switch (rxState) {
case RX_TAG:
if (b == Packet.START_TAG) {
rxState = RX_LENGTH;
} else {
Util.log("Unexpected RX byte" + b);
if (b == 0xAF) {
rxWdgCnt++;
}
if (rxWdgCnt > 1024) {
rxWdgCnt = 0;
mBTService.event(BTService.EVENT_ERROR, InputStickError.ERROR_HARDWARE_WDG_RESET);
}
}
break;
case RX_LENGTH:
rxLength = b;
rxLength &= 0x3F;
rxLength *= 16;
rxLength += 2;
rxPos = 2;
rxData = new byte[rxLength];
rxData[0] = Packet.START_TAG;
rxData[1] = (byte)b;
rxState = RX_DATA;
break;
case RX_DATA:
if (rxPos < rxLength) {
rxData[rxPos] = b;
rxPos++;
if (rxPos == rxLength) {
//done!
mHandler.obtainMessage(BTService.EVENT_DATA, 0, 0, rxData).sendToTarget();
rxState = RX_TAG;
}
} else {
//buffer overrun!
rxState = RX_TAG;
}
break;
}
lastRxTime = time;
}
}