From 52335bc7daa58192786d2c8a4171077f62a0bba4 Mon Sep 17 00:00:00 2001 From: Jakub Kuczys Date: Wed, 15 Nov 2023 04:56:13 +0100 Subject: [PATCH] Auto-add battery changes to careportal --- .../pump/MedtronicPumpHistoryDecoder.kt | 4 +- .../medtronic/data/MedtronicHistoryData.kt | 41 +++++++++++++++++++ .../pump/medtronic/util/MedtronicConst.kt | 1 + 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.kt b/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.kt index 7ea2c36e19..782599ff5a 100644 --- a/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.kt +++ b/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.kt @@ -297,7 +297,9 @@ class MedtronicPumpHistoryDecoder @Inject constructor( } private fun decodeBatteryActivity(entry: PumpHistoryEntry) { - entry.displayableValue = if (entry.head[0] == 0.toByte()) "Battery Removed" else "Battery Replaced" + val isRemoved = entry.head[0] == 0.toByte() + entry.addDecodedData("isRemoved", isRemoved) + entry.displayableValue = if (isRemoved) "Battery Removed" else "Battery Replaced" } private fun decodeBasalProfileStart(entry: PumpHistoryEntry): RecordDecodeStatus { diff --git a/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt b/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt index 27d052bcca..4ab8cb87bf 100644 --- a/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt +++ b/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt @@ -347,6 +347,18 @@ class MedtronicHistoryData @Inject constructor( } } + // BatteryChange + val batteryChangeRecords: MutableList = getFilteredItems(PumpHistoryEntryType.BatteryChange) + aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: BatteryChange [count=%d, items=%s]", batteryChangeRecords.size, gson.toJson(batteryChangeRecords))) + if (isCollectionNotEmpty(batteryChangeRecords)) { + try { + processBatteryChange(batteryChangeRecords) + } catch (ex: Exception) { + aapsLogger.error(LTag.PUMP, "ProcessHistoryData: Error processing BatteryChange entries: " + ex.message, ex) + throw ex + } + } + // TDD val tdds: MutableList = getFilteredItems(setOf(PumpHistoryEntryType.EndResultTotals, getTDDType())) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: TDD [count=%d, items=%s]", tdds.size, gson.toJson(tdds))) @@ -456,6 +468,35 @@ class MedtronicHistoryData @Inject constructor( } } + private fun processBatteryChange(batteryChangeRecords: List) { + val maxAllowedTimeInPast = DateTimeUtil.getATDWithAddedMinutes(GregorianCalendar(), -120) + var lastBatteryChangeRecordTime = 0L + var lastBatteryChangeRecord: PumpHistoryEntry? = null + for (batteryChangeRecord in batteryChangeRecords) { + val isRemoved = batteryChangeRecord.getDecodedDataEntry("isRemoved") + + if (isRemoved != null && isRemoved as Boolean) + { + // we're interested in battery replacements, not battery removals + continue + } + + if (batteryChangeRecord.atechDateTime > maxAllowedTimeInPast) { + if (lastBatteryChangeRecordTime < batteryChangeRecord.atechDateTime) { + lastBatteryChangeRecordTime = batteryChangeRecord.atechDateTime + lastBatteryChangeRecord = batteryChangeRecord + } + } + } + if (lastBatteryChangeRecord != null) { + uploadCareportalEventIfFoundInHistory( + lastBatteryChangeRecord, + MedtronicConst.Statistics.LastBatteryChange, + DetailedBolusInfo.EventType.PUMP_BATTERY_CHANGE + ) + } + } + private fun uploadCareportalEventIfFoundInHistory(historyRecord: PumpHistoryEntry, eventSP: String, eventType: DetailedBolusInfo.EventType) { val lastPrimeFromAAPS = sp.getLong(eventSP, 0L) if (historyRecord.atechDateTime != lastPrimeFromAAPS) { diff --git a/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicConst.kt b/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicConst.kt index 8d86bce696..03bc600aa6 100644 --- a/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicConst.kt +++ b/pump/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicConst.kt @@ -30,5 +30,6 @@ object MedtronicConst { const val LastPumpHistoryEntry = StatsPrefix + "pump_history_entry" const val LastPrime = StatsPrefix + "last_sent_prime" const val LastRewind = StatsPrefix + "last_sent_rewind" + const val LastBatteryChange = StatsPrefix + "last_sent_battery_change" } } \ No newline at end of file