From e0a211b1c15672734e329390cb2f04ca006b59bd Mon Sep 17 00:00:00 2001 From: Prerepa Viswanadham Date: Fri, 25 Jul 2014 16:25:13 -0700 Subject: [PATCH] Refactor configuring scan params to scan manager Change-Id: I8c60f0fa4307c2833bc5da6cd080515c5b16b652 --- jni/com_android_bluetooth_gatt.cpp | 2 +- src/com/android/bluetooth/gatt/GattService.java | 56 -------------------- src/com/android/bluetooth/gatt/ScanManager.java | 69 ++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 58 deletions(-) diff --git a/jni/com_android_bluetooth_gatt.cpp b/jni/com_android_bluetooth_gatt.cpp index b8fc1b89..84b1f2f5 100644 --- a/jni/com_android_bluetooth_gatt.cpp +++ b/jni/com_android_bluetooth_gatt.cpp @@ -1731,6 +1731,7 @@ static JNINativeMethod sScanMethods[] = { {"gattClientScanFilterDeleteNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterDeleteNative}, {"gattClientScanFilterClearNative", "(II)V", (void *) gattClientScanFilterClearNative}, {"gattClientScanFilterEnableNative", "(IZ)V", (void *) gattClientScanFilterEnableNative}, + {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative}, }; // JNI functions defined in GattService class. @@ -1774,7 +1775,6 @@ static JNINativeMethod sMethods[] = { {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative}, {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative}, - {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative}, {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative}, }; diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java index 800cde89..a0286bdb 100644 --- a/src/com/android/bluetooth/gatt/GattService.java +++ b/src/com/android/bluetooth/gatt/GattService.java @@ -110,7 +110,6 @@ public class GattService extends ProfileService { HandleMap mHandleMap = new HandleMap(); private List mAdvertisingServiceUuids = new ArrayList(); - private static int lastConfiguredScanSetting = Integer.MIN_VALUE; private int mMaxScanFilters; /** @@ -1211,59 +1210,6 @@ public class GattService extends ProfileService { mScanManager.flushBatchScanResults(new ScanClient(clientIf, isServer)); } - // TODO: Move this to ScanManager. - void configureScanParams(int appIf) { - if (DBG) Log.d(TAG, "configureScanParams() - queue=" + mScanManager.scanQueue().size()); - int curScanSetting = Integer.MIN_VALUE; - - for(ScanClient client : mScanManager.scanQueue()) { - // ScanClient scan settings are assumed to be monotonically increasing in value for more - // power hungry(higher duty cycle) operation - if (client.settings.getScanMode() > curScanSetting) { - curScanSetting = client.settings.getScanMode(); - } - } - - if (DBG) Log.d(TAG, "configureScanParams() - ScanSetting Scan mode=" + curScanSetting + - " lastConfiguredScanSetting=" + lastConfiguredScanSetting); - - if (curScanSetting != Integer.MIN_VALUE) { - if (curScanSetting != lastConfiguredScanSetting) { - int scanWindow, scanInterval; - switch (curScanSetting){ - case ScanSettings.SCAN_MODE_LOW_POWER: - scanWindow = SCAN_MODE_LOW_POWER_WINDOW_MS; - scanInterval = SCAN_MODE_LOW_POWER_INTERVAL_MS; - break; - case ScanSettings.SCAN_MODE_BALANCED: - scanWindow = SCAN_MODE_BALANCED_WINDOW_MS; - scanInterval = SCAN_MODE_BALANCED_INTERVAL_MS; - break; - case ScanSettings.SCAN_MODE_LOW_LATENCY: - scanWindow = SCAN_MODE_LOW_LATENCY_WINDOW_MS; - scanInterval = SCAN_MODE_LOW_LATENCY_INTERVAL_MS; - break; - default: - Log.e(TAG, "Invalid value for curScanSetting " + curScanSetting); - scanWindow = SCAN_MODE_LOW_POWER_WINDOW_MS; - scanInterval = SCAN_MODE_LOW_POWER_INTERVAL_MS; - break; - } - // convert scanWindow and scanInterval from ms to LE scan units(0.625ms) - scanWindow = (scanWindow * 1000)/625; - scanInterval = (scanInterval * 1000)/625; - // Presence of scan clients means scan is active. - mScanManager.stopScan(new ScanClient(appIf, false)); - gattSetScanParametersNative(scanInterval, scanWindow); - lastConfiguredScanSetting = curScanSetting; - } - } else { - lastConfiguredScanSetting = curScanSetting; - mScanManager.stopScan(new ScanClient(appIf, false)); - if (DBG) Log.d(TAG, "configureScanParams() - queue emtpy, scan stopped"); - } - } - void stopScan(int appIf, boolean isServer) { enforceAdminPermission(); if (DBG) Log.d(TAG, "stopScan() - queue=" + mScanManager.scanQueue().size()); @@ -2144,8 +2090,6 @@ public class GattService extends ProfileService { private native void gattClientUnregisterAppNative(int clientIf); - private native void gattSetScanParametersNative(int scan_interval, int scan_window); - private native void gattClientConnectNative(int clientIf, String address, boolean isDirect, int transport); diff --git a/src/com/android/bluetooth/gatt/ScanManager.java b/src/com/android/bluetooth/gatt/ScanManager.java index be2e0a2d..fa14db7d 100644 --- a/src/com/android/bluetooth/gatt/ScanManager.java +++ b/src/com/android/bluetooth/gatt/ScanManager.java @@ -70,6 +70,8 @@ public class ScanManager { // Timeout for each controller operation. private static final int OPERATION_TIME_OUT_MILLIS = 500; + private static int lastConfiguredScanSetting = Integer.MIN_VALUE; + private GattService mService; private ScanNative mScanNative; private ClientHandler mHandler; @@ -185,7 +187,7 @@ public class ScanManager { mScanNative.startBatchScan(client); } else { mRegularScanClients.add(client); - mScanNative.startRegularScan(client); + mScanNative.configureRegularScanParams(); } } @@ -193,6 +195,7 @@ public class ScanManager { Utils.enforceAdminPermission(mService); if (mRegularScanClients.contains(client)) { mRegularScanClients.remove(client); + mScanNative.configureRegularScanParams(); mScanNative.stopRegularScan(client); } else { mBatchClients.remove(client); @@ -240,6 +243,17 @@ public class ScanManager { private static final int ALLOW_ALL_FILTER_INDEX = 1; private static final int ALLOW_ALL_FILTER_SELECTION = 0; + /** + * Scan params corresponding to scan setting + */ + private static final int SCAN_MODE_LOW_POWER_WINDOW_MS = 500; + private static final int SCAN_MODE_LOW_POWER_INTERVAL_MS = 5000; + private static final int SCAN_MODE_BALANCED_WINDOW_MS = 2000; + private static final int SCAN_MODE_BALANCED_INTERVAL_MS = 5000; + private static final int SCAN_MODE_LOW_LATENCY_WINDOW_MS = 5000; + private static final int SCAN_MODE_LOW_LATENCY_INTERVAL_MS = 5000; + + // The logic is AND for each filter field. private static final int LIST_LOGIC_TYPE = 0x1111111; private static final int FILTER_LOGIC_TYPE = 1; @@ -290,6 +304,56 @@ public class ScanManager { } } + void configureRegularScanParams() { + if (DBG) Log.d(TAG, "configureRegularScanParams() - queue=" + mRegularScanClients.size()); + int curScanSetting = Integer.MIN_VALUE; + + for(ScanClient client : mRegularScanClients) { + // ScanClient scan settings are assumed to be monotonically increasing in value for more + // power hungry(higher duty cycle) operation + if (client.settings.getScanMode() > curScanSetting) { + curScanSetting = client.settings.getScanMode(); + } + } + + if (DBG) Log.d(TAG, "configureRegularScanParams() - ScanSetting Scan mode=" + curScanSetting + + " lastConfiguredScanSetting=" + lastConfiguredScanSetting); + + if (curScanSetting != Integer.MIN_VALUE) { + if (curScanSetting != lastConfiguredScanSetting) { + int scanWindow, scanInterval; + switch (curScanSetting){ + case ScanSettings.SCAN_MODE_LOW_POWER: + scanWindow = SCAN_MODE_LOW_POWER_WINDOW_MS; + scanInterval = SCAN_MODE_LOW_POWER_INTERVAL_MS; + break; + case ScanSettings.SCAN_MODE_BALANCED: + scanWindow = SCAN_MODE_BALANCED_WINDOW_MS; + scanInterval = SCAN_MODE_BALANCED_INTERVAL_MS; + break; + case ScanSettings.SCAN_MODE_LOW_LATENCY: + scanWindow = SCAN_MODE_LOW_LATENCY_WINDOW_MS; + scanInterval = SCAN_MODE_LOW_LATENCY_INTERVAL_MS; + break; + default: + Log.e(TAG, "Invalid value for curScanSetting " + curScanSetting); + scanWindow = SCAN_MODE_LOW_POWER_WINDOW_MS; + scanInterval = SCAN_MODE_LOW_POWER_INTERVAL_MS; + break; + } + // convert scanWindow and scanInterval from ms to LE scan units(0.625ms) + scanWindow = (scanWindow * 1000)/625; + scanInterval = (scanInterval * 1000)/625; + gattSetScanParametersNative(scanInterval, scanWindow); + lastConfiguredScanSetting = curScanSetting; + } + } else { + lastConfiguredScanSetting = curScanSetting; + if (DBG) Log.d(TAG, "configureRegularScanParams() - queue emtpy, scan stopped"); + } + } + + void startRegularScan(ScanClient client) { if (mFilterIndexStack.isEmpty() && isFilteringSupported()) { initFilterIndexStack(); @@ -548,6 +612,9 @@ public class ScanManager { /************************** Regular scan related native methods **************************/ private native void gattClientScanNative(boolean start); + private native void gattSetScanParametersNative(int scan_interval, + int scan_window); + /************************** Filter related native methods ********************************/ private native void gattClientScanFilterAddNative(int client_if, int filter_type, int filter_index, int company_id, -- 2.11.0