Merge pull request #502 from Philoul/dev2_Insight_v2

Dev2 insight v2
This commit is contained in:
Milos Kozak 2021-05-12 11:12:53 +02:00 committed by GitHub
commit bcd74897d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 464 additions and 376 deletions

View file

@ -23,7 +23,6 @@ import javax.inject.Inject;
import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.ActivePlugin; import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper; import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
@ -67,15 +66,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try { try {
aapsLogger.info(LTag.DATABASE, "onCreate"); aapsLogger.info(LTag.DATABASE, "onCreate");
TableUtils.createTableIfNotExists(connectionSource, InsightHistoryOffset.class);
TableUtils.createTableIfNotExists(connectionSource, InsightBolusID.class);
TableUtils.createTableIfNotExists(connectionSource, InsightPumpID.class);
TableUtils.createTableIfNotExists(connectionSource, OmnipodHistoryRecord.class); TableUtils.createTableIfNotExists(connectionSource, OmnipodHistoryRecord.class);
TableUtils.createTableIfNotExists(connectionSource, OHQueueItem.class); TableUtils.createTableIfNotExists(connectionSource, OHQueueItem.class);
database.execSQL("INSERT INTO sqlite_sequence (name, seq) SELECT \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_BOLUS_IDS + "\", " + System.currentTimeMillis() + " " +
"WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_BOLUS_IDS + "\")");
database.execSQL("INSERT INTO sqlite_sequence (name, seq) SELECT \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_PUMP_IDS + "\", " + System.currentTimeMillis() + " " +
"WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_PUMP_IDS + "\")");
} catch (SQLException e) { } catch (SQLException e) {
aapsLogger.error("Can't create database", e); aapsLogger.error("Can't create database", e);
throw new RuntimeException(e); throw new RuntimeException(e);
@ -91,17 +83,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
if (oldVersion < 7) { if (oldVersion < 7) {
aapsLogger.info(LTag.DATABASE, "onUpgrade"); aapsLogger.info(LTag.DATABASE, "onUpgrade");
onCreate(database, connectionSource); onCreate(database, connectionSource);
} else if (oldVersion < 10) {
TableUtils.createTableIfNotExists(connectionSource, InsightHistoryOffset.class);
TableUtils.createTableIfNotExists(connectionSource, InsightBolusID.class);
TableUtils.createTableIfNotExists(connectionSource, InsightPumpID.class);
database.execSQL("INSERT INTO sqlite_sequence (name, seq) SELECT \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_BOLUS_IDS + "\", " + System.currentTimeMillis() + " " +
"WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_BOLUS_IDS + "\")");
database.execSQL("INSERT INTO sqlite_sequence (name, seq) SELECT \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_PUMP_IDS + "\", " + System.currentTimeMillis() + " " +
"WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_PUMP_IDS + "\")");
} else if (oldVersion < 11) {
database.execSQL("UPDATE sqlite_sequence SET seq = " + System.currentTimeMillis() + " WHERE name = \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_BOLUS_IDS + "\"");
database.execSQL("UPDATE sqlite_sequence SET seq = " + System.currentTimeMillis() + " WHERE name = \"" + DatabaseHelperInterface.Companion.DATABASE_INSIGHT_PUMP_IDS + "\"");
} }
TableUtils.createTableIfNotExists(connectionSource, OHQueueItem.class); TableUtils.createTableIfNotExists(connectionSource, OHQueueItem.class);
} catch (SQLException e) { } catch (SQLException e) {
@ -152,18 +133,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
// ------------------ getDao ------------------------------------------- // ------------------ getDao -------------------------------------------
private Dao<InsightPumpID, Long> getDaoInsightPumpID() throws SQLException {
return getDao(InsightPumpID.class);
}
private Dao<InsightBolusID, Long> getDaoInsightBolusID() throws SQLException {
return getDao(InsightBolusID.class);
}
private Dao<InsightHistoryOffset, String> getDaoInsightHistoryOffset() throws SQLException {
return getDao(InsightHistoryOffset.class);
}
private Dao<OmnipodHistoryRecord, Long> getDaoPodHistory() throws SQLException { private Dao<OmnipodHistoryRecord, Long> getDaoPodHistory() throws SQLException {
return getDao(OmnipodHistoryRecord.class); return getDao(OmnipodHistoryRecord.class);
} }
@ -182,68 +151,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} }
} }
// ---------------- Insight history handling ---------------
public void createOrUpdate(InsightHistoryOffset offset) {
try {
getDaoInsightHistoryOffset().createOrUpdate(offset);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public InsightHistoryOffset getInsightHistoryOffset(String pumpSerial) {
try {
return getDaoInsightHistoryOffset().queryForId(pumpSerial);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return null;
}
public void createOrUpdate(InsightBolusID bolusID) {
try {
getDaoInsightBolusID().createOrUpdate(bolusID);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public InsightBolusID getInsightBolusID(String pumpSerial, int bolusID, long timestamp) {
try {
return getDaoInsightBolusID().queryBuilder()
.where().eq("pumpSerial", pumpSerial)
.and().eq("bolusID", bolusID)
.and().between("timestamp", timestamp - 259200000, timestamp + 259200000)
.queryForFirst();
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return null;
}
public void createOrUpdate(InsightPumpID pumpID) {
try {
getDaoInsightPumpID().createOrUpdate(pumpID);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public InsightPumpID getPumpStoppedEvent(String pumpSerial, long before) {
try {
return getDaoInsightPumpID().queryBuilder()
.orderBy("timestamp", false)
.where().eq("pumpSerial", pumpSerial)
.and().in("eventType", "PumpStopped", "PumpPaused")
.and().lt("timestamp", before)
.queryForFirst();
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return null;
}
// ---------------- Food handling --------------- // ---------------- Food handling ---------------
// ---------------- PodHistory handling --------------- // ---------------- PodHistory handling ---------------

View file

@ -49,18 +49,6 @@ public class DatabaseHelperProvider implements DatabaseHelperInterface {
return MainApp.Companion.getDbHelper().findOmnipodHistoryRecordByPumpId(pumpId); return MainApp.Companion.getDbHelper().findOmnipodHistoryRecordByPumpId(pumpId);
} }
@Override public void createOrUpdate(@NonNull InsightBolusID record) {
MainApp.Companion.getDbHelper().createOrUpdate(record);
}
@Override public void createOrUpdate(@NonNull InsightPumpID record) {
MainApp.Companion.getDbHelper().createOrUpdate(record);
}
@Override public void createOrUpdate(@NonNull InsightHistoryOffset record) {
MainApp.Companion.getDbHelper().createOrUpdate(record);
}
@Override public void delete(@NonNull ExtendedBolus extendedBolus) { @Override public void delete(@NonNull ExtendedBolus extendedBolus) {
// MainApp.Companion.getDbHelper().delete(extendedBolus); // MainApp.Companion.getDbHelper().delete(extendedBolus);
} }
@ -70,18 +58,6 @@ public class DatabaseHelperProvider implements DatabaseHelperInterface {
return null; return null;
} }
@Nullable @Override public InsightBolusID getInsightBolusID(@NonNull String pumpSerial, int bolusID, long timestamp) {
return MainApp.Companion.getDbHelper().getInsightBolusID(pumpSerial, bolusID, timestamp);
}
@Nullable @Override public InsightHistoryOffset getInsightHistoryOffset(@NonNull String pumpSerial) {
return MainApp.Companion.getDbHelper().getInsightHistoryOffset(pumpSerial);
}
@Nullable @Override public InsightPumpID getPumpStoppedEvent(@NonNull String pumpSerial, long before) {
return MainApp.Companion.getDbHelper().getPumpStoppedEvent(pumpSerial, before);
}
@Override public void resetDatabases() { @Override public void resetDatabases() {
MainApp.Companion.getDbHelper().resetDatabases(); MainApp.Companion.getDbHelper().resetDatabases();
} }

View file

@ -12,8 +12,9 @@ import info.nightscout.androidaps.di.CoreModule
import info.nightscout.androidaps.dana.di.DanaModule import info.nightscout.androidaps.dana.di.DanaModule
import info.nightscout.androidaps.danar.di.DanaRModule import info.nightscout.androidaps.danar.di.DanaRModule
import info.nightscout.androidaps.danars.di.DanaRSModule import info.nightscout.androidaps.danars.di.DanaRSModule
import info.nightscout.androidaps.danars.di.InsightModule
import info.nightscout.androidaps.database.DatabaseModule import info.nightscout.androidaps.database.DatabaseModule
import info.nightscout.androidaps.insight.di.InsightDatabaseModule
import info.nightscout.androidaps.insight.di.InsightModule
import info.nightscout.androidaps.plugins.pump.common.di.RileyLinkModule import info.nightscout.androidaps.plugins.pump.common.di.RileyLinkModule
import info.nightscout.androidaps.plugins.pump.medtronic.di.MedtronicModule import info.nightscout.androidaps.plugins.pump.medtronic.di.MedtronicModule
import info.nightscout.androidaps.plugins.pump.omnipod.eros.dagger.OmnipodErosModule import info.nightscout.androidaps.plugins.pump.omnipod.eros.dagger.OmnipodErosModule
@ -51,6 +52,7 @@ import javax.inject.Singleton
DanaRSModule::class, DanaRSModule::class,
ComboModule::class, ComboModule::class,
InsightModule::class, InsightModule::class,
InsightDatabaseModule::class,
WorkersModule::class, WorkersModule::class,
OHUploaderModule::class OHUploaderModule::class
] ]

View file

@ -13,6 +13,7 @@ import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Sources import info.nightscout.androidaps.database.entities.UserEntry.Sources
import info.nightscout.androidaps.databinding.MaintenanceFragmentBinding import info.nightscout.androidaps.databinding.MaintenanceFragmentBinding
import info.nightscout.androidaps.events.EventNewBG import info.nightscout.androidaps.events.EventNewBG
import info.nightscout.androidaps.insight.database.InsightDatabase
import info.nightscout.androidaps.interfaces.DataSyncSelector import info.nightscout.androidaps.interfaces.DataSyncSelector
import info.nightscout.androidaps.interfaces.ImportExportPrefs import info.nightscout.androidaps.interfaces.ImportExportPrefs
import info.nightscout.androidaps.interfaces.PumpSync import info.nightscout.androidaps.interfaces.PumpSync
@ -39,6 +40,7 @@ class MaintenanceFragment : DaggerFragment() {
@Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var aapsSchedulers: AapsSchedulers
@Inject lateinit var repository: AppRepository @Inject lateinit var repository: AppRepository
@Inject lateinit var danaHistoryDatabase: DanaHistoryDatabase @Inject lateinit var danaHistoryDatabase: DanaHistoryDatabase
@Inject lateinit var insightDatabase: InsightDatabase
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var dataSyncSelector: DataSyncSelector @Inject lateinit var dataSyncSelector: DataSyncSelector
@Inject lateinit var pumpSync: PumpSync @Inject lateinit var pumpSync: PumpSync
@ -70,6 +72,7 @@ class MaintenanceFragment : DaggerFragment() {
fromAction { fromAction {
repository.clearDatabases() repository.clearDatabases()
danaHistoryDatabase.clearAllTables() danaHistoryDatabase.clearAllTables()
insightDatabase.clearAllTables()
dataSyncSelector.resetToNextFullSync() dataSyncSelector.resetToNextFullSync()
pumpSync.connectNewPump() pumpSync.connectNewPump()
} }

View file

@ -10,6 +10,8 @@ import info.nightscout.androidaps.danar.DanaRPlugin
import info.nightscout.androidaps.danars.DanaRSPlugin import info.nightscout.androidaps.danars.DanaRSPlugin
import info.nightscout.androidaps.data.PumpEnactResult import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.insight.database.InsightDatabaseDao
import info.nightscout.androidaps.insight.database.InsightDbHelper
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
@ -51,7 +53,7 @@ import java.util.*
ConstraintChecker::class, SP::class, Context::class, ConstraintChecker::class, SP::class, Context::class,
OpenAPSAMAPlugin::class, OpenAPSSMBPlugin::class, TreatmentsPlugin::class, TreatmentService::class, OpenAPSAMAPlugin::class, OpenAPSSMBPlugin::class, TreatmentsPlugin::class, TreatmentService::class,
VirtualPumpPlugin::class, DetailedBolusInfoStorage::class, TemporaryBasalStorage::class, GlimpPlugin::class, Profiler::class, VirtualPumpPlugin::class, DetailedBolusInfoStorage::class, TemporaryBasalStorage::class, GlimpPlugin::class, Profiler::class,
UserEntryLogger::class, LoggerUtils::class, AppRepository::class) UserEntryLogger::class, LoggerUtils::class, AppRepository::class, InsightDatabaseDao::class)
class ConstraintsCheckerTest : TestBaseWithProfile() { class ConstraintsCheckerTest : TestBaseWithProfile() {
@Mock lateinit var activePlugin: ActivePlugin @Mock lateinit var activePlugin: ActivePlugin
@ -68,9 +70,10 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
@Mock lateinit var databaseHelper: DatabaseHelperInterface @Mock lateinit var databaseHelper: DatabaseHelperInterface
@Mock lateinit var repository: AppRepository @Mock lateinit var repository: AppRepository
@Mock lateinit var pumpSync: PumpSync @Mock lateinit var pumpSync: PumpSync
@Mock lateinit var insightDatabaseDao: InsightDatabaseDao
private lateinit var danaPump: DanaPump private lateinit var danaPump: DanaPump
private lateinit var insightDbHelper: InsightDbHelper
private lateinit var constraintChecker: ConstraintChecker private lateinit var constraintChecker: ConstraintChecker
private lateinit var safetyPlugin: SafetyPlugin private lateinit var safetyPlugin: SafetyPlugin
private lateinit var objectivesPlugin: ObjectivesPlugin private lateinit var objectivesPlugin: ObjectivesPlugin
@ -134,14 +137,14 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculator = iobCobCalculator, dateUtil = dateUtil) val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculator = iobCobCalculator, dateUtil = dateUtil)
insightDbHelper = InsightDbHelper(insightDatabaseDao)
danaPump = DanaPump(aapsLogger, sp, dateUtil, injector) danaPump = DanaPump(aapsLogger, sp, dateUtil, injector)
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, repository) hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, repository)
objectivesPlugin = ObjectivesPlugin(injector, aapsLogger, resourceHelper, activePlugin, sp, ConfigImpl(), dateUtil, uel) objectivesPlugin = ObjectivesPlugin(injector, aapsLogger, resourceHelper, activePlugin, sp, ConfigImpl(), dateUtil, uel)
comboPlugin = ComboPlugin(injector, aapsLogger, rxBus, resourceHelper, profileFunction, sp, commandQueue, context, databaseHelper, pumpSync, dateUtil) comboPlugin = ComboPlugin(injector, aapsLogger, rxBus, resourceHelper, profileFunction, sp, commandQueue, context, databaseHelper, pumpSync, dateUtil)
danaRPlugin = DanaRPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, activePlugin, sp, commandQueue, danaPump, dateUtil, fabricPrivacy, pumpSync) danaRPlugin = DanaRPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, activePlugin, sp, commandQueue, danaPump, dateUtil, fabricPrivacy, pumpSync)
danaRSPlugin = DanaRSPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, profileFunction, sp, commandQueue, danaPump, pumpSync, detailedBolusInfoStorage, temporaryBasalStorage, fabricPrivacy, dateUtil) danaRSPlugin = DanaRSPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, profileFunction, sp, commandQueue, danaPump, pumpSync, detailedBolusInfoStorage, temporaryBasalStorage, fabricPrivacy, dateUtil)
insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, treatmentsInterface, sp, commandQueue, profileFunction, context, ConfigImpl(), dateUtil, databaseHelper, pumpSync) insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, sp, commandQueue, profileFunction, context, ConfigImpl(), dateUtil, insightDbHelper, pumpSync)
openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, iobCobCalculator, hardLimits, profiler, sp, dateUtil, repository, glucoseStatusProvider) openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, iobCobCalculator, hardLimits, profiler, sp, dateUtil, repository, glucoseStatusProvider)
openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, iobCobCalculator, hardLimits, profiler, fabricPrivacy, dateUtil, repository, glucoseStatusProvider) openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, iobCobCalculator, hardLimits, profiler, fabricPrivacy, dateUtil, repository, glucoseStatusProvider)
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, BuildHelper(ConfigImpl(), loggerUtils), iobCobCalculator, ConfigImpl(), dateUtil) safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, BuildHelper(ConfigImpl(), loggerUtils), iobCobCalculator, ConfigImpl(), dateUtil)

