From 6fd1a8bd8d1e9b760dc06e7abdf25267bdc6eae8 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 10 Jun 2021 18:15:52 +0100 Subject: [PATCH] - fix for reading history TBR readings (with duration less than minute) --- .../pump/common/utils/DateTimeUtil.java | 9 ++- .../medtronic/data/MedtronicHistoryData.kt | 59 +++++++++++-------- .../medtronic/data/dto/TempBasalProcessDTO.kt | 18 +++--- .../plugins/pump/common/sync/PumpDbEntry.kt | 2 +- .../pump/common/sync/PumpSyncStorage.kt | 2 +- 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java index 32c1d36488..2f37f541a6 100644 --- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java +++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java @@ -6,6 +6,7 @@ package info.nightscout.androidaps.plugins.pump.common.utils; import org.joda.time.LocalDateTime; import org.joda.time.Minutes; +import org.joda.time.Seconds; import java.util.Calendar; import java.util.GregorianCalendar; @@ -245,13 +246,17 @@ public class DateTimeUtil { public static int getATechDateDiferenceAsMinutes(Long date1, Long date2) { - Minutes minutes = Minutes.minutesBetween(toLocalDateTime(date1), toLocalDateTime(date2)); - return minutes.getMinutes(); } + public static int getATechDateDiferenceAsSeconds(Long date1, Long date2) { + Seconds seconds = Seconds.secondsBetween(toLocalDateTime(date1), toLocalDateTime(date2)); + return seconds.getSeconds(); + } + + public static long getMillisFromATDWithAddedMinutes(long atd, int minutesDiff) { GregorianCalendar oldestEntryTime = DateTimeUtil.toGregorianCalendar(atd); oldestEntryTime.add(Calendar.MINUTE, minutesDiff); diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt index bcc090302f..a6d59363bc 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt @@ -10,6 +10,7 @@ import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.pump.common.defs.PumpType import info.nightscout.androidaps.plugins.pump.common.sync.PumpDbEntry +import info.nightscout.androidaps.plugins.pump.common.sync.PumpDbEntryTBR import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.MedtronicPumpHistoryDecoder @@ -628,12 +629,14 @@ class MedtronicHistoryData @Inject constructor( if (entryWithTempId != null) { if (tbrEntry != null) { - aapsLogger.debug(LTag.PUMP, String.format("DD: tempIdEntry=%s, tbrEntry=%s, tempBasalProcessDTO=%s, pumpType=%s, serial=%s", - gson.toJson(entryWithTempId), gson.toJson(tbrEntry), gson.toJson(tempBasalProcessDTO), medtronicPumpStatus.pumpType, medtronicPumpStatus.serialNumber)) + aapsLogger.debug(LTag.PUMP, "DD: tempIdEntry=${entryWithTempId}, tbrEntry=${tbrEntry}, " + + "tempBasalProcessDTO=${tempBasalProcessDTO}, " + + "pumpType=${medtronicPumpStatus.pumpType}, serial=${medtronicPumpStatus.serialNumber}") - aapsLogger.debug(LTag.PUMP, "BEFORE syncTemporaryBasalWithTempId " + + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithTempId " + "[date=${tempBasalProcessDTO.atechDateTime}, dateProcess=${tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime)}, " + - "tbrEntry.insulinRate=${tbrEntry.insulinRate}, duration=${tempBasalProcessDTO.duration * 60L * 1000L}, " + + "tbrEntry.insulinRate=${tbrEntry.insulinRate}, " + + "duration=${tempBasalProcessDTO.durationAsSeconds} s, " + "isAbsolute=${!tbrEntry.isPercent}, temporaryId=${entryWithTempId.temporaryId}, " + "pumpId=${tempBasalProcessDTO.pumpId}, pumpType=${medtronicPumpStatus.pumpType}, " + "pumpSerial=${medtronicPumpStatus.serialNumber}]") @@ -641,7 +644,7 @@ class MedtronicHistoryData @Inject constructor( val result = pumpSync.syncTemporaryBasalWithTempId( tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), tbrEntry.insulinRate, - tempBasalProcessDTO.duration * 60L * 1000L, + tempBasalProcessDTO.durationAsSeconds * 1000L, !tbrEntry.isPercent, entryWithTempId.temporaryId, PumpSync.TemporaryBasalType.NORMAL, @@ -649,10 +652,7 @@ class MedtronicHistoryData @Inject constructor( medtronicPumpStatus.pumpType, medtronicPumpStatus.serialNumber) - aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "syncTemporaryBasalWithTempId [date=%d, temporaryId=%d, pumpId=%d, rate=%.2f %s, duration=%d, pumpSerial=%s] - Result: %b", - tempBasalProcessDTO.atechDateTime, entryWithTempId.temporaryId, tempBasalProcessDTO.pumpId, - tbrEntry.insulinRate, (if (tbrEntry.isPercent) "%" else "U"), tempBasalProcessDTO.duration, - medtronicPumpStatus.serialNumber, result)) + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithTempId - Result: ${result}") pumpSyncStorage.removeTemporaryBasalWithTemporaryId(entryWithTempId.temporaryId) tbrRecords.remove(entryWithTempId) @@ -671,20 +671,21 @@ class MedtronicHistoryData @Inject constructor( if (tbrEntry != null) { + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithPumpId [date=${tempBasalProcessDTO.atechDateTime}, " + + "pumpId=${tempBasalProcessDTO.pumpId}, rate=${tbrEntry.insulinRate} U, " + + "duration=${tempBasalProcessDTO.durationAsSeconds} s, pumpSerial=${medtronicPumpStatus.serialNumber}]") + val result = pumpSync.syncTemporaryBasalWithPumpId( tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), tbrEntry.insulinRate, - tempBasalProcessDTO.duration * 60L * 1000L, + tempBasalProcessDTO.durationAsSeconds * 1000L, !tbrEntry.isPercent, PumpSync.TemporaryBasalType.NORMAL, tempBasalProcessDTO.pumpId, medtronicPumpStatus.pumpType, medtronicPumpStatus.serialNumber) - aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "syncTemporaryBasalWithPumpId [date=%d, pumpId=%d, rate=%.2f %s, duration=%d, pumpSerial=%s] - Result: %b", - tempBasalProcessDTO.atechDateTime, tempBasalProcessDTO.pumpId, - tbrEntry.insulinRate, (if (tbrEntry.isPercent) "%" else "U"), tempBasalProcessDTO.duration, - medtronicPumpStatus.serialNumber, result)) + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithPumpId - Result: $result") if (medtronicPumpStatus.runningTBR != null) { if (!isTBRActive(medtronicPumpStatus.runningTBR!!)) { @@ -692,14 +693,18 @@ class MedtronicHistoryData @Inject constructor( } } - if (isTBRActive(tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), tempBasalProcessDTO.duration)) { + if (isTBRActive(startTimestamp = tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), + durationSeconds = tempBasalProcessDTO.durationAsSeconds)) { if (medtronicPumpStatus.runningTBR == null) { medtronicPumpStatus.runningTBR = info.nightscout.androidaps.plugins.pump.common.sync.PumpDbEntry(0L, tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), medtronicPumpStatus.pumpType, medtronicPumpStatus.serialNumber, null, - info.nightscout.androidaps.plugins.pump.common.sync.PumpDbEntryTBR(tbrEntry.insulinRate, !tbrEntry.isPercent, tempBasalProcessDTO.duration, PumpSync.TemporaryBasalType.NORMAL), + PumpDbEntryTBR(rate = tbrEntry.insulinRate, + isAbsolute = !tbrEntry.isPercent, + durationInSeconds = tempBasalProcessDTO.durationAsSeconds, + tbrType = PumpSync.TemporaryBasalType.NORMAL), tempBasalProcessDTO.pumpId) } } @@ -711,12 +716,14 @@ class MedtronicHistoryData @Inject constructor( } // collection } - fun isTBRActive(dbEntry: info.nightscout.androidaps.plugins.pump.common.sync.PumpDbEntry): Boolean { - return isTBRActive(dbEntry.date, dbEntry.tbrData!!.durationInMinutes) + fun isTBRActive(dbEntry: PumpDbEntry): Boolean { + return isTBRActive( + startTimestamp = dbEntry.date, + durationSeconds = dbEntry.tbrData!!.durationInSeconds) } - fun isTBRActive(startTimestamp: Long, durationMin: Int): Boolean { - val endDate = startTimestamp + (durationMin * 60 * 1000) + fun isTBRActive(startTimestamp: Long, durationSeconds: Int): Boolean { + val endDate = startTimestamp + (durationSeconds * 1000) return (endDate > System.currentTimeMillis()) } @@ -794,20 +801,22 @@ class MedtronicHistoryData @Inject constructor( private fun processSuspends(tempBasalProcessList: List) { for (tempBasalProcess in tempBasalProcessList) { + aapsLogger.debug(LTag.PUMP, "processSuspends::syncTemporaryBasalWithPumpId [date=${tempBasalProcess.itemOne.atechDateTime}, " + + "rate=0.0, duration=${tempBasalProcess.durationAsSeconds} s, type=${PumpSync.TemporaryBasalType.PUMP_SUSPEND}, " + + "pumpId=${tempBasalProcess.itemOne.pumpId}, " + + "pumpSerial=${medtronicPumpStatus.serialNumber}]") + val result = pumpSync.syncTemporaryBasalWithPumpId( tryToGetByLocalTime(tempBasalProcess.itemOne.atechDateTime), 0.0, - tempBasalProcess.duration * 60 * 1000L, + tempBasalProcess.durationAsSeconds * 1000L, true, PumpSync.TemporaryBasalType.PUMP_SUSPEND, tempBasalProcess.itemOne.pumpId, medtronicPumpStatus.pumpType, medtronicPumpStatus.serialNumber) - aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "processSuspends::syncTemporaryBasalWithPumpId [date=%d, rate=%.2f, duration=%d, pumpId=%d, pumpSerial=%s] - Result: %b", - tempBasalProcess.itemOne.atechDateTime, 0.0, tempBasalProcess.duration, tempBasalProcess.itemOne.pumpId, - medtronicPumpStatus.serialNumber, result)) - + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithPumpId: Result: $result") } } diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.kt index 04a7983e3c..b121049063 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.kt @@ -26,20 +26,20 @@ class TempBasalProcessDTO constructor(var itemOne: PumpHistoryEntry, val pumpId: Long get() = itemOne.pumpId - val duration: Int + val durationAsSeconds: Int get() = if (itemTwo == null) { if (itemOneTbr != null) { - aapsLogger.debug("TemporaryBasalPair: $itemOneTbr") - itemOneTbr!!.durationMinutes + aapsLogger.debug("TemporaryBasalPair - itemOneSingle: $itemOneTbr") + itemOneTbr!!.durationMinutes * 60 } else { aapsLogger.error("Couldn't find TempBasalPair in entry: $itemOne") 0 } } else { aapsLogger.debug(LTag.PUMP, "Found 2 items for duration: itemOne=$itemOne, itemTwo=$itemTwo") - val minuteDiff = DateTimeUtil.getATechDateDiferenceAsMinutes(itemOne.atechDateTime, itemTwo!!.atechDateTime) - aapsLogger.debug(LTag.PUMP, "Difference in minutes: $minuteDiff") - minuteDiff + val secondsDiff = DateTimeUtil.getATechDateDiferenceAsSeconds(itemOne.atechDateTime, itemTwo!!.atechDateTime) + aapsLogger.debug(LTag.PUMP, "Difference in seconds: $secondsDiff") + secondsDiff } init { @@ -47,10 +47,12 @@ class TempBasalProcessDTO constructor(var itemOne: PumpHistoryEntry, } override fun toString(): String { - return "ItemOne: $itemOne, ItemTwo: $itemTwo, Duration: $duration, Operation: $processOperation" + return "ItemOne: $itemOne, ItemTwo: $itemTwo, Duration: $durationAsSeconds, Operation: $processOperation" } enum class Operation { - None, Add, Edit + None, + Add, + Edit } } \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpDbEntry.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpDbEntry.kt index e1b734b048..918fc9d3ee 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpDbEntry.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpDbEntry.kt @@ -59,5 +59,5 @@ data class PumpDbEntryCarbs(var date: Long, data class PumpDbEntryTBR(var rate: Double, var isAbsolute: Boolean, - var durationInMinutes: Int, + var durationInSeconds: Int, var tbrType: PumpSync.TemporaryBasalType) \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpSyncStorage.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpSyncStorage.kt index 874843015b..5ddddb052b 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpSyncStorage.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/sync/PumpSyncStorage.kt @@ -129,7 +129,7 @@ class PumpSyncStorage @Inject constructor( val response = pumpSync.addTemporaryBasalWithTempId( timenow, temporaryBasal.rate, - (temporaryBasal.durationInMinutes * 60L * 1000L), + (temporaryBasal.durationInSeconds * 1000L), temporaryBasal.isAbsolute, temporaryId, temporaryBasal.tbrType,