Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,11 @@ interface ConcentrationHelper {
* i.e. "4 U 5 min ago", and with both value if other concentration: i.e. for U200 "4 U (2 CU) 5 min ago"
*
* @param amount PumpInsulin
* @param ago String
* @return String with units (U100) or with both units if not U100
* @param lastBolusTime Long
* @return String with units (U100) or with both units if not U100 and ago if less than 6 hour ago, else null
*/
fun insulinAmountAgoString(amount: PumpInsulin, ago: String): String
fun insulinAmountAgoString(amount: PumpInsulin, lastBolusTime: Long): String?

/**
* show insulinConcentration as a String i.e. "U100", "U200", ...
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import app.aaps.core.data.model.TB
import app.aaps.core.data.time.T
import app.aaps.core.interfaces.aps.AutosensResult
import app.aaps.core.interfaces.aps.IobTotal
import app.aaps.core.interfaces.insulin.ConcentrationHelper
import app.aaps.core.interfaces.profile.EffectiveProfile
import app.aaps.core.interfaces.profile.Profile
import app.aaps.core.interfaces.pump.PumpRate
import app.aaps.core.interfaces.resources.ResourceHelper
import app.aaps.core.interfaces.utils.DateUtil
import kotlin.math.ceil
Expand All @@ -26,6 +28,9 @@ val EB.plannedRemainingMinutes: Int
fun EB.toStringFull(dateUtil: DateUtil, rh:ResourceHelper): String =
rh.gs(app.aaps.core.ui.R.string.extended_bolus_full, rate, dateUtil.timeString(timestamp), getPassedDurationToTimeInMinutes(dateUtil.now()), T.msecs(duration).mins())

fun EB.toStringFull(dateUtil: DateUtil, ch: ConcentrationHelper): String =
"${ch.basalRateString(PumpRate(rate), true)} ${dateUtil.timeString(timestamp)} ${getPassedDurationToTimeInMinutes(dateUtil.now())}/${T.msecs(duration).mins()}"

fun EB.toStringMedium(dateUtil: DateUtil, rh:ResourceHelper): String =
rh.gs(app.aaps.core.ui.R.string.extended_bolus_medium, rate, getPassedDurationToTimeInMinutes(dateUtil.now()), T.msecs(duration).mins())

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import app.aaps.core.data.model.TB
import app.aaps.core.data.time.T
import app.aaps.core.interfaces.aps.AutosensResult
import app.aaps.core.interfaces.aps.IobTotal
import app.aaps.core.interfaces.insulin.ConcentrationHelper
import app.aaps.core.interfaces.profile.EffectiveProfile
import app.aaps.core.interfaces.profile.Profile
import app.aaps.core.interfaces.pump.PumpRate
import app.aaps.core.interfaces.resources.ResourceHelper
import app.aaps.core.interfaces.utils.DateUtil
import kotlin.math.ceil
Expand Down Expand Up @@ -52,6 +54,24 @@ fun TB.toStringFull(profile: Profile, dateUtil: DateUtil, rh: ResourceHelper): S
}
}

fun TB.toStringFull(profile: Profile, dateUtil: DateUtil, ch: ConcentrationHelper): String {
val timeAndDuration = "${dateUtil.timeString(timestamp)} ${getPassedDurationToTimeInMinutes(dateUtil.now())}/${durationInMinutes}'"

return when {
type == TB.Type.FAKE_EXTENDED -> {
"${ch.basalRateString(PumpRate(rate), true)} (${netExtendedRate(profile)}E) $timeAndDuration"
}

isAbsolute -> {
"${ch.basalRateString(PumpRate(rate), true)} $timeAndDuration"
}

else -> { // percent
"${ch.basalRateString(PumpRate(rate), false)} $timeAndDuration"
}
}
}

fun TB.toStringShort(rh: ResourceHelper): String =
if (isAbsolute || type == TB.Type.FAKE_EXTENDED) rh.gs(app.aaps.core.ui.R.string.pump_base_basal_rate, rate)
else rh.gs(app.aaps.core.ui.R.string.formatPercent, rate)
Expand Down
2 changes: 2 additions & 0 deletions core/ui/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -724,6 +724,7 @@
<string name="clicked_connect_to_pump" comment="26 characters max for translation">Clicked connect to pump</string>
<string name="reservoir_value">%1$.0f / %2$d U</string>
<string name="daily_units">Daily units</string>
<string name="max_daily_units">Max daily units</string>
<string name="pump_icon">Pump icon</string>
<string name="view_profile">View profile</string>
<string name="pump_history">Pump history</string>
Expand All @@ -747,6 +748,7 @@
<string name="firmware" comment="Pump firmware version label">Firmware</string>
<string name="bolusspeed" comment="Speed at which bolus is delivered">Bolus speed</string>
<string name="history" comment="Tab/screen title for viewing past events">History</string>
<string name="overview_reservoir_concentration_value_over">Over %1$s left</string>

<!-- Constraints-->
<string name="limitingbasalratio">Limiting max basal rate to %1$.2f U/h because of %2$s</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import app.aaps.core.interfaces.plugin.ActivePlugin
import app.aaps.core.interfaces.pump.PumpInsulin
import app.aaps.core.interfaces.pump.PumpRate
import app.aaps.core.interfaces.resources.ResourceHelper
import app.aaps.core.interfaces.utils.DateUtil
import app.aaps.core.interfaces.utils.DecimalFormatter
import app.aaps.implementation.R
import javax.inject.Inject
Expand All @@ -18,7 +19,8 @@ class ConcentrationHelperImpl @Inject constructor(
private val activePlugin: ActivePlugin,
private val insulin: Insulin,
private val rh: ResourceHelper,
private val decimalFormatter: DecimalFormatter
private val decimalFormatter: DecimalFormatter,
private val dateUtil: DateUtil
) : ConcentrationHelper {

override fun isU100(): Boolean = concentration == 1.0
Expand Down Expand Up @@ -51,6 +53,12 @@ class ConcentrationHelperImpl @Inject constructor(
}

override fun insulinAmountAgoString(amount: PumpInsulin, ago: String): String = "${insulinAmountString(amount)} $ago"
override fun insulinAmountAgoString(amount: PumpInsulin, lastBolusTime: Long): String? {
val agoHours = (System.currentTimeMillis() - lastBolusTime).toDouble() / 3_600_000.0
return if (agoHours < 6.0) {
"${insulinAmountString(amount)} ${dateUtil.sinceString(lastBolusTime, rh)}"
} else null
}

override fun insulinConcentrationString(): String = rh.gs(R.string.insulin_concentration, (concentration * 100).toInt())

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import androidx.compose.material.icons.filled.Bluetooth
import androidx.compose.material.icons.filled.BluetoothDisabled
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.aaps.core.interfaces.insulin.ConcentrationHelper
import app.aaps.core.interfaces.logging.AAPSLogger
import app.aaps.core.interfaces.logging.LTag
import app.aaps.core.interfaces.pump.PumpInsulin
import app.aaps.core.interfaces.queue.CommandQueue
import app.aaps.core.interfaces.resources.ResourceHelper
import app.aaps.core.interfaces.rx.bus.RxBus
Expand Down Expand Up @@ -42,6 +44,7 @@ import kotlin.math.max
import kotlin.time.ExperimentalTime
import info.nightscout.comboctl.base.Tbr as ComboCtlTbr
import info.nightscout.comboctl.main.Pump as ComboCtlPump
import app.aaps.core.ui.R as CoreUiR

sealed class ComboV2OverviewEvent {
data object StartPairWizard : ComboV2OverviewEvent()
Expand All @@ -62,6 +65,7 @@ class ComboV2OverviewViewModel @Inject constructor(
rxBus: RxBus,
private val commandQueue: CommandQueue,
private val combov2Plugin: ComboV2Plugin,
private val ch: ConcentrationHelper,
@ApplicationContext context: Context
) : ViewModel() {

Expand Down Expand Up @@ -134,7 +138,7 @@ class ComboV2OverviewViewModel @Inject constructor(
fun onRefreshClick() {
aapsLogger.debug(LTag.PUMP, "Refresh button clicked")
combov2Plugin.clearPumpErrorObservedFlag()
commandQueue.readStatus(rh.gs(app.aaps.core.ui.R.string.user_request), null)
commandQueue.readStatus(rh.gs(CoreUiR.string.user_request), null)
}

fun onPairClick() {
Expand All @@ -153,14 +157,14 @@ class ComboV2OverviewViewModel @Inject constructor(
private fun managementActions(isPaired: Boolean): List<PumpAction> = listOf(
if (isPaired) {
PumpAction(
label = rh.gs(app.aaps.core.ui.R.string.pump_unpair),
label = rh.gs(CoreUiR.string.pump_unpair),
icon = Icons.Filled.BluetoothDisabled,
category = ActionCategory.MANAGEMENT,
onClick = { onUnpairClick() }
)
} else {
PumpAction(
label = rh.gs(app.aaps.core.ui.R.string.pairing),
label = rh.gs(CoreUiR.string.pairing),
icon = Icons.Filled.Bluetooth,
category = ActionCategory.MANAGEMENT,
onClick = { onPairClick() }
Expand Down Expand Up @@ -207,15 +211,15 @@ class ComboV2OverviewViewModel @Inject constructor(
snapshot.baseBasalRate?.let {
add(
PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.base_basal_rate_label),
value = rh.gs(app.aaps.core.ui.R.string.pump_base_basal_rate, it)
label = rh.gs(CoreUiR.string.base_basal_rate_label),
value = rh.gs(CoreUiR.string.pump_base_basal_rate, it)
)
)
}
if (snapshot.serialNumber.isNotEmpty()) {
add(
PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.serial_number),
label = rh.gs(CoreUiR.string.serial_number),
value = snapshot.serialNumber
)
)
Expand All @@ -240,8 +244,8 @@ class ComboV2OverviewViewModel @Inject constructor(

val primaryActions = listOf(
PumpAction(
label = rh.gs(app.aaps.core.ui.R.string.refresh),
iconRes = app.aaps.core.ui.R.drawable.ic_refresh,
label = rh.gs(CoreUiR.string.refresh),
iconRes = CoreUiR.drawable.ic_refresh,
category = ActionCategory.PRIMARY,
enabled = refreshEnabled,
onClick = { onRefreshClick() }
Expand All @@ -264,12 +268,12 @@ class ComboV2OverviewViewModel @Inject constructor(

private fun driverStateText(state: ComboV2Plugin.DriverState): String = when (state) {
ComboV2Plugin.DriverState.NotInitialized -> rh.gs(R.string.combov2_not_initialized)
ComboV2Plugin.DriverState.Disconnected -> rh.gs(app.aaps.core.ui.R.string.disconnected)
ComboV2Plugin.DriverState.Connecting -> rh.gs(app.aaps.core.ui.R.string.connecting)
ComboV2Plugin.DriverState.Disconnected -> rh.gs(CoreUiR.string.disconnected)
ComboV2Plugin.DriverState.Connecting -> rh.gs(CoreUiR.string.connecting)
ComboV2Plugin.DriverState.CheckingPump -> rh.gs(R.string.combov2_checking_pump)
ComboV2Plugin.DriverState.Ready -> rh.gs(R.string.combov2_ready)
ComboV2Plugin.DriverState.Suspended -> rh.gs(R.string.combov2_suspended)
ComboV2Plugin.DriverState.Error -> rh.gs(app.aaps.core.ui.R.string.error)
ComboV2Plugin.DriverState.Error -> rh.gs(CoreUiR.string.error)
is ComboV2Plugin.DriverState.ExecutingCommand ->
when (val desc = state.description) {
is ComboCtlPump.GettingBasalProfileCommandDesc ->
Expand Down Expand Up @@ -309,7 +313,7 @@ class ComboV2OverviewViewModel @Inject constructor(
else -> rh.gs(R.string.combov2_no_connection_for_n_mins, secondsPassed / 60) to StatusLevel.CRITICAL
}
return PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.last_connection_label),
label = rh.gs(CoreUiR.string.last_connection_label),
value = text,
level = level
)
Expand All @@ -323,7 +327,7 @@ class ComboV2OverviewViewModel @Inject constructor(
BatteryState.FULL_BATTERY -> rh.gs(R.string.combov2_battery_full) to StatusLevel.NORMAL
}
return PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.battery_label),
label = rh.gs(CoreUiR.string.battery_label),
value = text,
level = level
)
Expand All @@ -337,30 +341,25 @@ class ComboV2OverviewViewModel @Inject constructor(
ReservoirState.FULL -> StatusLevel.NORMAL
}
return PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.reservoir_label),
value = "${reservoirLevel.availableUnits} ${rh.gs(app.aaps.core.ui.R.string.insulin_unit_shortname)}",
label = rh.gs(CoreUiR.string.reservoir_label),
value = ch.insulinAmountString(PumpInsulin(reservoirLevel.availableUnits.toDouble())),
level = level
)
}

@OptIn(ExperimentalTime::class)
private fun lastBolusRow(lastBolus: ComboCtlPump.LastBolus?): PumpInfoRow? {
if (lastBolus == null) return null
val secondsPassed = (System.currentTimeMillis() - lastBolus.timestamp.toEpochMilliseconds()) / 1000
val bolusAgoText = when (secondsPassed) {
in 0..59 -> rh.gs(R.string.combov2_less_than_one_minute_ago)
else -> rh.gs(app.aaps.core.interfaces.R.string.minago, secondsPassed / 60)
}
val text = rh.gs(
R.string.combov2_last_bolus,
lastBolus.bolusAmount.cctlBolusToIU(),
rh.gs(app.aaps.core.ui.R.string.insulin_unit_shortname),
bolusAgoText
)
return PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.last_bolus_label),
value = text
val text = ch.insulinAmountAgoString(
PumpInsulin(lastBolus.bolusAmount.cctlBolusToIU()),
lastBolus.timestamp.toEpochMilliseconds()
)
return text?.let {
PumpInfoRow(
label = rh.gs(CoreUiR.string.last_bolus_label),
value = it
)
}
}

@OptIn(ExperimentalTime::class)
Expand All @@ -375,7 +374,7 @@ class ComboV2OverviewViewModel @Inject constructor(
else
rh.gs(R.string.combov2_current_tbr_less_than_1min, currentTbr.percentage)
return PumpInfoRow(
label = rh.gs(app.aaps.core.ui.R.string.tempbasal_label),
label = rh.gs(CoreUiR.string.tempbasal_label),
value = text
)
}
Expand Down
4 changes: 2 additions & 2 deletions pump/dana/src/main/kotlin/app/aaps/pump/dana/DanaPump.kt
Original file line number Diff line number Diff line change
Expand Up @@ -210,11 +210,11 @@ class DanaPump @Inject constructor(
extendedBolusDuration = 0L
extendedBolusAmount = 0.0
}
private val extendedBolusPassedMinutes: Int
val extendedBolusPassedMinutes: Int
get() = T.msecs(max(0, dateUtil.now() - extendedBolusStart)).mins().toInt()
val extendedBolusRemainingMinutes: Int
get() = max(T.msecs(extendedBolusStart + extendedBolusDuration - dateUtil.now()).mins().toInt(), 0)
private val extendedBolusDurationInMinutes: Int
val extendedBolusDurationInMinutes: Int
get() = T.msecs(extendedBolusDuration).mins().toInt()
var extendedBolusAbsoluteRate: Double
get() = extendedBolusAmount * T.hours(1).msecs() / extendedBolusDuration
Expand Down
Loading