View file

@ -7,9 +7,6 @@ interface DatabaseHelperInterface {
fun resetDatabases() fun resetDatabases()
fun createOrUpdate(record: OmnipodHistoryRecord) fun createOrUpdate(record: OmnipodHistoryRecord)
fun createOrUpdate(record: InsightBolusID)
fun createOrUpdate(record: InsightPumpID)
fun createOrUpdate(record: InsightHistoryOffset)
fun createOrUpdate(record: OHQueueItem) fun createOrUpdate(record: OHQueueItem)
fun delete(extendedBolus: ExtendedBolus) fun delete(extendedBolus: ExtendedBolus)
fun createOrUpdate(tempBasal: TemporaryBasal): Boolean fun createOrUpdate(tempBasal: TemporaryBasal): Boolean
@ -24,18 +21,9 @@ interface DatabaseHelperInterface {
fun getAllOHQueueItems(maxEntries: Long): List<OHQueueItem> fun getAllOHQueueItems(maxEntries: Long): List<OHQueueItem>
// old DB model // old DB model
fun getInsightBolusID(pumpSerial: String, bolusID: Int, timestamp: Long): InsightBolusID?
fun getInsightHistoryOffset(pumpSerial: String): InsightHistoryOffset?
fun getPumpStoppedEvent(pumpSerial: String, before: Long): InsightPumpID?
fun getOHQueueSize(): Long fun getOHQueueSize(): Long
fun clearOpenHumansQueue() fun clearOpenHumansQueue()
fun removeAllOHQueueItemsWithIdSmallerThan(id: Long) fun removeAllOHQueueItemsWithIdSmallerThan(id: Long)
companion object {
const val DATABASE_INSIGHT_HISTORY_OFFSETS = "InsightHistoryOffsets"
const val DATABASE_INSIGHT_BOLUS_IDS = "InsightBolusIDs"
const val DATABASE_INSIGHT_PUMP_IDS = "InsightPumpIDs"
}
} }

View file

@ -12,9 +12,21 @@ android {
defaultConfig { defaultConfig {
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
} }
} }
dependencies { dependencies {
implementation project(':core') implementation project(':core')
api "androidx.room:room-ktx:$room_version"
api "androidx.room:room-runtime:$room_version"
api "androidx.room:room-rxjava2:$room_version"
kapt "androidx.room:room-compiler:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"
} }

View file

@ -0,0 +1,11 @@
package info.nightscout.androidaps.insight.database
import androidx.room.TypeConverter
class Converters {
@TypeConverter
fun fromEventType(evenType: InsightPumpID.EventType) = evenType.name
@TypeConverter
fun toEventType(evenType: String?) = evenType?.let { InsightPumpID.EventType.valueOf(it) }
}

View file

