Merge branch 'dev2_dana_combo_only' of github.com:nightscout/AndroidAPS into dev2_dana_combo_only
This commit is contained in:
commit
fd5e7a3c5c
72 changed files with 4592 additions and 601 deletions
|
@ -23,7 +23,6 @@ import javax.inject.Inject;
|
|||
|
||||
import info.nightscout.androidaps.events.EventRefreshOverview;
|
||||
import info.nightscout.androidaps.interfaces.ActivePlugin;
|
||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
|
@ -67,15 +66,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
|
||||
try {
|
||||
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, 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) {
|
||||
aapsLogger.error("Can't create database", e);
|
||||
throw new RuntimeException(e);
|
||||
|
@ -91,17 +83,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
if (oldVersion < 7) {
|
||||
aapsLogger.info(LTag.DATABASE, "onUpgrade");
|
||||
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);
|
||||
} catch (SQLException e) {
|
||||
|
@ -152,18 +133,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
|
||||
// ------------------ 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 {
|
||||
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 ---------------
|
||||
|
||||
// ---------------- PodHistory handling ---------------
|
||||
|
|
|
@ -49,18 +49,6 @@ public class DatabaseHelperProvider implements DatabaseHelperInterface {
|
|||
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) {
|
||||
// MainApp.Companion.getDbHelper().delete(extendedBolus);
|
||||
}
|
||||
|
@ -70,18 +58,6 @@ public class DatabaseHelperProvider implements DatabaseHelperInterface {
|
|||
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() {
|
||||
MainApp.Companion.getDbHelper().resetDatabases();
|
||||
}
|
||||
|
|
|
@ -12,8 +12,9 @@ import info.nightscout.androidaps.di.CoreModule
|
|||
import info.nightscout.androidaps.dana.di.DanaModule
|
||||
import info.nightscout.androidaps.danar.di.DanaRModule
|
||||
import info.nightscout.androidaps.danars.di.DanaRSModule
|
||||
import info.nightscout.androidaps.danars.di.InsightModule
|
||||
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.medtronic.di.MedtronicModule
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.dagger.OmnipodErosModule
|
||||
|
@ -51,6 +52,7 @@ import javax.inject.Singleton
|
|||
DanaRSModule::class,
|
||||
ComboModule::class,
|
||||
InsightModule::class,
|
||||
InsightDatabaseModule::class,
|
||||
WorkersModule::class,
|
||||
OHUploaderModule::class
|
||||
]
|
||||
|
|
|
@ -192,7 +192,7 @@ abstract class PluginsModule {
|
|||
abstract fun bindOpenAPSSMBPlugin(plugin: OpenAPSSMBPlugin): PluginBase
|
||||
|
||||
@Binds
|
||||
@NotNSClient
|
||||
@AllConfigs
|
||||
@IntoMap
|
||||
@IntKey(240)
|
||||
abstract fun bindLocalProfilePlugin(plugin: LocalProfilePlugin): PluginBase
|
||||
|
|
|
@ -196,6 +196,7 @@ class LoopDialog : DaggerDialogFragment() {
|
|||
binding.overviewDisconnectButtons.visibility = View.GONE
|
||||
binding.overviewReconnect.visibility = View.VISIBLE
|
||||
}
|
||||
binding.overviewLoop.visibility = (!loopPlugin.isSuspended && !loopPlugin.isDisconnected).toVisibility()
|
||||
}
|
||||
val profile = profileFunction.getProfile()
|
||||
val profileStore = activePlugin.activeProfileSource.profile
|
||||
|
|
|
@ -13,6 +13,7 @@ import info.nightscout.androidaps.database.entities.UserEntry.Action
|
|||
import info.nightscout.androidaps.database.entities.UserEntry.Sources
|
||||
import info.nightscout.androidaps.databinding.MaintenanceFragmentBinding
|
||||
import info.nightscout.androidaps.events.EventNewBG
|
||||
import info.nightscout.androidaps.insight.database.InsightDatabase
|
||||
import info.nightscout.androidaps.interfaces.DataSyncSelector
|
||||
import info.nightscout.androidaps.interfaces.ImportExportPrefs
|
||||
import info.nightscout.androidaps.interfaces.PumpSync
|
||||
|
@ -39,6 +40,7 @@ class MaintenanceFragment : DaggerFragment() {
|
|||
@Inject lateinit var aapsSchedulers: AapsSchedulers
|
||||
@Inject lateinit var repository: AppRepository
|
||||
@Inject lateinit var danaHistoryDatabase: DanaHistoryDatabase
|
||||
@Inject lateinit var insightDatabase: InsightDatabase
|
||||
@Inject lateinit var uel: UserEntryLogger
|
||||
@Inject lateinit var dataSyncSelector: DataSyncSelector
|
||||
@Inject lateinit var pumpSync: PumpSync
|
||||
|
@ -70,6 +72,7 @@ class MaintenanceFragment : DaggerFragment() {
|
|||
fromAction {
|
||||
repository.clearDatabases()
|
||||
danaHistoryDatabase.clearAllTables()
|
||||
insightDatabase.clearAllTables()
|
||||
dataSyncSelector.resetToNextFullSync()
|
||||
pumpSync.connectNewPump()
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.general.nsclient
|
|||
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.androidaps.database.AppRepository
|
||||
import info.nightscout.androidaps.database.ValueWrapper
|
||||
import info.nightscout.androidaps.database.entities.*
|
||||
import info.nightscout.androidaps.extensions.toJson
|
||||
import info.nightscout.androidaps.interfaces.ActivePlugin
|
||||
|
@ -75,22 +76,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastBolusId = -1L
|
||||
private var lastBolusTime = -1L
|
||||
override fun processChangedBolusesCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)
|
||||
val lastDbIdWrapped = appRepository.getLastBolusIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_bolus_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastBolusId && dateUtil.now() - lastBolusTime < 5000) return false
|
||||
lastBolusId = startId
|
||||
lastBolusTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementBolus(startId).blockingGet()?.let { bolus ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading Bolus data Start: $startId ID: ${bolus.first.id} HistoryID: ${bolus.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!bolus.first.isValid && bolus.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!bolus.first.isValid && bolus.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", bolus.first.interfaceIDs.nightscoutId, DataSyncSelector.PairBolus(bolus.first, bolus.second))
|
||||
// existing without nsId = create new
|
||||
bolus.first.isValid && bolus.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", bolus.first.toJson(dateUtil), DataSyncSelector.PairBolus(bolus.first, bolus.second))
|
||||
// existing with nsId = update
|
||||
bolus.first.isValid && bolus.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", bolus.first.interfaceIDs.nightscoutId, bolus.first.toJson(dateUtil), DataSyncSelector.PairBolus(bolus.first, bolus.second))
|
||||
// without nsId = create new
|
||||
bolus.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", bolus.first.toJson(dateUtil), DataSyncSelector.PairBolus(bolus.first, bolus.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
bolus.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", bolus.first.interfaceIDs.nightscoutId, bolus.first.toJson(dateUtil), DataSyncSelector.PairBolus(bolus.first, bolus.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -112,22 +119,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastCarbsId = -1L
|
||||
private var lastCarbsTime = -1L
|
||||
override fun processChangedCarbsCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)
|
||||
val lastDbIdWrapped = appRepository.getLastCarbsIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_carbs_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastCarbsId && dateUtil.now() - lastCarbsTime < 5000) return false
|
||||
lastCarbsId = startId
|
||||
lastCarbsTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementCarbs(startId).blockingGet()?.let { carb ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading Carbs data Start: $startId ID: ${carb.first.id} HistoryID: ${carb.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!carb.first.isValid && carb.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!carb.first.isValid && carb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", carb.first.interfaceIDs.nightscoutId, DataSyncSelector.PairCarbs(carb.first, carb.second))
|
||||
// existing without nsId = create new
|
||||
carb.first.isValid && carb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", carb.first.toJson(dateUtil), DataSyncSelector.PairCarbs(carb.first, carb.second))
|
||||
// existing with nsId = update
|
||||
carb.first.isValid && carb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", carb.first.interfaceIDs.nightscoutId, carb.first.toJson(dateUtil), DataSyncSelector.PairCarbs(carb.first, carb.second))
|
||||
// without nsId = create new
|
||||
carb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", carb.first.toJson(dateUtil), DataSyncSelector.PairCarbs(carb.first, carb.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
carb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", carb.first.interfaceIDs.nightscoutId, carb.first.toJson(dateUtil), DataSyncSelector.PairCarbs(carb.first, carb.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -149,22 +162,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastBcrId = -1L
|
||||
private var lastBcrTime = -1L
|
||||
override fun processChangedBolusCalculatorResultsCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)
|
||||
val lastDbIdWrapped = appRepository.getLastBolusCalculatorResultIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastBcrId && dateUtil.now() - lastBcrTime < 5000) return false
|
||||
lastBcrId = startId
|
||||
lastBcrTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementBolusCalculatorResult(startId).blockingGet()?.let { bolusCalculatorResult ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading BolusCalculatorResult data Start: $startId ID: ${bolusCalculatorResult.first.id} HistoryID: ${bolusCalculatorResult.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!bolusCalculatorResult.first.isValid && bolusCalculatorResult.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!bolusCalculatorResult.first.isValid && bolusCalculatorResult.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", bolusCalculatorResult.first.interfaceIDs.nightscoutId, DataSyncSelector.PairBolusCalculatorResult(bolusCalculatorResult.first, bolusCalculatorResult.second))
|
||||
// existing without nsId = create new
|
||||
bolusCalculatorResult.first.isValid && bolusCalculatorResult.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", bolusCalculatorResult.first.toJson(dateUtil), DataSyncSelector.PairBolusCalculatorResult(bolusCalculatorResult.first, bolusCalculatorResult.second))
|
||||
// existing with nsId = update
|
||||
bolusCalculatorResult.first.isValid && bolusCalculatorResult.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", bolusCalculatorResult.first.interfaceIDs.nightscoutId, bolusCalculatorResult.first.toJson(dateUtil), DataSyncSelector.PairBolusCalculatorResult(bolusCalculatorResult.first, bolusCalculatorResult.second))
|
||||
// without nsId = create new
|
||||
bolusCalculatorResult.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", bolusCalculatorResult.first.toJson(dateUtil), DataSyncSelector.PairBolusCalculatorResult(bolusCalculatorResult.first, bolusCalculatorResult.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
bolusCalculatorResult.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", bolusCalculatorResult.first.interfaceIDs.nightscoutId, bolusCalculatorResult.first.toJson(dateUtil), DataSyncSelector.PairBolusCalculatorResult(bolusCalculatorResult.first, bolusCalculatorResult.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -186,22 +205,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastTtId = -1L
|
||||
private var lastTtTime = -1L
|
||||
override fun processChangedTempTargetsCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)
|
||||
val lastDbIdWrapped = appRepository.getLastTempTargetIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_temporary_target_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastTtId && dateUtil.now() - lastTtTime < 5000) return false
|
||||
lastTtId = startId
|
||||
lastTtTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementTemporaryTarget(startId).blockingGet()?.let { tt ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading TemporaryTarget data Start: $startId ID: ${tt.first.id} HistoryID: ${tt.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!tt.first.isValid && tt.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!tt.first.isValid && tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", tt.first.interfaceIDs.nightscoutId, DataSyncSelector.PairTemporaryTarget(tt.first, tt.second))
|
||||
// existing without nsId = create new
|
||||
tt.first.isValid && tt.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", tt.first.toJson(profileFunction.getUnits(), dateUtil), DataSyncSelector.PairTemporaryTarget(tt.first, tt.second))
|
||||
// without nsId = create new
|
||||
tt.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", tt.first.toJson(profileFunction.getUnits(), dateUtil), DataSyncSelector.PairTemporaryTarget(tt.first, tt.second), "$startId/$lastDbId")
|
||||
// existing with nsId = update
|
||||
tt.first.isValid && tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", tt.first.interfaceIDs.nightscoutId, tt.first.toJson(profileFunction.getUnits(), dateUtil), DataSyncSelector.PairTemporaryTarget(tt.first, tt.second))
|
||||
tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", tt.first.interfaceIDs.nightscoutId, tt.first.toJson(profileFunction.getUnits(), dateUtil), DataSyncSelector.PairTemporaryTarget(tt.first, tt.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -223,22 +248,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastFoodId = -1L
|
||||
private var lastFoodTime = -1L
|
||||
override fun processChangedFoodsCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_food_last_synced_id, 0)
|
||||
appRepository.getNextSyncElementFood(startId).blockingGet()?.let { tt ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading Food data Start: $startId ID: ${tt.first.id} HistoryID: ${tt.second} ")
|
||||
val lastDbIdWrapped = appRepository.getLastFoodIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_food_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_food_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastFoodId && dateUtil.now() - lastFoodTime < 5000) return false
|
||||
lastFoodId = startId
|
||||
lastFoodTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementFood(startId).blockingGet()?.let { food ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading Food data Start: $startId ID: ${food.first.id} HistoryID: ${food.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!tt.first.isValid && tt.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!tt.first.isValid && tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("food", tt.first.interfaceIDs.nightscoutId, DataSyncSelector.PairFood(tt.first, tt.second))
|
||||
// existing without nsId = create new
|
||||
tt.first.isValid && tt.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("food", tt.first.toJson(), DataSyncSelector.PairFood(tt.first, tt.second))
|
||||
// existing with nsId = update
|
||||
tt.first.isValid && tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("food", tt.first.interfaceIDs.nightscoutId, tt.first.toJson(), DataSyncSelector.PairFood(tt.first, tt.second))
|
||||
// without nsId = create new
|
||||
food.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("food", food.first.toJson(), DataSyncSelector.PairFood(food.first, food.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
food.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("food", food.first.interfaceIDs.nightscoutId, food.first.toJson(), DataSyncSelector.PairFood(food.first, food.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -260,25 +291,35 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastGvId = -1L
|
||||
private var lastGvTime = -1L
|
||||
override fun processChangedGlucoseValuesCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)
|
||||
val lastDbIdWrapped = appRepository.getLastGlucoseValueIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_glucose_value_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastGvId && dateUtil.now() - lastGvTime < 5000) return false
|
||||
lastGvId = startId
|
||||
lastGvTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading GlucoseValue data Start: $startId ID: ${gv.first.id} HistoryID: ${gv.second} ")
|
||||
if (activePlugin.activeBgSource.shouldUploadToNs(gv.first)) {
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!gv.first.isValid && gv.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!gv.first.isValid && gv.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("entries", gv.first.interfaceIDs.nightscoutId, DataSyncSelector.PairGlucoseValue(gv.first, gv.second))
|
||||
// existing without nsId = create new
|
||||
gv.first.isValid && gv.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("entries", gv.first.toJson(dateUtil), DataSyncSelector.PairGlucoseValue(gv.first, gv.second))
|
||||
// existing with nsId = update
|
||||
gv.first.isValid && gv.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("entries", gv.first.interfaceIDs.nightscoutId, gv.first.toJson(dateUtil), DataSyncSelector.PairGlucoseValue(gv.first, gv.second))
|
||||
// without nsId = create new
|
||||
gv.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("entries", gv.first.toJson(dateUtil), DataSyncSelector.PairGlucoseValue(gv.first, gv.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
gv.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("entries", gv.first.interfaceIDs.nightscoutId, gv.first.toJson(dateUtil), DataSyncSelector.PairGlucoseValue(gv.first, gv.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
confirmLastGlucoseValueIdIfGreater(gv.second)
|
||||
lastGvId = -1
|
||||
processChangedGlucoseValuesCompat()
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
@ -299,22 +340,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastTeId = -1L
|
||||
private var lastTeTime = -1L
|
||||
override fun processChangedTherapyEventsCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)
|
||||
appRepository.getNextSyncElementTherapyEvent(startId).blockingGet()?.let { tt ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading TherapyEvents data Start: $startId ID: ${tt.first.id} HistoryID: ${tt.second} ")
|
||||
val lastDbIdWrapped = appRepository.getLastTherapyEventIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_therapy_event_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastTeId && dateUtil.now() - lastTeTime < 5000) return false
|
||||
lastTeId = startId
|
||||
lastTeTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementTherapyEvent(startId).blockingGet()?.let { te ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading TherapyEvents data Start: $startId ID: ${te.first.id} HistoryID: ${te.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!tt.first.isValid && tt.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!tt.first.isValid && tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", tt.first.interfaceIDs.nightscoutId, DataSyncSelector.PairTherapyEvent(tt.first, tt.second))
|
||||
// existing without nsId = create new
|
||||
tt.first.isValid && tt.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", tt.first.toJson(), DataSyncSelector.PairTherapyEvent(tt.first, tt.second))
|
||||
// existing with nsId = update
|
||||
tt.first.isValid && tt.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", tt.first.interfaceIDs.nightscoutId, tt.first.toJson(), DataSyncSelector.PairTherapyEvent(tt.first, tt.second))
|
||||
// without nsId = create new
|
||||
te.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", te.first.toJson(), DataSyncSelector.PairTherapyEvent(te.first, te.second), "$startId/$lastDbId")
|
||||
// nsId = update
|
||||
te.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", te.first.interfaceIDs.nightscoutId, te.first.toJson(), DataSyncSelector.PairTherapyEvent(te.first, te.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -335,14 +382,25 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastDsId = -1L
|
||||
private var lastDsTime = -1L
|
||||
override fun processChangedDeviceStatusesCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)
|
||||
val lastDbIdWrapped = appRepository.getLastDeviceStatusIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_device_status_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastDsId && dateUtil.now() - lastDsTime < 5000) return false
|
||||
lastDsId = startId
|
||||
lastDsTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementDeviceStatus(startId).blockingGet()?.let { deviceStatus ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading DeviceStatus data Start: $startId ID: ${deviceStatus.id}")
|
||||
when {
|
||||
// without nsId = create new
|
||||
deviceStatus.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("devicestatus", deviceStatus.toJson(dateUtil), deviceStatus)
|
||||
nsClientPlugin.nsClientService?.dbAdd("devicestatus", deviceStatus.toJson(dateUtil), deviceStatus, "$startId/$lastDbId")
|
||||
// with nsId = ignore
|
||||
deviceStatus.interfaceIDs.nightscoutId != null -> Any()
|
||||
}
|
||||
|
@ -366,25 +424,37 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastTbrId = -1L
|
||||
private var lastTbrTime = -1L
|
||||
override fun processChangedTemporaryBasalsCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)
|
||||
val useAbsolute = sp.getBoolean(R.string.key_ns_sync_use_absolute, false)
|
||||
val lastDbIdWrapped = appRepository.getLastTemporaryBasalIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastTbrId && dateUtil.now() - lastTbrTime < 5000) return false
|
||||
lastTbrId = startId
|
||||
lastTbrTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementTemporaryBasal(startId).blockingGet()?.let { tb ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading TemporaryBasal data Start: $startId ID: ${tb.first.id} HistoryID: ${tb.second} ")
|
||||
profileFunction.getProfile(tb.first.timestamp)?.let { profile ->
|
||||
val profile = profileFunction.getProfile(tb.first.timestamp)
|
||||
if (profile != null) {
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!tb.first.isValid && tb.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!tb.first.isValid && tb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", tb.first.interfaceIDs.nightscoutId, DataSyncSelector.PairTemporaryBasal(tb.first, tb.second))
|
||||
// existing without nsId = create new
|
||||
tb.first.isValid && tb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", tb.first.toJson(profile, dateUtil), DataSyncSelector.PairTemporaryBasal(tb.first, tb.second))
|
||||
// existing with nsId = update
|
||||
tb.first.isValid && tb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", tb.first.interfaceIDs.nightscoutId, tb.first.toJson(profile, dateUtil), DataSyncSelector.PairTemporaryBasal(tb.first, tb.second))
|
||||
// without nsId = create new
|
||||
tb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", tb.first.toJson(profile, dateUtil, useAbsolute), DataSyncSelector.PairTemporaryBasal(tb.first, tb.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
tb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", tb.first.interfaceIDs.nightscoutId, tb.first.toJson(profile, dateUtil, useAbsolute), DataSyncSelector.PairTemporaryBasal(tb.first, tb.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
confirmLastTemporaryBasalIdIfGreater(tb.second)
|
||||
lastTbrId = -1
|
||||
processChangedTemporaryBasalsCompat()
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
@ -405,25 +475,37 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastEbId = -1L
|
||||
private var lastEbTime = -1L
|
||||
override fun processChangedExtendedBolusesCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)
|
||||
val useAbsolute = sp.getBoolean(R.string.key_ns_sync_use_absolute, false)
|
||||
val lastDbIdWrapped = appRepository.getLastExtendedBolusIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastEbId && dateUtil.now() - lastEbTime < 5000) return false
|
||||
lastEbId = startId
|
||||
lastEbTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementExtendedBolus(startId).blockingGet()?.let { eb ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading ExtendedBolus data Start: $startId ID: ${eb.first.id} HistoryID: ${eb.second} ")
|
||||
profileFunction.getProfile(eb.first.timestamp)?.let { profile ->
|
||||
val profile = profileFunction.getProfile(eb.first.timestamp)
|
||||
if (profile != null) {
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!eb.first.isValid && eb.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!eb.first.isValid && eb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", eb.first.interfaceIDs.nightscoutId, DataSyncSelector.PairExtendedBolus(eb.first, eb.second))
|
||||
// existing without nsId = create new
|
||||
eb.first.isValid && eb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", eb.first.toJson(profile, dateUtil), DataSyncSelector.PairExtendedBolus(eb.first, eb.second))
|
||||
// existing with nsId = update
|
||||
eb.first.isValid && eb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", eb.first.interfaceIDs.nightscoutId, eb.first.toJson(profile, dateUtil), DataSyncSelector.PairExtendedBolus(eb.first, eb.second))
|
||||
// without nsId = create new
|
||||
eb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", eb.first.toJson(profile, dateUtil, useAbsolute), DataSyncSelector.PairExtendedBolus(eb.first, eb.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
eb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", eb.first.interfaceIDs.nightscoutId, eb.first.toJson(profile, dateUtil, useAbsolute), DataSyncSelector.PairExtendedBolus(eb.first, eb.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
confirmLastExtendedBolusIdIfGreater(eb.second)
|
||||
lastEbId = -1
|
||||
processChangedExtendedBolusesCompat()
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
@ -443,22 +525,28 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private var lastPsId = -1L
|
||||
private var lastPsTime = -1L
|
||||
override fun processChangedProfileSwitchesCompat(): Boolean {
|
||||
val startId = sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)
|
||||
appRepository.getNextSyncElementProfileSwitch(startId).blockingGet()?.let { eb ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading ProfileSwitch data Start: $startId ID: ${eb.first.id} HistoryID: ${eb.second} ")
|
||||
val lastDbIdWrapped = appRepository.getLastProfileSwitchIdWrapped().blockingGet()
|
||||
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
|
||||
var startId = sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)
|
||||
if (startId > lastDbId) {
|
||||
sp.putLong(R.string.key_ns_profile_switch_last_synced_id, 0)
|
||||
startId = 0
|
||||
}
|
||||
if (startId == lastPsId && dateUtil.now() - lastPsTime < 5000) return false
|
||||
lastPsId = startId
|
||||
lastPsTime = dateUtil.now()
|
||||
appRepository.getNextSyncElementProfileSwitch(startId).blockingGet()?.let { ps ->
|
||||
aapsLogger.info(LTag.DATABASE, "Loading ProfileSwitch data Start: $startId ID: ${ps.first.id} HistoryID: ${ps.second} ")
|
||||
when {
|
||||
// removed and not uploaded yet = ignore
|
||||
!eb.first.isValid && eb.first.interfaceIDs.nightscoutId == null -> Any()
|
||||
// removed and already uploaded = send for removal
|
||||
!eb.first.isValid && eb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbRemove("treatments", eb.first.interfaceIDs.nightscoutId, DataSyncSelector.PairProfileSwitch(eb.first, eb.second))
|
||||
// existing without nsId = create new
|
||||
eb.first.isValid && eb.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", eb.first.toJson(dateUtil), DataSyncSelector.PairProfileSwitch(eb.first, eb.second))
|
||||
// existing with nsId = update
|
||||
eb.first.isValid && eb.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", eb.first.interfaceIDs.nightscoutId, eb.first.toJson(dateUtil), DataSyncSelector.PairProfileSwitch(eb.first, eb.second))
|
||||
// without nsId = create new
|
||||
ps.first.interfaceIDs.nightscoutId == null ->
|
||||
nsClientPlugin.nsClientService?.dbAdd("treatments", ps.first.toJson(dateUtil), DataSyncSelector.PairProfileSwitch(ps.first, ps.second), "$startId/$lastDbId")
|
||||
// with nsId = update
|
||||
ps.first.interfaceIDs.nightscoutId != null ->
|
||||
nsClientPlugin.nsClientService?.dbUpdate("treatments", ps.first.interfaceIDs.nightscoutId, ps.first.toJson(dateUtil), DataSyncSelector.PairProfileSwitch(ps.first, ps.second), "$startId/$lastDbId")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -476,6 +564,6 @@ class DataSyncSelectorImplementation @Inject constructor(
|
|||
localProfilePlugin.createProfileStore()
|
||||
val profileJson = localProfilePlugin.profile?.data ?: return
|
||||
if (lastChange > lastSync)
|
||||
nsClientPlugin.nsClientService?.dbAdd("profile", profileJson, DataSyncSelector.PairProfileStore(profileJson, dateUtil.now()))
|
||||
nsClientPlugin.nsClientService?.dbAdd("profile", profileJson, DataSyncSelector.PairProfileStore(profileJson, dateUtil.now()), "")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -206,7 +206,7 @@ class NSClientAddAckWorker(
|
|||
.blockingGet()
|
||||
rxBus.send(EventNSClientNewLog("DBADD", "Acked ExtendedBolus " + pair.value.interfaceIDs.nightscoutId))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedTemporaryBasalsCompat()
|
||||
dataSyncSelector.processChangedExtendedBolusesCompat()
|
||||
}
|
||||
|
||||
is PairProfileSwitch -> {
|
||||
|
@ -225,7 +225,7 @@ class NSClientAddAckWorker(
|
|||
.blockingGet()
|
||||
rxBus.send(EventNSClientNewLog("DBADD", "Acked ProfileSwitch " + pair.value.interfaceIDs.nightscoutId))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedTemporaryBasalsCompat()
|
||||
dataSyncSelector.processChangedProfileSwitchesCompat()
|
||||
}
|
||||
|
||||
is DeviceStatus -> {
|
||||
|
|
|
@ -39,7 +39,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairTemporaryTarget -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastTempTargetsIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked TemporaryTarget" + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked TemporaryTarget" + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedTempTargetsCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -48,7 +48,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairGlucoseValue -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastGlucoseValueIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked GlucoseValue " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked GlucoseValue " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedGlucoseValuesCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -57,7 +57,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairFood -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastFoodIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked Food " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked Food " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedFoodsCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -66,7 +66,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairTherapyEvent -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastTherapyEventIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked TherapyEvent " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked TherapyEvent " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedTherapyEventsCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -75,7 +75,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairBolus -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastBolusIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked Bolus " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked Bolus " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedBolusesCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -84,7 +84,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairCarbs -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastCarbsIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked Carbs " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked Carbs " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedCarbsCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -93,7 +93,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairBolusCalculatorResult -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastBolusCalculatorResultsIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked BolusCalculatorResult " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked BolusCalculatorResult " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedBolusCalculatorResultsCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -102,7 +102,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairTemporaryBasal -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastTemporaryBasalIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked TemporaryBasal " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked TemporaryBasal " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedTemporaryBasalsCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -111,7 +111,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairExtendedBolus -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastExtendedBolusIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked ExtendedBolus " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked ExtendedBolus " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedExtendedBolusesCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
@ -120,7 +120,7 @@ class NSClientUpdateRemoveAckWorker(
|
|||
is PairProfileSwitch -> {
|
||||
val pair = ack.originalObject
|
||||
dataSyncSelector.confirmLastProfileSwitchIdIfGreater(pair.updateRecordId)
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked ProfileSwitch " + ack._id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked ProfileSwitch " + ack._id))
|
||||
// Send new if waiting
|
||||
dataSyncSelector.processChangedProfileSwitchesCompat()
|
||||
ret = Result.success(workDataOf("ProcessedData" to pair.toString()))
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.general.nsclient.services
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.*
|
||||
import androidx.work.OneTimeWorkRequest
|
||||
|
@ -83,6 +85,7 @@ class NSClientService : DaggerService() {
|
|||
@Inject lateinit var repository: AppRepository
|
||||
|
||||
companion object {
|
||||
|
||||
private const val WATCHDOG_INTERVAL_MINUTES = 2
|
||||
private const val WATCHDOG_RECONNECT_IN = 15
|
||||
private const val WATCHDOG_MAX_CONNECTIONS = 5
|
||||
|
@ -90,7 +93,7 @@ class NSClientService : DaggerService() {
|
|||
|
||||
private val disposable = CompositeDisposable()
|
||||
|
||||
// public PowerManager.WakeLock mWakeLock;
|
||||
private var wakeLock: PowerManager.WakeLock? = null
|
||||
private val binder: IBinder = LocalBinder()
|
||||
private var handler: Handler? = null
|
||||
private var socket: Socket? = null
|
||||
|
@ -108,11 +111,12 @@ class NSClientService : DaggerService() {
|
|||
var hasWriteAuth = false
|
||||
var nsURL = ""
|
||||
var latestDateInReceivedData: Long = 0
|
||||
|
||||
@SuppressLint("WakelockTimeout")
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
// PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||
// mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidAPS:NSClientService");
|
||||
// mWakeLock.acquire();
|
||||
wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidAPS:NSClientService")
|
||||
wakeLock?.acquire()
|
||||
initialize()
|
||||
disposable.add(rxBus
|
||||
.toObservable(EventConfigBuilderChange::class.java)
|
||||
|
@ -175,7 +179,7 @@ class NSClientService : DaggerService() {
|
|||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
disposable.clear()
|
||||
// if (mWakeLock.isHeld()) mWakeLock.release();
|
||||
if (wakeLock?.isHeld == true) wakeLock?.release()
|
||||
}
|
||||
|
||||
private fun processAddAck(ack: NSAddAck) {
|
||||
|
@ -449,10 +453,10 @@ class NSClientService : DaggerService() {
|
|||
}
|
||||
private val onDataUpdate = Emitter.Listener { args ->
|
||||
handler?.post {
|
||||
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
||||
val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
||||
"AndroidAPS:NSClientService_onDataUpdate")
|
||||
wakeLock.acquire(3000)
|
||||
// val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
||||
// val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
||||
// "AndroidAPS:NSClientService_onDataUpdate")
|
||||
// wakeLock.acquire(3000)
|
||||
try {
|
||||
val data = args[0] as JSONObject
|
||||
try {
|
||||
|
@ -585,12 +589,12 @@ class NSClientService : DaggerService() {
|
|||
}
|
||||
//rxBus.send(new EventNSClientNewLog("NSCLIENT", "onDataUpdate end");
|
||||
} finally {
|
||||
if (wakeLock.isHeld) wakeLock.release()
|
||||
// if (wakeLock.isHeld) wakeLock.release()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun dbUpdate(collection: String, _id: String?, data: JSONObject?, originalObject: Any) {
|
||||
fun dbUpdate(collection: String, _id: String?, data: JSONObject?, originalObject: Any, progress: String) {
|
||||
try {
|
||||
if (_id == null) return
|
||||
if (!isConnected || !hasWriteAuth) return
|
||||
|
@ -599,34 +603,20 @@ class NSClientService : DaggerService() {
|
|||
message.put("_id", _id)
|
||||
message.put("data", data)
|
||||
socket?.emit("dbUpdate", message, NSUpdateAck("dbUpdate", _id, aapsLogger, rxBus, originalObject))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE $collection", "Sent " + originalObject.javaClass.simpleName + " " + _id))
|
||||
rxBus.send(EventNSClientNewLog("DBUPDATE $collection", "Sent " + originalObject.javaClass.simpleName + " " + _id + " " + progress))
|
||||
} catch (e: JSONException) {
|
||||
aapsLogger.error("Unhandled exception", e)
|
||||
}
|
||||
}
|
||||
|
||||
fun dbRemove(collection: String, _id: String?, originalObject: Any) {
|
||||
try {
|
||||
if (_id == null) return
|
||||
if (!isConnected || !hasWriteAuth) return
|
||||
val message = JSONObject()
|
||||
message.put("collection", collection)
|
||||
message.put("_id", _id)
|
||||
socket?.emit("dbRemove", message, NSUpdateAck("dbRemove", _id, aapsLogger, rxBus, originalObject))
|
||||
rxBus.send(EventNSClientNewLog("DBREMOVE $collection", "Sent " + originalObject.javaClass.simpleName + " " + _id))
|
||||
} catch (e: JSONException) {
|
||||
aapsLogger.error("Unhandled exception", e)
|
||||
}
|
||||
}
|
||||
|
||||
fun dbAdd(collection: String, data: JSONObject, originalObject: Any) {
|
||||
fun dbAdd(collection: String, data: JSONObject, originalObject: Any, progress: String) {
|
||||
try {
|
||||
if (!isConnected || !hasWriteAuth) return
|
||||
val message = JSONObject()
|
||||
message.put("collection", collection)
|
||||
message.put("data", data)
|
||||
socket?.emit("dbAdd", message, NSAddAck(aapsLogger, rxBus, originalObject))
|
||||
rxBus.send(EventNSClientNewLog("DBADD $collection", "Sent " + originalObject.javaClass.simpleName + " " + data))
|
||||
rxBus.send(EventNSClientNewLog("DBADD $collection", "Sent " + originalObject.javaClass.simpleName + " " + data + " " + progress))
|
||||
} catch (e: JSONException) {
|
||||
aapsLogger.error("Unhandled exception", e)
|
||||
}
|
||||
|
@ -646,16 +636,16 @@ class NSClientService : DaggerService() {
|
|||
aapsLogger.debug(LTag.NSCLIENT, "Skipping resend by lastAckTime: " + (System.currentTimeMillis() - lastAckTime) / 1000L + " sec")
|
||||
return@post
|
||||
}
|
||||
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
||||
val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
||||
"AndroidAPS:NSClientService_onDataUpdate")
|
||||
wakeLock.acquire(mins(10).msecs())
|
||||
// val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
||||
// val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
||||
// "AndroidAPS:NSClientService_onDataUpdate")
|
||||
// wakeLock.acquire(mins(10).msecs())
|
||||
try {
|
||||
rxBus.send(EventNSClientNewLog("QUEUE", "Resend started: $reason"))
|
||||
dataSyncSelector.doUpload()
|
||||
rxBus.send(EventNSClientNewLog("QUEUE", "Resend ended: $reason"))
|
||||
} finally {
|
||||
if (wakeLock.isHeld) wakeLock.release()
|
||||
// if (wakeLock.isHeld) wakeLock.release()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -413,7 +413,7 @@ class LocalProfilePlugin @Inject constructor(
|
|||
if (sp.getBoolean(R.string.key_ns_receive_profile_store, false) || config.NSCLIENT) {
|
||||
localProfilePlugin.loadFromStore(ProfileStore(injector, profileJson, dateUtil))
|
||||
aapsLogger.debug(LTag.PROFILE, "Received profileStore: $profileJson")
|
||||
return Result.success(workDataOf("Data" to profileJson.toString()))
|
||||
return Result.success(workDataOf("Data" to profileJson.toString().substring(1..5000)))
|
||||
}
|
||||
return Result.success()
|
||||
}
|
||||
|
|
|
@ -155,7 +155,8 @@ open class VirtualPumpPlugin @Inject constructor(
|
|||
}
|
||||
|
||||
override fun isThisProfileSet(profile: Profile): Boolean {
|
||||
return true
|
||||
val running = pumpSync.expectedPumpState().profile
|
||||
return running?.isEqual(profile) ?: false
|
||||
}
|
||||
|
||||
override fun lastDataTime(): Long {
|
||||
|
|
|
@ -158,14 +158,14 @@ class DexcomPlugin @Inject constructor(
|
|||
}
|
||||
result.sensorInsertionsInserted.forEach {
|
||||
uel.log(Action.CAREPORTAL,
|
||||
Sources.BG,
|
||||
Sources.Dexcom,
|
||||
ValueWithUnit.Timestamp(it.timestamp),
|
||||
ValueWithUnit.TherapyEventType(it.type))
|
||||
aapsLogger.debug(LTag.DATABASE, "Inserted sensor insertion $it")
|
||||
}
|
||||
result.calibrationsInserted.forEach {
|
||||
uel.log(Action.CAREPORTAL,
|
||||
Sources.BG,
|
||||
Sources.Dexcom,
|
||||
ValueWithUnit.Timestamp(it.timestamp),
|
||||
ValueWithUnit.TherapyEventType(it.type))
|
||||
aapsLogger.debug(LTag.DATABASE, "Inserted calibration $it")
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/overview_loop"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
|
|
@ -10,6 +10,8 @@ import info.nightscout.androidaps.danar.DanaRPlugin
|
|||
import info.nightscout.androidaps.danars.DanaRSPlugin
|
||||
import info.nightscout.androidaps.data.PumpEnactResult
|
||||
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.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
||||
|
@ -51,7 +53,7 @@ import java.util.*
|
|||
ConstraintChecker::class, SP::class, Context::class,
|
||||
OpenAPSAMAPlugin::class, OpenAPSSMBPlugin::class, TreatmentsPlugin::class, TreatmentService::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() {
|
||||
|
||||
@Mock lateinit var activePlugin: ActivePlugin
|
||||
|
@ -68,9 +70,10 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
@Mock lateinit var databaseHelper: DatabaseHelperInterface
|
||||
@Mock lateinit var repository: AppRepository
|
||||
@Mock lateinit var pumpSync: PumpSync
|
||||
@Mock lateinit var insightDatabaseDao: InsightDatabaseDao
|
||||
|
||||
private lateinit var danaPump: DanaPump
|
||||
|
||||
private lateinit var insightDbHelper: InsightDbHelper
|
||||
private lateinit var constraintChecker: ConstraintChecker
|
||||
private lateinit var safetyPlugin: SafetyPlugin
|
||||
private lateinit var objectivesPlugin: ObjectivesPlugin
|
||||
|
@ -134,14 +137,14 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
|
||||
val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculator = iobCobCalculator, dateUtil = dateUtil)
|
||||
|
||||
|
||||
insightDbHelper = InsightDbHelper(insightDatabaseDao)
|
||||
danaPump = DanaPump(aapsLogger, sp, dateUtil, injector)
|
||||
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, repository)
|
||||
objectivesPlugin = ObjectivesPlugin(injector, aapsLogger, resourceHelper, activePlugin, sp, ConfigImpl(), dateUtil, uel)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
|
|
|
@ -145,6 +145,18 @@ sealed class ProfileSealed(
|
|||
override val timeshift: Int
|
||||
get() = ts
|
||||
|
||||
override fun isEqual(profile: Profile): Boolean {
|
||||
for (hour in 0..23) {
|
||||
val seconds = T.hours(hour.toLong()).secs().toInt()
|
||||
if (getBasalTimeFromMidnight(seconds) != profile.getBasalTimeFromMidnight(seconds)) return false
|
||||
if (getIsfMgdlTimeFromMidnight(seconds) != profile.getIsfMgdlTimeFromMidnight(seconds)) return false
|
||||
if (getIcTimeFromMidnight(seconds) != profile.getIcTimeFromMidnight(seconds)) return false
|
||||
if (getTargetLowMgdlTimeFromMidnight(seconds) != profile.getTargetLowMgdlTimeFromMidnight(seconds)) return false
|
||||
if (getTargetHighMgdlTimeFromMidnight(seconds) != profile.getTargetHighMgdlTimeFromMidnight(seconds)) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override val percentage: Int
|
||||
get() = pct
|
||||
|
||||
|
|
|
@ -50,10 +50,10 @@ fun ExtendedBolus.toTemporaryBasal(profile: Profile): TemporaryBasal =
|
|||
type = TemporaryBasal.Type.FAKE_EXTENDED
|
||||
)
|
||||
|
||||
fun ExtendedBolus.toJson(profile: Profile, dateUtil: DateUtil): JSONObject =
|
||||
fun ExtendedBolus.toJson(profile: Profile, dateUtil: DateUtil, useAbsolute: Boolean): JSONObject =
|
||||
if (isEmulatingTempBasal)
|
||||
toTemporaryBasal(profile)
|
||||
.toJson(profile, dateUtil)
|
||||
.toJson(profile, dateUtil, useAbsolute)
|
||||
.put("extendedEmulated", toRealJson(dateUtil))
|
||||
else toRealJson(dateUtil)
|
||||
|
||||
|
|
|
@ -25,8 +25,8 @@ fun ProfileSwitch.toJson(dateUtil: DateUtil): JSONObject =
|
|||
.put("duration", T.msecs(duration).mins())
|
||||
.put("profile", getCustomizedName())
|
||||
.put("profileJson", ProfileSealed.PS(this).toPureNsJson(dateUtil).toString())
|
||||
.put("timeshift", T.msecs(timeshift).hours())
|
||||
.put("percentage", percentage)
|
||||
.put("timeshift", 0)
|
||||
.put("percentage", 100) // customization already applied to json
|
||||
.also {
|
||||
if (interfaceIDs.pumpId != null) it.put("pumpId", interfaceIDs.pumpId)
|
||||
if (interfaceIDs.pumpType != null) it.put("pumpType", interfaceIDs.pumpType!!.name)
|
||||
|
|
|
@ -62,7 +62,7 @@ fun TemporaryBasal.toStringFull(profile: Profile, dateUtil: DateUtil): String {
|
|||
}
|
||||
}
|
||||
|
||||
fun TemporaryBasal.toJson(profile: Profile, dateUtil: DateUtil): JSONObject =
|
||||
fun TemporaryBasal.toJson(profile: Profile, dateUtil: DateUtil, useAbsolute: Boolean): JSONObject =
|
||||
JSONObject()
|
||||
.put("created_at", dateUtil.toISOString(timestamp))
|
||||
.put("enteredBy", "openaps://" + "AndroidAPS")
|
||||
|
@ -71,7 +71,7 @@ fun TemporaryBasal.toJson(profile: Profile, dateUtil: DateUtil): JSONObject =
|
|||
.put("rate", rate)
|
||||
.put("type", type.name)
|
||||
.also {
|
||||
if (isAbsolute) it.put("absolute", rate)
|
||||
if (useAbsolute) it.put("absolute", convertedToAbsolute(timestamp, profile))
|
||||
else it.put("percent", convertedToPercent(timestamp, profile) - 100)
|
||||
if (interfaceIDs.pumpId != null) it.put("pumpId", interfaceIDs.pumpId)
|
||||
if (interfaceIDs.endId != null) it.put("endId", interfaceIDs.endId)
|
||||
|
|
|
@ -7,9 +7,6 @@ interface DatabaseHelperInterface {
|
|||
fun resetDatabases()
|
||||
|
||||
fun createOrUpdate(record: OmnipodHistoryRecord)
|
||||
fun createOrUpdate(record: InsightBolusID)
|
||||
fun createOrUpdate(record: InsightPumpID)
|
||||
fun createOrUpdate(record: InsightHistoryOffset)
|
||||
fun createOrUpdate(record: OHQueueItem)
|
||||
fun delete(extendedBolus: ExtendedBolus)
|
||||
fun createOrUpdate(tempBasal: TemporaryBasal): Boolean
|
||||
|
@ -24,18 +21,9 @@ interface DatabaseHelperInterface {
|
|||
fun getAllOHQueueItems(maxEntries: Long): List<OHQueueItem>
|
||||
|
||||
// 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 clearOpenHumansQueue()
|
||||
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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,11 @@ interface Profile {
|
|||
*/
|
||||
val timeshift: Int
|
||||
|
||||
/**
|
||||
* is equal to another profile?
|
||||
*/
|
||||
fun isEqual(profile: Profile): Boolean
|
||||
|
||||
/**
|
||||
* Basal value according to "now"
|
||||
*/
|
||||
|
|
|
@ -203,7 +203,7 @@ class PumpSyncImplementation @Inject constructor(
|
|||
timestamp = timestamp,
|
||||
type = type.toDBbEventType(),
|
||||
duration = 0,
|
||||
note = null,
|
||||
note = note,
|
||||
enteredBy = "AndroidAPS",
|
||||
glucose = null,
|
||||
glucoseType = null,
|
||||
|
|
|
@ -152,7 +152,7 @@ class UserEntryPresentationHelper @Inject constructor(
|
|||
csvString(R.string.eventtype),
|
||||
csvString(R.string.ue_source),
|
||||
csvString(R.string.careportal_note),
|
||||
csvString(R.string.ue_formated_string),
|
||||
csvString(R.string.ue_string),
|
||||
csvString(R.string.event_time_label),
|
||||
csvString(if (profileFunction.getUnits() == GlucoseUnit.MGDL) R.string.mgdl else R.string.mmol),
|
||||
csvString(R.string.shortgram),
|
||||
|
@ -165,15 +165,15 @@ class UserEntryPresentationHelper @Inject constructor(
|
|||
) + "\n"
|
||||
|
||||
private fun getCsvEntry(entry: UserEntry): String {
|
||||
val fullvalueWithUnitList = ArrayList<ValueWithUnit?>(entry.values)
|
||||
var timestampRec = "" + entry.timestamp
|
||||
var dateTimestampRev = dateUtil.dateAndTimeAndSecondsString(entry.timestamp)
|
||||
var utcOffset = dateUtil.timeStringFromSeconds((entry.utcOffset/1000).toInt())
|
||||
var action = csvString(entry.action)
|
||||
val fullvalueWithUnitList = ArrayList(entry.values)
|
||||
val timestampRec = entry.timestamp.toString()
|
||||
val dateTimestampRev = dateUtil.dateAndTimeAndSecondsString(entry.timestamp)
|
||||
val utcOffset = dateUtil.timeStringFromSeconds((entry.utcOffset/1000).toInt())
|
||||
val action = csvString(entry.action)
|
||||
var therapyEvent = ""
|
||||
var source = translator.translate(entry.source)
|
||||
var note = csvString(entry.note)
|
||||
var stringResource = ""
|
||||
val source = translator.translate(entry.source)
|
||||
val note = csvString(entry.note)
|
||||
var simpleString = ""
|
||||
var timestamp = ""
|
||||
var bg = ""
|
||||
var gram = ""
|
||||
|
@ -182,7 +182,7 @@ class UserEntryPresentationHelper @Inject constructor(
|
|||
var percent = ""
|
||||
var hour = ""
|
||||
var minute = ""
|
||||
var other = ""
|
||||
var noUnit = ""
|
||||
|
||||
for (valueWithUnit in fullvalueWithUnitList.filterNotNull()) {
|
||||
when (valueWithUnit) {
|
||||
|
@ -192,8 +192,8 @@ class UserEntryPresentationHelper @Inject constructor(
|
|||
is ValueWithUnit.Percent -> percent = valueWithUnit.value.toString()
|
||||
is ValueWithUnit.Insulin -> insulin = DecimalFormatter.to2Decimal(valueWithUnit.value)
|
||||
is ValueWithUnit.UnitPerHour -> unitPerHour = DecimalFormatter.to2Decimal(valueWithUnit.value)
|
||||
is ValueWithUnit.SimpleInt -> other = other.addWithSeparator(valueWithUnit.value)
|
||||
is ValueWithUnit.SimpleString -> other = other.addWithSeparator(valueWithUnit.value)
|
||||
is ValueWithUnit.SimpleInt -> noUnit = noUnit.addWithSeparator(valueWithUnit.value)
|
||||
is ValueWithUnit.SimpleString -> simpleString = simpleString.addWithSeparator(valueWithUnit.value)
|
||||
is ValueWithUnit.TherapyEventMeterType -> therapyEvent = therapyEvent.addWithSeparator(translator.translate(valueWithUnit.value))
|
||||
is ValueWithUnit.TherapyEventTTReason -> therapyEvent = therapyEvent.addWithSeparator(translator.translate(valueWithUnit.value))
|
||||
is ValueWithUnit.TherapyEventType -> therapyEvent = therapyEvent.addWithSeparator(translator.translate(valueWithUnit.value))
|
||||
|
@ -210,9 +210,9 @@ class UserEntryPresentationHelper @Inject constructor(
|
|||
}
|
||||
|
||||
therapyEvent = csvString(therapyEvent)
|
||||
stringResource = csvString(stringResource)
|
||||
other = csvString(other)
|
||||
return "$timestampRec;$dateTimestampRev;$utcOffset;$action;$therapyEvent;$source;$note;$stringResource;$timestamp;$bg;$gram;$insulin;$unitPerHour;$percent;$hour;$minute;$other"
|
||||
simpleString = csvString(simpleString)
|
||||
noUnit = csvString(noUnit)
|
||||
return "$timestampRec;$dateTimestampRev;$utcOffset;$action;$therapyEvent;$source;$note;$simpleString;$timestamp;$bg;$gram;$insulin;$unitPerHour;$percent;$hour;$minute;$noUnit"
|
||||
}
|
||||
|
||||
private fun csvString(action: Action): String = "\"" + translator.translate(action).replace("\"", "\"\"").replace("\n"," / ") + "\""
|
||||
|
|
|
@ -413,7 +413,7 @@
|
|||
<string name="uel_carbs">CARBS</string>
|
||||
<string name="uel_extended_carbs">EXTENDED CARBS</string>
|
||||
<string name="uel_temp_basal">TEMP BASAL</string>
|
||||
<string name="uel_tt">TT</string>
|
||||
<string name="uel_tt">TEMP TARGET</string>
|
||||
<string name="uel_new_profile">NEW PROFILE</string>
|
||||
<string name="uel_clone_profile">CLONE PROFILE</string>
|
||||
<string name="uel_store_profile">STORE PROFILE</string>
|
||||
|
@ -434,7 +434,7 @@
|
|||
<string name="uel_cancel_temp_basal">CANCEL TEMP BASAL</string>
|
||||
<string name="uel_cancel_bolus">CANCEL BOLUS</string>
|
||||
<string name="uel_cancel_extended_bolus">CANCEL EXTENDED BOLUS</string>
|
||||
<string name="uel_cancel_tt">CANCEL TT</string>
|
||||
<string name="uel_cancel_tt">CANCEL TEMP TARGET</string>
|
||||
<string name="uel_careportal">CAREPORTAL</string>
|
||||
<string name="uel_site_change">SITE CHANGE</string>
|
||||
<string name="uel_reservoir_change">RESERVOIR CHANGE</string>
|
||||
|
@ -444,7 +444,7 @@
|
|||
<string name="uel_careportal_ns_refresh">CAREPORTAL NS REFRESH</string>
|
||||
<string name="uel_profile_switch_ns_refresh">PROFILE SWITCH NS REFRESH</string>
|
||||
<string name="uel_treatments_ns_refresh">TREATMENTS NS REFRESH</string>
|
||||
<string name="uel_tt_ns_refresh">TT NS REFRESH</string>
|
||||
<string name="uel_tt_ns_refresh">TEMP TARGET NS REFRESH</string>
|
||||
<string name="uel_automation_removed">AUTOMATION REMOVED</string>
|
||||
<string name="uel_bg_removed">BG REMOVED</string>
|
||||
<string name="uel_careportal_removed">CAREPORTAL REMOVED</string>
|
||||
|
@ -458,7 +458,7 @@
|
|||
<string name="uel_profile_switch_removed">PROFILE SWITCH REMOVED</string>
|
||||
<string name="uel_restart_events_removed">RESTART EVENTS REMOVED</string>
|
||||
<string name="uel_treatment_removed">TREATMENT REMOVED</string>
|
||||
<string name="uel_tt_removed">TT REMOVED</string>
|
||||
<string name="uel_tt_removed">TEMP TARGET REMOVED</string>
|
||||
<string name="uel_ns_paused">NS PAUSED</string>
|
||||
<string name="uel_ns_resume">NS RESUME</string>
|
||||
<string name="uel_ns_queue_cleared">NS QUEUE CLEARED</string>
|
||||
|
@ -486,7 +486,7 @@
|
|||
<string name="uel_plugin_enabled">PLUGIN ENABLED</string>
|
||||
<string name="uel_plugin_disabled">PLUGIN DISABLED</string>
|
||||
<string name="uel_unknown">UNKNOWN</string>
|
||||
<string name="ue_formated_string">Formated string</string>
|
||||
<string name="ue_string">String</string>
|
||||
<string name="ue_source">Source</string>
|
||||
<string name="ue_utc_offset">UTC Offset</string>
|
||||
<string name="ue_action">Action</string>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -6,7 +6,7 @@ import androidx.room.TypeConverters
|
|||
import info.nightscout.androidaps.database.daos.*
|
||||
import info.nightscout.androidaps.database.entities.*
|
||||
|
||||
const val DATABASE_VERSION = 18
|
||||
const val DATABASE_VERSION = 20
|
||||
|
||||
@Database(version = DATABASE_VERSION,
|
||||
entities = [APSResult::class, Bolus::class, BolusCalculatorResult::class, Carbs::class,
|
||||
|
|
|
@ -78,6 +78,11 @@ open class AppRepository @Inject internal constructor(
|
|||
database.glucoseValueDao.getModifiedFrom(lastId)
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
||||
fun getLastGlucoseValueIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.glucoseValueDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
* The update id might either be the entry id itself if it is a new entry - or the id
|
||||
|
@ -151,6 +156,11 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllTempTargetEntries() =
|
||||
database.temporaryTargetDao.deleteAllEntries()
|
||||
|
||||
fun getLastTempTargetIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.temporaryTargetDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// USER ENTRY
|
||||
fun getAllUserEntries(): Single<List<UserEntry>> =
|
||||
database.userEntryDao.getAll()
|
||||
|
@ -217,6 +227,11 @@ open class AppRepository @Inject internal constructor(
|
|||
.map { if (!ascending) it.reversed() else it }
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
||||
fun getLastProfileSwitchIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.profileSwitchDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// EFFECTIVE PROFILE SWITCH
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -267,6 +282,11 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllEffectiveProfileSwitches() =
|
||||
database.effectiveProfileSwitchDao.deleteAllEntries()
|
||||
|
||||
fun getLastEffectiveProfileSwitchIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.effectiveProfileSwitchDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// THERAPY EVENT
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -329,6 +349,11 @@ open class AppRepository @Inject internal constructor(
|
|||
database.therapyEventDao.compatGetTherapyEventDataFromToTime(from, to)
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
||||
fun getLastTherapyEventIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.therapyEventDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// FOOD
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -360,6 +385,11 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllFoods() =
|
||||
database.foodDao.deleteAllEntries()
|
||||
|
||||
fun getLastFoodIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.foodDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// BOLUS
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -421,6 +451,10 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllBoluses() =
|
||||
database.bolusDao.deleteAllEntries()
|
||||
|
||||
fun getLastBolusIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.bolusDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
// CARBS
|
||||
|
||||
private fun expandCarbs(carbs: Carbs): List<Carbs> =
|
||||
|
@ -529,6 +563,11 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllCarbs() =
|
||||
database.carbsDao.deleteAllEntries()
|
||||
|
||||
fun getLastCarbsIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.carbsDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// BOLUS CALCULATOR RESULT
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -566,6 +605,11 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllBolusCalculatorResults() =
|
||||
database.bolusCalculatorResultDao.deleteAllEntries()
|
||||
|
||||
fun getLastBolusCalculatorResultIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.bolusCalculatorResultDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// DEVICE STATUS
|
||||
fun insert(deviceStatus: DeviceStatus): Long =
|
||||
database.deviceStatusDao.insert(deviceStatus)
|
||||
|
@ -586,6 +630,11 @@ open class AppRepository @Inject internal constructor(
|
|||
database.deviceStatusDao.getModifiedFrom(lastId)
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
||||
fun getLastDeviceStatusIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.deviceStatusDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// TEMPORARY BASAL
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -643,6 +692,11 @@ open class AppRepository @Inject internal constructor(
|
|||
fun getOldestTemporaryBasalRecord(): TemporaryBasal? =
|
||||
database.temporaryBasalDao.getOldestRecord()
|
||||
|
||||
fun getLastTemporaryBasalIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.temporaryBasalDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
|
||||
// EXTENDED BOLUS
|
||||
/*
|
||||
* returns a Pair of the next entity to sync and the ID of the "update".
|
||||
|
@ -707,6 +761,10 @@ open class AppRepository @Inject internal constructor(
|
|||
.map { if (!ascending) it.reversed() else it }
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
||||
fun getLastExtendedBolusIdWrapped(): Single<ValueWrapper<Long>> =
|
||||
database.extendedBolusDao.getLastId()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.toWrappedSingle()
|
||||
}
|
||||
|
||||
@Suppress("USELESS_CAST")
|
||||
|
|
|
@ -18,6 +18,9 @@ internal interface BolusCalculatorResultDao : TraceableDao<BolusCalculatorResult
|
|||
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_BOLUS_CALCULATOR_RESULTS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_BOLUS_CALCULATOR_RESULTS WHERE isValid = 1 AND timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
||||
fun getBolusCalculatorResultsFromTime(timestamp: Long): Single<List<BolusCalculatorResult>>
|
||||
|
||||
|
|
|
@ -18,6 +18,9 @@ internal interface BolusDao : TraceableDao<Bolus> {
|
|||
@Query("DELETE FROM $TABLE_BOLUSES")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_BOLUSES ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp = :timestamp AND referenceId IS NULL")
|
||||
fun findByTimestamp(timestamp: Long): Bolus?
|
||||
|
||||
|
|
|
@ -17,6 +17,9 @@ internal interface CarbsDao : TraceableDao<Carbs> {
|
|||
@Query("DELETE FROM $TABLE_CARBS")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_CARBS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_CARBS WHERE nightscoutId = :nsId AND referenceId IS NULL")
|
||||
fun findByNSId(nsId: String): Carbs?
|
||||
|
||||
|
|
|
@ -25,6 +25,9 @@ internal interface DeviceStatusDao {
|
|||
@Query("DELETE FROM $TABLE_DEVICE_STATUS")
|
||||
fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_DEVICE_STATUS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("DELETE FROM $TABLE_DEVICE_STATUS WHERE id NOT IN (SELECT MAX(id) FROM $TABLE_DEVICE_STATUS)")
|
||||
fun deleteAllEntriesExceptLast()
|
||||
|
||||
|
|
|
@ -17,6 +17,9 @@ internal interface EffectiveProfileSwitchDao : TraceableDao<EffectiveProfileSwit
|
|||
@Query("DELETE FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES WHERE isValid = 1 AND referenceId IS NULL ORDER BY id ASC LIMIT 1")
|
||||
fun getOldestEffectiveProfileSwitchRecord(): EffectiveProfileSwitch?
|
||||
|
||||
|
|
|
@ -18,6 +18,9 @@ internal interface ExtendedBolusDao : TraceableDao<ExtendedBolus> {
|
|||
@Query("DELETE FROM $TABLE_EXTENDED_BOLUSES")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_EXTENDED_BOLUSES ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE timestamp = :timestamp AND referenceId IS NULL")
|
||||
fun findByTimestamp(timestamp: Long): ExtendedBolus?
|
||||
|
||||
|
|
|
@ -17,6 +17,9 @@ internal interface FoodDao : TraceableDao<Food> {
|
|||
@Query("DELETE FROM $TABLE_FOODS")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_FOODS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_FOODS WHERE nightscoutId = :nsId AND referenceId IS NULL")
|
||||
fun findByNSId(nsId: String): Food?
|
||||
|
||||
|
|
|
@ -16,6 +16,9 @@ internal interface GlucoseValueDao : TraceableDao<GlucoseValue> {
|
|||
@Query("DELETE FROM $TABLE_GLUCOSE_VALUES")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_GLUCOSE_VALUES ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE nightscoutId = :nsId AND referenceId IS NULL")
|
||||
fun findByNSIdMaybe(nsId: String): Maybe<GlucoseValue>
|
||||
|
||||
|
|
|
@ -19,6 +19,9 @@ internal interface ProfileSwitchDao : ProfileSwitchDaoWorkaround {
|
|||
@Query("DELETE FROM $TABLE_PROFILE_SWITCHES")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_PROFILE_SWITCHES ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_PROFILE_SWITCHES WHERE timestamp = :timestamp AND referenceId IS NULL")
|
||||
fun findByTimestamp(timestamp: Long): ProfileSwitch?
|
||||
|
||||
|
|
|
@ -18,6 +18,9 @@ internal interface TemporaryBasalDao : TraceableDao<TemporaryBasal> {
|
|||
@Query("DELETE FROM $TABLE_TEMPORARY_BASALS")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_TEMPORARY_BASALS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE temporaryId = :temporaryId")
|
||||
fun findByTempId(temporaryId: Long): TemporaryBasal?
|
||||
|
||||
|
|
|
@ -17,6 +17,9 @@ internal interface TemporaryTargetDao : TraceableDao<TemporaryTarget> {
|
|||
@Query("DELETE FROM $TABLE_TEMPORARY_TARGETS")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_TEMPORARY_TARGETS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE nightscoutId = :nsId AND referenceId IS NULL")
|
||||
fun findByNSId(nsId: String): TemporaryTarget?
|
||||
|
||||
|
|
|
@ -16,6 +16,9 @@ internal interface TherapyEventDao : TraceableDao<TherapyEvent> {
|
|||
@Query("DELETE FROM $TABLE_THERAPY_EVENTS")
|
||||
override fun deleteAllEntries()
|
||||
|
||||
@Query("SELECT id FROM $TABLE_THERAPY_EVENTS ORDER BY id DESC limit 1")
|
||||
fun getLastId(): Maybe<Long>
|
||||
|
||||
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE type = :type AND timestamp = :timestamp AND referenceId IS NULL")
|
||||
fun findByTimestamp(type: TherapyEvent.Type, timestamp: Long): TherapyEvent?
|
||||
|
||||
|
|
|
@ -18,7 +18,16 @@ import java.util.*
|
|||
entity = Bolus::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("isValid"),
|
||||
Index("temporaryId"),
|
||||
Index("pumpId"),
|
||||
Index("pumpSerial"),
|
||||
Index("pumpType"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class Bolus(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -12,7 +12,12 @@ import java.util.TimeZone
|
|||
entity = BolusCalculatorResult::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("referenceId"),
|
||||
Index("timestamp"),
|
||||
Index("id"),
|
||||
Index("isValid")
|
||||
])
|
||||
data class BolusCalculatorResult(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -16,7 +16,13 @@ import java.util.*
|
|||
entity = Carbs::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("isValid"),
|
||||
Index("nightscoutId"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class Carbs(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -11,7 +11,11 @@ import java.util.*
|
|||
|
||||
@Entity(tableName = TABLE_DEVICE_STATUS,
|
||||
foreignKeys = [],
|
||||
indices = [Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("nightscoutId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class DeviceStatus(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
var id: Long = 0,
|
||||
|
|
|
@ -19,7 +19,12 @@ import java.util.*
|
|||
entity = EffectiveProfileSwitch::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp"),
|
||||
Index("isValid")
|
||||
])
|
||||
data class EffectiveProfileSwitch(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -16,7 +16,16 @@ import java.util.*
|
|||
entity = ExtendedBolus::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("isValid"),
|
||||
Index("endId"),
|
||||
Index("pumpSerial"),
|
||||
Index("pumpId"),
|
||||
Index("pumpType"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class ExtendedBolus(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -14,7 +14,12 @@ import info.nightscout.androidaps.database.interfaces.TraceableDBEntry
|
|||
entity = Food::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("nightscoutId"),
|
||||
Index("referenceId"),
|
||||
Index("isValid")
|
||||
])
|
||||
data class Food(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -13,7 +13,13 @@ import java.util.TimeZone
|
|||
entity = GlucoseValue::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("nightscoutId"),
|
||||
Index("sourceSensor"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class GlucoseValue(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -19,7 +19,13 @@ import java.util.*
|
|||
entity = ProfileSwitch::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("referenceId"),
|
||||
Index("timestamp"),
|
||||
Index("isValid"),
|
||||
Index("id"),
|
||||
Index("nightscoutId")
|
||||
])
|
||||
data class ProfileSwitch(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
@ -47,6 +53,7 @@ data class ProfileSwitch(
|
|||
enum class GlucoseUnit {
|
||||
MGDL,
|
||||
MMOL;
|
||||
companion object {}
|
||||
|
||||
companion object
|
||||
}
|
||||
}
|
|
@ -16,7 +16,17 @@ import java.util.*
|
|||
entity = TemporaryBasal::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("isValid"),
|
||||
Index("nightscoutId"),
|
||||
Index("pumpType"),
|
||||
Index("endId"),
|
||||
Index("pumpSerial"),
|
||||
Index("temporaryId"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class TemporaryBasal(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -17,7 +17,13 @@ import java.util.*
|
|||
entity = TemporaryTarget::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("isValid"),
|
||||
Index("nightscoutId"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class TemporaryTarget(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -17,7 +17,14 @@ import java.util.*
|
|||
entity = TherapyEvent::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("type"),
|
||||
Index("nightscoutId"),
|
||||
Index("isValid"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class TherapyEvent(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -16,7 +16,15 @@ import java.util.*
|
|||
entity = TotalDailyDose::class,
|
||||
parentColumns = ["id"],
|
||||
childColumns = ["referenceId"])],
|
||||
indices = [Index("referenceId"), Index("timestamp")])
|
||||
indices = [
|
||||
Index("id"),
|
||||
Index("pumpId"),
|
||||
Index("pumpType"),
|
||||
Index("pumpSerial"),
|
||||
Index("isValid"),
|
||||
Index("referenceId"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class TotalDailyDose(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0,
|
||||
|
|
|
@ -1,13 +1,18 @@
|
|||
package info.nightscout.androidaps.database.entities
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.Index
|
||||
import androidx.room.PrimaryKey
|
||||
import info.nightscout.androidaps.database.TABLE_USER_ENTRY
|
||||
import info.nightscout.androidaps.database.interfaces.DBEntry
|
||||
import info.nightscout.androidaps.database.interfaces.DBEntryWithTime
|
||||
import java.util.*
|
||||
|
||||
@Entity(tableName = TABLE_USER_ENTRY)
|
||||
@Entity(tableName = TABLE_USER_ENTRY,
|
||||
indices = [
|
||||
Index("source"),
|
||||
Index("timestamp")
|
||||
])
|
||||
data class UserEntry(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
override var id: Long = 0L,
|
||||
|
|
|
@ -12,9 +12,21 @@ android {
|
|||
defaultConfig {
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
kapt {
|
||||
arguments {
|
||||
arg("room.incremental", "true")
|
||||
arg("room.schemaLocation", "$projectDir/schemas")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
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"
|
||||
}
|
|
@ -0,0 +1,187 @@
|
|||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 2,
|
||||
"identityHash": "391daa1e25629bafef27e6247e788e74",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "insightBolusIDs",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `pumpSerial` TEXT, `bolusID` INTEGER, `startID` INTEGER, `endID` INTEGER)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "timestamp",
|
||||
"columnName": "timestamp",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "pumpSerial",
|
||||
"columnName": "pumpSerial",
|
||||
"affinity": "TEXT",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "bolusID",
|
||||
"columnName": "bolusID",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "startID",
|
||||
"columnName": "startID",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "endID",
|
||||
"columnName": "endID",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_insightBolusIDs_bolusID",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"bolusID"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightBolusIDs_bolusID` ON `${TABLE_NAME}` (`bolusID`)"
|
||||
},
|
||||
{
|
||||
"name": "index_insightBolusIDs_pumpSerial",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"pumpSerial"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightBolusIDs_pumpSerial` ON `${TABLE_NAME}` (`pumpSerial`)"
|
||||
},
|
||||
{
|
||||
"name": "index_insightBolusIDs_timestamp",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"timestamp"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightBolusIDs_timestamp` ON `${TABLE_NAME}` (`timestamp`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "insightHistoryOffsets",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pumpSerial` TEXT NOT NULL, `offset` INTEGER NOT NULL, PRIMARY KEY(`pumpSerial`))",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "pumpSerial",
|
||||
"columnName": "pumpSerial",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "offset",
|
||||
"columnName": "offset",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"pumpSerial"
|
||||
],
|
||||
"autoGenerate": false
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_insightHistoryOffsets_pumpSerial",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"pumpSerial"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightHistoryOffsets_pumpSerial` ON `${TABLE_NAME}` (`pumpSerial`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "insightPumpIDs",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timestamp` INTEGER NOT NULL, `eventType` TEXT NOT NULL, `pumpSerial` TEXT, `eventID` INTEGER NOT NULL, PRIMARY KEY(`eventID`))",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "timestamp",
|
||||
"columnName": "timestamp",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "eventType",
|
||||
"columnName": "eventType",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "pumpSerial",
|
||||
"columnName": "pumpSerial",
|
||||
"affinity": "TEXT",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "eventID",
|
||||
"columnName": "eventID",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"eventID"
|
||||
],
|
||||
"autoGenerate": false
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_insightPumpIDs_timestamp",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"timestamp"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightPumpIDs_timestamp` ON `${TABLE_NAME}` (`timestamp`)"
|
||||
},
|
||||
{
|
||||
"name": "index_insightPumpIDs_pumpSerial",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"pumpSerial"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightPumpIDs_pumpSerial` ON `${TABLE_NAME}` (`pumpSerial`)"
|
||||
},
|
||||
{
|
||||
"name": "index_insightPumpIDs_eventType",
|
||||
"unique": false,
|
||||
"columnNames": [
|
||||
"eventType"
|
||||
],
|
||||
"createSql": "CREATE INDEX IF NOT EXISTS `index_insightPumpIDs_eventType` ON `${TABLE_NAME}` (`eventType`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '391daa1e25629bafef27e6247e788e74')"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -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) }
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
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"),
|
||||
Index("pumpSerial"),
|
||||
Index("timestamp")
|
||||
])
|
||||
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
|
||||
}
|
|
@ -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 = 2
|
||||
|
||||
fun build(context: Context) =
|
||||
Room.databaseBuilder(
|
||||
context.applicationContext,
|
||||
InsightDatabase::class.java,
|
||||
"insight_database.db"
|
||||
)
|
||||
.fallbackToDestructiveMigration()
|
||||
.build()
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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)
|
||||
|
||||
}
|
|
@ -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
|
||||
)
|
|
@ -0,0 +1,28 @@
|
|||
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"),
|
||||
Index("pumpSerial"),
|
||||
Index("eventType")
|
||||
])
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.danars.di
|
||||
package info.nightscout.androidaps.insight.di
|
||||
|
||||
import dagger.Module
|
||||
import dagger.android.ContributesAndroidInjector
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.danars.di
|
||||
package info.nightscout.androidaps.insight.di
|
||||
|
||||
import dagger.Module
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
}
|
|
@ -1,10 +1,14 @@
|
|||
package info.nightscout.androidaps.danars.di
|
||||
package info.nightscout.androidaps.insight.di
|
||||
|
||||
import dagger.Module
|
||||
import dagger.android.ContributesAndroidInjector
|
||||
|
||||
@Module(includes = [
|
||||
InsightCommModule::class,
|
||||
InsightActivitiesModule::class,
|
||||
InsightServicesModule::class
|
||||
InsightServicesModule::class,
|
||||
InsightDatabaseModule::class
|
||||
])
|
||||
open class InsightModule
|
||||
|
||||
@Suppress("unused")
|
||||
abstract class InsightModule
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.danars.di
|
||||
package info.nightscout.androidaps.insight.di
|
||||
|
||||
import dagger.Module
|
||||
import dagger.android.ContributesAndroidInjector
|
||||
|
|
|
@ -33,20 +33,18 @@ import dagger.android.HasAndroidInjector;
|
|||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.interfaces.Profile;
|
||||
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.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.interfaces.CommandQueueProvider;
|
||||
import info.nightscout.androidaps.interfaces.Config;
|
||||
import info.nightscout.androidaps.interfaces.Constraint;
|
||||
import info.nightscout.androidaps.interfaces.Constraints;
|
||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
|
||||
import info.nightscout.androidaps.interfaces.PluginDescription;
|
||||
import info.nightscout.androidaps.interfaces.PluginType;
|
||||
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.PumpPluginBase;
|
||||
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.LTag;
|
||||
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.ParameterBlockUtil;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
import info.nightscout.androidaps.utils.T;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
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 RxBusWrapper rxBus;
|
||||
private final ResourceHelper resourceHelper;
|
||||
private final TreatmentsInterface treatmentsPlugin;
|
||||
private final SP sp;
|
||||
private final CommandQueueProvider commandQueue;
|
||||
private final ProfileFunction profileFunction;
|
||||
private final Context context;
|
||||
private final DateUtil dateUtil;
|
||||
private final DatabaseHelperInterface databaseHelper;
|
||||
private final InsightDbHelper insightDbHelper;
|
||||
private final PumpSync pumpSync;
|
||||
|
||||
public static final String ALERT_CHANNEL_ID = "AndroidAPS-InsightAlert";
|
||||
|
@ -199,14 +197,13 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
AAPSLogger aapsLogger,
|
||||
RxBusWrapper rxBus,
|
||||
ResourceHelper resourceHelper,
|
||||
TreatmentsInterface treatmentsPlugin,
|
||||
SP sp,
|
||||
CommandQueueProvider commandQueue,
|
||||
ProfileFunction profileFunction,
|
||||
Context context,
|
||||
Config config,
|
||||
DateUtil dateUtil,
|
||||
DatabaseHelperInterface databaseHelper,
|
||||
InsightDbHelper insightDbHelper,
|
||||
PumpSync pumpSync
|
||||
) {
|
||||
super(new PluginDescription()
|
||||
|
@ -223,13 +220,12 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
this.aapsLogger = aapsLogger;
|
||||
this.rxBus = rxBus;
|
||||
this.resourceHelper = resourceHelper;
|
||||
this.treatmentsPlugin = treatmentsPlugin;
|
||||
this.sp = sp;
|
||||
this.commandQueue = commandQueue;
|
||||
this.profileFunction = profileFunction;
|
||||
this.context = context;
|
||||
this.dateUtil = dateUtil;
|
||||
this.databaseHelper = databaseHelper;
|
||||
this.insightDbHelper = insightDbHelper;
|
||||
this.pumpSync = pumpSync;
|
||||
|
||||
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.MINUTE, pumpTime.getMinute());
|
||||
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());
|
||||
pumpTime.setYear(calendar.get(Calendar.YEAR));
|
||||
pumpTime.setMonth(calendar.get(Calendar.MONTH) + 1);
|
||||
|
@ -544,7 +540,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
|
||||
@Override
|
||||
public long lastDataTime() {
|
||||
if (connectionService == null || alertService == null) return System.currentTimeMillis();
|
||||
if (connectionService == null || alertService == null) return dateUtil.now();
|
||||
return connectionService.getLastDataTime();
|
||||
}
|
||||
|
||||
|
@ -569,6 +565,9 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
|
||||
@NonNull @Override
|
||||
public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
|
||||
if (detailedBolusInfo.insulin == 0 || detailedBolusInfo.carbs > 0) {
|
||||
throw new IllegalArgumentException(detailedBolusInfo.toString(), new Exception());
|
||||
}
|
||||
PumpEnactResult result = new PumpEnactResult(getInjector());
|
||||
double insulin = Math.round(detailedBolusInfo.insulin / 0.01) * 0.01;
|
||||
if (insulin > 0) {
|
||||
|
@ -579,7 +578,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
bolusMessage.setDuration(0);
|
||||
bolusMessage.setExtendedAmount(0);
|
||||
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();
|
||||
bolusCancelled = false;
|
||||
}
|
||||
|
@ -591,25 +590,23 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
bolusingEvent.setPercent(0);
|
||||
rxBus.send(bolusingEvent);
|
||||
int trials = 0;
|
||||
InsightBolusID insightBolusID = new InsightBolusID();
|
||||
insightBolusID.bolusID = bolusID;
|
||||
insightBolusID.timestamp = System.currentTimeMillis();
|
||||
insightBolusID.pumpSerial = connectionService.getPumpSystemIdentification().getSerialNumber();
|
||||
databaseHelper.createOrUpdate(insightBolusID);
|
||||
detailedBolusInfo.setBolusTimestamp(insightBolusID.timestamp);
|
||||
detailedBolusInfo.setPumpType(PumpType.ACCU_CHEK_INSIGHT);
|
||||
detailedBolusInfo.setPumpSerial(serialNumber());
|
||||
detailedBolusInfo.setBolusPumpId(insightBolusID.id);
|
||||
if (detailedBolusInfo.carbs > 0 && detailedBolusInfo.carbTime != 0) {
|
||||
DetailedBolusInfo carbInfo = new DetailedBolusInfo();
|
||||
carbInfo.carbs = detailedBolusInfo.carbs;
|
||||
carbInfo.setCarbsTimestamp(detailedBolusInfo.timestamp + detailedBolusInfo.carbTime * 60L * 1000L);
|
||||
carbInfo.setPumpType(PumpType.USER);
|
||||
treatmentsPlugin.addToHistoryTreatment(carbInfo, false);
|
||||
detailedBolusInfo.carbTime = 0;
|
||||
detailedBolusInfo.carbs = 0;
|
||||
}
|
||||
treatmentsPlugin.addToHistoryTreatment(detailedBolusInfo, true);
|
||||
Long now = dateUtil.now();
|
||||
String serial = serialNumber();
|
||||
insightDbHelper.createOrUpdate( new InsightBolusID(
|
||||
now,
|
||||
serial,
|
||||
bolusID,
|
||||
null,
|
||||
null
|
||||
));
|
||||
InsightBolusID insightBolusID = insightDbHelper.getInsightBolusID(serial, bolusID, now);
|
||||
pumpSync.syncBolusWithPumpId(
|
||||
insightBolusID.getTimestamp(),
|
||||
detailedBolusInfo.insulin,
|
||||
detailedBolusInfo.getBolusType(),
|
||||
insightBolusID.getId(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
serialNumber());
|
||||
while (true) {
|
||||
synchronized ($bolusLock) {
|
||||
if (bolusCancelled) break;
|
||||
|
@ -657,10 +654,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
aapsLogger.error("Exception while delivering bolus", e);
|
||||
result.comment(ExceptionTranslator.getString(context, e));
|
||||
}
|
||||
} else if (detailedBolusInfo.carbs > 0) {
|
||||
result.success(true).enacted(true);
|
||||
result.bolusDelivered(insulin);
|
||||
}
|
||||
result.carbsDelivered(detailedBolusInfo.carbs).bolusDelivered(insulin);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -701,7 +696,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
if (cancelTBRResult.getSuccess()) {
|
||||
PumpEnactResult ebResult = setExtendedBolusOnly((absoluteRate - getBaseBasalRate()) / 60D
|
||||
* ((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()) {
|
||||
result.success(true)
|
||||
.enacted(true)
|
||||
|
@ -780,7 +775,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
public PumpEnactResult setExtendedBolus(double insulin, int durationInMinutes) {
|
||||
PumpEnactResult result = cancelExtendedBolusOnly();
|
||||
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 {
|
||||
fetchStatus();
|
||||
readHistory();
|
||||
|
@ -804,18 +799,13 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
bolusMessage.setImmediateAmount(0);
|
||||
bolusMessage.setVibration(disableVibration);
|
||||
int bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId();
|
||||
InsightBolusID insightBolusID = new InsightBolusID();
|
||||
insightBolusID.bolusID = bolusID;
|
||||
insightBolusID.timestamp = System.currentTimeMillis();
|
||||
insightBolusID.pumpSerial = connectionService.getPumpSystemIdentification().getSerialNumber();
|
||||
databaseHelper.createOrUpdate(insightBolusID);
|
||||
ExtendedBolus extendedBolus = new ExtendedBolus(getInjector());
|
||||
extendedBolus.date = insightBolusID.timestamp;
|
||||
extendedBolus.source = Source.PUMP;
|
||||
extendedBolus.durationInMinutes = durationInMinutes;
|
||||
extendedBolus.insulin = insulin;
|
||||
extendedBolus.pumpId = insightBolusID.id;
|
||||
treatmentsPlugin.addToHistoryExtendedBolus(extendedBolus);
|
||||
insightDbHelper.createOrUpdate(new InsightBolusID(
|
||||
dateUtil.now(),
|
||||
serialNumber(),
|
||||
bolusID,
|
||||
null,
|
||||
null
|
||||
));
|
||||
result.success(true).enacted(true).comment(R.string.virtualpump_resultok);
|
||||
} catch (AppLayerErrorException e) {
|
||||
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;
|
||||
if (isFakingTempsByExtendedBoluses()) cancelEBResult = cancelExtendedBolusOnly();
|
||||
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.comment(cancelEBResult != null ? cancelEBResult.getComment() : cancelTBRResult.getComment());
|
||||
try {
|
||||
|
@ -906,21 +896,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
connectionService.requestMessage(cancelBolusMessage).await();
|
||||
confirmAlert(AlertType.WARNING_38);
|
||||
alertService.ignore(null);
|
||||
InsightBolusID insightBolusID = databaseHelper.getInsightBolusID(connectionService.getPumpSystemIdentification().getSerialNumber(),
|
||||
activeBolus.getBolusID(), System.currentTimeMillis());
|
||||
InsightBolusID insightBolusID = insightDbHelper.getInsightBolusID(serialNumber(), activeBolus.getBolusID(), dateUtil.now());
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -941,8 +918,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
|
||||
private void confirmAlert(AlertType alertType) {
|
||||
try {
|
||||
long started = System.currentTimeMillis();
|
||||
while (System.currentTimeMillis() - started < 10000) {
|
||||
long started = dateUtil.now();
|
||||
while (dateUtil.now() - started < 10000) {
|
||||
GetActiveAlertMessage activeAlertMessage = connectionService.requestMessage(new GetActiveAlertMessage()).await();
|
||||
if (activeAlertMessage.getAlert() != null) {
|
||||
if (activeAlertMessage.getAlert().getAlertType() == alertType) {
|
||||
|
@ -963,9 +940,9 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
|
||||
@NonNull @Override
|
||||
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 (System.currentTimeMillis() - connectionService.getLastConnected() > (60 * 60 * 1000)) {
|
||||
if (dateUtil.now() - connectionService.getLastConnected() > (60 * 60 * 1000)) {
|
||||
return new JSONObject();
|
||||
}
|
||||
|
||||
|
@ -1103,7 +1080,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
public String shortStatus(boolean veryShort) {
|
||||
StringBuilder ret = new StringBuilder();
|
||||
if (connectionService.getLastConnected() != 0) {
|
||||
long agoMsec = System.currentTimeMillis() - connectionService.getLastConnected();
|
||||
long agoMsec = dateUtil.now() - connectionService.getLastConnected();
|
||||
int agoMin = (int) (agoMsec / 60d / 1000d);
|
||||
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
|
||||
public boolean isFakingTempsByExtendedBoluses() {
|
||||
return sp.getBoolean("insight_enable_tbr_emulation", false);
|
||||
return sp.getBoolean(R.string.key_insight_enable_tbr_emulation, false);
|
||||
}
|
||||
|
||||
@NonNull @Override
|
||||
|
@ -1141,10 +1118,10 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
private void readHistory() {
|
||||
try {
|
||||
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(),
|
||||
pumpTime.getMonth(), pumpTime.getDay(), pumpTime.getHour(), pumpTime.getMinute(), pumpTime.getSecond());
|
||||
InsightHistoryOffset historyOffset = databaseHelper.getInsightHistoryOffset(pumpSerial);
|
||||
InsightHistoryOffset historyOffset = insightDbHelper.getInsightHistoryOffset(serial);
|
||||
try {
|
||||
List<HistoryEvent> historyEvents = new ArrayList<>();
|
||||
if (historyOffset == null) {
|
||||
|
@ -1156,7 +1133,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
} else {
|
||||
StartReadingHistoryMessage startMessage = new StartReadingHistoryMessage();
|
||||
startMessage.setDirection(HistoryReadingDirection.FORWARD);
|
||||
startMessage.setOffset(historyOffset.offset + 1);
|
||||
startMessage.setOffset(historyOffset.getOffset() + 1);
|
||||
connectionService.requestMessage(startMessage).await();
|
||||
while (true) {
|
||||
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.reverse(historyEvents);
|
||||
if (historyOffset != null) processHistoryEvents(pumpSerial, historyEvents);
|
||||
if (historyOffset != null) processHistoryEvents(serial, historyEvents);
|
||||
if (historyEvents.size() > 0) {
|
||||
historyOffset = new InsightHistoryOffset();
|
||||
historyOffset.pumpSerial = pumpSerial;
|
||||
historyOffset.offset = historyEvents.get(0).getEventPosition();
|
||||
databaseHelper.createOrUpdate(historyOffset);
|
||||
insightDbHelper.createOrUpdate(new InsightHistoryOffset(
|
||||
serial,
|
||||
historyEvents.get(0).getEventPosition())
|
||||
);
|
||||
}
|
||||
} catch (AppLayerErrorException e) {
|
||||
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))
|
||||
break;
|
||||
Collections.reverse(temporaryBasals);
|
||||
|
||||
for (InsightPumpID pumpID : pumpStartedEvents) {
|
||||
InsightPumpID stoppedEvent = databaseHelper.getPumpStoppedEvent(pumpID.pumpSerial, pumpID.timestamp);
|
||||
if (stoppedEvent == null || stoppedEvent.eventType.equals("PumpPaused")) continue;
|
||||
long tbrStart = stoppedEvent.timestamp + 10000;
|
||||
TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector());
|
||||
temporaryBasal.durationInMinutes = (int) ((pumpID.timestamp - tbrStart) / 60000);
|
||||
temporaryBasal.date = tbrStart;
|
||||
temporaryBasal.source = Source.PUMP;
|
||||
temporaryBasal.pumpId = pumpID.id;
|
||||
temporaryBasal.percentRate = 0;
|
||||
temporaryBasal.isAbsolute = false;
|
||||
InsightPumpID stoppedEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), pumpID.getTimestamp());
|
||||
if (stoppedEvent != null && stoppedEvent.getEventType().equals(EventType.PumpStopped)) { // Search if Stop event is after 15min of Pause
|
||||
InsightPumpID pauseEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), stoppedEvent.getTimestamp() - T.mins(1).msecs());
|
||||
if (pauseEvent != null && pauseEvent.getEventType().equals(EventType.PumpPaused) && (stoppedEvent.getTimestamp() - pauseEvent.getTimestamp() < T.mins(16).msecs())) {
|
||||
stoppedEvent = pauseEvent;
|
||||
stoppedEvent.setEventType(EventType.PumpStopped);
|
||||
}
|
||||
}
|
||||
if (stoppedEvent == null || stoppedEvent.getEventType().equals(EventType.PumpPaused) || pumpID.getTimestamp() - stoppedEvent.getTimestamp() < 10000)
|
||||
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.sort((o1, o2) -> (int) (o1.date - o2.date));
|
||||
for (TemporaryBasal temporaryBasal : temporaryBasals)
|
||||
treatmentsPlugin.addToHistoryTempBasal(temporaryBasal);
|
||||
temporaryBasals.sort((o1, o2) -> (int) (o1.getTimestamp() - o2.getTimestamp()));
|
||||
for (TemporaryBasal temporaryBasal : temporaryBasals) {
|
||||
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) {
|
||||
|
@ -1225,13 +1230,13 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
else if (event instanceof DateTimeChangedEvent)
|
||||
processDateTimeChangedEvent((DateTimeChangedEvent) event);
|
||||
else if (event instanceof CannulaFilledEvent)
|
||||
processCannulaFilledEvent((CannulaFilledEvent) event);
|
||||
processCannulaFilledEvent(serial, (CannulaFilledEvent) event);
|
||||
else if (event instanceof TotalDailyDoseEvent)
|
||||
processTotalDailyDoseEvent((TotalDailyDoseEvent) event);
|
||||
else if (event instanceof TubeFilledEvent) processTubeFilledEvent((TubeFilledEvent) event);
|
||||
processTotalDailyDoseEvent(serial, (TotalDailyDoseEvent) event);
|
||||
else if (event instanceof TubeFilledEvent) processTubeFilledEvent(serial, (TubeFilledEvent) event);
|
||||
else if (event instanceof SniffingDoneEvent)
|
||||
processSniffingDoneEvent((SniffingDoneEvent) event);
|
||||
else if (event instanceof PowerUpEvent) processPowerUpEvent((PowerUpEvent) event);
|
||||
processSniffingDoneEvent(serial, (SniffingDoneEvent) event);
|
||||
else if (event instanceof PowerUpEvent) processPowerUpEvent(serial, (PowerUpEvent) event);
|
||||
else if (event instanceof OperatingModeChangedEvent)
|
||||
processOperatingModeChangedEvent(serial, pumpStartedEvents, (OperatingModeChangedEvent) event);
|
||||
else if (event instanceof StartOfTBREvent)
|
||||
|
@ -1253,14 +1258,15 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
timeOffset -= timeAfter - timeBefore;
|
||||
}
|
||||
|
||||
private void processCannulaFilledEvent(CannulaFilledEvent event) {
|
||||
if (!sp.getBoolean("insight_log_site_changes", false)) return;
|
||||
private void processCannulaFilledEvent(String serial, CannulaFilledEvent event) {
|
||||
if (!sp.getBoolean(R.string.key_insight_log_site_changes, false)) return;
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
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.setTime(new Date(0));
|
||||
calendar.set(Calendar.YEAR, event.getTotalYear());
|
||||
|
@ -1271,28 +1277,28 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
event.getBolusTotal(),
|
||||
event.getBasalTotal(),
|
||||
0.0, // will be calculated automatically
|
||||
null,
|
||||
event.getEventPosition(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
serialNumber()
|
||||
);
|
||||
serial);
|
||||
}
|
||||
|
||||
private void processTubeFilledEvent(TubeFilledEvent event) {
|
||||
if (!sp.getBoolean("insight_log_tube_changes", false)) return;
|
||||
private void processTubeFilledEvent(String serial, TubeFilledEvent event) {
|
||||
if (!sp.getBoolean(R.string.key_insight_log_tube_changes, false)) return;
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
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) {
|
||||
if (!sp.getBoolean("insight_log_reservoir_changes", false)) return;
|
||||
private void processSniffingDoneEvent(String serial, SniffingDoneEvent event) {
|
||||
if (!sp.getBoolean(R.string.key_insight_log_reservoir_changes, false)) return;
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
uploadCareportalEvent(timestamp, DetailedBolusInfo.EventType.INSULIN_CHANGE);
|
||||
}
|
||||
|
||||
private void processPowerUpEvent(PowerUpEvent event) {
|
||||
if (!sp.getBoolean("insight_log_battery_changes", false)) return;
|
||||
private void processPowerUpEvent(String serial, PowerUpEvent event) {
|
||||
if (!sp.getBoolean(R.string.key_insight_log_battery_changes, false)) return;
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
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) {
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
InsightPumpID pumpID = new InsightPumpID();
|
||||
pumpID.eventID = event.getEventPosition();
|
||||
pumpID.pumpSerial = serial;
|
||||
pumpID.timestamp = timestamp;
|
||||
InsightPumpID pumpID = new InsightPumpID(
|
||||
timestamp,
|
||||
EventType.None,
|
||||
serial,
|
||||
event.getEventPosition());
|
||||
switch (event.getNewValue()) {
|
||||
case STARTED:
|
||||
pumpID.eventType = "PumpStarted";
|
||||
pumpID.setEventType(EventType.PumpStarted);
|
||||
pumpStartedEvents.add(pumpID);
|
||||
if (sp.getBoolean("insight_log_operating_mode_changes", false))
|
||||
logNote(timestamp, resourceHelper.gs(R.string.pump_started));
|
||||
break;
|
||||
case STOPPED:
|
||||
pumpID.eventType = "PumpStopped";
|
||||
pumpID.setEventType(EventType.PumpStopped);
|
||||
if (sp.getBoolean("insight_log_operating_mode_changes", false))
|
||||
logNote(timestamp, resourceHelper.gs(R.string.pump_stopped));
|
||||
break;
|
||||
case PAUSED:
|
||||
pumpID.eventType = "PumpPaused";
|
||||
pumpID.setEventType(EventType.PumpPaused);
|
||||
if (sp.getBoolean("insight_log_operating_mode_changes", false))
|
||||
logNote(timestamp, resourceHelper.gs(R.string.pump_paused));
|
||||
break;
|
||||
}
|
||||
databaseHelper.createOrUpdate(pumpID);
|
||||
insightDbHelper.createOrUpdate(pumpID);
|
||||
}
|
||||
|
||||
private void processStartOfTBREvent(String serial, List<TemporaryBasal> temporaryBasals, StartOfTBREvent event) {
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
InsightPumpID pumpID = new InsightPumpID();
|
||||
pumpID.eventID = event.getEventPosition();
|
||||
pumpID.pumpSerial = serial;
|
||||
pumpID.timestamp = timestamp;
|
||||
pumpID.eventType = "StartOfTBR";
|
||||
databaseHelper.createOrUpdate(pumpID);
|
||||
TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector());
|
||||
temporaryBasal.durationInMinutes = event.getDuration();
|
||||
temporaryBasal.source = Source.PUMP;
|
||||
temporaryBasal.pumpId = pumpID.id;
|
||||
temporaryBasal.percentRate = event.getAmount();
|
||||
temporaryBasal.isAbsolute = false;
|
||||
temporaryBasal.date = timestamp;
|
||||
temporaryBasals.add(temporaryBasal);
|
||||
insightDbHelper.createOrUpdate(new InsightPumpID(
|
||||
timestamp,
|
||||
EventType.StartOfTBR,
|
||||
serial,
|
||||
event.getEventPosition()));
|
||||
temporaryBasals.add(new TemporaryBasal(
|
||||
timestamp,
|
||||
T.mins(event.getDuration()).msecs(),
|
||||
event.getAmount(),
|
||||
false,
|
||||
PumpSync.TemporaryBasalType.NORMAL,
|
||||
event.getEventPosition(),
|
||||
event.getEventPosition()));
|
||||
}
|
||||
|
||||
private void processEndOfTBREvent(String serial, List<TemporaryBasal> temporaryBasals, EndOfTBREvent event) {
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
InsightPumpID pumpID = new InsightPumpID();
|
||||
pumpID.eventID = event.getEventPosition();
|
||||
pumpID.pumpSerial = serial;
|
||||
pumpID.eventType = "EndOfTBR";
|
||||
pumpID.timestamp = timestamp;
|
||||
databaseHelper.createOrUpdate(pumpID);
|
||||
TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector());
|
||||
temporaryBasal.durationInMinutes = 0;
|
||||
temporaryBasal.source = Source.PUMP;
|
||||
temporaryBasal.pumpId = pumpID.id;
|
||||
temporaryBasal.date = timestamp - 1500L;
|
||||
temporaryBasals.add(temporaryBasal);
|
||||
insightDbHelper.createOrUpdate(new InsightPumpID(
|
||||
timestamp - 1500L,
|
||||
EventType.EndOfTBR,
|
||||
serial,
|
||||
event.getEventPosition()));
|
||||
|
||||
temporaryBasals.add(new PumpSync.PumpState.TemporaryBasal(
|
||||
timestamp - 1500L,
|
||||
0L,
|
||||
100.0,
|
||||
false,
|
||||
PumpSync.TemporaryBasalType.NORMAL,
|
||||
event.getEventPosition(),
|
||||
event.getEventPosition()));
|
||||
}
|
||||
|
||||
private void processBolusProgrammedEvent(String serial, BolusProgrammedEvent event) {
|
||||
long timestamp = parseDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
InsightBolusID bolusID = databaseHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
|
||||
if (bolusID != null && bolusID.endID != null) {
|
||||
bolusID.startID = event.getEventPosition();
|
||||
databaseHelper.createOrUpdate(bolusID);
|
||||
InsightBolusID bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
|
||||
if (bolusID != null && bolusID.getEndID() != null) {
|
||||
bolusID.setStartID(event.getEventPosition());
|
||||
insightDbHelper.createOrUpdate(bolusID);
|
||||
return;
|
||||
}
|
||||
if (bolusID == null || bolusID.startID != null) {
|
||||
bolusID = new InsightBolusID();
|
||||
bolusID.timestamp = timestamp;
|
||||
bolusID.bolusID = event.getBolusID();
|
||||
bolusID.pumpSerial = serial;
|
||||
if (bolusID == null || bolusID.getStartID() != null) { //In rare edge cases two boluses can share the same ID
|
||||
insightDbHelper.createOrUpdate(new InsightBolusID(
|
||||
timestamp,
|
||||
serial,
|
||||
event.getBolusID(),
|
||||
event.getEventPosition(),
|
||||
null
|
||||
));
|
||||
bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
|
||||
}
|
||||
bolusID.startID = event.getEventPosition();
|
||||
databaseHelper.createOrUpdate(bolusID);
|
||||
bolusID.setStartID(event.getEventPosition());
|
||||
insightDbHelper.createOrUpdate(bolusID);
|
||||
|
||||
if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) {
|
||||
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
|
||||
detailedBolusInfo.timestamp = bolusID.timestamp;
|
||||
detailedBolusInfo.setPumpType(PumpType.ACCU_CHEK_INSIGHT);
|
||||
detailedBolusInfo.setPumpSerial(serialNumber());
|
||||
detailedBolusInfo.setBolusPumpId(bolusID.id);
|
||||
detailedBolusInfo.insulin = event.getImmediateAmount();
|
||||
treatmentsPlugin.addToHistoryTreatment(detailedBolusInfo, true);
|
||||
pumpSync.syncBolusWithPumpId(
|
||||
bolusID.getTimestamp(),
|
||||
event.getImmediateAmount(),
|
||||
null,
|
||||
bolusID.getId(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
serial);
|
||||
}
|
||||
if ((event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE)) {
|
||||
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);
|
||||
if (profileFunction.getProfile(bolusID.getTimestamp()) != null)
|
||||
pumpSync.syncExtendedBolusWithPumpId(
|
||||
bolusID.getTimestamp(),
|
||||
event.getExtendedAmount(),
|
||||
T.mins(event.getDuration()).msecs(),
|
||||
isFakingTempsByExtendedBoluses(),
|
||||
bolusID.getId(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
serial);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1405,48 +1419,42 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
long startTimestamp = parseRelativeDate(event.getEventYear(), event.getEventMonth(), event.getEventDay(), event.getEventHour(),
|
||||
event.getEventMinute(), event.getEventSecond(), event.getStartHour(), event.getStartMinute(), event.getStartSecond()) + timeOffset;
|
||||
InsightBolusID bolusID = databaseHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
|
||||
if (bolusID == null || bolusID.endID != null) {
|
||||
bolusID = new InsightBolusID();
|
||||
bolusID.timestamp = startTimestamp;
|
||||
bolusID.bolusID = event.getBolusID();
|
||||
bolusID.pumpSerial = serial;
|
||||
InsightBolusID bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), timestamp);
|
||||
if (bolusID == null || bolusID.getEndID() != null) { // TODO() Check if test EndID is necessary
|
||||
bolusID = new InsightBolusID(
|
||||
startTimestamp,
|
||||
serial,
|
||||
event.getBolusID(),
|
||||
bolusID == null ? event.getEventPosition() : bolusID.getStartID(),
|
||||
event.getEventPosition());
|
||||
}
|
||||
bolusID.endID = event.getEventPosition();
|
||||
databaseHelper.createOrUpdate(bolusID);
|
||||
bolusID.setEndID(event.getEventPosition());
|
||||
insightDbHelper.createOrUpdate(bolusID);
|
||||
bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), startTimestamp); // Line added to get id
|
||||
if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) {
|
||||
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
|
||||
detailedBolusInfo.setBolusTimestamp(bolusID.timestamp);
|
||||
detailedBolusInfo.setPumpType(PumpType.ACCU_CHEK_INSIGHT);
|
||||
detailedBolusInfo.setPumpSerial(serialNumber());
|
||||
detailedBolusInfo.setBolusPumpId(bolusID.id);
|
||||
detailedBolusInfo.insulin = event.getImmediateAmount();
|
||||
treatmentsPlugin.addToHistoryTreatment(detailedBolusInfo, true);
|
||||
pumpSync.syncBolusWithPumpId(
|
||||
bolusID.getTimestamp(),
|
||||
event.getImmediateAmount(),
|
||||
null,
|
||||
bolusID.getId(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
serial);
|
||||
}
|
||||
if (event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE) {
|
||||
if (event.getDuration() == 0) {
|
||||
ExtendedBolus extendedBolus = databaseHelper.getExtendedBolusByPumpId(bolusID.id);
|
||||
if (extendedBolus != null) {
|
||||
final String _id = extendedBolus._id;
|
||||
// if (NSUpload.isIdValid(_id)) nsUpload.removeCareportalEntryFromNS(_id);
|
||||
// else uploadQueue.removeByMongoId("dbAdd", _id);
|
||||
databaseHelper.delete(extendedBolus);
|
||||
}
|
||||
} else {
|
||||
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);
|
||||
}
|
||||
if (event.getDuration() > 0 && profileFunction.getProfile(bolusID.getTimestamp()) != null)
|
||||
pumpSync.syncExtendedBolusWithPumpId(
|
||||
bolusID.getTimestamp(),
|
||||
event.getExtendedAmount(),
|
||||
T.mins(event.getDuration()).msecs(),
|
||||
isFakingTempsByExtendedBoluses(),
|
||||
bolusID.getId(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
serial);
|
||||
}
|
||||
}
|
||||
|
||||
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(),
|
||||
event.getEventHour(), event.getEventMinute(), event.getEventSecond()) + timeOffset;
|
||||
Integer code = null;
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.List;
|
|||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.DaggerService;
|
||||
import info.nightscout.androidaps.insight.R;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.insight.app_layer.AppLayerMessage;
|
||||
|
@ -141,10 +142,10 @@ public class InsightConnectionService extends DaggerService implements Connectio
|
|||
}
|
||||
|
||||
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.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.max(minRecoveryDuration, 0);
|
||||
recoveryDuration += 1000;
|
||||
|
@ -295,7 +296,7 @@ public class InsightConnectionService extends DaggerService implements Connectio
|
|||
setState(InsightState.DISCONNECTED);
|
||||
cleanup(true);
|
||||
} 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.max(disconnectTimeout, 0);
|
||||
aapsLogger.info(LTag.PUMP, "Last connection lock released, will disconnect in " + disconnectTimeout + " seconds");
|
||||
|
|
|
@ -31,10 +31,20 @@
|
|||
<string name="tube_changed">Tube changed</string>
|
||||
<string name="insightpump_shortname">Sight</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_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_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>
|
||||
|
|
|
@ -15,68 +15,68 @@
|
|||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_reservoir_changes"
|
||||
android:key="@string/key_insight_log_reservoir_changes"
|
||||
android:title="@string/log_reservoir_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_tube_changes"
|
||||
android:key="@string/key_insight_log_tube_changes"
|
||||
android:title="@string/log_tube_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_site_changes"
|
||||
android:key="@string/key_insight_log_site_changes"
|
||||
android:title="@string/log_site_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_battery_changes"
|
||||
android:key="@string/key_insight_log_battery_changes"
|
||||
android:title="@string/log_battery_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
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" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_alerts"
|
||||
android:key="@string/key_insight_log_alerts"
|
||||
android:title="@string/log_alerts" />
|
||||
|
||||
<SwitchPreference
|
||||
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:title="@string/enable_tbr_emulation" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/key_disable_vibration"
|
||||
android:key="@string/key_insight_disable_vibration"
|
||||
android:summary="@string/disable_vibration_summary"
|
||||
android:title="@string/disable_vibration" />
|
||||
|
||||
<SwitchPreference
|
||||
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:title="@string/disable_vibration_auto" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="5"
|
||||
android:inputType="number"
|
||||
android:key="insight_min_recovery_duration"
|
||||
android:key="@string/key_insight_min_recovery_duration"
|
||||
android:title="@string/min_recovery_duration" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="20"
|
||||
android:inputType="number"
|
||||
android:key="insight_max_recovery_duration"
|
||||
android:key="@string/key_insight_max_recovery_duration"
|
||||
android:title="@string/max_recovery_duration" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="5"
|
||||
android:inputType="number"
|
||||
android:key="insight_disconnect_delay"
|
||||
android:key="@string/key_insight_disconnect_delay"
|
||||
android:title="@string/disconnect_delay" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
|
|
@ -15,62 +15,62 @@
|
|||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_reservoir_changes"
|
||||
android:key="@string/key_insight_log_reservoir_changes"
|
||||
android:title="@string/log_reservoir_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_tube_changes"
|
||||
android:key="@string/key_insight_log_tube_changes"
|
||||
android:title="@string/log_tube_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_site_changes"
|
||||
android:key="@string/key_insight_log_site_changes"
|
||||
android:title="@string/log_site_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_battery_changes"
|
||||
android:key="@string/key_insight_log_battery_changes"
|
||||
android:title="@string/log_battery_changes" />
|
||||
|
||||
<SwitchPreference
|
||||
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" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="insight_log_alerts"
|
||||
android:key="@string/key_insight_log_alerts"
|
||||
android:title="@string/log_alerts" />
|
||||
|
||||
<SwitchPreference
|
||||
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:title="@string/enable_tbr_emulation" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/key_disable_vibration"
|
||||
android:key="@string/key_insight_disable_vibration"
|
||||
android:summary="@string/disable_vibration_summary"
|
||||
android:title="@string/disable_vibration" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="5"
|
||||
android:inputType="number"
|
||||
android:key="insight_min_recovery_duration"
|
||||
android:key="@string/key_insight_min_recovery_duration"
|
||||
android:title="@string/min_recovery_duration" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="20"
|
||||
android:inputType="number"
|
||||
android:key="insight_max_recovery_duration"
|
||||
android:key="@string/key_insight_max_recovery_duration"
|
||||
android:title="@string/max_recovery_duration" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="5"
|
||||
android:inputType="number"
|
||||
android:key="insight_disconnect_delay"
|
||||
android:key="@string/key_insight_disconnect_delay"
|
||||
android:title="@string/disconnect_delay" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
|
Loading…
Reference in a new issue