diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt index ff422babd4..deb2d9e7e8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt @@ -8,8 +8,8 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference import dagger.android.HasAndroidInjector import info.nightscout.androidaps.BuildConfig -import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.R +import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.PluginBase import info.nightscout.androidaps.interfaces.PluginDescription import info.nightscout.androidaps.interfaces.PluginType @@ -37,16 +37,17 @@ class MaintenancePlugin @Inject constructor( private val config: Config, private val fileListProvider: PrefFileListProvider, private val loggerUtils: LoggerUtils -) : PluginBase(PluginDescription() - .mainType(PluginType.GENERAL) - .fragmentClass(MaintenanceFragment::class.java.name) - .alwaysVisible(false) - .alwaysEnabled(true) - .pluginIcon(R.drawable.ic_maintenance) - .pluginName(R.string.maintenance) - .shortName(R.string.maintenance_shortname) - .preferencesId(R.xml.pref_maintenance) - .description(R.string.description_maintenance), +) : PluginBase( + PluginDescription() + .mainType(PluginType.GENERAL) + .fragmentClass(MaintenanceFragment::class.java.name) + .alwaysVisible(false) + .alwaysEnabled(true) + .pluginIcon(R.drawable.ic_maintenance) + .pluginName(R.string.maintenance) + .shortName(R.string.maintenance_shortname) + .preferencesId(R.xml.pref_maintenance) + .description(R.string.description_maintenance), aapsLogger, resourceHelper, injector ) { @@ -58,7 +59,8 @@ class MaintenancePlugin @Inject constructor( val zipFile = File(zipDir, constructName()) aapsLogger.debug("zipFile: ${zipFile.absolutePath}") val zip = zipLogs(zipFile, logs) - val attachmentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", zip) + val attachmentUri = + FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", zip) val emailIntent: Intent = this.sendMail(attachmentUri, recipient, "Log Export") aapsLogger.debug("sending emailIntent") context.startActivity(emailIntent) @@ -193,7 +195,12 @@ class MaintenancePlugin @Inject constructor( * * @return */ - private fun sendMail(attachmentUri: Uri, recipient: String, subject: String, body: String): Intent { + private fun sendMail( + attachmentUri: Uri, + recipient: String, + subject: String, + body: String + ): Intent { aapsLogger.debug("sending email to $recipient with subject $subject") val emailIntent = Intent(Intent.ACTION_SEND) emailIntent.type = "text/plain" @@ -208,8 +215,9 @@ class MaintenancePlugin @Inject constructor( override fun preprocessPreferences(preferenceFragment: PreferenceFragmentCompat) { super.preprocessPreferences(preferenceFragment) - val encryptSwitch = preferenceFragment.findPreference(resourceHelper.gs(R.string.key_maintenance_encrypt_exported_prefs)) as SwitchPreference? - ?: return + val encryptSwitch = + preferenceFragment.findPreference(resourceHelper.gs(R.string.key_maintenance_encrypt_exported_prefs)) as SwitchPreference? + ?: return encryptSwitch.isVisible = buildHelper.isEngineeringMode() encryptSwitch.isEnabled = buildHelper.isEngineeringMode() } 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 5c8fa3750f..e558a22f88 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 @@ -348,7 +349,7 @@ class MedtronicHistoryData @Inject constructor( aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: TBRs Processed [count=%d, items=%s]", tbrs.size, gson.toJson(tbrs))) if (tbrs.isNotEmpty()) { try { - processTBREntries(tbrs) // TODO not implemented yet + processTBREntries(tbrs) } catch (ex: Exception) { aapsLogger.error(LTag.PUMP, "ProcessHistoryData: Error processing TBR entries: " + ex.message, ex) throw ex @@ -604,7 +605,8 @@ class MedtronicHistoryData @Inject constructor( processDTO = TempBasalProcessDTO( itemOne = treatment, processOperation = TempBasalProcessDTO.Operation.Add, - aapsLogger = aapsLogger + aapsLogger = aapsLogger, + objectType = TempBasalProcessDTO.ObjectType.TemporaryBasal ) } } @@ -615,97 +617,114 @@ class MedtronicHistoryData @Inject constructor( for (tempBasalProcessDTO in processList) { aapsLogger.debug(LTag.PUMP, "DD: tempBasalProcessDTO.itemOne: " + gson.toJson(tempBasalProcessDTO.itemOne)) + aapsLogger.debug(LTag.PUMP, "DD: tempBasalProcessDTO.itemTwo: " + (if (tempBasalProcessDTO.itemTwo == null) "null" else gson.toJson(tempBasalProcessDTO.itemTwo!!))) val entryWithTempId = findDbEntry(tempBasalProcessDTO.itemOne, tbrRecords) aapsLogger.debug(LTag.PUMP, "DD: entryWithTempId: " + (if (entryWithTempId == null) "null" else entryWithTempId.toString())) - val tbrEntry = tempBasalProcessDTO.itemOne.getDecodedDataEntry("Object") as TempBasalPair + val tbrEntry = tempBasalProcessDTO.itemOneTbr //.getDecodedDataEntry("Object") as TempBasalPair aapsLogger.debug(LTag.PUMP, String.format("DD: tbrEntry=%s, tempBasalProcessDTO=%s", gson.toJson(tbrEntry), gson.toJson(tempBasalProcessDTO))) if (entryWithTempId != 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)) + if (tbrEntry != null) { + aapsLogger.debug(LTag.PUMP, "DD: tempIdEntry=${entryWithTempId}, tbrEntry=${tbrEntry}, " + + "tempBasalProcessDTO=${tempBasalProcessDTO}, " + + "pumpType=${medtronicPumpStatus.pumpType}, serial=${medtronicPumpStatus.serialNumber}") - aapsLogger.debug(LTag.PUMP, "BEFORE syncTemporaryBasalWithTempId " + - "[date=${tempBasalProcessDTO.atechDateTime}, dateProcess=${tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime)}, " + - "tbrEntry.insulinRate=${tbrEntry.insulinRate}, duration=${tempBasalProcessDTO.duration * 60L * 1000L}, " + - "isAbsolute=${!tbrEntry.isPercent}, temporaryId=${entryWithTempId.temporaryId}, " + - "pumpId=${tempBasalProcessDTO.pumpId}, pumpType=${medtronicPumpStatus.pumpType}, " + - "pumpSerial=${medtronicPumpStatus.serialNumber}]") + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithTempId " + + "[date=${tempBasalProcessDTO.atechDateTime}, dateProcess=${tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime)}, " + + "tbrEntry.insulinRate=${tbrEntry.insulinRate}, " + + "duration=${tempBasalProcessDTO.durationAsSeconds} s, " + + "isAbsolute=${!tbrEntry.isPercent}, temporaryId=${entryWithTempId.temporaryId}, " + + "pumpId=${tempBasalProcessDTO.pumpId}, pumpType=${medtronicPumpStatus.pumpType}, " + + "pumpSerial=${medtronicPumpStatus.serialNumber}]") - val result = pumpSync.syncTemporaryBasalWithTempId( - tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), - tbrEntry.insulinRate, - tempBasalProcessDTO.duration * 60L * 1000L, - !tbrEntry.isPercent, - entryWithTempId.temporaryId, - PumpSync.TemporaryBasalType.NORMAL, - tempBasalProcessDTO.pumpId, - medtronicPumpStatus.pumpType, - medtronicPumpStatus.serialNumber) + val result = pumpSync.syncTemporaryBasalWithTempId( + tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), + tbrEntry.insulinRate, + tempBasalProcessDTO.durationAsSeconds * 1000L, + !tbrEntry.isPercent, + entryWithTempId.temporaryId, + PumpSync.TemporaryBasalType.NORMAL, + tempBasalProcessDTO.pumpId, + 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) + pumpSyncStorage.removeTemporaryBasalWithTemporaryId(entryWithTempId.temporaryId) + tbrRecords.remove(entryWithTempId) - entryWithTempId.pumpId = tempBasalProcessDTO.pumpId - entryWithTempId.date = tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime) + entryWithTempId.pumpId = tempBasalProcessDTO.pumpId + entryWithTempId.date = tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime) - if (isTBRActive(entryWithTempId)) { - medtronicPumpStatus.runningTBR = entryWithTempId + if (isTBRActive(entryWithTempId)) { + medtronicPumpStatus.runningTBR = entryWithTempId + } + } else { + aapsLogger.warn(LTag.PUMP, "tbrEntry (itemOne) is null, shouldn't be.") } } else { - val result = pumpSync.syncTemporaryBasalWithPumpId( - tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), - tbrEntry.insulinRate, - tempBasalProcessDTO.duration * 60L * 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)) + if (tbrEntry != null) { - if (medtronicPumpStatus.runningTBR != null) { - if (!isTBRActive(medtronicPumpStatus.runningTBR!!)) { - medtronicPumpStatus.runningTBR = 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.durationAsSeconds * 1000L, + !tbrEntry.isPercent, + PumpSync.TemporaryBasalType.NORMAL, + tempBasalProcessDTO.pumpId, + medtronicPumpStatus.pumpType, + medtronicPumpStatus.serialNumber) + + aapsLogger.debug(LTag.PUMP, "syncTemporaryBasalWithPumpId - Result: $result") + + if (medtronicPumpStatus.runningTBR != null) { + if (!isTBRActive(medtronicPumpStatus.runningTBR!!)) { + medtronicPumpStatus.runningTBR = null + } } - } - if (isTBRActive(tryToGetByLocalTime(tempBasalProcessDTO.atechDateTime), tempBasalProcessDTO.duration)) { - 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), - tempBasalProcessDTO.pumpId) + 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, + PumpDbEntryTBR(rate = tbrEntry.insulinRate, + isAbsolute = !tbrEntry.isPercent, + durationInSeconds = tempBasalProcessDTO.durationAsSeconds, + tbrType = PumpSync.TemporaryBasalType.NORMAL), + tempBasalProcessDTO.pumpId) + } } + } else { + aapsLogger.warn(LTag.PUMP, "tbrEntry (itemOne) is null, shouldn't be.") } } } // for } // 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()) } @@ -783,20 +802,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") } } @@ -815,6 +836,9 @@ class MedtronicHistoryData @Inject constructor( private fun getSuspendResumeRecordsList(): List { val filteredItems = getFilteredItems(newHistory, // setOf(PumpHistoryEntryType.SuspendPump, PumpHistoryEntryType.ResumePump)) + + aapsLogger.debug(LTag.PUMP, "SuspendResume Records: $filteredItems") + val outList: MutableList = mutableListOf() if (filteredItems.size > 0) { val filtered2Items: MutableList = mutableListOf() @@ -852,11 +876,16 @@ class MedtronicHistoryData @Inject constructor( Collections.reverse(filtered2Items) var i = 0 while (i < filtered2Items.size) { - outList.add(TempBasalProcessDTO( + val tbrProcess = TempBasalProcessDTO( itemOne = filtered2Items[i], - itemTwo = filtered2Items[i + 1], processOperation = TempBasalProcessDTO.Operation.Add, - aapsLogger = aapsLogger)) + aapsLogger = aapsLogger, + objectType = TempBasalProcessDTO.ObjectType.Suspend) + + tbrProcess.itemTwo = filtered2Items[i + 1] + + if (tbrProcess.itemTwo != null) + outList.add(tbrProcess) i += 2 } @@ -868,6 +897,9 @@ class MedtronicHistoryData @Inject constructor( private fun getNoDeliveryRewindPrimeRecordsList(): List { val primeItems: MutableList = getFilteredItems(newHistory, // setOf(PumpHistoryEntryType.Prime)) + + aapsLogger.debug(LTag.PUMP, "Prime Records: $primeItems") + val outList: MutableList = ArrayList() if (primeItems.size == 0) return outList val filteredItems: MutableList = getFilteredItems(newHistory, // @@ -877,6 +909,9 @@ class MedtronicHistoryData @Inject constructor( PumpHistoryEntryType.Bolus, PumpHistoryEntryType.TempBasalCombined) ) + + aapsLogger.debug(LTag.PUMP, "Filtered Records: $filteredItems") + val tempData: MutableList = mutableListOf() var startedItems = false var finishedItems = false @@ -915,24 +950,40 @@ class MedtronicHistoryData @Inject constructor( } showLogs("NoDeliveryRewindPrimeRecords: Records to evaluate: ", gson.toJson(tempData)) var items: MutableList = getFilteredItems(tempData, PumpHistoryEntryType.Prime) - var itemTwo = items[0] + val itemTwo = items[0] + items = getFilteredItems(tempData, PumpHistoryEntryType.NoDeliveryAlarm) if (items.size > 0) { - outList.add(TempBasalProcessDTO( + val tbrProcess = TempBasalProcessDTO( itemOne = items[items.size - 1], - itemTwo = itemTwo, processOperation = TempBasalProcessDTO.Operation.Add, - aapsLogger = aapsLogger)) + aapsLogger = aapsLogger, + objectType = TempBasalProcessDTO.ObjectType.Suspend) + + tbrProcess.itemTwo = itemTwo + + if (tbrProcess.itemTwo != null) + outList.add(tbrProcess) + return outList } + items = getFilteredItems(tempData, PumpHistoryEntryType.Rewind) if (items.size > 0) { - outList.add(TempBasalProcessDTO( + val tbrProcess = TempBasalProcessDTO( itemOne = items[0], processOperation = TempBasalProcessDTO.Operation.Add, - aapsLogger = aapsLogger)) + aapsLogger = aapsLogger, + objectType = TempBasalProcessDTO.ObjectType.Suspend) + + tbrProcess.itemTwo = itemTwo + + if (tbrProcess.itemTwo != null) + outList.add(tbrProcess) + return outList } + return outList } 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 9cbb0b6dbc..a0ce5241de 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 @@ -1,13 +1,25 @@ package info.nightscout.androidaps.plugins.pump.medtronic.data.dto import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry class TempBasalProcessDTO constructor(var itemOne: PumpHistoryEntry, - var itemTwo: PumpHistoryEntry? = null, var processOperation: Operation = Operation.None, - var aapsLogger: AAPSLogger) { + var aapsLogger: AAPSLogger, + var objectType: ObjectType = ObjectType.TemporaryBasal) { + + var itemTwo: PumpHistoryEntry? = null + set(value) { + field = value + if (objectType == ObjectType.TemporaryBasal) { + itemTwoTbr = value!!.getDecodedDataEntry("Object") as TempBasalPair + } + } + + var itemOneTbr: TempBasalPair? = null + var itemTwoTbr: TempBasalPair? = null var cancelPresent: Boolean = false @@ -17,20 +29,50 @@ class TempBasalProcessDTO constructor(var itemOne: PumpHistoryEntry, val pumpId: Long get() = itemOne.pumpId - val duration: Int - get() = if (itemTwo == null) { - val tbr = itemOne.getDecodedDataEntry("Object") as? TempBasalPair - if (tbr != null) - tbr.durationMinutes - else { - aapsLogger.error("Couldn't find TempBasalPair in entry: $itemOne") - 0 + val durationAsSeconds: Int + get() { + aapsLogger.debug(LTag.PUMP, "durationAsSeconds: [objectType=$objectType]") + if (objectType == ObjectType.TemporaryBasal) { + if (itemTwo == null) { + if (itemOneTbr != null) { + aapsLogger.debug("TemporaryBasalPair - itemOneSingle: $itemOneTbr") + return itemOneTbr!!.durationMinutes * 60 + } else { + aapsLogger.error("Couldn't find TempBasalPair in entry: $itemOne") + return 0 + } + } else { + aapsLogger.debug(LTag.PUMP, "Found 2 items for duration: itemOne=$itemOne, itemTwo=$itemTwo") + val secondsDiff = DateTimeUtil.getATechDateDiferenceAsSeconds(itemOne.atechDateTime, itemTwo!!.atechDateTime) + aapsLogger.debug(LTag.PUMP, "Difference in seconds: $secondsDiff") + return secondsDiff + } + } else { + aapsLogger.debug(LTag.PUMP, "Found 2 items for duration (in SuspendMode): itemOne=$itemOne, itemTwo=$itemTwo") + val secondsDiff = DateTimeUtil.getATechDateDiferenceAsSeconds(itemOne.atechDateTime, itemTwo!!.atechDateTime) + aapsLogger.debug(LTag.PUMP, "Difference in seconds: $secondsDiff") + return secondsDiff } - } else { - DateTimeUtil.getATechDateDiferenceAsMinutes(itemOne.atechDateTime, itemTwo!!.atechDateTime) } + init { + if (objectType == ObjectType.TemporaryBasal) { + itemOneTbr = itemOne.getDecodedDataEntry("Object") as TempBasalPair + } + } + + override fun toString(): String { + return "ItemOne: $itemOne, ItemTwo: $itemTwo, Duration: $durationAsSeconds, Operation: $processOperation, ObjectType: $objectType" + } + enum class Operation { - None, Add, Edit + None, + Add, + Edit + } + + enum class ObjectType { + TemporaryBasal, + Suspend, } } \ 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..dd4a55dced 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 @@ -22,7 +22,7 @@ class PumpSyncStorage @Inject constructor( val aapsLogger: AAPSLogger ) { - val pumpSyncStorageKey: String = "pump_sync_storage_xstream" + val pumpSyncStorageKey: String = "pump_sync_storage_xstream_v2" var pumpSyncStorage: MutableMap> = mutableMapOf() var TBR: String = "TBR" var BOLUS: String = "BOLUS" @@ -32,6 +32,7 @@ class PumpSyncStorage @Inject constructor( init { initStorage() + cleanOldStorage(); } fun initStorage() { @@ -66,6 +67,15 @@ class PumpSyncStorage @Inject constructor( } } + fun cleanOldStorage(): Unit { + val oldSpKeys = setOf("pump_sync_storage", "pump_sync_storage_xstream") + + for (oldSpKey in oldSpKeys) { + if (sp.contains(oldSpKey)) + sp.remove(oldSpKey) + } + } + fun isStorageEmpty(): Boolean { return pumpSyncStorage[BOLUS]!!.isEmpty() && pumpSyncStorage[TBR]!!.isEmpty() } @@ -129,7 +139,7 @@ class PumpSyncStorage @Inject constructor( val response = pumpSync.addTemporaryBasalWithTempId( timenow, temporaryBasal.rate, - (temporaryBasal.durationInMinutes * 60L * 1000L), + (temporaryBasal.durationInSeconds * 1000L), temporaryBasal.isAbsolute, temporaryId, temporaryBasal.tbrType,