@ -0,0 +1,18 @@
package info.nightscout.androidaps.insight.database
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
@Entity(tableName = DATABASE_INSIGHT_BOLUS_IDS,
indices = [Index("bolusID")])
data class InsightBolusID(
var timestamp: Long,
val pumpSerial: String? = null,
val bolusID: Int? = null,
var startID: Long? = null,
var endID: Long? = null
) {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
}

View file

@ -0,0 +1,36 @@
package info.nightscout.androidaps.insight.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
const val DATABASE_INSIGHT_BOLUS_IDS = "insightBolusIDs"
const val DATABASE_INSIGHT_PUMP_IDS = "insightPumpIDs"
const val DATABASE_INSIGHT_HISTORY_OFFSETS = "insightHistoryOffsets"
@Database(
entities = [InsightBolusID::class, InsightHistoryOffset::class, InsightPumpID::class],
exportSchema = true,
version = InsightDatabase.VERSION
)
@TypeConverters(Converters::class)
abstract class InsightDatabase : RoomDatabase() {
abstract fun insightDatabaseDao(): InsightDatabaseDao
companion object {
const val VERSION = 1
fun build(context: Context) =
Room.databaseBuilder(
context.applicationContext,
InsightDatabase::class.java,
"insight_database.db"
)
.fallbackToDestructiveMigration()
.build()
}
}

View file

@ -0,0 +1,29 @@
package info.nightscout.androidaps.insight.database
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import info.nightscout.androidaps.insight.database.InsightPumpID.EventType
@Dao
abstract class InsightDatabaseDao {
@Query("SELECT * from $DATABASE_INSIGHT_BOLUS_IDS WHERE pumpSerial = :pumpSerial AND timestamp >= :timestamp - 259200000 AND timestamp <= :timestamp + 259200000 AND bolusID = :bolusID")
abstract fun getInsightBolusID(pumpSerial: String, bolusID: Int, timestamp: Long): InsightBolusID?
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun createOrUpdate(insightBolusID: InsightBolusID)
@Query("SELECT * from $DATABASE_INSIGHT_HISTORY_OFFSETS WHERE pumpSerial = :pumpSerial")
abstract fun getInsightHistoryOffset(pumpSerial: String): InsightHistoryOffset?
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun createOrUpdate(insightHistoryOffset: InsightHistoryOffset)
@Query("SELECT * from $DATABASE_INSIGHT_PUMP_IDS WHERE pumpSerial = :pumpSerial AND (eventType = :pumpStopped OR eventType = :pumpPaused) AND timestamp < :timestamp ORDER BY timestamp DESC")
abstract fun getPumpStoppedEvent(pumpSerial: String, timestamp: Long, pumpStopped: EventType, pumpPaused: EventType): InsightPumpID?
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun createOrUpdate(insightPumpID: InsightPumpID)
}

View file

@ -0,0 +1,17 @@
package info.nightscout.androidaps.insight.database
class InsightDbHelper (val insightDatabaseDao: InsightDatabaseDao) {
fun getInsightBolusID(pumpSerial: String, bolusID: Int, timestamp: Long): InsightBolusID? = insightDatabaseDao.getInsightBolusID(pumpSerial, bolusID, timestamp)
fun createOrUpdate(insightBolusID: InsightBolusID) = insightDatabaseDao.createOrUpdate(insightBolusID)
fun getInsightHistoryOffset(pumpSerial: String): InsightHistoryOffset? = insightDatabaseDao.getInsightHistoryOffset(pumpSerial)
fun createOrUpdate(insightHistoryOffset: InsightHistoryOffset) = insightDatabaseDao.createOrUpdate(insightHistoryOffset)
fun getPumpStoppedEvent(pumpSerial: String, timestamp: Long): InsightPumpID? = insightDatabaseDao.getPumpStoppedEvent(pumpSerial, timestamp, InsightPumpID.EventType.PumpStopped, InsightPumpID.EventType.PumpPaused)
fun createOrUpdate(insightPumpID: InsightPumpID) = insightDatabaseDao.createOrUpdate(insightPumpID)
}

View file

@ -0,0 +1,12 @@
package info.nightscout.androidaps.insight.database
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
@Entity(tableName = DATABASE_INSIGHT_HISTORY_OFFSETS,
indices = [Index("pumpSerial")])
data class InsightHistoryOffset(
@PrimaryKey val pumpSerial: String,
var offset: Long
)

View file

@ -0,0 +1,24 @@
package info.nightscout.androidaps.insight.database
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
@Entity(tableName = DATABASE_INSIGHT_PUMP_IDS,
indices = [Index("timestamp")])
data class InsightPumpID(
var timestamp: Long,
var eventType: EventType = EventType.None,
val pumpSerial: String? = null,
@PrimaryKey
var eventID: Long
) {
enum class EventType {
PumpStarted,
PumpStopped,
PumpPaused,
StartOfTBR,
EndOfTBR,
None;
}
}

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.danars.di package info.nightscout.androidaps.insight.di
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.danars.di package info.nightscout.androidaps.insight.di
import dagger.Module import dagger.Module

View file

@ -0,0 +1,27 @@
package info.nightscout.androidaps.insight.di
import android.content.Context
import dagger.Module
import dagger.Provides
import info.nightscout.androidaps.insight.database.InsightDatabase
import info.nightscout.androidaps.insight.database.InsightDatabaseDao
import info.nightscout.androidaps.insight.database.InsightDbHelper
import javax.inject.Singleton
@Module
class InsightDatabaseModule {
@Provides
@Singleton
internal fun provideDatabase(context: Context): InsightDatabase = InsightDatabase.build(context)
@Provides
@Singleton
internal fun provideInsightDatabaseDao(insightDatabase: InsightDatabase): InsightDatabaseDao =
insightDatabase.insightDatabaseDao()
@Provides
@Singleton
internal fun provideInsightDbHelper(insightDatabaseDao: InsightDatabaseDao): InsightDbHelper = InsightDbHelper(insightDatabaseDao)
}

View file

@ -1,10 +1,14 @@
package info.nightscout.androidaps.danars.di package info.nightscout.androidaps.insight.di
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module(includes = [ @Module(includes = [
InsightCommModule::class, InsightCommModule::class,
InsightActivitiesModule::class, InsightActivitiesModule::class,
InsightServicesModule::class InsightServicesModule::class,
InsightDatabaseModule::class
]) ])
open class InsightModule
@Suppress("unused")
abstract class InsightModule

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.danars.di package info.nightscout.androidaps.insight.di
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector

View file

