Pebble 2: React to MTU notifications, fixes LE for older pebbles also

It seems that setting the MTU on older pebbles does not work, so just use what we can use.
Maybe old pebbles need setMTU() which only works on Android 5+, we could use that conditionally...
here
Andreas Shimokawa 2016-11-18 23:36:27 +01:00
parent 51fa31aa66
commit 4dc085de57
2 changed files with 19 additions and 7 deletions

View File

@ -15,6 +15,7 @@ import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GB;
import static android.bluetooth.BluetoothGattCharacteristic.FORMAT_UINT16;
import static android.bluetooth.BluetoothGattCharacteristic.PROPERTY_WRITE; import static android.bluetooth.BluetoothGattCharacteristic.PROPERTY_WRITE;
@ -32,15 +33,17 @@ class PebbleGATTClient extends BluetoothGattCallback {
private final String mBtDeviceAddress; private final String mBtDeviceAddress;
private final BluetoothDevice mBtDevice; private final BluetoothDevice mBtDevice;
private final Context mContext; private final Context mContext;
private final PebbleLESupport mPebbleLESupport;
private boolean oldPebble = false; private boolean oldPebble = false;
private boolean doPairing = true; private boolean doPairing = true;
private boolean removeBond = false; private boolean removeBond = false;
private BluetoothGatt mBluetoothGatt; private BluetoothGatt mBluetoothGatt;
PebbleGATTClient(Context context, BluetoothDevice btDevice) { PebbleGATTClient(PebbleLESupport pebbleLESupport, Context context, BluetoothDevice btDevice) {
mContext = context; mContext = context;
mBtDevice = btDevice; mBtDevice = btDevice;
mPebbleLESupport = pebbleLESupport;
mBtDeviceAddress = btDevice.getAddress(); mBtDeviceAddress = btDevice.getAddress();
} }
@ -54,7 +57,13 @@ class PebbleGATTClient extends BluetoothGattCallback {
LOG.info("onCharacteristicChanged() unexpected device: " + gatt.getDevice().getAddress() + " , expected: " + mBtDeviceAddress); LOG.info("onCharacteristicChanged() unexpected device: " + gatt.getDevice().getAddress() + " , expected: " + mBtDeviceAddress);
return; return;
} }
LOG.info("onCharacteristicChanged()" + characteristic.getUuid().toString() + " " + GB.hexdump(characteristic.getValue(), 0, -1)); if (characteristic.getUuid().equals(MTU_CHARACTERISTIC)) {
int newMTU = characteristic.getIntValue(FORMAT_UINT16, 0);
mPebbleLESupport.setMTU(newMTU);
LOG.info("Pebble requested MTU = " + newMTU);
} else {
LOG.info("onCharacteristicChanged()" + characteristic.getUuid().toString() + " " + GB.hexdump(characteristic.getValue(), 0, -1));
}
} }
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
@ -141,8 +150,7 @@ class PebbleGATTClient extends BluetoothGattCallback {
if ((characteristic.getProperties() & PROPERTY_WRITE) != 0) { if ((characteristic.getProperties() & PROPERTY_WRITE) != 0) {
characteristic.setValue(new byte[]{1}); characteristic.setValue(new byte[]{1});
gatt.writeCharacteristic(characteristic); gatt.writeCharacteristic(characteristic);
} } else {
else {
LOG.info("This seems to be some <4.0 FW Pebble, reading pairing trigger"); LOG.info("This seems to be some <4.0 FW Pebble, reading pairing trigger");
gatt.readCharacteristic(characteristic); gatt.readCharacteristic(characteristic);
} }

View File

@ -19,6 +19,7 @@ public class PebbleLESupport {
private PebbleGATTClient mPebbleGATTClient; private PebbleGATTClient mPebbleGATTClient;
private PipedInputStream mPipedInputStream; private PipedInputStream mPipedInputStream;
private PipedOutputStream mPipedOutputStream; private PipedOutputStream mPipedOutputStream;
private int mMTU = 20;
public PebbleLESupport(Context context, final String btDeviceAddress, PipedInputStream pipedInputStream, PipedOutputStream pipedOutputStream) { public PebbleLESupport(Context context, final String btDeviceAddress, PipedInputStream pipedInputStream, PipedOutputStream pipedOutputStream) {
@ -37,7 +38,7 @@ public class PebbleLESupport {
mPebbleGATTServer = new PebbleGATTServer(this, context, btDevice); mPebbleGATTServer = new PebbleGATTServer(this, context, btDevice);
mPebbleGATTServer.initialize(); mPebbleGATTServer.initialize();
mPebbleGATTClient = new PebbleGATTClient(context, btDevice); mPebbleGATTClient = new PebbleGATTClient(this, context, btDevice);
mPebbleGATTClient.initialize(); mPebbleGATTClient.initialize();
} }
@ -83,13 +84,16 @@ public class PebbleLESupport {
} }
} }
void setMTU(int mtu) {
mMTU = mtu;
}
private class PipeReader extends Thread { private class PipeReader extends Thread {
int mmSequence = 0; int mmSequence = 0;
private boolean mQuit = false; private boolean mQuit = false;
@Override @Override
public void run() { public void run() {
int MTU = 339 - 3;
byte[] buf = new byte[8192]; byte[] buf = new byte[8192];
int bytesRead; int bytesRead;
while (!mQuit) { while (!mQuit) {
@ -113,7 +117,7 @@ public class PebbleLESupport {
int payloadToSend = bytesRead + 4; int payloadToSend = bytesRead + 4;
int srcPos = 0; int srcPos = 0;
while (payloadToSend > 0) { while (payloadToSend > 0) {
int chunkSize = (payloadToSend < (MTU - 1)) ? payloadToSend : MTU - 1; int chunkSize = (payloadToSend < (mMTU - 4)) ? payloadToSend : mMTU - 4;
byte[] outBuf = new byte[chunkSize + 1]; byte[] outBuf = new byte[chunkSize + 1];
outBuf[0] = (byte) ((mmSequence++ << 3) & 0xff); outBuf[0] = (byte) ((mmSequence++ << 3) & 0xff);
System.arraycopy(buf, srcPos, outBuf, 1, chunkSize); System.arraycopy(buf, srcPos, outBuf, 1, chunkSize);