89 lines
2.0 KiB
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;
|
|
}
|
|
|
|
}
|