@ -33,20 +33,18 @@ import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.interfaces.Profile; import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.InsightBolusID;
import info.nightscout.androidaps.db.InsightHistoryOffset;
import info.nightscout.androidaps.db.InsightPumpID;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventInitializationChanged;
import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.insight.database.InsightBolusID;
import info.nightscout.androidaps.insight.database.InsightDbHelper;
import info.nightscout.androidaps.insight.database.InsightHistoryOffset;
import info.nightscout.androidaps.insight.database.InsightPumpID;
import info.nightscout.androidaps.insight.database.InsightPumpID.EventType;
import info.nightscout.androidaps.insight.R; import info.nightscout.androidaps.insight.R;
import info.nightscout.androidaps.interfaces.CommandQueueProvider; import info.nightscout.androidaps.interfaces.CommandQueueProvider;
import info.nightscout.androidaps.interfaces.Config; import info.nightscout.androidaps.interfaces.Config;
import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.Constraints; import info.nightscout.androidaps.interfaces.Constraints;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.ProfileFunction; import info.nightscout.androidaps.interfaces.ProfileFunction;
@ -54,7 +52,7 @@ import info.nightscout.androidaps.interfaces.Pump;
import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpPluginBase; import info.nightscout.androidaps.interfaces.PumpPluginBase;
import info.nightscout.androidaps.interfaces.PumpSync; import info.nightscout.androidaps.interfaces.PumpSync;
import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.interfaces.PumpSync.PumpState.TemporaryBasal;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper; import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
@ -131,6 +129,7 @@ import info.nightscout.androidaps.plugins.pump.insight.exceptions.app_layer_erro
import info.nightscout.androidaps.plugins.pump.insight.utils.ExceptionTranslator; import info.nightscout.androidaps.plugins.pump.insight.utils.ExceptionTranslator;
import info.nightscout.androidaps.plugins.pump.insight.utils.ParameterBlockUtil; import info.nightscout.androidaps.plugins.pump.insight.utils.ParameterBlockUtil;
import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.T;
import info.nightscout.androidaps.utils.resources.ResourceHelper; import info.nightscout.androidaps.utils.resources.ResourceHelper;
import info.nightscout.androidaps.utils.sharedPreferences.SP; import info.nightscout.androidaps.utils.sharedPreferences.SP;
@ -140,13 +139,12 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
private final AAPSLogger aapsLogger; private final AAPSLogger aapsLogger;
private final RxBusWrapper rxBus; private final RxBusWrapper rxBus;
private final ResourceHelper resourceHelper; private final ResourceHelper resourceHelper;
private final TreatmentsInterface treatmentsPlugin;
private final SP sp; private final SP sp;
private final CommandQueueProvider commandQueue; private final CommandQueueProvider commandQueue;
private final ProfileFunction profileFunction; private final ProfileFunction profileFunction;
private final Context context; private final Context context;
private final DateUtil dateUtil; private final DateUtil dateUtil;
private final DatabaseHelperInterface databaseHelper; private final InsightDbHelper insightDbHelper;
private final PumpSync pumpSync; private final PumpSync pumpSync;
public static final String ALERT_CHANNEL_ID = "AndroidAPS-InsightAlert"; public static final String ALERT_CHANNEL_ID = "AndroidAPS-InsightAlert";
@ -199,14 +197,13 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
AAPSLogger aapsLogger, AAPSLogger aapsLogger,
RxBusWrapper rxBus, RxBusWrapper rxBus,
ResourceHelper resourceHelper, ResourceHelper resourceHelper,
TreatmentsInterface treatmentsPlugin,
SP sp, SP sp,
CommandQueueProvider commandQueue, CommandQueueProvider commandQueue,
ProfileFunction profileFunction, ProfileFunction profileFunction,
Context context, Context context,
Config config, Config config,
DateUtil dateUtil, DateUtil dateUtil,
DatabaseHelperInterface databaseHelper, InsightDbHelper insightDbHelper,
PumpSync pumpSync PumpSync pumpSync
) { ) {
super(new PluginDescription() super(new PluginDescription()
@ -223,13 +220,12 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
this.aapsLogger = aapsLogger; this.aapsLogger = aapsLogger;
this.rxBus = rxBus; this.rxBus = rxBus;
this.resourceHelper = resourceHelper; this.resourceHelper = resourceHelper;
this.treatmentsPlugin = treatmentsPlugin;
this.sp = sp; this.sp = sp;
this.commandQueue = commandQueue; this.commandQueue = commandQueue;
this.profileFunction = profileFunction; this.profileFunction = profileFunction;
this.context = context; this.context = context;
this.dateUtil = dateUtil; this.dateUtil = dateUtil;
this.databaseHelper = databaseHelper; this.insightDbHelper = insightDbHelper;
this.pumpSync = pumpSync; this.pumpSync = pumpSync;
pumpDescription = new PumpDescription(); pumpDescription = new PumpDescription();
@ -376,7 +372,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
calendar.set(Calendar.HOUR_OF_DAY, pumpTime.getHour()); calendar.set(Calendar.HOUR_OF_DAY, pumpTime.getHour());
calendar.set(Calendar.MINUTE, pumpTime.getMinute()); calendar.set(Calendar.MINUTE, pumpTime.getMinute());
calendar.set(Calendar.SECOND, pumpTime.getSecond()); calendar.set(Calendar.SECOND, pumpTime.getSecond());
if (calendar.get(Calendar.HOUR_OF_DAY) != pumpTime.getHour() || Math.abs(calendar.getTimeInMillis() - System.currentTimeMillis()) > 10000) { if (calendar.get(Calendar.HOUR_OF_DAY) != pumpTime.getHour() || Math.abs(calendar.getTimeInMillis() - dateUtil.now()) > 10000) {
calendar.setTime(new Date()); calendar.setTime(new Date());
pumpTime.setYear(calendar.get(Calendar.YEAR)); pumpTime.setYear(calendar.get(Calendar.YEAR));
pumpTime.setMonth(calendar.get(Calendar.MONTH) + 1); pumpTime.setMonth(calendar.get(Calendar.MONTH) + 1);
@ -544,7 +540,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
@Override @Override
public long lastDataTime() { public long lastDataTime() {
if (connectionService == null || alertService == null) return System.currentTimeMillis(); if (connectionService == null || alertService == null) return dateUtil.now();
return connectionService.getLastDataTime(); return connectionService.getLastDataTime();
} }
@ -569,6 +565,9 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
@NonNull @Override @NonNull @Override
public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
if (detailedBolusInfo.insulin == 0 || detailedBolusInfo.carbs > 0) {
throw new IllegalArgumentException(detailedBolusInfo.toString(), new Exception());
}
PumpEnactResult result = new PumpEnactResult(getInjector()); PumpEnactResult result = new PumpEnactResult(getInjector());
double insulin = Math.round(detailedBolusInfo.insulin / 0.01) * 0.01; double insulin = Math.round(detailedBolusInfo.insulin / 0.01) * 0.01;
if (insulin > 0) { if (insulin > 0) {
@ -579,7 +578,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
bolusMessage.setDuration(0); bolusMessage.setDuration(0);
bolusMessage.setExtendedAmount(0); bolusMessage.setExtendedAmount(0);
bolusMessage.setImmediateAmount(insulin); bolusMessage.setImmediateAmount(insulin);
bolusMessage.setVibration(sp.getBoolean(detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB ? R.string.key_disable_vibration_auto : R.string.key_disable_vibration, false)); bolusMessage.setVibration(sp.getBoolean(detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB ? R.string.key_insight_disable_vibration_auto : R.string.key_insight_disable_vibration, false));
bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId(); bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId();
bolusCancelled = false; bolusCancelled = false;
} }
@ -591,25 +590,23 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
bolusingEvent.setPercent(0); bolusingEvent.setPercent(0);
rxBus.send(bolusingEvent); rxBus.send(bolusingEvent);
int trials = 0; int trials = 0;
InsightBolusID insightBolusID = new InsightBolusID(); Long now = dateUtil.now();
insightBolusID.bolusID = bolusID; String serial = serialNumber();
insightBolusID.timestamp = System.currentTimeMillis(); insightDbHelper.createOrUpdate( new InsightBolusID(
insightBolusID.pumpSerial = connectionService.getPumpSystemIdentification().getSerialNumber(); now,
databaseHelper.createOrUpdate(insightBolusID); serial,
detailedBolusInfo.setBolusTimestamp(insightBolusID.timestamp); bolusID,
detailedBolusInfo.setPumpType(PumpType.ACCU_CHEK_INSIGHT); null,
detailedBolusInfo.setPumpSerial(serialNumber()); null
detailedBolusInfo.setBolusPumpId(insightBolusID.id); ));
if (detailedBolusInfo.carbs > 0 && detailedBolusInfo.carbTime != 0) { InsightBolusID insightBolusID = insightDbHelper.getInsightBolusID(serial, bolusID, now);
DetailedBolusInfo carbInfo = new DetailedBolusInfo(); pumpSync.syncBolusWithPumpId(
carbInfo.carbs = detailedBolusInfo.carbs; insightBolusID.getTimestamp(),
carbInfo.setCarbsTimestamp(detailedBolusInfo.timestamp + detailedBolusInfo.carbTime * 60L * 1000L); detailedBolusInfo.insulin,
carbInfo.setPumpType(PumpType.USER); detailedBolusInfo.getBolusType(),
treatmentsPlugin.addToHistoryTreatment(carbInfo, false); insightBolusID.getId(),
detailedBolusInfo.carbTime = 0; PumpType.ACCU_CHEK_INSIGHT,
detailedBolusInfo.carbs = 0; serialNumber());
}
treatmentsPlugin.addToHistoryTreatment(detailedBolusInfo, true);
while (true) { while (true) {
synchronized ($bolusLock) { synchronized ($bolusLock) {
if (bolusCancelled) break; if (bolusCancelled) break;
@ -657,10 +654,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
aapsLogger.error("Exception while delivering bolus", e); aapsLogger.error("Exception while delivering bolus", e);
result.comment(ExceptionTranslator.getString(context, e)); result.comment(ExceptionTranslator.getString(context, e));
} }
} else if (detailedBolusInfo.carbs > 0) { result.bolusDelivered(insulin);
result.success(true).enacted(true);
} }
result.carbsDelivered(detailedBolusInfo.carbs).bolusDelivered(insulin);
return result; return result;
} }
@ -701,7 +696,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
if (cancelTBRResult.getSuccess()) { if (cancelTBRResult.getSuccess()) {
PumpEnactResult ebResult = setExtendedBolusOnly((absoluteRate - getBaseBasalRate()) / 60D PumpEnactResult ebResult = setExtendedBolusOnly((absoluteRate - getBaseBasalRate()) / 60D
* ((double) durationInMinutes), durationInMinutes, * ((double) durationInMinutes), durationInMinutes,
sp.getBoolean(R.string.key_disable_vibration_auto, false)); sp.getBoolean(R.string.key_insight_disable_vibration_auto, false));
if (ebResult.getSuccess()) { if (ebResult.getSuccess()) {
result.success(true) result.success(true)
.enacted(true) .enacted(true)
@ -780,7 +775,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
public PumpEnactResult setExtendedBolus(double insulin, int durationInMinutes) { public PumpEnactResult setExtendedBolus(double insulin, int durationInMinutes) {
PumpEnactResult result = cancelExtendedBolusOnly(); PumpEnactResult result = cancelExtendedBolusOnly();
if (result.getSuccess()) if (result.getSuccess())
result = setExtendedBolusOnly(insulin, durationInMinutes, sp.getBoolean(R.string.key_disable_vibration, false)); result = setExtendedBolusOnly(insulin, durationInMinutes, sp.getBoolean(R.string.key_insight_disable_vibration, false));
try { try {
fetchStatus(); fetchStatus();
readHistory(); readHistory();
@ -804,18 +799,13 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
bolusMessage.setImmediateAmount(0); bolusMessage.setImmediateAmount(0);
bolusMessage.setVibration(disableVibration); bolusMessage.setVibration(disableVibration);
int bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId(); int bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId();
InsightBolusID insightBolusID = new InsightBolusID(); insightDbHelper.createOrUpdate(new InsightBolusID(
insightBolusID.bolusID = bolusID; dateUtil.now(),
insightBolusID.timestamp = System.currentTimeMillis(); serialNumber(),
insightBolusID.pumpSerial = connectionService.getPumpSystemIdentification().getSerialNumber(); bolusID,
databaseHelper.createOrUpdate(insightBolusID); null,
ExtendedBolus extendedBolus = new ExtendedBolus(getInjector()); null
extendedBolus.date = insightBolusID.timestamp; ));
extendedBolus.source = Source.PUMP;
extendedBolus.durationInMinutes = durationInMinutes;
extendedBolus.insulin = insulin;
extendedBolus.pumpId = insightBolusID.id;
treatmentsPlugin.addToHistoryExtendedBolus(extendedBolus);
result.success(true).enacted(true).comment(R.string.virtualpump_resultok); result.success(true).enacted(true).comment(R.string.virtualpump_resultok);
} catch (AppLayerErrorException e) { } catch (AppLayerErrorException e) {
aapsLogger.info(LTag.PUMP, "Exception while delivering extended bolus: " + e.getClass().getCanonicalName() + " (" + e.getErrorCode() + ")"); aapsLogger.info(LTag.PUMP, "Exception while delivering extended bolus: " + e.getClass().getCanonicalName() + " (" + e.getErrorCode() + ")");
@ -836,7 +826,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
PumpEnactResult cancelEBResult = null; PumpEnactResult cancelEBResult = null;
if (isFakingTempsByExtendedBoluses()) cancelEBResult = cancelExtendedBolusOnly(); if (isFakingTempsByExtendedBoluses()) cancelEBResult = cancelExtendedBolusOnly();
PumpEnactResult cancelTBRResult = cancelTempBasalOnly(); PumpEnactResult cancelTBRResult = cancelTempBasalOnly();
result.success((cancelEBResult != null && cancelEBResult.getSuccess()) && cancelTBRResult.getSuccess()); result.success((cancelEBResult == null || (cancelEBResult != null && cancelEBResult.getSuccess())) && cancelTBRResult.getSuccess());
result.enacted((cancelEBResult != null && cancelEBResult.getEnacted()) || cancelTBRResult.getEnacted()); result.enacted((cancelEBResult != null && cancelEBResult.getEnacted()) || cancelTBRResult.getEnacted());
result.comment(cancelEBResult != null ? cancelEBResult.getComment() : cancelTBRResult.getComment()); result.comment(cancelEBResult != null ? cancelEBResult.getComment() : cancelTBRResult.getComment());
try { try {
@ -906,21 +896,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
connectionService.requestMessage(cancelBolusMessage).await(); connectionService.requestMessage(cancelBolusMessage).await();
confirmAlert(AlertType.WARNING_38); confirmAlert(AlertType.WARNING_38);
alertService.ignore(null); alertService.ignore(null);
InsightBolusID insightBolusID = databaseHelper.getInsightBolusID(connectionService.getPumpSystemIdentification().getSerialNumber(), InsightBolusID insightBolusID = insightDbHelper.getInsightBolusID(serialNumber(), activeBolus.getBolusID(), dateUtil.now());
activeBolus.getBolusID(), System.currentTimeMillis());
if (insightBolusID != null) { if (insightBolusID != null) {
ExtendedBolus extendedBolus = databaseHelper.getExtendedBolusByPumpId(insightBolusID.id);
if (extendedBolus != null) {
extendedBolus.durationInMinutes = (int) ((System.currentTimeMillis() - extendedBolus.date) / 60000);
if (extendedBolus.durationInMinutes <= 0) {
final String _id = extendedBolus._id;
// if (NSUpload.isIdValid(_id))
// nsUpload.removeCareportalEntryFromNS(_id);
// else uploadQueue.removeByMongoId("dbAdd", _id);
databaseHelper.delete(extendedBolus);
} else
treatmentsPlugin.addToHistoryExtendedBolus(extendedBolus);
}
result.enacted(true).success(true); result.enacted(true).success(true);
} }
} }
@ -941,8 +918,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
private void confirmAlert(AlertType alertType) { private void confirmAlert(AlertType alertType) {
try { try {
long started = System.currentTimeMillis(); long started = dateUtil.now();
while (System.currentTimeMillis() - started < 10000) { while (dateUtil.now() - started < 10000) {
GetActiveAlertMessage activeAlertMessage = connectionService.requestMessage(new GetActiveAlertMessage()).await(); GetActiveAlertMessage activeAlertMessage = connectionService.requestMessage(new GetActiveAlertMessage()).await();
if (activeAlertMessage.getAlert() != null) { if (activeAlertMessage.getAlert() != null) {
if (activeAlertMessage.getAlert().getAlertType() == alertType) { if (activeAlertMessage.getAlert().getAlertType() == alertType) {
@ -963,9 +940,9 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
@NonNull @Override @NonNull @Override
public JSONObject getJSONStatus(@NonNull Profile profile, @NonNull String profileName, @NonNull String version) { public JSONObject getJSONStatus(@NonNull Profile profile, @NonNull String profileName, @NonNull String version) {
long now = System.currentTimeMillis(); long now = dateUtil.now();
if (connectionService == null) return new JSONObject(); if (connectionService == null) return new JSONObject();
if (System.currentTimeMillis() - connectionService.getLastConnected() > (60 * 60 * 1000)) { if (dateUtil.now() - connectionService.getLastConnected() > (60 * 60 * 1000)) {
return new JSONObject(); return new JSONObject();
} }
@ -1103,7 +1080,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
public String shortStatus(boolean veryShort) { public String shortStatus(boolean veryShort) {
StringBuilder ret = new StringBuilder(); StringBuilder ret = new StringBuilder();
if (connectionService.getLastConnected() != 0) { if (connectionService.getLastConnected() != 0) {
long agoMsec = System.currentTimeMillis() - connectionService.getLastConnected(); long agoMsec = dateUtil.now() - connectionService.getLastConnected();
int agoMin = (int) (agoMsec / 60d / 1000d); int agoMin = (int) (agoMsec / 60d / 1000d);
ret.append(resourceHelper.gs(R.string.short_status_last_connected, agoMin)).append("\n"); ret.append(resourceHelper.gs(R.string.short_status_last_connected, agoMin)).append("\n");
} }
@ -1130,7 +1107,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
@Override @Override
public boolean isFakingTempsByExtendedBoluses() { public boolean isFakingTempsByExtendedBoluses() {
return sp.getBoolean("insight_enable_tbr_emulation", false); return sp.getBoolean(R.string.key_insight_enable_tbr_emulation, false);
} }
@NonNull @Override @NonNull @Override
@ -1141,10 +1118,10 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
private void readHistory() { private void readHistory() {
try { try {
PumpTime pumpTime = connectionService.requestMessage(new GetDateTimeMessage()).await().getPumpTime(); PumpTime pumpTime = connectionService.requestMessage(new GetDateTimeMessage()).await().getPumpTime();
String pumpSerial = connectionService.getPumpSystemIdentification().getSerialNumber(); String serial = serialNumber();
timeOffset = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() - parseDate(pumpTime.getYear(), timeOffset = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() - parseDate(pumpTime.getYear(),
pumpTime.getMonth(), pumpTime.getDay(), pumpTime.getHour(), pumpTime.getMinute(), pumpTime.getSecond()); pumpTime.getMonth(), pumpTime.getDay(), pumpTime.getHour(), pumpTime.getMinute(), pumpTime.getSecond());
InsightHistoryOffset historyOffset = databaseHelper.getInsightHistoryOffset(pumpSerial); InsightHistoryOffset historyOffset = insightDbHelper.getInsightHistoryOffset(serial);
try { try {
List<HistoryEvent> historyEvents = new ArrayList<>(); List<HistoryEvent> historyEvents = new ArrayList<>();
if (historyOffset == null) { if (historyOffset == null) {
@ -1156,7 +1133,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
} else { } else {
StartReadingHistoryMessage startMessage = new StartReadingHistoryMessage(); StartReadingHistoryMessage startMessage = new StartReadingHistoryMessage();
startMessage.setDirection(HistoryReadingDirection.FORWARD); startMessage.setDirection(HistoryReadingDirection.FORWARD);
startMessage.setOffset(historyOffset.offset + 1); startMessage.setOffset(historyOffset.getOffset() + 1);
connectionService.requestMessage(startMessage).await(); connectionService.requestMessage(startMessage).await();
while (true) { while (true) {
List<HistoryEvent> newEvents = connectionService.requestMessage(new ReadHistoryEventsMessage()).await().getHistoryEvents(); List<HistoryEvent> newEvents = connectionService.requestMessage(new ReadHistoryEventsMessage()).await().getHistoryEvents();
@ -1166,12 +1143,12 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
} }
Collections.sort(historyEvents); Collections.sort(historyEvents);
Collections.reverse(historyEvents); Collections.reverse(historyEvents);
if (historyOffset != null) processHistoryEvents(pumpSerial, historyEvents); if (historyOffset != null) processHistoryEvents(serial, historyEvents);
if (historyEvents.size() > 0) { if (historyEvents.size() > 0) {
historyOffset = new InsightHistoryOffset(); insightDbHelper.createOrUpdate(new InsightHistoryOffset(
historyOffset.pumpSerial = pumpSerial; serial,
historyOffset.offset = historyEvents.get(0).getEventPosition(); historyEvents.get(0).getEventPosition())
databaseHelper.createOrUpdate(historyOffset); );
} }
} catch (AppLayerErrorException e) { } catch (AppLayerErrorException e) {
aapsLogger.info(LTag.PUMP, "Exception while reading history: " + e.getClass().getCanonicalName() + " (" + e.getErrorCode() + ")"); aapsLogger.info(LTag.PUMP, "Exception while reading history: " + e.getClass().getCanonicalName() + " (" + e.getErrorCode() + ")");
@ -1202,22 +1179,50 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
if (!processHistoryEvent(serial, temporaryBasals, pumpStartedEvents, historyEvent)) if (!processHistoryEvent(serial, temporaryBasals, pumpStartedEvents, historyEvent))
break; break;
Collections.reverse(temporaryBasals); Collections.reverse(temporaryBasals);
for (InsightPumpID pumpID : pumpStartedEvents) { for (InsightPumpID pumpID : pumpStartedEvents) {
InsightPumpID stoppedEvent = databaseHelper.getPumpStoppedEvent(pumpID.pumpSerial, pumpID.timestamp); InsightPumpID stoppedEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), pumpID.getTimestamp());
if (stoppedEvent == null || stoppedEvent.eventType.equals("PumpPaused")) continue; if (stoppedEvent != null && stoppedEvent.getEventType().equals(EventType.PumpStopped)) { // Search if Stop event is after 15min of Pause
long tbrStart = stoppedEvent.timestamp + 10000; InsightPumpID pauseEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), stoppedEvent.getTimestamp() - T.mins(1).msecs());
TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()); if (pauseEvent != null && pauseEvent.getEventType().equals(EventType.PumpPaused) && (stoppedEvent.getTimestamp() - pauseEvent.getTimestamp() < T.mins(16).msecs())) {
temporaryBasal.durationInMinutes = (int) ((pumpID.timestamp - tbrStart) / 60000); stoppedEvent = pauseEvent;
temporaryBasal.date = tbrStart; stoppedEvent.setEventType(EventType.PumpStopped);
temporaryBasal.source = Source.PUMP; }
temporaryBasal.pumpId = pumpID.id; }
temporaryBasal.percentRate = 0; if (stoppedEvent == null || stoppedEvent.getEventType().equals(EventType.PumpPaused) || pumpID.getTimestamp() - stoppedEvent.getTimestamp() < 10000)
temporaryBasal.isAbsolute = false; continue;
long tbrStart = stoppedEvent.getTimestamp() + 10000;
TemporaryBasal temporaryBasal = new TemporaryBasal(
tbrStart,
pumpID.getTimestamp() - tbrStart,
0,
false,
PumpSync.TemporaryBasalType.NORMAL,
pumpID.getEventID(),
pumpID.getEventID());
temporaryBasals.add(temporaryBasal); temporaryBasals.add(temporaryBasal);
} }
temporaryBasals.sort((o1, o2) -> (int) (o1.date - o2.date)); temporaryBasals.sort((o1, o2) -> (int) (o1.getTimestamp() - o2.getTimestamp()));
for (TemporaryBasal temporaryBasal : temporaryBasals) for (TemporaryBasal temporaryBasal : temporaryBasals) {
treatmentsPlugin.addToHistoryTempBasal(temporaryBasal); if (temporaryBasal.getDuration() == 0L) { // for Stop TBR event duration = 0L
pumpSync.syncStopTemporaryBasalWithPumpId(
temporaryBasal.getTimestamp(),
temporaryBasal.getPumpId(),
PumpType.ACCU_CHEK_INSIGHT,
serial);
}
if (temporaryBasal.getRate() != 100.0){
pumpSync.syncTemporaryBasalWithPumpId(
temporaryBasal.getTimestamp(),
temporaryBasal.getRate(),
temporaryBasal.getDuration(),
temporaryBasal.isAbsolute(),
temporaryBasal.getType(),
temporaryBasal.getPumpId(),
PumpType.ACCU_CHEK_INSIGHT,
serial);
}
}
} }
private boolean processHistoryEvent(String serial, List<TemporaryBasal> temporaryBasals, List<InsightPumpID> pumpStartedEvents, HistoryEvent event) { private boolean processHistoryEvent(String serial, List<TemporaryBasal> temporaryBasals, List<InsightPumpID> pumpStartedEvents, HistoryEvent event) {
@ -1225,13 +1230,13 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
else if (event instanceof DateTimeChangedEvent) else if (event instanceof DateTimeChangedEvent)
processDateTimeChangedEvent((DateTimeChangedEvent) event); processDateTimeChangedEvent((DateTimeChangedEvent) event);
else if (event instanceof CannulaFilledEvent) else if (event instanceof CannulaFilledEvent)
processCannulaFilledEvent((CannulaFilledEvent) event); processCannulaFilledEvent(serial, (CannulaFilledEvent) event);
else if (event instanceof TotalDailyDoseEvent) else if (event instanceof TotalDailyDoseEvent)
processTotalDailyDoseEvent((TotalDailyDoseEvent) event); processTotalDailyDoseEvent(serial, (TotalDailyDoseEvent) event);
else if (event instanceof TubeFilledEvent) processTubeFilledEvent((TubeFilledEvent) event); else if (event instanceof TubeFilledEvent) processTubeFilledEvent(serial, (TubeFilledEvent) event);
else if (event instanceof SniffingDoneEvent) else if (event instanceof SniffingDoneEvent)
processSniffingDoneEvent((SniffingDoneEvent) event); processSniffingDoneEvent(serial, (SniffingDoneEvent) event);
else if (event instanceof PowerUpEvent) processPowerUpEvent((PowerUpEvent) event); else if (event instanceof PowerUpEvent) processPowerUpEvent(serial, (PowerUpEvent) event);
else if (event instanceof OperatingModeChangedEvent) else if (event instanceof OperatingModeChangedEvent)
processOperatingModeChangedEvent(serial, pumpStartedEvents, (OperatingModeChangedEvent) event); processOperatingModeChangedEvent(serial, pumpStartedEvents, (OperatingModeChangedEvent) event);
else if (event instanceof StartOfTBREvent) else if (event instanceof StartOfTBREvent)
@ -1253,14 +1258,15 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
timeOffset -= timeAfter - timeBefore; timeOffset -= timeAfter - timeBefore;
} }
private void processCannulaFilledEvent(CannulaFilledEvent event) { private void processCannulaFilledEvent(String serial, CannulaFilledEvent event) {
if (!sp.getBoolean("insight_log_site_changes", false)) return; if (!sp.getBoolean(R.string.key_insight_log_site_changes, false)) return;
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.CANNULA_CHANGE); if (event.getAmount() > 0.0) // Don't record event if amount is null => Fix Site Change with Insight v3 (event is always sent when Reservoir is changed)
uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.CANNULA_CHANGE);
} }
private void processTotalDailyDoseEvent(TotalDailyDoseEvent event) { private void processTotalDailyDoseEvent(String serial, TotalDailyDoseEvent event) {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(0)); calendar.setTime(new Date(0));
calendar.set(Calendar.YEAR, event.getTotalYear()); calendar.set(Calendar.YEAR, event.getTotalYear());
@ -1271,28 +1277,28 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
event.getBolusTotal(), event.getBolusTotal(),
event.getBasalTotal(), event.getBasalTotal(),
0.0, // will be calculated automatically 0.0, // will be calculated automatically
null, event.getEventPosition(),
PumpType.ACCU_CHEK_INSIGHT, PumpType.ACCU_CHEK_INSIGHT,
serialNumber() serial);
);
} }
private void processTubeFilledEvent(TubeFilledEvent event) { private void processTubeFilledEvent(String serial, TubeFilledEvent event) {
if (!sp.getBoolean("insight_log_tube_changes", false)) return; if (!sp.getBoolean(R.string.key_insight_log_tube_changes, false)) return;
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
logNote(timestamp, resourceHelper.gs(R.string.tube_changed)); if (event.getAmount() > 0.0) // Don't record event if amount is null
logNote(timestamp, resourceHelper.gs(R.string.tube_changed));
} }
private void processSniffingDoneEvent(SniffingDoneEvent event) { private void processSniffingDoneEvent(String serial, SniffingDoneEvent event) {
if (!sp.getBoolean("insight_log_reservoir_changes", false)) return; if (!sp.getBoolean(R.string.key_insight_log_reservoir_changes, false)) return;
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.INSULIN_CHANGE); uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.INSULIN_CHANGE);
} }
private void processPowerUpEvent(PowerUpEvent event) { private void processPowerUpEvent(String serial, PowerUpEvent event) {
if (!sp.getBoolean("insight_log_battery_changes", false)) return; if (!sp.getBoolean(R.string.key_insight_log_battery_changes, false)) return;
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.PUMP_BATTERY_CHANGE); uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.PUMP_BATTERY_CHANGE);
@ -1301,102 +1307,110 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
private void processOperatingModeChangedEvent(String serial, List<InsightPumpID> pumpStartedEvents, OperatingModeChangedEvent event) { private void processOperatingModeChangedEvent(String serial, List<InsightPumpID> pumpStartedEvents, OperatingModeChangedEvent event) {
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
InsightPumpID pumpID = new InsightPumpID(); InsightPumpID pumpID = new InsightPumpID(
pumpID.eventID = event.getEventPosition(); timestamp,
pumpID.pumpSerial = serial; EventType.None,
pumpID.timestamp = timestamp; serial,
event.getEventPosition());
switch (event.getNewValue()) { switch (event.getNewValue()) {
case STARTED: case STARTED:
pumpID.eventType = "PumpStarted"; pumpID.setEventType(EventType.PumpStarted);
pumpStartedEvents.add(pumpID); pumpStartedEvents.add(pumpID);
if (sp.getBoolean("insight_log_operating_mode_changes", false)) if (sp.getBoolean("insight_log_operating_mode_changes", false))
logNote(timestamp, resourceHelper.gs(R.string.pump_started)); logNote(timestamp, resourceHelper.gs(R.string.pump_started));
break; break;
case STOPPED: case STOPPED:
pumpID.eventType = "PumpStopped"; pumpID.setEventType(EventType.PumpStopped);
if (sp.getBoolean("insight_log_operating_mode_changes", false)) if (sp.getBoolean("insight_log_operating_mode_changes", false))
logNote(timestamp, resourceHelper.gs(R.string.pump_stopped)); logNote(timestamp, resourceHelper.gs(R.string.pump_stopped));
break; break;
case PAUSED: case PAUSED:
pumpID.eventType = "PumpPaused"; pumpID.setEventType(EventType.PumpPaused);
if (sp.getBoolean("insight_log_operating_mode_changes", false)) if (sp.getBoolean("insight_log_operating_mode_changes", false))
logNote(timestamp, resourceHelper.gs(R.string.pump_paused)); logNote(timestamp, resourceHelper.gs(R.string.pump_paused));
break; break;
} }
databaseHelper.createOrUpdate(pumpID); insightDbHelper.createOrUpdate(pumpID);
} }
private void processStartOfTBREvent(String serial, List<TemporaryBasal> temporaryBasals, StartOfTBREvent event) { private void processStartOfTBREvent(String serial, List<TemporaryBasal> temporaryBasals, StartOfTBREvent event) {
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
InsightPumpID pumpID = new InsightPumpID(); insightDbHelper.createOrUpdate(new InsightPumpID(
pumpID.eventID = event.getEventPosition(); timestamp,
pumpID.pumpSerial = serial; EventType.StartOfTBR,
pumpID.timestamp = timestamp; serial,
pumpID.eventType = "StartOfTBR"; event.getEventPosition()));
databaseHelper.createOrUpdate(pumpID); temporaryBasals.add(new TemporaryBasal(
TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()); timestamp,
temporaryBasal.durationInMinutes = event.getDuration(); T.mins(event.getDuration()).msecs(),
temporaryBasal.source = Source.PUMP; event.getAmount(),
temporaryBasal.pumpId = pumpID.id; false,
temporaryBasal.percentRate = event.getAmount(); PumpSync.TemporaryBasalType.NORMAL,
temporaryBasal.isAbsolute = false; event.getEventPosition(),
temporaryBasal.date = timestamp; event.getEventPosition()));
temporaryBasals.add(temporaryBasal);
} }
private void processEndOfTBREvent(String serial, List<TemporaryBasal> temporaryBasals, EndOfTBREvent event) { private void processEndOfTBREvent(String serial, List<TemporaryBasal> temporaryBasals, EndOfTBREvent event) {
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
InsightPumpID pumpID = new InsightPumpID(); insightDbHelper.createOrUpdate(new InsightPumpID(
pumpID.eventID = event.getEventPosition(); timestamp - 1500L,
pumpID.pumpSerial = serial; EventType.EndOfTBR,
pumpID.eventType = "EndOfTBR"; serial,
pumpID.timestamp = timestamp; event.getEventPosition()));
databaseHelper.createOrUpdate(pumpID);
TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()); temporaryBasals.add(new PumpSync.PumpState.TemporaryBasal(
temporaryBasal.durationInMinutes = 0; timestamp - 1500L,
temporaryBasal.source = Source.PUMP; 0L,
temporaryBasal.pumpId = pumpID.id; 100.0,
temporaryBasal.date = timestamp - 1500L; false,
temporaryBasals.add(temporaryBasal); PumpSync.TemporaryBasalType.NORMAL,
event.getEventPosition(),
event.getEventPosition()));
} }
private void processBolusProgrammedEvent(String serial, BolusProgrammedEvent event) { private void processBolusProgrammedEvent(String serial, BolusProgrammedEvent event) {
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
InsightBolusID bolusID = databaseHelper.getInsightBolusID(serial, event.getBolusID(), timestamp); InsightBolusID bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
if (bolusID != null && bolusID.endID != null) { if (bolusID != null && bolusID.getEndID() != null) {
bolusID.startID = event.getEventPosition(); bolusID.setStartID(event.getEventPosition());
databaseHelper.createOrUpdate(bolusID); insightDbHelper.createOrUpdate(bolusID);
return; return;
} }
if (bolusID == null || bolusID.startID != null) { if (bolusID == null || bolusID.getStartID() != null) { //In rare edge cases two boluses can share the same ID
bolusID = new InsightBolusID(); insightDbHelper.createOrUpdate(new InsightBolusID(
bolusID.timestamp = timestamp; timestamp,
bolusID.bolusID = event.getBolusID(); serial,
bolusID.pumpSerial = serial; event.getBolusID(),
event.getEventPosition(),
null
));
bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
} }
bolusID.startID = event.getEventPosition(); bolusID.setStartID(event.getEventPosition());
databaseHelper.createOrUpdate(bolusID); insightDbHelper.createOrUpdate(bolusID);
if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) { if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) {
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); pumpSync.syncBolusWithPumpId(
detailedBolusInfo.timestamp = bolusID.timestamp; bolusID.getTimestamp(),
detailedBolusInfo.setPumpType(PumpType.ACCU_CHEK_INSIGHT); event.getImmediateAmount(),
detailedBolusInfo.setPumpSerial(serialNumber()); null,
detailedBolusInfo.setBolusPumpId(bolusID.id); bolusID.getId(),
detailedBolusInfo.insulin = event.getImmediateAmount(); PumpType.ACCU_CHEK_INSIGHT,
treatmentsPlugin.addToHistoryTreatment(detailedBolusInfo, true); serial);
} }
if ((event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE)) { if ((event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE)) {
ExtendedBolus extendedBolus = new ExtendedBolus(getInjector()); if (profileFunction.getProfile(bolusID.getTimestamp()) != null)
extendedBolus.date = bolusID.timestamp; pumpSync.syncExtendedBolusWithPumpId(
extendedBolus.source = Source.PUMP; bolusID.getTimestamp(),
extendedBolus.durationInMinutes = event.getDuration(); event.getExtendedAmount(),
extendedBolus.insulin = event.getExtendedAmount(); T.mins(event.getDuration()).msecs(),
extendedBolus.pumpId = bolusID.id; isFakingTempsByExtendedBoluses(),
if (profileFunction.getProfile(extendedBolus.date) != null) bolusID.getId(),
treatmentsPlugin.addToHistoryExtendedBolus(extendedBolus); PumpType.ACCU_CHEK_INSIGHT,
serial);
} }
} }
@ -1405,48 +1419,42 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
long startTimestamp = parseRelativeDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), event.getEventHour(), long startTimestamp = parseRelativeDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), event.getEventHour(),
event.getEventMinute(), event.getEventSecond(), event.getStartHour(), event.getStartMinute(), event.getStartSecond()) + timeOffset; event.getEventMinute(), event.getEventSecond(), event.getStartHour(), event.getStartMinute(), event.getStartSecond()) + timeOffset;
InsightBolusID bolusID = databaseHelper.getInsightBolusID(serial, event.getBolusID(), timestamp); InsightBolusID bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
if (bolusID == null || bolusID.endID != null) { if (bolusID == null || bolusID.getEndID() != null) { // TODO() Check if test EndID is necessary
bolusID = new InsightBolusID(); bolusID = new InsightBolusID(
bolusID.timestamp = startTimestamp; startTimestamp,
bolusID.bolusID = event.getBolusID(); serial,
bolusID.pumpSerial = serial; event.getBolusID(),
bolusID == null ? event.getEventPosition() : bolusID.getStartID(),
event.getEventPosition());
} }
bolusID.endID = event.getEventPosition(); bolusID.setEndID(event.getEventPosition());
databaseHelper.createOrUpdate(bolusID); insightDbHelper.createOrUpdate(bolusID);
bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), startTimestamp); // Line added to get id
if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) { if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) {
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); pumpSync.syncBolusWithPumpId(
detailedBolusInfo.setBolusTimestamp(bolusID.timestamp); bolusID.getTimestamp(),
detailedBolusInfo.setPumpType(PumpType.ACCU_CHEK_INSIGHT); event.getImmediateAmount(),
detailedBolusInfo.setPumpSerial(serialNumber()); null,
detailedBolusInfo.setBolusPumpId(bolusID.id); bolusID.getId(),
detailedBolusInfo.insulin = event.getImmediateAmount(); PumpType.ACCU_CHEK_INSIGHT,
treatmentsPlugin.addToHistoryTreatment(detailedBolusInfo, true); serial);
} }
if (event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE) { if (event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE) {
if (event.getDuration() == 0) { if (event.getDuration() > 0 && profileFunction.getProfile(bolusID.getTimestamp()) != null)
ExtendedBolus extendedBolus = databaseHelper.getExtendedBolusByPumpId(bolusID.id); pumpSync.syncExtendedBolusWithPumpId(
if (extendedBolus != null) { bolusID.getTimestamp(),
final String _id = extendedBolus._id; event.getExtendedAmount(),
// if (NSUpload.isIdValid(_id)) nsUpload.removeCareportalEntryFromNS(_id); T.mins(event.getDuration()).msecs(),
// else uploadQueue.removeByMongoId("dbAdd", _id); isFakingTempsByExtendedBoluses(),
databaseHelper.delete(extendedBolus); bolusID.getId(),
} PumpType.ACCU_CHEK_INSIGHT,
} else { serial);
ExtendedBolus extendedBolus = new ExtendedBolus(getInjector());
extendedBolus.date = bolusID.timestamp;
extendedBolus.source = Source.PUMP;
extendedBolus.durationInMinutes = event.getDuration();
extendedBolus.insulin = event.getExtendedAmount();
extendedBolus.pumpId = bolusID.id;
if (profileFunction.getProfile(extendedBolus.date) != null)
treatmentsPlugin.addToHistoryExtendedBolus(extendedBolus);
}
} }
} }
private void processOccurrenceOfAlertEvent(OccurrenceOfAlertEvent event) { private void processOccurrenceOfAlertEvent(OccurrenceOfAlertEvent event) {
if (!sp.getBoolean("insight_log_alerts", false)) return; if (!sp.getBoolean(R.string.key_insight_log_alerts, false)) return;
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset; event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
Integer code = null; Integer code = null;

View file

@ -20,6 +20,7 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.android.DaggerService; import dagger.android.DaggerService;
import info.nightscout.androidaps.insight.R;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.pump.insight.app_layer.AppLayerMessage; import info.nightscout.androidaps.plugins.pump.insight.app_layer.AppLayerMessage;
@ -141,10 +142,10 @@ public class InsightConnectionService extends DaggerService implements Connectio
} }
private void increaseRecoveryDuration() { private void increaseRecoveryDuration() {
long maxRecoveryDuration = sp.getInt("insight_max_recovery_duration", 20); long maxRecoveryDuration = sp.getInt(R.string.key_insight_max_recovery_duration, 20);
maxRecoveryDuration = Math.min(maxRecoveryDuration, 20); maxRecoveryDuration = Math.min(maxRecoveryDuration, 20);
maxRecoveryDuration = Math.max(maxRecoveryDuration, 0); maxRecoveryDuration = Math.max(maxRecoveryDuration, 0);
long minRecoveryDuration = sp.getInt("insight_min_recovery_duration", 5); long minRecoveryDuration = sp.getInt(R.string.key_insight_min_recovery_duration, 5);
minRecoveryDuration = Math.min(minRecoveryDuration, 20); minRecoveryDuration = Math.min(minRecoveryDuration, 20);
minRecoveryDuration = Math.max(minRecoveryDuration, 0); minRecoveryDuration = Math.max(minRecoveryDuration, 0);
recoveryDuration += 1000; recoveryDuration += 1000;
@ -295,7 +296,7 @@ public class InsightConnectionService extends DaggerService implements Connectio
setState(InsightState.DISCONNECTED); setState(InsightState.DISCONNECTED);
cleanup(true); cleanup(true);
} else if (state != InsightState.DISCONNECTED) { } else if (state != InsightState.DISCONNECTED) {
long disconnectTimeout = sp.getInt("insight_disconnect_delay", 5); long disconnectTimeout = sp.getInt(R.string.key_insight_disconnect_delay, 5);
disconnectTimeout = Math.min(disconnectTimeout, 15); disconnectTimeout = Math.min(disconnectTimeout, 15);
disconnectTimeout = Math.max(disconnectTimeout, 0); disconnectTimeout = Math.max(disconnectTimeout, 0);
aapsLogger.info(LTag.PUMP, "Last connection lock released, will disconnect in " + disconnectTimeout + " seconds"); aapsLogger.info(LTag.PUMP, "Last connection lock released, will disconnect in " + disconnectTimeout + " seconds");

View file

@ -31,10 +31,20 @@
<string name="tube_changed">Tube changed</string> <string name="tube_changed">Tube changed</string>
<string name="insightpump_shortname">Sight</string> <string name="insightpump_shortname">Sight</string>
<string name="insight_alert_notification_channel">Insight Pump Alerts</string> <string name="insight_alert_notification_channel">Insight Pump Alerts</string>
<string name="key_disable_vibration" translatable="false">insight_disable_vibration</string>
<string name="disable_vibration">Disable vibrations on manual bolus delivery</string> <string name="disable_vibration">Disable vibrations on manual bolus delivery</string>
<string name="disable_vibration_summary">For bolus and extended bolus (only available with Insight firmware 3.x)</string> <string name="disable_vibration_summary">For bolus and extended bolus (only available with Insight firmware 3.x)</string>
<string name="key_disable_vibration_auto" translatable="false">insight_disable_vibration_auto</string> <string name="key_insight_disable_vibration" translatable="false">insight_disable_vibration</string>
<string name="key_insight_disable_vibration_auto" translatable="false">insight_disable_vibration_auto</string>
<string name="key_insight_enable_tbr_emulation" translatable="false">insight_enable_tbr_emulation</string>
<string name="key_insight_log_site_changes" translatable="false">insight_log_site_changes</string>
<string name="key_insight_log_tube_changes" translatable="false">insight_log_tube_changes</string>
<string name="key_insight_log_reservoir_changes" translatable="false">insight_log_reservoir_changes</string>
<string name="key_insight_log_battery_changes" translatable="false">insight_log_battery_changes</string>
<string name="key_insight_log_operating_mode_changes" translatable="false">insight_log_operating_mode_changes</string>
<string name="key_insight_log_alerts" translatable="false">insight_log_alerts</string>
<string name="key_insight_min_recovery_duration" translatable="false">insight_min_recovery_duration</string>
<string name="key_insight_max_recovery_duration" translatable="false">insight_max_recovery_duration</string>
<string name="key_insight_disconnect_delay" translatable="false">insight_disconnect_delay</string>
<string name="disable_vibration_auto">Disable vibrations on automated bolus delivery</string> <string name="disable_vibration_auto">Disable vibrations on automated bolus delivery</string>
<string name="disable_vibration_auto_summary">For SMB and Temp Basal with TBR emulation (only available with Insight firmware 3.x)</string> <string name="disable_vibration_auto_summary">For SMB and Temp Basal with TBR emulation (only available with Insight firmware 3.x)</string>
<string name="timeout_during_handshake">Timeout during handshake - reset bluetooth</string> <string name="timeout_during_handshake">Timeout during handshake - reset bluetooth</string>

View file

@ -15,68 +15,68 @@
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_reservoir_changes" android:key="@string/key_insight_log_reservoir_changes"
android:title="@string/log_reservoir_changes" /> android:title="@string/log_reservoir_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_tube_changes" android:key="@string/key_insight_log_tube_changes"
android:title="@string/log_tube_changes" /> android:title="@string/log_tube_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_site_changes" android:key="@string/key_insight_log_site_changes"
android:title="@string/log_site_changes" /> android:title="@string/log_site_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_battery_changes" android:key="@string/key_insight_log_battery_changes"
android:title="@string/log_battery_changes" /> android:title="@string/log_battery_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_operating_mode_changes" android:key="@string/key_insight_log_operating_mode_changes"
android:title="@string/log_operating_mode_changes" /> android:title="@string/log_operating_mode_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_alerts" android:key="@string/key_insight_log_alerts"
android:title="@string/log_alerts" /> android:title="@string/log_alerts" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_enable_tbr_emulation" android:key="@string/key_insight_enable_tbr_emulation"
android:summary="@string/enable_tbr_emulation_summary" android:summary="@string/enable_tbr_emulation_summary"
android:title="@string/enable_tbr_emulation" /> android:title="@string/enable_tbr_emulation" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="@string/key_disable_vibration" android:key="@string/key_insight_disable_vibration"
android:summary="@string/disable_vibration_summary" android:summary="@string/disable_vibration_summary"
android:title="@string/disable_vibration" /> android:title="@string/disable_vibration" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="@string/key_disable_vibration_auto" android:key="@string/key_insight_disable_vibration_auto"
android:summary="@string/disable_vibration_auto_summary" android:summary="@string/disable_vibration_auto_summary"
android:title="@string/disable_vibration_auto" /> android:title="@string/disable_vibration_auto" />
<EditTextPreference <EditTextPreference
android:defaultValue="5" android:defaultValue="5"
android:inputType="number" android:inputType="number"
android:key="insight_min_recovery_duration" android:key="@string/key_insight_min_recovery_duration"
android:title="@string/min_recovery_duration" /> android:title="@string/min_recovery_duration" />
<EditTextPreference <EditTextPreference
android:defaultValue="20" android:defaultValue="20"
android:inputType="number" android:inputType="number"
android:key="insight_max_recovery_duration" android:key="@string/key_insight_max_recovery_duration"
android:title="@string/max_recovery_duration" /> android:title="@string/max_recovery_duration" />
<EditTextPreference <EditTextPreference
android:defaultValue="5" android:defaultValue="5"
android:inputType="number" android:inputType="number"
android:key="insight_disconnect_delay" android:key="@string/key_insight_disconnect_delay"
android:title="@string/disconnect_delay" /> android:title="@string/disconnect_delay" />
</PreferenceCategory> </PreferenceCategory>

View file

@ -15,62 +15,62 @@
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_reservoir_changes" android:key="@string/key_insight_log_reservoir_changes"
android:title="@string/log_reservoir_changes" /> android:title="@string/log_reservoir_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_tube_changes" android:key="@string/key_insight_log_tube_changes"
android:title="@string/log_tube_changes" /> android:title="@string/log_tube_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_site_changes" android:key="@string/key_insight_log_site_changes"
android:title="@string/log_site_changes" /> android:title="@string/log_site_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_battery_changes" android:key="@string/key_insight_log_battery_changes"
android:title="@string/log_battery_changes" /> android:title="@string/log_battery_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_operating_mode_changes" android:key="@string/key_insight_log_operating_mode_changes"
android:title="@string/log_operating_mode_changes" /> android:title="@string/log_operating_mode_changes" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_log_alerts" android:key="@string/key_insight_log_alerts"
android:title="@string/log_alerts" /> android:title="@string/log_alerts" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="insight_enable_tbr_emulation" android:key="@string/key_insight_enable_tbr_emulation"
android:summary="@string/enable_tbr_emulation_summary" android:summary="@string/enable_tbr_emulation_summary"
android:title="@string/enable_tbr_emulation" /> android:title="@string/enable_tbr_emulation" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="@string/key_disable_vibration" android:key="@string/key_insight_disable_vibration"
android:summary="@string/disable_vibration_summary" android:summary="@string/disable_vibration_summary"
android:title="@string/disable_vibration" /> android:title="@string/disable_vibration" />
<EditTextPreference <EditTextPreference
android:defaultValue="5" android:defaultValue="5"
android:inputType="number" android:inputType="number"
android:key="insight_min_recovery_duration" android:key="@string/key_insight_min_recovery_duration"
android:title="@string/min_recovery_duration" /> android:title="@string/min_recovery_duration" />
<EditTextPreference <EditTextPreference
android:defaultValue="20" android:defaultValue="20"
android:inputType="number" android:inputType="number"
android:key="insight_max_recovery_duration" android:key="@string/key_insight_max_recovery_duration"
android:title="@string/max_recovery_duration" /> android:title="@string/max_recovery_duration" />
<EditTextPreference <EditTextPreference
android:defaultValue="5" android:defaultValue="5"
android:inputType="number" android:inputType="number"
android:key="insight_disconnect_delay" android:key="@string/key_insight_disconnect_delay"
android:title="@string/disconnect_delay" /> android:title="@string/disconnect_delay" />
</PreferenceCategory> </PreferenceCategory>