mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-02-21 06:46:48 +01:00
Pebble: remove the legacy countdownlatch on Pebble GATT server code
The GATTServer code is now in line with the new GATTClient code.
This commit is contained in:
parent
d817759d1f
commit
3c3e38741a
@ -30,6 +30,7 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
|
||||||
class PebbleGATTServer extends BluetoothGattServerCallback {
|
class PebbleGATTServer extends BluetoothGattServerCallback {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(PebbleGATTServer.class);
|
private static final Logger LOG = LoggerFactory.getLogger(PebbleGATTServer.class);
|
||||||
@ -43,6 +44,7 @@ class PebbleGATTServer extends BluetoothGattServerCallback {
|
|||||||
private Context mContext;
|
private Context mContext;
|
||||||
private BluetoothGattServer mBluetoothGattServer;
|
private BluetoothGattServer mBluetoothGattServer;
|
||||||
private BluetoothGattCharacteristic writeCharacteristics;
|
private BluetoothGattCharacteristic writeCharacteristics;
|
||||||
|
private CountDownLatch mWaitWriteCompleteLatch;
|
||||||
|
|
||||||
PebbleGATTServer(PebbleLESupport pebbleLESupport, Context context, BluetoothDevice btDevice) {
|
PebbleGATTServer(PebbleLESupport pebbleLESupport, Context context, BluetoothDevice btDevice) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
@ -73,9 +75,20 @@ class PebbleGATTServer extends BluetoothGattServerCallback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
synchronized void sendDataToPebble(byte[] data) {
|
synchronized void sendDataToPebble(byte[] data) {
|
||||||
|
mWaitWriteCompleteLatch = new CountDownLatch(1);
|
||||||
writeCharacteristics.setValue(data.clone());
|
writeCharacteristics.setValue(data.clone());
|
||||||
|
|
||||||
mBluetoothGattServer.notifyCharacteristicChanged(mBtDevice, writeCharacteristics, false);
|
boolean success = mBluetoothGattServer.notifyCharacteristicChanged(mBtDevice, writeCharacteristics, false);
|
||||||
|
if (!success) {
|
||||||
|
LOG.error("could not send data to pebble (error writing characteristic)");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
mWaitWriteCompleteLatch.await();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.warn("interrupted while waiting for write complete latch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mWaitWriteCompleteLatch = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
|
public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
|
||||||
@ -157,7 +170,19 @@ class PebbleGATTServer extends BluetoothGattServerCallback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onNotificationSent(BluetoothDevice bluetoothDevice, int status) {
|
public void onNotificationSent(BluetoothDevice bluetoothDevice, int status) {
|
||||||
//LOG.info("onNotificationSent() status = " + status + " to device " + mmBtDevice.getAddress());
|
|
||||||
|
if (!mPebbleLESupport.isExpectedDevice(bluetoothDevice)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (status != BluetoothGatt.GATT_SUCCESS) {
|
||||||
|
LOG.error("something went wrong when writing to PPoGATT characteristics");
|
||||||
|
}
|
||||||
|
if (mWaitWriteCompleteLatch != null) {
|
||||||
|
mWaitWriteCompleteLatch.countDown();
|
||||||
|
} else {
|
||||||
|
LOG.warn("mWaitWriteCompleteLatch is null!");
|
||||||
|
}
|
||||||
|
// LOG.info("onNotificationSent() status = " + status + " to device " + bluetoothDevice.getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
void close() {
|
void close() {
|
||||||
|
@ -27,7 +27,6 @@ import org.slf4j.LoggerFactory;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PipedInputStream;
|
import java.io.PipedInputStream;
|
||||||
import java.io.PipedOutputStream;
|
import java.io.PipedOutputStream;
|
||||||
import java.util.concurrent.CountDownLatch;
|
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
|
|
||||||
@ -43,7 +42,6 @@ public class PebbleLESupport {
|
|||||||
private int mMTULimit = Integer.MAX_VALUE;
|
private int mMTULimit = Integer.MAX_VALUE;
|
||||||
public boolean clientOnly = false; // currently experimental, and only possible for Pebble 2
|
public boolean clientOnly = false; // currently experimental, and only possible for Pebble 2
|
||||||
private boolean mIsConnected = false;
|
private boolean mIsConnected = false;
|
||||||
private CountDownLatch mPPAck;
|
|
||||||
private HandlerThread mWriteHandlerThread;
|
private HandlerThread mWriteHandlerThread;
|
||||||
private Handler mWriteHandler;
|
private Handler mWriteHandler;
|
||||||
|
|
||||||
@ -156,13 +154,6 @@ public class PebbleLESupport {
|
|||||||
int serial = header >> 3;
|
int serial = header >> 3;
|
||||||
if (command == 0x01) {
|
if (command == 0x01) {
|
||||||
LOG.info("got ACK for serial = " + serial);
|
LOG.info("got ACK for serial = " + serial);
|
||||||
if (!clientOnly) {
|
|
||||||
if (mPPAck != null) {
|
|
||||||
mPPAck.countDown();
|
|
||||||
} else {
|
|
||||||
LOG.warn("mPPAck countdownlatch is not present but it probably should");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (command == 0x02) { // some request?
|
if (command == 0x02) { // some request?
|
||||||
LOG.info("got command 0x02");
|
LOG.info("got command 0x02");
|
||||||
@ -187,7 +178,12 @@ public class PebbleLESupport {
|
|||||||
|
|
||||||
private synchronized void sendDataToPebble(final byte[] bytes) {
|
private synchronized void sendDataToPebble(final byte[] bytes) {
|
||||||
if (mPebbleGATTServer != null) {
|
if (mPebbleGATTServer != null) {
|
||||||
mPebbleGATTServer.sendDataToPebble(bytes);
|
mWriteHandler.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
mPebbleGATTServer.sendDataToPebble(bytes);
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
// For now only in experimental client only code
|
// For now only in experimental client only code
|
||||||
mWriteHandler.post(new Runnable() {
|
mWriteHandler.post(new Runnable() {
|
||||||
@ -226,9 +222,6 @@ public class PebbleLESupport {
|
|||||||
|
|
||||||
int payloadToSend = bytesRead + 4;
|
int payloadToSend = bytesRead + 4;
|
||||||
int srcPos = 0;
|
int srcPos = 0;
|
||||||
if (!clientOnly) {
|
|
||||||
mPPAck = new CountDownLatch(1);
|
|
||||||
}
|
|
||||||
while (payloadToSend > 0) {
|
while (payloadToSend > 0) {
|
||||||
int chunkSize = (payloadToSend < (mMTU - 4)) ? payloadToSend : mMTU - 4;
|
int chunkSize = (payloadToSend < (mMTU - 4)) ? payloadToSend : mMTU - 4;
|
||||||
byte[] outBuf = new byte[chunkSize + 1];
|
byte[] outBuf = new byte[chunkSize + 1];
|
||||||
@ -238,11 +231,7 @@ public class PebbleLESupport {
|
|||||||
srcPos += chunkSize;
|
srcPos += chunkSize;
|
||||||
payloadToSend -= chunkSize;
|
payloadToSend -= chunkSize;
|
||||||
}
|
}
|
||||||
if (!clientOnly) {
|
} catch (IOException e) {
|
||||||
mPPAck.await();
|
|
||||||
mPPAck = null;
|
|
||||||
}
|
|
||||||
} catch (IOException | InterruptedException e) {
|
|
||||||
LOG.info(e.getMessage());
|
LOG.info(e.getMessage());
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user