diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.kt b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.kt index 1bdbdc7d64..c285b9d338 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.kt +++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.kt @@ -60,7 +60,6 @@ class QueueThread internal constructor( //write time sp.putLong(R.string.key_btwatchdog_lastbark, System.currentTimeMillis()) //toggle BT - pump.stopConnecting() pump.disconnect("watchdog") SystemClock.sleep(1000) val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() @@ -112,14 +111,18 @@ class QueueThread internal constructor( // Pickup 1st command and set performing variable if (queue.size() > 0) { queue.pickup() - if (queue.performing() != null) { - aapsLogger.debug(LTag.PUMPQUEUE, "performing " + queue.performing()?.status()) + val cont = queue.performing()?.let { + aapsLogger.debug(LTag.PUMPQUEUE, "performing " + it.status()) rxBus.send(EventQueueChanged()) - queue.performing()?.execute() + rxBus.send(EventPumpStatusChanged(it.status())) + it.execute() queue.resetPerforming() rxBus.send(EventQueueChanged()) lastCommandTime = System.currentTimeMillis() SystemClock.sleep(100) + true + } ?: false + if (cont) { continue } } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/OmnipodDashPumpPlugin.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/OmnipodDashPumpPlugin.kt index ce3a4a3e7b..405e7da295 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/OmnipodDashPumpPlugin.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/OmnipodDashPumpPlugin.kt @@ -235,7 +235,6 @@ class OmnipodDashPumpPlugin @Inject constructor( override fun connect(reason: String) { aapsLogger.info(LTag.PUMP, "connect reason=$reason") podStateManager.bluetoothConnectionState = OmnipodDashPodStateManager.BluetoothConnectionState.CONNECTING - synchronized(this) { stopConnecting?.let { aapsLogger.warn(LTag.PUMP, "Already connecting: $stopConnecting") @@ -244,7 +243,6 @@ class OmnipodDashPumpPlugin @Inject constructor( val stop = CountDownLatch(1) stopConnecting = stop } - thread( start = true, name = "ConnectionThread", @@ -253,6 +251,9 @@ class OmnipodDashPumpPlugin @Inject constructor( stopConnecting?.let { val error = omnipodManager.connect(it).ignoreElements().blockingGet() aapsLogger.info(LTag.PUMPCOMM, "connect error=$error") + if (error == null) { + podStateManager.incrementSuccessfulConnectionAttemptsAfterRetries() + } } } finally { synchronized(this) { @@ -270,6 +271,7 @@ class OmnipodDashPumpPlugin @Inject constructor( override fun stopConnecting() { aapsLogger.info(LTag.PUMP, "stopConnecting") + podStateManager.incrementFailedConnectionsAfterRetries() stopConnecting?.countDown() omnipodManager.disconnect(true) } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManager.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManager.kt index 6f5ab0ee62..6927e63195 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManager.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManager.kt @@ -33,6 +33,8 @@ interface OmnipodDashPodStateManager { var bluetoothConnectionState: BluetoothConnectionState var connectionAttempts: Int var successfulConnections: Int + val successfulConnectionAttemptsAfterRetries: Int + val failedConnectionsAfterRetries: Int var timeZone: TimeZone val sameTimeZone: Boolean // The TimeZone is the same on the phone and on the pod @@ -85,6 +87,8 @@ interface OmnipodDashPodStateManager { fun updateFromPairing(uniqueId: Id, pairResult: PairResult) fun reset() fun connectionSuccessRatio(): Float + fun incrementSuccessfulConnectionAttemptsAfterRetries() + fun incrementFailedConnectionsAfterRetries() fun createActiveCommand( historyId: String, diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManagerImpl.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManagerImpl.kt index 07404b8607..fe63757d17 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManagerImpl.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/state/OmnipodDashPodStateManagerImpl.kt @@ -114,6 +114,23 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( podState.successfulConnections = value } + override val successfulConnectionAttemptsAfterRetries: Int + @Synchronized + get() = podState.successfulConnectionAttemptsAfterRetries + + @Synchronized + override fun incrementSuccessfulConnectionAttemptsAfterRetries() { + podState.successfulConnectionAttemptsAfterRetries++ + } + + override val failedConnectionsAfterRetries: Int + @Synchronized + get() = podState.failedConnectionsAfterRetries + + override fun incrementFailedConnectionsAfterRetries() { + podState.failedConnectionsAfterRetries++ + } + override var timeZone: TimeZone get() = TimeZone.getTimeZone(podState.timeZone) set(tz) { @@ -129,10 +146,12 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( val podOffset = timeZone.getOffset(now) logger.debug( LTag.PUMPCOMM, - "sameTimeZone currentTimezone=${currentTimezone.getDisplayName( + "sameTimeZone currentTimezone=${ + currentTimezone.getDisplayName( true, TimeZone.SHORT - )} " + + ) + } " + "currentOffset=$currentOffset " + "podOffset=$podOffset" ) @@ -627,13 +646,10 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( } override fun connectionSuccessRatio(): Float { - if (connectionAttempts == 0) { + if (failedConnectionsAfterRetries + successfulConnectionAttemptsAfterRetries == 0) { return 0.0F - } else if (connectionAttempts <= successfulConnections) { - // Prevent bogus quality > 1 during initialisation - return 1.0F } - return successfulConnections.toFloat() / connectionAttempts.toFloat() + return successfulConnectionAttemptsAfterRetries.toFloat() / (successfulConnectionAttemptsAfterRetries + failedConnectionsAfterRetries) } override fun reset() { @@ -675,6 +691,8 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( OmnipodDashPodStateManager.BluetoothConnectionState.DISCONNECTED var connectionAttempts = 0 var successfulConnections = 0 + var successfulConnectionAttemptsAfterRetries = 0 + var failedConnectionsAfterRetries = 0 var messageSequenceNumber: Short = 0 var sequenceNumberOfLastProgrammingCommand: Short? = null var activationTime: Long? = null @@ -682,7 +700,6 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( var bluetoothAddress: String? = null var ltk: ByteArray? = null var eapAkaSequenceNumber: Long = 1 - var bolusPulsesRemaining: Short = 0 var timeZone: String = "" // TimeZone ID (e.g. "Europe/Amsterdam") var alarmSynced: Boolean = false 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 4703b82d0c..698381365e 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 @@ -50,6 +50,7 @@ import org.apache.commons.lang3.StringUtils import java.time.Duration import java.time.ZonedDateTime import java.util.* +import java.util.concurrent.TimeUnit import javax.inject.Inject import kotlin.collections.ArrayList @@ -213,6 +214,7 @@ class OmnipodDashOverviewFragment : DaggerFragment() { disposables += rxBus .toObservable(EventPumpStatusChanged::class.java) .observeOn(aapsSchedulers.main) + .delay(30, TimeUnit.MILLISECONDS, aapsSchedulers.main) .subscribe( { updateBluetoothConnectionStatus(it) @@ -254,17 +256,18 @@ class OmnipodDashOverviewFragment : DaggerFragment() { ?: PLACEHOLDER val connectionSuccessPercentage = podStateManager.connectionSuccessRatio() * 100 + val connectionAttempts = podStateManager.failedConnectionsAfterRetries + podStateManager.successfulConnectionAttemptsAfterRetries val successPercentageString = String.format("%.2f %%", connectionSuccessPercentage) val quality = - "${podStateManager.successfulConnections}/${podStateManager.connectionAttempts} :: $successPercentageString" + "${podStateManager.successfulConnectionAttemptsAfterRetries}/$connectionAttempts :: $successPercentageString" bluetoothStatusBinding.omnipodDashBluetoothConnectionQuality.text = quality val connectionStatsColor = when { - connectionSuccessPercentage > 90 -> - Color.WHITE - connectionSuccessPercentage > 60 -> + connectionSuccessPercentage < 70 && podStateManager.successfulConnectionAttemptsAfterRetries > 50 -> + Color.RED + connectionSuccessPercentage < 90 && podStateManager.successfulConnectionAttemptsAfterRetries > 50 -> Color.YELLOW else -> - Color.RED + Color.WHITE } bluetoothStatusBinding.omnipodDashBluetoothConnectionQuality.setTextColor(connectionStatsColor) bluetoothStatusBinding.omnipodDashDeliveryStatus.text = podStateManager.deliveryStatus?.let {