First draft with bug
This commit is contained in:
parent
51add9a4fd
commit
274cac8ff9
8 changed files with 100 additions and 13 deletions
|
@ -10,10 +10,12 @@ import info.nightscout.androidaps.Constants
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.data.Profile
|
import info.nightscout.androidaps.data.Profile
|
||||||
import info.nightscout.androidaps.database.entities.UserEntry
|
import info.nightscout.androidaps.database.entities.UserEntry
|
||||||
|
import info.nightscout.androidaps.database.entities.UserEntry.*
|
||||||
import info.nightscout.androidaps.databinding.DialogCalibrationBinding
|
import info.nightscout.androidaps.databinding.DialogCalibrationBinding
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
import info.nightscout.androidaps.logging.UserEntryLogger
|
import info.nightscout.androidaps.logging.UserEntryLogger
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||||
|
import info.nightscout.androidaps.utils.extensions.fromStringKey
|
||||||
import info.nightscout.androidaps.utils.HtmlHelper
|
import info.nightscout.androidaps.utils.HtmlHelper
|
||||||
import info.nightscout.androidaps.utils.XdripCalibrations
|
import info.nightscout.androidaps.utils.XdripCalibrations
|
||||||
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
|
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
|
||||||
|
@ -78,7 +80,7 @@ class CalibrationDialog : DialogFragmentWithDate() {
|
||||||
if (bg > 0) {
|
if (bg > 0) {
|
||||||
activity?.let { activity ->
|
activity?.let { activity ->
|
||||||
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.overview_calibration), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {
|
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.overview_calibration), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {
|
||||||
uel.log(UserEntry.Action.CALIBRATION, d1 = bg)
|
uel.log(Action.CALIBRATION, d1 = ValueWithUnit(bg, if (units == Constants.MMOL) Units.Mg_Dl else Units.Mmol_L))
|
||||||
xdripCalibrations.sendIntent(bg)
|
xdripCalibrations.sendIntent(bg)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package info.nightscout.androidaps.logging
|
||||||
|
|
||||||
import info.nightscout.androidaps.database.AppRepository
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.entities.UserEntry
|
import info.nightscout.androidaps.database.entities.UserEntry
|
||||||
|
import info.nightscout.androidaps.database.entities.UserEntry.*
|
||||||
import info.nightscout.androidaps.database.transactions.UserEntryTransaction
|
import info.nightscout.androidaps.database.transactions.UserEntryTransaction
|
||||||
import info.nightscout.androidaps.utils.rx.AapsSchedulers
|
import info.nightscout.androidaps.utils.rx.AapsSchedulers
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
@ -19,7 +20,7 @@ class UserEntryLogger @Inject constructor(
|
||||||
|
|
||||||
private val compositeDisposable = CompositeDisposable()
|
private val compositeDisposable = CompositeDisposable()
|
||||||
|
|
||||||
fun log(action: UserEntry.Action, s: String = "", d1: Double = 0.0, d2: Double = 0.0, i1: Int = 0, i2: Int = 0) {
|
fun log(action: UserEntry.Action, s: String = "", d1: ValueWithUnit = ValueWithUnit(0.0,Units.None), d2: ValueWithUnit = ValueWithUnit(0.0,Units.None), i1: ValueWithUnit = ValueWithUnit(0,Units.None), i2: ValueWithUnit = ValueWithUnit(0,Units.None)) {
|
||||||
compositeDisposable += repository.runTransaction(UserEntryTransaction(
|
compositeDisposable += repository.runTransaction(UserEntryTransaction(
|
||||||
action = action,
|
action = action,
|
||||||
s = s,
|
s = s,
|
||||||
|
@ -31,8 +32,8 @@ class UserEntryLogger @Inject constructor(
|
||||||
.subscribeOn(aapsSchedulers.io)
|
.subscribeOn(aapsSchedulers.io)
|
||||||
.observeOn(aapsSchedulers.io)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribeBy(
|
.subscribeBy(
|
||||||
onError = { aapsLogger.debug("ERRORED USER ENTRY: $action $s ${if (d1 == 0.0) d1 else ""} ${if (d2 == 0.0) d2 else ""} ${if (i1 == 0) i1 else ""} ${if (i2 == 0) i2 else ""}") },
|
onError = { aapsLogger.debug("ERRORED USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") },
|
||||||
onComplete = { aapsLogger.debug("USER ENTRY: $action $s ${if (d1 == 0.0) d1 else ""} ${if (d2 == 0.0) d2 else ""} ${if (i1 == 0) i1 else ""} ${if (i2 == 0) i2 else ""}") }
|
onComplete = { aapsLogger.debug("USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package info.nightscout.androidaps.utils.extensions
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Constants
|
||||||
|
import info.nightscout.androidaps.core.R
|
||||||
|
import info.nightscout.androidaps.database.entities.UserEntry
|
||||||
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
|
||||||
|
fun UserEntry.Units.stringId(): Int {
|
||||||
|
return when {
|
||||||
|
this == UserEntry.Units.Mg_Dl -> R.string.mgdl
|
||||||
|
this == UserEntry.Units.Mmol_L -> R.string.mmol
|
||||||
|
this == UserEntry.Units.U -> R.string.insulin_unit_shortname
|
||||||
|
this == UserEntry.Units.U_H -> R.string.profile_ins_units_per_hour
|
||||||
|
this == UserEntry.Units.G -> R.string.shortgram
|
||||||
|
this == UserEntry.Units.M -> R.string.shortminute
|
||||||
|
this == UserEntry.Units.H -> R.string.shorthour
|
||||||
|
this == UserEntry.Units.Percent -> R.string.percent
|
||||||
|
else -> 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun UserEntry.Units.stringkey(): String {
|
||||||
|
return when {
|
||||||
|
this == UserEntry.Units.Mg_Dl -> Constants.MGDL
|
||||||
|
this == UserEntry.Units.Mmol_L -> Constants.MMOL
|
||||||
|
this == UserEntry.Units.U -> UserEntry.Units.U.name
|
||||||
|
this == UserEntry.Units.U_H -> UserEntry.Units.U_H.name
|
||||||
|
this == UserEntry.Units.G -> UserEntry.Units.G.name
|
||||||
|
this == UserEntry.Units.M -> UserEntry.Units.M.name
|
||||||
|
this == UserEntry.Units.H -> UserEntry.Units.H.name
|
||||||
|
this == UserEntry.Units.Percent -> "%"
|
||||||
|
else -> ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun UserEntry.Units.Companion(source: String?) = UserEntry.Units.values().firstOrNull { it.stringkey() == source } ?: UserEntry.Units.None
|
|
@ -92,6 +92,8 @@
|
||||||
<string name="eventtype">Event type</string>
|
<string name="eventtype">Event type</string>
|
||||||
<string name="mgdl">mg/dl</string>
|
<string name="mgdl">mg/dl</string>
|
||||||
<string name="mmol">mmol/l</string>
|
<string name="mmol">mmol/l</string>
|
||||||
|
<string name="shortgram">g</string>
|
||||||
|
<string name="percent">%%</string>
|
||||||
<string name="advancedsettings_title">Advanced Settings</string>
|
<string name="advancedsettings_title">Advanced Settings</string>
|
||||||
<string name="bluetooth">Bluetooth</string>
|
<string name="bluetooth">Bluetooth</string>
|
||||||
<string name="btwatchdog_title">BT Watchdog</string>
|
<string name="btwatchdog_title">BT Watchdog</string>
|
||||||
|
|
|
@ -16,6 +16,23 @@ class Converters {
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun toAction(action: String?) = action?.let { UserEntry.Action.fromString(it) }
|
fun toAction(action: String?) = action?.let { UserEntry.Action.fromString(it) }
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
fun fromValueWithUnit(valueWithUnit: UserEntry.ValueWithUnit?): String? {
|
||||||
|
if (valueWithUnit == null) return null
|
||||||
|
val jsonObject = JSONObject()
|
||||||
|
jsonObject.put("dValue", valueWithUnit.dValue)
|
||||||
|
jsonObject.put("iValue", valueWithUnit.iValue)
|
||||||
|
jsonObject.put("unit", valueWithUnit.unit.name)
|
||||||
|
return jsonObject.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
fun toValueWithUnit(jsonString: String?): UserEntry.ValueWithUnit? {
|
||||||
|
if (jsonString == null) return null
|
||||||
|
val jsonObject = JSONObject(jsonString)
|
||||||
|
return UserEntry.ValueWithUnit(jsonObject.getDouble("dValue"), jsonObject.getInt("iValue"),UserEntry.Units.fromString(jsonObject.getString("unit")) )
|
||||||
|
}
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun fromBolusType(bolusType: Bolus.Type?) = bolusType?.name
|
fun fromBolusType(bolusType: Bolus.Type?) = bolusType?.name
|
||||||
|
|
||||||
|
|
|
@ -33,4 +33,10 @@ open class DatabaseModule {
|
||||||
database.execSQL("CREATE TABLE IF NOT EXISTS userEntry (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `utcOffset` INTEGER NOT NULL, `action` TEXT NOT NULL, `s` TEXT NOT NULL, `d1` REAL NOT NULL, `d2` REAL NOT NULL, `i1` INTEGER NOT NULL, `i2` INTEGER NOT NULL)")
|
database.execSQL("CREATE TABLE IF NOT EXISTS userEntry (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `utcOffset` INTEGER NOT NULL, `action` TEXT NOT NULL, `s` TEXT NOT NULL, `d1` REAL NOT NULL, `d2` REAL NOT NULL, `i1` INTEGER NOT NULL, `i2` INTEGER NOT NULL)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val migration3to4 = object : Migration(3, 4) {
|
||||||
|
override fun migrate(database: SupportSQLiteDatabase) {
|
||||||
|
database.execSQL("CREATE TABLE IF NOT EXISTS userEntry (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `utcOffset` INTEGER NOT NULL, `action` TEXT NOT NULL, `s` TEXT NOT NULL, `d1` TEXT NOT NULL, `d2` TEXT NOT NULL, `i1` TEXT NOT NULL, `i2` TEXT NOT NULL)")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -17,10 +17,10 @@ data class UserEntry(
|
||||||
override var utcOffset: Long = TimeZone.getDefault().getOffset(timestamp).toLong(),
|
override var utcOffset: Long = TimeZone.getDefault().getOffset(timestamp).toLong(),
|
||||||
var action: Action,
|
var action: Action,
|
||||||
var s: String,
|
var s: String,
|
||||||
var d1: Double,
|
var d1: ValueWithUnit,
|
||||||
var d2: Double,
|
var d2: ValueWithUnit,
|
||||||
var i1: Int,
|
var i1: ValueWithUnit,
|
||||||
var i2: Int
|
var i2: ValueWithUnit
|
||||||
) : DBEntry, DBEntryWithTime {
|
) : DBEntry, DBEntryWithTime {
|
||||||
enum class Action () {
|
enum class Action () {
|
||||||
@SerializedName("BOLUS") BOLUS,
|
@SerializedName("BOLUS") BOLUS,
|
||||||
|
@ -123,4 +123,26 @@ data class UserEntry(
|
||||||
fun fromString(source: String?) = UserEntry.Action.values().firstOrNull { it.name == source } ?: UserEntry.Action.UNKNOWN
|
fun fromString(source: String?) = UserEntry.Action.values().firstOrNull { it.name == source } ?: UserEntry.Action.UNKNOWN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
data class ValueWithUnit (val dValue: Double, val iValue: Int, val unit: Units) {
|
||||||
|
constructor(value:Int, unit:Units) : this(0.0, value, unit)
|
||||||
|
constructor(value:Double, unit:Units) : this(value,0, unit)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
enum class Units {
|
||||||
|
@SerializedName("None") None,
|
||||||
|
@SerializedName("Mg_Dl") Mg_Dl,
|
||||||
|
@SerializedName("Mmol_L") Mmol_L,
|
||||||
|
@SerializedName("U") U,
|
||||||
|
@SerializedName("U_H") U_H,
|
||||||
|
@SerializedName("G") G,
|
||||||
|
@SerializedName("M") M,
|
||||||
|
@SerializedName("H") H,
|
||||||
|
@SerializedName("Percent") Percent
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun fromString(unit: String?) = UserEntry.Units.values().firstOrNull { it.name == unit } ?: UserEntry.Units.None
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,14 +1,15 @@
|
||||||
package info.nightscout.androidaps.database.transactions
|
package info.nightscout.androidaps.database.transactions
|
||||||
|
|
||||||
import info.nightscout.androidaps.database.entities.UserEntry
|
import info.nightscout.androidaps.database.entities.UserEntry
|
||||||
|
import info.nightscout.androidaps.database.entities.UserEntry.*
|
||||||
|
|
||||||
class UserEntryTransaction(
|
class UserEntryTransaction(
|
||||||
val action: UserEntry.Action,
|
val action: Action,
|
||||||
val s: String = "",
|
val s: String = "",
|
||||||
val d1: Double = 0.0,
|
val d1: ValueWithUnit = ValueWithUnit(0.0, Units.None),
|
||||||
val d2: Double = 0.0,
|
val d2: ValueWithUnit = ValueWithUnit(0.0, Units.None),
|
||||||
val i1: Int = 0,
|
val i1: ValueWithUnit = ValueWithUnit(0, Units.None),
|
||||||
val i2: Int = 0,
|
val i2: ValueWithUnit = ValueWithUnit(0, Units.None)
|
||||||
) : Transaction<Unit>() {
|
) : Transaction<Unit>() {
|
||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
|
|
Loading…
Reference in a new issue