summaryrefslogtreecommitdiffstats
path: root/src/android
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@qt.io>2016-11-22 16:47:46 +0100
committerJani Heikkinen <jani.heikkinen@qt.io>2016-11-29 05:36:08 +0000
commit4b97b7b9eb2ab2d1c3d2a0e3486001773441bb8e (patch)
tree991645a9e87f26ff68da42851f6ec20304b2a23b /src/android
parentd72e18620a36e36f9b9db3edcec3f7383f6cb1d8 (diff)
Remove runningHandle variable to simplify Android backend
The runningHandle variable keeps track of the same information as the GattEntry tables. We don't need two systems. This brings initial service discovery closer to the normal read/write queue system. Ultimately the goal is to merge the initial service discovery state machine and the read/write queue system into one. This reduces blocking issues and simplifies the implementation. Task-number: QTBUG-52692 Change-Id: Idd14212cb02e6c3737b5296adf1525ff7f7832a1 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java149
1 files changed, 68 insertions, 81 deletions
diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java
index deb70dc0..0f1b9c2c 100644
--- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java
+++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java
@@ -182,9 +182,21 @@ public class QtBluetoothLE {
android.bluetooth.BluetoothGattCharacteristic characteristic,
int status)
{
- //runningHandle is only used during serviceDetailsDiscovery
- //If it is -1 we got an update outside of the details discovery process
- final boolean isServiceDiscoveryRun = (runningHandle != -1);
+ int foundHandle = -1;
+ synchronized (this) {
+ foundHandle = handleForCharacteristic(characteristic);
+ if (foundHandle == -1 || foundHandle >= entries.size() ) {
+ Log.w(TAG, "Cannot find characteristic read request for read notification - handle: " +
+ foundHandle + " size: " + entries.size());
+ return;
+ }
+ }
+
+ GattEntry entry = entries.get(foundHandle);
+ final boolean isServiceDiscoveryRun = !entry.valueKnown;
+ entry.valueKnown = true;
+ entries.set(foundHandle, entry);
+
if (status != BluetoothGatt.GATT_SUCCESS) {
Log.w(TAG, "onCharacteristicRead error: " + status);
@@ -202,44 +214,30 @@ public class QtBluetoothLE {
// once we have a service discovery run we report regular changes
if (!isServiceDiscoveryRun) {
- int foundHandle = -1;
- synchronized (this) {
- foundHandle = handleForCharacteristic(characteristic);
- }
-
synchronized (readWriteQueue) {
ioJobPending = false;
}
- if (foundHandle == -1) {
- Log.w(TAG, "Out-of-detail-discovery: char update failed. " +
- "Cannot find handle for characteristic");
+ if (status == BluetoothGatt.GATT_SUCCESS) {
+ leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(),
+ foundHandle + 1, characteristic.getUuid().toString(),
+ characteristic.getProperties(), characteristic.getValue());
} else {
- if (status == BluetoothGatt.GATT_SUCCESS) {
- leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(),
- foundHandle + 1, characteristic.getUuid().toString(),
- characteristic.getProperties(), characteristic.getValue());
- } else {
- // This must be in sync with QLowEnergyService::CharacteristicReadError
- final int characteristicReadError = 5;
- leServiceError(qtObject, foundHandle + 1, characteristicReadError);
- }
+ // This must be in sync with QLowEnergyService::CharacteristicReadError
+ final int characteristicReadError = 5;
+ leServiceError(qtObject, foundHandle + 1, characteristicReadError);
}
performNextIO();
return;
}
- GattEntry entry = entries.get(runningHandle);
- entry.valueKnown = true;
- entries.set(runningHandle, entry);
-
// Qt manages handles starting at 1, in Java we use a system starting with 0
//TODO avoid sending service uuid -> service handle should be sufficient
leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(),
- runningHandle + 1, characteristic.getUuid().toString(),
+ foundHandle + 1, characteristic.getUuid().toString(),
characteristic.getProperties(), characteristic.getValue());
- performServiceDetailDiscoveryForHandle(runningHandle + 1, false);
+ performServiceDetailDiscoveryForHandle(foundHandle + 1, false);
}
public void onCharacteristicWrite(android.bluetooth.BluetoothGatt gatt,
@@ -287,9 +285,20 @@ public class QtBluetoothLE {
android.bluetooth.BluetoothGattDescriptor descriptor,
int status)
{
- //runningHandle is only used during serviceDetailsDiscovery
- //If it is -1 we got an update outside of the details discovery process
- final boolean isServiceDiscoveryRun = (runningHandle != -1);
+ int foundHandle = -1;
+ synchronized (this) {
+ foundHandle = handleForDescriptor(descriptor);
+ if (foundHandle == -1 || foundHandle >= entries.size() ) {
+ Log.w(TAG, "Cannot find descriptor read request for read notification - handle: " +
+ foundHandle + " size: " + entries.size());
+ return;
+ }
+ }
+
+ GattEntry entry = entries.get(foundHandle);
+ final boolean isServiceDiscoveryRun = !entry.valueKnown;
+ entry.valueKnown = true;
+ entries.set(foundHandle, entry);
if (status != BluetoothGatt.GATT_SUCCESS) {
Log.w(TAG, "onDescriptorRead error: " + status);
@@ -307,41 +316,27 @@ public class QtBluetoothLE {
if (!isServiceDiscoveryRun) {
- int foundHandle = -1;
- synchronized (this) {
- foundHandle = handleForDescriptor(descriptor);
- }
-
synchronized (readWriteQueue) {
ioJobPending = false;
}
- if (foundHandle == -1) {
- Log.w(TAG, "Out-of-detail-discovery: char update failed. " +
- "Cannot find handle for descriptor.");
+ if (status == BluetoothGatt.GATT_SUCCESS) {
+ leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(),
+ descriptor.getCharacteristic().getUuid().toString(), foundHandle + 1,
+ descriptor.getUuid().toString(), descriptor.getValue());
} else {
- if (status == BluetoothGatt.GATT_SUCCESS) {
- leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(),
- descriptor.getCharacteristic().getUuid().toString(), foundHandle + 1,
- descriptor.getUuid().toString(), descriptor.getValue());
- } else {
- // This must be in sync with QLowEnergyService::DescriptorReadError
- final int descriptorReadError = 6;
- leServiceError(qtObject, foundHandle + 1, descriptorReadError);
- }
+ // This must be in sync with QLowEnergyService::DescriptorReadError
+ final int descriptorReadError = 6;
+ leServiceError(qtObject, foundHandle + 1, descriptorReadError);
}
performNextIO();
return;
}
-
- GattEntry entry = entries.get(runningHandle);
- entry.valueKnown = true;
- entries.set(runningHandle, entry);
//TODO avoid sending service and characteristic uuid -> handles should be sufficient
leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(),
- descriptor.getCharacteristic().getUuid().toString(), runningHandle+1,
+ descriptor.getCharacteristic().getUuid().toString(), foundHandle+1,
descriptor.getUuid().toString(), descriptor.getValue());
/* Some devices preset ClientCharacteristicConfiguration descriptors
@@ -361,7 +356,7 @@ public class QtBluetoothLE {
}
}
- performServiceDetailDiscoveryForHandle(runningHandle + 1, false);
+ performServiceDetailDiscoveryForHandle(foundHandle + 1, false);
}
public void onDescriptorWrite(android.bluetooth.BluetoothGatt gatt,
@@ -601,12 +596,10 @@ public class QtBluetoothLE {
}
private int currentServiceInDiscovery = -1;
- private int runningHandle = -1;
private void resetData()
{
synchronized (this) {
- runningHandle = -1;
currentServiceInDiscovery = -1;
uuidToEntry.clear();
entries.clear();
@@ -723,7 +716,6 @@ public class QtBluetoothLE {
discoveredService.valueKnown = true;
entries.set(currentServiceInDiscovery, discoveredService);
- runningHandle = -1;
currentServiceInDiscovery = -1;
leServiceDetailDiscoveryFinished(qtObject, discoveredService.service.getUuid().toString(),
@@ -744,9 +736,7 @@ public class QtBluetoothLE {
try {
if (searchStarted) {
currentServiceInDiscovery = nextHandle;
- runningHandle = ++nextHandle;
- } else {
- runningHandle = nextHandle;
+ nextHandle++;
}
GattEntry entry;
@@ -772,7 +762,7 @@ public class QtBluetoothLE {
leCharacteristicRead(qtObject, entry.characteristic.getService().getUuid().toString(),
nextHandle + 1, entry.characteristic.getUuid().toString(),
entry.characteristic.getProperties(), entry.characteristic.getValue());
- performServiceDetailDiscoveryForHandle(runningHandle + 1, false);
+ performServiceDetailDiscoveryForHandle(nextHandle + 1, false);
}
} catch (Exception ex)
{
@@ -781,7 +771,7 @@ public class QtBluetoothLE {
break;
case CharacteristicValue:
// ignore -> nothing to do for this artificial type
- performServiceDetailDiscoveryForHandle(runningHandle + 1, false);
+ performServiceDetailDiscoveryForHandle(nextHandle + 1, false);
break;
case Descriptor:
result = mBluetoothGatt.readDescriptor(entry.descriptor);
@@ -795,7 +785,7 @@ public class QtBluetoothLE {
entry.descriptor.getCharacteristic().getUuid().toString(),
nextHandle+1, entry.descriptor.getUuid().toString(),
entry.descriptor.getValue());
- performServiceDetailDiscoveryForHandle(runningHandle + 1, false);
+ performServiceDetailDiscoveryForHandle(nextHandle + 1, false);
}
break;
case Service:
@@ -1002,28 +992,25 @@ public class QtBluetoothLE {
we have to report an error back to Qt. This is not required during
the initial service discovery though.
*/
- final boolean isServiceDiscoveryRun = (runningHandle != -1);
- if (!isServiceDiscoveryRun) {
- int handle = -1;
- if (nextJob.entry.type == GattEntryType.Characteristic)
- handle = handleForCharacteristic(nextJob.entry.characteristic);
- else
- handle = handleForDescriptor(nextJob.entry.descriptor);
-
- if (handle != -1) {
- int errorCode = 0;
-
- // The error codes below must be in sync with QLowEnergyService::ServiceError
- if (nextJob.jobType == IoJobType.Read) {
- errorCode = (nextJob.entry.type == GattEntryType.Characteristic) ?
- 5 : 6; // CharacteristicReadError : DescriptorReadError
- } else {
- errorCode = (nextJob.entry.type == GattEntryType.Characteristic) ?
- 2 : 3; // CharacteristicWriteError : DescriptorWriteError
- }
+ int handle = -1;
+ if (nextJob.entry.type == GattEntryType.Characteristic)
+ handle = handleForCharacteristic(nextJob.entry.characteristic);
+ else
+ handle = handleForDescriptor(nextJob.entry.descriptor);
- leServiceError(qtObject, handle + 1, errorCode);
+ if (handle != -1) {
+ int errorCode = 0;
+
+ // The error codes below must be in sync with QLowEnergyService::ServiceError
+ if (nextJob.jobType == IoJobType.Read) {
+ errorCode = (nextJob.entry.type == GattEntryType.Characteristic) ?
+ 5 : 6; // CharacteristicReadError : DescriptorReadError
+ } else {
+ errorCode = (nextJob.entry.type == GattEntryType.Characteristic) ?
+ 2 : 3; // CharacteristicWriteError : DescriptorWriteError
}
+
+ leServiceError(qtObject, handle + 1, errorCode);
}
performNextIO();