- added bolus handling (complete)

- added PumpSyncStorage class for handling temporary data
This commit is contained in:
Andy Rozman 2021-04-30 15:28:24 +01:00
parent 727862c743
commit 6504498cd2
16 changed files with 515 additions and 149 deletions

View file

@ -21,6 +21,7 @@ import info.nightscout.androidaps.plugins.general.nsclient.UploadQueue
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.plugins.pump.PumpSyncImplementation
import info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncStorage
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.queue.CommandQueue
import info.nightscout.androidaps.utils.androidNotification.NotificationHolderImpl
@ -72,6 +73,16 @@ open class AppModule {
rxBus: RxBusWrapper
): UploadQueueAdminInterface = UploadQueue(aapsLogger, databaseHelper, context, sp, rxBus)
@Provides
@Singleton
fun providesPumpSyncStorage(
pumpSync: PumpSync,
sp: SP,
aapsLogger: AAPSLogger
): PumpSyncStorage {
return PumpSyncStorage(pumpSync, sp, aapsLogger)
}
@Module
interface AppBindings {
@Binds fun bindContext(mainApp: MainApp): Context

View file

@ -0,0 +1,32 @@
package info.nightscout.androidaps.plugins.pump.common.sync
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
data class PumpDbEntry constructor(var temporaryId: Long,
var date: Long,
var pumpType: PumpType,
var serialNumber: String,
var bolusData: PumpDbEntryBolus? = null,
var tbrData: PumpDbEntryTBR? = null ) {
constructor(temporaryId: Long,
date: Long,
pumpType: PumpType,
serialNumber: String,
detailedBolusInfo: DetailedBolusInfo) : this(temporaryId, date, pumpType, serialNumber) {
this.bolusData = PumpDbEntryBolus(
detailedBolusInfo.insulin,
detailedBolusInfo.carbs,
detailedBolusInfo.bolusType)
}
}
data class PumpDbEntryBolus(var insulin: Double,
var carbs: Double,
var bolusType: DetailedBolusInfo.BolusType)
data class PumpDbEntryTBR(var temporaryId: Long)

View file

@ -0,0 +1,13 @@
package info.nightscout.androidaps.plugins.pump.common.sync;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
public interface PumpSyncEntriesCreator {
long generateTempId(Object dataObject);
PumpType model();
String serialNumber();
}

View file

@ -0,0 +1,154 @@
package info.nightscout.androidaps.plugins.pump.common.sync
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.db.TemporaryBasal
import info.nightscout.androidaps.interfaces.PumpSync
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.utils.sharedPreferences.SP
import java.lang.reflect.Type
import javax.inject.Inject
import javax.inject.Singleton
/**
* This class is intended for Pump Drivers that use temporaryId and need way to pair records
*/
@Singleton
class PumpSyncStorage @Inject constructor(
val pumpSync: PumpSync,
val sp: SP,
val aapsLogger: AAPSLogger
) {
val pumpSyncStorageKey: String = "pump_sync_storage"
var pumpSyncStorage: MutableMap<String,MutableList<PumpDbEntry>> = mutableMapOf()
var TBR: String = "TBR"
var BOLUS: String = "BOLUS"
var storageInitialized: Boolean = false
var gson: Gson = GsonBuilder().create()
init {
initStorage()
}
fun initStorage() {
if (storageInitialized)
return
var loaded = false
if (sp.contains(pumpSyncStorageKey)) {
val jsonData: String = sp.getString("pump_sync_storage", "");
if (!jsonData.isBlank()) {
val pumpSyncStorageType: Type = object : TypeToken<MutableMap<String, MutableList<PumpDbEntry>>>() {}.getType()
val baseMap: MutableMap<String, MutableList<PumpDbEntry>> = gson.fromJson(jsonData, pumpSyncStorageType) //as MutableMap<String, MutableList<PumpDbEntry>>
pumpSyncStorage = baseMap
aapsLogger.debug(String.format("Loading Pump Sync Storage: boluses=%d, tbrs=%d.", pumpSyncStorage[BOLUS]!!.size, pumpSyncStorage[TBR]!!.size))
loaded = true
}
}
if (!loaded) {
pumpSyncStorage[BOLUS] = mutableListOf()
pumpSyncStorage[TBR] = mutableListOf()
}
}
fun saveStorage() {
if (!isStorageEmpty()) {
sp.putString(pumpSyncStorageKey, gson.toJson(pumpSyncStorage))
aapsLogger.debug(String.format("Saving Pump Sync Storage: boluses=%d, tbrs=%d.", pumpSyncStorage[BOLUS]!!.size, pumpSyncStorage[TBR]!!.size))
}
}
fun isStorageEmpty() : Boolean {
return pumpSyncStorage[BOLUS]!!.isEmpty() && pumpSyncStorage[TBR]!!.isEmpty()
}
fun getBoluses() : MutableList<PumpDbEntry> {
return pumpSyncStorage[BOLUS]!!;
}
fun getTBRs() : MutableList<PumpDbEntry> {
return pumpSyncStorage[TBR]!!;
}
//abstract fun generateTempId(timeMillis: Long): Long
fun addBolusWithTempId(detailedBolusInfo: DetailedBolusInfo, writeToInternalHistory: Boolean, creator: PumpSyncEntriesCreator): Boolean {
val temporaryId = creator.generateTempId(detailedBolusInfo.timestamp)
val response = pumpSync.addBolusWithTempId(
detailedBolusInfo.timestamp,
detailedBolusInfo.insulin,
temporaryId,
detailedBolusInfo.bolusType,
creator.model(),
creator.serialNumber())
if (response && writeToInternalHistory) {
var innerList: MutableList<PumpDbEntry> = pumpSyncStorage[BOLUS]!!
innerList.add(PumpDbEntry(temporaryId, detailedBolusInfo.timestamp, creator.model(), creator.serialNumber(), detailedBolusInfo))
pumpSyncStorage[BOLUS] = innerList
saveStorage()
}
return response
}
// TODO
fun addTemporaryBasalRateWithTempId(temporaryBasal: TemporaryBasal, writeToInternalHistory: Boolean, creator: PumpSyncEntriesCreator) : Boolean {
// val temporaryId = generateTempId(temporaryBasal.date)
// val response = pumpSync.addBolusWithTempId(temporaryBasal.timestamp, detailedBolusInfo.insulin,
// generateTempId(detailedBolusInfo.timestamp), detailedBolusInfo.getBolusType(),
// getPumpType(), serialNumber());
//
// if (response && writeToInternalHistory) {
// driverHistory.put(temporaryId, new PumpDbEntry(temporaryId, model(), serialNumber(), detailedBolusInfo));
// sp.putString(MedtronicConst.Statistics.InternalTemporaryDatabase, gson.toJson(driverHistory));
// }
//
// return response;
return false
}
fun removeBolusWithTemporaryId(temporaryId: Long) {
val bolusList = removeTemporaryId(temporaryId, pumpSyncStorage[BOLUS]!!)
pumpSyncStorage[BOLUS] = bolusList
saveStorage()
}
fun removeTemporaryBasalWithTemporaryId(temporaryId: Long) {
val tbrList = removeTemporaryId(temporaryId, pumpSyncStorage[TBR]!!)
pumpSyncStorage[TBR] = tbrList
saveStorage()
}
private fun removeTemporaryId(temporaryId: Long, list: MutableList<PumpDbEntry>): MutableList<PumpDbEntry> {
var dbEntry: PumpDbEntry? = null
for (pumpDbEntry in list) {
if (pumpDbEntry.temporaryId == temporaryId) {
dbEntry = pumpDbEntry
}
}
if (dbEntry!=null) {
list.remove(dbEntry)
}
return list
}
}

View file

@ -23,7 +23,6 @@ import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.common.ManufacturerType
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress
import info.nightscout.androidaps.plugins.pump.common.data.PumpDbEntry
import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus
import info.nightscout.androidaps.plugins.pump.common.defs.PumpDriverState
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
@ -56,14 +55,14 @@ abstract class PumpPluginAbstract protected constructor(
var sp: SP,
var context: Context,
var fabricPrivacy: FabricPrivacy,
dateUtil: DateUtil,
aapsSchedulers: AapsSchedulers,
pumpSync: PumpSync
var dateUtil: DateUtil,
var aapsSchedulers: AapsSchedulers,
var pumpSync: PumpSync
) : PumpPluginBase(pluginDescription!!, injector!!, aapsLogger, resourceHelper, commandQueue), Pump, Constraints {
private val disposable = CompositeDisposable()
//protected override var injector: HasAndroidInjector? = null
protected var dateUtil: DateUtil
//protected var dateUtil: DateUtil
// Pump capabilities
final override var pumpDescription = PumpDescription()
@ -82,8 +81,8 @@ abstract class PumpPluginAbstract protected constructor(
}
protected var aapsSchedulers: AapsSchedulers
protected var pumpSync: PumpSync
//protected var aapsSchedulers: AapsSchedulers
//protected var pumpSync: PumpSync
protected var gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
abstract fun initPumpStatusData()
@ -344,12 +343,12 @@ abstract class PumpPluginAbstract protected constructor(
// bolus needed, ask pump to deliver it
deliverBolus(detailedBolusInfo)
} else {
// TODO fix
// no bolus required, carb only treatment
activePlugin.activeTreatments.addToHistoryTreatment(detailedBolusInfo, true)
// TODO carb only bolus - DONE
pumpSync.syncCarbsWithTimestamp(System.currentTimeMillis(), detailedBolusInfo.carbs, null, model(), serialNumber());
// activePlugin.activeTreatments.addToHistoryTreatment(detailedBolusInfo, true)
val bolusingEvent = EventOverviewBolusProgress
bolusingEvent.t = EventOverviewBolusProgress.Treatment(0.0, 0, detailedBolusInfo.bolusType === DetailedBolusInfo.BolusType.SMB)
bolusingEvent.t = EventOverviewBolusProgress.Treatment(0.0, detailedBolusInfo.carbs.toInt(), detailedBolusInfo.bolusType === DetailedBolusInfo.BolusType.SMB)
bolusingEvent.percent = 100
rxBus.send(bolusingEvent)
aapsLogger.debug(LTag.PUMP, "deliverTreatment: Carb only treatment.")
@ -386,48 +385,13 @@ abstract class PumpPluginAbstract protected constructor(
return PumpEnactResult(injector).success(false).enacted(false).comment(resourceId)
}
// PumpSync
var driverHistory: MutableMap<Long, PumpDbEntry> = HashMap()
abstract fun generateTempId(timeMillis: Long): Long
protected fun addBolusWithTempId(detailedBolusInfo: DetailedBolusInfo, writeToInternalHistory: Boolean): Boolean {
val temporaryId = generateTempId(detailedBolusInfo.timestamp)
val response = pumpSync.addBolusWithTempId(detailedBolusInfo.timestamp, detailedBolusInfo.insulin,
temporaryId, detailedBolusInfo.bolusType,
pumpType, serialNumber())
if (response && writeToInternalHistory) {
driverHistory[temporaryId] = PumpDbEntry(temporaryId, model(), serialNumber(), detailedBolusInfo)
sp.putString(MedtronicConst.Statistics.InternalTemporaryDatabase, gson.toJson(driverHistory))
}
return response
}
// TODO
protected fun addTemporaryBasalRateWithTempId(temporaryBasal: TemporaryBasal, b: Boolean) {
val temporaryId = generateTempId(temporaryBasal.date)
val response = pumpSync.addBolusWithTempId(temporaryBasal.timestamp, detailedBolusInfo.insulin,
generateTempId(detailedBolusInfo.timestamp), detailedBolusInfo.getBolusType(),
getPumpType(), serialNumber());
if (response && writeToInternalHistory) {
driverHistory.put(temporaryId, new PumpDbEntry(temporaryId, model(), serialNumber(), detailedBolusInfo));
sp.putString(MedtronicConst.Statistics.InternalTemporaryDatabase, gson.toJson(driverHistory));
}
return response;
}
fun removeTemporaryId(temporaryId: Long) {
driverHistory.remove(temporaryId)
}
init {
pumpDescription.setPumpDescription(pumpType)
this.pumpType = pumpType
this.dateUtil = dateUtil
this.aapsSchedulers = aapsSchedulers
this.pumpSync = pumpSync
//this.pumpSync = pumpSync
}
}

View file

@ -1,9 +0,0 @@
package info.nightscout.androidaps.plugins.pump.common.data
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
data class PumpDbEntry(var temporaryId: Long,
var pumpType: PumpType,
var serialNumber: String,
var detailedBolusInfo: DetailedBolusInfo)

View file

@ -34,7 +34,7 @@ abstract class PumpStatus(var pumpType: PumpType) {
var maxDailyTotalUnits: String? = null
var units : String? = null // Constants.MGDL or Constants.MMOL
var pumpStatusType = PumpStatusType.Running
var basalsByHour: Array<Double>? = null
var basalsByHour: DoubleArray? = null
var tempBasalStart: Date? = null
var tempBasalAmount: Double? = 0.0
var tempBasalLength: Int? = 0

View file

@ -37,7 +37,9 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.Riley
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ResetRileyLinkConfigurationTask
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.WakeAndTuneTask
import info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncEntriesCreator
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil
import info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncStorage
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryResult
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData
@ -88,7 +90,8 @@ class MedtronicPumpPlugin @Inject constructor(
private val serviceTaskExecutor: ServiceTaskExecutor,
dateUtil: DateUtil,
aapsSchedulers: AapsSchedulers,
pumpSync: PumpSync
pumpSync: PumpSync,
val pumpSyncStorage: PumpSyncStorage
) : PumpPluginAbstract(PluginDescription() //
.mainType(PluginType.PUMP) //
.fragmentClass(MedtronicFragment::class.java.name) //
@ -99,7 +102,7 @@ class MedtronicPumpPlugin @Inject constructor(
.description(R.string.description_pump_medtronic), //
PumpType.MEDTRONIC_522_722, // we default to most basic model, correct model from config is loaded later
injector, resourceHelper, aapsLogger, commandQueue, rxBus, activePlugin, sp, context, fabricPrivacy, dateUtil, aapsSchedulers, pumpSync
), Pump, RileyLinkPumpDevice {
), Pump, RileyLinkPumpDevice, PumpSyncEntriesCreator {
private var rileyLinkMedtronicService: RileyLinkMedtronicService? = null
@ -167,6 +170,8 @@ class MedtronicPumpPlugin @Inject constructor(
sp.putLong(MedtronicConst.Statistics.FirstPumpStart, System.currentTimeMillis())
}
migrateSettings()
pumpSyncStorage.initStorage();
}
override fun triggerPumpConfigurationChangedEvent() {
@ -482,7 +487,7 @@ class MedtronicPumpPlugin @Inject constructor(
private fun isProfileSame(profile: Profile): Boolean {
var invalid = false
val basalsByHour: Array<Double>? = medtronicPumpStatus.basalsByHour
val basalsByHour: DoubleArray? = medtronicPumpStatus.basalsByHour
aapsLogger.debug(LTag.PUMP, "Current Basals (h): "
+ (basalsByHour?.let { getProfilesByHourToString(it) } ?: "null"))
@ -526,13 +531,12 @@ class MedtronicPumpPlugin @Inject constructor(
rxBus.send(EventMedtronicPumpValuesChanged())
}
override fun generateTempId(timeMillis: Long): Long {
return 0
override fun generateTempId(objectA: Any): Long {
val timestamp: Long = objectA as Long
return DateTimeUtil.toATechDate(timestamp)
}
// @Override public String getSerial() {
// return null;
// }
private var bolusDeliveryType = BolusDeliveryType.Idle
private enum class BolusDeliveryType {
@ -629,12 +633,15 @@ class MedtronicPumpPlugin @Inject constructor(
detailedBolusInfo.timestamp = now
detailedBolusInfo.deliverAtTheLatest = now // not sure about that one
// TODO fix
if (usePumpSync) {
addBolusWithTempId(detailedBolusInfo, true)
} else {
activePlugin.activeTreatments.addToHistoryTreatment(detailedBolusInfo, true)
}
pumpSyncStorage.addBolusWithTempId(detailedBolusInfo, true, this)
// // TODO fix
// if (usePumpSync) {
// pumpSyncStorage.addBolusWithTempId(detailedBolusInfo, true, this)
// } else {
// activePlugin.activeTreatments.addToHistoryTreatment(detailedBolusInfo, true)
// }
// we subtract insulin, exact amount will be visible with next remainingInsulin update.
medtronicPumpStatus.reservoirRemainingUnits = medtronicPumpStatus.reservoirRemainingUnits - detailedBolusInfo.insulin
@ -767,7 +774,7 @@ class MedtronicPumpPlugin @Inject constructor(
// TODO fix
if (usePumpSync) {
addTemporaryBasalRateWithTempId(tempStart, true)
pumpSyncStorage.addTemporaryBasalRateWithTempId(tempStart, true, this)
} else {
activePlugin.activeTreatments.addToHistoryTempBasal(tempStart)
}
@ -834,7 +841,7 @@ class MedtronicPumpPlugin @Inject constructor(
val debugHistory = false
var targetDate: LocalDateTime? = null
if (lastPumpHistoryEntry == null) {
if (lastPumpHistoryEntry == null) { // first read
if (debugHistory) aapsLogger.debug(LTag.PUMP, logPrefix + "readPumpHistoryLogic(): lastPumpHistoryEntry: null")
val lastPumpHistoryEntryTime = lastPumpEntryTime
var timeMinus36h = LocalDateTime()
@ -858,12 +865,9 @@ class MedtronicPumpPlugin @Inject constructor(
targetDate = if (timeMinus36h.isAfter(lastHistoryRecordTime)) timeMinus36h else lastHistoryRecordTime
if (debugHistory) aapsLogger.debug(LTag.PUMP, logPrefix + "readPumpHistoryLogic(): targetDate: " + targetDate)
}
} else {
} else { // all other reads
if (debugHistory) aapsLogger.debug(LTag.PUMP, logPrefix + "readPumpHistoryLogic(): lastPumpHistoryEntry: not null - " + medtronicUtil.gsonInstance.toJson(lastPumpHistoryEntry))
medtronicHistoryData.setIsInInit(false)
// medtronicHistoryData.setLastHistoryRecordTime(lastPumpHistoryEntry.atechDateTime);
// targetDate = lastPumpHistoryEntry.atechDateTime;
}
//aapsLogger.debug(LTag.PUMP, "HST: Target Date: " + targetDate);
@ -883,22 +887,22 @@ class MedtronicPumpPlugin @Inject constructor(
medtronicHistoryData.filterNewEntries()
// determine if first run, if yes detrmine how much of update do we need
// first run:
// get last hiostory entry, if not there download 1.5 days of data
// - there: check if last entry is older than 1.5 days
// - yes: download 1.5 days
// - no: download with last entry
// - not there: download 1.5 days
// - first run:
// - get last history entry
// - if not there download 1.5 days of data
// - there: check if last entry is older than 1.5 days
// - yes: download 1.5 days
// - no: download with last entry TODO 5min
// - not there: download 1.5 days
//
// upload all new entries to NightScout (TBR, Bolus)
// determine pump status
// upload all new entries to NightScout (TBR, Bolus)
// determine pump status
// save last entry
//
// save last entry
//
// not first run:
// update to last entry
// - save
// - determine pump status
// - not first run:
// - update to last entry TODO 5min
// - save
// - determine pump status
}
private val lastPumpEntryTime: Long
@ -1015,7 +1019,7 @@ class MedtronicPumpPlugin @Inject constructor(
// TODO fix
if (usePumpSync) {
addTemporaryBasalRateWithTempId(tempBasal, true)
pumpSyncStorage.addTemporaryBasalRateWithTempId(tempBasal, true, this)
} else {
activePlugin.activeTreatments.addToHistoryTempBasal(tempBasal)
}

View file

@ -551,10 +551,13 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
errorResponse = check
}
var basalProfile: BasalProfile? = null
checkResponseRawContent(data, commandType) {
basalProfile = medtronicConverter.decodeBasalProfile(medtronicPumpPlugin.pumpDescription.pumpType, data)
}
aapsLogger.debug(LTag.PUMPCOMM,"End Response: {}", ByteUtil.getHex(data))
var basalProfile: BasalProfile? = medtronicConverter.decodeBasalProfile(medtronicPumpPlugin.pumpDescription.pumpType, data)
// checkResponseRawContent(data, commandType) {
// basalProfile = medtronicConverter.decodeBasalProfile(medtronicPumpPlugin.pumpDescription.pumpType, data)
// }
if (basalProfile != null) {
aapsLogger.debug(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Converted response for %s is %s.", commandType.name, basalProfile))

View file

@ -47,7 +47,7 @@ enum class PumpHistoryEntryType // implements CodeEnum
BolusWizardEnabled(0x2d, "Bolus Wizard Enabled", PumpHistoryEntryGroup.Configuration), // V3 ?
/* TODO */ EventUnknown_MM512_0x2e(0x2e, "Unknown Event 0x2e", PumpHistoryEntryGroup.Unknown, 2, 5, 100), //
BolusWizard512(0x2f, "Bolus Wizard (512)", PumpHistoryEntryGroup.Bolus, 2, 5, 12), //
UnabsorbedInsulin512(0x30, "Unabsorbed Insulin (512)", PumpHistoryEntryGroup.Statistic, 5, 0, 0), // FIXME
UnabsorbedInsulin512(0x30, "Unabsorbed Insulin (512)", PumpHistoryEntryGroup.Statistic, 5, 0, 0),
ChangeBGReminderOffset(0x31, "Change BG Reminder Offset", PumpHistoryEntryGroup.Configuration), //
ChangeAlarmClockTime(0x32, "Change Alarm Clock Time", PumpHistoryEntryGroup.Configuration), //
TempBasalRate(0x33, "TBR Rate", PumpHistoryEntryGroup.Basal, 2, 5, 1), //

View file

@ -51,8 +51,10 @@ class PumpHistoryResult(private val aapsLogger: AAPSLogger, searchEntry: PumpHis
}
//aapsLogger.debug(LTag.PUMPCOMM,"PE. Entry {} added.", unprocessedEntry);
validEntries.add(unprocessedEntry)
}
// TODO 5minutes back
}
SearchType.Date -> {

View file

@ -11,6 +11,8 @@ import info.nightscout.androidaps.interfaces.PumpSync
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.PumpSyncStorage
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
@ -27,7 +29,6 @@ import info.nightscout.androidaps.utils.Round
import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.apache.commons.lang3.StringUtils
import org.joda.time.LocalDateTime
import org.joda.time.Minutes
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
@ -51,7 +52,8 @@ class MedtronicHistoryData @Inject constructor(
val medtronicPumpHistoryDecoder: MedtronicPumpHistoryDecoder,
val medtronicPumpStatus: MedtronicPumpStatus,
val databaseHelper: DatabaseHelperInterface,
val pumpSync: PumpSync
val pumpSync: PumpSync,
val pumpSyncStorage: PumpSyncStorage
) {
val allHistory: MutableList<PumpHistoryEntry> = mutableListOf()
@ -304,7 +306,7 @@ class MedtronicHistoryData @Inject constructor(
// TDD
val tdds: MutableList<PumpHistoryEntry> = getFilteredItems(setOf(PumpHistoryEntryType.EndResultTotals, tDDType))
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: TDD [count=%d, items=%s]", tdds.size, gson.toJson(tdds)))
if (isCollectionNotEmpty(tdds)) {
if (tdds.isNotEmpty()) {
try {
processTDDs(tdds)
} catch (ex: Exception) {
@ -317,7 +319,7 @@ class MedtronicHistoryData @Inject constructor(
// Bolus
val treatments = getFilteredItems(PumpHistoryEntryType.Bolus)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: Bolus [count=%d, items=%s]", treatments.size, gson.toJson(treatments)))
if (treatments.size > 0) {
if (treatments.isNotEmpty()) {
try {
processBolusEntries(treatments)
} catch (ex: Exception) {
@ -329,9 +331,9 @@ class MedtronicHistoryData @Inject constructor(
// TBR
val tbrs: MutableList<PumpHistoryEntry> = getFilteredItems(PumpHistoryEntryType.TempBasalCombined)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: TBRs Processed [count=%d, items=%s]", tbrs.size, gson.toJson(tbrs)))
if (tbrs.size > 0) {
if (tbrs.isNotEmpty()) {
try {
processTBREntries(tbrs)
processTBREntries(tbrs) // TODO not implemented yet
} catch (ex: Exception) {
aapsLogger.error(LTag.PUMP, "ProcessHistoryData: Error processing TBR entries: " + ex.message, ex)
throw ex
@ -348,9 +350,9 @@ class MedtronicHistoryData @Inject constructor(
}
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: 'Delivery Suspend' Processed [count=%d, items=%s]", suspends.size,
gson.toJson(suspends)))
if (isCollectionNotEmpty(suspends)) {
if (suspends.isNotEmpty()) {
try {
processSuspends(suspends)
processSuspends(suspends) // TODO not tested yet
} catch (ex: Exception) {
aapsLogger.error(LTag.PUMP, "ProcessHistoryData: Error processing Suspends entries: " + ex.message, ex)
throw ex
@ -410,13 +412,11 @@ class MedtronicHistoryData @Inject constructor(
private fun processTDDs(tddsIn: MutableList<PumpHistoryEntry>) {
val tdds = filterTDDs(tddsIn)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, """
${logPrefix}TDDs found: %d.
%s
""".trimIndent(), tdds.size, gson.toJson(tdds)))
//val tddsDb = databaseHelper.getTDDsForLastXDays(3)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, logPrefix + "TDDs found: %d.\n%s",
tdds.size, gson.toJson(tdds)))
for (tdd in tdds) {
//val tddDbEntry = findTDD(tdd.atechDateTime!!, tddsDb)
val totalsDTO = tdd.decodedData!!["Object"] as DailyTotalsDTO
pumpSync.createOrUpdateTotalDailyDose(
@ -428,33 +428,148 @@ class MedtronicHistoryData @Inject constructor(
medtronicPumpStatus.pumpType,
medtronicPumpStatus.serialNumber!!
)
// timestamp: Long, bolusAmount: Double, basalAmount: Double, totalAmount: Double,
// pumpId: Long?, pumpType: PumpType, pumpSerial: String
//aapsLogger.debug(LTag.PUMP, "DailyTotals: {}", totalsDTO);
// if (tddDbEntry == null) {
// val tddNew = TDD()
// totalsDTO!!.setTDD(tddNew)
// aapsLogger.debug(LTag.PUMP, "TDD Add: $tddNew")
// databaseHelper.createOrUpdateTDD(tddNew)
// } else {
// if (!totalsDTO!!.doesEqual(tddDbEntry)) {
// totalsDTO.setTDD(tddDbEntry)
// aapsLogger.debug(LTag.PUMP, "TDD Edit: $tddDbEntry")
// databaseHelper.createOrUpdateTDD(tddDbEntry)
// }
// }
}
}
// private fun processTDDs_Old(tddsIn: MutableList<PumpHistoryEntry>) {
// val tdds = filterTDDs(tddsIn)
// aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, """
// ${logPrefix}TDDs found: %d.
// %s
// """.trimIndent(), tdds.size, gson.toJson(tdds)))
// //val tddsDb = databaseHelper.getTDDsForLastXDays(3)
// for (tdd in tdds) {
// //val tddDbEntry = findTDD(tdd.atechDateTime!!, tddsDb)
// val totalsDTO = tdd.decodedData!!["Object"] as DailyTotalsDTO
//
// aapsLogger.debug(LTag.PUMP, "DailyTotals: {}", totalsDTO);
// if (tddDbEntry == null) {
// val tddNew = TDD()
// totalsDTO!!.setTDD(tddNew)
// aapsLogger.debug(LTag.PUMP, "TDD Add: $tddNew")
// databaseHelper.createOrUpdateTDD(tddNew)
// } else {
// if (!totalsDTO!!.doesEqual(tddDbEntry)) {
// totalsDTO.setTDD(tddDbEntry)
// aapsLogger.debug(LTag.PUMP, "TDD Edit: $tddDbEntry")
// databaseHelper.createOrUpdateTDD(tddDbEntry)
// }
// }
// }
// }
private enum class ProcessHistoryRecord(val description: String) {
Bolus("Bolus"),
TBR("TBR"),
Suspend("Suspend");
}
private fun processBolusEntries(entryList: MutableList<PumpHistoryEntry>) {
val boluses = pumpSyncStorage.getBoluses()
for (bolus in entryList) {
val bolusDTO = bolus.decodedData!!["Object"]!! as BolusDTO
var type: DetailedBolusInfo.BolusType = DetailedBolusInfo.BolusType.NORMAL
var multiwave = false
if (bolusDTO.bolusType==PumpBolusType.Extended) {
addExtendedBolus(bolus, bolusDTO, multiwave)
continue;
} else if (bolusDTO.bolusType==PumpBolusType.Multiwave) {
multiwave = true
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "Multiwave bolus from pump, extended bolus and normal bolus will be added."))
addExtendedBolus(bolus, bolusDTO, multiwave);
}
val deliveredAmount: Double = if (multiwave) bolusDTO.immediateAmount!! else bolusDTO.deliveredAmount!!
var temporaryId: Long? = null
if (!multiwave) {
val entryWithTempId = findDbEntry(bolus, boluses)
if (entryWithTempId != null) {
temporaryId = entryWithTempId.temporaryId
pumpSyncStorage.removeBolusWithTemporaryId(temporaryId)
boluses.remove(entryWithTempId)
type = entryWithTempId.bolusData!!.bolusType
}
}
if (temporaryId!=null) {
val result = pumpSync.syncBolusWithTempId(
tryToGetByLocalTime(bolus.atechDateTime!!),
deliveredAmount,
temporaryId,
type,
bolus.pumpId,
medtronicPumpStatus.pumpType,
medtronicPumpStatus.serialNumber!!)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "syncBolusWithTempId [date=%d, temporaryId=%d, pumpId=%d, insulin=%.2f, pumpSerial=%s] - Result: %b",
bolus.atechDateTime!!, temporaryId, bolus.pumpId, deliveredAmount,
medtronicPumpStatus.serialNumber!!, result))
} else {
val result = pumpSync.syncBolusWithPumpId(
tryToGetByLocalTime(bolus.atechDateTime!!),
deliveredAmount,
type,
bolus.pumpId!!,
medtronicPumpStatus.pumpType,
medtronicPumpStatus.serialNumber!!)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "syncBolusWithPumpId [date=%d, pumpId=%d, insulin=%.2f, pumpSerial=%s] - Result: %b",
bolus.atechDateTime!!, bolus.pumpId, deliveredAmount,
medtronicPumpStatus.serialNumber!!, result))
}
addCarbs(bolus)
}
}
private fun addExtendedBolus(bolus: PumpHistoryEntry, bolusDTO: BolusDTO, isMultiwave: Boolean) {
val durationMs : Long = bolusDTO.duration!! * 60L * 1000L
val result = pumpSync.syncExtendedBolusWithPumpId(
tryToGetByLocalTime(bolus.atechDateTime!!),
bolusDTO.deliveredAmount!!,
durationMs,
false,
bolus.pumpId!!,
medtronicPumpStatus.pumpType,
medtronicPumpStatus.serialNumber!!)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "syncExtendedBolusWithPumpId [date=%d, amount=%.2f, duration=%d, pumpId=%d, pumpSerial=%s, multiwave=%b] - Result: %b",
bolus.atechDateTime!!, bolusDTO.deliveredAmount!!, bolusDTO.duration, bolus.pumpId,
medtronicPumpStatus.serialNumber!!, isMultiwave, result))
}
private fun addCarbs(bolus: PumpHistoryEntry) {
if (bolus.containsDecodedData("Estimate")) {
val bolusWizard = bolus.decodedData!!["Estimate"] as BolusWizardDTO
val result = pumpSync.syncCarbsWithTimestamp(
tryToGetByLocalTime(bolus.atechDateTime!!),
bolusWizard.carbs.toDouble(),
bolus.pumpId!!,
medtronicPumpStatus.pumpType,
medtronicPumpStatus.serialNumber!!)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "syncCarbsWithTimestamp [date=%d, pumpId=%d, carbs=%.2f, pumpSerial=%s] - Result: %b",
bolus.atechDateTime!!, bolusWizard.carbs.toDouble(), bolus.pumpId,
medtronicPumpStatus.serialNumber!!, result))
}
}
private fun processBolusEntries_Old(entryList: MutableList<PumpHistoryEntry>) {
val oldestTimestamp = getOldestTimestamp(entryList)
val entriesFromHistory = getDatabaseEntriesByLastTimestamp(oldestTimestamp, ProcessHistoryRecord.Bolus)
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "DoubleBolusDebug: List (before filter): %s, FromDb=%s", gson.toJson(entryList),
@ -475,7 +590,7 @@ class MedtronicHistoryData @Inject constructor(
}
} else {
for (treatment in entryList) {
val treatmentDb = findDbEntry(treatment, entriesFromHistory)
val treatmentDb = findDbEntry_Old(treatment, entriesFromHistory)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "Add Bolus %s - (entryFromDb=%s) ", treatment, treatmentDb))
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "DoubleBolusDebug: Add Bolus: FromDb=%s, Treatment=%s", treatmentDb, treatment))
addBolus(treatment, treatmentDb as Treatment?)
@ -558,7 +673,7 @@ class MedtronicHistoryData @Inject constructor(
tbr2!!.durationMinutes = tempBasalProcessDTO.duration
val tempBasal = findTempBasalWithPumpId(tempBasalProcessDTO.itemOne!!.pumpId!!, entriesFromHistory)
if (tempBasal == null) {
val treatmentDb = findDbEntry(treatment, entriesFromHistory)
val treatmentDb = findDbEntry_Old(treatment, entriesFromHistory)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "Add " + ProcessHistoryRecord.TBR.description + " %s - (entryFromDb=%s) ", treatment, treatmentDb))
addTBR(treatment, treatmentDb as TemporaryBasal?)
} else {
@ -593,7 +708,7 @@ class MedtronicHistoryData @Inject constructor(
* @param entriesFromHistory entries from history
* @return DbObject from AAPS (if found)
*/
private fun findDbEntry(treatment: PumpHistoryEntry?, entriesFromHistory: List<DbObjectBase>): DbObjectBase? {
private fun findDbEntry_Old(treatment: PumpHistoryEntry?, entriesFromHistory: List<DbObjectBase>): DbObjectBase? {
val proposedTime = DateTimeUtil.toMillisFromATD(treatment!!.atechDateTime!!)
//proposedTime += (this.pumpTime.timeDifference * 1000);
@ -644,11 +759,69 @@ class MedtronicHistoryData @Inject constructor(
return null
}
/**
* Looks at all boluses that have temporaryId and find one that is correct for us (if such entry exists)
*/
private fun findDbEntry(treatment: PumpHistoryEntry?, temporaryEntries: MutableList<PumpDbEntry>): PumpDbEntry? {
if (temporaryEntries.isEmpty()) {
return null
}
var proposedTime = DateTimeUtil.toMillisFromATD(treatment!!.atechDateTime!!)
proposedTime += (this.pumpTime!!.timeDifference * 1000)
val proposedTimeDiff : LongArray = longArrayOf(proposedTime-(2*60*1000), proposedTime+(2L*60L*1000L))
val tempEntriesList: MutableList<PumpDbEntry> = mutableListOf()
for (temporaryEntry in temporaryEntries) {
if (temporaryEntry.date > proposedTimeDiff[0] && temporaryEntry.date < proposedTimeDiff[1]) {
tempEntriesList.add(temporaryEntry)
}
}
if (tempEntriesList.isEmpty()) {
return null
} else if (tempEntriesList.size==1) {
return tempEntriesList[0]
}
var min = 0
while (min < 2) {
var sec = 0
while (sec <= 50) {
if (min == 1 && sec == 50) {
sec = 59
}
val diff = sec * 1000
val outList: MutableList<PumpDbEntry> = mutableListOf()
for (treatment1 in tempEntriesList) {
if (treatment1.date > proposedTime - diff && treatment1.date < proposedTime + diff) {
outList.add(treatment1)
}
}
if (outList.size == 1) {
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "DoubleBolusDebug: findDbEntry Treatment={}, FromDb={}. Type=EntrySelected, AtTimeMin={}, AtTimeSec={}", treatment, outList[0], min, sec))
return outList[0]
}
if (min == 0 && sec == 10 && outList.size > 1) {
aapsLogger.error(String.format(Locale.ENGLISH, "Too many entries (with too small diff): (timeDiff=[min=%d,sec=%d],count=%d,list=%s)",
min, sec, outList.size, gson.toJson(outList)))
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "DoubleBolusDebug: findDbEntry Error - Too many entries (with too small diff): (timeDiff=[min=%d,sec=%d],count=%d,list=%s)",
min, sec, outList.size, gson.toJson(outList)))
}
sec += 10
}
min += 1
}
return null
}
private fun getDatabaseEntriesByLastTimestamp(startTimestamp: Long, processHistoryRecord: ProcessHistoryRecord): MutableList<DbObjectBase> {
var outList: MutableList<DbObjectBase> = mutableListOf()
if (processHistoryRecord == ProcessHistoryRecord.Bolus) {
// TODO pumpSync - activeTreatments.getTreatmentsFromHistoryAfterTimestamp
outList.addAll(activePlugin.activeTreatments.getTreatmentsFromHistoryAfterTimestamp(startTimestamp))
} else {
// TODO pumpSync - databaseHelper.getTemporaryBasalsDataFromTime(startTimestamp, true)
@ -701,7 +874,6 @@ class MedtronicHistoryData @Inject constructor(
detailedBolusInfo.insulin = bolusDTO.deliveredAmount!!
addCarbsFromEstimate(detailedBolusInfo, bolus)
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: addBolus(tretament==null): DetailedBolusInfo=$detailedBolusInfo")
// TODO pumpSync - activeTreatments.addToHistoryTreatment
val newRecord = activePlugin.activeTreatments.addToHistoryTreatment(detailedBolusInfo, false)
bolus.linkedObject = detailedBolusInfo
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "addBolus - [date=%d,pumpId=%d, insulin=%.2f, newRecord=%b]", detailedBolusInfo.timestamp,
@ -718,7 +890,6 @@ class MedtronicHistoryData @Inject constructor(
extendedBolus.durationInMinutes = bolusDTO.duration!!
bolus.linkedObject = extendedBolus
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: addBolus(tretament==null): ExtendedBolus=$extendedBolus")
// TODO pumpSync - activeTreatments.addToHistoryExtendedBolus
activePlugin.activeTreatments.addToHistoryExtendedBolus(extendedBolus)
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "addBolus - Extended [date=%d,pumpId=%d, insulin=%.3f, duration=%d]", extendedBolus.date,
extendedBolus.pumpId, extendedBolus.insulin, extendedBolus.durationInMinutes))
@ -729,7 +900,6 @@ class MedtronicHistoryData @Inject constructor(
treatment.source = Source.PUMP
treatment.pumpId = bolus.pumpId!!
treatment.insulin = bolusDTO!!.deliveredAmount!!
// TODO pumpSync - activeTreatments.createOrUpdateMedtronic(treatment)
val updateReturn = activePlugin.activeTreatments.createOrUpdateMedtronic(treatment, false)
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "DoubleBolusDebug: addBolus(tretament!=null): NewTreatment=%s, UpdateReturn=%s", treatment, updateReturn))
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "editBolus - [date=%d,pumpId=%d, insulin=%.3f, newRecord=%s]", treatment.date,
@ -742,7 +912,6 @@ class MedtronicHistoryData @Inject constructor(
if (bolus!!.containsDecodedData("Estimate")) {
val bolusWizard = bolus.decodedData!!["Estimate"] as BolusWizardDTO?
if (doubleBolusDebug) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "DoubleBolusDebug: addCarbsFromEstimate: Bolus=%s, BolusWizardDTO=%s", bolus, bolusWizard))
// TODO pumpSync - Carbs
detailedBolusInfo.carbs = bolusWizard!!.carbs.toDouble()
}
}
@ -772,7 +941,28 @@ class MedtronicHistoryData @Inject constructor(
temporaryBasalDb.durationInMinutes))
}
private fun processSuspends(tempBasalProcessList: List<TempBasalProcessDTO>) {
for (tempBasalProcess in tempBasalProcessList) {
val result = pumpSync.syncTemporaryBasalWithPumpId(
tryToGetByLocalTime(tempBasalProcess.itemOne!!.atechDateTime!!),
0.0,
tempBasalProcess.duration * 60 * 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))
}
}
private fun processSuspends_Old(tempBasalProcessList: List<TempBasalProcessDTO>) {
for (tempBasalProcess in tempBasalProcessList) {
// TODO pumpSync - databaseHelper.findTempBasalByPumpId
var tempBasal = databaseHelper.findTempBasalByPumpId(tempBasalProcess.itemOne!!.pumpId!!)

View file

@ -229,7 +229,7 @@ class BasalProfile {
// return this.mRawData;
}
fun getProfilesByHour(pumpType: PumpType): Array<Double> {
fun getProfilesByHour(pumpType: PumpType): DoubleArray {
var entriesCopy: List<BasalProfileEntry>? = null
try {
entriesCopy = getEntries()
@ -241,7 +241,7 @@ class BasalProfile {
//FabricUtil.createEvent("MedtronicBasalProfileGetByHourError", null);
}
val basalByHour = arrayOf<Double>()
val basalByHour = DoubleArray(24)
if (entriesCopy == null || entriesCopy.size == 0) {
for (i in 0..23) {
@ -249,6 +249,7 @@ class BasalProfile {
}
return basalByHour
}
for (i in entriesCopy.indices) {
val current = entriesCopy[i]
var currentTime = if (current.startTime_raw % 2 == 0) current.startTime_raw.toInt() else current.startTime_raw - 1
@ -301,7 +302,7 @@ class BasalProfile {
}
@JvmStatic
fun getProfilesByHourToString(data: Array<Double>): String {
fun getProfilesByHourToString(data: DoubleArray): String {
val stringBuilder = StringBuilder()
for (value in data) {
stringBuilder.append(String.format("%.3f", value))

View file

@ -58,7 +58,8 @@ enum class MedtronicCommandType
7, R.string.medtronic_cmd_desc_get_time), // 0x70
GetBatteryStatus(0x72, "Get Battery Status", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters,
0, R.string.medtronic_cmd_desc_get_battery_status), //
GetRemainingInsulin(0x73, "Read Remaining Insulin", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, 2), // 115
GetRemainingInsulin(0x73, "Read Remaining Insulin", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters,
2, R.string.medtronic_cmd_desc_get_remaining_insulin), // 115
SetBolus(0x42, "Set Bolus", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, //
0, R.string.medtronic_cmd_desc_set_bolus), // 66

View file

@ -41,11 +41,10 @@ class MedtronicPumpStatus @Inject constructor(private val resourceHelper: Resour
rileyLinkUtil.rileyLinkHistory.add(RLHistoryItem(pumpDeviceState, RileyLinkTargetDevice.MedtronicPump))
rxBus.send(EventRileyLinkDeviceStatusChange(pumpDeviceState))
}
var medtronicDeviceType: MedtronicDeviceType? = null
// fixme
var medtronicPumpMap: MutableMap<String, PumpType> = HashMap()
var medtronicDeviceTypeMap: MutableMap<String, MedtronicDeviceType> = HashMap()
var medtronicDeviceType: MedtronicDeviceType? = null
var medtronicPumpMap: MutableMap<String, PumpType> = mutableMapOf()
var medtronicDeviceTypeMap: MutableMap<String, MedtronicDeviceType> = mutableMapOf()
var basalProfileStatus = BasalProfileStatus.NotInitialized
var batteryType = BatteryType.None
@ -98,16 +97,16 @@ class MedtronicPumpStatus @Inject constructor(private val resourceHelper: Resour
}
// Battery type
private var mapByDescription: MutableMap<String, BatteryType?> = HashMap()
private var batteryTypeByDescMap: MutableMap<String, BatteryType?> = HashMap()
fun getBatteryTypeByDescription(batteryTypeStr: String?): BatteryType? {
if (mapByDescription.size == 0) {
if (batteryTypeByDescMap.size == 0) {
for (value in BatteryType.values()) {
mapByDescription[resourceHelper.gs(value.description)] = value
batteryTypeByDescMap[resourceHelper.gs(value.description)] = value
}
}
return if (mapByDescription.containsKey(batteryTypeStr)) {
mapByDescription[batteryTypeStr]
return if (batteryTypeByDescMap.containsKey(batteryTypeStr)) {
batteryTypeByDescMap[batteryTypeStr]
} else BatteryType.None
}

View file

@ -105,6 +105,7 @@
<string name="medtronic_cmd_desc_get_tbr">Get Temporary Basal</string>
<string name="medtronic_cmd_desc_set_tbr">Set Temporary Basal</string>
<string name="medtronic_cmd_desc_set_bolus">Set Bolus</string>
<string name="medtronic_cmd_desc_get_remaining_insulin">Get Remaining Insulin</string>
<string name="medtronic_pump_status_pump_unreachable">Pump unreachable</string>
<string name="medtronic_warning">Warning</string> <!-- medtronic_warning -->