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 8ab1e04845..bca8146c00 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 @@ -147,13 +147,12 @@ class OmnipodDashPumpPlugin @Inject constructor( } else { rxBus.send(EventDismissNotification(Notification.OMNIPOD_POD_NOT_ATTACHED)) if (podStateManager.isSuspended) { - val notification = - Notification( - Notification.OMNIPOD_POD_SUSPENDED, - "Insulin delivery suspended", - Notification.NORMAL - ) - rxBus.send(EventNewNotification(notification)) + showNotification( + Notification.OMNIPOD_POD_SUSPENDED, + "Insulin delivery suspended", + Notification.NORMAL, + R.raw.boluserror + ) } else { rxBus.send(EventDismissNotification(Notification.OMNIPOD_POD_SUSPENDED)) if (!podStateManager.sameTimeZone) { @@ -246,13 +245,13 @@ class OmnipodDashPumpPlugin @Inject constructor( override fun disconnect(reason: String) { aapsLogger.info(LTag.PUMP, "disconnect reason=$reason") - stopConnecting?.let { it.countDown() } + stopConnecting?.countDown() omnipodManager.disconnect(false) } override fun stopConnecting() { aapsLogger.info(LTag.PUMP, "stopConnecting") - stopConnecting?.let { it.countDown() } + stopConnecting?.countDown() omnipodManager.disconnect(true) } @@ -328,6 +327,15 @@ class OmnipodDashPumpPlugin @Inject constructor( Notification.URGENT, R.raw.boluserror ) + if (!podStateManager.alarmSynced) { + pumpSync.insertAnnouncement( + error = podStateManager.alarmType?.toString() ?: "Unknown pod failure", + pumpId = Random.Default.nextLong(), + pumpType = PumpType.OMNIPOD_DASH, + pumpSerial = serialNumber() + ) + podStateManager.alarmSynced = true + } } Completable.complete() } @@ -817,7 +825,7 @@ class OmnipodDashPumpPlugin @Inject constructor( val ret = pumpSync.syncTemporaryBasalWithPumpId( timestamp = historyEntry.createdAt, rate = absoluteRate, - duration = T.mins(durationInMinutes.toLong()).msecs(), + duration = T.mins(durationInMinutes).msecs(), isAbsolute = true, type = tbrType, pumpId = historyEntry.pumpId(), @@ -833,7 +841,7 @@ class OmnipodDashPumpPlugin @Inject constructor( when { podStateManager.deliveryStatus !in arrayOf(DeliveryStatus.TEMP_BASAL_ACTIVE, DeliveryStatus.BOLUS_AND_TEMP_BASAL_ACTIVE) -> { - // TODO: what happens if we try to cancel inexistent temp basal? + // TODO: what happens if we try to cancel nonexistent temp basal? aapsLogger.info(LTag.PUMP, "No temporary basal to cancel") Completable.complete() } @@ -841,7 +849,7 @@ class OmnipodDashPumpPlugin @Inject constructor( !enforceNew -> Completable.error( IllegalStateException( - "Temporary basal already active and enforeNew is not set." + "Temporary basal already active and enforceNew is not set." ) ) @@ -979,7 +987,7 @@ class OmnipodDashPumpPlugin @Inject constructor( aapsLogger.warn(LTag.PUMP, "Unsupported custom action: $customActionType") } - override fun executeCustomCommand(customCommand: CustomCommand): PumpEnactResult? { + override fun executeCustomCommand(customCommand: CustomCommand): PumpEnactResult { return when (customCommand) { is CommandSilenceAlerts -> silenceAlerts() @@ -1068,7 +1076,8 @@ class OmnipodDashPumpPlugin @Inject constructor( private fun deactivatePod(): PumpEnactResult { val ret = executeProgrammingCommand( historyEntry = history.createRecord(OmnipodCommandType.DEACTIVATE_POD), - command = omnipodManager.deactivatePod().ignoreElements() + command = omnipodManager.deactivatePod().ignoreElements(), + checkNoActiveCommand = false, ).doOnComplete { rxBus.send(EventDismissNotification(Notification.OMNIPOD_POD_FAULT)) }.toPumpEnactResult() @@ -1381,11 +1390,9 @@ class OmnipodDashPumpPlugin @Inject constructor( sp.getBoolean(R.string.key_omnipod_common_notification_uncertain_tbr_sound_enabled, true) Notification.OMNIPOD_UNCERTAIN_SMB -> sp.getBoolean(R.string.key_omnipod_common_notification_uncertain_smb_sound_enabled, true) + Notification.OMNIPOD_POD_SUSPENDED -> + sp.getBoolean(R.string.key_omnipod_common_notification_delivery_suspended_sound_enabled, true) else -> true } } - - private fun dismissNotification(id: Int) { - rxBus.send(EventDismissNotification(id)) - } } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/callbacks/BleCommCallbacks.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/callbacks/BleCommCallbacks.kt index 6e193193b3..63d785e10c 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/callbacks/BleCommCallbacks.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/callbacks/BleCommCallbacks.kt @@ -211,8 +211,8 @@ class BleCommCallbacks( fun resetConnection() { aapsLogger.debug(LTag.PUMPBTCOMM, "Reset connection") - connected?.countDown() - serviceDiscoveryComplete?.countDown() + connected.countDown() + serviceDiscoveryComplete.countDown() connected = CountDownLatch(1) serviceDiscoveryComplete = CountDownLatch(1) flushConfirmationQueue() diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/FailedToConnectException.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/FailedToConnectException.kt index 48cc7470bf..b0b16a611d 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/FailedToConnectException.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/FailedToConnectException.kt @@ -1,5 +1,3 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions -open class FailedToConnectException : Exception { - constructor(message: String? = null) : super("Failed to connect: ${message ?: ""}") -} +open class FailedToConnectException(message: String? = null) : Exception("Failed to connect: ${message ?: ""}") diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/message/MessageIO.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/message/MessageIO.kt index 0aa3033894..8c20958cf3 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/message/MessageIO.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/message/MessageIO.kt @@ -37,8 +37,8 @@ class MessageIO( fun sendMessage(msg: MessagePacket): MessageSendResult { val foundRTS = cmdBleIO.flushIncomingQueue() if (foundRTS) { - val msg = receiveMessage(false) - aapsLogger.warn(LTag.PUMPBTCOMM, "sendMessage received message=$msg") + val receivedMessage = receiveMessage(false) + aapsLogger.warn(LTag.PUMPBTCOMM, "sendMessage received message=$receivedMessage") throw IllegalStateException("Received message while trying to send") } dataBleIO.flushIncomingQueue() diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/scan/DiscoveredInvalidPodException.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/scan/DiscoveredInvalidPodException.kt index 0097cfd8df..54cf638c69 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/scan/DiscoveredInvalidPodException.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/scan/DiscoveredInvalidPodException.kt @@ -2,6 +2,5 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.scan import android.os.ParcelUuid -class DiscoveredInvalidPodException : Exception { - constructor(message: String, serviceUUIds: List) : super("$message service UUIDs: $serviceUUIds") -} +class DiscoveredInvalidPodException(message: String, serviceUUIds: List) : + Exception("$message service UUIDs: $serviceUUIds") diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BasalProgram.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BasalProgram.kt index 553051444b..993874b5e3 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BasalProgram.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BasalProgram.kt @@ -15,8 +15,6 @@ class BasalProgram( fun hasZeroUnitSegments() = segments.any { it.basalRateInHundredthUnitsPerHour == 0 } - fun isZeroBasal() = segments.sumBy(Segment::basalRateInHundredthUnitsPerHour) == 0 - fun rateAt(date: Date): Double { val instance = Calendar.getInstance() instance.time = date diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepRepetitionType.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepRepetitionType.kt index d7a1a8f761..cf668aa036 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepRepetitionType.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepRepetitionType.kt @@ -8,6 +8,6 @@ enum class BeepRepetitionType( XXX(0x01.toByte()), // Used in lump of coal alert, LOW_RESERVOIR XXX2(0x03.toByte()), // Used in USER_SET_EXPIRATION XXX3(0x05.toByte()), // published system expiration alert - XXX4(0x06.toByte()), // Used in imminent pod expiration alert + XXX4(0x06.toByte()), // Used in imminent pod expiration alert, suspend in progress XXX5(0x08.toByte()); // Lump of coal alert } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepType.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepType.kt index ad41a53654..2ce8428ee8 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepType.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/BeepType.kt @@ -4,5 +4,6 @@ enum class BeepType(val value: Byte) { SILENT(0x00.toByte()), FOUR_TIMES_BIP_BEEP(0x02.toByte()), // Used in low reservoir alert, user expiration alert, expiration alert, imminent expiration alert, lump of coal alert + XXX(0x04.toByte()), // Used during suspend LONG_SINGLE_BEEP(0x06.toByte()); // Used in stop delivery command } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/PodConstants.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/PodConstants.kt index ae648dd656..915c6b7bde 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/PodConstants.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/pod/definition/PodConstants.kt @@ -4,6 +4,6 @@ import java.time.Duration class PodConstants { companion object { - val MAX_POD_LIFETIME = Duration.ofMinutes(80) + val MAX_POD_LIFETIME = Duration.ofHours(80) } } 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 2e862b81b1..d27a3b28c4 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 @@ -41,6 +41,7 @@ interface OmnipodDashPodStateManager { val time: ZonedDateTime? val timeDrift: java.time.Duration? val expiry: ZonedDateTime? + var alarmSynced: Boolean val messageSequenceNumber: Short val sequenceNumberOfLastProgrammingCommand: Short? 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 0a7ca2ed56..6ff2887b39 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 @@ -124,7 +124,19 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( override val sameTimeZone: Boolean get() { val now = System.currentTimeMillis() - return TimeZone.getDefault().getOffset(now) == timeZone.getOffset(now) + val currentTimezone = TimeZone.getDefault() + val currentOffset = currentTimezone.getOffset(now) + val podOffset = timeZone.getOffset(now) + logger.debug( + LTag.PUMPCOMM, + "sameTimeZone currentTimezone=${currentTimezone.getDisplayName( + true, + TimeZone.SHORT + )} " + + "currentOffset=$currentOffset " + + "podOffset=$podOffset" + ) + return currentOffset == podOffset } override val bluetoothVersion: SoftwareVersion? @@ -233,6 +245,13 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( return null } + override var alarmSynced: Boolean + get() = podState.alarmSynced + set(value) { + podState.alarmSynced = value + store() + } + override var bluetoothConnectionState: OmnipodDashPodStateManager.BluetoothConnectionState @Synchronized get() = podState.bluetoothConnectionState @@ -498,8 +517,10 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( podState.lastStatusResponseReceived = 0 } - CommandSendingFailure, NoActiveCommand -> + CommandSendingFailure, NoActiveCommand -> { podState.activeCommand = null + podState.lastStatusResponseReceived = 0 + } } } @@ -576,7 +597,7 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( override fun updateFromAlarmStatusResponse(response: AlarmStatusResponse) { logger.info( LTag.PUMP, - "Received AlarmStatusReponse: $response" + "Received AlarmStatusResponse: $response" ) podState.deliveryStatus = response.deliveryStatus podState.podStatus = response.podStatus @@ -660,6 +681,7 @@ class OmnipodDashPodStateManagerImpl @Inject constructor( var eapAkaSequenceNumber: Long = 1 var bolusPulsesRemaining: Short = 0 var timeZone: String = "" // TimeZone ID (e.g. "Europe/Amsterdam") + var alarmSynced: Boolean = false var bleVersion: SoftwareVersion? = null var firmwareVersion: SoftwareVersion? = null diff --git a/omnipod-dash/src/main/res/values/strings.xml b/omnipod-dash/src/main/res/values/strings.xml index b164e7bee4..6535947b56 100644 --- a/omnipod-dash/src/main/res/values/strings.xml +++ b/omnipod-dash/src/main/res/values/strings.xml @@ -21,4 +21,6 @@ omnipod_common_preferences_category_confirmation common_preferences_category_other + AAPS.Omnipod.notification_delivery_suspended_sound_enabled + Sound when delivery suspended notification enabled diff --git a/omnipod-dash/src/main/res/xml/omnipod_dash_preferences.xml b/omnipod-dash/src/main/res/xml/omnipod_dash_preferences.xml index 0e1d2dd11a..49aea42d7b 100644 --- a/omnipod-dash/src/main/res/xml/omnipod_dash_preferences.xml +++ b/omnipod-dash/src/main/res/xml/omnipod_dash_preferences.xml @@ -93,6 +93,11 @@ android:key="@string/key_omnipod_common_notification_uncertain_bolus_sound_enabled" android:title="@string/omnipod_common_preferences_notification_uncertain_bolus_sound_enabled" /> + +