Handle DASH basal and TBR out of sync

This commit is contained in:
jbr7rr 2023-05-16 19:58:20 +02:00
parent 2826854b7c
commit 38728bac01

View file

@ -324,7 +324,7 @@ class OmnipodDashPumpPlugin @Inject constructor(
omnipodManager omnipodManager
.getStatus(ResponseType.StatusResponseType.DEFAULT_STATUS_RESPONSE) .getStatus(ResponseType.StatusResponseType.DEFAULT_STATUS_RESPONSE)
.ignoreElements(), .ignoreElements(),
history.updateFromState(podStateManager), updateFromState(),
podStateManager.updateActiveCommand() podStateManager.updateActiveCommand()
.map { handleCommandConfirmation(it) } .map { handleCommandConfirmation(it) }
.ignoreElement(), .ignoreElement(),
@ -632,14 +632,7 @@ class OmnipodDashPumpPlugin @Inject constructor(
) )
} else { } else {
if (podStateManager.activeCommand != null) { if (podStateManager.activeCommand != null) {
val sound = val sound = if (hasBolusErrorBeepEnabled()) info.nightscout.core.ui.R.raw.boluserror else 0
if (sp.getBoolean(
info.nightscout.androidaps.plugins.pump.omnipod.common.R.string
.key_omnipod_common_notification_uncertain_bolus_sound_enabled, true
)
) info.nightscout.core.ui.R.raw.boluserror
else 0
showErrorDialog(rh.gs(R.string.bolus_delivery_status_uncertain), sound) showErrorDialog(rh.gs(R.string.bolus_delivery_status_uncertain), sound)
} }
} }
@ -714,7 +707,7 @@ class OmnipodDashPumpPlugin @Inject constructor(
} }
val percent = (waited.toFloat() / estimatedDeliveryTimeSeconds) * 100 val percent = (waited.toFloat() / estimatedDeliveryTimeSeconds) * 100
updateBolusProgressDialog( updateBolusProgressDialog(
rh.gs(info.nightscout.pump.common.R.string.bolus_delivered_so_far, Round.roundTo(percent*requestedBolusAmount/100, PodConstants.POD_PULSE_BOLUS_UNITS), requestedBolusAmount), rh.gs(info.nightscout.pump.common.R.string.bolus_delivered_so_far, Round.roundTo(percent * requestedBolusAmount / 100, PodConstants.POD_PULSE_BOLUS_UNITS), requestedBolusAmount),
percent.toInt() percent.toInt()
) )
} }
@ -946,6 +939,13 @@ class OmnipodDashPumpPlugin @Inject constructor(
return sp.getBoolean(info.nightscout.androidaps.plugins.pump.omnipod.common.R.string.key_omnipod_common_basal_beeps_enabled, false) return sp.getBoolean(info.nightscout.androidaps.plugins.pump.omnipod.common.R.string.key_omnipod_common_basal_beeps_enabled, false)
} }
private fun hasBolusErrorBeepEnabled(): Boolean {
return sp.getBoolean(
info.nightscout.androidaps.plugins.pump.omnipod.common.R.string
.key_omnipod_common_notification_uncertain_bolus_sound_enabled, true
)
}
override fun cancelTempBasal(enforceNew: Boolean): PumpEnactResult { override fun cancelTempBasal(enforceNew: Boolean): PumpEnactResult {
if (!podStateManager.tempBasalActive && if (!podStateManager.tempBasalActive &&
pumpSync.expectedPumpState().temporaryBasal == null pumpSync.expectedPumpState().temporaryBasal == null
@ -1319,7 +1319,7 @@ class OmnipodDashPumpPlugin @Inject constructor(
podStateManager.activeCommand?.sendError = it podStateManager.activeCommand?.sendError = it
aapsLogger.error(LTag.PUMP, "Error executing command", it) aapsLogger.error(LTag.PUMP, "Error executing command", it)
}.onErrorComplete(), }.onErrorComplete(),
history.updateFromState(podStateManager), updateFromState(),
podStateManager.updateActiveCommand() podStateManager.updateActiveCommand()
.map { handleCommandConfirmation(it) } .map { handleCommandConfirmation(it) }
.ignoreElement(), .ignoreElement(),
@ -1488,6 +1488,41 @@ class OmnipodDashPumpPlugin @Inject constructor(
} }
} }
private fun updateFromState(): Completable = Completable.defer {
val tbr = pumpSync.expectedPumpState().temporaryBasal
if (tbr != null && podStateManager.deliveryStatus?.tempBasalActive() == false && pumpSync.expectedPumpState().temporaryBasal?.pumpSerial != Constants
.PUMP_SERIAL_FOR_FAKE_TBR
) {
// AAPS thinks there is a TBR running but pump has no TBR running
aapsLogger.error(LTag.PUMP, "AAPS expected a TBR running but pump has no TBR running! AAPS: ${pumpSync.expectedPumpState().temporaryBasal} Pump: ${podStateManager.deliveryStatus}")
// Alert user
val sound = if (hasBolusErrorBeepEnabled()) info.nightscout.core.ui.R.raw.boluserror else 0
showErrorDialog(rh.gs(R.string.temp_basal_out_of_sync), sound)
// Sync stopped basal with AAPS
val ret = pumpSync.syncStopTemporaryBasalWithPumpId(
System.currentTimeMillis(), // Note: It would be nice if TBR end could be estimated, but this will add a lot of complexity
tbr.id,
PumpType.OMNIPOD_DASH,
serialNumber()
)
aapsLogger.info(LTag.PUMP, "syncStopTemporaryBasalWithPumpId ret=$ret pumpId=${tbr.id}")
podStateManager.tempBasal = null
}
if (tbr == null && podStateManager.deliveryStatus?.tempBasalActive() == true) {
// AAPS thinks there is no TBR running but pump has a TBR running
aapsLogger.error(LTag.PUMP, "AAPS expected no TBR running but pump has a TBR running! AAPS: ${pumpSync.expectedPumpState().temporaryBasal} Pump: ${podStateManager.deliveryStatus}")
// Alert user
val sound = if (hasBolusErrorBeepEnabled()) info.nightscout.core.ui.R.raw.boluserror else 0
showErrorDialog(rh.gs(R.string.temp_basal_out_of_sync), sound)
// If this is reached is reached there is probably a something wrong with the time (maybe it has changed?).
// No way to calculate the TBR end time and update pumpSync properly.
// Cancel TBR running on Pump, pod history will be updated by observeNoActiveTempBasal()
return@defer observeNoActiveTempBasal()
}
// Update pod history:
history.updateFromState(podStateManager)
}
private fun showErrorDialog(message: String, sound: Int) { private fun showErrorDialog(message: String, sound: Int) {
uiInteraction.runAlarm(message, rh.gs(info.nightscout.core.ui.R.string.error), sound) uiInteraction.runAlarm(message, rh.gs(info.nightscout.core.ui.R.string.error), sound)
} }