From a55be8d33ff4e520d2ed5edfd45a7db39dc6c7d1 Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Mon, 10 Aug 2020 22:27:52 +0200 Subject: [PATCH] - Fix local alerts - Remove duplicate RL error from Pod tab --- .../hw/rileylink/service/RileyLinkServiceData.java | 11 +++++++++-- .../plugins/pump/omnipod/OmnipodFragment.kt | 3 --- .../plugins/pump/omnipod/OmnipodPumpPlugin.java | 10 +++++++--- .../nightscout/androidaps/utils/LocalAlertUtils.kt | 10 +++++++++- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java index b2439546a7..ed2ed072cd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java @@ -33,6 +33,7 @@ public class RileyLinkServiceData { boolean tuneUpDone = false; public RileyLinkError rileyLinkError; public RileyLinkServiceState rileyLinkServiceState = RileyLinkServiceState.NotStarted; + private long lastServiceStateChange = 0L; public RileyLinkFirmwareVersion firmwareVersion; public RileyLinkTargetFrequency rileyLinkTargetFrequency; // TODO this might not be correct place @@ -52,7 +53,8 @@ public class RileyLinkServiceData { public byte[] pumpIDBytes; @Inject - public RileyLinkServiceData() {} + public RileyLinkServiceData() { + } public void setPumpID(String pumpId, byte[] pumpIdBytes) { this.pumpID = pumpId; @@ -71,17 +73,22 @@ public class RileyLinkServiceData { workWithServiceState(newState, errorCode, true); } + public long getLastServiceStateChange() { + return lastServiceStateChange; + } + private synchronized RileyLinkServiceState workWithServiceState(RileyLinkServiceState newState, RileyLinkError errorCode, boolean set) { if (set) { rileyLinkServiceState = newState; + lastServiceStateChange = System.currentTimeMillis(); this.rileyLinkError = errorCode; aapsLogger.info(LTag.PUMP, "RileyLink State Changed: {} {}", newState, errorCode == null ? "" : " - Error State: " + errorCode.name()); rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItem(rileyLinkServiceState, errorCode, targetDevice)); - if (activePlugin.getActivePump().manufacturer()== ManufacturerType.Medtronic) + if (activePlugin.getActivePump().manufacturer() == ManufacturerType.Medtronic) rxBus.send(new EventMedtronicDeviceStatusChange(newState, errorCode)); else { rxBus.send(new EventOmnipodDeviceStatusChange(newState, errorCode)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt index 9cefacf51e..95468b0feb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt @@ -224,9 +224,6 @@ class OmnipodFragment : DaggerFragment() { } omnipod_rl_status.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE) - if (rileyLinkError != null) { - errors.add(resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.Omnipod))) - } val rileyLinkErrorInfo = omnipodPumpStatus.errorInfo if (rileyLinkErrorInfo != null) { errors.add(rileyLinkErrorInfo) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java index 08c5a40521..98f07bbbb1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java @@ -995,15 +995,19 @@ public class OmnipodPumpPlugin extends PumpPluginAbstract implements OmnipodPump @Override public boolean isUnreachableAlertTimeoutExceeded(long unreachableTimeoutMilliseconds) { + long rileyLinkInitializationTimeout = 3 * 60 * 1000L; // 3 minutes if (podStateManager.isSetupCompleted() && podStateManager.getLastSuccessfulCommunication() != null) { // Null check for backwards compatibility if (podStateManager.getLastSuccessfulCommunication().getMillis() + unreachableTimeoutMilliseconds < System.currentTimeMillis()) { - if (podStateManager.getLastFailedCommunication() != null && podStateManager.getLastSuccessfulCommunication().isBefore(podStateManager.getLastFailedCommunication())) { - // We exceeded the alert threshold, and our last connection failed + if ((podStateManager.getLastFailedCommunication() != null && podStateManager.getLastSuccessfulCommunication().isBefore(podStateManager.getLastFailedCommunication())) || + rileyLinkServiceData.rileyLinkServiceState.isError() || + // The below clause is a hack for working around the RL service state forever staying in connecting state on startup if the RL is switched off / unreachable + (rileyLinkServiceData.getRileyLinkServiceState().isConnecting() && rileyLinkServiceData.getLastServiceStateChange() + rileyLinkInitializationTimeout < System.currentTimeMillis())) { + // We exceeded the alert threshold, and either our last command failed or we cannot reach the RL // We should show an alert return true; } - // Don't trigger an alert when we exceeded the thresholds, but the last communication was successful + // Don't trigger an alert when we exceeded the thresholds, but the last communication was successful & the RL is reachable // This happens when we simply didn't need to send any commands to the pump } } diff --git a/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt b/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt index 070c1b0c51..ddf19bc13b 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt @@ -41,7 +41,7 @@ class LocalAlertUtils @Inject constructor( } fun checkPumpUnreachableAlarm(lastConnection: Long, isStatusOutdated: Boolean, isDisconnected: Boolean) { - val alarmTimeoutExpired = lastConnection + pumpUnreachableThreshold() < System.currentTimeMillis() + val alarmTimeoutExpired = isAlarmTimeoutExpired(lastConnection, pumpUnreachableThreshold()) val nextAlarmOccurrenceReached = sp.getLong("nextPumpDisconnectedAlarm", 0L) < System.currentTimeMillis() if (Config.APS && sp.getBoolean(resourceHelper.gs(R.string.key_enable_pump_unreachable_alert), true) && isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !isDisconnected) { @@ -57,6 +57,14 @@ class LocalAlertUtils @Inject constructor( if (!isStatusOutdated && !alarmTimeoutExpired) rxBus.send(EventDismissNotification(Notification.PUMP_UNREACHABLE)) } + private fun isAlarmTimeoutExpired(lastConnection: Long, unreachableThreshold: Long): Boolean { + if (activePlugin.activePump.pumpDescription.hasCustomUnreachableAlertCheck) { + return activePlugin.activePump.isUnreachableAlertTimeoutExceeded(unreachableThreshold) + } else { + return lastConnection + pumpUnreachableThreshold() < System.currentTimeMillis() + } + } + /*Presnoozes the alarms with 5 minutes if no snooze exists. * Call only at startup! */