Merge remote-tracking branch 'Nightscout/dev' into wear/new_custom_watchface

This commit is contained in:
Philoul 2023-09-03 09:25:25 +02:00
commit 28dcc86313
109 changed files with 2094 additions and 395 deletions

View file

@ -17,12 +17,15 @@ sealed class EventData : Event() {
@ExperimentalSerializationApi @ExperimentalSerializationApi
fun serializeByte() = ProtoBuf.encodeToByteArray(serializer(), this) fun serializeByte() = ProtoBuf.encodeToByteArray(serializer(), this)
companion object { companion object {
fun deserialize(json: String) = try { fun deserialize(json: String) = try {
Json.decodeFromString(serializer(), json) Json.decodeFromString(serializer(), json)
} catch (ignored: Exception) { } catch (ignored: Exception) {
Error(System.currentTimeMillis()) Error(System.currentTimeMillis())
} }
@ExperimentalSerializationApi @ExperimentalSerializationApi
fun deserializeByte(byteArray: ByteArray) = try { fun deserializeByte(byteArray: ByteArray) = try {
ProtoBuf.decodeFromByteArray(serializer(), byteArray) ProtoBuf.decodeFromByteArray(serializer(), byteArray)
@ -105,7 +108,9 @@ sealed class EventData : Event() {
val duration: Long, val duration: Long,
val timestamp: Long, val timestamp: Long,
val beatsPerMinute: Double, val beatsPerMinute: Double,
val device: String): EventData() { val device: String
) : EventData() {
override fun toString() = override fun toString() =
"HR ${beatsPerMinute.toInt()} at ${DateTime(timestamp)} for ${duration / 1000.0}sec $device" "HR ${beatsPerMinute.toInt()} at ${DateTime(timestamp)} for ${duration / 1000.0}sec $device"
} }
@ -167,7 +172,7 @@ sealed class EventData : Event() {
data class BolusProgress(val percent: Int, val status: String) : EventData() data class BolusProgress(val percent: Int, val status: String) : EventData()
@Serializable @Serializable
data class SingleBg @JvmOverloads constructor( data class SingleBg(
var timeStamp: Long, var timeStamp: Long,
val sgvString: String = "---", val sgvString: String = "---",
val glucoseUnits: String = "-", val glucoseUnits: String = "-",
@ -282,6 +287,7 @@ sealed class EventData : Event() {
val validTo: Int val validTo: Int
) : EventData() ) : EventData()
} }
@Serializable @Serializable
data class ActionSetCustomWatchface( data class ActionSetCustomWatchface(
val customWatchfaceData: CwfData val customWatchfaceData: CwfData

View file

@ -40,6 +40,7 @@
<string name="metadata_wear_import_filename">Failo pavadinimas: %1$s</string> <string name="metadata_wear_import_filename">Failo pavadinimas: %1$s</string>
<string name="metadata_label_plugin_version">Įskiepio versija: %1$s</string> <string name="metadata_label_plugin_version">Įskiepio versija: %1$s</string>
<string name="metadata_label_watchface_name_version">Pavadinimas: %1$s (%2$s)</string> <string name="metadata_label_watchface_name_version">Pavadinimas: %1$s (%2$s)</string>
<string name="metadata_label_watchface_comment">Komentaras: %1$s</string>
<string name="pref_show_iob">Rodyti AIO</string> <string name="pref_show_iob">Rodyti AIO</string>
<string name="pref_show_detailed_iob">Rodyti detalų AIO</string> <string name="pref_show_detailed_iob">Rodyti detalų AIO</string>
<string name="pref_show_cob">Rodyti AAO</string> <string name="pref_show_cob">Rodyti AAO</string>
@ -58,12 +59,18 @@
<string name="wear_default_watchface">Numatytasis ekranas</string> <string name="wear_default_watchface">Numatytasis ekranas</string>
<string name="cwf_comment_background">Fono paveiksliukas</string> <string name="cwf_comment_background">Fono paveiksliukas</string>
<string name="cwf_comment_chart">Grafikai (glikemija, bazė, prognozės...)</string> <string name="cwf_comment_chart">Grafikai (glikemija, bazė, prognozės...)</string>
<string name="cwf_comment_cover_chart">Paveiksliukas už teksto ir prieš grafiką</string>
<string name="cwf_comment_freetext1">Laisvas tekstas 1</string> <string name="cwf_comment_freetext1">Laisvas tekstas 1</string>
<string name="cwf_comment_freetext2">Laisvas tekstas 2</string> <string name="cwf_comment_freetext2">Laisvas tekstas 2</string>
<string name="cwf_comment_freetext3">Laisvas tekstas 3</string> <string name="cwf_comment_freetext3">Laisvas tekstas 3</string>
<string name="cwf_comment_freetext4">Laisvas tekstas 4</string> <string name="cwf_comment_freetext4">Laisvas tekstas 4</string>
<string name="cwf_comment_iob1">Sudėtinis arba detalus AIO</string>
<string name="cwf_comment_iob2">Sudėtinis arba detalus (Boluso_AIO|Bazės_AIO) AIO</string>
<string name="cwf_comment_cob2">AAO vertė</string> <string name="cwf_comment_cob2">AAO vertė</string>
<string name="cwf_comment_delta">Trumpo laikotarpio pokytis</string>
<string name="cwf_comment_avg_delta">Vidutinis pokytis (15 min)</string>
<string name="cwf_comment_uploader_battery">Telefono baterija (%)</string> <string name="cwf_comment_uploader_battery">Telefono baterija (%)</string>
<string name="cwf_comment_rig_battery">Baterija (%)</string>
<string name="cwf_comment_basalRate">Bazė</string> <string name="cwf_comment_basalRate">Bazė</string>
<string name="cwf_comment_bgi">KGI vertė</string> <string name="cwf_comment_bgi">KGI vertė</string>
<string name="cwf_comment_time">Laikas (val:min arba val:min:sek)</string> <string name="cwf_comment_time">Laikas (val:min arba val:min:sek)</string>
@ -78,4 +85,8 @@
<string name="cwf_comment_direction">Tendencijos rodyklė</string> <string name="cwf_comment_direction">Tendencijos rodyklė</string>
<string name="cwf_comment_timestamp">Prieš kiek minučių nuskaityta glikemija</string> <string name="cwf_comment_timestamp">Prieš kiek minučių nuskaityta glikemija</string>
<string name="cwf_comment_sgv">Glikemija</string> <string name="cwf_comment_sgv">Glikemija</string>
<string name="cwf_comment_cover_plate">Paveiksliukas prieš tekstą (skambučius...)</string>
<string name="cwf_comment_hour_hand">Analoginio laikrodžio valandinė rodyklė</string>
<string name="cwf_comment_minute_hand">Analoginio laikrodžio minutinė rodyklė</string>
<string name="cwf_comment_second_hand">Analoginio laikrodžio sekundinė rodyklė</string>
</resources> </resources>

View file

@ -4,6 +4,10 @@
<string name="minago">%1$dm sedan</string> <string name="minago">%1$dm sedan</string>
<string name="minago_long">%1$d minuter sedan</string> <string name="minago_long">%1$d minuter sedan</string>
<string name="hoursago">%1$.1f tim sedan</string> <string name="hoursago">%1$.1f tim sedan</string>
<string name="days_ago">%1$.1f dagar sedan</string>
<string name="days_ago_round">%1$.0f dagar sedan</string>
<string name="in_days">om %1$.0f dagar</string>
<string name="in_days_round">om %1$.0f dagar</string>
<string name="shorthour">h</string> <string name="shorthour">h</string>
<string name="days">dagar</string> <string name="days">dagar</string>
<string name="hours">timmar</string> <string name="hours">timmar</string>
@ -19,6 +23,10 @@
<string name="unit_weeks">veckor</string> <string name="unit_weeks">veckor</string>
<string name="shortminute">m</string> <string name="shortminute">m</string>
<string name="shortday">d</string> <string name="shortday">d</string>
<string name="later_today">Senare idag</string>
<string name="tomorrow">Imorgon</string>
<string name="today">Idag</string>
<string name="yesterday">Igår</string>
<!-- Rx --> <!-- Rx -->
<string name="connecting_for">Ansluter (%1$d s)</string> <string name="connecting_for">Ansluter (%1$d s)</string>
<string name="handshaking">Anslutningen verifieras</string> <string name="handshaking">Anslutningen verifieras</string>
@ -26,4 +34,59 @@
<string name="disconnecting">Kopplar från</string> <string name="disconnecting">Kopplar från</string>
<string name="waiting_for_disconnection">Väntar på frånkoppling</string> <string name="waiting_for_disconnection">Väntar på frånkoppling</string>
<!-- Custom Watchface --> <!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Skapad den: %1$s</string>
<string name="metadata_label_watchface_author">Skapad av: %1$s</string>
<string name="metadata_label_watchface_name">Namn: %1$s</string>
<string name="metadata_wear_import_filename">Filnamn: %1$s</string>
<string name="metadata_label_plugin_version">Plugin-version: %1$s</string>
<string name="metadata_label_watchface_name_version">Namn: %1$s (%2$s)</string>
<string name="pref_show_iob">Visa IOB</string>
<string name="pref_show_detailed_iob">Visa detaljerad IOB</string>
<string name="pref_show_cob">Visa COB</string>
<string name="pref_show_delta">Visa delta</string>
<string name="pref_show_detailed_delta">Visa detaljerad delta</string>
<string name="pref_show_avgdelta">Visa genomsnittlig delta</string>
<string name="pref_show_phone_battery">Visa telefonens batterinivå</string>
<string name="pref_show_rig_battery">Visa riggens batterinivå</string>
<string name="pref_show_basal_rate">Visa basaldos</string>
<string name="pref_show_loop_status">Visa loop-status</string>
<string name="pref_show_bg">Visa BG</string>
<string name="pref_show_bgi">Visa BGI</string>
<string name="pref_show_direction_arrow">Visa riktningspil</string>
<string name="pref_show_ago">Visa tid sedan</string>
<string name="default_custom_watchface_comment">Standard-urtavla - du kan klicka på EXPORTERA URTAVLA för att generera en mall</string>
<string name="wear_default_watchface">Standard-urtavla</string>
<string name="cwf_comment_background">Bakgrundsbild</string>
<string name="cwf_comment_chart">Grafer (BG, basal, prognoslinjer...)</string>
<string name="cwf_comment_cover_chart">Bild framför graf och bakom textfält</string>
<string name="cwf_comment_freetext1">Fritext 1</string>
<string name="cwf_comment_freetext2">Fritext 2</string>
<string name="cwf_comment_freetext3">Fritext 3</string>
<string name="cwf_comment_freetext4">Fritext 4</string>
<string name="cwf_comment_iob1">IOB-etikett. Total IOB om detaljerad</string>
<string name="cwf_comment_iob2">Total IOB. (Bolus_IOB|Basal_IOB) om detaljerad</string>
<string name="cwf_comment_cob1">COB-etikett</string>
<string name="cwf_comment_cob2">COB-värde</string>
<string name="cwf_comment_delta">Kort BG-delta</string>
<string name="cwf_comment_avg_delta">Genomsnittligt BG-delta (15min)</string>
<string name="cwf_comment_uploader_battery">Telefonens batterinivå (%)</string>
<string name="cwf_comment_rig_battery">Globalt loop-batteri (%)</string>
<string name="cwf_comment_basalRate">Basaldos</string>
<string name="cwf_comment_bgi">BGI-värde</string>
<string name="cwf_comment_time">Tid (HH:MM eller HH:MM:SS)</string>
<string name="cwf_comment_hour">Timme (HH)</string>
<string name="cwf_comment_minute">Minut (MM)</string>
<string name="cwf_comment_second">Sekund (SS)</string>
<string name="cwf_comment_timePeriod">AM eller PM</string>
<string name="cwf_comment_day_name">Namn på veckodagen</string>
<string name="cwf_comment_day">Dag (DD)</string>
<string name="cwf_comment_month">Månadens namn (kort)</string>
<string name="cwf_comment_loop">Loop status och tid</string>
<string name="cwf_comment_direction">Visa riktningspil</string>
<string name="cwf_comment_timestamp">Minuter sedan senast mottaget BG</string>
<string name="cwf_comment_sgv">BG-värde</string>
<string name="cwf_comment_cover_plate">Omslagsbild framför text (visare...)</string>
<string name="cwf_comment_hour_hand">Bild för timvisare (analog klocka)</string>
<string name="cwf_comment_minute_hand">Bild för minutvisare (analog klocka)</string>
<string name="cwf_comment_second_hand">Bild för sekundvisare (analog klocka)</string>
</resources> </resources>

View file

@ -0,0 +1,37 @@
package info.nightscout.androidaps
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.TestAapsSchedulers
import info.nightscout.rx.logging.AAPSLoggerTest
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.Mockito
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.junit.jupiter.MockitoSettings
import org.mockito.quality.Strictness
import java.util.Locale
@ExtendWith(MockitoExtension::class)
@MockitoSettings(strictness = Strictness.LENIENT)
open class TestBase {
val aapsLogger = AAPSLoggerTest()
val aapsSchedulers: AapsSchedulers = TestAapsSchedulers()
@BeforeEach
fun setupLocale() {
Locale.setDefault(Locale.ENGLISH)
System.setProperty("disableFirebase", "true")
}
// Workaround for Kotlin nullability.
// https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791
// https://stackoverflow.com/questions/30305217/is-it-possible-to-use-mockito-in-kotlin
fun <T> anyObject(): T {
Mockito.any<T>()
return uninitialized()
}
@Suppress("Unchecked_Cast")
fun <T> uninitialized(): T = null as T
}

View file

@ -0,0 +1,193 @@
package info.nightscout.rx.weardata
import info.nightscout.androidaps.TestBase
import kotlinx.serialization.ExperimentalSerializationApi
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
@ExperimentalSerializationApi
class EventDataTest : TestBase() {
@BeforeEach
fun setUp() {
}
@Test
fun serializationTest() {
EventData.ActionPong(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.WearException(1, byteArrayOf(0xAA.toByte()), "board", "fingerprint", "sdk", "model", "manufacturer", "product").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.Error(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.CancelBolus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionResendData("data").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionPumpStatus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionLoopStatus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionTddStatus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionECarbsPreCheck(1, 2, 3).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionBolusPreCheck(1.0, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionFillPreCheck(1.0).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionFillPresetPreCheck(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchSendInitialData(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchPreCheck(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionWizardPreCheck(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionQuickWizardPreCheck("guid").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionHeartRate(1, 2, 3.0, "device").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionTempTargetPreCheck(EventData.ActionTempTargetPreCheck.TempTargetCommand.CANCEL).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionWizardConfirmed(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionTempTargetConfirmed(false).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionBolusConfirmed(1.0, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionECarbsConfirmed(1, 2, 3).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionFillConfirmed(1.0).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchConfirmed(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.OpenLoopRequestConfirmed(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.CancelNotification(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
// EventData.ActionGetCustomWatchface(EventData.ActionSetCustomWatchface(CwfData())).let {
// Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
// Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
// }
EventData.ActionPing(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.OpenSettings(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.BolusProgress(1, "status").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.GraphData(arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.TreatmentData(
arrayListOf(EventData.TreatmentData.TempBasal(1, 2.0, 3, 4.0, 5.0)),
arrayListOf(EventData.TreatmentData.Basal(1, 2, 3.0)),
arrayListOf(EventData.TreatmentData.Treatment(1, 2.0, 3.0, true, true)),
arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))
).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.Preferences(1, true, true, 2, 3, 4.0, 5.0, 6.0, 7, 8).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.QuickWizard(arrayListOf(EventData.QuickWizard.QuickWizardEntry("1", "2", 3, 4, 5))).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
// EventData.ActionSetCustomWatchface().let {
// Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
// Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
// }
EventData.ActionrequestCustomWatchface(true).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionrequestSetDefaultWatchface(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchOpenActivity(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.OpenLoopRequest("1", "2", null).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ConfirmAction("1", "2", null).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.SnoozeAlert(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
}
}

View file

@ -33,6 +33,8 @@
<string name="enable_carbs_req_alert">Varna om kolhydrater behövs</string> <string name="enable_carbs_req_alert">Varna om kolhydrater behövs</string>
<string name="open_navigation">Öppna menyn</string> <string name="open_navigation">Öppna menyn</string>
<string name="close_navigation">Stäng menyn</string> <string name="close_navigation">Stäng menyn</string>
<string name="remove_items">Ta bort objekt</string>
<string name="sort_items">Sortera objekt</string>
<string name="error_adding_treatment_title">Behandlingsdata ofullständigt</string> <string name="error_adding_treatment_title">Behandlingsdata ofullständigt</string>
<string name="error_adding_treatment_message">En behandling (insulin: %1$.2f, kolhydrater: %2$d, tid: %3$s) kunde inte läggas till listan i Behandlingar. Vänligen kontrollera och lägg till en post manuellt vid behov.</string> <string name="error_adding_treatment_message">En behandling (insulin: %1$.2f, kolhydrater: %2$d, tid: %3$s) kunde inte läggas till listan i Behandlingar. Vänligen kontrollera och lägg till en post manuellt vid behov.</string>
<string name="generated_ecarbs_note">eCarbs: %1$d g (%2$d h), fördröjd i %3$d m</string> <string name="generated_ecarbs_note">eCarbs: %1$d g (%2$d h), fördröjd i %3$d m</string>
@ -46,8 +48,13 @@
<string name="clear_filter">Rensa filter</string> <string name="clear_filter">Rensa filter</string>
<string name="cannula">Kanyl</string> <string name="cannula">Kanyl</string>
<string name="email_address">E-postadress</string> <string name="email_address">E-postadress</string>
<string name="remove_bg_readings">Ta bort BG-värden</string>
<string name="identification_not_set">Identifiering inte angiven i dev-läge</string> <string name="identification_not_set">Identifiering inte angiven i dev-läge</string>
<string name="a11y_dialog">dialog</string> <string name="a11y_dialog">dialog</string>
<!-- WEAR OS--> <!-- WEAR OS-->
<string name="wear_unknown_action_string">Okänt kommando:</string> <string name="wear_unknown_action_string">Okänt kommando:</string>
<string name="remove_selected_items">Ta bort valda objekt</string>
<string name="count_selected">%1$d valda</string>
<string name="sort_label">Sortera</string>
<string name="search">Sök</string>
</resources> </resources>

View file

@ -11,7 +11,7 @@ buildscript {
rxkotlin_version = '3.0.1' rxkotlin_version = '3.0.1'
room_version = '2.5.2' room_version = '2.5.2'
lifecycle_version = '2.6.1' lifecycle_version = '2.6.1'
dagger_version = '2.47' dagger_version = '2.48'
coroutines_version = '1.7.3' coroutines_version = '1.7.3'
activity_version = '1.7.2' activity_version = '1.7.2'
fragmentktx_version = '1.6.1' fragmentktx_version = '1.6.1'
@ -48,10 +48,10 @@ buildscript {
replayshare_version = '2.2.0' replayshare_version = '2.2.0'
wearable_version = '2.9.0' wearable_version = '2.9.0'
play_services_wearable_version = '18.0.0' play_services_wearable_version = '18.1.0'
play_services_location_version = '21.0.1' play_services_location_version = '21.0.1'
kotlinx_datetime_version = '0.4.0' kotlinx_datetime_version = '0.4.1'
kotlinx_serialization_version = '1.6.0' kotlinx_serialization_version = '1.6.0'
caverock_androidsvg_version = '1.4' caverock_androidsvg_version = '1.4'

View file

@ -47,6 +47,15 @@ interface OverviewData {
* BG * BG
*/ */
/**
* Get newest glucose value from bucketed data.
* If there are less than 3 glucose values, bucketed data is not created.
* In this case take newest [GlucoseValue] from db and convert it to [InMemoryGlucoseValue]
*
* Intended for display on screen only
*
* @return newest glucose value
*/
fun lastBg(autosensDataStore: AutosensDataStore): InMemoryGlucoseValue? fun lastBg(autosensDataStore: AutosensDataStore): InMemoryGlucoseValue?
fun isLow(autosensDataStore: AutosensDataStore): Boolean fun isLow(autosensDataStore: AutosensDataStore): Boolean
fun isHigh(autosensDataStore: AutosensDataStore): Boolean fun isHigh(autosensDataStore: AutosensDataStore): Boolean

View file

@ -5,6 +5,9 @@ import org.json.JSONArray
interface ProfileSource { interface ProfileSource {
/**
* SingleProfile stores a name of a profile in addition to PureProfile
*/
class SingleProfile( class SingleProfile(
var name: String, var name: String,
var mgdl: Boolean, var mgdl: Boolean,
@ -31,11 +34,41 @@ interface ProfileSource {
val profile: ProfileStore? val profile: ProfileStore?
val profileName: String? val profileName: String?
fun addProfile(p: SingleProfile) fun addProfile(p: SingleProfile)
/**
* Convert [PureProfile] to [SingleProfile]
*
* @param pureProfile PureProfile
* @param newName Name
* @return SingleProfile
*/
fun copyFrom(pureProfile: PureProfile, newName: String): SingleProfile fun copyFrom(pureProfile: PureProfile, newName: String): SingleProfile
/**
* Currently edited profile in store as index
*/
var currentProfileIndex: Int var currentProfileIndex: Int
/**
* Get currently edited profile from store as [SingleProfile]
*
* @return currently selected profile
*/
fun currentProfile(): SingleProfile? fun currentProfile(): SingleProfile?
fun storeSettings(activity: FragmentActivity? = null, emptyCreated: Boolean = false)
/**
* Store active [ProfileStore] to SharedPreferences
*
* @param activity context for error dialog
* @param timestamp timestamp of latest change
*/
fun storeSettings(activity: FragmentActivity? = null, timestamp: Long)
/**
* Import [ProfileStore] to memory and and save to SharedPreferences
*
* @param store ProfileStore to import
*/
fun loadFromStore(store: ProfileStore) fun loadFromStore(store: ProfileStore)
} }

View file

@ -1,7 +1,5 @@
package info.nightscout.interfaces.source package info.nightscout.interfaces.source
import info.nightscout.database.entities.GlucoseValue
interface BgSource { interface BgSource {
/** /**
@ -18,12 +16,4 @@ interface BgSource {
*/ */
val sensorBatteryLevel: Int val sensorBatteryLevel: Int
get() = -1 get() = -1
/**
* Decide if GlucoseValue should be uploaded to NS
*
* @param glucoseValue glucose value
* @return true if GlucoseValue should be uploaded to NS (supported by plugin and enabled in preferences)
*/
fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean
} }

View file

@ -1,3 +0,0 @@
package info.nightscout.interfaces.source
interface DoingOwnUploadSource

View file

@ -1,5 +1,5 @@
package info.nightscout.interfaces.source package info.nightscout.interfaces.source
interface XDrip { interface XDripSource {
fun isEnabled(): Boolean fun isEnabled(): Boolean
} }

View file

@ -44,4 +44,13 @@ interface DataSyncSelector {
fun resetToNextFullSync() fun resetToNextFullSync()
suspend fun doUpload() suspend fun doUpload()
/**
* This function called when new profile is received from NS
* Plugin should update internal timestamp to not send Profile back as a new/updated
*
* @param timestamp received timestamp of profile
*
*/
fun profileReceived(timestamp: Long)
} }

View file

@ -6,6 +6,7 @@ import info.nightscout.database.entities.TemporaryBasal
import info.nightscout.database.entities.interfaces.end import info.nightscout.database.entities.interfaces.end
import info.nightscout.interfaces.aps.AutosensResult import info.nightscout.interfaces.aps.AutosensResult
import info.nightscout.interfaces.insulin.Insulin import info.nightscout.interfaces.insulin.Insulin
import info.nightscout.interfaces.iob.Iob
import info.nightscout.interfaces.iob.IobTotal import info.nightscout.interfaces.iob.IobTotal
import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.DecimalFormatter import info.nightscout.interfaces.utils.DecimalFormatter
@ -45,6 +46,7 @@ fun ExtendedBolus.toTemporaryBasal(profile: Profile): TemporaryBasal =
) )
fun ExtendedBolus.iobCalc(time: Long, profile: Profile, insulinInterface: Insulin): IobTotal { fun ExtendedBolus.iobCalc(time: Long, profile: Profile, insulinInterface: Insulin): IobTotal {
if (!isValid) return IobTotal(time)
val result = IobTotal(time) val result = IobTotal(time)
val realDuration = getPassedDurationToTimeInMinutes(time) val realDuration = getPassedDurationToTimeInMinutes(time)
if (realDuration > 0) { if (realDuration > 0) {

View file

@ -6,15 +6,26 @@
<string name="application_protection">Skydd för app</string> <string name="application_protection">Skydd för app</string>
<string name="bolus_protection">Bolusskydd</string> <string name="bolus_protection">Bolusskydd</string>
<string name="settings_password">Lösenord för inställningar</string> <string name="settings_password">Lösenord för inställningar</string>
<string name="settings_pin">Inställningar PIN-kod</string>
<string name="application_password">Lösenord för app</string> <string name="application_password">Lösenord för app</string>
<string name="application_pin">PIN-kod för appen</string>
<string name="bolus_password">Lösenord för bolus</string> <string name="bolus_password">Lösenord för bolus</string>
<string name="bolus_pin">PIN-kod för bolus</string>
<string name="protection_timeout_title">Lösenord och PIN-lagring [s]</string>
<string name="protection_timeout_summary">Tid innan lösenord eller PIN-kod måste anges</string>
<string name="biometric">Biometri</string> <string name="biometric">Biometri</string>
<string name="custom_password">Eget lösenord</string> <string name="custom_password">Eget lösenord</string>
<string name="custom_pin">Egen PIN-kod</string>
<string name="noprotection">Inget skydd</string> <string name="noprotection">Inget skydd</string>
<string name="unsecure_fallback_biometric">Osäker alternativ autentisering</string> <string name="unsecure_fallback_biometric">Osäker alternativ autentisering</string>
<string name="unsecure_fallback_descriotion_biometric">Biometrisk verifiering kräver att huvudlösenordet är inställt (som reservlösning).\n\nVänligen sätt ett huvudlösenord!</string> <string name="unsecure_fallback_descriotion_biometric">Biometrisk verifiering kräver att huvudlösenordet är inställt (som reservlösning).\n\nVänligen sätt ett huvudlösenord!</string>
<string name="password_set">Lösenord sparat!</string> <string name="password_set">Lösenord sparat!</string>
<string name="pin_set">PIN-kod angiven</string>
<string name="password_not_set">Lösenord inte inställt</string> <string name="password_not_set">Lösenord inte inställt</string>
<string name="pin_not_set">PIN-kod inte angiven</string>
<string name="password_not_changed">Lösenordet har inte ändrats</string> <string name="password_not_changed">Lösenordet har inte ändrats</string>
<string name="pin_not_changed">PIN-koden inte ändrad</string>
<string name="pin_cleared">PIN-kod borttagen</string>
<string name="password_hint">Ange lösenord här</string> <string name="password_hint">Ange lösenord här</string>
<string name="pin_hint">Ange PIN-kod här</string>
</resources> </resources>

View file

@ -14,6 +14,7 @@
<string name="pump_base_basal_rate">%1$.2f U/h</string> <string name="pump_base_basal_rate">%1$.2f U/h</string>
<string name="pump_not_initialized_profile_not_set">Pump inte initierad, ingen profil vald.</string> <string name="pump_not_initialized_profile_not_set">Pump inte initierad, ingen profil vald.</string>
<string name="failed_update_basal_profile">Lyckades inte uppdatera basalprofilen</string> <string name="failed_update_basal_profile">Lyckades inte uppdatera basalprofilen</string>
<string name="bolus_delivered_successfully">Bolus %1$.2f U levererad</string>
<string name="no_valid_basal_rate">Ingen giltig data om temp basaler fanns i pumpen</string> <string name="no_valid_basal_rate">Ingen giltig data om temp basaler fanns i pumpen</string>
<string name="limiting_iob">Begränsar IOB till %1$.1f pga %2$s</string> <string name="limiting_iob">Begränsar IOB till %1$.1f pga %2$s</string>
<string name="loop_disabled">LOOP INAKTIVERAD PGA BEGRÄNSNINGAR</string> <string name="loop_disabled">LOOP INAKTIVERAD PGA BEGRÄNSNINGAR</string>
@ -44,12 +45,15 @@
<string name="mute5min">Tysta i 5 minuter</string> <string name="mute5min">Tysta i 5 minuter</string>
<string name="mute">Tysta</string> <string name="mute">Tysta</string>
<string name="success">Lyckad</string> <string name="success">Lyckad</string>
<string name="advanced_settings_title">Avancerade inställningar</string>
<string name="extendedbolusdeliveryerror">Förlängd bolus misslyckad</string> <string name="extendedbolusdeliveryerror">Förlängd bolus misslyckad</string>
<string name="aps_mode_title">APS-läge</string>
<string name="extended_bolus">Förlängd bolus</string> <string name="extended_bolus">Förlängd bolus</string>
<string name="paused">Pausad</string> <string name="paused">Pausad</string>
<string name="tdd_total">TDD totalt</string> <string name="tdd_total">TDD totalt</string>
<string name="goingtodeliver">Kommer att leverera %1$.2f enheter</string> <string name="goingtodeliver">Kommer att leverera %1$.2f enheter</string>
<string name="waitingforpump">Väntar på pump</string> <string name="waitingforpump">Väntar på pump</string>
<string name="androidaps_start">AAPS startad</string>
<string name="formatsignedinsulinunits">%1$+.2f U</string> <string name="formatsignedinsulinunits">%1$+.2f U</string>
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="format_hours">%1$.2f h</string> <string name="format_hours">%1$.2f h</string>
@ -58,6 +62,8 @@
<string name="please_wait">Var god vänta…</string> <string name="please_wait">Var god vänta…</string>
<string name="stop">Stopp</string> <string name="stop">Stopp</string>
<string name="carbs">Kolhydrater</string> <string name="carbs">Kolhydrater</string>
<string name="invalid_profile">Ogiltig profil!</string>
<string name="no_profile_set">INGEN PROFIL VALD</string>
<string name="active"><![CDATA[<Aktiv>]]></string> <string name="active"><![CDATA[<Aktiv>]]></string>
<string name="date">Datum</string> <string name="date">Datum</string>
<string name="units_label">Enheter</string> <string name="units_label">Enheter</string>
@ -100,6 +106,7 @@
<string name="loading">Laddar…</string> <string name="loading">Laddar…</string>
<string name="notes_label">Anteckning</string> <string name="notes_label">Anteckning</string>
<string name="remove_button">Ta bort</string> <string name="remove_button">Ta bort</string>
<string name="add_new">Lägg till ny</string>
<string name="addnew_above">Lägg till nytt ovan</string> <string name="addnew_above">Lägg till nytt ovan</string>
<string name="wrong_pump_data">Data kommer från en annan pump. Byt pumpdrivrutin för att återställa.</string> <string name="wrong_pump_data">Data kommer från en annan pump. Byt pumpdrivrutin för att återställa.</string>
<string name="bg_label">BG</string> <string name="bg_label">BG</string>
@ -135,6 +142,8 @@
<string name="reset">Återställ</string> <string name="reset">Återställ</string>
<string name="profileswitch_ismissing">Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil.</string> <string name="profileswitch_ismissing">Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil.</string>
<string name="profile">Profil</string> <string name="profile">Profil</string>
<string name="select_for_removal">Markera för borttagning</string>
<string name="confirm_remove_multiple_items">Är du säker på att du vill ta bort %1$d objekt</string>
<string name="overview_treatment_label">Behandling</string> <string name="overview_treatment_label">Behandling</string>
<string name="copytolocalprofile">Skapa kopia av denna profil?</string> <string name="copytolocalprofile">Skapa kopia av denna profil?</string>
<string name="wear_wizard_settings">Kalkylatorinställningar</string> <string name="wear_wizard_settings">Kalkylatorinställningar</string>
@ -144,6 +153,7 @@
<string name="treatments_wizard_basaliob_label">IOB från basal</string> <string name="treatments_wizard_basaliob_label">IOB från basal</string>
<string name="invalid">OGILTIG</string> <string name="invalid">OGILTIG</string>
<string name="login">Logga in</string> <string name="login">Logga in</string>
<string name="prime_fill">Prime/Fyll</string>
<string name="overview_insulin_label">Insulin</string> <string name="overview_insulin_label">Insulin</string>
<string name="stoptemptarget">Avbryt temp mål</string> <string name="stoptemptarget">Avbryt temp mål</string>
<string name="closedloop">Closed Loop</string> <string name="closedloop">Closed Loop</string>
@ -152,13 +162,19 @@
<string name="dia">Duration</string> <string name="dia">Duration</string>
<string name="ic_short">IC</string> <string name="ic_short">IC</string>
<string name="isf_short">ISF</string> <string name="isf_short">ISF</string>
<string name="canceling_tbr_failed">Det gick inte att avbryta temp-basal</string>
<string name="canceling_eb_failed">Det gick inte att avbryta förlängd bolus</string>
<string name="virtualpump_uploadstatus_title">Ladda upp status till Nightscout eller Tidepool</string>
<string name="suspendloop_label">Inaktiverad/pausad loop</string> <string name="suspendloop_label">Inaktiverad/pausad loop</string>
<string name="iob_label">Aktivt Insulin (IOB)</string> <string name="iob_label">Aktivt Insulin (IOB)</string>
<!-- Protection--> <!-- Protection-->
<string name="wrongpassword">Fel lösenord</string> <string name="wrongpassword">Fel lösenord</string>
<string name="wrongpin">Fel PIN-kod</string>
<string name="passwords_dont_match">Lösenorden stämmer inte överens</string> <string name="passwords_dont_match">Lösenorden stämmer inte överens</string>
<string name="pin_dont_match">PIN-koderna överensstämmer inte</string>
<!-- Profile--> <!-- Profile-->
<string name="basalprofilenotaligned">Profilens basaler är inte satta på hel timme: %1$s</string> <string name="basalprofilenotaligned">Profilens basaler är inte satta på hel timme: %1$s</string>
<string name="minimalbasalvaluereplaced">Basalvärdet ersatt med det lägsta tillåtna: %1$s</string>
<string name="maximumbasalvaluereplaced">Basalvärdet ersatt med det högsta tillåtna: %1$s</string> <string name="maximumbasalvaluereplaced">Basalvärdet ersatt med det högsta tillåtna: %1$s</string>
<string name="profile_per_unit">/U</string> <string name="profile_per_unit">/U</string>
<string name="profile_ins_units_per_hour">U/h</string> <string name="profile_ins_units_per_hour">U/h</string>
@ -166,6 +182,7 @@
<!-- ProfileFunction--> <!-- ProfileFunction-->
<string name="startprofile">Byt till profil %1$d%% i %2$d min</string> <string name="startprofile">Byt till profil %1$d%% i %2$d min</string>
<!-- APSResult--> <!-- APSResult-->
<string name="cancel_temp">Avbryt temp-basal</string>
<string name="let_temp_basal_run">Låt temp basalen gå</string> <string name="let_temp_basal_run">Låt temp basalen gå</string>
<string name="rate">Basaldos</string> <string name="rate">Basaldos</string>
<string name="duration">Duration</string> <string name="duration">Duration</string>
@ -187,9 +204,12 @@
<string name="careportal_note_message">Anteckning: %1$s</string> <string name="careportal_note_message">Anteckning: %1$s</string>
<string name="careportal_question_message">Fråga : %1$s</string> <string name="careportal_question_message">Fråga : %1$s</string>
<string name="careportal_exercise_message">Träning : %1$s</string> <string name="careportal_exercise_message">Träning : %1$s</string>
<string name="careportal_pump_site_change">Pump/nålbyte</string>
<string name="cgm_sensor_insert">Sensorbyte</string>
<string name="careportal_cgmsensorstart">Start CGM-sensor</string> <string name="careportal_cgmsensorstart">Start CGM-sensor</string>
<string name="careportal_cgm_sensor_stop">Stoppa CGM-sensor</string> <string name="careportal_cgm_sensor_stop">Stoppa CGM-sensor</string>
<string name="careportal_dad_alert">Diabeteshundlarm</string> <string name="careportal_dad_alert">Diabeteshundlarm</string>
<string name="careportal_insulin_cartridge_change">Byte av insulinreservoar</string>
<string name="careportal_profileswitch">Profilbyte</string> <string name="careportal_profileswitch">Profilbyte</string>
<string name="careportal_snackbolus">Mellanmålsbolus</string> <string name="careportal_snackbolus">Mellanmålsbolus</string>
<string name="careportal_mealbolus">Måltidsbolus</string> <string name="careportal_mealbolus">Måltidsbolus</string>
@ -199,6 +219,8 @@
<string name="careportal_tempbasalend">Temp basal slut</string> <string name="careportal_tempbasalend">Temp basal slut</string>
<string name="careportal_carbscorrection">KH-korrektion</string> <string name="careportal_carbscorrection">KH-korrektion</string>
<string name="careportal_openapsoffline">OpenAPS Offline</string> <string name="careportal_openapsoffline">OpenAPS Offline</string>
<string name="pump_battery_change">Byte av pumpbatteri</string>
<string name="temporary_target">Tillfälligt mål</string>
<string name="careportal_temporarytargetvalue">Temp målvärde</string> <string name="careportal_temporarytargetvalue">Temp målvärde</string>
<string name="careportal_temporarytargetcancel">Avbryt temp mål</string> <string name="careportal_temporarytargetcancel">Avbryt temp mål</string>
<string name="boluswizard">Kalkylator</string> <string name="boluswizard">Kalkylator</string>
@ -225,7 +247,9 @@
<string name="waitingforpumpresult">Väntar på resultat</string> <string name="waitingforpumpresult">Väntar på resultat</string>
<string name="smb_shortname">SMB</string> <string name="smb_shortname">SMB</string>
<!-- CarbsReq--> <!-- CarbsReq-->
<string name="carbsreq">%1$d g kolhydrater behövs inom %2$d minuter</string>
<!-- TDDStatsActivity--> <!-- TDDStatsActivity-->
<string name="cumulative_tdd">Sammanlagd TDD</string>
<string name="expweight">Exponentiellt viktad TDD</string> <string name="expweight">Exponentiellt viktad TDD</string>
<string name="basalrate">Basal</string> <string name="basalrate">Basal</string>
<string name="bolus">Bolus</string> <string name="bolus">Bolus</string>
@ -234,6 +258,7 @@
<string name="amount_days">Antal dagar</string> <string name="amount_days">Antal dagar</string>
<string name="weight">Vikt</string> <string name="weight">Vikt</string>
<string name="warning_Message">Kan visa fel om man använder bolus för förfyllning!</string> <string name="warning_Message">Kan visa fel om man använder bolus för förfyllning!</string>
<string name="olddata_Message">Gammal data, vänligen tryck på \"UPPDATERA\"</string>
<string name="tbb">Total grundbasal</string> <string name="tbb">Total grundbasal</string>
<string name="tbb2">TDB * 2</string> <string name="tbb2">TDB * 2</string>
<!-- Ntp--> <!-- Ntp-->
@ -306,9 +331,11 @@
<string name="uel_stat_reset">ÅTERSTÄLL STATISTIK</string> <string name="uel_stat_reset">ÅTERSTÄLL STATISTIK</string>
<string name="uel_delete_logs">RADERA LOGGAR</string> <string name="uel_delete_logs">RADERA LOGGAR</string>
<string name="uel_delete_future_treatments">RADERA FRAMTIDA BEHANDLINGAR</string> <string name="uel_delete_future_treatments">RADERA FRAMTIDA BEHANDLINGAR</string>
<string name="delete_future_treatments">Radera framtida behandlingar</string>
<string name="uel_export_settings">EXPORTERA INSTÄLLNINGAR</string> <string name="uel_export_settings">EXPORTERA INSTÄLLNINGAR</string>
<string name="uel_import_settings">IMPORTERA INSTÄLLNINGAR</string> <string name="uel_import_settings">IMPORTERA INSTÄLLNINGAR</string>
<string name="uel_reset_databases">ÅTERSTÄLL DATABASERNA</string> <string name="uel_reset_databases">ÅTERSTÄLL DATABASERNA</string>
<string name="uel_cleanup_databases">RENSA DATABASER</string>
<string name="uel_export_databases">EXPORTERA DATABASERNA</string> <string name="uel_export_databases">EXPORTERA DATABASERNA</string>
<string name="uel_import_databases">IMPORTERA DATABASER</string> <string name="uel_import_databases">IMPORTERA DATABASER</string>
<string name="uel_otp_export">EXPORTERA OTP</string> <string name="uel_otp_export">EXPORTERA OTP</string>
@ -349,6 +376,9 @@
<string name="carbs_g">KH %1$d g</string> <string name="carbs_g">KH %1$d g</string>
<string name="extended_bolus_u_min">FÖRLÄNGD BOLUS %1$.2f U %2$d min</string> <string name="extended_bolus_u_min">FÖRLÄNGD BOLUS %1$.2f U %2$d min</string>
<string name="load_events">HÄMTA HÄNDELSER</string> <string name="load_events">HÄMTA HÄNDELSER</string>
<string name="clear_alarms">RENSA LARM</string>
<string name="deactivate">AVAKTIVERA</string>
<string name="update_time">UPPDATERAD TID</string>
<string name="load_history">HÄMTA HISTORIK %1$d</string> <string name="load_history">HÄMTA HISTORIK %1$d</string>
<string name="load_tdds">HÄMTA TDD</string> <string name="load_tdds">HÄMTA TDD</string>
<string name="set_profile">SPARA PROFIL</string> <string name="set_profile">SPARA PROFIL</string>
@ -366,28 +396,81 @@
<string name="formatPercent">%1$.0f%%</string> <string name="formatPercent">%1$.0f%%</string>
<string name="basal">Basal</string> <string name="basal">Basal</string>
<string name="basalpct">Basal %</string> <string name="basalpct">Basal %</string>
<string name="a11y_file">fil</string>
<string name="a11y_user">ditt namn</string> <string name="a11y_user">ditt namn</string>
<!-- Autotune --> <!-- Autotune -->
<string name="autotune">Autotune</string>
<string name="autotune_description">Hjälp för potentiella justeringar av profil (ISF, KH-kvoter och basaldoser)</string>
<string name="autotune_shortname">AT</string>
<string name="autotune_settings">Autotune-inställningar</string>
<string name="autotune_auto_title">Automatiskt profilbyte</string>
<string name="autotune_auto_summary">Om aktiverad kommer Autotune automatiskt uppdatera profilen efter beräkning.</string>
<string name="autotune_categorize_uam_as_basal_title">Kategorisera UAM som basal</string>
<string name="autotune_categorize_uam_as_basal_summary">Aktivera endast om du på ett tillförlitligt sätt har matat in alla kolhydrater. Med detta alternativ aktiverat kommer Autotune se plötsliga höjningar och rekommendera ändringar av basal-nivån.</string>
<string name="autotune_tune_insulin_curve_title">Justera insulinkurvan</string>
<string name="autotune_tune_insulin_curve_summary">Aktivera endast om du använder Free-Peak Oref. Detta alternativ kommer att justera topp och längd för DIA</string>
<string name="autotune_default_tune_days_title">Antal dagar med data</string>
<string name="autotune_circadian_ic_isf_title">Tillämpa genomsnitt för ISF och KH-kvot</string>
<string name="autotune_circadian_ic_isf_summary">Autotune kommer inte att justera variationer över dygnet för ISF eller KH-kvoter. Det här alternativet tillämpar bara genomsnittlig inställning över hela dygnet</string>
<string name="autotune_additional_log_title">Inkludera mer logginformation för felsökning</string>
<string name="autotune_additional_log_summary">Slå på endast om utvecklare bett dig att skicka mer logginformation för att underlätta felsökning av Autotune-plugin</string>
<string name="autotune_default_tune_days_summary">Antal dagar data att inkludera för Autotune (upp till 30)</string>
<string name="autotune_tunedprofile_name">Justerad</string>
<string name="autotune_profile">Profil :</string>
<string name="autotune_tune_days">Justering dagar :</string>
<string name="autotune_last_run">Kördes senast:</string>
<string name="autotune_warning">Varning :</string>
<string name="autotune_select_profile">Välj profil att justera</string>
<string name="autotune_ic_warning">Vald profil har %1$d IC-värden. Autotune kommer att använda %2$.2f g/U</string>
<string name="autotune_isf_warning">Vald profil har %1$d ISF-värden. Autotune kommer att använda %2$.1f %3$s/U</string>
<string name="autotune_error">Fel i angivet data, försök köra autotune igen eller minska antalet dagar</string>
<string name="autotune_error_more_days">Fel i angivet data, öka antalet dagar</string>
<string name="autotune_warning_during_run">Autotune-beräkning startad, det kan ta en stund</string>
<string name="autotune_warning_after_run">Kontrollera resultatet noggrant innan du använder det!</string>
<string name="autotune_partial_result">Delresultat för dag %1$d / %2$d justerat</string>
<string name="autotune_result">Resultat: %1$s</string> <string name="autotune_result">Resultat: %1$s</string>
<string name="autotune_param">Parameter</string>
<string name="autotune_percent">%</string>
<string name="autotune_missing">Saknas:</string> <string name="autotune_missing">Saknas:</string>
<string name="autotune_profile_name">Autotune-profil %1$s</string>
<string name="autotune_run">Kör Autotune</string>
<string name="autotune_check_input_profile_button">Kontrollera profilen</string>
<string name="autotune_compare_profile">Jämför profiler</string> <string name="autotune_compare_profile">Jämför profiler</string>
<string name="autotune_copy_localprofile_button">Kopiera till lokal profil</string>
<string name="autotune_update_input_profile_button">Uppdatera angiven profil</string>
<string name="autotune_revert_input_profile_button">Återställ angiven profil</string>
<string name="autotune_copy_local_profile_message">Skapa en ny lokal profil av denna Autotune-profil?</string>
<string name="autotune_update_local_profile_message">Uppdatera %1$s med Autotune-profil?</string>
<string name="autotune_revert_local_profile_message">Återställ %1$s med angiven profil?</string>
<string name="autotune_profile_invalid">Felaktig profil</string>
<string name="autotune_run_without_autoswitch">Autotune kördes utan byte av profil</string>
<string name="autotune_run_with_autoswitch">Autotune körde och profilen byttes automatiskt</string>
<string name="autotune_run_with_error">Fel under senaste körning av Autotune</string>
<string name="autotune_run_cancelled">En annan Autotune-körning upptäcktes, körning avbruten</string>
<!-- Alerts --> <!-- Alerts -->
<string name="raise_notifications_as_android_notifications">Systemaviseringar för larm &amp; info</string> <string name="raise_notifications_as_android_notifications">Systemaviseringar för larm &amp; info</string>
<string name="urgent_alarm">Akut larm</string> <string name="urgent_alarm">Akut larm</string>
<string name="info">INFO</string> <string name="info">INFO</string>
<!-- BolusWizard --> <!-- BolusWizard -->
<string name="bolus_advisor">Bolusguide</string>
<string name="bolus_advisor_message">Ditt blodsocker är högt. Istället för att äta är det rekommenderat att vänta tills det sjunker. Vill du göra en korrigeringsbolus nu och få en påminnelse när det är dags att äta? I det här fallet kommer inga kolhydrater att registreras nu, utan du måste ange måltiden på nytt i kalkylatorn.</string>
<string name="cobvsiob">COB kontra IOB</string> <string name="cobvsiob">COB kontra IOB</string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>Varning! Långsam KH-absorption upptäckt %2$d%% av tiden. Dubbelkolla din beräkning. COB kan vara väldigt missvisande och du riskerar få för mycket insulin!</font>]]></string> <string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>Varning! Långsam KH-absorption upptäckt %2$d%% av tiden. Dubbelkolla din beräkning. COB kan vara väldigt missvisande och du riskerar få för mycket insulin!</font>]]></string>
<string name="partialboluswizard">Direkt bolus [%]</string> <string name="partialboluswizard">Direkt bolus [%]</string>
<string name="partialboluswizard_reset_time">Tröskelvärde för gammalt BG-värde [min]</string>
<string name="bolus_constraint_applied_warn">Bolusbegränsning tillämpad: %1$.2f U till %2$.2f U</string>
<string name="bolus_recorded_only">Bolus kommer bara att loggas (inte levereras av pumpen)</string>
<string name="advisoralarm">Larma när det är dags att äta</string> <string name="advisoralarm">Larma när det är dags att äta</string>
<string name="no_action_selected">Ingen åtgärd vald. Inget ändras.</string> <string name="no_action_selected">Ingen åtgärd vald. Inget ändras.</string>
<string name="wizard_no_actual_bg">Inget nytt BG-värde att basera beräkning på!</string> <string name="wizard_no_actual_bg">Inget nytt BG-värde att basera beräkning på!</string>
<string name="wizard_no_active_profile">Ingen aktiv profil vald!</string> <string name="wizard_no_active_profile">Ingen aktiv profil vald!</string>
<string name="wizard_no_cob">Okänt COB! Saknas BG eller är appen nyss omstartad?</string> <string name="wizard_no_cob">Okänt COB! Saknas BG eller är appen nyss omstartad?</string>
<string name="wizard_carbs_constraint">Max KH uppnått!</string> <string name="wizard_carbs_constraint">Max KH uppnått!</string>
<string name="wizard_explain_calc">Kalkyl (IC: %1$.1f, ISF: %2$.1f)</string>
<string name="wizard_explain_carbs">Kolhydrater: %1$.2fU</string> <string name="wizard_explain_carbs">Kolhydrater: %1$.2fU</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fU</string> <string name="wizard_explain_cob">COB: %1$.0fg %2$.2fU</string>
<string name="wizard_explain_bg">BG: %1$.2fU</string> <string name="wizard_explain_bg">BG: %1$.2fU</string>
<string name="wizard_explain_iob">IOB: %1$.2fU</string>
<string name="wizard_explain_superbolus">Superbolus: %1$.2fU</string> <string name="wizard_explain_superbolus">Superbolus: %1$.2fU</string>
<string name="wizard_explain_trend">15\' trend: %1$.2fU</string> <string name="wizard_explain_trend">15\' trend: %1$.2fU</string>
<string name="wizard_explain_percent">Procent: %1$.2fU x %2$d%% ≈ %3$.2fU</string> <string name="wizard_explain_percent">Procent: %1$.2fU x %2$d%% ≈ %3$.2fU</string>
@ -395,10 +478,17 @@
<string name="wizard_explain_tt">TempM: %1$s</string> <string name="wizard_explain_tt">TempM: %1$s</string>
<string name="wizard_explain_tt_to">%1$s till %2$s</string> <string name="wizard_explain_tt_to">%1$s till %2$s</string>
<string name="wizard_pump_not_available">Ingen pump tillgänglig!</string> <string name="wizard_pump_not_available">Ingen pump tillgänglig!</string>
<string name="quickwizard">Snabbknappar</string>
<!-- Preferences--> <!-- Preferences-->
<string name="child">Barn</string>
<string name="teenage">Tonåring</string> <string name="teenage">Tonåring</string>
<string name="adult">Vuxen</string> <string name="adult">Vuxen</string>
<string name="resistant_adult">Insulinresistent vuxen</string>
<string name="pregnant">Gravid</string> <string name="pregnant">Gravid</string>
<string name="patient_age_summary">Välj en patienttyp för att ställa in säkerhetsgränser</string>
<string name="max_bolus_title">Max tillåten bolus [U]</string>
<string name="max_carbs_title">Maximalt tillåtna kolhydrater [g]</string>
<string name="patient_type">Patienttyp</string>
<!-- Protection--> <!-- Protection-->
<string name="unlock_settings">Lås upp inställningar</string> <string name="unlock_settings">Lås upp inställningar</string>
<!-- Pumps --> <!-- Pumps -->
@ -451,6 +541,7 @@
<!-- NumberPicker --> <!-- NumberPicker -->
<string name="a11y_min_button_description">minska %1$s med %2$s</string> <string name="a11y_min_button_description">minska %1$s med %2$s</string>
<string name="a11y_plus_button_description">öka %1$s med %2$s</string> <string name="a11y_plus_button_description">öka %1$s med %2$s</string>
<string name="you_are_on_allowed_limit">Tillåten gräns nådd</string>
<string name="format_hour_minute">%1$dh %2$dm</string> <string name="format_hour_minute">%1$dh %2$dm</string>
<!-- datetime layout --> <!-- datetime layout -->
<string name="event_time_label">Tid</string> <string name="event_time_label">Tid</string>
@ -470,6 +561,9 @@
<!-- SmsCommunicator --> <!-- SmsCommunicator -->
<string name="smscommunicator_missingsmspermission">Saknar behörighet att skicka SMS</string> <string name="smscommunicator_missingsmspermission">Saknar behörighet att skicka SMS</string>
<!-- About --> <!-- About -->
<string name="cta_dont_kill_my_app_info">Döda inte min app?</string>
<string name="fabric_upload_disabled">Uppladdning av kraschloggar inaktiverad!</string>
<string name="about_link_urls">\n\nDokumentation:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsers</string>
<plurals name="days"> <plurals name="days">
<item quantity="one">%1$d dag</item> <item quantity="one">%1$d dag</item>
<item quantity="other">%1$d dagar</item> <item quantity="other">%1$d dagar</item>
@ -483,4 +577,7 @@
<item quantity="other">%1$d min</item> <item quantity="other">%1$d min</item>
</plurals> </plurals>
<!-- Maintenance--> <!-- Maintenance-->
<string name="cleanup_db_confirm">Vill du rensa databasen?\nDet kommer att ta bort spårade ändringar och historiska data äldre än 3 månader.</string>
<string name="cleanup_db_confirm_sync">Vill du rensa databasen?\nDet kommer att ta bort spårade ändringar och historiska data äldre än 3 månader.\nAtt göra det kommer att påskynda full synkronisering dramatiskt.</string>
<string name="cleared_entries">Rensade poster</string>
</resources> </resources>

View file

@ -1,2 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string name="count_selected">%1$d valt</string>
<string name="remove_items">Ta bort objekt</string>
<string name="sort_items">Sortera objekt</string>
<string name="remove_selected_items">Ta bort valda objekt</string>
<string name="sort_label">Sortera</string>
</resources>

View file

@ -10,6 +10,7 @@ import info.nightscout.database.entities.EffectiveProfileSwitch
import info.nightscout.database.entities.ExtendedBolus import info.nightscout.database.entities.ExtendedBolus
import info.nightscout.database.entities.Food import info.nightscout.database.entities.Food
import info.nightscout.database.entities.GlucoseValue import info.nightscout.database.entities.GlucoseValue
import info.nightscout.database.entities.HeartRate
import info.nightscout.database.entities.OfflineEvent import info.nightscout.database.entities.OfflineEvent
import info.nightscout.database.entities.ProfileSwitch import info.nightscout.database.entities.ProfileSwitch
import info.nightscout.database.entities.TemporaryBasal import info.nightscout.database.entities.TemporaryBasal
@ -65,7 +66,7 @@ import kotlin.math.roundToInt
fun <T : Any> runTransactionForResult(transaction: Transaction<T>): Single<T> { fun <T : Any> runTransactionForResult(transaction: Transaction<T>): Single<T> {
val changes = mutableListOf<DBEntry>() val changes = mutableListOf<DBEntry>()
return Single.fromCallable { return Single.fromCallable {
database.runInTransaction(Callable<T> { database.runInTransaction(Callable {
transaction.database = DelegatedAppDatabase(changes, database) transaction.database = DelegatedAppDatabase(changes, database)
transaction.run() transaction.run()
}) })
@ -85,7 +86,7 @@ import kotlin.math.roundToInt
removed.add(Pair("ExtendedBolus", database.extendedBolusDao.deleteOlderThan(than))) removed.add(Pair("ExtendedBolus", database.extendedBolusDao.deleteOlderThan(than)))
removed.add(Pair("Bolus", database.bolusDao.deleteOlderThan(than))) removed.add(Pair("Bolus", database.bolusDao.deleteOlderThan(than)))
removed.add(Pair("MultiWaveBolus", database.multiwaveBolusLinkDao.deleteOlderThan(than))) removed.add(Pair("MultiWaveBolus", database.multiwaveBolusLinkDao.deleteOlderThan(than)))
//removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteOlderThan(than))) // keep TDD removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteOlderThan(than)))
removed.add(Pair("Carbs", database.carbsDao.deleteOlderThan(than))) removed.add(Pair("Carbs", database.carbsDao.deleteOlderThan(than)))
removed.add(Pair("TemporaryTarget", database.temporaryTargetDao.deleteOlderThan(than))) removed.add(Pair("TemporaryTarget", database.temporaryTargetDao.deleteOlderThan(than)))
removed.add(Pair("ApsResultLink", database.apsResultLinkDao.deleteOlderThan(than))) removed.add(Pair("ApsResultLink", database.apsResultLinkDao.deleteOlderThan(than)))
@ -95,10 +96,10 @@ import kotlin.math.roundToInt
removed.add(Pair("EffectiveProfileSwitch", database.effectiveProfileSwitchDao.deleteOlderThan(than))) removed.add(Pair("EffectiveProfileSwitch", database.effectiveProfileSwitchDao.deleteOlderThan(than)))
removed.add(Pair("ProfileSwitch", database.profileSwitchDao.deleteOlderThan(than))) removed.add(Pair("ProfileSwitch", database.profileSwitchDao.deleteOlderThan(than)))
removed.add(Pair("ApsResult", database.apsResultDao.deleteOlderThan(than))) removed.add(Pair("ApsResult", database.apsResultDao.deleteOlderThan(than)))
//database.versionChangeDao.deleteOlderThan(than) // keep version history database.versionChangeDao.deleteOlderThan(than)
removed.add(Pair("UserEntry", database.userEntryDao.deleteOlderThan(than))) removed.add(Pair("UserEntry", database.userEntryDao.deleteOlderThan(than)))
removed.add(Pair("PreferenceChange", database.preferenceChangeDao.deleteOlderThan(than))) removed.add(Pair("PreferenceChange", database.preferenceChangeDao.deleteOlderThan(than)))
//database.foodDao.deleteOlderThan(than) // keep foods database.foodDao.deleteOlderThan(than)
removed.add(Pair("DeviceStatus", database.deviceStatusDao.deleteOlderThan(than))) removed.add(Pair("DeviceStatus", database.deviceStatusDao.deleteOlderThan(than)))
removed.add(Pair("OfflineEvent", database.offlineEventDao.deleteOlderThan(than))) removed.add(Pair("OfflineEvent", database.offlineEventDao.deleteOlderThan(than)))
removed.add(Pair("HeartRate", database.heartRateDao.deleteOlderThan(than))) removed.add(Pair("HeartRate", database.heartRateDao.deleteOlderThan(than)))
@ -110,7 +111,7 @@ import kotlin.math.roundToInt
removed.add(Pair("Bolus", database.bolusDao.deleteTrackedChanges())) removed.add(Pair("Bolus", database.bolusDao.deleteTrackedChanges()))
removed.add(Pair("ExtendedBolus", database.extendedBolusDao.deleteTrackedChanges())) removed.add(Pair("ExtendedBolus", database.extendedBolusDao.deleteTrackedChanges()))
removed.add(Pair("MultiWaveBolus", database.multiwaveBolusLinkDao.deleteTrackedChanges())) removed.add(Pair("MultiWaveBolus", database.multiwaveBolusLinkDao.deleteTrackedChanges()))
//removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteTrackedChanges())) // keep TDD removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteTrackedChanges()))
removed.add(Pair("Carbs", database.carbsDao.deleteTrackedChanges())) removed.add(Pair("Carbs", database.carbsDao.deleteTrackedChanges()))
removed.add(Pair("TemporaryTarget", database.temporaryTargetDao.deleteTrackedChanges())) removed.add(Pair("TemporaryTarget", database.temporaryTargetDao.deleteTrackedChanges()))
removed.add(Pair("ApsResultLink", database.apsResultLinkDao.deleteTrackedChanges())) removed.add(Pair("ApsResultLink", database.apsResultLinkDao.deleteTrackedChanges()))
@ -118,7 +119,7 @@ import kotlin.math.roundToInt
removed.add(Pair("EffectiveProfileSwitch", database.effectiveProfileSwitchDao.deleteTrackedChanges())) removed.add(Pair("EffectiveProfileSwitch", database.effectiveProfileSwitchDao.deleteTrackedChanges()))
removed.add(Pair("ProfileSwitch", database.profileSwitchDao.deleteTrackedChanges())) removed.add(Pair("ProfileSwitch", database.profileSwitchDao.deleteTrackedChanges()))
removed.add(Pair("ApsResult", database.apsResultDao.deleteTrackedChanges())) removed.add(Pair("ApsResult", database.apsResultDao.deleteTrackedChanges()))
//database.foodDao.deleteHistory() // keep food database.foodDao.deleteHistory()
removed.add(Pair("OfflineEvent", database.offlineEventDao.deleteTrackedChanges())) removed.add(Pair("OfflineEvent", database.offlineEventDao.deleteTrackedChanges()))
removed.add(Pair("HeartRate", database.heartRateDao.deleteTrackedChanges())) removed.add(Pair("HeartRate", database.heartRateDao.deleteTrackedChanges()))
} }
@ -148,6 +149,7 @@ import kotlin.math.roundToInt
fun findBgReadingByNSId(nsId: String): GlucoseValue? = fun findBgReadingByNSId(nsId: String): GlucoseValue? =
database.glucoseValueDao.findByNSId(nsId) database.glucoseValueDao.findByNSId(nsId)
@Suppress("unused")
fun getModifiedBgReadingsDataFromId(lastId: Long): Single<List<GlucoseValue>> = fun getModifiedBgReadingsDataFromId(lastId: Long): Single<List<GlucoseValue>> =
database.glucoseValueDao.getModifiedFrom(lastId) database.glucoseValueDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -179,14 +181,6 @@ import kotlin.math.roundToInt
} }
} }
fun getBgReadingsCorrespondingLastHistoryRecord(lastId: Long): GlucoseValue? =
database.glucoseValueDao.getLastHistoryRecord(lastId)
@Suppress("unused") // debug purpose only
fun getAllBgReadingsStartingFrom(lastId: Long): Single<List<GlucoseValue>> =
database.glucoseValueDao.getAllStartingFrom(lastId)
.subscribeOn(Schedulers.io())
// TEMP TARGETS // TEMP TARGETS
fun findTemporaryTargetByNSId(nsId: String): TemporaryTarget? = fun findTemporaryTargetByNSId(nsId: String): TemporaryTarget? =
database.temporaryTargetDao.findByNSId(nsId) database.temporaryTargetDao.findByNSId(nsId)
@ -210,10 +204,6 @@ import kotlin.math.roundToInt
} }
} }
fun compatGetTemporaryTargetData(): Single<List<TemporaryTarget>> =
database.temporaryTargetDao.getTemporaryTargetData()
.subscribeOn(Schedulers.io())
fun getTemporaryTargetDataFromTime(timestamp: Long, ascending: Boolean): Single<List<TemporaryTarget>> = fun getTemporaryTargetDataFromTime(timestamp: Long, ascending: Boolean): Single<List<TemporaryTarget>> =
database.temporaryTargetDao.getTemporaryTargetDataFromTime(timestamp) database.temporaryTargetDao.getTemporaryTargetDataFromTime(timestamp)
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
@ -224,6 +214,7 @@ import kotlin.math.roundToInt
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@Suppress("unused")
fun getModifiedTemporaryTargetsDataFromId(lastId: Long): Single<List<TemporaryTarget>> = fun getModifiedTemporaryTargetsDataFromId(lastId: Long): Single<List<TemporaryTarget>> =
database.temporaryTargetDao.getModifiedFrom(lastId) database.temporaryTargetDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -240,10 +231,6 @@ import kotlin.math.roundToInt
database.temporaryTargetDao.getLastId() database.temporaryTargetDao.getLastId()
// USER ENTRY // USER ENTRY
fun getAllUserEntries(): Single<List<UserEntry>> =
database.userEntryDao.getAll()
.subscribeOn(Schedulers.io())
fun getUserEntryDataFromTime(timestamp: Long): Single<List<UserEntry>> = fun getUserEntryDataFromTime(timestamp: Long): Single<List<UserEntry>> =
database.userEntryDao.getUserEntryDataFromTime(timestamp) database.userEntryDao.getUserEntryDataFromTime(timestamp)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -274,6 +261,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedProfileSwitchDataFromId(lastId: Long): Single<List<ProfileSwitch>> = fun getModifiedProfileSwitchDataFromId(lastId: Long): Single<List<ProfileSwitch>> =
database.profileSwitchDao.getModifiedFrom(lastId) database.profileSwitchDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -288,8 +276,7 @@ import kotlin.math.roundToInt
if (tps != null && ps != null) if (tps != null && ps != null)
return if (ps.timestamp > tps.timestamp) ps else tps return if (ps.timestamp > tps.timestamp) ps else tps
if (ps == null) return tps if (ps == null) return tps
if (tps == null) return ps return ps // if (tps == null)
return null
} }
fun getPermanentProfileSwitch(timestamp: Long): ProfileSwitch? = fun getPermanentProfileSwitch(timestamp: Long): ProfileSwitch? =
@ -340,6 +327,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedEffectiveProfileSwitchDataFromId(lastId: Long): Single<List<EffectiveProfileSwitch>> = fun getModifiedEffectiveProfileSwitchDataFromId(lastId: Long): Single<List<EffectiveProfileSwitch>> =
database.effectiveProfileSwitchDao.getModifiedFrom(lastId) database.effectiveProfileSwitchDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -400,6 +388,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedTherapyEventDataFromId(lastId: Long): Single<List<TherapyEvent>> = fun getModifiedTherapyEventDataFromId(lastId: Long): Single<List<TherapyEvent>> =
database.therapyEventDao.getModifiedFrom(lastId) database.therapyEventDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -430,14 +419,6 @@ import kotlin.math.roundToInt
database.therapyEventDao.getLastTherapyRecord(type, System.currentTimeMillis()).toWrappedSingle() database.therapyEventDao.getLastTherapyRecord(type, System.currentTimeMillis()).toWrappedSingle()
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getTherapyEventByTimestamp(type: TherapyEvent.Type, timestamp: Long): TherapyEvent? =
database.therapyEventDao.findByTimestamp(type, timestamp)
fun compatGetTherapyEventDataFromTime(timestamp: Long, ascending: Boolean): Single<List<TherapyEvent>> =
database.therapyEventDao.compatGetTherapyEventDataFromTime(timestamp)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun compatGetTherapyEventDataFromToTime(from: Long, to: Long): Single<List<TherapyEvent>> = fun compatGetTherapyEventDataFromToTime(from: Long, to: Long): Single<List<TherapyEvent>> =
database.therapyEventDao.compatGetTherapyEventDataFromToTime(from, to) database.therapyEventDao.compatGetTherapyEventDataFromToTime(from, to)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -446,9 +427,6 @@ import kotlin.math.roundToInt
database.therapyEventDao.getLastId() database.therapyEventDao.getLastId()
// FOOD // FOOD
fun findFoodByNSId(nsId: String): Food? =
database.foodDao.findByNSId(nsId)
/* /*
* returns a Pair of the next entity to sync and the ID of the "update". * 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 * The update id might either be the entry id itself if it is a new entry - or the id
@ -468,6 +446,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedFoodDataFromId(lastId: Long): Single<List<Food>> = fun getModifiedFoodDataFromId(lastId: Long): Single<List<Food>> =
database.foodDao.getModifiedFrom(lastId) database.foodDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -476,6 +455,7 @@ import kotlin.math.roundToInt
database.foodDao.getFoodData() database.foodDao.getFoodData()
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@Suppress("unused")
fun deleteAllFoods() = fun deleteAllFoods() =
database.foodDao.deleteAllEntries() database.foodDao.deleteAllEntries()
@ -505,6 +485,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedBolusesDataFromId(lastId: Long): Single<List<Bolus>> = fun getModifiedBolusesDataFromId(lastId: Long): Single<List<Bolus>> =
database.bolusDao.getModifiedFrom(lastId) database.bolusDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -540,11 +521,6 @@ import kotlin.math.roundToInt
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getBolusesIncludingInvalidFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<Bolus>> =
database.bolusDao.getBolusesIncludingInvalidFromTimeToTime(from, to)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun deleteAllBoluses() = fun deleteAllBoluses() =
database.bolusDao.deleteAllEntries() database.bolusDao.deleteAllEntries()
@ -570,9 +546,7 @@ import kotlin.math.roundToInt
} }
private fun Single<List<Carbs>>.expand() = this.map { it.map(::expandCarbs).flatten() } private fun Single<List<Carbs>>.expand() = this.map { it.map(::expandCarbs).flatten() }
private fun Single<List<Carbs>>.filterOutExtended() = this.map { it.filter { c -> c.duration == 0L } }
private fun Single<List<Carbs>>.fromTo(from: Long, to: Long) = this.map { it.filter { c -> c.timestamp in from..to } } private fun Single<List<Carbs>>.fromTo(from: Long, to: Long) = this.map { it.filter { c -> c.timestamp in from..to } }
private infix fun Single<List<Carbs>>.until(to: Long) = this.map { it.filter { c -> c.timestamp <= to } }
private fun Single<List<Carbs>>.from(start: Long) = this.map { it.filter { c -> c.timestamp >= start } } private fun Single<List<Carbs>>.from(start: Long) = this.map { it.filter { c -> c.timestamp >= start } }
private fun Single<List<Carbs>>.sort() = this.map { it.sortedBy { c -> c.timestamp } } private fun Single<List<Carbs>>.sort() = this.map { it.sortedBy { c -> c.timestamp } }
@ -595,13 +569,11 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedCarbsDataFromId(lastId: Long): Single<List<Carbs>> = fun getModifiedCarbsDataFromId(lastId: Long): Single<List<Carbs>> =
database.carbsDao.getModifiedFrom(lastId) database.carbsDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getCarbsByTimestamp(timestamp: Long): Carbs? =
database.carbsDao.findByTimestamp(timestamp)
fun getLastCarbsRecord(): Carbs? = fun getLastCarbsRecord(): Carbs? =
database.carbsDao.getLastCarbsRecord() database.carbsDao.getLastCarbsRecord()
@ -630,11 +602,6 @@ import kotlin.math.roundToInt
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getCarbsDataFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<Carbs>> =
database.carbsDao.getCarbsFromTimeToTime(from, to)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun getCarbsDataFromTimeToTimeExpanded(from: Long, to: Long, ascending: Boolean): Single<List<Carbs>> = fun getCarbsDataFromTimeToTimeExpanded(from: Long, to: Long, ascending: Boolean): Single<List<Carbs>> =
database.carbsDao.getCarbsFromTimeToTimeExpandable(from, to) database.carbsDao.getCarbsFromTimeToTimeExpandable(from, to)
.expand() .expand()
@ -648,21 +615,6 @@ import kotlin.math.roundToInt
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getCarbsIncludingInvalidFromTimeExpanded(timestamp: Long, ascending: Boolean): Single<List<Carbs>> =
database.carbsDao.getCarbsIncludingInvalidFromTimeExpandable(timestamp)
.expand()
.from(timestamp)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun getCarbsIncludingInvalidFromTimeToTimeExpanded(from: Long, to: Long, ascending: Boolean): Single<List<Carbs>> =
database.carbsDao.getCarbsIncludingInvalidFromTimeToTimeExpandable(from, to)
.expand()
.fromTo(from, to)
.sort()
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun deleteAllCarbs() = fun deleteAllCarbs() =
database.carbsDao.deleteAllEntries() database.carbsDao.deleteAllEntries()
@ -692,6 +644,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedBolusCalculatorResultsDataFromId(lastId: Long): Single<List<BolusCalculatorResult>> = fun getModifiedBolusCalculatorResultsDataFromId(lastId: Long): Single<List<BolusCalculatorResult>> =
database.bolusCalculatorResultDao.getModifiedFrom(lastId) database.bolusCalculatorResultDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -757,14 +710,11 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedTemporaryBasalDataFromId(lastId: Long): Single<List<TemporaryBasal>> = fun getModifiedTemporaryBasalDataFromId(lastId: Long): Single<List<TemporaryBasal>> =
database.temporaryBasalDao.getModifiedFrom(lastId) database.temporaryBasalDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getTemporaryBasalsData(): Single<List<TemporaryBasal>> =
database.temporaryBasalDao.getTemporaryBasalData()
.subscribeOn(Schedulers.io())
fun getTemporaryBasalActiveAt(timestamp: Long): Single<ValueWrapper<TemporaryBasal>> = fun getTemporaryBasalActiveAt(timestamp: Long): Single<ValueWrapper<TemporaryBasal>> =
database.temporaryBasalDao.getTemporaryBasalActiveAt(timestamp) database.temporaryBasalDao.getTemporaryBasalActiveAt(timestamp)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -789,11 +739,6 @@ import kotlin.math.roundToInt
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getTemporaryBasalsDataIncludingInvalidFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<TemporaryBasal>> =
database.temporaryBasalDao.getTemporaryBasalDataIncludingInvalidFromTimeToTime(from, to)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun getOldestTemporaryBasalRecord(): TemporaryBasal? = fun getOldestTemporaryBasalRecord(): TemporaryBasal? =
database.temporaryBasalDao.getOldestRecord() database.temporaryBasalDao.getOldestRecord()
@ -824,6 +769,7 @@ import kotlin.math.roundToInt
} }
} }
@Suppress("unused")
fun getModifiedExtendedBolusDataFromId(lastId: Long): Single<List<ExtendedBolus>> = fun getModifiedExtendedBolusDataFromId(lastId: Long): Single<List<ExtendedBolus>> =
database.extendedBolusDao.getModifiedFrom(lastId) database.extendedBolusDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -848,11 +794,6 @@ import kotlin.math.roundToInt
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getExtendedBolusDataIncludingInvalidFromTimeToTime(start: Long, end: Long, ascending: Boolean): Single<List<ExtendedBolus>> =
database.extendedBolusDao.getExtendedBolusDataIncludingInvalidFromTimeToTime(start, end)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun getOldestExtendedBolusRecord(): ExtendedBolus? = fun getOldestExtendedBolusRecord(): ExtendedBolus? =
database.extendedBolusDao.getOldestRecord() database.extendedBolusDao.getOldestRecord()
@ -897,25 +838,12 @@ import kotlin.math.roundToInt
} }
} }
fun compatGetOfflineEventData(): Single<List<OfflineEvent>> =
database.offlineEventDao.getOfflineEventData()
.subscribeOn(Schedulers.io())
fun getOfflineEventDataFromTime(timestamp: Long, ascending: Boolean): Single<List<OfflineEvent>> =
database.offlineEventDao.getOfflineEventDataFromTime(timestamp)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun getOfflineEventDataIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<OfflineEvent>> =
database.offlineEventDao.getOfflineEventDataIncludingInvalidFromTime(timestamp)
.map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io())
fun getOfflineEventDataFromTimeToTime(start: Long, end: Long, ascending: Boolean): Single<List<OfflineEvent>> = fun getOfflineEventDataFromTimeToTime(start: Long, end: Long, ascending: Boolean): Single<List<OfflineEvent>> =
database.offlineEventDao.getOfflineEventDataFromTimeToTime(start, end) database.offlineEventDao.getOfflineEventDataFromTimeToTime(start, end)
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@Suppress("unused")
fun getModifiedOfflineEventsDataFromId(lastId: Long): Single<List<OfflineEvent>> = fun getModifiedOfflineEventsDataFromId(lastId: Long): Single<List<OfflineEvent>> =
database.offlineEventDao.getModifiedFrom(lastId) database.offlineEventDao.getModifiedFrom(lastId)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@ -925,13 +853,16 @@ import kotlin.math.roundToInt
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.toWrappedSingle() .toWrappedSingle()
@Suppress("unused")
fun deleteAllOfflineEventEntries() = fun deleteAllOfflineEventEntries() =
database.offlineEventDao.deleteAllEntries() database.offlineEventDao.deleteAllEntries()
fun getLastOfflineEventId(): Long? = fun getLastOfflineEventId(): Long? =
database.offlineEventDao.getLastId() database.offlineEventDao.getLastId()
fun getHeartRatesFromTime(timeMillis: Long) = database.heartRateDao.getFromTime(timeMillis) fun getHeartRatesFromTime(timeMillis: Long): Single<List<HeartRate>> =
database.heartRateDao.getFromTime(timeMillis)
.subscribeOn(Schedulers.io())
fun getHeartRatesFromTimeToTime(startMillis: Long, endMillis: Long) = fun getHeartRatesFromTimeToTime(startMillis: Long, endMillis: Long) =
database.heartRateDao.getFromTimeToTime(startMillis, endMillis) database.heartRateDao.getFromTimeToTime(startMillis, endMillis)

View file

@ -59,9 +59,6 @@ internal interface BolusDao : TraceableDao<Bolus> {
@Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC") @Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
fun getBolusesIncludingInvalidFromTime(timestamp: Long): Single<List<Bolus>> fun getBolusesIncludingInvalidFromTime(timestamp: Long): Single<List<Bolus>>
@Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
fun getBolusesIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<Bolus>>
// This query will be used with v3 to get all changed records // This query will be used with v3 to get all changed records
@Query("SELECT * FROM $TABLE_BOLUSES WHERE id > :id AND pumpId IS NOT NULL AND type <> :exclude AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_BOLUSES WHERE id > :id) ORDER BY id ASC") @Query("SELECT * FROM $TABLE_BOLUSES WHERE id > :id AND pumpId IS NOT NULL AND type <> :exclude AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_BOLUSES WHERE id > :id) ORDER BY id ASC")
fun getModifiedFrom(id: Long, exclude: Bolus.Type = Bolus.Type.PRIMING): Single<List<Bolus>> fun getModifiedFrom(id: Long, exclude: Bolus.Type = Bolus.Type.PRIMING): Single<List<Bolus>>

View file

@ -46,24 +46,15 @@ internal interface CarbsDao : TraceableDao<Carbs> {
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp + duration >= :timestamp AND referenceId IS NULL ORDER BY id DESC") @Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp + duration >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsFromTimeExpandable(timestamp: Long): Single<List<Carbs>> fun getCarbsFromTimeExpandable(timestamp: Long): Single<List<Carbs>>
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsFromTimeToTime(from: Long, to: Long): Single<List<Carbs>>
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp + duration > :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") @Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp + duration > :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsFromTimeToTimeExpandable(from: Long, to: Long): Single<List<Carbs>> fun getCarbsFromTimeToTimeExpandable(from: Long, to: Long): Single<List<Carbs>>
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC") @Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsIncludingInvalidFromTime(timestamp: Long): Single<List<Carbs>> fun getCarbsIncludingInvalidFromTime(timestamp: Long): Single<List<Carbs>>
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp + duration >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsIncludingInvalidFromTimeExpandable(timestamp: Long): Single<List<Carbs>>
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") @Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<Carbs>> fun getCarbsIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<Carbs>>
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp + duration >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
fun getCarbsIncludingInvalidFromTimeToTimeExpandable(from: Long, to: Long): Single<List<Carbs>>
// This query will be used with v3 to get all changed records // This query will be used with v3 to get all changed records
@Query("SELECT * FROM $TABLE_CARBS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_CARBS WHERE id > :id) ORDER BY id ASC") @Query("SELECT * FROM $TABLE_CARBS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_CARBS WHERE id > :id) ORDER BY id ASC")
fun getModifiedFrom(id: Long): Single<List<Carbs>> fun getModifiedFrom(id: Long): Single<List<Carbs>>

View file

@ -53,9 +53,6 @@ internal interface ExtendedBolusDao : TraceableDao<ExtendedBolus> {
@Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC")
fun getExtendedBolusDataIncludingInvalidFromTime(timestamp: Long): Single<List<ExtendedBolus>> fun getExtendedBolusDataIncludingInvalidFromTime(timestamp: Long): Single<List<ExtendedBolus>>
@Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY timestamp ASC")
fun getExtendedBolusDataIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<ExtendedBolus>>
// This query will be used with v3 to get all changed records // This query will be used with v3 to get all changed records
@Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_EXTENDED_BOLUSES WHERE id > :id) ORDER BY id ASC") @Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_EXTENDED_BOLUSES WHERE id > :id) ORDER BY id ASC")
fun getModifiedFrom(id: Long): Single<List<ExtendedBolus>> fun getModifiedFrom(id: Long): Single<List<ExtendedBolus>>

View file

@ -43,12 +43,6 @@ internal interface GlucoseValueDao : TraceableDao<GlucoseValue> {
@Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id > :lastId AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id > :lastId AND referenceId IS NULL ORDER BY timestamp ASC")
fun getDataFromId(lastId: Long): Single<List<GlucoseValue>> fun getDataFromId(lastId: Long): Single<List<GlucoseValue>>
@Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id >= :id")
fun getAllStartingFrom(id: Long): Single<List<GlucoseValue>>
@Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE referenceId = :id ORDER BY id DESC LIMIT 1")
fun getLastHistoryRecord(id: Long): GlucoseValue?
// This query will be used with v3 to get all changed records // This query will be used with v3 to get all changed records
@Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_GLUCOSE_VALUES WHERE id > :id) ORDER BY id ASC") @Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_GLUCOSE_VALUES WHERE id > :id) ORDER BY id ASC")
fun getModifiedFrom(id: Long): Single<List<GlucoseValue>> fun getModifiedFrom(id: Long): Single<List<GlucoseValue>>

View file

@ -4,6 +4,7 @@ import androidx.room.Dao
import androidx.room.Query import androidx.room.Query
import info.nightscout.database.entities.HeartRate import info.nightscout.database.entities.HeartRate
import info.nightscout.database.entities.TABLE_HEART_RATE import info.nightscout.database.entities.TABLE_HEART_RATE
import io.reactivex.rxjava3.core.Single
@Dao @Dao
internal interface HeartRateDao : TraceableDao<HeartRate> { internal interface HeartRateDao : TraceableDao<HeartRate> {
@ -21,7 +22,7 @@ internal interface HeartRateDao : TraceableDao<HeartRate> {
override fun deleteTrackedChanges(): Int override fun deleteTrackedChanges(): Int
@Query("SELECT * FROM $TABLE_HEART_RATE WHERE timestamp >= :timestamp ORDER BY timestamp") @Query("SELECT * FROM $TABLE_HEART_RATE WHERE timestamp >= :timestamp ORDER BY timestamp")
fun getFromTime(timestamp: Long): List<HeartRate> fun getFromTime(timestamp: Long): Single<List<HeartRate>>
@Query("SELECT * FROM $TABLE_HEART_RATE WHERE timestamp BETWEEN :startMillis AND :endMillis ORDER BY timestamp") @Query("SELECT * FROM $TABLE_HEART_RATE WHERE timestamp BETWEEN :startMillis AND :endMillis ORDER BY timestamp")
fun getFromTimeToTime(startMillis: Long, endMillis: Long): List<HeartRate> fun getFromTimeToTime(startMillis: Long, endMillis: Long): List<HeartRate>

View file

@ -31,18 +31,9 @@ internal interface OfflineEventDao : TraceableDao<OfflineEvent> {
@Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp <= :timestamp AND (timestamp + duration) > :timestamp AND referenceId IS NULL AND isValid = 1 ORDER BY timestamp DESC LIMIT 1") @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp <= :timestamp AND (timestamp + duration) > :timestamp AND referenceId IS NULL AND isValid = 1 ORDER BY timestamp DESC LIMIT 1")
fun getOfflineEventActiveAt(timestamp: Long): Maybe<OfflineEvent> fun getOfflineEventActiveAt(timestamp: Long): Maybe<OfflineEvent>
@Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun getOfflineEventDataFromTime(timestamp: Long): Single<List<OfflineEvent>>
@Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC")
fun getOfflineEventDataIncludingInvalidFromTime(timestamp: Long): Single<List<OfflineEvent>>
@Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp BETWEEN :start AND :end AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp BETWEEN :start AND :end AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun getOfflineEventDataFromTimeToTime(start: Long, end: Long): Single<List<OfflineEvent>> fun getOfflineEventDataFromTimeToTime(start: Long, end: Long): Single<List<OfflineEvent>>
@Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun getOfflineEventData(): Single<List<OfflineEvent>>
// This query will be used with v3 to get all changed records // This query will be used with v3 to get all changed records
@Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_OFFLINE_EVENTS WHERE id > :id) ORDER BY id ASC") @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_OFFLINE_EVENTS WHERE id > :id) ORDER BY id ASC")
fun getModifiedFrom(id: Long): Single<List<OfflineEvent>> fun getModifiedFrom(id: Long): Single<List<OfflineEvent>>

View file

@ -62,12 +62,6 @@ internal interface TemporaryBasalDao : TraceableDao<TemporaryBasal> {
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC")
fun getTemporaryBasalDataIncludingInvalidFromTime(timestamp: Long): Single<List<TemporaryBasal>> fun getTemporaryBasalDataIncludingInvalidFromTime(timestamp: Long): Single<List<TemporaryBasal>>
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY timestamp ASC")
fun getTemporaryBasalDataIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<TemporaryBasal>>
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun getTemporaryBasalData(): Single<List<TemporaryBasal>>
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE referenceId = :id ORDER BY id DESC LIMIT 1") @Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE referenceId = :id ORDER BY id DESC LIMIT 1")
fun getLastHistoryRecord(id: Long): TemporaryBasal? fun getLastHistoryRecord(id: Long): TemporaryBasal?

View file

@ -37,9 +37,6 @@ internal interface TemporaryTargetDao : TraceableDao<TemporaryTarget> {
@Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC")
fun getTemporaryTargetDataIncludingInvalidFromTime(timestamp: Long): Single<List<TemporaryTarget>> fun getTemporaryTargetDataIncludingInvalidFromTime(timestamp: Long): Single<List<TemporaryTarget>>
@Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun getTemporaryTargetData(): Single<List<TemporaryTarget>>
// This query will be used with v3 to get all changed records // This query will be used with v3 to get all changed records
@Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_TEMPORARY_TARGETS WHERE id > :id) ORDER BY id ASC") @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_TEMPORARY_TARGETS WHERE id > :id) ORDER BY id ASC")
fun getModifiedFrom(id: Long): Single<List<TemporaryTarget>> fun getModifiedFrom(id: Long): Single<List<TemporaryTarget>>

View file

@ -46,9 +46,6 @@ internal interface TherapyEventDao : TraceableDao<TherapyEvent> {
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE type = :type AND isValid = 1 AND timestamp <= :now ORDER BY timestamp DESC LIMIT 1") @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE type = :type AND isValid = 1 AND timestamp <= :now ORDER BY timestamp DESC LIMIT 1")
fun getLastTherapyRecord(type: TherapyEvent.Type, now: Long): Maybe<TherapyEvent> fun getLastTherapyRecord(type: TherapyEvent.Type, now: Long): Maybe<TherapyEvent>
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun compatGetTherapyEventDataFromTime(timestamp: Long): Single<List<TherapyEvent>>
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :from AND timestamp <= :to AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :from AND timestamp <= :to AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun compatGetTherapyEventDataFromToTime(from: Long, to: Long): Single<List<TherapyEvent>> fun compatGetTherapyEventDataFromToTime(from: Long, to: Long): Single<List<TherapyEvent>>

View file

@ -3,8 +3,9 @@ package info.nightscout.database.impl.daos
import androidx.room.Insert import androidx.room.Insert
import androidx.room.Update import androidx.room.Update
import info.nightscout.database.entities.interfaces.TraceableDBEntry import info.nightscout.database.entities.interfaces.TraceableDBEntry
import info.nightscout.database.impl.daos.workaround.TraceableDaoWorkaround
internal interface TraceableDao<T : TraceableDBEntry> : info.nightscout.database.impl.daos.workaround.TraceableDaoWorkaround<T> { internal interface TraceableDao<T : TraceableDBEntry> : TraceableDaoWorkaround<T> {
fun findById(id: Long): T? fun findById(id: Long): T?

View file

@ -17,9 +17,6 @@ interface UserEntryDao {
@Query("DELETE FROM $TABLE_USER_ENTRY WHERE timestamp < :than") @Query("DELETE FROM $TABLE_USER_ENTRY WHERE timestamp < :than")
fun deleteOlderThan(than: Long): Int fun deleteOlderThan(than: Long): Int
@Query("SELECT * FROM $TABLE_USER_ENTRY ORDER BY id DESC")
fun getAll(): Single<List<UserEntry>>
@Query("SELECT * FROM $TABLE_USER_ENTRY WHERE timestamp >= :timestamp ORDER BY id DESC") @Query("SELECT * FROM $TABLE_USER_ENTRY WHERE timestamp >= :timestamp ORDER BY id DESC")
fun getUserEntryDataFromTime(timestamp: Long): Single<List<UserEntry>> fun getUserEntryDataFromTime(timestamp: Long): Single<List<UserEntry>>

View file

@ -138,11 +138,11 @@ class OverviewDataImpl @Inject constructor(
*/ */
override fun lastBg(autosensDataStore: AutosensDataStore): InMemoryGlucoseValue? = override fun lastBg(autosensDataStore: AutosensDataStore): InMemoryGlucoseValue? =
autosensDataStore.bucketedData?.let { if (it.size > 0) it[0] else null } autosensDataStore.bucketedData?.firstOrNull()
// repository.getLastGlucoseValueWrapped().blockingGet().let { gvWrapped -> ?: repository.getLastGlucoseValueWrapped().blockingGet().let { gvWrapped ->
// if (gvWrapped is ValueWrapper.Existing) gvWrapped.value if (gvWrapped is ValueWrapper.Existing) InMemoryGlucoseValue(gvWrapped.value)
// else null else null
// } }
override fun isLow(autosensDataStore: AutosensDataStore): Boolean = override fun isLow(autosensDataStore: AutosensDataStore): Boolean =
lastBg(autosensDataStore)?.let { lastBg -> lastBg(autosensDataStore)?.let { lastBg ->

View file

@ -4,9 +4,21 @@
<string name="executing_right_now">Kommando körs just nu</string> <string name="executing_right_now">Kommando körs just nu</string>
<string name="basal_value_below_minimum">Basal understiger miniminivå. Profilen sattes inte.</string> <string name="basal_value_below_minimum">Basal understiger miniminivå. Profilen sattes inte.</string>
<string name="permission">Behörighet</string> <string name="permission">Behörighet</string>
<string name="need_whitelisting">%1$s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt</string>
<string name="need_location_permission">Appen behöver platsåtkomst för bluetooth- och WiFi-identifiering</string> <string name="need_location_permission">Appen behöver platsåtkomst för bluetooth- och WiFi-identifiering</string>
<string name="need_storage_permission">Applikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningar</string> <string name="need_storage_permission">Applikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningar</string>
<!-- Stats --> <!-- Stats -->
<string name="veryLow" comment="below 3.1">Lågt</string>
<string name="low" comment="3.1-3.9">Låg</string> <string name="low" comment="3.1-3.9">Låg</string>
<string name="high" comment="10.0-13.9">Hög</string> <string name="high" comment="10.0-13.9">Hög</string>
<string name="veryHigh" comment="above 13.9">Högt</string>
<string name="below" comment="below &quot;in range&quot;">Under</string>
<string name="in_range">Inom målområdet</string>
<string name="above" comment="above &quot;in range&quot;">Över</string>
<string name="hba1c">HbA1c: </string>
<string name="std_deviation">SD: %1$s</string>
<string name="detailed_14_days">Detaljerad 14 dagar</string>
<string name="day_tir">Dag TIR</string>
<string name="night_tir">Natt TIR</string>
<string name="carbs_short" comment="max 6 characters">KH</string>
</resources> </resources>

View file

@ -0,0 +1,90 @@
package info.nightscout.implementation.overview
import info.nightscout.androidaps.TestBase
import info.nightscout.database.ValueWrapper
import info.nightscout.database.entities.GlucoseValue
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.aps.AutosensDataStore
import info.nightscout.interfaces.iob.InMemoryGlucoseValue
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T
import io.reactivex.rxjava3.core.Single
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mock
import org.mockito.Mockito
class OverviewDataImplTest : TestBase() {
@Mock lateinit var rh: ResourceHelper
@Mock lateinit var dateUtil: DateUtil
@Mock lateinit var sp: SP
@Mock lateinit var activePlugin: ActivePlugin
@Mock lateinit var defaultValueHelper: DefaultValueHelper
@Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var repository: AppRepository
@Mock lateinit var autosensDataStore: AutosensDataStore
private lateinit var sut: OverviewDataImpl
private val time = 1000000L
private val glucoseValue =
GlucoseValue(raw = 200.0, noise = 0.0, value = 200.0, timestamp = time, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN, trendArrow = GlucoseValue.TrendArrow.FLAT)
@BeforeEach
fun setup() {
sut = OverviewDataImpl(aapsLogger, rh, dateUtil, sp, activePlugin, defaultValueHelper, profileFunction, repository)
Mockito.`when`(defaultValueHelper.determineLowLine()).thenReturn(80.0)
Mockito.`when`(defaultValueHelper.determineHighLine()).thenReturn(180.0)
Mockito.`when`(profileFunction.getUnits()).thenReturn(GlucoseUnit.MGDL)
}
@Test
fun lastBg() {
val bucketedData: MutableList<InMemoryGlucoseValue> = mutableListOf()
bucketedData.add(InMemoryGlucoseValue(time, 70.0, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN))
// no data
Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null)
Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Absent()))
Assertions.assertNull(sut.lastBg(autosensDataStore))
Assertions.assertFalse(sut.isLow(autosensDataStore))
Assertions.assertFalse(sut.isHigh(autosensDataStore))
// no bucketed but in db
Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null)
Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Existing(glucoseValue)))
Assertions.assertEquals(200.0, sut.lastBg(autosensDataStore)?.value)
Assertions.assertFalse(sut.isLow(autosensDataStore))
Assertions.assertTrue(sut.isHigh(autosensDataStore))
// in bucketed
Mockito.`when`(autosensDataStore.bucketedData).thenReturn(bucketedData)
Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Existing(glucoseValue)))
Assertions.assertEquals(70.0, sut.lastBg(autosensDataStore)?.value)
Assertions.assertTrue(sut.isLow(autosensDataStore))
Assertions.assertFalse(sut.isHigh(autosensDataStore))
}
@Test
fun isActualBg() {
// no bucketed but in db
Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null)
Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Existing(glucoseValue)))
Mockito.`when`(dateUtil.now()).thenReturn(time + T.mins(1).msecs())
Assertions.assertTrue(sut.isActualBg(autosensDataStore))
Mockito.`when`(dateUtil.now()).thenReturn(time + T.mins(9).msecs() + 1)
Assertions.assertFalse(sut.isActualBg(autosensDataStore))
// no data
Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null)
Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Absent()))
Assertions.assertFalse(sut.isActualBg(autosensDataStore))
}
}

View file

@ -370,7 +370,7 @@ class AutotunePlugin @Inject constructor(
profilePlugin.currentProfile()?.basal = newProfile.basal() profilePlugin.currentProfile()?.basal = newProfile.basal()
profilePlugin.currentProfile()?.ic = newProfile.ic(circadian) profilePlugin.currentProfile()?.ic = newProfile.ic(circadian)
profilePlugin.currentProfile()?.isf = newProfile.isf(circadian) profilePlugin.currentProfile()?.isf = newProfile.isf(circadian)
profilePlugin.storeSettings() profilePlugin.storeSettings(timestamp = dateUtil.now())
} }
fun saveLastRun() { fun saveLastRun() {

View file

@ -1,10 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="dynisf_adjust_sensitivity">Justera känslighet och BG</string>
<string name="DynISFAdjust_title" formatted="false">DynamicISF justeringsfaktor %</string>
<string name="DynISFAdjust_summary" formatted="false">Justeringsfaktor för DynamicISF. Ställ in mer än 100% för mer aggressiva korrigeringsdoser, och mindre än 100% för mindre aggressiva korrigeringar.</string>
<string name="high_temptarget_raises_sensitivity_title">Högt målvärde höjer känsligheten</string> <string name="high_temptarget_raises_sensitivity_title">Högt målvärde höjer känsligheten</string>
<string name="high_temptarget_raises_sensitivity_summary"><![CDATA[Höj känsligheten om temp målvärde är 100 mg/dl (5.5 mmol/l) eller högre]]></string> <string name="high_temptarget_raises_sensitivity_summary"><![CDATA[Höj känsligheten om temp målvärde är 100 mg/dl (5.5 mmol/l) eller högre]]></string>
<string name="low_temptarget_lowers_sensitivity_title">Lågt målvärde sänker känsligheten</string> <string name="low_temptarget_lowers_sensitivity_title">Lågt målvärde sänker känsligheten</string>
<string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[Sänk känsligheten om temp målvärde är mindre än 100 mg/dl (5.5 mmol/l)]]></string> <string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[Sänk känsligheten om temp målvärde är mindre än 100 mg/dl (5.5 mmol/l)]]></string>
<string name="openapssmb">OpenAPS SMB</string> <string name="openapssmb">OpenAPS SMB</string>
<string name="openaps_smb_dynamic_isf">Dynamisk ISF</string>
<string name="smb_interval_summary">Minsta antal minuter mellan SMB</string> <string name="smb_interval_summary">Minsta antal minuter mellan SMB</string>
<string name="resistance_lowers_target_title">Insulinresistens sänker mål-BG</string> <string name="resistance_lowers_target_title">Insulinresistens sänker mål-BG</string>
<string name="resistance_lowers_target_summary">Om systemet upptäcker tillfällig insulinresistens, sänk mål-BG för att på så sätt tillåta mer insulin</string> <string name="resistance_lowers_target_summary">Om systemet upptäcker tillfällig insulinresistens, sänk mål-BG för att på så sätt tillåta mer insulin</string>
@ -71,6 +75,8 @@
<string name="uam_smb_max_minutes_summary">Max antal minuter basal som kan bli SMB vid UAM</string> <string name="uam_smb_max_minutes_summary">Max antal minuter basal som kan bli SMB vid UAM</string>
<string name="carbs_req_threshold">Minimigräns för KH-förslag</string> <string name="carbs_req_threshold">Minimigräns för KH-förslag</string>
<string name="carbs_req_threshold_summary">Gränsvärde för om systemet ska föreslå en KH-korrektion. Förslag som är mindre än detta värde kommer inte att visas som notis.</string> <string name="carbs_req_threshold_summary">Gränsvärde för om systemet ska föreslå en KH-korrektion. Förslag som är mindre än detta värde kommer inte att visas som notis.</string>
<string name="lgs_threshold_summary">BG-värde under vilket insulintillförsel stängs av. Standardvärdet använder standard-målmodell. Användaren kan justera mellan 60 mg/dl (3.3 mmol/l) och 100mg/dl (5.5mmol/l)</string>
<string name="lgs_threshold_title">BG-nivå under vilken insulintillförseln stängs av</string>
<string name="increasing_max_basal">Ökar maximalt basaldos eftersom inställningen är lägre än din maximala basal i profilen</string> <string name="increasing_max_basal">Ökar maximalt basaldos eftersom inställningen är lägre än din maximala basal i profilen</string>
<string name="max_basal_multiplier">multiplikator för max basal</string> <string name="max_basal_multiplier">multiplikator för max basal</string>
<string name="max_daily_basal_multiplier">multiplikator för daglig max basal</string> <string name="max_daily_basal_multiplier">multiplikator för daglig max basal</string>
@ -82,13 +88,30 @@
<string name="maxvalueinpreferences">maxvärde i Inställningar</string> <string name="maxvalueinpreferences">maxvärde i Inställningar</string>
<string name="hardlimit">hård begränsning</string> <string name="hardlimit">hård begränsning</string>
<!-- Autotune --> <!-- Autotune -->
<string name="insulin_peak">Topp</string>
<!-- Loop --> <!-- Loop -->
<string name="run_now">Kör nu</string>
<string name="smb_frequency_exceeded">En bolus gavs för mindre än 3 min sedan. Hoppar över SMB</string> <string name="smb_frequency_exceeded">En bolus gavs för mindre än 3 min sedan. Hoppar över SMB</string>
<string name="pump_not_initialized">Pump ej initierad!</string>
<string name="loop_shortname">Loop</string> <string name="loop_shortname">Loop</string>
<string name="description_loop">Aktivera eller inaktivera implementationen som kör loopen.</string> <string name="description_loop">Aktivera eller inaktivera implementationen som kör loopen.</string>
<string name="no_aps_selected">INGEN APS VALD ELLER HAR LEVERERAT RESULTAT</string>
<string name="ignore5m">Ignorera 5 min</string> <string name="ignore5m">Ignorera 5 min</string>
<string name="ignore15m">Ignorera 15 min</string> <string name="ignore15m">Ignorera 15 min</string>
<string name="ignore30m">Ignorera 30 min</string> <string name="ignore30m">Ignorera 30 min</string>
<string name="carbs_suggestion">KH-förslag</string>
<string name="open_loop_new_suggestion">Ny rekommendation tillgänglig</string>
<string name="basal_set_correctly">Basal justerad korrekt</string> <string name="basal_set_correctly">Basal justerad korrekt</string>
<string name="last_run_label">Kördes senast</string>
<string name="loop_aps_label">APS</string> <string name="loop_aps_label">APS</string>
<string name="request_label">Begäran</string>
<string name="loop_constraints_processed_label">Efter begränsningar</string>
<string name="loop_tbr_request_time_label">Begärd tid för temp-basal</string>
<string name="loop_tbr_execution_time_label">Tid för temp-basal</string>
<string name="loop_tbr_set_by_pump_label">Temp-basal satt i pump</string>
<string name="loop_smb_request_time_label">Tid för SMB-begäran</string>
<string name="loop_smb_execution_time_label">SMB körtid</string>
<string name="loop_smb_set_by_pump_label">SMB påbörjad av pump</string>
<string name="loop_open_mode_min_change">Minsta ändring som ska utföras [%]</string>
<string name="loop_open_mode_min_change_summary" formatted="false">Open Loop kommer bara att be om justering om ändringen är större än detta värde. Standardvärdet är 20%</string>
</resources> </resources>

View file

@ -31,7 +31,7 @@ class TriggerHeartRate(injector: HasAndroidInjector) : Trigger(injector) {
return true return true
} }
val start = dateUtil.now() - averageHeartRateDurationMillis val start = dateUtil.now() - averageHeartRateDurationMillis
val hrs = repository.getHeartRatesFromTime(start) val hrs = repository.getHeartRatesFromTime(start).blockingGet()
val duration = hrs.takeUnless { it.isEmpty() }?.sumOf { hr -> hr.duration } ?: 0L val duration = hrs.takeUnless { it.isEmpty() }?.sumOf { hr -> hr.duration } ?: 0L
if (duration == 0L) { if (duration == 0L) {
aapsLogger.info(LTag.AUTOMATION, "HR not ready, no heart rate measured for ${friendlyDescription()}") aapsLogger.info(LTag.AUTOMATION, "HR not ready, no heart rate measured for ${friendlyDescription()}")

View file

@ -92,6 +92,8 @@
<string name="lastboluscompared">Senaste bolus %1$s %2$s min sedan</string> <string name="lastboluscompared">Senaste bolus %1$s %2$s min sedan</string>
<string name="triggercoblabel">COB</string> <string name="triggercoblabel">COB</string>
<string name="cobcompared">COB %1$s %2$.0f</string> <string name="cobcompared">COB %1$s %2$.0f</string>
<string name="triggerHeartRate">Hjärtfrekvens</string>
<string name="triggerHeartRateDesc">HF %1$s %2$.0f</string>
<string name="iob_u">IOB [U]:</string> <string name="iob_u">IOB [U]:</string>
<string name="distance_short">Dist [m]:</string> <string name="distance_short">Dist [m]:</string>
<string name="recurringTime">Återkommande tid</string> <string name="recurringTime">Återkommande tid</string>
@ -109,6 +111,14 @@
<string name="automation_event">Automationshändelse</string> <string name="automation_event">Automationshändelse</string>
<string name="reorder_label">Ändra ordning</string> <string name="reorder_label">Ändra ordning</string>
<string name="user_action">Användaråtgärd</string> <string name="user_action">Användaråtgärd</string>
<string name="remove_automation">Ta bort automatisering</string>
<string name="sort_automation">Sortera automatisering</string>
<string name="remove_selected_items">Ta bort valda objekt</string>
<string name="count_selected">%1$d valda</string>
<string name="system_automation">Systemautomatisering</string>
<string name="run_automations">Kör automatiseringar</string>
<string name="add_automation">Lägg till regel</string>
<string name="stop_processing">Sluta bearbeta</string>
<!-- WeekdayPicker --> <!-- WeekdayPicker -->
<string name="monday_short">M</string> <string name="monday_short">M</string>
<string name="tuesday_short">T</string> <string name="tuesday_short">T</string>
@ -118,5 +128,7 @@
<string name="saturday_short">L</string> <string name="saturday_short">L</string>
<string name="sunday_short">S</string> <string name="sunday_short">S</string>
<!-- Reminders--> <!-- Reminders-->
<string name="time_to_eat">Dags att äta!\nKör bolusguiden igen för ny beräkning.</string>
<string name="time_to_bolus">Dags för bolus!\nKör Bolusguiden och gör beräkningar igen.</string> <string name="time_to_bolus">Dags för bolus!\nKör Bolusguiden och gör beräkningar igen.</string>
<string name="error_setting_reminder">Fel vid inställning av framtida alarm</string>
</resources> </resources>

View file

@ -3,11 +3,9 @@ package info.nightscout.automation.triggers
import info.nightscout.automation.R import info.nightscout.automation.R
import info.nightscout.automation.elements.Comparator import info.nightscout.automation.elements.Comparator
import info.nightscout.database.entities.HeartRate import info.nightscout.database.entities.HeartRate
import io.reactivex.rxjava3.core.Single
import org.json.JSONObject import org.json.JSONObject
import org.junit.Assert.assertEquals import org.junit.jupiter.api.Assertions
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotSame
import org.junit.Assert.assertTrue
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
@ -25,7 +23,7 @@ class TriggerHeartRateTest : TriggerTestBase() {
@Test @Test
fun friendlyName() { fun friendlyName() {
assertEquals(R.string.triggerHeartRate, TriggerHeartRate(injector).friendlyName()) Assertions.assertEquals(R.string.triggerHeartRate, TriggerHeartRate(injector).friendlyName())
} }
@Test @Test
@ -33,7 +31,7 @@ class TriggerHeartRateTest : TriggerTestBase() {
val t = TriggerHeartRate(injector) val t = TriggerHeartRate(injector)
`when`(rh.gs(Comparator.Compare.IS_EQUAL_OR_GREATER.stringRes)).thenReturn(">") `when`(rh.gs(Comparator.Compare.IS_EQUAL_OR_GREATER.stringRes)).thenReturn(">")
`when`(rh.gs(R.string.triggerHeartRateDesc, ">", 80.0)).thenReturn("test") `when`(rh.gs(R.string.triggerHeartRateDesc, ">", 80.0)).thenReturn("test")
assertEquals("test", t.friendlyDescription()) Assertions.assertEquals("test", t.friendlyDescription())
} }
@Test @Test
@ -43,16 +41,16 @@ class TriggerHeartRateTest : TriggerTestBase() {
comparator.value = Comparator.Compare.IS_GREATER comparator.value = Comparator.Compare.IS_GREATER
} }
val dup = t.duplicate() as TriggerHeartRate val dup = t.duplicate() as TriggerHeartRate
assertNotSame(t, dup) Assertions.assertNotSame(t, dup)
assertEquals(100.0, dup.heartRate.value, 0.01) Assertions.assertEquals(100.0, dup.heartRate.value, 0.01)
assertEquals(Comparator.Compare.IS_GREATER, dup.comparator.value) Assertions.assertEquals(Comparator.Compare.IS_GREATER, dup.comparator.value)
} }
@Test @Test
fun shouldRunNotAvailable() { fun shouldRunNotAvailable() {
val t = TriggerHeartRate(injector).apply { comparator.value = Comparator.Compare.IS_NOT_AVAILABLE } val t = TriggerHeartRate(injector).apply { comparator.value = Comparator.Compare.IS_NOT_AVAILABLE }
assertTrue(t.shouldRun()) Assertions.assertTrue(t.shouldRun())
verifyNoMoreInteractions(repository) verifyNoMoreInteractions(repository)
} }
@ -62,8 +60,8 @@ class TriggerHeartRateTest : TriggerTestBase() {
heartRate.value = 100.0 heartRate.value = 100.0
comparator.value = Comparator.Compare.IS_GREATER comparator.value = Comparator.Compare.IS_GREATER
} }
`when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(emptyList()) `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(Single.just(emptyList()))
assertFalse(t.shouldRun()) Assertions.assertFalse(t.shouldRun())
verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis) verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)
verifyNoMoreInteractions(repository) verifyNoMoreInteractions(repository)
} }
@ -78,8 +76,8 @@ class TriggerHeartRateTest : TriggerTestBase() {
HeartRate(duration = 300_000, timestamp = now - 300_000, beatsPerMinute = 80.0, device = "test"), HeartRate(duration = 300_000, timestamp = now - 300_000, beatsPerMinute = 80.0, device = "test"),
HeartRate(duration = 300_000, timestamp = now, beatsPerMinute = 60.0, device = "test"), HeartRate(duration = 300_000, timestamp = now, beatsPerMinute = 60.0, device = "test"),
) )
`when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(hrs) `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(Single.just(hrs))
assertFalse(t.shouldRun()) Assertions.assertFalse(t.shouldRun())
verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis) verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)
verifyNoMoreInteractions(repository) verifyNoMoreInteractions(repository)
} }
@ -93,8 +91,8 @@ class TriggerHeartRateTest : TriggerTestBase() {
val hrs = listOf( val hrs = listOf(
HeartRate(duration = 300_000, timestamp = now, beatsPerMinute = 120.0, device = "test"), HeartRate(duration = 300_000, timestamp = now, beatsPerMinute = 120.0, device = "test"),
) )
`when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(hrs) `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(Single.just(hrs))
assertTrue(t.shouldRun()) Assertions.assertTrue(t.shouldRun())
verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis) verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)
verifyNoMoreInteractions(repository) verifyNoMoreInteractions(repository)
} }
@ -105,12 +103,9 @@ class TriggerHeartRateTest : TriggerTestBase() {
heartRate.value = 100.0 heartRate.value = 100.0
comparator.value = Comparator.Compare.IS_GREATER comparator.value = Comparator.Compare.IS_GREATER
} }
assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value) Assertions.assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value)
assertEquals( Assertions.assertEquals("""{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}""".trimMargin(), t.toJSON())
"""{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}""".trimMargin(),
t.toJSON()
)
} }
@Test @Test
@ -120,7 +115,7 @@ class TriggerHeartRateTest : TriggerTestBase() {
"""{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}""" """{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}"""
) )
) as TriggerHeartRate ) as TriggerHeartRate
assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value) Assertions.assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value)
assertEquals(100.0, t.heartRate.value, 0.01) Assertions.assertEquals(100.0, t.heartRate.value, 0.01)
} }
} }

View file

@ -6,6 +6,7 @@
<string name="previous_button">Föregående</string> <string name="previous_button">Föregående</string>
<string name="nav_setupwizard">Installationsguide</string> <string name="nav_setupwizard">Installationsguide</string>
<string name="setupwizard_finish">Avsluta</string> <string name="setupwizard_finish">Avsluta</string>
<string name="welcome">Välkommen</string>
<string name="welcometosetupwizard">Välkommen till installationsguiden! Den kommer att hjälpa dig genom installationsprocessen\n</string> <string name="welcometosetupwizard">Välkommen till installationsguiden! Den kommer att hjälpa dig genom installationsprocessen\n</string>
<string name="end_user_license_agreement">Licensavtal för slutanvändare</string> <string name="end_user_license_agreement">Licensavtal för slutanvändare</string>
<string name="end_user_license_agreement_text">FÅR INTE ANVÄNDAS FÖR ATT FATTA MEDICINSKA BESLUT. DET FINNS INGEN GARANTI FÖR PROGRAMMET I DEN UTSTRÄCKNING SOM TILLÅTS AV GÄLLANDE LAG. FÖRUTOM NÄR ANNAT ANGES SKRIFTLIGEN LEVERERAS APPLIKATIONEN SOM DEN ÄR HELT UTAN GARANTIER I NÅGON SOM HELST FORM, VARKEN UTTRYCKTA ELLER UNDERFÖRSTÅDDA, INKLUSIVE MEN INTE BEGRÄNSAT TILL SÄLJBARHET OCH LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL. HELA RISKEN VAD GÄLLER KVALITET OCH PRESTANDA AV PROGRAMMET ÅLIGGER ANVÄNDAREN. OM PROGRAMMET VISAR SIG VARA DEFEKT ANTAR ANVÄNDAREN DEN FULLA FÖR KOSTNADEN FÖR ALL NÖDVÄNDIG SERVICE, REPARATION ELLER KORRIGERING.</string> <string name="end_user_license_agreement_text">FÅR INTE ANVÄNDAS FÖR ATT FATTA MEDICINSKA BESLUT. DET FINNS INGEN GARANTI FÖR PROGRAMMET I DEN UTSTRÄCKNING SOM TILLÅTS AV GÄLLANDE LAG. FÖRUTOM NÄR ANNAT ANGES SKRIFTLIGEN LEVERERAS APPLIKATIONEN SOM DEN ÄR HELT UTAN GARANTIER I NÅGON SOM HELST FORM, VARKEN UTTRYCKTA ELLER UNDERFÖRSTÅDDA, INKLUSIVE MEN INTE BEGRÄNSAT TILL SÄLJBARHET OCH LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL. HELA RISKEN VAD GÄLLER KVALITET OCH PRESTANDA AV PROGRAMMET ÅLIGGER ANVÄNDAREN. OM PROGRAMMET VISAR SIG VARA DEFEKT ANTAR ANVÄNDAREN DEN FULLA FÖR KOSTNADEN FÖR ALL NÖDVÄNDIG SERVICE, REPARATION ELLER KORRIGERING.</string>
@ -20,10 +21,12 @@
<string name="need_location_permission">Appen behöver platsåtkomst för bluetooth- och WiFi-identifiering</string> <string name="need_location_permission">Appen behöver platsåtkomst för bluetooth- och WiFi-identifiering</string>
<string name="need_storage_permission">Applikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningar</string> <string name="need_storage_permission">Applikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningar</string>
<string name="askforpermission">Be om behörighet</string> <string name="askforpermission">Be om behörighet</string>
<string name="need_whitelisting">%1$s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt</string>
<string name="storedsettingsfound">Tidigare sparade inställningar hittade</string> <string name="storedsettingsfound">Tidigare sparade inställningar hittade</string>
<string name="master_password_summary">Huvudlösenordet används för att kryptera backuper och för att åsidosätta vissa säkerhetsfunktioner i applikationen. Kom ihåg det eller förvara det på ett säkert ställe.</string> <string name="master_password_summary">Huvudlösenordet används för att kryptera backuper och för att åsidosätta vissa säkerhetsfunktioner i applikationen. Kom ihåg det eller förvara det på ett säkert ställe.</string>
<string name="current_master_password">Nuvarande huvudlösenord</string> <string name="current_master_password">Nuvarande huvudlösenord</string>
<string name="common_values">Använd värden för den största måltiden som du vanligen äter\n</string> <string name="common_values">Använd värden för den största måltiden som du vanligen äter\n</string>
<string name="syncinfotext">Synkronisera data till molnet. Du kan hoppa över detta steg nu, men du kommer inte att kunna klara inlärningsmålen förrän du ansluter Nightscout eller Tidepool.</string>
<string name="status">Status:</string> <string name="status">Status:</string>
<string name="patient_name">Patientens namn</string> <string name="patient_name">Patientens namn</string>
<string name="patient_name_summary">Vänligen ange patientens namn eller smeknamn för att kunna skilja mellan flera uppsättningar av inställningar</string> <string name="patient_name_summary">Vänligen ange patientens namn eller smeknamn för att kunna skilja mellan flera uppsättningar av inställningar</string>
@ -33,7 +36,9 @@
<string name="profile">Profil</string> <string name="profile">Profil</string>
<string name="doprofileswitch">Genomför profilbyte</string> <string name="doprofileswitch">Genomför profilbyte</string>
<string name="exitwizard">Hoppa över installationsguiden</string> <string name="exitwizard">Hoppa över installationsguiden</string>
<string name="setupwizard_loop_description">Tryck på knappen nedan för att låta AAPS föreslå/göra basalförändringar</string>
<string name="setupwizard_sensitivity_description">Insticksprogrammet för känslighet används för att detektera insulinkänslighet och för att beräkning av aktiva kolhydrater, COB. För mer information, besök:</string> <string name="setupwizard_sensitivity_description">Insticksprogrammet för känslighet används för att detektera insulinkänslighet och för att beräkning av aktiva kolhydrater, COB. För mer information, besök:</string>
<string name="setupwizard_sensitivity_url">https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html</string>
<string name="setupwizard_aps_description">Välj en av dessa algoritmer. De sorteras från den äldsta till nyaste. Nyare algoritm är oftast mer kraftfull och mer aggressiv. Om du är ny som loopanvändare vill du förmodligen börja med AMA och inte med senaste. Glöm inte att läsa dokumentationen om OpenAPS och konfigurera algoritmen innan användning.</string> <string name="setupwizard_aps_description">Välj en av dessa algoritmer. De sorteras från den äldsta till nyaste. Nyare algoritm är oftast mer kraftfull och mer aggressiv. Om du är ny som loopanvändare vill du förmodligen börja med AMA och inte med senaste. Glöm inte att läsa dokumentationen om OpenAPS och konfigurera algoritmen innan användning.</string>
<string name="setupwizard_pump_waiting_for_riley_link_connection">Konfigurera din Riley Link nedan. När du har valt en Riley Link kan du fortsätta installationen när status är \"Ansluten\". Det här kan ta en minut.\n</string> <string name="setupwizard_pump_waiting_for_riley_link_connection">Konfigurera din Riley Link nedan. När du har valt en Riley Link kan du fortsätta installationen när status är \"Ansluten\". Det här kan ta en minut.\n</string>
<string name="setupwizard_pump_pump_not_initialized">Du kan fortsätta installationen först när pumpen har konfigurerats.\n</string> <string name="setupwizard_pump_pump_not_initialized">Du kan fortsätta installationen först när pumpen har konfigurerats.\n</string>
@ -48,24 +53,35 @@
<string name="request">Begäran</string> <string name="request">Begäran</string>
<string name="apsmode_title">APS-läge</string> <string name="apsmode_title">APS-läge</string>
<string name="setupwizard_preferred_aps_mode">Föredraget APS-läge</string> <string name="setupwizard_preferred_aps_mode">Föredraget APS-läge</string>
<string name="error_asking_for_permissions">Fel vid begäran om behörigheter</string>
<string name="alert_dialog_permission_battery_optimization_failed">Denna enhet verkar inte ha stöd för vitlistning från batterioptimering. Du eventuellt råka ut för problem pga detta.</string> <string name="alert_dialog_permission_battery_optimization_failed">Denna enhet verkar inte ha stöd för vitlistning från batterioptimering. Du eventuellt råka ut för problem pga detta.</string>
<!-- ConfigBuilder--> <!-- ConfigBuilder-->
<string name="config_builder">Konfigurationsverktyg</string> <string name="config_builder">Konfigurationsverktyg</string>
<string name="configbuilder_pump">Pump</string> <string name="configbuilder_pump">Pump</string>
<string name="configbuilder_pump_description">Vilken pump vill du använda med AAPS?</string>
<string name="configbuilder_profile">Profil</string> <string name="configbuilder_profile">Profil</string>
<string name="configbuilder_profile_description">Vilken profil ska AAPS använda?</string>
<string name="configbuilder_aps">APS</string> <string name="configbuilder_aps">APS</string>
<string name="configbuilder_aps_description">Vilken algoritm ska användas för behandlingar?</string> <string name="configbuilder_aps_description">Vilken algoritm ska användas för behandlingar?</string>
<string name="configbuilder_general">Generella inställningar</string> <string name="configbuilder_general">Generella inställningar</string>
<string name="configbuilder_general_description">Dessa är några allmänna insticksprogram som kan vara användbara.</string> <string name="configbuilder_general_description">Dessa är några allmänna insticksprogram som kan vara användbara.</string>
<string name="configbuilder_sync">Synkronisering</string> <string name="configbuilder_sync">Synkronisering</string>
<string name="configbuilder_sync_description">Plugin för uppladdning och synkronisering av data.</string>
<string name="configbuilder_constraints_description">Vilka begränsningar ska tillämpas?</string> <string name="configbuilder_constraints_description">Vilka begränsningar ska tillämpas?</string>
<string name="configbuilder_loop">Loop</string> <string name="configbuilder_loop">Loop</string>
<string name="configbuilder_loop_description">Använd detta för att aktivera AAPS loop-möjligheter.</string>
<string name="configbuilder_insulin_description">Vilken typ av insulin använder du?</string> <string name="configbuilder_insulin_description">Vilken typ av insulin använder du?</string>
<string name="configbuilder_bgsource">BG-källa</string> <string name="configbuilder_bgsource">BG-källa</string>
<string name="configbuilder_bgsource_description">Var ska AAPS få sitt data ifrån?</string>
<string name="configbuilder_smoothing">Utjämning</string>
<string name="configbuilder_smoothing_description">Välj utjämningsalgoritm</string>
<string name="configbuilder_sensitivity">Känslighetsavkänning</string> <string name="configbuilder_sensitivity">Känslighetsavkänning</string>
<string name="configbuilder_sensitivity_description">Vilken algoritm vill du använda för känslighetsavkänning?</string> <string name="configbuilder_sensitivity_description">Vilken algoritm vill du använda för känslighetsavkänning?</string>
<string name="config_builder_shortname">Konf</string> <string name="config_builder_shortname">Konf</string>
<string name="description_config_builder">Används för att konfigurera de aktiva insticksprogrammen</string> <string name="description_config_builder">Används för att konfigurera de aktiva insticksprogrammen</string>
<string name="allow_hardware_pump_text">Varning: Om du aktiverar och ansluter en pump kommer AAPS skriva över pumpens basalprofil med den aktiva profilen i AAPS. Se till att ha rätt inställningar i appen innan du ansluter. Om du är osäker, tryck på Avbryt och anslut pumpen på nytt vid ett senare tillfälle.</string>
<string name="a11y_open_settings">öppna inställningar</string>
<string name="nsclient_version_does_not_match">Följarversionen matchar inte AAPS-versionen. Vänligen uppdatera.</string>
<!--ImportExport--> <!--ImportExport-->
<string name="nav_preferences">Inställningar</string> <string name="nav_preferences">Inställningar</string>
<string name="password_preferences_encrypt_prompt">Du kommer att bli tillfrågad om huvudlösenordet som sedan kommer att användas för att kryptera exporterade inställningar.</string> <string name="password_preferences_encrypt_prompt">Du kommer att bli tillfrågad om huvudlösenordet som sedan kommer att användas för att kryptera exporterade inställningar.</string>
@ -98,6 +114,7 @@
<string name="maintenance">Underhåll</string> <string name="maintenance">Underhåll</string>
<string name="maintenance_shortname">UH</string> <string name="maintenance_shortname">UH</string>
<string name="description_maintenance">Tillhandahåller funktioner för underhåll (t ex skicka eller ta bort loggar).</string> <string name="description_maintenance">Tillhandahåller funktioner för underhåll (t ex skicka eller ta bort loggar).</string>
<string name="database_cleanup">Rensning av databas</string>
<string name="reset_db_confirm">Vill du verkligen återställa databaserna?</string> <string name="reset_db_confirm">Vill du verkligen återställa databaserna?</string>
<string name="maintenance_settings">Underhållsinställningar</string> <string name="maintenance_settings">Underhållsinställningar</string>
<string name="maintenance_email">e-postmottagare</string> <string name="maintenance_email">e-postmottagare</string>
@ -106,7 +123,9 @@
<string name="delete_logs">Radera loggar</string> <string name="delete_logs">Radera loggar</string>
<string name="configbuilder_nightscoutversion_label">Nightscoutversion:</string> <string name="configbuilder_nightscoutversion_label">Nightscoutversion:</string>
<string name="engineering_mode_enabled">Engineering Mode aktiverat</string> <string name="engineering_mode_enabled">Engineering Mode aktiverat</string>
<string name="log_files">Loggfiler</string>
<string name="nav_logsettings">Loggningsinställningar</string> <string name="nav_logsettings">Loggningsinställningar</string>
<string name="miscellaneous">Diverse</string>
<string name="nav_resetdb">Återställ databaserna</string> <string name="nav_resetdb">Återställ databaserna</string>
<string name="resettodefaults">Återställ standardinställningar</string> <string name="resettodefaults">Återställ standardinställningar</string>
<!-- Maintenance --> <!-- Maintenance -->
@ -134,5 +153,7 @@
<string name="prefdecrypt_issue_wrong_format">Krypteringskonfigurationen saknas. Inställningsformatet är ogiltigt!</string> <string name="prefdecrypt_issue_wrong_format">Krypteringskonfigurationen saknas. Inställningsformatet är ogiltigt!</string>
<string name="prefdecrypt_issue_wrong_algorithm">Ej stödd eller ej angiven krypteringsalgoritm!</string> <string name="prefdecrypt_issue_wrong_algorithm">Ej stödd eller ej angiven krypteringsalgoritm!</string>
<!-- Custom Watchface --> <!-- Custom Watchface -->
<string name="wear_import_custom_watchface_title">Välj anpassad urtavla</string>
<!-- Permissions --> <!-- Permissions -->
<string name="alert_dialog_storage_permission_text">Vänligen starta om telefonen eller starta om AAPS från systeminställningar \nannars kommer Android APS inte att ha loggning aktiverat (viktigt för att spåra och kontrollera att algoritmerna fungerar korrekt)!</string>
</resources> </resources>

View file

@ -4,15 +4,29 @@
<string name="dia_label_exam">Insulinduration (DIA)</string> <string name="dia_label_exam">Insulinduration (DIA)</string>
<string name="dia_profile">Du bör ange värdet för DIA i din profil.</string> <string name="dia_profile">Du bör ange värdet för DIA i din profil.</string>
<string name="dia_minimumis5h">Det minsta tillåtna värdet är 5 timmar.</string> <string name="dia_minimumis5h">Det minsta tillåtna värdet är 5 timmar.</string>
<string name="dia_hint1">https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html#insulin</string>
<string name="dia_meaningisequaltodiapump">Om du tycker att värdet för DIA som du använde i din pump före AAPS fungerade väl, behöver du inte ändra det här när du börjar looping.</string>
<string name="dia_valuemustbedetermined">Du bör själv fastställa det lämpliga värdet för DIA.</string> <string name="dia_valuemustbedetermined">Du bör själv fastställa det lämpliga värdet för DIA.</string>
<string name="hypott_label">Hypo tempmål</string> <string name="hypott_label">Hypo tempmål</string>
<string name="hypott_whenhypott">Vad är huvudskälet till att ange ett tillfälligt mål för lågt blodsocker?</string>
<string name="hypott_wrongbasal">För att korrigera känningar som orsakas av felaktiga basalinställningar.</string> <string name="hypott_wrongbasal">För att korrigera känningar som orsakas av felaktiga basalinställningar.</string>
<string name="hypott_preventoversmb">För att förhindra att AAPS överkorrigerar för ett snabbt stigande blodsocker orsakat av snabbverkande kolhydrater som intagits för att behandla lågt blodsocker.</string>
<string name="hypott_exercise">För att korrigera för en känning om ett resultat av motion.</string> <string name="hypott_exercise">För att korrigera för en känning om ett resultat av motion.</string>
<string name="hypott_0basal">För att förhindra att blodsockret blir lågt även om basaldosen redan är 0%.</string> <string name="hypott_0basal">För att förhindra att blodsockret blir lågt även om basaldosen redan är 0%.</string>
<string name="hypott_hint1">https://wiki.aaps.app/en/latest/Usage/temptarget.html</string>
<string name="offlineprofile_whatprofile">Vilken profiltyp kan användas och konfigureras offline?</string> <string name="offlineprofile_whatprofile">Vilken profiltyp kan användas och konfigureras offline?</string>
<string name="offlineprofile_label">Ämne: Offlineprofil</string> <string name="offlineprofile_label">Ämne: Offlineprofil</string>
<string name="offlineprofile_nsprofile">NS-profil kan användas, men inte konfigureras.</string> <string name="offlineprofile_nsprofile">NS-profil kan användas, men inte konfigureras.</string>
<string name="offlineprofile_hint1">https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html#profile</string>
<string name="pumpdisconnect_label">Skäl att använda \"Koppla bort pump\" i AAPS</string>
<string name="pumpdisconnect_whattodo">Vad ska göras när pumpen avlägsnas från kroppen?</string>
<string name="pumpdisconnect_unnecessary">Detta är onödigt eftersom insulin ändå inte kommer levereras om pumpen är fysiskt bortkopplad.</string> <string name="pumpdisconnect_unnecessary">Detta är onödigt eftersom insulin ändå inte kommer levereras om pumpen är fysiskt bortkopplad.</string>
<string name="pumpdisconnect_missinginsulin">Det hjälper AAPS att förstå att inget insulin levereras när pumpen är fysiskt bortkopplad.</string>
<string name="pumpdisconnect_notstop">Det stoppar inte leverans av insulin om pumpen fortsätter att vara ansluten till din kropp.</string>
<string name="pumpdisconnect_openloop">Det kommer att ställa AAPS i öppen loop-läge.</string>
<string name="pumpdisconnect_hint1">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#other-settings</string>
<string name="objectives_label">AAPS-inställningar</string>
<string name="objectives2_label">AAPS-inställningar</string>
<string name="objectives_howtosave">Vilka är de rekommenderade metoderna för att säkerhetskopiera dina inställningar?</string> <string name="objectives_howtosave">Vilka är de rekommenderade metoderna för att säkerhetskopiera dina inställningar?</string>
<string name="objectives_notesettings">Du behöver inte exportera dina inställningar om du antecknar dem.</string> <string name="objectives_notesettings">Du behöver inte exportera dina inställningar om du antecknar dem.</string>
<string name="objectives_afterobjective">Exportera dina inställningar när du har slutfört ett mål.</string> <string name="objectives_afterobjective">Exportera dina inställningar när du har slutfört ett mål.</string>
@ -22,23 +36,29 @@
<string name="objectives2_internalstorage">Din inställningsfil finns i mappen Internt lagringsutrymme/AAPS/preferences på telefonen.</string> <string name="objectives2_internalstorage">Din inställningsfil finns i mappen Internt lagringsutrymme/AAPS/preferences på telefonen.</string>
<string name="objectives2_cloud">Kopiera din inställningsfilen till en säker plats utanför din telefon (t.ex. genom att använda molnlagring, ansluta med en kabel till datorn, e-post, etc.)</string> <string name="objectives2_cloud">Kopiera din inställningsfilen till en säker plats utanför din telefon (t.ex. genom att använda molnlagring, ansluta med en kabel till datorn, e-post, etc.)</string>
<string name="objectives2_easyrestore">Om telefonen är skadad eller borttappad finns det enkla sätt att återställa dina inställningar utan säkerhetskopia.</string> <string name="objectives2_easyrestore">Om telefonen är skadad eller borttappad finns det enkla sätt att återställa dina inställningar utan säkerhetskopia.</string>
<string name="objectives_hint1">https://wiki.aaps.app/en/latest/Usage/ExportImportSettings.html</string>
<string name="objectives_hint2">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#what-emergency-equipment-is-recommended-to-take-with-me</string>
<string name="noisycgm_label">Brusiga CGM-värden</string> <string name="noisycgm_label">Brusiga CGM-värden</string>
<string name="noisycgm_whattodo">Vad bör göras om CGM-datat är brusigt?</string> <string name="noisycgm_whattodo">Vad bör göras om CGM-datat är brusigt?</string>
<string name="noisycgm_nothing">Gör inget - AAPS tar hand om det.</string>
<string name="noisycgm_pause">Inaktivera closed loop-läge för att undvika över- eller underdosering.</string> <string name="noisycgm_pause">Inaktivera closed loop-läge för att undvika över- eller underdosering.</string>
<string name="noisycgm_replacesensor">Byt ut brusiga eller felaktiga sensorer.</string> <string name="noisycgm_replacesensor">Byt ut brusiga eller felaktiga sensorer.</string>
<string name="noisycgm_checksmoothing">Kontrollera att din CGM-app ger utjämnade data.</string> <string name="noisycgm_checksmoothing">Kontrollera att din CGM-app ger utjämnade data.</string>
<string name="noisycgm_hint1">https://wiki.aaps.app/en/latest/Usage/Smoothing-Blood-Glucose-Data-in-xDrip.html#smoothing-blood-glucose-data</string>
<string name="exerciseprofile_label">Träning och profiler</string> <string name="exerciseprofile_label">Träning och profiler</string>
<string name="exerciseprofile_whattodo">Hur kan du använda profiler för att bäst hjälpa systemet att hantera aerobisk träning?</string> <string name="exerciseprofile_whattodo">Hur kan du använda profiler för att bäst hjälpa systemet att hantera aerobisk träning?</string>
<string name="exerciseprofile_switchprofilebelow100">Gör ett profilbyte till mindre än 100%.</string> <string name="exerciseprofile_switchprofilebelow100">Gör ett profilbyte till mindre än 100%.</string>
<string name="exerciseprofile_switchprofileabove100">Gör ett profilbyte till mer än 100%.</string> <string name="exerciseprofile_switchprofileabove100">Gör ett profilbyte till mer än 100%.</string>
<string name="exerciseprofile_leaveat100">Lämna profilen på 100%.</string> <string name="exerciseprofile_leaveat100">Lämna profilen på 100%.</string>
<string name="exerciseprofile_suspendloop">Pausa loopen.</string> <string name="exerciseprofile_suspendloop">Pausa loopen.</string>
<string name="exerciseprofile_hint1">https://wiki.aaps.app/en/latest/Usage/temptarget.html#activity-temp-target</string>
<string name="exercise_label">Träning och tillfälliga mål</string> <string name="exercise_label">Träning och tillfälliga mål</string>
<string name="exercise_whattodo">Hur kan man använda tillfälliga mål för att på bästa sätt hjälpa systemet att hantera aerobisk träning?</string> <string name="exercise_whattodo">Hur kan man använda tillfälliga mål för att på bästa sätt hjälpa systemet att hantera aerobisk träning?</string>
<string name="exercise_settt">Ställ in temp mål för Träning vid en lämplig tidpunkt innan motionen påbörjas.</string> <string name="exercise_settt">Ställ in temp mål för Träning vid en lämplig tidpunkt innan motionen påbörjas.</string>
<string name="exercise_setfinished">Ställ in temp mål för Träning efter avslutad träning.</string> <string name="exercise_setfinished">Ställ in temp mål för Träning efter avslutad träning.</string>
<string name="exercise_setunchanged">Lämna ditt målvärde oförändrat.</string> <string name="exercise_setunchanged">Lämna ditt målvärde oförändrat.</string>
<string name="exercise_15g">Vänta tills blodglukosnivån sjunker under ditt Hypo temp mål och sen äter du 15 g av snabbverkande kolhydrater.</string> <string name="exercise_15g">Vänta tills blodglukosnivån sjunker under ditt Hypo temp mål och sen äter du 15 g av snabbverkande kolhydrater.</string>
<string name="exercise_hint1">https://wiki.aaps.app/en/latest/Usage/temptarget.html#activity-temp-target</string>
<string name="suspendloop_doigetinsulin">Får jag insulin när loopen är avstängd eller pausad?</string> <string name="suspendloop_doigetinsulin">Får jag insulin när loopen är avstängd eller pausad?</string>
<string name="suspendloop_yes">Ja. Basalinsulin fortsätter att levereras.</string> <string name="suspendloop_yes">Ja. Basalinsulin fortsätter att levereras.</string>
<string name="suspendloop_no">Nej, leverans av insulin är stoppad.</string> <string name="suspendloop_no">Nej, leverans av insulin är stoppad.</string>
@ -48,7 +68,9 @@
<string name="basaltest_havingregularhighlow">När du upplever frekvent högt eller lågt blodsocker.</string> <string name="basaltest_havingregularhighlow">När du upplever frekvent högt eller lågt blodsocker.</string>
<string name="basaltest_weekly">Minst en gång i veckan.</string> <string name="basaltest_weekly">Minst en gång i veckan.</string>
<string name="basaltest_fixed">När du väl har ställt in och validerat dessa värden bör dessa värden inte ändras över tiden.</string> <string name="basaltest_fixed">När du väl har ställt in och validerat dessa värden bör dessa värden inte ändras över tiden.</string>
<string name="basaltest_hint1">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#androidaps-settings</string>
<string name="prerequisites_label">Förutsättningar</string> <string name="prerequisites_label">Förutsättningar</string>
<string name="prerequisites_what">Vad är nödvändigt för att installera och använda AAPS?</string>
<string name="prerequisites_determinedcorrectprofile">Validerad profilinformation (Basal, IC, ISF, DIA).</string> <string name="prerequisites_determinedcorrectprofile">Validerad profilinformation (Basal, IC, ISF, DIA).</string>
<string name="prerequisites_computer">En dator med Android Studio installerad och konfigurerad.</string> <string name="prerequisites_computer">En dator med Android Studio installerad och konfigurerad.</string>
<string name="prerequisites_phone">En telefon som stöds.</string> <string name="prerequisites_phone">En telefon som stöds.</string>
@ -59,35 +81,73 @@
<string name="prerequisites_githubaccount">Ett Github-konto.</string> <string name="prerequisites_githubaccount">Ett Github-konto.</string>
<string name="prerequisites_beanandroiddeveloper">Erfarenhet av programmering eller redigering av kod.</string> <string name="prerequisites_beanandroiddeveloper">Erfarenhet av programmering eller redigering av kod.</string>
<string name="prerequisites_own670g">En MiniMed 670G pump.</string> <string name="prerequisites_own670g">En MiniMed 670G pump.</string>
<string name="prerequisites_hint1">https://wiki.aaps.app/en/latest/Module/module.html</string>
<string name="prerequisites_smartwatch">En smart klocka.</string> <string name="prerequisites_smartwatch">En smart klocka.</string>
<string name="prerequisites_supportedcgm">En CGM som stöds.</string> <string name="prerequisites_supportedcgm">En CGM som stöds.</string>
<string name="prerequisites2_label">Förutsättningar</string> <string name="prerequisites2_label">Förutsättningar</string>
<string name="prerequisites2_what">Vad är nödvändigt för att installera och använda AAPS?</string>
<string name="prerequisites2_profile">Validerad information för att konfigurera en profil (ISF, KH-kvot, basaldoser, DIA osv.).</string> <string name="prerequisites2_profile">Validerad information för att konfigurera en profil (ISF, KH-kvot, basaldoser, DIA osv.).</string>
<string name="prerequisites2_device">En kompatibel Android-enhet (t.ex. mobiltelefon, full Android-klocka eller surfplatta).</string> <string name="prerequisites2_device">En kompatibel Android-enhet (t.ex. mobiltelefon, full Android-klocka eller surfplatta).</string>
<string name="prerequisites2_internet">AAPS kräver en Internetanslutning för att kunna köras i closed loop-läge.</string>
<string name="prerequisites2_supportedcgm">En stödd CGM och lämplig app för att ta emot blodsockervärden på telefonen/enheten.</string> <string name="prerequisites2_supportedcgm">En stödd CGM och lämplig app för att ta emot blodsockervärden på telefonen/enheten.</string>
<string name="prerequisites2_hint1">https://wiki.aaps.app/en/latest/Module/module.html</string>
<string name="update_label">Uppdaterar AAPS</string>
<string name="whatistrue">Markera ett eller flera alternativ.</string> <string name="whatistrue">Markera ett eller flera alternativ.</string>
<string name="update_git">Du måste ha Git installerat och konfigurerat på din dator.</string> <string name="update_git">Du måste ha Git installerat och konfigurerat på din dator.</string>
<string name="update_asap">När uppdaterade versioner av AAPS släpps, kan de tidigare versionerna få begränsad funktionalitet efter en viss tid.</string>
<string name="update_keys">Du bör spara och notera platsen för ditt keystore och använda samma signeringsnyckel för uppdateringar som för den föregående installationen.</string> <string name="update_keys">Du bör spara och notera platsen för ditt keystore och använda samma signeringsnyckel för uppdateringar som för den föregående installationen.</string>
<string name="update_neverupdate">Uppdatera aldrig om systemet fungerar bra.</string> <string name="update_neverupdate">Uppdatera aldrig om systemet fungerar bra.</string>
<string name="update_askfriend">Om du har problem att bygga apk-filen, kan du installera en apk som har byggts av en vän.</string> <string name="update_askfriend">Om du har problem att bygga apk-filen, kan du installera en apk som har byggts av en vän.</string>
<string name="update_hint1">https://wiki.aaps.app/en/latest/Installing-AndroidAPS/Update-to-new-version.html#update-to-a-new-version-or-branch</string>
<string name="troubleshooting_label">Felsökning</string> <string name="troubleshooting_label">Felsökning</string>
<string name="troubleshooting_wheretoask">Vart vänder du dig för att få hjälp med AAPS?</string>
<string name="troubleshooting_fb">Du kan be om råd i Facebook-gruppen \"AAPS Users\".</string>
<string name="troubleshooting_wiki">Du bör läsa (och repetera) AAPS-dokumentationen.</string>
<string name="troubleshooting_gitter">Du kan be om råd och logga tekniska problem eller andra ärenden på AAPS Discord-server.</string>
<string name="troubleshooting_yourendo">Du bör fråga din diabetesklinik/endokrinolog.</string> <string name="troubleshooting_yourendo">Du bör fråga din diabetesklinik/endokrinolog.</string>
<string name="troubleshooting_hint1">https://wiki.aaps.app/en/latest/Installing-AndroidAPS/Update-to-new-version.html#troubleshooting</string>
<string name="troubleshooting_hint2">https://www.facebook.com/groups/AndroidAPSUsers/</string> <string name="troubleshooting_hint2">https://www.facebook.com/groups/AndroidAPSUsers/</string>
<string name="troubleshooting_hint3">https://discord.gg/4fQUWHZ4Mw</string>
<string name="insulin_plugins">Insulininställningar</string>
<string name="insulin_ultrarapid">Vilket insulin ska du använda med insticksprogrammet Ultra-Rapid Oref?</string> <string name="insulin_ultrarapid">Vilket insulin ska du använda med insticksprogrammet Ultra-Rapid Oref?</string>
<string name="insulin_fiasp">Fiasp®</string> <string name="insulin_fiasp">Fiasp®</string>
<string name="insulin_novorapid">NovoRapid®/Novolog®</string> <string name="insulin_novorapid">NovoRapid®/Novolog®</string>
<string name="insulin_humalog">Humalog ®</string> <string name="insulin_humalog">Humalog ®</string>
<string name="insulin_actrapid">Actrapid ®/Humalin R ®/\"reguljärt\" human-insulin.</string> <string name="insulin_actrapid">Actrapid ®/Humalin R ®/\"reguljärt\" human-insulin.</string>
<string name="insulin_hint1">https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html#insulin</string>
<string name="sensitivity_label">Insticksprogram för känslighet</string> <string name="sensitivity_label">Insticksprogram för känslighet</string>
<string name="sensitivity_which">Markera ett eller flera alternativ.</string> <string name="sensitivity_which">Markera ett eller flera alternativ.</string>
<string name="sensitivity_adjust">Insticksprogram för känslighet gör det möjligt för AAPS att justera för tillfälliga eller kortvariga förändringar i insulinkänsligheten (t. ex. hormonella förändringar eller problem med absorption vid infusionsstället).</string>
<string name="sensitivity_edit">Insticksprogram för känslighet ger användaren föreslagna ändringar av basaldoser, KH-kvoter och ISF som kan användas för att redigera profilen.</string>
<string name="sensitivity_cannula">När du loggar ett kanylbyte återställs autosens-värdet tillbaka till 100%.</string>
<string name="sensitivity_time">Vissa av insticksprogrammens inställningar har konfigurerbara tidsintervall som kan ställas in av användaren.</string>
<string name="sensitivity_hint1">https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html</string>
<string name="sensitivity_hint2">https://wiki.aaps.app/en/latest/Usage/Open-APS-features.html#autosens</string>
<string name="wrongcarbs_label">Fel i KH-inmatning</string> <string name="wrongcarbs_label">Fel i KH-inmatning</string>
<string name="wrongcarbs_whattodo">Vad ska du göra om du har gjort en felaktig inmatning?</string> <string name="wrongcarbs_whattodo">Vad ska du göra om du har gjort en felaktig inmatning?</string>
<string name="wrongcarbs_treatmentstab">Ta bort den felaktiga posten i Behandlingar och ange rätt kolhydratmängd.</string> <string name="wrongcarbs_treatmentstab">Ta bort den felaktiga posten i Behandlingar och ange rätt kolhydratmängd.</string>
<string name="wrongcarbs_addinsulin">Ge bolus med insulin med hjälp av förfyllningsmenyn för infusionssetet.</string> <string name="wrongcarbs_addinsulin">Ge bolus med insulin med hjälp av förfyllningsmenyn för infusionssetet.</string>
<string name="wrongcarbs_donothing">Gör inget - AAPS kommer att utföra lämpliga justeringar.</string>
<string name="wrongcarbs_bolus">Ge bolus med hjälp av knappen Insulin på hem/översiktssidan.</string> <string name="wrongcarbs_bolus">Ge bolus med hjälp av knappen Insulin på hem/översiktssidan.</string>
<string name="wronginsulin_label">Fel i bolusinmatning</string> <string name="wronginsulin_label">Fel i bolusinmatning</string>
<string name="wronginsulin_whattodo">Vad ska du göra om du fått mindre insulin än vad pumpens historik visar, t.ex. på grund av en insulinblockering, en felaktig kanyl eller om du glömt att sätta tillbaka din slangpump efter en dusch?</string>
<string name="wronginsulin_careportal">Ta bort insulindata från Nightscout för att ta bort den från pumpens historik.</string> <string name="wronginsulin_careportal">Ta bort insulindata från Nightscout för att ta bort den från pumpens historik.</string>
<string name="wronginsulin_compare">Jämför värden i AAPS och pumphistoriken (om pumpen stöder detta).</string>
<string name="wronginsulin_prime">Ge en bolus med en del av det insulin du saknar antingen med penna eller genom att använda förfyllningsfunktionen.</string> <string name="wronginsulin_prime">Ge en bolus med en del av det insulin du saknar antingen med penna eller genom att använda förfyllningsfunktionen.</string>
<string name="wronginsulin_donothing">Gör ingenting och låt AAPS korrigera eventuella resulterande höga blodglukosnivåer.</string>
<string name="cob_label">Aktiva kolhydrater (COB)</string>
<string name="cob_question">Hur påverkas COB-beräkningen av ISF-värdet?</string>
<string name="cob_longer">Att öka ISF gör den beräknade KH-absorptionstiden längre</string>
<string name="cob_shorter">Att öka ISF gör den beräknade KH-absorptionstiden kortare</string>
<string name="cob_no_effect">Att öka ISF kommer inte påverka beräknad KH-absorption</string>
<string name="cob2_question">Hur påverkas COB-beräkningen av KH-kvoten?</string>
<string name="cob2_longer">Att öka KH-kvoten gör den beräknade absorptionstiden längre</string>
<string name="cob2_shorter">Att öka KH-kvoten gör den beräknade absorptionstiden kortare</string>
<string name="cob2_no_effect">Att öka KH-kvoten kommer inte påverka beräknad absorptionstid</string>
<string name="cob3_question">Hur påverkas COB-beräkningen av en förändrad profilprocent?</string>
<string name="cob3_longer">Att sätta profilen till 150% kommer att göra den beräknade KH-absorptionstiden längre</string>
<string name="cob3_shorter">Att sätta profilen till 150% kommer att göra den beräknade KH-absorptionstiden kortare</string>
<string name="cob3_no_effect">Att sätta profilen till 150% kommer inte att påverka den beräknade KH-absorptionstiden</string>
<string name="iob_value">IOB-värdet påverkas av temp basaler.</string> <string name="iob_value">IOB-värdet påverkas av temp basaler.</string>
<string name="iob_hightemp">Hög temp basal kommer inte att ges när ditt BG-värde är under målet.</string> <string name="iob_hightemp">Hög temp basal kommer inte att ges när ditt BG-värde är under målet.</string>
<string name="iob_negiob">Negativ IOB under en längre period även om du inte motionerat, tyder på att din profil ger för mycket insulin.</string> <string name="iob_negiob">Negativ IOB under en längre period även om du inte motionerat, tyder på att din profil ger för mycket insulin.</string>
@ -95,15 +155,31 @@
<string name="breadgrams_label">Kolhydrater och bolus</string> <string name="breadgrams_label">Kolhydrater och bolus</string>
<string name="breadgrams_grams">Endast gram får användas för att uppskatta och registrera kolhydrater som konsumeras.</string> <string name="breadgrams_grams">Endast gram får användas för att uppskatta och registrera kolhydrater som konsumeras.</string>
<string name="breadgrams_exchange">Kolhydrater som konsumeras kan registreras med hjälp av ett lämpligt utbytessystem (t.ex. DAFNE \"CHO\" eller europeiska \"Brödenheter\").</string> <string name="breadgrams_exchange">Kolhydrater som konsumeras kan registreras med hjälp av ett lämpligt utbytessystem (t.ex. DAFNE \"CHO\" eller europeiska \"Brödenheter\").</string>
<string name="breadgrams_decay">AAPS använder en dynamisk modell för att uppskatta kolhydratsupptag och beräkna COB.</string>
<string name="breadgrams_calc">Om blodglukosnivån ligger utanför normala värden (för lågt eller för högt) kan boluskalkylatorn användas för att ge förslag om KH- eller insulinkorrektioner.</string> <string name="breadgrams_calc">Om blodglukosnivån ligger utanför normala värden (för lågt eller för högt) kan boluskalkylatorn användas för att ge förslag om KH- eller insulinkorrektioner.</string>
<string name="breadgrams_hint1">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#insulin-to-carb-ratio-ic-g-u</string>
<string name="extendedcarbs_label">e-carbs</string> <string name="extendedcarbs_label">e-carbs</string>
<string name="extendedcarbs_handling">Vad kan du använda e-carbs (förlängda kolhydrater) till?</string> <string name="extendedcarbs_handling">Vad kan du använda e-carbs (förlängda kolhydrater) till?</string>
<string name="extendedcarbs_future">För att schemalägga framtida kolhydrater och/eller fördela över ett intervall (likt en förlängd bolus fördelar insulin över ett intervall).</string> <string name="extendedcarbs_future">För att schemalägga framtida kolhydrater och/eller fördela över ett intervall (likt en förlängd bolus fördelar insulin över ett intervall).</string>
<string name="extendedcarbs_free">För att logga \"fria\" motionskolhydrater som du vill dölja för AAPS.</string>
<string name="extendedcarbs_fat">e-carbs (inlagda för distribution i framtiden) kan hjälpa AAPS att hantera måltider som är fett- och/eller proteinrika.</string>
<string name="extendedcarbs_rescue">För att logga kolhydrater som givits för att korrigera ett lågt BG-värde.</string>
<string name="extendedcarbs_hint1">https://wiki.aaps.app/en/latest/Usage/Extended-Carbs.html</string>
<string name="nsclient_label">Fjärrövervakning</string> <string name="nsclient_label">Fjärrövervakning</string>
<string name="nsclient_howcanyou">Hur kan du övervaka AAPS (till exempel för ditt barn) på distans?</string>
<string name="nsclient_nightscout">AAPSClient-appen, Nightscout-appen och Nightscouts webbsida låter dig följa AAPS på distans.</string>
<string name="nsclient_dexcomfollow">Andra appar (t.ex. Dexcom Follow, xDrip+ i följarläge) gör att du kan följa vissa parametrar (t.ex. BG-värden) men använder andra algoritmer så IOB och COB kanske inte överenstämmer.</string> <string name="nsclient_dexcomfollow">Andra appar (t.ex. Dexcom Follow, xDrip+ i följarläge) gör att du kan följa vissa parametrar (t.ex. BG-värden) men använder andra algoritmer så IOB och COB kanske inte överenstämmer.</string>
<string name="nsclient_data">För att följa AAPS måste båda enheterna ha Internetåtkomst (via WiFi eller mobildata).</string>
<string name="nsclient_fullcontrol">AAPSClient som används som följare kommer både övervaka och ge full kontroll över AAPS.</string>
<string name="nsclient_hint1">https://wiki.aaps.app/en/latest/Children/Children.html</string>
<string name="isf_label_exam">Insulinkänslighetsfaktor (ISF)</string> <string name="isf_label_exam">Insulinkänslighetsfaktor (ISF)</string>
<string name="isf_increasingvalue">Högre ISF-värden kommer att leda till mer insulin för att täcka en viss mängd kolhydrater.</string> <string name="isf_increasingvalue">Högre ISF-värden kommer att leda till mer insulin för att täcka en viss mängd kolhydrater.</string>
<string name="isf_decreasingvalue">Att sänka ISF leder till ökad insulinleverans för att korrigera blodsocker som är över målvärdet.</string>
<string name="isf_noeffect">Att höja eller sänka ISF har påverkar inte insulinleveransen när blodglukosnivån är lägre än målet.</string>
<string name="isf_preferences">ISF ska anges i dina AAPS-inställningar.</string>
<string name="isf_profile">Om du ändrar ISF-värdet i din profil är det tillräckligt för att tillämpa ändringen.</string> <string name="isf_profile">Om du ändrar ISF-värdet i din profil är det tillräckligt för att tillämpa ändringen.</string>
<string name="isf_hint1">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u</string>
<string name="isf_hint2">https://wiki.aaps.app/en/latest/Usage/Profiles.html</string>
<string name="ic_multiple">Du kan använda mer än ett värde för KH-kvot i din profil.</string> <string name="ic_multiple">Du kan använda mer än ett värde för KH-kvot i din profil.</string>
<string name="ic_isf">Om du ändrar din ISF-profil i din profil bör du alltid ändra din KH-kvot också.</string> <string name="ic_isf">Om du ändrar din ISF-profil i din profil bör du alltid ändra din KH-kvot också.</string>
<string name="ic_label_exam">Insulin till kolhydratförhållandet (I:C förhållande)</string> <string name="ic_label_exam">Insulin till kolhydratförhållandet (I:C förhållande)</string>
@ -111,24 +187,41 @@
<string name="ic_decreasingvalue">Lägre kolhydratskvot leder till att mindre insulin levereras för en given mängd kolhydrater.</string> <string name="ic_decreasingvalue">Lägre kolhydratskvot leder till att mindre insulin levereras för en given mängd kolhydrater.</string>
<string name="ic_noeffect">Om du har 0 COB, kommer en förändring av IC-kvoten leda till en annan mängd insulin för att korrigera din BG-nivå.</string> <string name="ic_noeffect">Om du har 0 COB, kommer en förändring av IC-kvoten leda till en annan mängd insulin för att korrigera din BG-nivå.</string>
<string name="ic_different">IC kommer att vara annorlunda om du räknar brödenheter (utbytesenhet) som 10g eller 12g.</string> <string name="ic_different">IC kommer att vara annorlunda om du räknar brödenheter (utbytesenhet) som 10g eller 12g.</string>
<string name="ic_meaning">KH-kvot. Betyder det hur många brödenheter (utbytesenheter) som omfattas av 1U insulin?</string>
<string name="ic_hint1">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#insulin-to-carb-ratio-ic-g-u</string>
<string name="profileswitch_label">Profilbyte</string> <string name="profileswitch_label">Profilbyte</string>
<string name="profileswitch_pctwillchange">När du anger ett profilbyte till 90%, vilka svar är sanna?</string>
<string name="profileswitch_basallower">Basaldoserna kommer att bli 10% lägre.</string> <string name="profileswitch_basallower">Basaldoserna kommer att bli 10% lägre.</string>
<string name="profileswitch_isfhigher">ISF kommer att bli 10% högre.</string> <string name="profileswitch_isfhigher">ISF kommer att bli 10% högre.</string>
<string name="profileswitch_iclower">KH-kvoten kommer att bli 10% lägre.</string> <string name="profileswitch_iclower">KH-kvoten kommer att bli 10% lägre.</string>
<string name="profileswitch_unchanged">ISF och KH-kvoterna kommer att vara oförändrade.</string> <string name="profileswitch_unchanged">ISF och KH-kvoterna kommer att vara oförändrade.</string>
<string name="profileswitch_hint1" formatted="false">https://wiki.aaps.app/en/latest/Usage/Profiles.html#profile-switch</string>
<string name="profileswitch2_label">Profilbyte</string> <string name="profileswitch2_label">Profilbyte</string>
<string name="profileswitch2_pctwillchange">När du anger ett profilbyte till 120%, vilka svar är sanna?</string>
<string name="profileswitch2_bghigher">Blodglukosmålet kommer att bli 20% högre.</string> <string name="profileswitch2_bghigher">Blodglukosmålet kommer att bli 20% högre.</string>
<string name="profileswitch2_basalhigher">Basaldoserna kommer att bli 20% högre.</string> <string name="profileswitch2_basalhigher">Basaldoserna kommer att bli 20% högre.</string>
<string name="profileswitch2_bgunchanged">Blodglukosmålet ändras inte.</string> <string name="profileswitch2_bgunchanged">Blodglukosmålet ändras inte.</string>
<string name="profileswitch2_isfhigher">ISF kommer att bli 20% högre.</string> <string name="profileswitch2_isfhigher">ISF kommer att bli 20% högre.</string>
<string name="profileswitchtime_label">Profilbyte</string> <string name="profileswitchtime_label">Profilbyte</string>
<string name="profileswitchtime_iwant">Om du stiger upp 2 timmar tidigare än vanligt, hur ska du informera AAPS om ändringen?</string>
<string name="profileswitchtime_2">Gör ett profilbyte med en tidsförskjutning av 2</string> <string name="profileswitchtime_2">Gör ett profilbyte med en tidsförskjutning av 2</string>
<string name="profileswitchtime__2">Gör ett profilbyte med en tidsförskjutning av -2</string> <string name="profileswitchtime__2">Gör ett profilbyte med en tidsförskjutning av -2</string>
<string name="profileswitchtime_tt">Ange ett \"Äta snart\" tillfälligt mål.</string>
<string name="profileswitchtime_100">Gör ett profilbyte till mer än 100%.</string>
<string name="profileswitchtime_hint1">https://wiki.aaps.app/en/latest/Usage/Profiles.html#timeshift</string>
<string name="profileswitch4_label">Ändringar av profiler</string> <string name="profileswitch4_label">Ändringar av profiler</string>
<string name="profileswitch4_rates">Basaldoser, ISF, KH-kvoter och dylikt bör anges i profiler.</string> <string name="profileswitch4_rates">Basaldoser, ISF, KH-kvoter och dylikt bör anges i profiler.</string>
<string name="profileswitch4_internet">För att aktivera ändringar i din Nightscout-profil krävs att din AAPS-telefon har Internetanslutning.</string>
<string name="profileswitch4_sufficient">Att redigera profiler för att ändra värden är tillräckligt för att genomföra eventuella ändringar.</string> <string name="profileswitch4_sufficient">Att redigera profiler för att ändra värden är tillräckligt för att genomföra eventuella ändringar.</string>
<string name="profileswitch4_multi">Flera profiler kan ställas in och väljas för att hantera förändrade omständigheter (t.ex. hormonella förändringar, skiftarbete, livsstilsskillnader för vardagar/helg).</string>
<string name="basalhelp_hint1">https://wiki.aaps.app/en/latest/Module/module.html#good-individual-dosage-algorithm-for-your-diabetes-therapy</string>
<string name="basalhelp_label">Hjälp med basaldoser</string> <string name="basalhelp_label">Hjälp med basaldoser</string>
<string name="basalhelp_where">Var kan du få hjälp att ställa in din basal och andra inställningar.</string>
<string name="basalhelp_diabetesteam">Ditt diabetesteam</string> <string name="basalhelp_diabetesteam">Ditt diabetesteam</string>
<string name="basalhelp_google">Google</string> <string name="basalhelp_google">Google</string>
<string name="basalhelp_facebook">Facebook</string> <string name="basalhelp_facebook">Facebook</string>
<string name="other_medication_label">Annan medicin. Läs nedanstående deklaration och markera rutan för att acceptera.</string>
<string name="other_medication_text">AAPS sänker basaldosen eller pausar insulinleveransen för att höja blodglukosvärdet. Mediciner av typen SGLT2-hämmare (glifloziner) kan motverka eller förhindra den väntade glukoshöjningen vilket kan leda till akut insulinbrist och ketoacidos (DKA).
\nVanliga märken som finns på marknaden: Invokana®, Forxiga®, Jardiance®, Steglatro®, Suglat®, Apleway®, Deberza®, Synjardy®, Vokanamet®, Xigduo®.\n\n
Jag lovar härmed att inte ta sådana läkemedel medan jag använder AAPS eller kommer att pausa loopen innan jag tar dessa läkemedel.</string>
</resources> </resources>

View file

@ -7,20 +7,38 @@
<string name="objectivenotfinished">Mål %1$d inte uppnått</string> <string name="objectivenotfinished">Mål %1$d inte uppnått</string>
<string name="objectives_0_objective">Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter</string> <string name="objectives_0_objective">Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter</string>
<string name="objectives_0_gate">Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp</string> <string name="objectives_0_gate">Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp</string>
<string name="objectives_0_learned">Du har utfört grundläggande installation av AAPS-ekosystemet. Nightscout är inte nödvändigt för AAPS att köra, men det är mycket användbart för rapportering och övervakning av andra patienter. Det är inte nödvändigt att vara ansluten till NS hela tiden om du använder NS enbart för dig själv. Du kan ställa in att uppladdning enbart ska ske t. ex. endast på wifi för att spara batteri.</string>
<string name="objectives_openloop_objective">Starta med open loop</string> <string name="objectives_openloop_objective">Starta med open loop</string>
<string name="objectives_openloop_gate">Kör i Open Loop-läge i några dagar och sätt ett antal temp-basaler manuellt. Konfigurera och använd temporära och förinställda temporära mål (t.ex. Träning eller Hypo)</string> <string name="objectives_openloop_gate">Kör i Open Loop-läge i några dagar och sätt ett antal temp-basaler manuellt. Konfigurera och använd temporära och förinställda temporära mål (t.ex. Träning eller Hypo)</string>
<string name="objectives_openloop_learned">Öppen loop kan användas för rekommendationer om du inte har en kompatibel pump eller om du inte är redo att stänga loopen.</string>
<string name="objectives_maxbasal_objective">Förstå din open loop och hur den föreslår temp basaler</string> <string name="objectives_maxbasal_objective">Förstå din open loop och hur den föreslår temp basaler</string>
<string name="objectives_maxbasal_gate">Utifrån vad du nu lärt dig, besluta vilken max basal du vill ha. Ställ in det både i inställningarna i appen och i din pump</string> <string name="objectives_maxbasal_gate">Utifrån vad du nu lärt dig, besluta vilken max basal du vill ha. Ställ in det både i inställningarna i appen och i din pump</string>
<string name="objectives_maxbasal_learned">Var noggrann med säkerhetsfunktioner och justera säkerhetsparametrar vid behov.</string>
<string name="objectives_maxiobzero_objective">Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG</string> <string name="objectives_maxiobzero_objective">Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG</string>
<string name="objectives_maxiobzero_gate">Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger</string> <string name="objectives_maxiobzero_gate">Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger</string>
<string name="objectives_maxiobzero_learned">Att sätta MaxIOB till noll förebygger att du får lågt blodsocker och kommer inte att lägga till mer insulin över basal hastighet (utom situationer där du har negativ IOB)</string>
<string name="objectives_maxiob_objective">Finjustering av closed loop, med gradvis ökande max IOB och minskande målvärde för BG</string> <string name="objectives_maxiob_objective">Finjustering av closed loop, med gradvis ökande max IOB och minskande målvärde för BG</string>
<string name="objectives_maxiob_gate">Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG</string> <string name="objectives_maxiob_gate">Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG</string>
<string name="objectives_maxiob_learned">Uppdatera MaxIOB när ett barn växer. Låt inte systemet ge dig mer insulin än du kan täcka med mat = ett mycket högt värde är en dålig idé.</string>
<string name="objectives_autosens_objective">Justera basaler och kvoter om det behövs. Aktivera sedan autosens</string> <string name="objectives_autosens_objective">Justera basaler och kvoter om det behövs. Aktivera sedan autosens</string>
<string name="objectives_autosens_gate">1 veckas lyckad looping dagtid, där alla måltider lagts in</string> <string name="objectives_autosens_gate">1 veckas lyckad looping dagtid, där alla måltider lagts in</string>
<string name="objectives_autosens_learned">Om ditt autosens-resultat inte pendlar runt 100% är din profil förmodligen fel.</string>
<string name="objectives_smb_objective">Aktiverar ytterligare funktioner för användning dagtid, t ex SMB</string> <string name="objectives_smb_objective">Aktiverar ytterligare funktioner för användning dagtid, t ex SMB</string>
<string name="objectives_smb_gate">Du måste läsa wikin och öka max IOB för att få SMB att fungera bra. En bra start är att sätta max IOB till din genomsnittliga måltidsbolus plus 3 gånger den högsta basalen du har under ett dygn</string>
<string name="objectives_smb_learned">Att använda SMB är ditt mål. Oref1-algoritmen utformades även för att hjälpa dig med dina bolusar. Du bör inte ge full bolus till din mat utan bara en del av det och låt AAPS ge dig resten om det behövs. På så sätt har du mer utrymme för felberäknade kolhydrater. Visste du att du kan ställa in en procentandel av boluskalkylatorns resultat för att minska storleken på bolus?</string>
<string name="objectives_dyn_isf_objective">Aktiverar extra funktioner som kan användas dagtid, såsom insticksprogrammet för dynamisk känslighet</string>
<string name="objectives_dyn_isf_gate">Se till att SMB fungerar korrekt. Aktivera insticksprogrammet DynamicISF och identifiera lämplig kalibrering för just din kropp. Det är lämpligt att börja med ett värde lägre än 100% av säkerhetsskäl.</string>
<string name="objectives_dyn_isf_learned">Insticksprogrammet för dynamisk känslighet bygger på teorin att det totala insulinintaget och nuvarande blodsockernivåer påverkar insulinkänsligheten. Insticksprogrammet DynamicISF kan löpande justera insulinkänslighetsfaktorn (ISF) som används av algoritmen.</string>
<string name="objectives_auto_objective">Aktivera automatisering</string> <string name="objectives_auto_objective">Aktivera automatisering</string>
<string name="objectives_auto_gate">Läs dokumentationen kring hur automatisering fungerar. Konfigurera dina första enkla regler. I stället för att ange en åtgärd, låt AAPS enbart visa en avisering. När du är säker på att automatisering utlöses vid rätt tidpunkt kan du ersätta aviseringen med verklig åtgärd. (https://wiki.aaps.app/en/latest/Usage/Automation.html)</string>
<string name="objectives_auto_learned">Automation kan vara en bra tjänare men en dålig herre. Överanvänd den inte. Försök inte att ersätta underliggande algoritm. Testa regeln först med enbart meddelande innan du sätter igång den på riktigt. Automatiseringarna påverkas av ordningsföljden.</string>
<string name="objectives_bgavailableinns">BG tillgängligt i NS eller Tidepool</string>
<string name="objectives_pumpstatusavailableinns">Pumpstatus tillgängligt i NS eller Tidepool</string>
<string name="objectives_manualenacts">Manuella justeringar</string> <string name="objectives_manualenacts">Manuella justeringar</string>
<string name="accomplished">Utfört: %1$s</string> <string name="accomplished">Utfört: %1$s</string>
<string name="objectives_usage_objective">Lär dig hur du styr AAPS</string>
<string name="objectives_usage_gate">Utför olika åtgärder i AAPS</string>
<string name="objectives_usage_learned">Du har lärt dig hur man hanterar grunderna i AAPS. Huvudkontrollerna finns på översiktsskärmen och nås via klick eller långklick, fler kontroller finns på åtgärdsskärmen. Du bör veta hur man kan placera ett insticksprograms vy i toppmenyn, eller låta den visas i övre vänstra listan över aktiverade insticksprogram.</string>
<string name="objectives_useprofileswitch">Ställ in profilen 90% för 10 minuter (Tryck och håll in profilens namn i Översikten)</string> <string name="objectives_useprofileswitch">Ställ in profilen 90% för 10 minuter (Tryck och håll in profilens namn i Översikten)</string>
<string name="objectives_usedisconnectpump">Simulera dusch. Koppla från pump i 1 timme (Tryck och håll in på Open Loop i Översikten)</string> <string name="objectives_usedisconnectpump">Simulera dusch. Koppla från pump i 1 timme (Tryck och håll in på Open Loop i Översikten)</string>
<string name="objectives_usereconnectpump">... och återanslut på samma sätt</string> <string name="objectives_usereconnectpump">... och återanslut på samma sätt</string>
@ -30,12 +48,41 @@
<string name="objectives_usescale">Testa skala om BG-grafen genom att trycka och hålla in fingret på den</string> <string name="objectives_usescale">Testa skala om BG-grafen genom att trycka och hålla in fingret på den</string>
<string name="objectives_exam_objective">Bevisa dina kunskaper</string> <string name="objectives_exam_objective">Bevisa dina kunskaper</string>
<string name="objectives_exam_gate">Studera frågorna.  Ni får fyra möjliga svar på varje fråga. Det kan finnas mer än ett korrekt svar. Kontrollera alla de som är korrekta och välj Kontrollera.</string> <string name="objectives_exam_gate">Studera frågorna.  Ni får fyra möjliga svar på varje fråga. Det kan finnas mer än ett korrekt svar. Kontrollera alla de som är korrekta och välj Kontrollera.</string>
<string name="objectives_exam_learned_prerequisites">Du behöver inte vara en utvecklare men du behöver NS för att skicka mål och kompatibel pump samt en dator för att bygga AAPS för första gången och för varje uppdatering.</string>
<string name="objectives_exam_learned_prerequisites2">AAPS kan köras offline.</string>
<string name="objectives_exam_learned_basaltest">Profilen bör granskas och uppdateras. Bättre profil = bättre resultat.</string>
<string name="objectives_exam_learned_dia">DIA i looping har olika betydelse: \"den tid det tar tills allt insulin har absorberas av kroppen\" än i klassisk pumpterapi: \"den tid det tar tills merparten av insulinet absorberas\".</string>
<string name="objectives_exam_learned_isf">Du har lärt dig betydelsen av ISF-värde och hur det påverkar mängden insulin som levereras för BG-korrigering.</string>
<string name="objectives_exam_learned_ic">Du har lärt dig betydelsen av KH-kvoten och hur det påverkar mängden insulin som levereras för att täcka upp för intagna kolhydrater.</string>
<string name="objectives_exam_learned_hypott">Tillfälligt mål för lågt blodsocker används endast för att förhindra att AAPS överkorrigera vid lågt blodsocker, när det är vanligt att AAPS bygger upp ett negativt IOB. Ytterligare åtgärder bör utvärderas för att förhindra att denna situation uppstår igen.</string>
<string name="objectives_exam_learned_profileswitch">Användning av procent påverkar inte målvärdet för blodsocker. Men basal, ISF och IC justeras för att ge mer insulin (över 100%%) eller mindre insulin (under 100%%).</string>
<string name="objectives_exam_learned_profileswitchtime">Genom att använda tidsförskjutning när du byter profil kan du anpassa dygnsprofilen till ovanligheter som t. ex. att du vaknat sent.</string>
<string name="objectives_exam_learned_profileswitch4">Redigering av profilen räcker inte för att en ändring ska bli aktiv. Du måste fortfarande genomföra ett profilbyte för att aktivera ändringar.</string>
<string name="objectives_exam_learned_exercise">Du bör minska mängden insulin i kroppen minst en timme före träning genom att välja en profilprocent under 100%.</string>
<string name="objectives_exam_learned_exercise2">Att sätta ett högre tillfälligt BG-målvärde minst 1 timme före träning hjälper också med att minska mängden insulin i kroppen.</string>
<string name="objectives_exam_learned_noisycgm">När du inte kan lita på de värden AAPS får från CGM bör du inte använda loopen utan uppsikt.</string>
<string name="objectives_exam_learned_pumpdisconnect">AAPS måste veta att pumpen inte är ansluten för att kunna räkna IOB korrekt.</string>
<string name="objectives_exam_learned_insulin">Att ange vilket insulin som är i pumpen är nödvändigt eftersom det påverkar IOB-beräkningen.</string>
<string name="objectives_exam_learned_sensitivity">Känslighetsdetektion är en del av algoritmen som gör det möjligt att anpassa insulindoseringen till olika situationer.</string>
<string name="objectives_exam_learned_objectives">Dina framsteg i målen lagras tillsammans med andra inställningar och bör säkerhetskopieras.</string>
<string name="objectives_exam_learned_objectives2">Spara alltid exporterade inställningar och den genererade APK-filen även utanför telefon. Telefonen kan förloras, skadas etc. Ett bra ställe kan vara en molnlagringstjänst som kan nås från telefonen. I detta fall kan du återställa AAPS på en annan enhet på några minuter. Bra praxis är att lagra huvudlösenordet på en säker plats också. Utan det är din backup värdelös. Detsamma gäller för signeringsnycklar (.jks-fil) och lösenord som används för att bygga AAPS. Resten är inte viktigt - det kan när som helst laddas ner från internet igen.</string>
<string name="objectives_exam_learned_wrongcarbs">Om du gjorde en felaktig inmatning till AAPS eller om den inte matchar verkligheten, lös det så fort som möjligt. Det kan leda till överdosering. AAPS bör alltid hållas informerad på bästa möjliga sätt om verkligt intag av kolhydrater, insulinleverans etc.</string>
<string name="objectives_exam_learned_iob">Om du analyserar huruvida AAPS fungerar bra för dig kommer IOB-grafen att ge dig mycket användbar information.</string>
<string name="objectives_exam_learned_cob">COB-beräkningen beror på sambandet mellan ISF och IC. Att öka ISF eller att minska IC kommer att leda till längre absorptionstider. Men att växla profil med procentuella förändringar påverkar båda värdena samtidigt och absorptionstiden påverkas därmed inte.</string>
<string name="objectives_exam_learned_breadgrams">Endast gram är tillåtna för inmatning av kolhydrater.</string>
<string name="objectives_exam_learned_ecarbs">E-carbs är en ersättning för konceptet med förlängd bolus i pumpvärlden.</string>
<string name="objectives_exam_learned_nsclient">Fjärrövervakning och fjärrstyrning är möjligt men alla funktioner behöver inte vara tillgängliga på distans.</string>
<string name="answerdisabledto">Svarsfunktionen inaktiverad till: %1$s</string> <string name="answerdisabledto">Svarsfunktionen inaktiverad till: %1$s</string>
<string name="wronganswer">Fel svar</string> <string name="wronganswer">Fel svar</string>
<string name="unfinshed_button">Nästa icke slutförda</string> <string name="unfinshed_button">Nästa icke slutförda</string>
<string name="requestcode">Begärd kod: %1$s</string> <string name="requestcode">Begärd kod: %1$s</string>
<string name="objectives_hint">(markera ett eller flera alternativ)</string> <string name="objectives_hint">(markera ett eller flera alternativ)</string>
<string name="disconnectpump_hint" formatted="false">https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath</string>
<string name="usetemptarget_hint" formatted="false">https://wiki.aaps.app/en/latest/Getting-Started/Screenshots.html#the-homescreen</string>
<string name="useaction_hint" formatted="false">https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html</string>
<string name="usescale_hint" formatted="false">https://wiki.aaps.app/en/latest/Getting-Started/Screenshots.html#the-homescreen</string>
<string name="notconnected">Inte ansluten till internet</string> <string name="notconnected">Inte ansluten till internet</string>
<string name="failedretrievetime">Fel vid hämtning av tid</string> <string name="failedretrievetime">Fel vid hämtning av tid</string>
<string name="requirementnotmet">Målets krav är inte uppfyllda</string> <string name="requirementnotmet">Målets krav är inte uppfyllda</string>
<string name="what_i_ve_learned">Vad jag har lärt mig:</string>
</resources> </resources>

View file

@ -2,11 +2,27 @@
<resources> <resources>
<!-- PhoneChecker --> <!-- PhoneChecker -->
<!-- DST Helper --> <!-- DST Helper -->
<string name="dst_in_24h_warning">Sommar/vintertid inträffar inom 24 timmar</string>
<string name="dst_loop_disabled_warning">Sommar/vintertid ändrades för mindre än 3 timmar sedan. Closed Loop avstängt</string>
<!-- Storage constraint --> <!-- Storage constraint -->
<string name="disk_full">Frigör minst %1$d MB lagring. Loopen inaktiverad!</string>
<!-- Version Checker --> <!-- Version Checker -->
<string name="old_version">gammal version</string>
<string name="very_old_version">väldigt gammal version</string>
<string name="application_expired">Applikationen inte giltig längre</string>
<string name="new_version_warning">AAPS har inte kunnat söka efter nya versioner de senaste %1$d dagarna! AAPS kommer att aktivera LGS-läge efter %2$d dagar, och loopen kommer att inaktiveras efter %3$d dagar. Återställ Internet-anslutningen!</string>
<string name="running_invalid_version">Du kör en ogiltig version. Loop avstängd!</string>
<string name="versionavailable">Version %1$s tillgänglig</string>
<string name="version_expire">Version %1$s upphör att gälla %2$s</string>
<!-- Signature verifier --> <!-- Signature verifier -->
<!-- BG Quality --> <!-- BG Quality -->
<string name="recalculated_data_used">Omräknad data används</string>
<string name="bg_too_close">BG för nära:\n%1$s\n%2$s</string>
<string name="a11y_bg_quality_recalculated">omräknad</string>
<string name="a11y_bg_quality_doubles">dubbla poster</string>
<string name="a11y_bg_quality_flat">Platt datakurva. Anses vara fel</string>
<!-- Safety --> <!-- Safety -->
<string name="limitingextendedbolus">Begränsar förlängd bolus till %1$.1f U p.g.a. %2$s</string>
<string name="limitingcarbs">Begränsar kolhydrater till %1$d g pga %2$s</string> <string name="limitingcarbs">Begränsar kolhydrater till %1$d g pga %2$s</string>
<string name="pumpisnottempbasalcapable">Pumpen kan inte hantera temp basaler</string> <string name="pumpisnottempbasalcapable">Pumpen kan inte hantera temp basaler</string>
<string name="closedmodedisabledinpreferences">Closed Loop inaktiverat i Inställningar</string> <string name="closedmodedisabledinpreferences">Closed Loop inaktiverat i Inställningar</string>
@ -18,14 +34,20 @@
<string name="hardlimit">hård begränsning</string> <string name="hardlimit">hård begränsning</string>
<string name="treatmentssafety_title">Säkerhetsbegränsningar</string> <string name="treatmentssafety_title">Säkerhetsbegränsningar</string>
<!-- Objectives --> <!-- Objectives -->
<string name="completed_well_done">Slutfört, bra jobbat!</string>
<string name="not_completed_yet">Inte slutfört ännu</string> <string name="not_completed_yet">Inte slutfört ännu</string>
<string name="time_elapsed">Förfluten tid</string> <string name="time_elapsed">Förfluten tid</string>
<string name="maxiobset">Max IOB är korrekt angivet</string> <string name="maxiobset">Max IOB är korrekt angivet</string>
<string name="hasbgdata">BG tillgängligt från vald källa</string> <string name="hasbgdata">BG tillgängligt från vald källa</string>
<string name="synchaswritepermission">Synkroniseringstjänsten har skrivrättigheter</string>
<string name="loopenabled">Loop aktiverad</string> <string name="loopenabled">Loop aktiverad</string>
<string name="apsselected">APS vald</string> <string name="apsselected">APS vald</string>
<string name="closedmodeenabled">Closed loop aktiverad</string> <string name="closedmodeenabled">Closed loop aktiverad</string>
<string name="objectives_shortname">Mål</string> <string name="objectives_shortname">Mål</string>
<string name="description_objectives">Inlärningsprogram</string> <string name="description_objectives">Inlärningsprogram</string>
<string name="doyouwantresetstart">Vill du starta om målet? Du kan förlora de steg du gjort hittills.</string> <string name="doyouwantresetstart">Vill du starta om målet? Du kan förlora de steg du gjort hittills.</string>
<string name="objectives_next_button">Nästa</string>
<string name="objectives_previous_button">Föregående</string>
<string name="objectives_button_unfinish">Nollställ slutfört läge</string>
<string name="objectives_button_unstart">Nollställ startat läge</string>
</resources> </resources>

View file

@ -24,4 +24,6 @@ dependencies {
implementation project(':core:utils') implementation project(':core:utils')
implementation project(':core:validators') implementation project(':core:validators')
implementation project(':database:entities') implementation project(':database:entities')
testImplementation project(':core:main')
} }

View file

@ -11,5 +11,8 @@
<string name="insulin_peak_time">Peaktid [min]</string> <string name="insulin_peak_time">Peaktid [min]</string>
<string name="free_peak_oref">Free-Peak Oref</string> <string name="free_peak_oref">Free-Peak Oref</string>
<string name="rapid_acting_oref">Rapid-Acting Oref</string> <string name="rapid_acting_oref">Rapid-Acting Oref</string>
<string name="ultra_rapid_oref">Ultra-Rapid Oref</string>
<string name="dia_too_short">%1$f tim DIA är för kort. Använder %2$f istället!</string> <string name="dia_too_short">%1$f tim DIA är för kort. Använder %2$f istället!</string>
<string name="fast_acting_insulin_comment">Novorapid, Novolog, Humalog</string>
<string name="ultra_fast_acting_insulin_comment">Fiasp</string>
</resources> </resources>

View file

@ -0,0 +1,83 @@
package info.nightscout.androidaps
import info.nightscout.interfaces.utils.HardLimits
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import javax.inject.Inject
import kotlin.math.max
import kotlin.math.min
class HardLimitsMock @Inject constructor(
private val sp: SP,
private val rh: ResourceHelper
) : HardLimits {
companion object {
private const val CHILD = 0
private const val TEENAGE = 1
private const val ADULT = 2
private const val RESISTANT_ADULT = 3
private const val PREGNANT = 4
private val MAX_BOLUS = doubleArrayOf(5.0, 10.0, 17.0, 25.0, 60.0)
// Very Hard Limits Ranges
// First value is the Lowest and second value is the Highest a Limit can define
val VERY_HARD_LIMIT_MIN_BG = doubleArrayOf(80.0, 180.0)
val VERY_HARD_LIMIT_MAX_BG = doubleArrayOf(90.0, 200.0)
val VERY_HARD_LIMIT_TARGET_BG = doubleArrayOf(80.0, 200.0)
// Very Hard Limits Ranges for Temp Targets
val VERY_HARD_LIMIT_TEMP_MIN_BG = intArrayOf(72, 180)
val VERY_HARD_LIMIT_TEMP_MAX_BG = intArrayOf(72, 270)
val VERY_HARD_LIMIT_TEMP_TARGET_BG = intArrayOf(72, 200)
val MIN_DIA = doubleArrayOf(5.0, 5.0, 5.0, 5.0, 5.0)
val MAX_DIA = doubleArrayOf(9.0, 9.0, 9.0, 9.0, 10.0)
val MIN_IC = doubleArrayOf(2.0, 2.0, 2.0, 2.0, 0.3)
val MAX_IC = doubleArrayOf(100.0, 100.0, 100.0, 100.0, 100.0)
const val MIN_ISF = 2.0 // mgdl
const val MAX_ISF = 1000.0 // mgdl
val MAX_IOB_AMA = doubleArrayOf(3.0, 5.0, 7.0, 12.0, 25.0)
val MAX_IOB_SMB = doubleArrayOf(7.0, 13.0, 22.0, 30.0, 70.0)
val MAX_BASAL = doubleArrayOf(2.0, 5.0, 10.0, 12.0, 25.0)
//LGS Hard limits
//No IOB at all
const val MAX_IOB_LGS = 0.0
}
private fun loadAge(): Int = when (sp.getString(info.nightscout.core.utils.R.string.key_age, "")) {
rh.gs(info.nightscout.core.utils.R.string.key_child) -> CHILD
rh.gs(info.nightscout.core.utils.R.string.key_teenage) -> TEENAGE
rh.gs(info.nightscout.core.utils.R.string.key_adult) -> ADULT
rh.gs(info.nightscout.core.utils.R.string.key_resistantadult) -> RESISTANT_ADULT
rh.gs(info.nightscout.core.utils.R.string.key_pregnant) -> PREGNANT
else -> ADULT
}
override fun maxBolus(): Double = MAX_BOLUS[loadAge()]
override fun maxIobAMA(): Double = MAX_IOB_AMA[loadAge()]
override fun maxIobSMB(): Double = MAX_IOB_SMB[loadAge()]
override fun maxBasal(): Double = MAX_BASAL[loadAge()]
override fun minDia(): Double = MIN_DIA[loadAge()]
override fun maxDia(): Double = MAX_DIA[loadAge()]
override fun minIC(): Double = MIN_IC[loadAge()]
override fun maxIC(): Double = MAX_IC[loadAge()]
// safety checks
override fun checkHardLimits(value: Double, valueName: Int, lowLimit: Double, highLimit: Double): Boolean =
value == verifyHardLimits(value, valueName, lowLimit, highLimit)
override fun isInRange(value: Double, lowLimit: Double, highLimit: Double): Boolean =
value in lowLimit..highLimit
override fun verifyHardLimits(value: Double, valueName: Int, lowLimit: Double, highLimit: Double): Double {
var newValue = value
if (newValue < lowLimit || newValue > highLimit) {
newValue = max(newValue, lowLimit)
newValue = min(newValue, highLimit)
}
return newValue
}
}

View file

@ -0,0 +1,61 @@
package info.nightscout.androidaps
import android.content.Context
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
import info.nightscout.core.extensions.pureProfileFromJson
import info.nightscout.core.profile.ProfileSealed
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.HardLimits
import info.nightscout.rx.bus.RxBus
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil
import org.json.JSONObject
import org.junit.jupiter.api.BeforeEach
import org.mockito.Mock
import org.mockito.Mockito.`when`
@Suppress("SpellCheckingInspection")
open class TestBaseWithProfile : TestBase() {
@Mock lateinit var activePluginProvider: ActivePlugin
@Mock lateinit var rh: ResourceHelper
@Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var defaultValueHelper: DefaultValueHelper
@Mock lateinit var dateUtil: DateUtil
@Mock lateinit var config: Config
@Mock lateinit var sp: SP
@Mock lateinit var context: Context
lateinit var hardLimits: HardLimits
lateinit var testPumpPlugin: TestPumpPlugin
val rxBus = RxBus(aapsSchedulers, aapsLogger)
val profileInjector = HasAndroidInjector { AndroidInjector { } }
private lateinit var invalidProfileJSON: String
private lateinit var validProfileJSON: String
lateinit var validProfile: Profile
lateinit var invalidProfile: Profile
@Suppress("PropertyName") val TESTPROFILENAME = "someProfile"
@BeforeEach
fun prepareMock() {
invalidProfileJSON = "{\"dia\":\"1\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," +
"{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," +
"\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}"
validProfileJSON = "{\"dia\":\"5\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," +
"{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," +
"\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}"
validProfile = ProfileSealed.Pure(pureProfileFromJson(JSONObject(validProfileJSON), dateUtil)!!)
testPumpPlugin = TestPumpPlugin(profileInjector)
`when`(activePluginProvider.activePump).thenReturn(testPumpPlugin)
hardLimits = HardLimitsMock(sp, rh)
}
}

View file

@ -0,0 +1,72 @@
package info.nightscout.androidaps
import dagger.android.HasAndroidInjector
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.pump.DetailedBolusInfo
import info.nightscout.interfaces.pump.Pump
import info.nightscout.interfaces.pump.PumpEnactResult
import info.nightscout.interfaces.pump.PumpSync
import info.nightscout.interfaces.pump.defs.ManufacturerType
import info.nightscout.interfaces.pump.defs.PumpDescription
import info.nightscout.interfaces.pump.defs.PumpType
import info.nightscout.interfaces.utils.TimeChangeType
import org.json.JSONObject
@Suppress("MemberVisibilityCanBePrivate")
class TestPumpPlugin(val injector: HasAndroidInjector) : Pump {
var connected = false
var isProfileSet = true
override fun isConnected() = connected
override fun isConnecting() = false
override fun isHandshakeInProgress() = false
val lastData = 0L
val baseBasal = 0.0
override var pumpDescription = PumpDescription()
override fun isInitialized(): Boolean = true
override fun isSuspended(): Boolean = false
override fun isBusy(): Boolean = false
override fun connect(reason: String) {
connected = true
}
override fun disconnect(reason: String) {
connected = false
}
override fun stopConnecting() {
connected = false
}
override fun waitForDisconnectionInSeconds(): Int = 0
override fun getPumpStatus(reason: String) {}
override fun setNewBasalProfile(profile: Profile): PumpEnactResult = PumpEnactResult(injector)
override fun isThisProfileSet(profile: Profile): Boolean = isProfileSet
override fun lastDataTime(): Long = lastData
override val baseBasalRate: Double = baseBasal
override val reservoirLevel: Double = 0.0
override val batteryLevel: Int = 0
override fun deliverTreatment(detailedBolusInfo: DetailedBolusInfo): PumpEnactResult = PumpEnactResult(injector).success(true)
override fun stopBolusDelivering() {}
override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult =
PumpEnactResult(injector).success(true)
override fun setTempBasalPercent(percent: Int, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult =
PumpEnactResult(injector).success(true)
override fun setExtendedBolus(insulin: Double, durationInMinutes: Int): PumpEnactResult = PumpEnactResult(injector).success(true)
override fun cancelTempBasal(enforceNew: Boolean): PumpEnactResult = PumpEnactResult(injector).success(true)
override fun cancelExtendedBolus(): PumpEnactResult = PumpEnactResult(injector).success(true)
override fun getJSONStatus(profile: Profile, profileName: String, version: String): JSONObject = JSONObject()
override fun manufacturer(): ManufacturerType = ManufacturerType.AAPS
override fun model(): PumpType = PumpType.GENERIC_AAPS
override fun serialNumber(): String = "1"
override fun shortStatus(veryShort: Boolean): String = ""
override val isFakingTempsByExtendedBoluses: Boolean = false
override fun loadTDDs(): PumpEnactResult = PumpEnactResult(injector).success(true)
override fun canHandleDST(): Boolean = true
override fun timezoneOrDSTChanged(timeChangeType: TimeChangeType) {}
}

View file

@ -0,0 +1,50 @@
package info.nightscout.core.extensions
import info.nightscout.androidaps.TestBaseWithProfile
import info.nightscout.database.entities.Bolus
import info.nightscout.insulin.InsulinLyumjevPlugin
import info.nightscout.interfaces.insulin.Insulin
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.shared.utils.T
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mock
import org.mockito.Mockito
class BolusExtensionKtTest : TestBaseWithProfile() {
@Mock lateinit var activePlugin: ActivePlugin
@Mock lateinit var profileFunctions: ProfileFunction
@Mock lateinit var uiInteraction: UiInteraction
private lateinit var insulin: Insulin
private val now = 1000000L
private val dia = 7.0
@BeforeEach
fun setup() {
insulin = InsulinLyumjevPlugin(profileInjector, rh, profileFunctions, rxBus, aapsLogger, config, hardLimits, uiInteraction)
Mockito.`when`(activePlugin.activeInsulin).thenReturn(insulin)
}
@Test
fun iobCalc() {
val bolus = Bolus(timestamp = now - 1, amount = 1.0, type = Bolus.Type.NORMAL)
// there should be almost full IOB after now
Assertions.assertEquals(1.0, bolus.iobCalc(activePlugin, now, dia).iobContrib, 0.01)
// there should be less than 5% after DIA -1
Assertions.assertTrue(0.05 > bolus.iobCalc(activePlugin, now + T.hours(dia.toLong() - 1).msecs(), dia).iobContrib)
// there should be zero after DIA
Assertions.assertEquals(0.0, bolus.iobCalc(activePlugin, now + T.hours(dia.toLong() + 1).msecs(), dia).iobContrib)
// no IOB for invalid record
bolus.isValid = false
Assertions.assertEquals(0.0, bolus.iobCalc(activePlugin, now + T.hours(1).msecs(), dia).iobContrib)
bolus.isValid = true
bolus.type = Bolus.Type.PRIMING
Assertions.assertEquals(0.0, bolus.iobCalc(activePlugin, now + T.hours(1).msecs(), dia).iobContrib)
}
}

View file

@ -0,0 +1,49 @@
package info.nightscout.core.extensions
import info.nightscout.androidaps.TestBaseWithProfile
import info.nightscout.database.entities.ExtendedBolus
import info.nightscout.insulin.InsulinLyumjevPlugin
import info.nightscout.interfaces.insulin.Insulin
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.shared.utils.T
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mock
import org.mockito.Mockito
class ExtendedBolusExtensionKtTest : TestBaseWithProfile() {
@Mock lateinit var activePlugin: ActivePlugin
@Mock lateinit var profileFunctions: ProfileFunction
@Mock lateinit var uiInteraction: UiInteraction
private lateinit var insulin: Insulin
private val now = 1000000L
private val dia = 7.0
@BeforeEach
fun setup() {
insulin = InsulinLyumjevPlugin(profileInjector, rh, profileFunctions, rxBus, aapsLogger, config, hardLimits, uiInteraction)
Mockito.`when`(activePlugin.activeInsulin).thenReturn(insulin)
}
@Test
fun iobCalc() {
val bolus = ExtendedBolus(timestamp = now - 1, amount = 1.0, duration = T.hours(1).msecs())
// there should zero IOB after now
Assertions.assertEquals(0.0, bolus.iobCalc(now, validProfile, insulin).iob, 0.01)
// there should be significant IOB at EB finish
Assertions.assertTrue(0.8 < bolus.iobCalc(now + T.hours(1).msecs(), validProfile, insulin).iob)
// there should be less that 5% after DIA -1
Assertions.assertTrue(0.05 > bolus.iobCalc(now + T.hours(dia.toLong() - 1).msecs(), validProfile, insulin).iob)
// there should be zero after DIA
Assertions.assertEquals(0.0, bolus.iobCalc(now + T.hours(dia.toLong() + 1).msecs(), validProfile, insulin).iob)
// no IOB for invalid record
bolus.isValid = false
Assertions.assertEquals(0.0, bolus.iobCalc(now + T.hours(1).msecs(), validProfile, insulin).iob)
}
}

View file

@ -65,7 +65,7 @@ import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.protection.ProtectionCheck
import info.nightscout.interfaces.pump.defs.PumpType import info.nightscout.interfaces.pump.defs.PumpType
import info.nightscout.interfaces.source.DexcomBoyda import info.nightscout.interfaces.source.DexcomBoyda
import info.nightscout.interfaces.source.XDrip import info.nightscout.interfaces.source.XDripSource
import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.interfaces.utils.JsonHelper
import info.nightscout.interfaces.utils.TrendCalculator import info.nightscout.interfaces.utils.TrendCalculator
@ -128,7 +128,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
@Inject lateinit var activePlugin: ActivePlugin @Inject lateinit var activePlugin: ActivePlugin
@Inject lateinit var iobCobCalculator: IobCobCalculator @Inject lateinit var iobCobCalculator: IobCobCalculator
@Inject lateinit var dexcomBoyda: DexcomBoyda @Inject lateinit var dexcomBoyda: DexcomBoyda
@Inject lateinit var xDrip: XDrip @Inject lateinit var xDripSource: XDripSource
@Inject lateinit var notificationStore: NotificationStore @Inject lateinit var notificationStore: NotificationStore
@Inject lateinit var quickWizard: QuickWizard @Inject lateinit var quickWizard: QuickWizard
@Inject lateinit var config: Config @Inject lateinit var config: Config
@ -400,7 +400,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
} }
R.id.cgm_button -> { R.id.cgm_button -> {
if (xDrip.isEnabled()) if (xDripSource.isEnabled())
openCgmApp("com.eveningoutpost.dexdrip") openCgmApp("com.eveningoutpost.dexdrip")
else if (dexcomBoyda.isEnabled()) { else if (dexcomBoyda.isEnabled()) {
dexcomBoyda.findDexcomPackageName()?.let { dexcomBoyda.findDexcomPackageName()?.let {
@ -411,7 +411,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
} }
R.id.calibration_button -> { R.id.calibration_button -> {
if (xDrip.isEnabled()) { if (xDripSource.isEnabled()) {
uiInteraction.runCalibrationDialog(childFragmentManager) uiInteraction.runCalibrationDialog(childFragmentManager)
} else if (dexcomBoyda.isEnabled()) { } else if (dexcomBoyda.isEnabled()) {
try { try {
@ -577,7 +577,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
&& sp.getBoolean(R.string.key_show_insulin_button, true)).toVisibility() && sp.getBoolean(R.string.key_show_insulin_button, true)).toVisibility()
// **** Calibration & CGM buttons **** // **** Calibration & CGM buttons ****
val xDripIsBgSource = xDrip.isEnabled() val xDripIsBgSource = xDripSource.isEnabled()
val dexcomIsSource = dexcomBoyda.isEnabled() val dexcomIsSource = dexcomBoyda.isEnabled()
binding.buttonsLayout.calibrationButton.visibility = (xDripIsBgSource && actualBG != null && sp.getBoolean(R.string.key_show_calibration_button, true)).toVisibility() binding.buttonsLayout.calibrationButton.visibility = (xDripIsBgSource && actualBG != null && sp.getBoolean(R.string.key_show_calibration_button, true)).toVisibility()
if (dexcomIsSource) { if (dexcomIsSource) {

View file

@ -335,7 +335,7 @@ class ProfileFragment : DaggerFragment() {
?: "" ?: ""
) )
) )
profilePlugin.storeSettings(activity) profilePlugin.storeSettings(activity, dateUtil.now())
build() build()
} }
updateGUI() updateGUI()

View file

@ -168,7 +168,7 @@ class ProfilePlugin @Inject constructor(
} }
@Synchronized @Synchronized
override fun storeSettings(activity: FragmentActivity?, emptyCreated: Boolean) { override fun storeSettings(activity: FragmentActivity?, timestamp: Long) {
for (i in 0 until numOfProfiles) { for (i in 0 until numOfProfiles) {
profiles[i].run { profiles[i].run {
val localProfileNumbered = Constants.LOCAL_PROFILE + "_" + i + "_" val localProfileNumbered = Constants.LOCAL_PROFILE + "_" + i + "_"
@ -184,7 +184,7 @@ class ProfilePlugin @Inject constructor(
} }
sp.putInt(Constants.LOCAL_PROFILE + "_profiles", numOfProfiles) sp.putInt(Constants.LOCAL_PROFILE + "_profiles", numOfProfiles)
sp.putLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, if (emptyCreated) 0 else dateUtil.now()) sp.putLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, timestamp)
createAndStoreConvertedProfile() createAndStoreConvertedProfile()
isEdited = false isEdited = false
aapsLogger.debug(LTag.PROFILE, "Storing settings: " + rawProfile?.data.toString()) aapsLogger.debug(LTag.PROFILE, "Storing settings: " + rawProfile?.data.toString())
@ -249,13 +249,12 @@ class ProfilePlugin @Inject constructor(
) )
} }
} }
if (newProfiles.size > 0) { if (newProfiles.isNotEmpty()) {
profiles = newProfiles profiles = newProfiles
currentProfileIndex = 0 currentProfileIndex = 0
isEdited = false isEdited = false
createAndStoreConvertedProfile()
aapsLogger.debug(LTag.PROFILE, "Accepted ${profiles.size} profiles") aapsLogger.debug(LTag.PROFILE, "Accepted ${profiles.size} profiles")
storeSettings() storeSettings(timestamp = store.getStartDate())
rxBus.send(EventLocalProfileChanged()) rxBus.send(EventLocalProfileChanged())
} else } else
aapsLogger.debug(LTag.PROFILE, "ProfileStore not accepted") aapsLogger.debug(LTag.PROFILE, "ProfileStore not accepted")
@ -354,7 +353,7 @@ class ProfilePlugin @Inject constructor(
) )
currentProfileIndex = profiles.size - 1 currentProfileIndex = profiles.size - 1
createAndStoreConvertedProfile() createAndStoreConvertedProfile()
storeSettings(emptyCreated = true) storeSettings(timestamp = 0)
} }
fun cloneProfile() { fun cloneProfile() {
@ -363,7 +362,7 @@ class ProfilePlugin @Inject constructor(
profiles.add(p) profiles.add(p)
currentProfileIndex = profiles.size - 1 currentProfileIndex = profiles.size - 1
createAndStoreConvertedProfile() createAndStoreConvertedProfile()
storeSettings() storeSettings(timestamp = dateUtil.now())
isEdited = false isEdited = false
} }
@ -371,16 +370,16 @@ class ProfilePlugin @Inject constructor(
profiles.add(p) profiles.add(p)
currentProfileIndex = profiles.size - 1 currentProfileIndex = profiles.size - 1
createAndStoreConvertedProfile() createAndStoreConvertedProfile()
storeSettings() storeSettings(timestamp = dateUtil.now())
isEdited = false isEdited = false
} }
fun removeCurrentProfile() { fun removeCurrentProfile() {
profiles.removeAt(currentProfileIndex) profiles.removeAt(currentProfileIndex)
if (profiles.size == 0) addNewProfile() if (profiles.isEmpty()) addNewProfile()
currentProfileIndex = 0 currentProfileIndex = 0
createAndStoreConvertedProfile() createAndStoreConvertedProfile()
storeSettings() storeSettings(timestamp = dateUtil.now())
isEdited = false isEdited = false
} }

View file

@ -3,6 +3,7 @@
<!-- SMS Communicator & OTP Authenticator --> <!-- SMS Communicator & OTP Authenticator -->
<string name="smscommunicator">Comunicador SMS</string> <string name="smscommunicator">Comunicador SMS</string>
<string name="smscommunicator_shortname">SMS</string> <string name="smscommunicator_shortname">SMS</string>
<string name="description_sms_communicator">Controle remotamente a AndroidAPS usando comandos SMS.</string>
<string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">da app Authenticator para: %1$s seguido pelo PIN</string> <string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">da app Authenticator para: %1$s seguido pelo PIN</string>
<string name="smscommunicator_otp_pin">PIN obrigatório adicional no token final</string> <string name="smscommunicator_otp_pin">PIN obrigatório adicional no token final</string>
<string name="smscommunicator_otp_pin_summary">Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Senha-Única que seja gerada</string> <string name="smscommunicator_otp_pin_summary">Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Senha-Única que seja gerada</string>
@ -18,9 +19,11 @@
<string name="smscommunicator_otp_export_prompt">Tem a certeza de que deseja copiar o segredo da OTP para a área de transferêencia?\n\nSó pode precisar se a app do seu autenticador tiver problemas para digitalizar QRCode, deseja digitá-lo manualmente ou deseja configurar o token OTP de hardware usando app dedicada.</string> <string name="smscommunicator_otp_export_prompt">Tem a certeza de que deseja copiar o segredo da OTP para a área de transferêencia?\n\nSó pode precisar se a app do seu autenticador tiver problemas para digitalizar QRCode, deseja digitá-lo manualmente ou deseja configurar o token OTP de hardware usando app dedicada.</string>
<string name="smscommunicator_otp_export_successful">Segredo da OTP (em formato Base32) exportado e copiado na áreas de transferênca. Cole-o no autenticador ou no hardware OTP burner!</string> <string name="smscommunicator_otp_export_successful">Segredo da OTP (em formato Base32) exportado e copiado na áreas de transferênca. Cole-o no autenticador ou no hardware OTP burner!</string>
<string name="smscommunicator_otp_step1_install_header">1. Instalar Autenticador</string> <string name="smscommunicator_otp_step1_install_header">1. Instalar Autenticador</string>
<string name="smscommunicator_otp_step2_provisioning_header">2. Digitalize o código para configurar os códigos OTP AAPS</string>
<string name="smscommunicator_otp_step3_test_header">3. Testar Uma-Senha-Única (OTP)</string> <string name="smscommunicator_otp_step3_test_header">3. Testar Uma-Senha-Única (OTP)</string>
<string name="smscommunicator_otp_reset_header">Repor Autenticadores</string> <string name="smscommunicator_otp_reset_header">Repor Autenticadores</string>
<string name="smscommunicator_otp_install_info">Instalar uma app Autenticador que suporte Tokens RFC 6238 TOTP em cada telefone seguidor. Populares aplicativos gratuitos são:\n • Authy\n • o Google Authenticator\n • LastPass Autenticador\n • FreeOTP Autenticador</string> <string name="smscommunicator_otp_install_info">Instalar uma app Autenticador que suporte Tokens RFC 6238 TOTP em cada telefone seguidor. Populares aplicativos gratuitos são:\n • Authy\n • o Google Authenticator\n • LastPass Autenticador\n • FreeOTP Autenticador</string>
<string name="smscommunicator_otp_reset_warning">Ao repor o autenticador, torna inválidos todos os autenticadores já inseridos. Precisará de os configurar novamente!</string>
<string name="smscommunicator_otp_verification_ok">OK</string> <string name="smscommunicator_otp_verification_ok">OK</string>
<string name="smscommunicator_otp_verification_ivalid_size">TAMANHO INVÁLIDO!</string> <string name="smscommunicator_otp_verification_ivalid_size">TAMANHO INVÁLIDO!</string>
<string name="smscommunicator_otp_verification_wrong_pin">PIN ERRADO</string> <string name="smscommunicator_otp_verification_wrong_pin">PIN ERRADO</string>
@ -90,6 +93,8 @@
<string name="smscommunicator_report_pump_unreachable_summary">Enviar SMS se evento de bomba inacessível for acionado</string> <string name="smscommunicator_report_pump_unreachable_summary">Enviar SMS se evento de bomba inacessível for acionado</string>
<string name="smscommunicator_pump_unreachable">Reportar bomba inacessível</string> <string name="smscommunicator_pump_unreachable">Reportar bomba inacessível</string>
<string name="smscommunicator_set_lgs_reply_with_code">Para mudar o tipo de Loop para SGB (Baixa Suspensão por Glicose Baixa) responda com o código %1$s</string> <string name="smscommunicator_set_lgs_reply_with_code">Para mudar o tipo de Loop para SGB (Baixa Suspensão por Glicose Baixa) responda com o código %1$s</string>
<string name="smscommunicator_set_closed_loop_reply_with_code">De forma a mudar o Loop para Loop Fechado responda com o código %1$s</string>
<string name="smscommunicator_current_loop_mode">Modo de loop atual: %1$s</string>
<string name="wrong_format">Formato incorrecto</string> <string name="wrong_format">Formato incorrecto</string>
<string name="sms_actual_bg">GLIC:</string> <string name="sms_actual_bg">GLIC:</string>
<string name="sms_last_bg">Ultima GLIC:</string> <string name="sms_last_bg">Ultima GLIC:</string>
@ -102,6 +107,7 @@
<string name="sms_read_status_failed">Erro na leitura de estado</string> <string name="sms_read_status_failed">Erro na leitura de estado</string>
<string name="sms_profile_switch_created">Troca de perfil criada</string> <string name="sms_profile_switch_created">Troca de perfil criada</string>
<string name="sms_wrong_tbr_duration">A duração do DBT deve ser de um múltiplo de %1$d minutos e maior que 0.</string> <string name="sms_wrong_tbr_duration">A duração do DBT deve ser de um múltiplo de %1$d minutos e maior que 0.</string>
<string name="a11y_otp_qr_code">Código QR para configuração da senha única</string>
<string name="disabled_loop">Loop Desactivado</string> <string name="disabled_loop">Loop Desactivado</string>
<!-- Food--> <!-- Food-->
<string name="food_short">Alimentos</string> <string name="food_short">Alimentos</string>
@ -116,10 +122,16 @@
<string name="subcategory">Subcategoria</string> <string name="subcategory">Subcategoria</string>
<string name="calculator_label">Calculadora</string> <string name="calculator_label">Calculadora</string>
<!-- Theme switcher dark and light mode--> <!-- Theme switcher dark and light mode-->
<string name="theme_switcher_summary">Escolha escuro, claro ou deixe para usar o tema do sistema</string>
<string name="app_color_scheme">Esquema de Cores da App</string>
<string name="dark_theme">Tema Escuro</string>
<string name="light_theme">Tema Claro</string>
<string name="follow_system_theme">Usar tema do dispositivo</string>
<!-- Profile --> <!-- Profile -->
<string name="localprofile">Perfil</string> <string name="localprofile">Perfil</string>
<string name="localprofile_shortname">PL</string> <string name="localprofile_shortname">PL</string>
<string name="description_profile_local">Defina um perfil que está disponível offline.</string> <string name="description_profile_local">Defina um perfil que está disponível offline.</string>
<string name="a11y_add_new_to_list">adicionar novo à lista</string>
<string name="do_you_want_switch_profile">Deseja mudar de perfil e descartar as alterações feitas no perfil actual?</string> <string name="do_you_want_switch_profile">Deseja mudar de perfil e descartar as alterações feitas no perfil actual?</string>
<string name="save_or_reset_changes_first">Guardar ou repor as alterações actuais primeiro</string> <string name="save_or_reset_changes_first">Guardar ou repor as alterações actuais primeiro</string>
<string name="delete_current_profile">Eliminar perfil actual?</string> <string name="delete_current_profile">Eliminar perfil actual?</string>
@ -129,10 +141,14 @@
<string name="error_in_basal_values">Erro nos valores da basal</string> <string name="error_in_basal_values">Erro nos valores da basal</string>
<string name="error_in_target_values">Erros no valor alvo</string> <string name="error_in_target_values">Erros no valor alvo</string>
<string name="error_in_isf_values">Erro nos valores do FSI</string> <string name="error_in_isf_values">Erro nos valores do FSI</string>
<string name="profile_name_contains_dot">Alguns dos nomes dos perfis contêm pontos.\nTal não é suportado pelo NS.\nOs perfis não serão enviados para o NS.</string>
<string name="invalid_profile_not_accepted">Perfil inválido %1$s não aceite do NS</string> <string name="invalid_profile_not_accepted">Perfil inválido %1$s não aceite do NS</string>
<string name="view">Ver</string> <string name="view">Ver</string>
<string name="errors">Erros</string> <string name="errors">Erros</string>
<string name="select_profile">Selecione o perfil para editar</string>
<string name="profile_name">Nome do Perfil:</string> <string name="profile_name">Nome do Perfil:</string>
<string name="a11y_add_new_profile">adicionar novo perfil</string>
<string name="a11y_clone_profile">clonar perfil atual</string>
<string name="a11y_delete_current_profile">eliminar perfil actual</string> <string name="a11y_delete_current_profile">eliminar perfil actual</string>
<string name="dia_short">DIA</string> <string name="dia_short">DIA</string>
<string name="target_short">ALV</string> <string name="target_short">ALV</string>
@ -153,8 +169,12 @@
<string name="pb_label">Bateria da Bomba</string> <string name="pb_label">Bateria da Bomba</string>
<string name="cannula">Cânula</string> <string name="cannula">Cânula</string>
<string name="ebstopsloop">O uso do Bólus Prolongado irá parar o modo Loop Fechado durante o tempo do bólus prolongado. Quer realmente isso?</string> <string name="ebstopsloop">O uso do Bólus Prolongado irá parar o modo Loop Fechado durante o tempo do bólus prolongado. Quer realmente isso?</string>
<string name="statuslights_cannula_age">idade do cateter</string>
<string name="statuslights_patch_pump_age">idade do adesivo da bomba</string>
<!-- Overview --> <!-- Overview -->
<string name="show_statuslights">Mostrar luzes de estado no ecrã principal</string> <string name="show_statuslights">Mostrar luzes de estado no ecrã principal</string>
<string name="statuslights_cage_warning">Limite do aviso da idade do cateter [h]</string>
<string name="statuslights_cage_critical">Limite crítico da idade do cateter [h]</string>
<string name="statuslights_iage_warning">Limite aviso idade insulina [h]</string> <string name="statuslights_iage_warning">Limite aviso idade insulina [h]</string>
<string name="statuslights_iage_critical">Limite crítico da idade da insulina [h]</string> <string name="statuslights_iage_critical">Limite crítico da idade da insulina [h]</string>
<string name="statuslights_sage_warning">Limite aviso idade sensor [h]</string> <string name="statuslights_sage_warning">Limite aviso idade sensor [h]</string>
@ -173,6 +193,7 @@
<string name="chart_menu">Menu do Gráfico</string> <string name="chart_menu">Menu do Gráfico</string>
<string name="a11y_bg_quality">qualidade da glicose no sangue</string> <string name="a11y_bg_quality">qualidade da glicose no sangue</string>
<string name="a11y_blood_glucose">Glicose no Sangue</string> <string name="a11y_blood_glucose">Glicose no Sangue</string>
<string name="a11y_bg_outdated">desatualizado</string>
<string name="set_basal_question">Aceitar nova basal temporária:</string> <string name="set_basal_question">Aceitar nova basal temporária:</string>
<string name="overview_cgm">CGM</string> <string name="overview_cgm">CGM</string>
<string name="overview">Visão Geral</string> <string name="overview">Visão Geral</string>
@ -221,6 +242,7 @@
<string name="short_tabtitles">Abreviar títulos dos separadores</string> <string name="short_tabtitles">Abreviar títulos dos separadores</string>
<string name="overview_show_notes_field_in_dialogs_title">Mostrar campo de notas na janela de tratamentos</string> <string name="overview_show_notes_field_in_dialogs_title">Mostrar campo de notas na janela de tratamentos</string>
<string name="deliverpartofboluswizard">Assistente de bólus executa o cálculo, mas apenas esta parte da insulina calculada é administada. Útil com o algoritmo SMB.</string> <string name="deliverpartofboluswizard">Assistente de bólus executa o cálculo, mas apenas esta parte da insulina calculada é administada. Útil com o algoritmo SMB.</string>
<string name="deliver_part_of_boluswizard_reset_time">Entregar bólus completo (100%) se a glicemia for mais velha que</string>
<string name="enable_bolus_advisor">Activar Guia de Bólus</string> <string name="enable_bolus_advisor">Activar Guia de Bólus</string>
<string name="enable_bolus_advisor_summary">Use lembrete para começar a comer mais tarde em vez di resultado do assistente durante a glicemia alta (\"pré-bolus\")</string> <string name="enable_bolus_advisor_summary">Use lembrete para começar a comer mais tarde em vez di resultado do assistente durante a glicemia alta (\"pré-bolus\")</string>
<string name="enablesuperbolus">Activar superbólus no assistente</string> <string name="enablesuperbolus">Activar superbólus no assistente</string>
@ -232,6 +254,7 @@
<!-- OverviewMenu--> <!-- OverviewMenu-->
<string name="overview_show_predictions">Previsões</string> <string name="overview_show_predictions">Previsões</string>
<string name="overview_show_treatments">Tratamentos</string> <string name="overview_show_treatments">Tratamentos</string>
<string name="overview_show_heartRate">Frequência cardíaca</string>
<string name="overview_show_deviation_slope">Desvio de inclinação</string> <string name="overview_show_deviation_slope">Desvio de inclinação</string>
<string name="overview_show_activity">Actividade</string> <string name="overview_show_activity">Actividade</string>
<string name="overview_show_bgi">Impacto Glicose</string> <string name="overview_show_bgi">Impacto Glicose</string>
@ -249,7 +272,9 @@
<string name="abs_insulin_shortname">ABS</string> <string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DESVINCLI</string> <string name="devslope_shortname">DESVINCLI</string>
<string name="treatments_shortname">TRATA</string> <string name="treatments_shortname">TRATA</string>
<string name="heartRate_shortname">FC</string>
<string name="sensitivity_shortname">SENS</string> <string name="sensitivity_shortname">SENS</string>
<string name="graph_scale">Escala do Gráfico</string>
<string name="graph_menu_divider_header">Gráfico</string> <string name="graph_menu_divider_header">Gráfico</string>
<!-- Skins --> <!-- Skins -->
<string name="classic_description">Tema Gráfico Original</string> <string name="classic_description">Tema Gráfico Original</string>
@ -262,8 +287,22 @@
<string name="send_logfiles">Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada.</string> <string name="send_logfiles">Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada.</string>
<!-- Wear--> <!-- Wear-->
<string name="wear_shortname">WEAR</string> <string name="wear_shortname">WEAR</string>
<string name="description_wear">Monitorizar e controlar a AndroidAPS utilizando o seu relógio WearOS.</string>
<string name="no_watch_connected">(Nenhum relógio Conectado)</string>
<string name="pump_status">Estado da Bomba</string>
<string name="loop_status">Estado do loop</string>
<string name="wizard_result">Calc. Assistente:\nInsulina: %1$.2fU\nHidratos: %2$dg</string>
<string name="quick_wizard_not_available">O assistente rápido selecionado não está mais disponível, atualize o ecrã</string>
<string name="quick_wizard_message">Assistente rápido: %1$s\nInsulina: %2$.2fU\nHidratos: %3$dg</string>
<string name="wear_action_tempt_preset_error">Predefinição de alvo temporário desconhecido: %1$s</string>
<string name="wear_action_tempt_cancel_message">Cancelando Alvos Temporários em execução?</string>
<string name="wear_action_tempt_unit_error">Diferentes unidades usadas no relógio e telefone!</string>
<string name="wear_action_tempt_zero_message">Alvo-temporário-Zero - cancelar Alvos -Temporários em progresso?</string>
<string name="wear_action_tempt_min_bg_error">Min-GLIC fora do alvo!</string> <string name="wear_action_tempt_min_bg_error">Min-GLIC fora do alvo!</string>
<string name="wear_action_tempt_max_bg_error">Máx-GLIC fora do alvo!</string> <string name="wear_action_tempt_max_bg_error">Máx-GLIC fora do alvo!</string>
<string name="wear_action_tempt_manual_range_message">AlvoTemporário:\nMin: %1$s\nMax: %2$s\nDuração: %3$s</string>
<string name="wear_action_tempt_manual_message">AlvoTemporário:\nAlvo: %1$s\nDuração: %2$s</string>
<string name="wear_action_tempt_preset_message">AlvoTemporário:\nMotivo %1$s\nAlvo: %2$s\nDuração: %3$s</string>
<string name="no_success">sem efeito - por favor verifique no telemóvel</string> <string name="no_success">sem efeito - por favor verifique no telemóvel</string>
<string name="wear_settings">Definições do Relógio</string> <string name="wear_settings">Definições do Relógio</string>
<string name="wearcontrol_title">Controles do Relógio</string> <string name="wearcontrol_title">Controles do Relógio</string>
@ -275,9 +314,19 @@
<string name="wear_notifysmb_summary">Mostrar SMB no relogio como bolus normal.</string> <string name="wear_notifysmb_summary">Mostrar SMB no relogio como bolus normal.</string>
<string name="wear_predictions_summary">Mostrar previsões no mostrador.</string> <string name="wear_predictions_summary">Mostrar previsões no mostrador.</string>
<string name="wear_predictions_title">Previsões</string> <string name="wear_predictions_title">Previsões</string>
<string name="wear_custom_watchface_settings">Definições da watchface predefinida</string>
<string name="wear_custom_watchface_authorization_title">Autorização da watchface predefinida</string>
<string name="wear_custom_watchface_authorization_summary">Autorizar watchface por definição para alterar e bloquear algumas configurações de exibição do relógio para se adequarem ao design do watchface</string> <string name="wear_custom_watchface_authorization_summary">Autorizar watchface por definição para alterar e bloquear algumas configurações de exibição do relógio para se adequarem ao design do watchface</string>
<string name="wear_custom_watchface">Watchface Predefinida: %1$s</string>
<string name="wear_load_watchface">Carregar Watchface</string>
<string name="wear_infos_watchface">Infos Watchface</string>
<string name="wear_export_watchface">Exportar modelo</string>
<string name="wear_new_custom_watchface_exported">Modelo de Watchface Predefinida exportado</string>
<string name="resend_all_data">Reenviar Todos os Dados</string> <string name="resend_all_data">Reenviar Todos os Dados</string>
<string name="open_settings_on_wear">Abrir Definições no Relógio</string> <string name="open_settings_on_wear">Abrir Definições no Relógio</string>
<string name="cwf_infos_pref_locked">Lista de preferências bloqueadas pela Watchface</string>
<string name="cwf_infos_pref_required">Lista de preferências necessárias para a Watchface</string>
<string name="cwf_infos_view_title">Lista de campos incluídos na Watchface</string>
<!-- PersistentNotification--> <!-- PersistentNotification-->
<string name="description_persistent_notification">Mostra uma notificação em curso com um breve resumo do que o seu loop está a fazer</string> <string name="description_persistent_notification">Mostra uma notificação em curso com um breve resumo do que o seu loop está a fazer</string>
<string name="old_data">DADOS ANTIGOS</string> <string name="old_data">DADOS ANTIGOS</string>

View file

@ -3,6 +3,7 @@
<!-- SMS Communicator & OTP Authenticator --> <!-- SMS Communicator & OTP Authenticator -->
<string name="smscommunicator">SMS-tjänst</string> <string name="smscommunicator">SMS-tjänst</string>
<string name="smscommunicator_shortname">SMS</string> <string name="smscommunicator_shortname">SMS</string>
<string name="description_sms_communicator">Fjärrstyr AAPS med SMS-kommandon.</string>
<string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">från autentiseringsapp för: %1$s följt av PIN-kod</string> <string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">från autentiseringsapp för: %1$s följt av PIN-kod</string>
<string name="smscommunicator_otp_pin">PIN-kod som läggs till på slutet</string> <string name="smscommunicator_otp_pin">PIN-kod som läggs till på slutet</string>
<string name="smscommunicator_otp_pin_summary">Ytterligare siffror som ska memoreras och läggas till i slutet av varje genererat engångslösenord</string> <string name="smscommunicator_otp_pin_summary">Ytterligare siffror som ska memoreras och läggas till i slutet av varje genererat engångslösenord</string>
@ -18,9 +19,15 @@
<string name="smscommunicator_otp_export_prompt">Är du säker på att du vill kopiera OTP-hemligheten till Urklipp?\n\nDu behöver bara göra detta om din autentiseringsapp har problem QR-koder så du vill ange den manuellt eller om du vill konfigurera OTP-token med hjälp av en dedikerad app.</string> <string name="smscommunicator_otp_export_prompt">Är du säker på att du vill kopiera OTP-hemligheten till Urklipp?\n\nDu behöver bara göra detta om din autentiseringsapp har problem QR-koder så du vill ange den manuellt eller om du vill konfigurera OTP-token med hjälp av en dedikerad app.</string>
<string name="smscommunicator_otp_export_successful">OTP-hemligheten exporteras och kopieras till klippbordet i Base32-format. Klistra in den i autentiseringsfunktionen eller OTP-brännaren!</string> <string name="smscommunicator_otp_export_successful">OTP-hemligheten exporteras och kopieras till klippbordet i Base32-format. Klistra in den i autentiseringsfunktionen eller OTP-brännaren!</string>
<string name="smscommunicator_otp_step1_install_header">1. Installera autentiseringsapp</string> <string name="smscommunicator_otp_step1_install_header">1. Installera autentiseringsapp</string>
<string name="smscommunicator_otp_step2_provisioning_header">2. Scanna koden för att ställa in OTP-koder för AAPS</string>
<string name="smscommunicator_otp_step3_test_header">3. Testa engångslösenord</string> <string name="smscommunicator_otp_step3_test_header">3. Testa engångslösenord</string>
<string name="smscommunicator_otp_reset_header">Återställ autentiserare</string> <string name="smscommunicator_otp_reset_header">Återställ autentiserare</string>
<string name="smscommunicator_otp_install_info">På varje följartelefon behöver man installera en autentiseringsapp som stöder RFC 6238 TOTP tokens. Populära gratisappar är:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator</string> <string name="smscommunicator_otp_install_info">På varje följartelefon behöver man installera en autentiseringsapp som stöder RFC 6238 TOTP tokens. Populära gratisappar är:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator</string>
<string name="smscommunicator_otp_reset_warning">Genom att återställa autentiseringsfunktionen kommer alla redan driftsatta autentiserare bli ogiltiga. Du kommer behöva sätta upp dem igen!</string>
<string name="smscommunicator_otp_verification_ok">OK</string>
<string name="smscommunicator_otp_verification_ivalid_size">OGILTIG STORLEK!</string>
<string name="smscommunicator_otp_verification_wrong_pin">FEL PIN</string>
<string name="smscommunicator_otp_verification_wrong_otp">FEL OTP</string>
<string name="sms_wrong_code">Fel kod. Kommandot avbrutet.</string> <string name="sms_wrong_code">Fel kod. Kommandot avbrutet.</string>
<string name="sms_timeout_while_waiting">Föregående pumpkommunikation har inte bekräftats/avslutats i tid</string> <string name="sms_timeout_while_waiting">Föregående pumpkommunikation har inte bekräftats/avslutats i tid</string>
<string name="smscommunicator_allowednumbers">Godkända telefonnummer</string> <string name="smscommunicator_allowednumbers">Godkända telefonnummer</string>
@ -85,6 +92,9 @@
<string name="smscommunicator_message_body">Ogiltigt innehåll i meddelande</string> <string name="smscommunicator_message_body">Ogiltigt innehåll i meddelande</string>
<string name="smscommunicator_report_pump_unreachable_summary">Skicka SMS om pumpen inte kan nås</string> <string name="smscommunicator_report_pump_unreachable_summary">Skicka SMS om pumpen inte kan nås</string>
<string name="smscommunicator_pump_unreachable">Rapportera om pump inte kan nås</string> <string name="smscommunicator_pump_unreachable">Rapportera om pump inte kan nås</string>
<string name="smscommunicator_set_lgs_reply_with_code">För att växla Loop-läge till LGS (Low Glucose Suspend) svara med kod %1$s</string>
<string name="smscommunicator_set_closed_loop_reply_with_code">För att växla Loop-läge till Closed Loop svara med kod %1$s</string>
<string name="smscommunicator_current_loop_mode">Nuvarande loop-läge: %1$s</string>
<string name="wrong_format">Felaktigt format</string> <string name="wrong_format">Felaktigt format</string>
<string name="sms_actual_bg">BG:</string> <string name="sms_actual_bg">BG:</string>
<string name="sms_last_bg">Senaste BG:</string> <string name="sms_last_bg">Senaste BG:</string>
@ -97,6 +107,7 @@
<string name="sms_read_status_failed">Statuskontroll misslyckad</string> <string name="sms_read_status_failed">Statuskontroll misslyckad</string>
<string name="sms_profile_switch_created">Skapade ett profilbyte</string> <string name="sms_profile_switch_created">Skapade ett profilbyte</string>
<string name="sms_wrong_tbr_duration">Durationen måste vara större än 0 och en multipel av %1$d minuter.</string> <string name="sms_wrong_tbr_duration">Durationen måste vara större än 0 och en multipel av %1$d minuter.</string>
<string name="a11y_otp_qr_code">QR-kod för att konfigurera engångslösenord</string>
<string name="disabled_loop">Loop inaktiverad</string> <string name="disabled_loop">Loop inaktiverad</string>
<!-- Food--> <!-- Food-->
<string name="food_short">Matdatabas</string> <string name="food_short">Matdatabas</string>
@ -111,6 +122,11 @@
<string name="subcategory">Underkategori</string> <string name="subcategory">Underkategori</string>
<string name="calculator_label">Kalkylator</string> <string name="calculator_label">Kalkylator</string>
<!-- Theme switcher dark and light mode--> <!-- Theme switcher dark and light mode-->
<string name="theme_switcher_summary">Välj mörkt, ljust eller att följa systemets tema</string>
<string name="app_color_scheme">Appens färgschema</string>
<string name="dark_theme">Mörkt tema</string>
<string name="light_theme">Ljust tema</string>
<string name="follow_system_theme">Använd systemets tema</string>
<!-- Profile --> <!-- Profile -->
<string name="localprofile">Profil</string> <string name="localprofile">Profil</string>
<string name="localprofile_shortname">LP</string> <string name="localprofile_shortname">LP</string>
@ -125,9 +141,11 @@
<string name="error_in_basal_values">Fel i basaldoser</string> <string name="error_in_basal_values">Fel i basaldoser</string>
<string name="error_in_target_values">Fel i målvärden</string> <string name="error_in_target_values">Fel i målvärden</string>
<string name="error_in_isf_values">Fel i korrektionskvoter</string> <string name="error_in_isf_values">Fel i korrektionskvoter</string>
<string name="profile_name_contains_dot">Vissa profilnamn innehåller punkter.\nDetta stöds inte av Nightscout.\nProfilen kommer inte överföras till NS.</string>
<string name="invalid_profile_not_accepted">Ogiltig profil %1$s från NS accepteras inte</string> <string name="invalid_profile_not_accepted">Ogiltig profil %1$s från NS accepteras inte</string>
<string name="view">Visa</string> <string name="view">Visa</string>
<string name="errors">Fel</string> <string name="errors">Fel</string>
<string name="select_profile">Välj profil att ändra</string>
<string name="profile_name">Profilnamn:</string> <string name="profile_name">Profilnamn:</string>
<string name="a11y_add_new_profile">lägg till ny profil</string> <string name="a11y_add_new_profile">lägg till ny profil</string>
<string name="a11y_clone_profile">klona nuvarande profil</string> <string name="a11y_clone_profile">klona nuvarande profil</string>
@ -156,6 +174,8 @@
<string name="patch_pump">Slanglös pump</string> <string name="patch_pump">Slanglös pump</string>
<!-- Overview --> <!-- Overview -->
<string name="show_statuslights">Visa \"statuslampor\" på hemskärmen</string> <string name="show_statuslights">Visa \"statuslampor\" på hemskärmen</string>
<string name="statuslights_cage_warning">Tröskelvärde varning för kanylålder: [h]</string>
<string name="statuslights_cage_critical">Tröskelvärde akut varning för kanylålder: [h]</string>
<string name="statuslights_iage_warning">Insulinålder - varning: [h]</string> <string name="statuslights_iage_warning">Insulinålder - varning: [h]</string>
<string name="statuslights_iage_critical">Insulinålder - akut varning: [h]</string> <string name="statuslights_iage_critical">Insulinålder - akut varning: [h]</string>
<string name="statuslights_sage_warning">Sensorålder - varning: [h]</string> <string name="statuslights_sage_warning">Sensorålder - varning: [h]</string>
@ -192,7 +212,7 @@
<string name="openaps">OpenAPS</string> <string name="openaps">OpenAPS</string>
<string name="uploader">Uppladdare</string> <string name="uploader">Uppladdare</string>
<string name="data_status">BG datastatus</string> <string name="data_status">BG datastatus</string>
<string name="quickwizard_settings">Inställningar för snabbsteg</string> <string name="quickwizard_settings">Inställningar för snabbknappar</string>
<string name="keep_screen_on_title">Håll skärmen igång</string> <string name="keep_screen_on_title">Håll skärmen igång</string>
<string name="keep_screen_on_summary">Förhindrar att skärmen stängs av. Förbrukar mer batteri.</string> <string name="keep_screen_on_summary">Förhindrar att skärmen stängs av. Förbrukar mer batteri.</string>
<string name="treatments">Behandlingar</string> <string name="treatments">Behandlingar</string>
@ -223,6 +243,7 @@
<string name="short_tabtitles">Förkorta namnen på flikarna</string> <string name="short_tabtitles">Förkorta namnen på flikarna</string>
<string name="overview_show_notes_field_in_dialogs_title">Anteckning i behandlingsdialoger</string> <string name="overview_show_notes_field_in_dialogs_title">Anteckning i behandlingsdialoger</string>
<string name="deliverpartofboluswizard">Bolusguiden utför beräkningar, men endast denna del av beräknat insulin levereras. Användbar med SMB-algoritm.</string> <string name="deliverpartofboluswizard">Bolusguiden utför beräkningar, men endast denna del av beräknat insulin levereras. Användbar med SMB-algoritm.</string>
<string name="deliver_part_of_boluswizard_reset_time">Leverera full bolus (100%) om BG-värde är äldre än</string>
<string name="enable_bolus_advisor">Aktivera bolusguiden</string> <string name="enable_bolus_advisor">Aktivera bolusguiden</string>
<string name="enable_bolus_advisor_summary">Få en påminnelse om att börja äta senare (istället för kalkylatorns resultat) om du ligger högt i BG</string> <string name="enable_bolus_advisor_summary">Få en påminnelse om att börja äta senare (istället för kalkylatorns resultat) om du ligger högt i BG</string>
<string name="enablesuperbolus">Aktivera superbolus i kalkylatorn</string> <string name="enablesuperbolus">Aktivera superbolus i kalkylatorn</string>
@ -234,6 +255,7 @@
<!-- OverviewMenu--> <!-- OverviewMenu-->
<string name="overview_show_predictions">BG-prognos</string> <string name="overview_show_predictions">BG-prognos</string>
<string name="overview_show_treatments">Behandlingar</string> <string name="overview_show_treatments">Behandlingar</string>
<string name="overview_show_heartRate">Hjärtfrekvens</string>
<string name="overview_show_deviation_slope">Avvikelsekurva</string> <string name="overview_show_deviation_slope">Avvikelsekurva</string>
<string name="overview_show_activity">Insulinaktivitet (5m)</string> <string name="overview_show_activity">Insulinaktivitet (5m)</string>
<string name="overview_show_bgi">Blodglukospåverkan</string> <string name="overview_show_bgi">Blodglukospåverkan</string>
@ -251,7 +273,9 @@
<string name="abs_insulin_shortname">Abs</string> <string name="abs_insulin_shortname">Abs</string>
<string name="devslope_shortname">Devslope</string> <string name="devslope_shortname">Devslope</string>
<string name="treatments_shortname">Beh</string> <string name="treatments_shortname">Beh</string>
<string name="heartRate_shortname">HF</string>
<string name="sensitivity_shortname">SENS</string> <string name="sensitivity_shortname">SENS</string>
<string name="graph_scale">Graf-skala</string>
<string name="graph_menu_divider_header">Graf</string> <string name="graph_menu_divider_header">Graf</string>
<!-- Skins --> <!-- Skins -->
<string name="classic_description">Ursprungligt tema</string> <string name="classic_description">Ursprungligt tema</string>
@ -259,12 +283,17 @@
<string name="buttonson_description">Knappar visas alltid längst ned på skärmen</string> <string name="buttonson_description">Knappar visas alltid längst ned på skärmen</string>
<string name="largedisplay_description">Stor skärm</string> <string name="largedisplay_description">Stor skärm</string>
<string name="skin">Tema</string> <string name="skin">Tema</string>
<string name="cannula_usage">användning:</string>
<!-- Iob--> <!-- Iob-->
<string name="send_logfiles">Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation.</string> <string name="send_logfiles">Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation.</string>
<!-- Wear--> <!-- Wear-->
<string name="wear_shortname">Wear</string> <string name="wear_shortname">Wear</string>
<string name="description_wear">Följ och kontrollera AAPS med din Wear OS-klocka.</string>
<string name="no_watch_connected">(Ingen klocka ansluten)</string>
<string name="pump_status">Pumpstatus</string>
<string name="loop_status">Loop-status</string>
<string name="wizard_result">Kalkylator:\nInsulin: %1$.2fU\nKolhydrater: %2$dg</string> <string name="wizard_result">Kalkylator:\nInsulin: %1$.2fU\nKolhydrater: %2$dg</string>
<string name="quick_wizard_not_available">Vald kalkylator inte längre tillgänglig. Vänligen uppdatera din bricka</string> <string name="quick_wizard_not_available">Vald snabbknapp inte längre tillgänglig. Vänligen uppdatera vyn</string>
<string name="quick_wizard_message">Snabbsteg: %1$s\nInsulin: %2$.2fU\nKolhydrater: %3$dg</string> <string name="quick_wizard_message">Snabbsteg: %1$s\nInsulin: %2$.2fU\nKolhydrater: %3$dg</string>
<string name="wear_action_tempt_preset_error">Tempmål okänd förinställning: %1$s</string> <string name="wear_action_tempt_preset_error">Tempmål okänd förinställning: %1$s</string>
<string name="wear_action_tempt_cancel_message">Avbryt temp-mål?</string> <string name="wear_action_tempt_cancel_message">Avbryt temp-mål?</string>
@ -274,6 +303,7 @@
<string name="wear_action_tempt_max_bg_error">Ogiltigt maximum BG!</string> <string name="wear_action_tempt_max_bg_error">Ogiltigt maximum BG!</string>
<string name="wear_action_tempt_manual_range_message">Temp-mål:\nMin: %1$s\nMax: %2$s\nVaraktighet: %3$s</string> <string name="wear_action_tempt_manual_range_message">Temp-mål:\nMin: %1$s\nMax: %2$s\nVaraktighet: %3$s</string>
<string name="wear_action_tempt_manual_message">Temp-mål:\nMål: %1$s\nDuration: %2$s</string> <string name="wear_action_tempt_manual_message">Temp-mål:\nMål: %1$s\nDuration: %2$s</string>
<string name="wear_action_tempt_preset_message">Tillfälligt mål:\nOrsak: %1$s\nMål: %2$s\nVaraktighet: %3$s</string>
<string name="no_success">misslyckat - kontrollera telefonen</string> <string name="no_success">misslyckat - kontrollera telefonen</string>
<string name="wear_settings">Inställningar för klocka (Wear)</string> <string name="wear_settings">Inställningar för klocka (Wear)</string>
<string name="wearcontrol_title">Kontrollera från klockan</string> <string name="wearcontrol_title">Kontrollera från klockan</string>
@ -285,9 +315,46 @@
<string name="wear_notifysmb_summary">Visa SMB på klockan som en standardbolus.</string> <string name="wear_notifysmb_summary">Visa SMB på klockan som en standardbolus.</string>
<string name="wear_predictions_summary">Visa BG-prognos på klockan.</string> <string name="wear_predictions_summary">Visa BG-prognos på klockan.</string>
<string name="wear_predictions_title">BG-prognos</string> <string name="wear_predictions_title">BG-prognos</string>
<string name="wear_custom_watchface_settings">Anpassade inställningar för urtavla</string>
<string name="wear_custom_watchface_authorization_title">Anpassad auktorisering för urtavla</string>
<string name="wear_custom_watchface_authorization_summary">Auktorisera inlästa anpassade urtavlor för att ändra och låsa vissa visningsinställningar för att passa design av urtavlan</string>
<string name="wear_custom_watchface">Anpassad urtavla: %1$s</string>
<string name="wear_load_watchface">Ladda urtavla</string>
<string name="wear_infos_watchface">Info urtavla</string>
<string name="wear_export_watchface">Exportera mall</string>
<string name="wear_new_custom_watchface_exported">Anpassad mall exporterad</string>
<string name="resend_all_data">Uppdatera klockans data</string> <string name="resend_all_data">Uppdatera klockans data</string>
<string name="open_settings_on_wear">Öppna inställningar på klockan</string> <string name="open_settings_on_wear">Öppna inställningar på klockan</string>
<string name="cwf_infos_pref_locked">Inställningar som är låsta av urtavlan</string>
<string name="cwf_infos_pref_required">Inställningar som krävs av urtavlan</string>
<string name="cwf_infos_view_title">Fält som ingår i urtavlan</string>
<!-- PersistentNotification--> <!-- PersistentNotification-->
<string name="description_persistent_notification">Visar en konstant avisering med en kort sammanfattning av vad din loop gör</string> <string name="description_persistent_notification">Visar en konstant avisering med en kort sammanfattning av vad din loop gör</string>
<string name="old_data">Aktuellt BG saknas!</string> <string name="old_data">Aktuellt BG saknas!</string>
<string name="pump_fetching_data">försöker hämta data från pump.</string>
<string name="pump_old_data">TDD: Fortfarande gamla data! Kan inte hämta från pump.</string>
<string name="grams_short">g</string>
<string name="hour_short">h</string>
<string name="no_active_profile">Ingen aktiv profil!</string>
<string name="profile_message">Profil:\n\nTidsförskjutning: %1$d\nProcent: %2$d%%\"</string>
<string name="tdd_line">%1$.2fU %1$.0f%%</string>
<string name="no_profile">Ingen profil inläst</string>
<string name="aps_only">Använd endast i APS-läge!</string>
<string name="last_aps_result_na">Senaste resultat ej tillgängligt!</string>
<string name="loop_status_closed">CLOSED LOOP</string>
<string name="loop_status_open">OPEN LOOP</string>
<string name="loop_status_disabled">LOOP INAKTIVERAD</string>
<string name="aps">APS</string>
<string name="last_run">Kördes senast</string>
<string name="last_enact">Senaste handling</string>
<string name="today">Idag</string>
<string name="weighted">viktad</string>
<string name="target_only_aps_mode">Målen gäller endast i APS-läge!</string>
<string name="no_history">Inget historiskt data!</string>
<string name="units_short">U</string>
<string name="temp_target">Tillfälligt målvärde</string>
<string name="until">tills</string>
<string name="default_range">STANDARDINTERVALL</string>
<string name="target">målvärde</string>
<string name="rate_duration">Dos: %1$.2fU/h (%2$.2f%%) \nVaraktighet %3$d min</string>
</resources> </resources>

View file

@ -1,2 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string name="smoothing_shortname">UTJÄMNING</string>
<string name="exponential_smoothing_name">Exponentiell utjämning</string>
<string name="description_exponential_smoothing">"Andra ordningens exponentiella utjämningsalgoritm"</string>
<string name="avg_smoothing_name">Genomsnittlig utjämning</string>
<string name="description_avg_smoothing">"Genomsnittlig utjämningsalgoritm, det nyaste värdet påverkas inte"</string>
<string name="no_smoothing_name">Ingen utjämning</string>
<string name="description_no_smoothing">"Ingen utjämning utförs på inmatade glukosdata. Använd detta när du redan har filtrerat data, t.ex. från BYODA G6."</string>
</resources>

View file

@ -35,17 +35,13 @@ class AidexPlugin @Inject constructor(
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48)) .pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48))
.preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.aidex) .pluginName(R.string.aidex)
.shortName(R.string.aidex_short) .shortName(R.string.aidex_short)
.description(R.string.description_source_aidex), .description(R.string.description_source_aidex),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource { ), BgSource {
/**
* Aidex App doesn't have upload to NS
*/
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = true
// Allow only for pumpcontrol or dev & engineering_mode // Allow only for pumpcontrol or dev & engineering_mode
override fun specialEnableCondition(): Boolean { override fun specialEnableCondition(): Boolean {
return config.APS.not() || config.isDev() && config.isEngineeringMode() return config.APS.not() || config.isDev() && config.isEngineeringMode()

View file

@ -45,7 +45,6 @@ class DexcomPlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger,
private val sp: SP,
private val context: Context, private val context: Context,
config: Config config: Config
) : PluginBase( ) : PluginBase(
@ -53,9 +52,9 @@ class DexcomPlugin @Inject constructor(
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_dexcom_g6) .pluginIcon(info.nightscout.core.main.R.drawable.ic_dexcom_g6)
.preferencesId(R.xml.pref_dexcom)
.pluginName(R.string.dexcom_app_patched) .pluginName(R.string.dexcom_app_patched)
.shortName(R.string.dexcom_short) .shortName(R.string.dexcom_short)
.preferencesId(R.xml.pref_dexcom)
.description(R.string.description_source_dexcom), .description(R.string.description_source_dexcom),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource, DexcomBoyda { ), BgSource, DexcomBoyda {
@ -68,12 +67,6 @@ class DexcomPlugin @Inject constructor(
override fun advancedFilteringSupported(): Boolean = true override fun advancedFilteringSupported(): Boolean = true
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
(glucoseValue.sourceSensor == GlucoseValue.SourceSensor.DEXCOM_G6_NATIVE ||
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.DEXCOM_G5_NATIVE ||
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.DEXCOM_NATIVE_UNKNOWN)
&& sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
requestPermissionIfNeeded() requestPermissionIfNeeded()

View file

@ -19,7 +19,6 @@ import info.nightscout.interfaces.source.BgSource
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil import info.nightscout.shared.utils.DateUtil
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import java.util.Arrays import java.util.Arrays
@ -30,25 +29,21 @@ import javax.inject.Singleton
class EversensePlugin @Inject constructor( class EversensePlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger
private val sp: SP
) : PluginBase( ) : PluginBase(
PluginDescription() PluginDescription()
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_eversense) .pluginIcon(info.nightscout.core.main.R.drawable.ic_eversense)
.preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.eversense) .pluginName(R.string.eversense)
.shortName(R.string.eversense_shortname) .shortName(R.string.eversense_shortname)
.preferencesId(R.xml.pref_bgsource)
.description(R.string.description_source_eversense), .description(R.string.description_source_eversense),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource { ), BgSource {
override var sensorBatteryLevel = -1 override var sensorBatteryLevel = -1
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.EVERSENSE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
// cannot be inner class because of needed injection // cannot be inner class because of needed injection
class EversenseWorker( class EversenseWorker(
context: Context, context: Context,
@ -126,14 +121,16 @@ class EversensePlugin @Inject constructor(
aapsLogger.debug(LTag.BGSOURCE, "calibrationTimestamps" + Arrays.toString(calibrationTimestamps)) aapsLogger.debug(LTag.BGSOURCE, "calibrationTimestamps" + Arrays.toString(calibrationTimestamps))
aapsLogger.debug(LTag.BGSOURCE, "calibrationRecordNumbers" + Arrays.toString(calibrationRecordNumbers)) aapsLogger.debug(LTag.BGSOURCE, "calibrationRecordNumbers" + Arrays.toString(calibrationRecordNumbers))
for (i in calibrationGlucoseLevels.indices) { for (i in calibrationGlucoseLevels.indices) {
repository.runTransactionForResult(InsertIfNewByTimestampTherapyEventTransaction( repository.runTransactionForResult(
InsertIfNewByTimestampTherapyEventTransaction(
timestamp = calibrationTimestamps[i], timestamp = calibrationTimestamps[i],
type = TherapyEvent.Type.FINGER_STICK_BG_VALUE, type = TherapyEvent.Type.FINGER_STICK_BG_VALUE,
glucose = calibrationGlucoseLevels[i].toDouble(), glucose = calibrationGlucoseLevels[i].toDouble(),
glucoseType = TherapyEvent.MeterType.FINGER, glucoseType = TherapyEvent.MeterType.FINGER,
glucoseUnit = TherapyEvent.GlucoseUnit.MGDL, glucoseUnit = TherapyEvent.GlucoseUnit.MGDL,
enteredBy = "AndroidAPS-Eversense" enteredBy = "AndroidAPS-Eversense"
)) )
)
.doOnError { .doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
ret = Result.failure(workDataOf("Error" to it.toString())) ret = Result.failure(workDataOf("Error" to it.toString()))

View file

@ -17,7 +17,6 @@ import info.nightscout.interfaces.source.BgSource
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -27,15 +26,14 @@ import javax.inject.Singleton
class GlimpPlugin @Inject constructor( class GlimpPlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger
private val sp: SP
) : PluginBase( ) : PluginBase(
PluginDescription() PluginDescription()
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_glimp) .pluginIcon(info.nightscout.core.main.R.drawable.ic_glimp)
.pluginName(R.string.glimp)
.preferencesId(R.xml.pref_bgsource) .preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.glimp)
.description(R.string.description_source_glimp), .description(R.string.description_source_glimp),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource { ), BgSource {
@ -78,8 +76,4 @@ class GlimpPlugin @Inject constructor(
return ret return ret
} }
} }
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.LIBRE_1_GLIMP && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
} }

View file

@ -45,8 +45,8 @@ class GlunovoPlugin @Inject constructor(
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_glunovo) .pluginIcon(info.nightscout.core.main.R.drawable.ic_glunovo)
.pluginName(R.string.glunovo)
.preferencesId(R.xml.pref_bgsource) .preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.glunovo)
.shortName(R.string.glunovo) .shortName(R.string.glunovo)
.description(R.string.description_source_glunovo), .description(R.string.description_source_glunovo),
aapsLogger, resourceHelper, injector aapsLogger, resourceHelper, injector
@ -167,9 +167,6 @@ class GlunovoPlugin @Inject constructor(
} }
} }
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.GLUNOVO_NATIVE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
companion object { companion object {
const val AUTHORITY = "alexpr.co.uk.infinivocgm.cgm_db.CgmExternalProvider/" const val AUTHORITY = "alexpr.co.uk.infinivocgm.cgm_db.CgmExternalProvider/"

View file

@ -48,8 +48,8 @@ class IntelligoPlugin @Inject constructor(
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.ui.R.drawable.ic_intelligo) .pluginIcon(info.nightscout.core.ui.R.drawable.ic_intelligo)
.pluginName(R.string.intelligo)
.preferencesId(R.xml.pref_bgsource) .preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.intelligo)
.shortName(R.string.intelligo) .shortName(R.string.intelligo)
.description(R.string.description_source_intelligo), .description(R.string.description_source_intelligo),
aapsLogger, resourceHelper, injector aapsLogger, resourceHelper, injector
@ -175,14 +175,9 @@ class IntelligoPlugin @Inject constructor(
} }
} }
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.INTELLIGO_NATIVE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
companion object { companion object {
const val AUTHORITY = "alexpr.co.uk.infinivocgm.intelligo.cgm_db.CgmExternalProvider" const val AUTHORITY = "alexpr.co.uk.infinivocgm.intelligo.cgm_db.CgmExternalProvider"
//const val AUTHORITY = "alexpr.co.uk.infinivocgm.cgm_db.CgmExternalProvider/"
const val TABLE_NAME = "CgmReading" const val TABLE_NAME = "CgmReading"
const val INTERVAL = 180000L // 3 min const val INTERVAL = 180000L // 3 min
} }

View file

@ -16,7 +16,6 @@ import info.nightscout.interfaces.source.BgSource
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil import info.nightscout.shared.utils.DateUtil
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import org.json.JSONArray import org.json.JSONArray
@ -28,12 +27,12 @@ import javax.inject.Singleton
class MM640gPlugin @Inject constructor( class MM640gPlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger
private val sp: SP
) : PluginBase( ) : PluginBase(
PluginDescription() PluginDescription()
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.preferencesId(R.xml.pref_bgsource)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_generic_cgm) .pluginIcon(info.nightscout.core.main.R.drawable.ic_generic_cgm)
.pluginName(R.string.mm640g) .pluginName(R.string.mm640g)
.description(R.string.description_source_mm640g), .description(R.string.description_source_mm640g),
@ -75,6 +74,7 @@ class MM640gPlugin @Inject constructor(
trendArrow = GlucoseValue.TrendArrow.fromString(jsonObject.getString("direction")), trendArrow = GlucoseValue.TrendArrow.fromString(jsonObject.getString("direction")),
sourceSensor = GlucoseValue.SourceSensor.MM_600_SERIES sourceSensor = GlucoseValue.SourceSensor.MM_600_SERIES
) )
else -> aapsLogger.debug(LTag.BGSOURCE, "Unknown entries type: $type") else -> aapsLogger.debug(LTag.BGSOURCE, "Unknown entries type: $type")
} }
} }
@ -98,8 +98,4 @@ class MM640gPlugin @Inject constructor(
return ret return ret
} }
} }
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.MM_600_SERIES && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
} }

View file

@ -7,7 +7,6 @@ import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.plugin.PluginDescription import info.nightscout.interfaces.plugin.PluginDescription
import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.plugin.PluginType
import info.nightscout.interfaces.source.BgSource import info.nightscout.interfaces.source.BgSource
import info.nightscout.interfaces.source.DoingOwnUploadSource
import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.source.NSClientSource
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
@ -31,15 +30,13 @@ class NSClientSourcePlugin @Inject constructor(
.alwaysEnabled(config.NSCLIENT) .alwaysEnabled(config.NSCLIENT)
.setDefault(config.NSCLIENT), .setDefault(config.NSCLIENT),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource, NSClientSource, DoingOwnUploadSource { ), BgSource, NSClientSource {
private var lastBGTimeStamp: Long = 0 private var lastBGTimeStamp: Long = 0
private var isAdvancedFilteringEnabled = false private var isAdvancedFilteringEnabled = false
override fun advancedFilteringSupported(): Boolean = isAdvancedFilteringEnabled override fun advancedFilteringSupported(): Boolean = isAdvancedFilteringEnabled
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = false
override fun detectSource(glucoseValue: GlucoseValue) { override fun detectSource(glucoseValue: GlucoseValue) {
if (glucoseValue.timestamp > lastBGTimeStamp) { if (glucoseValue.timestamp > lastBGTimeStamp) {
isAdvancedFilteringEnabled = arrayOf( isAdvancedFilteringEnabled = arrayOf(

View file

@ -18,7 +18,6 @@ import info.nightscout.interfaces.utils.JsonHelper.safeGetString
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONException import org.json.JSONException
@ -29,15 +28,14 @@ import javax.inject.Singleton
class PoctechPlugin @Inject constructor( class PoctechPlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger
private val sp: SP
) : PluginBase( ) : PluginBase(
PluginDescription() PluginDescription()
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_poctech) .pluginIcon(info.nightscout.core.main.R.drawable.ic_poctech)
.pluginName(R.string.poctech)
.preferencesId(R.xml.pref_bgsource) .preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.poctech)
.description(R.string.description_source_poctech), .description(R.string.description_source_poctech),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource { ), BgSource {
@ -91,8 +89,4 @@ class PoctechPlugin @Inject constructor(
return ret return ret
} }
} }
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.POCTECH_NATIVE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
} }

View file

@ -18,7 +18,6 @@ import info.nightscout.interfaces.source.BgSource
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.T import info.nightscout.shared.utils.T
import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.plusAssign
@ -35,7 +34,6 @@ class RandomBgPlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger,
private val sp: SP,
private val repository: AppRepository, private val repository: AppRepository,
private val virtualPump: VirtualPump, private val virtualPump: VirtualPump,
private val config: Config private val config: Config
@ -44,9 +42,9 @@ class RandomBgPlugin @Inject constructor(
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(R.drawable.ic_dice) .pluginIcon(R.drawable.ic_dice)
.preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.random_bg) .pluginName(R.string.random_bg)
.shortName(R.string.random_bg_short) .shortName(R.string.random_bg_short)
.preferencesId(R.xml.pref_bgsource)
.description(R.string.description_source_random_bg), .description(R.string.description_source_random_bg),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource { ), BgSource {
@ -73,9 +71,6 @@ class RandomBgPlugin @Inject constructor(
override fun advancedFilteringSupported(): Boolean = true override fun advancedFilteringSupported(): Boolean = true
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.RANDOM && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
val cal = GregorianCalendar() val cal = GregorianCalendar()
@ -116,9 +111,7 @@ class RandomBgPlugin @Inject constructor(
) )
disposable += repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null)) disposable += repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
.subscribe({ savedValues -> .subscribe({ savedValues ->
savedValues.inserted.forEach { savedValues.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted bg $it") }
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
}
}, { aapsLogger.error(LTag.DATABASE, "Error while saving values from Random plugin", it) } }, { aapsLogger.error(LTag.DATABASE, "Error while saving values from Random plugin", it) }
) )
} }

View file

@ -25,15 +25,14 @@ import javax.inject.Singleton
class TomatoPlugin @Inject constructor( class TomatoPlugin @Inject constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
rh: ResourceHelper, rh: ResourceHelper,
aapsLogger: AAPSLogger, aapsLogger: AAPSLogger
private val sp: SP
) : PluginBase( ) : PluginBase(
PluginDescription() PluginDescription()
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(info.nightscout.core.main.R.drawable.ic_sensor) .pluginIcon(info.nightscout.core.main.R.drawable.ic_sensor)
.pluginName(R.string.tomato)
.preferencesId(R.xml.pref_bgsource) .preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.tomato)
.shortName(R.string.tomato_short) .shortName(R.string.tomato_short)
.description(R.string.description_source_tomato), .description(R.string.description_source_tomato),
aapsLogger, rh, injector aapsLogger, rh, injector
@ -78,8 +77,4 @@ class TomatoPlugin @Inject constructor(
return ret return ret
} }
} }
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean =
glucoseValue.sourceSensor == GlucoseValue.SourceSensor.LIBRE_1_TOMATO && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false)
} }

View file

@ -15,8 +15,7 @@ import info.nightscout.interfaces.plugin.PluginDescription
import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.plugin.PluginType
import info.nightscout.interfaces.receivers.Intents import info.nightscout.interfaces.receivers.Intents
import info.nightscout.interfaces.source.BgSource import info.nightscout.interfaces.source.BgSource
import info.nightscout.interfaces.source.DoingOwnUploadSource import info.nightscout.interfaces.source.XDripSource
import info.nightscout.interfaces.source.XDrip
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
@ -34,16 +33,15 @@ class XdripSourcePlugin @Inject constructor(
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48)) .pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48))
.preferencesId(R.xml.pref_bgsource)
.pluginName(R.string.source_xdrip) .pluginName(R.string.source_xdrip)
.description(R.string.description_source_xdrip), .description(R.string.description_source_xdrip),
aapsLogger, rh, injector aapsLogger, rh, injector
), BgSource, DoingOwnUploadSource, XDrip { ), BgSource, XDripSource {
private var advancedFiltering = false private var advancedFiltering = false
override var sensorBatteryLevel = -1 override var sensorBatteryLevel = -1
override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = false
override fun advancedFilteringSupported(): Boolean = advancedFiltering override fun advancedFilteringSupported(): Boolean = advancedFiltering
private fun detectSource(glucoseValue: GlucoseValue) { private fun detectSource(glucoseValue: GlucoseValue) {
@ -82,8 +80,10 @@ class XdripSourcePlugin @Inject constructor(
raw = bundle.getDouble(Intents.EXTRA_RAW, 0.0), raw = bundle.getDouble(Intents.EXTRA_RAW, 0.0),
noise = null, noise = null,
trendArrow = GlucoseValue.TrendArrow.fromString(bundle.getString(Intents.EXTRA_BG_SLOPE_NAME)), trendArrow = GlucoseValue.TrendArrow.fromString(bundle.getString(Intents.EXTRA_BG_SLOPE_NAME)),
sourceSensor = GlucoseValue.SourceSensor.fromString(bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION) sourceSensor = GlucoseValue.SourceSensor.fromString(
?: "") bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION)
?: ""
)
) )
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null)) repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
.doOnError { .doOnError {

View file

@ -5,7 +5,7 @@ import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import info.nightscout.interfaces.source.DexcomBoyda import info.nightscout.interfaces.source.DexcomBoyda
import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.source.NSClientSource
import info.nightscout.interfaces.source.XDrip import info.nightscout.interfaces.source.XDripSource
import info.nightscout.source.AidexPlugin import info.nightscout.source.AidexPlugin
import info.nightscout.source.BGSourceFragment import info.nightscout.source.BGSourceFragment
import info.nightscout.source.DexcomPlugin import info.nightscout.source.DexcomPlugin
@ -45,6 +45,6 @@ abstract class SourceModule {
@Binds fun bindNSClientSource(nsClientSourcePlugin: NSClientSourcePlugin): NSClientSource @Binds fun bindNSClientSource(nsClientSourcePlugin: NSClientSourcePlugin): NSClientSource
@Binds fun bindDexcomBoyda(dexcomPlugin: DexcomPlugin): DexcomBoyda @Binds fun bindDexcomBoyda(dexcomPlugin: DexcomPlugin): DexcomBoyda
@Binds fun bindXDrip(xdripSourcePlugin: XdripSourcePlugin): XDrip @Binds fun bindXDrip(xdripSourcePlugin: XdripSourcePlugin): XDripSource
} }
} }

View file

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- Source --> <!-- Source -->
<string name="ns_client_bg">NSClient BG</string>
<string name="ns_client_bg_short">NS BG</string>
<string name="description_source_ns_client">Ladda ner BG-data från Nightscout</string> <string name="description_source_ns_client">Ladda ner BG-data från Nightscout</string>
<string name="source_xdrip">xDrip+ BG</string>
<string name="description_source_xdrip">Ta emot BG-data från xDrip+.</string> <string name="description_source_xdrip">Ta emot BG-data från xDrip+.</string>
<string name="dexcom_app_patched">Patchad Dexcom-app</string> <string name="dexcom_app_patched">Patchad Dexcom-app</string>
<string name="dexcom_short">Dex</string> <string name="dexcom_short">Dex</string>
@ -9,14 +12,29 @@
<string name="eversense">Eversense App (modifierad)</string> <string name="eversense">Eversense App (modifierad)</string>
<string name="description_source_eversense">Ta emot BG-data från den modifierade <string name="description_source_eversense">Ta emot BG-data från den modifierade
Eversense-appen.</string> Eversense-appen.</string>
<string name="glimp">Glimp</string>
<string name="description_source_glimp">Ta emot BG-data från Glimp</string> <string name="description_source_glimp">Ta emot BG-data från Glimp</string>
<string name="mm640g">MM640g</string>
<string name="description_source_mm640g">Ta emot BG-data från 600SeriesAndroidUploader</string> <string name="description_source_mm640g">Ta emot BG-data från 600SeriesAndroidUploader</string>
<string name="poctech">Poctech</string> <string name="poctech">Poctech</string>
<string name="description_source_poctech">Ta emot BG-data från Poctechappen</string> <string name="description_source_poctech">Ta emot BG-data från Poctechappen</string>
<string name="glunovo">Glunovo</string> <string name="glunovo">Glunovo</string>
<string name="description_source_glunovo">Ta emot värden från Glunovo-appen</string> <string name="description_source_glunovo">Ta emot värden från Glunovo-appen</string>
<string name="intelligo">Intelligo</string>
<string name="description_source_intelligo">Ta emot värden från Intelligo-appen</string>
<string name="tomato">Tomato (MiaoMiao)</string> <string name="tomato">Tomato (MiaoMiao)</string>
<string name="tomato_short">Tomato</string> <string name="tomato_short">Tomato</string>
<string name="description_source_tomato">Ta emot BG-data från tomato app (MiaoMiao-enhet)</string> <string name="description_source_tomato">Ta emot BG-data från tomato app (MiaoMiao-enhet)</string>
<string name="aidex">GlucoRx Aidex</string>
<string name="aidex_short">Aidex</string>
<string name="description_source_aidex">Ta emot BG-värden från GlucoRx Aidex CGMS.</string>
<string name="random_bg">Slumpmässig BG</string>
<string name="description_source_random_bg">Generera slumpmässiga BG-data (endast demo-läge)</string>
<string name="random_bg_short">BG</string>
<string name="do_xdrip_upload_title">Skicka BG-data till xDrip+</string>
<string name="do_xdrip_upload_summary">Välj \"640G/Eversense\" som datakälla i xDrip+</string>
<string name="bgsource_upload">Uppladdningsinställningar för BG</string> <string name="bgsource_upload">Uppladdningsinställningar för BG</string>
<string name="dexcom_log_ns_sensor_change_title">Logga sensorbyte till Nightscout</string>
<string name="dexcom_log_ns_sensor_change_summary">Logga automatiskt ett sensorbyte i NS när en sensor startas</string>
<string name="direction">riktning</string>
</resources> </resources>

View file

@ -18,7 +18,7 @@ class GlimpPluginTest : TestBase() {
@BeforeEach @BeforeEach
fun setup() { fun setup() {
glimpPlugin = GlimpPlugin({ AndroidInjector { } }, rh, aapsLogger, sp) glimpPlugin = GlimpPlugin({ AndroidInjector { } }, rh, aapsLogger)
} }
@Test fun advancedFilteringSupported() { @Test fun advancedFilteringSupported() {

View file

@ -3,7 +3,6 @@ package info.nightscout.source
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import info.nightscout.androidaps.TestBase import info.nightscout.androidaps.TestBase
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@ -14,11 +13,10 @@ class MM640GPluginTest : TestBase() {
private lateinit var mM640gPlugin: MM640gPlugin private lateinit var mM640gPlugin: MM640gPlugin
@Mock lateinit var rh: ResourceHelper @Mock lateinit var rh: ResourceHelper
@Mock lateinit var sp: SP
@BeforeEach @BeforeEach
fun setup() { fun setup() {
mM640gPlugin = MM640gPlugin({ AndroidInjector { } }, rh, aapsLogger, sp) mM640gPlugin = MM640gPlugin({ AndroidInjector { } }, rh, aapsLogger)
} }
@Test fun advancedFilteringSupported() { @Test fun advancedFilteringSupported() {

View file

@ -16,7 +16,18 @@ import info.nightscout.interfaces.profile.ProfileSource
import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.source.NSClientSource
import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.interfaces.utils.JsonHelper
import info.nightscout.plugins.sync.R import info.nightscout.plugins.sync.R
import info.nightscout.plugins.sync.nsclientV3.extensions.* import info.nightscout.plugins.sync.nsclientV3.extensions.toBolus
import info.nightscout.plugins.sync.nsclientV3.extensions.toBolusCalculatorResult
import info.nightscout.plugins.sync.nsclientV3.extensions.toCarbs
import info.nightscout.plugins.sync.nsclientV3.extensions.toEffectiveProfileSwitch
import info.nightscout.plugins.sync.nsclientV3.extensions.toExtendedBolus
import info.nightscout.plugins.sync.nsclientV3.extensions.toFood
import info.nightscout.plugins.sync.nsclientV3.extensions.toOfflineEvent
import info.nightscout.plugins.sync.nsclientV3.extensions.toProfileSwitch
import info.nightscout.plugins.sync.nsclientV3.extensions.toTemporaryBasal
import info.nightscout.plugins.sync.nsclientV3.extensions.toTemporaryTarget
import info.nightscout.plugins.sync.nsclientV3.extensions.toTherapyEvent
import info.nightscout.plugins.sync.nsclientV3.extensions.toTransactionGlucoseValue
import info.nightscout.rx.bus.RxBus import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.EventDismissNotification import info.nightscout.rx.events.EventDismissNotification
import info.nightscout.rx.events.EventNSClientNewLog import info.nightscout.rx.events.EventNSClientNewLog
@ -24,7 +35,17 @@ import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.sdk.localmodel.entry.NSSgvV3 import info.nightscout.sdk.localmodel.entry.NSSgvV3
import info.nightscout.sdk.localmodel.food.NSFood import info.nightscout.sdk.localmodel.food.NSFood
import info.nightscout.sdk.localmodel.treatment.* import info.nightscout.sdk.localmodel.treatment.NSBolus
import info.nightscout.sdk.localmodel.treatment.NSBolusWizard
import info.nightscout.sdk.localmodel.treatment.NSCarbs
import info.nightscout.sdk.localmodel.treatment.NSEffectiveProfileSwitch
import info.nightscout.sdk.localmodel.treatment.NSExtendedBolus
import info.nightscout.sdk.localmodel.treatment.NSOfflineEvent
import info.nightscout.sdk.localmodel.treatment.NSProfileSwitch
import info.nightscout.sdk.localmodel.treatment.NSTemporaryBasal
import info.nightscout.sdk.localmodel.treatment.NSTemporaryTarget
import info.nightscout.sdk.localmodel.treatment.NSTherapyEvent
import info.nightscout.sdk.localmodel.treatment.NSTreatment
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T import info.nightscout.shared.utils.T
@ -223,8 +244,9 @@ class NsIncomingDataProcessor @Inject constructor(
val lastLocalChange = sp.getLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, 0) val lastLocalChange = sp.getLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, 0)
aapsLogger.debug(LTag.PROFILE, "Received profileStore: createdAt: $createdAt Local last modification: $lastLocalChange") aapsLogger.debug(LTag.PROFILE, "Received profileStore: createdAt: $createdAt Local last modification: $lastLocalChange")
@Suppress("LiftReturnOrAssignment") @Suppress("LiftReturnOrAssignment")
if (createdAt > lastLocalChange || createdAt % 1000 == 0L) {// whole second means edited in NS if (createdAt > lastLocalChange || createdAt % 1000 == 0L) { // whole second means edited in NS
profileSource.loadFromStore(store) profileSource.loadFromStore(store)
activePlugin.activeNsClient?.dataSyncSelector?.profileReceived(store.getStartDate())
aapsLogger.debug(LTag.PROFILE, "Received profileStore: $profileJson") aapsLogger.debug(LTag.PROFILE, "Received profileStore: $profileJson")
} }
} }

View file

@ -4,6 +4,7 @@ import info.nightscout.core.utils.waitMillis
import info.nightscout.database.impl.AppRepository import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.source.NSClientSource
import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.sync.DataSyncSelector
import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.interfaces.utils.JsonHelper
import info.nightscout.plugins.sync.R import info.nightscout.plugins.sync.R
@ -74,6 +75,9 @@ class DataSyncSelectorV1 @Inject constructor(
private var running = false private var running = false
private val sync = Any() private val sync = Any()
private val bgUploadEnabled get() = sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) && activePlugin.activeBgSource !is NSClientSource
override suspend fun doUpload() { override suspend fun doUpload() {
synchronized(sync) { synchronized(sync) {
if (running) { if (running) {
@ -154,7 +158,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastBolusIdIfGreater(lastSynced: Long) { private fun confirmLastBolusIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting Bolus data sync from $lastSynced")
sp.putLong(R.string.key_ns_bolus_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_bolus_last_synced_id, lastSynced)
} }
} }
@ -203,7 +206,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastCarbsIdIfGreater(lastSynced: Long) { private fun confirmLastCarbsIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting Carbs data sync from $lastSynced")
sp.putLong(R.string.key_ns_carbs_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_carbs_last_synced_id, lastSynced)
} }
} }
@ -252,7 +254,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastBolusCalculatorResultsIdIfGreater(lastSynced: Long) { private fun confirmLastBolusCalculatorResultsIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting BolusCalculatorResult data sync from $lastSynced")
sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, lastSynced)
} }
} }
@ -301,7 +302,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastTempTargetsIdIfGreater(lastSynced: Long) { private fun confirmLastTempTargetsIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryTarget data sync from $lastSynced")
sp.putLong(R.string.key_ns_temporary_target_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_temporary_target_last_synced_id, lastSynced)
} }
} }
@ -350,7 +350,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastFoodIdIfGreater(lastSynced: Long) { private fun confirmLastFoodIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_food_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_food_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting Food data sync from $lastSynced")
sp.putLong(R.string.key_ns_food_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_food_last_synced_id, lastSynced)
} }
} }
@ -399,7 +398,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastGlucoseValueIdIfGreater(lastSynced: Long) { private fun confirmLastGlucoseValueIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting GlucoseValue data sync from $lastSynced")
sp.putLong(R.string.key_ns_glucose_value_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_glucose_value_last_synced_id, lastSynced)
} }
} }
@ -419,7 +417,7 @@ class DataSyncSelectorV1 @Inject constructor(
appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv -> appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv ->
aapsLogger.info(LTag.NSCLIENT, "Loading GlucoseValue data Start: $startId ${gv.first} forID: ${gv.second.id} ") aapsLogger.info(LTag.NSCLIENT, "Loading GlucoseValue data Start: $startId ${gv.first} forID: ${gv.second.id} ")
val dataPair = DataSyncSelector.PairGlucoseValue(gv.first, gv.second.id) val dataPair = DataSyncSelector.PairGlucoseValue(gv.first, gv.second.id)
if (activePlugin.activeBgSource.shouldUploadToNs(gv.first)) { if (bgUploadEnabled) {
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
gv.first.id == gv.second.id && gv.first.interfaceIDs.nightscoutId != null -> gv.first.id == gv.second.id && gv.first.interfaceIDs.nightscoutId != null ->
@ -450,7 +448,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastTherapyEventIdIfGreater(lastSynced: Long) { private fun confirmLastTherapyEventIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting TherapyEvents data sync from $lastSynced")
sp.putLong(R.string.key_ns_therapy_event_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_therapy_event_last_synced_id, lastSynced)
} }
} }
@ -499,7 +496,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastDeviceStatusIdIfGreater(lastSynced: Long) { private fun confirmLastDeviceStatusIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting DeviceStatus data sync from $lastSynced")
sp.putLong(R.string.key_ns_device_status_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_device_status_last_synced_id, lastSynced)
} }
} }
@ -531,7 +527,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastTemporaryBasalIdIfGreater(lastSynced: Long) { private fun confirmLastTemporaryBasalIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryBasal data sync from $lastSynced")
sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, lastSynced)
} }
} }
@ -583,7 +578,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastExtendedBolusIdIfGreater(lastSynced: Long) { private fun confirmLastExtendedBolusIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting ExtendedBolus data sync from $lastSynced")
sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, lastSynced)
} }
} }
@ -635,7 +629,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastProfileSwitchIdIfGreater(lastSynced: Long) { private fun confirmLastProfileSwitchIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting ProfileSwitch data sync from $lastSynced")
sp.putLong(R.string.key_ns_profile_switch_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_profile_switch_last_synced_id, lastSynced)
} }
} }
@ -684,7 +677,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) { private fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting EffectiveProfileSwitch data sync from $lastSynced")
sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced)
} }
} }
@ -733,7 +725,6 @@ class DataSyncSelectorV1 @Inject constructor(
private fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) { private fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting OfflineEvent data sync from $lastSynced")
sp.putLong(R.string.key_ns_offline_event_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_offline_event_last_synced_id, lastSynced)
} }
} }
@ -784,6 +775,10 @@ class DataSyncSelectorV1 @Inject constructor(
sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, lastSynced) sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, lastSynced)
} }
override fun profileReceived(timestamp: Long) {
sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, timestamp)
}
private suspend fun processChangedProfileStore() { private suspend fun processChangedProfileStore() {
if (isPaused) return if (isPaused) return
val lastSync = sp.getLong(R.string.key_ns_profile_store_last_synced_timestamp, 0) val lastSync = sp.getLong(R.string.key_ns_profile_store_last_synced_timestamp, 0)

View file

@ -21,7 +21,6 @@ import info.nightscout.interfaces.plugin.PluginDescription
import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.plugin.PluginType
import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.source.DoingOwnUploadSource
import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.sync.DataSyncSelector
import info.nightscout.interfaces.sync.NsClient import info.nightscout.interfaces.sync.NsClient
import info.nightscout.interfaces.sync.Sync import info.nightscout.interfaces.sync.Sync
@ -129,9 +128,6 @@ class NSClientPlugin @Inject constructor(
preferenceFragment.findPreference<SwitchPreference>(rh.gs(info.nightscout.core.utils.R.string.key_ns_create_announcements_from_carbs_req))?.isVisible = false preferenceFragment.findPreference<SwitchPreference>(rh.gs(info.nightscout.core.utils.R.string.key_ns_create_announcements_from_carbs_req))?.isVisible = false
} }
preferenceFragment.findPreference<SwitchPreference>(rh.gs(R.string.key_ns_receive_tbr_eb))?.isVisible = config.isEngineeringMode() preferenceFragment.findPreference<SwitchPreference>(rh.gs(R.string.key_ns_receive_tbr_eb))?.isVisible = config.isEngineeringMode()
if (activePlugin.activeBgSource is DoingOwnUploadSource) {
preferenceFragment.findPreference<SwitchPreference>(rh.gs(info.nightscout.core.utils.R.string.key_do_ns_upload))?.isVisible = false
}
} }
override val hasWritePermission: Boolean get() = nsClientService?.hasWriteAuth ?: false override val hasWritePermission: Boolean get() = nsClientService?.hasWriteAuth ?: false

View file

@ -6,6 +6,7 @@ import info.nightscout.interfaces.Config
import info.nightscout.interfaces.nsclient.StoreDataForDb import info.nightscout.interfaces.nsclient.StoreDataForDb
import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.source.NSClientSource
import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.sync.DataSyncSelector
import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.interfaces.utils.JsonHelper
import info.nightscout.plugins.sync.R import info.nightscout.plugins.sync.R
@ -70,6 +71,8 @@ class DataSyncSelectorV3 @Inject constructor(
override fun queueSize(): Long = queueCounter.size() override fun queueSize(): Long = queueCounter.size()
private val bgUploadEnabled get() = sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) && activePlugin.activeBgSource !is NSClientSource
override suspend fun doUpload() { override suspend fun doUpload() {
rxBus.send(EventNSClientUpdateGuiStatus()) rxBus.send(EventNSClientUpdateGuiStatus())
if ((config.NSCLIENT || sp.getBoolean(R.string.key_ns_upload, true)) && !isPaused) { if ((config.NSCLIENT || sp.getBoolean(R.string.key_ns_upload, true)) && !isPaused) {
@ -128,7 +131,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastBolusIdIfGreater(lastSynced: Long) { private fun confirmLastBolusIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting Bolus data sync from $lastSynced")
sp.putLong(R.string.key_ns_bolus_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_bolus_last_synced_id, lastSynced)
} }
} }
@ -147,7 +149,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.bolusesRemaining = lastDbId - startId queueCounter.bolusesRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementBolus(startId).blockingGet()?.let { bolus -> appRepository.getNextSyncElementBolus(startId).blockingGet()?.let { bolus ->
//aapsLogger.info(LTag.NSCLIENT, "Loading Bolus data Start: $startId ${bolus.first} forID: ${bolus.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
bolus.first.id == bolus.second.id && bolus.first.interfaceIDs.nightscoutId != null -> bolus.first.id == bolus.second.id && bolus.first.interfaceIDs.nightscoutId != null ->
@ -171,7 +172,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastCarbsIdIfGreater(lastSynced: Long) { private fun confirmLastCarbsIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting Carbs data sync from $lastSynced")
sp.putLong(R.string.key_ns_carbs_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_carbs_last_synced_id, lastSynced)
} }
} }
@ -190,7 +190,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.carbsRemaining = lastDbId - startId queueCounter.carbsRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementCarbs(startId).blockingGet()?.let { carb -> appRepository.getNextSyncElementCarbs(startId).blockingGet()?.let { carb ->
//aapsLogger.info(LTag.NSCLIENT, "Loading Carbs data Start: $startId ${carb.first} forID: ${carb.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
carb.first.id == carb.second.id && carb.first.interfaceIDs.nightscoutId != null -> carb.first.id == carb.second.id && carb.first.interfaceIDs.nightscoutId != null ->
@ -214,7 +213,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastBolusCalculatorResultsIdIfGreater(lastSynced: Long) { private fun confirmLastBolusCalculatorResultsIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting BolusCalculatorResult data sync from $lastSynced")
sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, lastSynced)
} }
} }
@ -233,7 +231,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.bcrRemaining = lastDbId - startId queueCounter.bcrRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementBolusCalculatorResult(startId).blockingGet()?.let { bolusCalculatorResult -> appRepository.getNextSyncElementBolusCalculatorResult(startId).blockingGet()?.let { bolusCalculatorResult ->
//aapsLogger.info(LTag.NSCLIENT, "Loading BolusCalculatorResult data Start: $startId ${bolusCalculatorResult.first} forID: ${bolusCalculatorResult.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
bolusCalculatorResult.first.id == bolusCalculatorResult.second.id && bolusCalculatorResult.first.interfaceIDs.nightscoutId != null -> bolusCalculatorResult.first.id == bolusCalculatorResult.second.id && bolusCalculatorResult.first.interfaceIDs.nightscoutId != null ->
@ -265,7 +262,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastTempTargetsIdIfGreater(lastSynced: Long) { private fun confirmLastTempTargetsIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryTarget data sync from $lastSynced")
sp.putLong(R.string.key_ns_temporary_target_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_temporary_target_last_synced_id, lastSynced)
} }
} }
@ -284,7 +280,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.ttsRemaining = lastDbId - startId queueCounter.ttsRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementTemporaryTarget(startId).blockingGet()?.let { tt -> appRepository.getNextSyncElementTemporaryTarget(startId).blockingGet()?.let { tt ->
//aapsLogger.info(LTag.NSCLIENT, "Loading TemporaryTarget data Start: $startId ${tt.first} forID: ${tt.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
tt.first.id == tt.second.id && tt.first.interfaceIDs.nightscoutId != null -> tt.first.id == tt.second.id && tt.first.interfaceIDs.nightscoutId != null ->
@ -308,7 +303,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastFoodIdIfGreater(lastSynced: Long) { private fun confirmLastFoodIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_food_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_food_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting Food data sync from $lastSynced")
sp.putLong(R.string.key_ns_food_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_food_last_synced_id, lastSynced)
} }
} }
@ -327,7 +321,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.foodsRemaining = lastDbId - startId queueCounter.foodsRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementFood(startId).blockingGet()?.let { food -> appRepository.getNextSyncElementFood(startId).blockingGet()?.let { food ->
//aapsLogger.info(LTag.NSCLIENT, "Loading Food data Start: $startId ${food.first} forID: ${food.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
food.first.id == food.second.id && food.first.interfaceIDs.nightscoutId != null -> food.first.id == food.second.id && food.first.interfaceIDs.nightscoutId != null ->
@ -351,7 +344,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastGlucoseValueIdIfGreater(lastSynced: Long) { private fun confirmLastGlucoseValueIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting GlucoseValue data sync from $lastSynced")
sp.putLong(R.string.key_ns_glucose_value_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_glucose_value_last_synced_id, lastSynced)
} }
} }
@ -370,8 +362,7 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.gvsRemaining = lastDbId - startId queueCounter.gvsRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv -> appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv ->
//aapsLogger.info(LTag.NSCLIENT, "Loading GlucoseValue data Start: $startId ${gv.first} forID: ${gv.second.id} ") if (bgUploadEnabled) {
if (activePlugin.activeBgSource.shouldUploadToNs(gv.first)) {
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
gv.first.id == gv.second.id && gv.first.interfaceIDs.nightscoutId != null -> gv.first.id == gv.second.id && gv.first.interfaceIDs.nightscoutId != null ->
@ -396,7 +387,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastTherapyEventIdIfGreater(lastSynced: Long) { private fun confirmLastTherapyEventIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting TherapyEvents data sync from $lastSynced")
sp.putLong(R.string.key_ns_therapy_event_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_therapy_event_last_synced_id, lastSynced)
} }
} }
@ -415,7 +405,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.tesRemaining = lastDbId - startId queueCounter.tesRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementTherapyEvent(startId).blockingGet()?.let { te -> appRepository.getNextSyncElementTherapyEvent(startId).blockingGet()?.let { te ->
//aapsLogger.info(LTag.NSCLIENT, "Loading TherapyEvents data Start: $startId ${te.first} forID: ${te.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
te.first.id == te.second.id && te.first.interfaceIDs.nightscoutId != null -> te.first.id == te.second.id && te.first.interfaceIDs.nightscoutId != null ->
@ -439,7 +428,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastDeviceStatusIdIfGreater(lastSynced: Long) { private fun confirmLastDeviceStatusIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting DeviceStatus data sync from $lastSynced")
sp.putLong(R.string.key_ns_device_status_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_device_status_last_synced_id, lastSynced)
} }
} }
@ -458,7 +446,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.dssRemaining = lastDbId - startId queueCounter.dssRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementDeviceStatus(startId).blockingGet()?.let { deviceStatus -> appRepository.getNextSyncElementDeviceStatus(startId).blockingGet()?.let { deviceStatus ->
//aapsLogger.info(LTag.NSCLIENT, "Loading DeviceStatus data Start: $startId $deviceStatus")
cont = activePlugin.activeNsClient?.nsAdd("devicestatus", DataSyncSelector.PairDeviceStatus(deviceStatus, lastDbId), "$startId/$lastDbId") ?: false cont = activePlugin.activeNsClient?.nsAdd("devicestatus", DataSyncSelector.PairDeviceStatus(deviceStatus, lastDbId), "$startId/$lastDbId") ?: false
if (cont) confirmLastDeviceStatusIdIfGreater(deviceStatus.id) if (cont) confirmLastDeviceStatusIdIfGreater(deviceStatus.id)
// with nsId = ignore // with nsId = ignore
@ -470,7 +457,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastTemporaryBasalIdIfGreater(lastSynced: Long) { private fun confirmLastTemporaryBasalIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryBasal data sync from $lastSynced")
sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, lastSynced)
} }
} }
@ -490,7 +476,6 @@ class DataSyncSelectorV3 @Inject constructor(
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementTemporaryBasal(startId).blockingGet()?.let { tb -> appRepository.getNextSyncElementTemporaryBasal(startId).blockingGet()?.let { tb ->
val profile = profileFunction.getProfile(tb.first.timestamp) val profile = profileFunction.getProfile(tb.first.timestamp)
//aapsLogger.info(LTag.NSCLIENT, "Loading TemporaryBasal data Start: $startId ${tb.first} forID: ${tb.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
tb.first.id == tb.second.id && tb.first.interfaceIDs.nightscoutId != null -> tb.first.id == tb.second.id && tb.first.interfaceIDs.nightscoutId != null ->
@ -514,7 +499,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastExtendedBolusIdIfGreater(lastSynced: Long) { private fun confirmLastExtendedBolusIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting ExtendedBolus data sync from $lastSynced")
sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, lastSynced)
} }
} }
@ -533,7 +517,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.ebsRemaining = lastDbId - startId queueCounter.ebsRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementExtendedBolus(startId).blockingGet()?.let { eb -> appRepository.getNextSyncElementExtendedBolus(startId).blockingGet()?.let { eb ->
//aapsLogger.info(LTag.NSCLIENT, "Loading ExtendedBolus data Start: $startId ${eb.first} forID: ${eb.second.id} ")
val profile = profileFunction.getProfile(eb.first.timestamp) val profile = profileFunction.getProfile(eb.first.timestamp)
if (profile != null) { if (profile != null) {
when { when {
@ -560,7 +543,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastProfileSwitchIdIfGreater(lastSynced: Long) { private fun confirmLastProfileSwitchIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting ProfileSwitch data sync from $lastSynced")
sp.putLong(R.string.key_ns_profile_switch_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_profile_switch_last_synced_id, lastSynced)
} }
} }
@ -579,7 +561,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.pssRemaining = lastDbId - startId queueCounter.pssRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementProfileSwitch(startId).blockingGet()?.let { ps -> appRepository.getNextSyncElementProfileSwitch(startId).blockingGet()?.let { ps ->
//aapsLogger.info(LTag.NSCLIENT, "Loading ProfileSwitch data Start: $startId ${ps.first} forID: ${ps.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
ps.first.id == ps.second.id && ps.first.interfaceIDs.nightscoutId != null -> ps.first.id == ps.second.id && ps.first.interfaceIDs.nightscoutId != null ->
@ -603,7 +584,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) { private fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting EffectiveProfileSwitch data sync from $lastSynced")
sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced)
} }
} }
@ -622,7 +602,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.epssRemaining = lastDbId - startId queueCounter.epssRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementEffectiveProfileSwitch(startId).blockingGet()?.let { ps -> appRepository.getNextSyncElementEffectiveProfileSwitch(startId).blockingGet()?.let { ps ->
//aapsLogger.info(LTag.NSCLIENT, "Loading EffectiveProfileSwitch data Start: $startId ${ps.first} forID: ${ps.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
ps.first.id == ps.second.id && ps.first.interfaceIDs.nightscoutId != null -> ps.first.id == ps.second.id && ps.first.interfaceIDs.nightscoutId != null ->
@ -646,7 +625,6 @@ class DataSyncSelectorV3 @Inject constructor(
private fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) { private fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) {
if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) { if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) {
//aapsLogger.debug(LTag.NSCLIENT, "Setting OfflineEvent data sync from $lastSynced")
sp.putLong(R.string.key_ns_offline_event_last_synced_id, lastSynced) sp.putLong(R.string.key_ns_offline_event_last_synced_id, lastSynced)
} }
} }
@ -665,7 +643,6 @@ class DataSyncSelectorV3 @Inject constructor(
queueCounter.oesRemaining = lastDbId - startId queueCounter.oesRemaining = lastDbId - startId
rxBus.send(EventNSClientUpdateGuiQueue()) rxBus.send(EventNSClientUpdateGuiQueue())
appRepository.getNextSyncElementOfflineEvent(startId).blockingGet()?.let { oe -> appRepository.getNextSyncElementOfflineEvent(startId).blockingGet()?.let { oe ->
//aapsLogger.info(LTag.NSCLIENT, "Loading OfflineEvent data Start: $startId ${oe.first} forID: ${oe.second.id} ")
when { when {
// new record with existing NS id => must be coming from NS => ignore // new record with existing NS id => must be coming from NS => ignore
oe.first.id == oe.second.id && oe.first.interfaceIDs.nightscoutId != null -> oe.first.id == oe.second.id && oe.first.interfaceIDs.nightscoutId != null ->
@ -691,6 +668,10 @@ class DataSyncSelectorV3 @Inject constructor(
sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, lastSynced) sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, lastSynced)
} }
override fun profileReceived(timestamp: Long) {
sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, timestamp)
}
private suspend fun processChangedProfileStore() { private suspend fun processChangedProfileStore() {
if (isPaused) return if (isPaused) return
val lastSync = sp.getLong(R.string.key_ns_profile_store_last_synced_timestamp, 0) val lastSync = sp.getLong(R.string.key_ns_profile_store_last_synced_timestamp, 0)

View file

@ -531,6 +531,10 @@ class DataSyncSelectorXdripImpl @Inject constructor(
sp.putLong(R.string.key_xdrip_profile_store_last_synced_timestamp, lastSynced) sp.putLong(R.string.key_xdrip_profile_store_last_synced_timestamp, lastSynced)
} }
override fun profileReceived(timestamp: Long) {
sp.putLong(R.string.key_xdrip_profile_store_last_synced_timestamp, timestamp)
}
private fun processChangedProfileStore() { private fun processChangedProfileStore() {
if (!isEnabled) return if (!isEnabled) return
val lastSync = sp.getLong(R.string.key_xdrip_profile_store_last_synced_timestamp, 0) val lastSync = sp.getLong(R.string.key_xdrip_profile_store_last_synced_timestamp, 0)

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="open_humans">Open Humans</string>
<string name="open_humans_short">OH</string>
<string name="open_humans_description">Med Open Humans kan du ladda upp din diabetesdata och donera den till vetenskapliga projekt.</string> <string name="open_humans_description">Med Open Humans kan du ladda upp din diabetesdata och donera den till vetenskapliga projekt.</string>
<string name="logout">Logga ut</string> <string name="logout">Logga ut</string>
<string name="setup">Konfiguration</string> <string name="setup">Konfiguration</string>
@ -10,17 +12,45 @@
<string name="only_upload_if_charging">Ladda bara upp vid laddning</string> <string name="only_upload_if_charging">Ladda bara upp vid laddning</string>
<string name="open_humans_uploading">Laddar upp till Open Humans…</string> <string name="open_humans_uploading">Laddar upp till Open Humans…</string>
<string name="open_humans_notifications">Aviseringar från Open Humans</string> <string name="open_humans_notifications">Aviseringar från Open Humans</string>
<string name="uploading_to_open_humans">AAPS laddar upp till Open Humans. Det kan ta ett tag.</string>
<string name="you_have_been_signed_out_of_open_humans">Du har loggats ut från Open Humans</string> <string name="you_have_been_signed_out_of_open_humans">Du har loggats ut från Open Humans</string>
<string name="click_here_to_sign_in_again_if_this_wasnt_on_purpose">Klicka här om du vill logga in igen.</string> <string name="click_here_to_sign_in_again_if_this_wasnt_on_purpose">Klicka här om du vill logga in igen.</string>
<string name="next">Nästa</string> <string name="next">Nästa</string>
<string name="welcome_to_open_humans">Välkommen till Open Humans</string>
<string name="setup_data_upload">För att ställa in datauppladdning, klicka på \"Nästa\".</string>
<string name="consent">Samtycke</string>
<string name="terms_of_use">Användarvillkor</string> <string name="terms_of_use">Användarvillkor</string>
<string name="please_read__information">Läs noggrant följande information och godkänn användarvillkoren för att fortsätta.</string>
<string name="info_openhumans">Detta är ett open source-verktyg som kommer att ladda upp dina data till Open Humans. Vi förbehåller oss inga rättigheter att dela dina uppgifter med tredje part utan ditt uttryckliga tillstånd. De data som projektet och appen tar emot identifieras via ett slumpmässigt användar-ID och kommer endast att överföras på ett säkert sätt till ett Open Humans-konto om du tillåter det. Du kan när som helst sluta ladda upp och radera dina uppladdningsdata via www.openhumans.org.</string> <string name="info_openhumans">Detta är ett open source-verktyg som kommer att ladda upp dina data till Open Humans. Vi förbehåller oss inga rättigheter att dela dina uppgifter med tredje part utan ditt uttryckliga tillstånd. De data som projektet och appen tar emot identifieras via ett slumpmässigt användar-ID och kommer endast att överföras på ett säkert sätt till ett Open Humans-konto om du tillåter det. Du kan när som helst sluta ladda upp och radera dina uppladdningsdata via www.openhumans.org.</string>
<string name="data_uploaded">Data uppladdat</string>
<string name="glucose_values">Glukosvärden</string>
<string name="boluses">Bolusar</string> <string name="boluses">Bolusar</string>
<string name="extended_boluses">Förlängda bolusar</string>
<string name="carbohydrates">Kolhydrater</string> <string name="carbohydrates">Kolhydrater</string>
<string name="careportal_events">Careportal-händelser (utom anteckningar)</string>
<string name="profile_switches">Profilbyten</string>
<string name="total_daily_doses">Total daglig dos (TDD)</string>
<string name="temporary_basal_rates">Tillfälliga basaldoser</string>
<string name="temporary_targets">Tillfälliga målvärden</string>
<string name="settings">Inställningar</string> <string name="settings">Inställningar</string>
<string name="application_version">Programversion</string>
<string name="device_model">Modell</string> <string name="device_model">Modell</string>
<string name="screen_dimensions">Skärmdimensioner</string>
<string name="algorithm_debug_data">Felsökningsdata för algoritmen</string>
<string name="data_not_uploaded">Data INTE uppladdat</string>
<string name="passwords">Lösenord</string>
<string name="nightscout_url">Nightscout-URL</string> <string name="nightscout_url">Nightscout-URL</string>
<string name="nightscout_api_secret">Nightscout API-hemlighet</string>
<string name="free_text_fields">Fritextfält</string>
<string name="agree">Jag förstår och instämmer.</string> <string name="agree">Jag förstår och instämmer.</string>
<string name="login_open_humans">Logga in på Open Humans</string>
<string name="final_touches">Avslutande detaljer</string>
<string name="uploading_proceed">Du är bara ett steg från att ladda upp dina data till Open Humans. Vill du fortsätta?</string>
<string name="cancel">Avbryt</string> <string name="cancel">Avbryt</string>
<string name="proceed">Fortsätt</string>
<string name="finishing">Slutför...</string>
<string name="this_may_take_a_few_seconds">Detta kan ta några sekunder.</string>
<string name="we_re_done">Vi är klara!</string>
<string name="silently_upload_date_note">Från och med nu kommer telefonen att ladda upp data i bakgrunden då och då.</string>
<string name="close">Stäng</string> <string name="close">Stäng</string>
</resources> </resources>

View file

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- NSClient --> <!-- NSClient -->
<string name="ns_cellular">Använd mobilanslutning</string>
<string name="ns_wifi">Använd WiFi-anslutning</string>
<string name="ns_wifi_ssids">WiFi nätverksnamn</string> <string name="ns_wifi_ssids">WiFi nätverksnamn</string>
<string name="ns_charging">Vid laddning</string>
<string name="ns_battery">På batteri</string>
<string name="connection_settings_title">Anslutningsinställningar</string> <string name="connection_settings_title">Anslutningsinställningar</string>
<string name="ns_wifi_allowed_ssids">Tillåtna nätverksnamn (separerade med semikolon)</string> <string name="ns_wifi_allowed_ssids">Tillåtna nätverksnamn (separerade med semikolon)</string>
<string name="ns_allow_roaming">Tillåt NS-data vid roaming</string> <string name="ns_allow_roaming">Tillåt NS-data vid roaming</string>
@ -10,12 +14,17 @@
<string name="ns_create_announcements_from_errors_summary">Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar)</string> <string name="ns_create_announcements_from_errors_summary">Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar)</string>
<string name="ns_create_announcements_from_carbs_req_summary">Skapa Nightscout-aviseringar för KH-förslag</string> <string name="ns_create_announcements_from_carbs_req_summary">Skapa Nightscout-aviseringar för KH-förslag</string>
<string name="description_ns_client">Synkroniserar dina data med Nightscout</string> <string name="description_ns_client">Synkroniserar dina data med Nightscout</string>
<string name="description_ns_client_v3">Synkroniserar dina data med Nightscout genom v3 API</string>
<string name="blocked_by_charging">Blockerad av laddningsinställningar</string>
<string name="blocked_by_connectivity">Blockerad av anslutningsinställningar</string>
<string name="unsupported_ns_version">Versionen av Nightscout stöds inte</string> <string name="unsupported_ns_version">Versionen av Nightscout stöds inte</string>
<string name="openaps_short">APS</string> <string name="openaps_short">APS</string>
<string name="uploader_short">Upld batt</string> <string name="uploader_short">Upld batt</string>
<string name="ns_malfunction">Fel på NSClient. Överväg att starta om NSClient och Nightscout-webbplatsen.</string> <string name="ns_malfunction">Fel på NSClient. Överväg att starta om NSClient och Nightscout-webbplatsen.</string>
<!-- NSClient --> <!-- NSClient -->
<string name="no_write_permission">NS Client kan inte uppdatera Nightscout. Fel API secret?</string> <string name="no_write_permission">NS Client kan inte uppdatera Nightscout. Fel API secret?</string>
<string name="ns_client_v3">NSClientV3</string>
<string name="ns_client_v3_short_name">NSV3</string>
<string name="ns_client">NSClient</string> <string name="ns_client">NSClient</string>
<string name="ns_client_short_name">NSCl</string> <string name="ns_client_short_name">NSCl</string>
<string name="ns_client_url">URL:</string> <string name="ns_client_url">URL:</string>
@ -26,6 +35,9 @@
<string name="ns_client_secret_title">Nightscout API secret</string> <string name="ns_client_secret_title">Nightscout API secret</string>
<string name="ns_client_secret_dialog_title">Nightscout API secret</string> <string name="ns_client_secret_dialog_title">Nightscout API secret</string>
<string name="ns_client_secret_dialog_message">Ange Nightscout API secret (min 12 tecken)</string> <string name="ns_client_secret_dialog_message">Ange Nightscout API secret (min 12 tecken)</string>
<string name="nsclient_token_title">NS åtkomstnyckel</string>
<string name="nsclient_token_dialog_title">NS åtkomstnyckel</string>
<string name="nsclient_token_dialog_message">Åtkomstnyckel genererad på Nighscouts admin-sida (minst 17 tecken)</string>
<string name="deliver_now">Synkronisera nu</string> <string name="deliver_now">Synkronisera nu</string>
<string name="clear_queue">Töm kö</string> <string name="clear_queue">Töm kö</string>
<string name="show_queue">Visa kö</string> <string name="show_queue">Visa kö</string>
@ -45,6 +57,8 @@
<string name="ns_receive_profile_switch_summary">Acceptera profilbyten som matats in via NS eller NSClient</string> <string name="ns_receive_profile_switch_summary">Acceptera profilbyten som matats in via NS eller NSClient</string>
<string name="ns_receive_offline_event">Ladda ner APS offline händelser</string> <string name="ns_receive_offline_event">Ladda ner APS offline händelser</string>
<string name="ns_receive_offline_event_summary">Acceptera APS Offline-händelser som matas in via NS eller NSClient</string> <string name="ns_receive_offline_event_summary">Acceptera APS Offline-händelser som matas in via NS eller NSClient</string>
<string name="ns_receive_tbr_eb">Ladda ner temp basal och förlängd bolus</string>
<string name="ns_receive_tbr_eb_summary">Acceptera temp basal och förlängd bolus inlagda av en annan instans</string>
<string name="ns_receive_insulin">Ladda ner loggade insulindoser</string> <string name="ns_receive_insulin">Ladda ner loggade insulindoser</string>
<string name="ns_receive_insulin_summary">Acceptera loggat insulin som matats in via NS eller NSClient (den levereras inte, endast beräknad mot IOB)</string> <string name="ns_receive_insulin_summary">Acceptera loggat insulin som matats in via NS eller NSClient (den levereras inte, endast beräknad mot IOB)</string>
<string name="ns_receive_carbs">Ladda ner loggade kolhydrater</string> <string name="ns_receive_carbs">Ladda ner loggade kolhydrater</string>
@ -61,6 +75,8 @@
<string name="ns_alarm_urgent_stale_data_value_label">Akut varning efter [min]</string> <string name="ns_alarm_urgent_stale_data_value_label">Akut varning efter [min]</string>
<string name="ns_log_app_started_event">Rapportera appstart till Nightscout</string> <string name="ns_log_app_started_event">Rapportera appstart till Nightscout</string>
<string name="copy_existing_values">Kopiera NS-inställningar (om det finns)?</string> <string name="copy_existing_values">Kopiera NS-inställningar (om det finns)?</string>
<string name="ns_use_ws_title">Anslut till websockets</string>
<string name="ns_use_ws_summary">Aktivering innebär: snabbare uppdateringar, mottagande av larm och meddelanden och högre batteriförbrukning liknande v1. OBS! Alla uppladdare till NS måste använda v3-protokollet.</string>
<!-- Tidepool --> <!-- Tidepool -->
<string name="summary_tidepool_username">Ditt användarnamn på Tidepool. Normalt din e-postadress</string> <string name="summary_tidepool_username">Ditt användarnamn på Tidepool. Normalt din e-postadress</string>
<string name="title_tidepool_username">Användarnamn</string> <string name="title_tidepool_username">Användarnamn</string>
@ -77,8 +93,27 @@
<string name="tidepool_upload_tbr">Ladda upp temp basaler</string> <string name="tidepool_upload_tbr">Ladda upp temp basaler</string>
<string name="tidepool_upload_profile">Ladda upp profilbyten och temp mål</string> <string name="tidepool_upload_profile">Ladda upp profilbyten och temp mål</string>
<string name="tidepool_upload_bg">Ladda upp BG-test</string> <string name="tidepool_upload_bg">Ladda upp BG-test</string>
<string name="remove_all">Ta bort allt</string>
<string name="reset_start">Nollställ start</string>
<string name="upload_now">Ladda upp nu</string> <string name="upload_now">Ladda upp nu</string>
<string name="not_connected">Inte ansluten</string>
<string name="read_only">Skrivskyddad</string>
<string name="working">Arbetar</string>
<!-- xDrip status line --> <!-- xDrip status line -->
<!-- Xdrip StatusLine --> <!-- Xdrip StatusLine -->
<string name="xdrip">xDrip+</string>
<string name="xdrip_shortname">XD</string>
<string name="description_xdrip">Skicka data till xDrip+</string>
<string name="xdrip_status_detailed_iob_title">Visa detaljerad IOB</string>
<string name="xdrip_status_detailed_iob_summary">Bryt ner IOB som bolus-IOB och basal-IOB på urtavlan</string>
<string name="xdrip_status_show_bgi_title">Visa BGI</string>
<string name="xdrip_status_show_bgi_summary">Visa BGI i statusraden</string>
<string name="xdrip_status_settings">xDrip+ Avancerad Statusrad</string>
<string name="disabled_loop">Loop inaktiverad</string>
<string name="xdrip_send_status_title">Skicka statusrad till xDrip+</string>
<string name="xdrip_not_installed">xDrip+ inte installerat</string>
<string name="calibration_sent">Kalibrering skickad till xDrip+</string>
<string name="xdrip_local_broadcasts_summary">Skicka glukos och behandlingsdata till xDrip+. Datakällan \"xDrip+ Sync Follower\" måste väljas och godkännande av data måste aktiveras i Inställningar - Inter-app-inställningar - Acceptera Glukos/Behandlingar</string>
<string name="xdrip_local_broadcasts_title">Aktivera sändningar till xDrip+.</string>
<!-- DataBroadcast--> <!-- DataBroadcast-->
</resources> </resources>

View file

@ -24,7 +24,7 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@SuppressWarnings({"unused", "rawtypes", "SuspiciousMethodCalls", "unchecked"}) @SuppressWarnings({"unused", "rawtypes", "SuspiciousMethodCalls", "unchecked", "deprecation"})
public final class BundleMock { public final class BundleMock {
public static Bundle mock() { public static Bundle mock() {

View file

@ -24,7 +24,8 @@ class TestBluetoothDevice(private val testComboIO: ComboIO) : BluetoothDevice(Di
} }
override fun disconnect() { override fun disconnect() {
frameParser.reset() // Synchronized rest so we don't interfere with pushing/parsing data into the frameParser.
synchronized(frameParser) { frameParser.reset() }
runBlocking { runBlocking {
innerJob.cancelAndJoin() innerJob.cancelAndJoin()
} }
@ -38,8 +39,10 @@ class TestBluetoothDevice(private val testComboIO: ComboIO) : BluetoothDevice(Di
} }
override fun blockingSend(dataToSend: List<Byte>) { override fun blockingSend(dataToSend: List<Byte>) {
synchronized(frameParser) {
frameParser.pushData(dataToSend) frameParser.pushData(dataToSend)
frameParser.parseFrame()?.let { frameParser.parseFrame()
}?.let {
runBlocking { runBlocking {
innerScope.async { innerScope.async {
testComboIO.send(it) testComboIO.send(it)

View file

@ -1,19 +1,131 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="combov2_plugin_name">Accu-Chek Combo</string>
<string name="combov2_plugin_description">Inbyggd pumpintegration för Accu-Check Combo-pumpar</string>
<string name="combov2_could_not_connect">Kunde inte ansluta till pumpen</string>
<string name="combov2_not_paired">Inte parkopplad till en pump</string>
<string name="combov2_pump_terminated_connection">Pumpen avslutade anslutningen</string>
<string name="combov2_warning">Combo varning</string>
<string name="combov2_error">Combo fel</string>
<string name="combov2_warning_4">Ring hotline för uppdatering</string>
<string name="combov2_warning_10">Bluetooth-fel; parkoppla på nytt</string>
<string name="combov2_error_1">Reservoar tom</string>
<string name="combov2_error_2">Batteri tomt</string> <string name="combov2_error_2">Batteri tomt</string>
<string name="combov2_error_4">Ocklusion</string> <string name="combov2_error_4">Ocklusion</string>
<string name="combov2_error_5">Slut på tid för reservpump</string>
<string name="combov2_error_6">Mekaniskt fel</string> <string name="combov2_error_6">Mekaniskt fel</string>
<string name="combov2_error_7">Elektroniskt fel</string>
<string name="combov2_error_8">Strömavbrott</string>
<string name="combov2_error_9">Lånepump stannar</string>
<string name="combov2_error_10">Reservoarfel</string>
<string name="combov2_error_11">Infusionsset är inte förfyllt</string>
<string name="combov2_extended_bolus_not_supported">Förlängd bolus stöds inte</string>
<string name="combov2_title">Accu-Chek Combo v2</string>
<string name="combov2_pair_with_pump_title">Parkoppla med pump</string>
<string name="combov2_unpair_pump_title">Koppla från pump</string>
<string name="combov2_driver_state_label">Drivrutinsstatus</string>
<string name="combov2_current_activity_label">Nuvarande aktivitet</string>
<string name="bluetooth_address">Bluetooth-adress</string> <string name="bluetooth_address">Bluetooth-adress</string>
<string name="combov2_start_pairing">Påbörja parkoppling</string>
<string name="combov2_pairing_in_progress">Parkoppling pågår</string>
<string name="combov2_pairing_start_steps">Steg för att parkoppla med din Combo:\n\n
1. Navigera till pumpens Bluetooth-inställningar\n
2. Kontrollera om en enhet redan visas som parkopplad; Om så är fallet, gå till \"Ta bort enhet\" skärmen på pumpen för att ta bort/koppla ifrån den enheten\n
3. Gå till pumpskärmen \"Lägg till enhet\" och starta parkoppling på pumpen\n
4. Klicka på knappen \"Påbörja parkoppling\" nedan för att initiera parkoppling i AAPS\n</string>
<string name="combov2_steps_if_no_connection_during_pairing">Efter ett tag visas telefonens namn på pumpens skärm; tryck på CHECK för att bekräfta.\n\n
När parkopplingen är slutförd, bekräfta den färdiga parningen på pumpen och återgå till pumpens startskärm genom att trycka på CHECK-knappen två gånger.\n\n
Om ingen anslutning är etablerad efter mer än ~5 minuter:\n\n
1. Tryck tillbaka eller \"Avbryt parkoppling\"\n
2. Avbryt parkopplingen på Combo (tryck på både UP- och MENU-knapparna
samtidigt för att avbryta parkoppling)\n
3. Försök para ihop igen</string>
<string name="combov2_enter_pin">Ange PIN-kod</string>
<string name="combov2_cancel_pairing">Avbryt parkoppling</string>
<string name="combov2_pin_hint">10-siffrig PIN-kod</string>
<string name="combov2_pairing_finished_successfully">Parkoppingen lyckades</string>
<string name="combov2_pairing_cancelled">Parkopplingen avbruten av användaren</string>
<string name="combov2_pairing_combo_scan_timeout_reached">Sökningen tog för lång tid</string>
<string name="combov2_pairing_failed_due_to_error">Parkoppling misslyckades på grund av fel: %1$s</string>
<string name="combov2_pairing_aborted_unknown_reasons">Parkoppling avbröts av okänd anledning</string>
<string name="combov2_pairing_invalid_pin_length">"Ogiltig längd på PIN-kod. Behöver %1$d siffror men fick %2$d"</string>
<string name="combov2_scanning_for_pump">Söker efter pump</string>
<string name="combov2_establishing_bt_connection">Upprättar Bluetooth-anslutning (försök nr. %1$d)</string>
<string name="combov2_pairing_performing_handshake">Utför handskakning med pump</string>
<string name="combov2_pairing_pump_requests_pin">Pumpen efterfrågar 10-siffrig PIN-kod</string>
<string name="combov2_pairing_finishing">Avslutar parkoppling</string>
<string name="combov2_no_connection_for_n_mins">Ingen anslutning på %1$d minuter</string>
<string name="combov2_less_than_one_minute_ago">Mindre än en minut sedan</string>
<string name="combov2_setting_current_pump_time">Ställer in aktuell tid i pumpen</string>
<string name="combov2_setting_current_pump_date">Ställer in aktuellt datum i pumpen</string>
<string name="combov2_not_initialized">Inte initierad</string> <string name="combov2_not_initialized">Inte initierad</string>
<string name="combov2_checking_pump">Kontrollerar pump</string>
<string name="combov2_ready">Klar</string>
<string name="combov2_suspended">Pausad</string> <string name="combov2_suspended">Pausad</string>
<string name="combov2_pump_is_suspended">Pumpen är pausad</string>
<string name="combov2_executing_command">Kör kommando</string>
<string name="combov2_getting_basal_profile_cmddesc">Hämtar basalprofil</string>
<string name="combov2_setting_basal_profile_cmddesc">Sätter basalprofil</string> <string name="combov2_setting_basal_profile_cmddesc">Sätter basalprofil</string>
<string name="combov2_setting_tbr_cmddesc">Sätter temp basal %1$d%% i %2$d minuter</string>
<string name="combov2_cancelling_tbr">Avbryter pågående temp basal</string>
<string name="combov2_delivering_bolus_cmddesc">Levererar %1$.1f U som bolus</string>
<string name="combov2_fetching_tdd_history_cmddesc">Hämtar TDD-historik</string>
<string name="combov2_updating_pump_datetime_cmddesc">Uppdaterar pumpens datumtid</string>
<string name="combov2_updating_pump_status_cmddesc">Uppdaterar pumpens status</string>
<string name="combov2_pairing_pin_failure">PIN-koden fungerade inte. Kontrollera om det fanns ett stavfel. Om detta fortsätter att ske, avbryt och försök igen.</string>
<string name="combov2_discovery_duration">Varaktighet för sökning (i sekunder)</string>
<string name="combov2_verbose_logging">Aktivera detaljerad loggning</string>
<string name="combov2_getting_basal_profile">Hämtar basalprofil; %1$d faktor(er) inlästa</string>
<string name="combov2_setting_basal_profile">Sätter basalprofil; %1$d faktor(er) skrivna</string>
<string name="combov2_delivering_bolus">Levererar bolus (%1$.1f av %2$.1f U levererade)</string>
<string name="combov2_cannot_deliver_pump_suspended">Kan inte skicka behandling - pumpen är pausad</string>
<string name="combov2_insufficient_insulin_in_reservoir">Otillräckligt med insulin i reservoaren</string>
<string name="combov2_bolus_cancelled">Bolus avbruten</string> <string name="combov2_bolus_cancelled">Bolus avbruten</string>
<string name="combov2_bolus_delivery_failed">Bolus avbruten. Det verkar som om ingen bolus levererades. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt.</string> <string name="combov2_bolus_delivery_failed">Bolus avbruten. Det verkar som om ingen bolus levererades. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt.</string>
<string name="combov2_bolus_not_delivered">Bolus ej levererad</string>
<string name="combov2_cannot_access_pump_data">Kan inte hämta pumpdata. Pumpen måste parkopplas på nytt</string>
<string name="combov2_unaccounted_bolus_detected_cancelling_bolus">Ej redovisade bolusleveranser upptäckta. Avbryter bolus av säkerhetsskäl.</string>
<string name="combov2_incorrect_active_basal_profile">Felaktig aktiv basalprofil. Profil 1 måste vara aktiv, inte profil %1$d</string>
<string name="combov2_unrecognized_alert">Okänd Combo-varning</string>
<string name="combov2_combo_alert">Combo-varning</string>
<string name="combov2_current_tbr">%1$d%% (%2$d min återstår)</string> <string name="combov2_current_tbr">%1$d%% (%2$d min återstår)</string>
<string name="combov2_current_tbr_less_than_1min">%1$d%% (mindre än 1 minut kvar)</string>
<string name="combov2_load_tdds_cancelled">Laddning av dygnsdoser avbruten</string>
<string name="combov2_retrieving_tdds_failed">Hämtning av dygnsdoser misslyckades</string>
<string name="combov2_battery_low_warning">Pumpbatteriet är svagt</string> <string name="combov2_battery_low_warning">Pumpbatteriet är svagt</string>
<string name="combov2_reservoir_low_warning">Låg nivå i pumpreservoaren</string>
<string name="combov2_setting_tbr_succeeded">Inställning av temp basal lyckades</string>
<string name="combov2_setting_tbr_failed">Inställning av temp basal misslyckades</string>
<string name="combov2_set_emulated_100_tbr">Ställ in emulerad 100% temp basal</string>
<string name="combov2_letting_emulated_100_tbr_finish">Låter pågående emulerad 100% temp basal avsluta</string>
<string name="combov2_ignoring_redundant_100_tbr">Ignorerar överflödig begäran av 100% temp basal</string>
<string name="combov2_hit_unexpected_tbr_limit">Oväntad gräns påträffades vid justering av temp basal: målprocenten var %1$d%%, nådde en gräns vid %2$d%%</string>
<string name="combov2_cannot_set_absolute_tbr_if_basal_zero">Kan inte ställa in absolut temp basal om basaldosen är noll</string>
<string name="combov2_pair_with_pump_summary">Parkoppla AndroidAPS och Android med en för närvarande icke-parad Accu-Chek Combo-pump</string>
<string name="combov2_unpair_pump_summary">Koppla bort AndroidAPS och Android från den nuvarande parkopplade Accu-Chek Combo-pumpen</string>
<string name="combov2_unknown_tbr_detected">Okänd temp basal upptäcktes och stoppades; procentsats: %1$d%%; återstående varaktighet: %2$s</string>
<string name="combov2_connection_error">Anslutningsfel: %1$s</string>
<string name="combov2_short_status_last_connection">Sen ansl: %1$d min sedan</string> <string name="combov2_short_status_last_connection">Sen ansl: %1$d min sedan</string>
<string name="combov2_short_status_alert">Varning: %s</string>
<string name="combov2_short_status_last_bolus">Senaste Bolus: %1$s U @ %2$s</string>
<string name="combov2_short_status_temp_basal">Temp: %s</string> <string name="combov2_short_status_temp_basal">Temp: %s</string>
<string name="combov2_short_status_reservoir">Res: %dU</string> <string name="combov2_short_status_reservoir">Res: %dU</string>
<string name="combov2_short_status_battery_state_empty">tom</string> <string name="combov2_short_status_battery_state_empty">tom</string>
<string name="combov2_short_status_battery_state_low">låg</string> <string name="combov2_short_status_battery_state_low">låg</string>
<string name="combov2_short_status_battery_state_full">full</string>
<string name="combov2_short_status_battery_state">Batt.: %s</string>
<string name="combov2_automatic_reservoir_entry">Auto-detektera och ange byte av insulinreservoar automatiskt</string>
<string name="combov2_automatic_battery_entry">Auto-detektera och ange byte av batteri automatiskt</string>
<string name="combov2_note_reservoir_change">Byte av insulinreservoar infogas automatiskt av combov2-drivrutinen</string>
<string name="combov2_note_battery_change">Batteribytet registrerades automatiskt av combov2-drivrutinen</string>
<string name="combov2_timezone_changed">Tidszon ändrad</string>
<string name="combov2_datetime_changed">Datum och/eller tid ändrad</string>
<string name="combov2_dst_started">Sommartid startad</string>
<string name="combov2_dst_ended">Sommartid avslutad</string>
<string name="combov2_cannot_connect_pump_error_observed">Kan inte ansluta till pump eftersom pumpen rapporterade ett fel. Användaren måste hantera felet och sedan antingen vänta 5 minuter eller trycka på knappen Uppdatera i fliken drivrutiner.</string>
<string name="combov2_refresh_pump_status_after_error">Uppdaterar pumpens status efter att pumpen rapporterade ett fel</string>
<string name="combov2_go_back">Gå tillbaka</string>
<string name="combov2_cannot_pair_driver_not_initialized_explanation">Kan inte utföra parkoppling eftersom drivrutinen inte är initierad. Detta händer vanligtvis när de nödvändiga Bluetooth-behörigheterna inte har beviljats. Gå tillbaka, bevilja Bluetooth-behörigheter och försök sedan igen att parkoppla.</string>
<string name="combov2_bluetooth_disabled">Kan inte starta drivrutinen - Bluetooth är inaktiverat</string>
<string name="combov2_bluetooth_not_supported">Drivrutin kan inte köras - den här enheten stöder inte Bluetooth</string>
</resources> </resources>

View file

@ -18,7 +18,8 @@
android:hint="@string/event_type" android:hint="@string/event_type"
app:layout_constraintBottom_toTopOf="@+id/status" app:layout_constraintBottom_toTopOf="@+id/status"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.MaterialAutoCompleteTextView <com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/typeList" android:id="@+id/typeList"

View file

@ -48,7 +48,7 @@ class MsgHistoryEventsV2 constructor(
aapsLogger.debug(LTag.PUMPCOMM, "Last record received") aapsLogger.debug(LTag.PUMPCOMM, "Last record received")
val array: Array<ByteArray> = messageBuffer.toTypedArray() val array: Array<ByteArray> = messageBuffer.toTypedArray()
val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> (dateTime(s1) - dateTime(s2)).toInt() } val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> dateTime(s1).compareTo(dateTime(s2)) }
for (message in sorted) processMessage(message) for (message in sorted) processMessage(message)
danaPump.historyDoneReceived = true danaPump.historyDoneReceived = true
} else messageBuffer.add(bytes) } else messageBuffer.add(bytes)

View file

@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string name="unsupported_action_in_pump">Åtgärden stöds inte i pumpen. Använd enbart AAPS gränssnitt!</string>
</resources>

View file

@ -76,7 +76,7 @@ open class DanaRSPacketAPSHistoryEvents(
aapsLogger.debug(LTag.PUMPCOMM, "Last record received") aapsLogger.debug(LTag.PUMPCOMM, "Last record received")
val array: Array<ByteArray> = messageBuffer.toTypedArray() val array: Array<ByteArray> = messageBuffer.toTypedArray()
val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> (dateTime(s1) - dateTime(s2)).toInt() } val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> dateTime(s1).compareTo(dateTime(s2)) }
for (index in sorted.indices) { for (index in sorted.indices) {
val message = sorted[index] val message = sorted[index]
// workaround for RS history bug // workaround for RS history bug
@ -102,7 +102,7 @@ open class DanaRSPacketAPSHistoryEvents(
} else messageBuffer.add(data) } else messageBuffer.add(data)
} }
fun dateTime(data: ByteArray): Long = private fun dateTime(data: ByteArray): Long =
if (!danaPump.usingUTC) dateTimeSecFromBuff(data, 1) // 6 bytes if (!danaPump.usingUTC) dateTimeSecFromBuff(data, 1) // 6 bytes
else intFromBuffMsbLsb(data, 3, 4) * 1000L else intFromBuffMsbLsb(data, 3, 4) * 1000L

View file

@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.danars.encryption.BleEncryption import info.nightscout.androidaps.danars.encryption.BleEncryption
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
class DanaRSPacketHistoryBolus constructor( class DanaRSPacketHistoryBolus(
injector: HasAndroidInjector, injector: HasAndroidInjector,
from: Long = 0 from: Long = 0
) : DanaRSPacketHistory(injector, from) { ) : DanaRSPacketHistory(injector, from) {

View file

@ -152,4 +152,6 @@
<string name="diaconn_g8_errorcode_34">LGS status är redan AV.</string> <string name="diaconn_g8_errorcode_34">LGS status är redan AV.</string>
<string name="diaconn_g8_errorcode_35">\"Temp basal start\" ignoreras när temp basal redan är aktiv</string> <string name="diaconn_g8_errorcode_35">\"Temp basal start\" ignoreras när temp basal redan är aktiv</string>
<string name="diaconn_g8_errorcode_36">\"Temp basal stopp\" ignoreras när ingen temp basal är aktiv</string> <string name="diaconn_g8_errorcode_36">\"Temp basal stopp\" ignoreras när ingen temp basal är aktiv</string>
<string name="diaconn_g8_cloudsend_summary">Skicka pumploggar till Diaconns moln.</string>
<string name="diaconn_g8_cloudsend_title">Diaconn Molnsynkronisering</string>
</resources> </resources>

View file

@ -1,15 +1,107 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="eopatch">EOPatch2</string>
<string name="eopatch_shortname">EOP2</string>
<string name="eopatch_pump_description">Pumpintegration för EOPatch2 / GlucoMen Day</string>
<string name="category_alerts">Varningar</string> <string name="category_alerts">Varningar</string>
<string name="low_reservoir">Varningar för låg reservoar</string>
<string name="patch_expiration_reminders">Påminnelse om att byta patch</string>
<string name="patch_buzzer_reminders">Påminnelse om att byta patchvibrator</string>
<string name="time_format_a_h_mm">hh:mm</string>
<string name="eopatch_ble_status">BLE Status</string>
<string name="eopatch_serial_number">Serienummer</string>
<string name="eopatch_lot_number">Lot-nummer</string>
<string name="eopatch_wakeup_time">Start datum &amp; tid</string>
<string name="eopatch_expiration_time">Utgångstid</string>
<string name="eopatch_status">Status</string> <string name="eopatch_status">Status</string>
<string name="eopatch_base_basal_rate">Profilens basaldos</string> <string name="eopatch_base_basal_rate">Profilens basaldos</string>
<string name="eopatch_temp_basal_rate">Temp basaldos</string> <string name="eopatch_temp_basal_rate">Temp basaldos</string>
<string name="eopatch_total_delivered">Totalt levererat</string> <string name="eopatch_total_delivered">Totalt levererat</string>
<string name="invalid_basal_rate">Profilens basaldos är mindre än 0,05 U/h. EOPatch har en lägsta basaldos på 0.05U. Försök igen efter att profilen har ställts in till mer än så.</string>
<string name="no_profile_selected">Ingen profil vald. Välj en profil och försök igen.</string>
<string name="symbol_day">dag</string> <string name="symbol_day">dag</string>
<string name="symbol_plus">+</string>
<string name="symbol_minus">-</string>
<string name="time_30min">30 min</string>
<string name="time_1hr">1 tim</string>
<string name="time_1hr_30min">1 tim 30 min</string>
<string name="time_2hr">2 tim</string>
<string name="all_blank">\u0020</string>
<string name="patch_safe_deactivation_desc">För att byta pod måste den aktuella kasseras. All insulinleverans från den nuvarande podden kommer att stoppas.</string>
<string name="patch_discard_complete_title">Kassering av podden är slutförd.</string>
<string name="patch_discard_complete_desc">Podden har inaktiverats.\nDu kan nu ta bort den och kassera den.</string>
<string name="patch_change_confirm_bolus_is_active_desc">En bolus håller på att levereras. Är du säker på att du vill avbryta den för att kassera podden?</string>
<string name="patch_change_confirm_temp_basal_is_active_desc">En temp basal håller på att levereras. Vill du avbryta den och kassera podden?</string>
<string name="patch_change_confirm_bolus_and_temp_basal_are_active_desc">Både bolus och temp basal håller på att levereras. Är du säker på att du vill avbryta all insulintillförsel och kassera podden?</string>
<string name="patch_change_confirm_desc">Är du säker på att du vill kassera podden?</string>
<string name="patch_remaining_insulin">Återstående insulin</string>
<string name="patch_remaining_usage_period">Återstående tid</string>
<string name="patch_finish">Slutför</string> <string name="patch_finish">Slutför</string>
<string name="patch_forced_discard">Kassera</string>
<string name="patch_comm_error_during_discard_status">Kommunikationsfel under kassering av pod </string>
<string name="patch_comm_error_during_discard_desc">För normal avaktivering, tryck på \'Försök igen\'.\nFör ensidig avaktivering, tryck på \'Kassera\'.</string>
<string name="patch_comm_error_during_discard_desc_1">För normal inaktivering, tryck på \'Försök igen\'.</string>
<string name="patch_comm_error_during_discard_desc_2">För ensidig avaktivering, tryck på \'Kassera\'.</string>
<string name="patch_manually_turning_off_alarm_title">Att manuellt stänga av poddens larm</string>
<string name="patch_manually_turning_off_alarm_desc_1">Om podden avaktiveras ensidigt under ett kommunikationsfel, finns en risk att larmet från podden fortsätter.</string>
<string name="patch_manually_turning_off_alarm_desc_2">I detta fall kan du stänga av larmet så här:</string>
<string name="patch_manually_turning_off_alarm_step_1">1. Ta bort podden från kroppen och ta bort tejpen.</string>
<string name="patch_manually_turning_off_alarm_step_2">2. Använd ett gem och tryck in det hårt i hålet vid sidan av påfyllningsporten för insulin.</string>
<string name="patch_wake_up">Insulinpåfyllning</string>
<string name="patch_wake_up_step">1/6</string>
<string name="patch_step_desc_1">1.</string> <string name="patch_step_desc_1">1.</string>
<string name="patch_wake_up_desc_1">Fyll en ny pod med rumstempererat insulin. Kontrollera sprutans vinkel.</string>
<string name="patch_step_desc_2">2.</string>
<string name="patch_wake_up_desc_2">Vänta på 1 pip.</string>
<string name="patch_start_pairing">Påbörja parkoppling</string>
<string name="patch_connect_new">Parkoppling</string>
<string name="patch_connect_new_step">2/6</string>
<string name="patch_connect_new_desc">Den nya podden håller på att parkopplas.\nHåll din smarta enhet så nära podden som möjligt</string>
<string name="patch_remove_needle_cap">Förbered för att sätta fast podden</string>
<string name="patch_remove_needle_cap_step">3/6</string>
<string name="patch_remove_needle_cap_desc_1">Ta bort tejpen och tryck sedan på \'Nästa\'.</string>
<string name="patch_remove_needle_cap_desc_2">[Caution1] Om en nål sticker ut, tryck på \'Kassera\'.</string>
<string name="patch_remove_needle_cap_desc_3">[Caution2] Om podden är blöt eller smutsig eller om tejpen är ihopklistrad, tryck på \'Kassera\'.</string>
<string name="patch_remove_protection_tape">Sätta fast podden</string>
<string name="patch_remove_protection_tape_step">4/6</string>
<string name="patch_remove_protection_tape_desc_1">Rengör huden, låt torka och fäst sedan podden.</string>
<string name="patch_remove_protection_tape_desc_2">Kontrollera att den sitter som den ska och tryck sedan på \"Starta säkerhetskontroll\".</string>
<string name="patch_start_safety_check">Starta säkerhetskontroll</string>
<string name="patch_safety_check">Säkerhetskontroll…</string>
<string name="patch_safety_check_step">5/6</string>
<string name="patch_safety_check_desc_1">Det här steget tar ca 30 sekunder.</string>
<string name="patch_safety_check_desc_2">[Caution] Ta inte bort nålkontrollern innan säkerhetskontrollen är slutförd.</string>
<string name="patch_rotate_knob">Skjuter in nålen</string>
<string name="patch_rotate_knob_step">6/6</string>
<string name="patch_rotate_knob_desc_1">Vrid nålkontrollern mer än 100° för att skjuta in nålen och rotera sedan helt för att ta bort den</string>
<string name="patch_rotate_knob_desc_2">Lyssna efter 1 pip och tryck sedan på \"Nästa\".</string>
<string name="patch_rotate_knob_desc_2_needle_insertion_error">Lyssna efter 1 pip och tryck sedan på \"Nästa\".</string>
<string name="patch_basal_schedule">Podaktivering slutförd!</string>
<string name="patch_basal_schedule_desc_1">\'%1$s\' program har aktiverats.</string>
<string name="patch_basal_schedule_desc_2">Varnar dig när poddens livstid är på väg att ta slut.\nÄndra påminnelsetiden om det behövs.</string>
<string name="patch_expiration_reminder_setting_title">Påminnelse om att byta pod</string>
<string name="patch_activate_reminder_title">Påminnelse om podaktivering</string>
<string name="patch_activate_reminder_desc">Podaktiveringen har inte slutförts.\n Fortsätt.</string>
<string name="patch_communication_check">Kontrollera kommunikation med pod</string>
<string name="patch_communication_check_status_1">Kontrollerar kommunikation…</string>
<string name="patch_communication_check_helper_1">Flytta din smarta enhet närmare podden.</string>
<string name="patch_communication_check_helper_2">Vänligen flytta till en annan plats och försök igen.</string>
<string name="patch_communication_failed">Kommunikationsfel</string>
<string name="patch_communication_succeed">Kommunikation lyckades</string>
<string name="patch_communication_succeed_message">Ansluten till podden.</string>
<string name="patch_cancel_pairing">Avbryt parkoppling</string>
<string name="symbol_days">dagar</string> <string name="symbol_days">dagar</string>
<string name="all_dose_unit">&#160;U</string>
<string name="insulin_suspend_msg1">Vid avstängningen kommer den nuvarande leveransen av Bolus &amp; tillfällig basaldos att avbrytas. \n\nDos : %1$s U/hr\nÅterstående tid : %2$s\n&amp; Kvarvarande insulin att leverera: %3$.2f U</string>
<string name="insulin_suspend_msg2">Vid avstängning kommer den nuvarande leveransen av bolus att avbrytas. \n\nInsulin kvar att leverera : %1$.2f U</string>
<string name="insulin_suspend_msg3">Vid avstängningen kommer den nuvarande leveransen av tillfällig basaldos att avbrytas. \n\nDos : %1$s U/hr\nÅterstående tid : %2$s</string>
<string name="insulin_suspend_msg4">Insulinleveransen kommer att pausas.</string>
<string name="string_change_patch">Kassera/Byt pod</string>
<string name="string_activate_patch">Aktivera pod</string>
<string name="string_discard_patch">Kassera pod</string>
<string name="string_resume">Återuppta</string> <string name="string_resume">Återuppta</string>
<string name="discard">Kassera</string>
<string name="string_communication_check">Kommunikationskontroll</string>
<string name="string_suspend">Pausa</string> <string name="string_suspend">Pausa</string>
<string name="string_suspended">Pausad</string> <string name="string_suspended">Pausad</string>
<string name="string_running">Körs</string> <string name="string_running">Körs</string>
@ -17,8 +109,25 @@
<string name="confirm">Bekräfta</string> <string name="confirm">Bekräfta</string>
<string name="string_alarm">Larm</string> <string name="string_alarm">Larm</string>
<string name="string_connecting">Ansluter</string> <string name="string_connecting">Ansluter</string>
<string name="string_changing">Ändrar</string>
<string name="string_in_progress">Bearbetar</string>
<string name="retry">Försök igen</string> <string name="retry">Försök igen</string>
<string name="string_caution_not_remove_needle_cap">[Caution] Ta INTE bort kanylkåpan och den självhäftande undersidan tills vidare instruktioner ges.</string>
<string name="string_are_you_sure_to_discard_current_patch">Är du säker på att du vill kassera den nuvarande podden?</string>
<string name="string_unconfirmed_bolus_info_discard_confirm_message">På grund av obekräftad bolusinformation kan boluskalkylatorn inte användas förrän %s.\n\nÄr du säker på att du vill kassera den nuvarande Patchen?</string>
<string name="needle_insertion_error_1">Fel vid insättning av nål.</string>
<string name="needle_insertion_error_2">Kontrollera att riktningen på hålet som är kvar efter att ha vridit spaken är rak och tryck sedan på \'Försök igen\'.</string>
<string name="needle_insertion_error_3">Tryck på \'Kassera\' för att avaktivera pod.</string>
<string name="string_suspend_time_insulin_delivery_title">Basalavstängning</string>
<string name="string_resume_insulin_delivery_title">Återuppta insulinleverans</string>
<string name="string_resume_insulin_delivery_message">Slutet av insulinavstängning.\nTryck på \"Bekräfta\" för att återuppta leveransen av insulin.\n\n[Caution]\nInsulinleverans kommer inte att återupptas förrän du trycker på \"Bekräfta\".\nOm du inte trycker på \'Bekräfta\', kan du utveckla högt blodsocker.</string>
<string name="string_suspended_insulin_delivery_message">Insulinleverans är pausad.</string> <string name="string_suspended_insulin_delivery_message">Insulinleverans är pausad.</string>
<string name="string_resumed_insulin_delivery_message">Insulinleveransen har återupptagits.</string>
<string name="finish">Slutför</string> <string name="finish">Slutför</string>
<string name="string_temp_basal_remained_hhmm">återstående tid: %1$s:%2$s</string>
<string name="next">Nästa</string> <string name="next">Nästa</string>
<string name="patch_connection_fail">Försök igen efter kommunikationskontroll.</string>
<string name="string_pause_failed">Avstängning misslyckades.</string>
<string name="string_resume_failed">Återupptagande misslyckades.</string>
<string name="date_format_yyyy_m_d_e_a_hh_mm_comma">EEE d MMM yyyy hh:mm</string>
</resources> </resources>

View file

@ -1,2 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources></resources> <resources>
<string name="string_a002">Tom reservoar\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a003">Podden har gått ut\nDen har inaktiverats och insulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a004">Ocklusion upptäckt\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a005">Fel i uppstartstest\nPodden har inaktiverats. Byt pod nu.</string>
<string name="string_a007">Olämplig temperatur\nInsulinleverans eller processen för att aktivera ny pod avbryts. Undvik extrem temperatur nu.</string>
<string name="string_a016">Fel vid insättning av kanyl\nKotrollera vredets position och tryck \'Försök igen\'.</string>
<string name="string_a018">Batterifel\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a019">Batterifel\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a020">Aktiveringsfel\n\'Aktivera pod\'-processen har löpt ut. Tryck på \'Bekräfta\' för att inaktivera nuvarande pod. Byt pod nu.</string>
<string name="string_a022">Pod-fel\nDen har inaktiverats och insulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a023">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a034">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a041">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a042">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a043">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a044">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a106">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a107">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a108">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a116">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a117">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_a118">Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu.</string>
<string name="string_b000">Podden löper ut %s. Var redo att byta pod.</string>
<string name="string_b001">Dags att återuppta insulinleveransen\nTryck på \'Återuppta\'.</string>
<string name="string_b003">Låg reservoar\nByt pod snart.</string>
<string name="string_b005">Poddens livslängd har löpt ut\nByt pod nu.</string>
<string name="string_b006">Podden löper ut snart\nByt pod nu.</string>
<string name="string_b012">Ofullständig pod-aktivering\nSlutför \'Aktivera Pod\'-processen.</string>
<string name="string_b018">Pod-batteri lågt\nVar redo att byta pod.</string>
</resources>

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">Stav BLE</string> <string name="ble_status_label">Stav BLE</string>
<string name="last_connection_label">Naposledy připojeno</string> <string name="last_connection_label">Naposledy připojeno</string>
<string name="active_bolus_label">Aktivní bolus</string>
<string name="pump_state_label">Stav pumpy</string> <string name="pump_state_label">Stav pumpy</string>
<string name="active_alarms_label">Aktivní alarmy</string> <string name="active_alarms_label">Aktivní alarmy</string>
<string name="reservoir_level"> %.2f U</string> <string name="reservoir_level"> %.2f U</string>

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">Estado BLE</string> <string name="ble_status_label">Estado BLE</string>
<string name="last_connection_label">Última conexión</string> <string name="last_connection_label">Última conexión</string>
<string name="active_bolus_label">Bolo activo</string>
<string name="pump_state_label">Estado de la bomba</string> <string name="pump_state_label">Estado de la bomba</string>
<string name="active_alarms_label">Alarmas activas</string> <string name="active_alarms_label">Alarmas activas</string>
<string name="reservoir_level"> %.2f U</string> <string name="reservoir_level"> %.2f U</string>

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">État BT</string> <string name="ble_status_label">État BT</string>
<string name="last_connection_label">Dernière connexion</string> <string name="last_connection_label">Dernière connexion</string>
<string name="active_bolus_label">Bolus actif</string>
<string name="pump_state_label">État de la pompe</string> <string name="pump_state_label">État de la pompe</string>
<string name="active_alarms_label">Alarmes actives</string> <string name="active_alarms_label">Alarmes actives</string>
<string name="reservoir_level"> %.2f U</string> <string name="reservoir_level"> %.2f U</string>

View file

@ -2,6 +2,7 @@
<resources> <resources>
<!-- MedtrumPump --> <!-- MedtrumPump -->
<!-- overview fragment --> <!-- overview fragment -->
<string name="active_bolus_label">בולוס פעיל</string>
<!-- Alarm strings --> <!-- Alarm strings -->
<!-- wizard--> <!-- wizard-->
<!-- settings--> <!-- settings-->

View file

@ -9,10 +9,12 @@
<string name="pump_is_suspended">Pompa sustabdyta</string> <string name="pump_is_suspended">Pompa sustabdyta</string>
<string name="pump_is_suspended_hour_max">Pompa sustabdyta dėl viršyto valandos insulino limito</string> <string name="pump_is_suspended_hour_max">Pompa sustabdyta dėl viršyto valandos insulino limito</string>
<string name="pump_is_suspended_day_max">Pompa sustabdyta dėl viršyto paros insulino limito</string> <string name="pump_is_suspended_day_max">Pompa sustabdyta dėl viršyto paros insulino limito</string>
<string name="patch_not_active">Rezervuaras neaktyvus</string>
<string name="pump_setting_failed">Vartotojo nustatymai neįrašyti!</string> <string name="pump_setting_failed">Vartotojo nustatymai neįrašyti!</string>
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">BLE statusas</string> <string name="ble_status_label">BLE statusas</string>
<string name="last_connection_label">Pask. prijungimas</string> <string name="last_connection_label">Pask. prijungimas</string>
<string name="active_bolus_label">Aktyvus bolusas</string>
<string name="pump_state_label">Pompos būsena</string> <string name="pump_state_label">Pompos būsena</string>
<string name="active_alarms_label">Aktyvūs aliarmai</string> <string name="active_alarms_label">Aktyvūs aliarmai</string>
<string name="reservoir_level"> %.2f v</string> <string name="reservoir_level"> %.2f v</string>
@ -22,17 +24,45 @@
<string name="current_basal_rate"> %.2f v/val.</string> <string name="current_basal_rate"> %.2f v/val.</string>
<string name="pump_type_label">Pompos tipas</string> <string name="pump_type_label">Pompos tipas</string>
<string name="fw_version_label">FW versija</string> <string name="fw_version_label">FW versija</string>
<string name="patch_no_label">Rezerv. nr.</string>
<string name="patch_expiry_label">Rezerv. nebeveiks</string>
<string name="refresh_label">Atnaujinti</string> <string name="refresh_label">Atnaujinti</string>
<string name="reset_alarms_label">Atstatyti aliarmus</string> <string name="reset_alarms_label">Atstatyti aliarmus</string>
<string name="change_patch_label">Keisti rezerv.</string>
<string name="requested_by_user" comment="26 characters max for translation">Inicijuota naudotojo</string>
<string name="expiry_not_enabled">Neįjungta</string>
<!-- Alarm strings --> <!-- Alarm strings -->
<string name="alarm_pump_low_battery">Senka pompos baterija</string> <string name="alarm_pump_low_battery">Senka pompos baterija</string>
<string name="alarm_pump_low_reservoir">Senka rezervuaras</string> <string name="alarm_pump_low_reservoir">Senka rezervuaras</string>
<string name="alarm_pump_expires_soon">Pompa baigia darbą</string> <string name="alarm_pump_expires_soon">Pompa baigia darbą</string>
<string name="alarm_low_bg_suspended">Sustabdyta dėl žemos glikemijos</string>
<string name="alarm_low_bg_suspended2">Sustabdyta dėl žemos glikemijos 2</string>
<string name="alarm_auto_suspended">Autom. sustabdyta</string>
<string name="alarm_suspended">Sustabdyta</string> <string name="alarm_suspended">Sustabdyta</string>
<string name="alarm_paused">Pristabdyta</string> <string name="alarm_paused">Pristabdyta</string>
<string name="alarm_occlusion">Užsikimšimas</string> <string name="alarm_occlusion">Užsikimšimas</string>
<string name="alarm_expired">Baigė galioti</string> <string name="alarm_expired">Baigė galioti</string>
<string name="alarm_reservoir_empty">Rezervuaras tuščias</string>
<string name="alarm_patch_fault">Rezerv. klaida</string>
<string name="alarm_patch_fault2">Rezerv. klaida 2</string>
<!-- wizard--> <!-- wizard-->
<string name="step_prime">Pildyti</string>
<string name="step_priming">Pildoma</string>
<string name="step_priming_complete">Užpildyta</string>
<string name="step_attach">Prijungti rezervuarą</string>
<string name="step_activate">Aktyvuojama...</string>
<string name="step_activate_complete">Aktyvuota</string>
<string name="step_deactivate">Deaktyvuoti rezervuarą</string>
<string name="step_deactivating">Deaktyvuojama...</string>
<string name="step_deactivate_complete">Deaktyvuotas</string>
<string name="step_retry_activation">Aktyvuojama</string>
<string name="unexpected_state">Netikėta būsena: %1$s</string>
<string name="no_profile_selected">Nepasirinktas profilis. Pasirinkite profilį ir bandykite dar kartą.</string>
<string name="base_serial">Pompos pagrindo SN: %1$X</string>
<string name="note_min_70_units">Svarbu: būtina užpildyti bent 70 v.</string>
<string name="do_not_attach_to_body">Kol kas neprijunkite pompos prie kūno.</string>
<string name="deactivating_pump">Deaktyvuojama. Palaukite.</string>
<string name="retract_needle">Ištraukite adatą. Nuimkite pompą nuo kūno.</string>
<!-- settings--> <!-- settings-->
<string name="sn_input_title">Serijos numeris</string> <string name="sn_input_title">Serijos numeris</string>
<string name="sn_input_summary">Įveskite pompos pagrindo serijos numerį.</string> <string name="sn_input_summary">Įveskite pompos pagrindo serijos numerį.</string>

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">BLE Status</string> <string name="ble_status_label">BLE Status</string>
<string name="last_connection_label">Laatste verbinding</string> <string name="last_connection_label">Laatste verbinding</string>
<string name="active_bolus_label">Actieve bolus</string>
<string name="pump_state_label">Pomp status</string> <string name="pump_state_label">Pomp status</string>
<string name="active_alarms_label">Actieve alarmen</string> <string name="active_alarms_label">Actieve alarmen</string>
<string name="reservoir_level"> %.2f E</string> <string name="reservoir_level"> %.2f E</string>

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">Bluetooth Status</string> <string name="ble_status_label">Bluetooth Status</string>
<string name="last_connection_label">Siste tilkobling</string> <string name="last_connection_label">Siste tilkobling</string>
<string name="active_bolus_label">Aktiv bolus</string>
<string name="pump_state_label">Pumpestatus</string> <string name="pump_state_label">Pumpestatus</string>
<string name="active_alarms_label">Aktive alarmer</string> <string name="active_alarms_label">Aktive alarmer</string>
<string name="reservoir_level"> %.2f E</string> <string name="reservoir_level"> %.2f E</string>

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">Status Bluetooth Low Energy</string> <string name="ble_status_label">Status Bluetooth Low Energy</string>
<string name="last_connection_label">Ostatnie połączenie</string> <string name="last_connection_label">Ostatnie połączenie</string>
<string name="active_bolus_label">Aktywny bolus</string>
<string name="pump_state_label">Status pompy</string> <string name="pump_state_label">Status pompy</string>
<string name="active_alarms_label">Aktywne alarmy</string> <string name="active_alarms_label">Aktywne alarmy</string>
<string name="reservoir_level"> %.2f U</string> <string name="reservoir_level"> %.2f U</string>

View file

@ -2,6 +2,7 @@
<resources> <resources>
<!-- MedtrumPump --> <!-- MedtrumPump -->
<!-- overview fragment --> <!-- overview fragment -->
<string name="active_bolus_label">Bólus ativo</string>
<!-- Alarm strings --> <!-- Alarm strings -->
<!-- wizard--> <!-- wizard-->
<!-- settings--> <!-- settings-->

View file

@ -14,6 +14,7 @@
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">Stav BLE</string> <string name="ble_status_label">Stav BLE</string>
<string name="last_connection_label">Naposledy pripojené</string> <string name="last_connection_label">Naposledy pripojené</string>
<string name="active_bolus_label">Aktívny bolus</string>
<string name="pump_state_label">Stav pumpy</string> <string name="pump_state_label">Stav pumpy</string>
<string name="active_alarms_label">Aktívne alarmy</string> <string name="active_alarms_label">Aktívne alarmy</string>
<string name="reservoir_level"> %.2f JI</string> <string name="reservoir_level"> %.2f JI</string>

View file

@ -1,2 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string-array name="alarmSettings">
<item>Ljus, vibration och pip</item>
<item>Ljus och vibration</item>
<item>Ljus och pip</item>
<item>Ljus</item>
<item>Vibration och pip</item>
<item>Vibration</item>
<item>Pip</item>
<item>Ljudlös</item>
</string-array>
</resources>

View file

@ -1,9 +1,119 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- MedtrumPump --> <!-- MedtrumPump -->
<string name="medtrum">Medtrum</string>
<string name="medtrum_pump_shortname">MT</string>
<string name="medtrum_pump_description">Pumpintegration för Medtrum Nano</string>
<string name="medtrum_pump_setting">Inställningar för Medtrum-pump</string>
<string name="pump_error">Pumpfel: %1$s !! </string>
<string name="pump_is_suspended">Pumpen är pausad</string>
<string name="pump_is_suspended_hour_max">Pumpen är pausad på grund av att din maximala dos per timme är överskriden</string>
<string name="pump_is_suspended_day_max">Pumpen är pausad på grund av att din maximala dos per dygn är överskriden</string>
<string name="patch_not_active">Podden är inte aktiverad</string>
<string name="pump_setting_failed">Kunde inte spara användarinställningarna till pumpen!</string>
<!-- overview fragment --> <!-- overview fragment -->
<string name="ble_status_label">Bluetooth-status</string>
<string name="last_connection_label">Senast ansluten</string>
<string name="active_bolus_label">Aktiv bolus</string>
<string name="pump_state_label">Pumpstatus</string>
<string name="active_alarms_label">Aktiva larm</string>
<string name="reservoir_level"> %.2f U</string>
<string name="battery_voltage"> %.2f V</string>
<string name="basal_type_label">Basaltyp</string>
<string name="basal_rate_label">Basaldos</string>
<string name="current_basal_rate"> %.2f U/h</string>
<string name="pump_type_label">Pumptyp</string>
<string name="fw_version_label">FW-version</string>
<string name="patch_no_label">Patch-nr</string>
<string name="patch_expiry_label">Podden löper ut</string>
<string name="refresh_label">Uppdatera</string>
<string name="reset_alarms_label">Återställ larm</string>
<string name="change_patch_label">Byt pod</string>
<string name="requested_by_user" comment="26 characters max for translation">Begärt av användare</string>
<string name="expiry_not_enabled">Ej aktiverad</string>
<!-- Alarm strings --> <!-- Alarm strings -->
<string name="alarm_none">Ingen</string>
<string name="alarm_pump_low_battery">Låg batterinivå i pumpen</string>
<string name="alarm_pump_low_reservoir">Låg nivå pumpreservoar</string>
<string name="alarm_pump_expires_soon">Pump löper ut snart</string>
<string name="alarm_low_bg_suspended">Pausad pga lågt BG</string>
<string name="alarm_low_bg_suspended2">Pausad pga lågt BG 2</string>
<string name="alarm_auto_suspended">Pausad automatiskt</string>
<string name="alarm_hourly_max_suspended">pausad pga max timdos</string>
<string name="alarm_daily_max_suspended">pausad pga max dagsdos</string>
<string name="alarm_suspended">Pausad</string>
<string name="alarm_paused">Pausad</string>
<string name="alarm_occlusion">Ocklusion</string>
<string name="alarm_expired">Utgången</string>
<string name="alarm_reservoir_empty">Reservoar tom</string>
<string name="alarm_patch_fault">Poddfel</string>
<string name="alarm_patch_fault2">Poddfel 2</string>
<string name="alarm_base_fault">Basfel</string>
<string name="alarm_battery_out">Batteri urladdat</string>
<string name="alarm_no_calibration">Ingen kalibrering</string>
<string name="pump_time_update_failed">Det gick inte att uppdatera pumpens tidszon, bekräfta meddelande och uppdatera manuellt.</string>
<!-- wizard--> <!-- wizard-->
<string name="retry">Försök igen</string>
<string name="next">Nästa</string>
<string name="discard">Kassera</string>
<string name="step_prepare_patch">Aktivera Pod</string>
<string name="step_prepare_patch_connect">Anslut och fyll</string>
<string name="step_prime">Förfyll</string>
<string name="step_priming">Förfyller</string>
<string name="step_priming_complete">Förfyllning slutförd</string>
<string name="step_attach">Sätt fast pod</string>
<string name="step_activate">Aktiverar...</string>
<string name="step_activate_complete">Aktivering slutförd</string>
<string name="step_deactivate">Inaktivera pod</string>
<string name="step_deactivating">Inaktiverar...</string>
<string name="step_deactivate_complete">Podden inaktiverad</string>
<string name="step_retry_activation">Aktivering pågår</string>
<string name="unexpected_state">Oväntat tillstånd: %1$s</string>
<string name="no_profile_selected">Ingen profil vald. Välj en profil och försök igen.</string>
<string name="base_serial">Pumpbasens serienummer: %1$X</string>
<string name="patch_begin_activation">Ingen aktiv pod. Tryck på <b>Nästa</b> för att påbörja aktiveringsprocessen.</string>
<string name="patch_not_active_note">Pumpbas bör inte anslutas till podden förrän nästa steg!</string>
<string name="connect_pump_base">Anslut pumpbasen till en ny pod, ta bort kvarvarande luft och fyll med insulin, tryck sedan på <b>Nästa</b>.</string>
<string name="note_min_70_units">Obs: Minst 70 enheter krävs för aktivering.</string>
<string name="do_not_attach_to_body">Fäst inte podden på kroppen ännu.</string>
<string name="half_press_needle">Halvtryck på nålknappen. Tryck sedan på <b>Nästa</b> för att börja prima.</string>
<string name="wait_for_priming">Vänta på att förfyllning ska slutföras.</string>
<string name="priming_error">Det gick inte att förfylla, tryck på <b>Försök igen</b> för att försöka igen.</string>
<string name="press_next">Tryck på <b>Nästa</b> för att fortsätta.</string>
<string name="press_next_to_start_activation">Tryck på <b>Nästa</b> för att starta aktivering.</string>
<string name="remove_safety_lock">Ta bort säkerhetslåset. Fäst pumpen på kroppen. Tryck på nålknappen.</string>
<string name="activating_pump">Aktiverar pump och ställer in basaldos. Vänligen vänta.</string>
<string name="activating_error">Det gick inte att aktivera, tryck på <b>Försök igen</b> för att försöka igen.</string>
<string name="activating_complete">Ny pod aktiverad. %.2f enheter återstår.</string>
<string name="press_OK_to_return">Tryck på <b>OK</b> för att återgå till huvudskärmen.</string>
<string name="deactivate_sure">Är du säker på att du vill inaktivera nuvarande pod?</string>
<string name="cancel_sure">Är du säker på att du vill avbryta aktiveringen?</string>
<string name="medtrum_deactivate_pump_confirm">Är du säker? Denna åtgärd kan inte ångras!!</string>
<string name="press_next_or_cancel">Tryck på <b>Nästa</b> för att inaktivera eller <b>Avbryt</b> för att återgå till huvudskärmen.</string>
<string name="deactivating_pump">Inaktiverar patch. Vänligen vänta.</string>
<string name="deactivating_error">Det gick inte att inaktivera, tryck på <b>Kassera</b> för att glömma patchen.</string>
<string name="retract_needle">Dra tillbaka nålen. Ta bort podden från kroppen.</string>
<string name="remove_base_discard_patch">Ta bort pumpbasen och kassera den använda podden på lämpligt sätt.</string>
<string name="press_next_or_OK">Tryck på <b>OK</b> för att återgå till huvudskärmen. Tryck på <b>Nästa</b> för att starta aktiveringen av ny pod.</string>
<string name="activation_in_progress">Hoppsan! Något gick fel, det verkar som att en aktivering redan pågår.</string>
<string name="press_retry_or_discard">Tryck på <b>Nästa</b> för att återuppta aktiveringen eller <b>Kassera</b> för att återställa aktiveringsstatus.</string>
<string name="reading_activation_status">Vänligen vänta, läser aktiveringsstatus från pump.</string>
<!-- settings--> <!-- settings-->
<string name="sn_input_title">Serienummer</string>
<string name="sn_input_summary">Ange serienumret för pumpbasen.</string>
<string name="sn_input_invalid">Ogiltigt serienummer!</string>
<string name="pump_unsupported">Pump otestad: %1$d! Kontakta oss på Discord eller Github för support</string>
<string name="alarm_setting_title">Larminställningar</string>
<string name="alarm_setting_summary">Ställ in dina föredragna larminställningar för pumpen.</string>
<string name="patch_expiration_title">Poddens utgångsdatum</string>
<string name="patch_expiration_summary">När den är aktiverad, kommer podden att löpa ut efter 3 dagar, med en tidsfrist på 8 timmar efter det.</string>
<string name="hourly_max_insulin_title">Maximalt insulin per timme</string>
<string name="hourly_max_insulin_summary">Ange maximalt tillåtna insulin-enheter per timme. Om den överskrids kommer pumpen att pausas.</string>
<string name="daily_max_insulin_title">Maximal daglig insulin-dos</string>
<string name="daily_max_insulin_summary">Ange maximalt tillåtna insulin-enheter per dag. Om den överskrids kommer pumpen att pausas.</string>
<!-- treatment state--> <!-- treatment state-->
<string name="getting_pump_status">Hämtar pumpstatus</string>
<string name="getting_bolus_status">Hämtar bolus-status</string>
<string name="getting_temp_basal_status">Hämtar status för tillfällig basal</string>
<string name="setting_pump_settings">Ställer in användaralternativ</string>
</resources> </resources>

Some files were not shown because too many files have changed in this diff Show more