diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/OmnipodDashManagerImpl.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/OmnipodDashManagerImpl.kt index 09845b2372..c280fbdf81 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/OmnipodDashManagerImpl.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/OmnipodDashManagerImpl.kt @@ -11,7 +11,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.definitio import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.response.* import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.state.OmnipodDashPodStateManager import info.nightscout.androidaps.utils.rx.AapsSchedulers -import info.nightscout.androidaps.utils.rx.retryWithBackoff import io.reactivex.Observable import io.reactivex.functions.Action import io.reactivex.functions.Consumer @@ -78,8 +77,7 @@ class OmnipodDashManagerImpl @Inject constructor( private val observeConnectToPod: Observable get() = Observable.defer { bleManager.connect() - .doOnError { throwable -> logger.warn(LTag.PUMPBTCOMM,"observeConnectToPod error=$throwable")} - .retryWithBackoff(retries = 2, delay = 6, timeUnit = TimeUnit.SECONDS, delayFactor = 1.2) + .doOnError { throwable -> logger.warn(LTag.PUMPBTCOMM, "observeConnectToPod error=$throwable") } } private val observePairNewPod: Observable diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt index 8af2a9c1fc..f0a73a3e2a 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt @@ -113,7 +113,22 @@ class OmnipodDashBleManagerImpl @Inject constructor( emitter.onComplete() return@create } - conn.connect() + + // two retries + for (i in 1..MAX_NUMBER_OF_CONNECTION_ATTEMPTS) { + try { + // wait i * CONNECTION_TIMEOUT + conn.connect(i) + break + } catch (e: Exception) { + aapsLogger.warn(LTag.PUMPBTCOMM, "connect error=$e") + if (i == MAX_NUMBER_OF_CONNECTION_ATTEMPTS) { + emitter.onError(e) + return@create + } + } + } + emitter.onNext(PodEvent.BluetoothConnected(podAddress)) emitter.onNext(PodEvent.EstablishingSession) establishSession(1.toByte()) @@ -218,7 +233,7 @@ class OmnipodDashBleManagerImpl @Inject constructor( } companion object { - + const val MAX_NUMBER_OF_CONNECTION_ATTEMPTS = 3 const val CONTROLLER_ID = 4242 // TODO read from preferences or somewhere else. } } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/session/Connection.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/session/Connection.kt index fb3ddc1cb5..7b8ff15cf7 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/session/Connection.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/session/Connection.kt @@ -55,7 +55,7 @@ class Connection( podState.bluetoothConnectionState = OmnipodDashPodStateManager.BluetoothConnectionState.CONNECTING gattConnection = podDevice.connectGatt(context, autoConnect, bleCommCallbacks, BluetoothDevice.TRANSPORT_LE) // OnDisconnect can be called after this point!!! - val state = waitForConnection() + val state = waitForConnection(2) if (state !is Connected) { podState.bluetoothConnectionState = OmnipodDashPodStateManager.BluetoothConnectionState.DISCONNECTED throw FailedToConnectException(podDevice.address) @@ -79,6 +79,7 @@ class Connection( gattConnection, bleCommCallbacks ) + val sendResult = cmdBleIO.hello() if (sendResult !is BleSendSuccess) { throw FailedToConnectException("Could not send HELLO command to ${podDevice.address}") @@ -89,7 +90,7 @@ class Connection( val msgIO = MessageIO(aapsLogger, cmdBleIO, dataBleIO) - fun connect() { + fun connect(timeoutMultiplier: Int) { if (session != null) { disconnect() } @@ -100,7 +101,7 @@ class Connection( throw FailedToConnectException("connect() returned false") } - if (waitForConnection() !is Connected) { + if (waitForConnection(timeoutMultiplier) !is Connected) { podState.bluetoothConnectionState = OmnipodDashPodStateManager.BluetoothConnectionState.DISCONNECTED throw FailedToConnectException(podDevice.address) } @@ -111,6 +112,8 @@ class Connection( dataBleIO.characteristic = discovered[CharacteristicType.DATA]!! cmdBleIO.characteristic = discovered[CharacteristicType.CMD]!! + // val ret = gattConnection.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH) + // aapsLogger.info(LTag.PUMPBTCOMM, "requestConnectionPriority: $ret") cmdBleIO.hello() cmdBleIO.readyToRead() dataBleIO.readyToRead() @@ -125,9 +128,9 @@ class Connection( session = null } - private fun waitForConnection(): ConnectionState { + private fun waitForConnection(timeoutMultiplier: Int): ConnectionState { try { - bleCommCallbacks.waitForConnection(CONNECT_TIMEOUT_MS) + bleCommCallbacks.waitForConnection(BASE_CONNECT_TIMEOUT_MS * timeoutMultiplier) } catch (e: InterruptedException) { // We are still going to check if connection was successful aapsLogger.info(LTag.PUMPBTCOMM, "Interrupted while waiting for connection") @@ -178,7 +181,6 @@ class Connection( } companion object { - - private const val CONNECT_TIMEOUT_MS = 12000 + private const val BASE_CONNECT_TIMEOUT_MS = 6000 } } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt index 2eff667cec..1382254b6f 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt @@ -368,8 +368,13 @@ class OmnipodDashOverviewFragment : DaggerFragment() { private fun updateLastConnection() { if (podStateManager.isUniqueIdSet) { - podInfoBinding.lastConnection.text = readableDuration(Duration(podStateManager.lastUpdatedSystem, System - .currentTimeMillis())) + podInfoBinding.lastConnection.text = readableDuration( + Duration( + podStateManager.lastUpdatedSystem, + System + .currentTimeMillis() + ) + ) val lastConnectionColor = if (omnipodDashPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) { Color.RED @@ -380,7 +385,8 @@ class OmnipodDashOverviewFragment : DaggerFragment() { } else { podInfoBinding.lastConnection.setTextColor(Color.WHITE) podInfoBinding.lastConnection.text = readableDuration( - Duration(podStateManager.lastUpdatedSystem, System.currentTimeMillis())) + Duration(podStateManager.lastUpdatedSystem, System.currentTimeMillis()) + ) } }