This commit is contained in:
Milos Kozak 2023-11-29 14:30:13 +01:00
commit 6e94f7ab2d
21 changed files with 155 additions and 33 deletions

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="alert_r1_title">Дать болюс</string> <string name="alert_r1_title">Ввести болюс</string>
<string name="alert_r2_title">Недоставленный болюс</string> <string name="alert_r2_title">Несостоявшийся болюс</string>
<string name="alert_r3_title">Будильник</string> <string name="alert_r3_title">Будильник</string>
<string name="alert_r4_title">Замените инфузионный набор</string> <string name="alert_r4_title">Замените инфузионный набор</string>
<string name="alert_r7_title">TBR завершен</string> <string name="alert_r7_title">TBR завершен</string>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="dynisf_adjust_sensitivity">Habilitar la relación de sensibilidad basada en TDD para modificar las basales y el objetivo de glucosa</string> <string name="dynisf_adjust_sensitivity">Habilitar la relación de sensibilidad basada en TDD para modificar las basales y el objetivo de glucosa</string>
<string name="dynisf_adjust_sensitivity_summary">Utiliza las últimas 24h TDD/7D TDD para calcular el ratio de sensibilidad utilizado para aumentar o disminuir la tasa basal, y también ajustar el objetivo de glucosa si estas opciones están activadas, de la misma forma que lo hace Autosens. Se recomienda comenzar con esta opción desactivada</string> <string name="dynisf_adjust_sensitivity_summary">Utiliza las últimas 24h TDD/7D TDD para calcular el factor de sensibilidad utilizado para aumentar o disminuir la tasa basal, y también ajusta el objetivo de glucosa si estas opciones están activadas, de la misma forma que lo hace Autosens. Se recomienda comenzar con esta opción desactivada</string>
<string name="DynISFAdjust_title" formatted="false">Factor de ajuste de ISF Dinámico %</string> <string name="DynISFAdjust_title" formatted="false">Factor de ajuste de ISF Dinámico %</string>
<string name="DynISFAdjust_summary" formatted="false">Factor de ajuste para ISF Dinámico. Establezca más de 100% para una corrección más agresiva, y menos de 100% para correcciones más susves.</string> <string name="DynISFAdjust_summary" formatted="false">Factor de ajuste para ISF Dinámico. Establezca más de 100% para una corrección más agresiva, y menos de 100% para correcciones más susves.</string>
<string name="high_temptarget_raises_sensitivity_title">Objetivo temporal alto aumenta la sensibilidad</string> <string name="high_temptarget_raises_sensitivity_title">Objetivo temporal alto aumenta la sensibilidad</string>

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="dynisf_adjust_sensitivity">Activer le ratio de sensibilité basé sur DTQ pour la modification du basal et la cible des glycémies</string>
<string name="dynisf_adjust_sensitivity_summary">Utilise le dernier DTQ 24h/DTQ 7j pour calculer le ratio de sensibilité utilisé pour augmenter ou diminuer le taux de basal et ajuster aussi la cible de glycémie si ces options sont activées, de la même manière que Autosens. Il est recommandé de commencer avec cette option désactivée</string>
<string name="DynISFAdjust_title" formatted="false">Facteur d\'ajustement Si dynamique %</string> <string name="DynISFAdjust_title" formatted="false">Facteur d\'ajustement Si dynamique %</string>
<string name="DynISFAdjust_summary" formatted="false">Facteur d\'ajustement pour Si dynamique. Définissez plus de 100 % pour des corrections plus agressives et moins de 100 % pour des corrections moins agressives.</string> <string name="DynISFAdjust_summary" formatted="false">Facteur d\'ajustement pour Si dynamique. Définissez plus de 100 % pour des corrections plus agressives et moins de 100 % pour des corrections moins agressives.</string>
<string name="high_temptarget_raises_sensitivity_title">Cible temp. haute élève la sensibilité</string> <string name="high_temptarget_raises_sensitivity_title">Cible temp. haute élève la sensibilité</string>

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="dynisf_adjust_sensitivity">אפשר יחס רגישות המבוסס על המינון היומי הכולל לשינוי מינון בזאלי וערכי מטרה</string>
<string name="dynisf_adjust_sensitivity_summary">השתמש במינון יומי כולל של 24 שעות\\7 ימים האחרונים כדי לחשב יחס רגישות לצורך העלאה או הורדה של המינון הבזאלי ובנוסף להתאים את ערך המטרה אם אפשרויות אלו מופעלותת באופן דומה ל-Autosense. מומלץ להתחיל כשאפשרות זו כבויה</string>
<string name="DynISFAdjust_title" formatted="false">כיוונון פקטור הרגישות הדינאמית %</string> <string name="DynISFAdjust_title" formatted="false">כיוונון פקטור הרגישות הדינאמית %</string>
<string name="DynISFAdjust_summary" formatted="false">כיוונון פקטור הרגישות הדינאמית. הגדירו יותר מ-100% לקבלת תיקונים אגרסיביים יותר ופחות מ-100% לקבלת תיקונים עדינים יותר.</string> <string name="DynISFAdjust_summary" formatted="false">כיוונון פקטור הרגישות הדינאמית. הגדירו יותר מ-100% לקבלת תיקונים אגרסיביים יותר ופחות מ-100% לקבלת תיקונים עדינים יותר.</string>
<string name="high_temptarget_raises_sensitivity_title">ערך מטרה זמני גבוה מעלה את הרגישות</string> <string name="high_temptarget_raises_sensitivity_title">ערך מטרה זמני גבוה מעלה את הרגישות</string>

View file

@ -10,9 +10,9 @@
<string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[Понизить чувствительность для temptargets > = 100]]></string> <string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[Понизить чувствительность для temptargets > = 100]]></string>
<string name="openapssmb">OpenAPS СМБ</string> <string name="openapssmb">OpenAPS СМБ</string>
<string name="openaps_smb_dynamic_isf">Динамический ISF</string> <string name="openaps_smb_dynamic_isf">Динамический ISF</string>
<string name="smb_interval_summary">Как часто СМБ будут подаваться в минутах</string> <string name="smb_interval_summary">Как часто SMB будут подаваться в минутах</string>
<string name="resistance_lowers_target_title">Сопротивляемость понижает цель</string> <string name="resistance_lowers_target_title">Резистентность понижает цель</string>
<string name="resistance_lowers_target_summary">При обнаружении сопротивляемости целевой уровень гликемии понижается</string> <string name="resistance_lowers_target_summary">При обнаружении резистентности целевой уровень гликемии понижается</string>
<string name="sensitivity_raises_target_title">Чувствительность поднимает цель</string> <string name="sensitivity_raises_target_title">Чувствительность поднимает цель</string>
<string name="sensitivity_raises_target_summary">При обнаружении чувствительности целевой уровень глюкозы повышается</string> <string name="sensitivity_raises_target_summary">При обнаружении чувствительности целевой уровень глюкозы повышается</string>
<string name="openapsma_disabled">модуль не активен</string> <string name="openapsma_disabled">модуль не активен</string>

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="dynisf_adjust_sensitivity">Povoliť, aby citlivosť založená na CDD mohla upravovať bazál a cieľovú glykémiu</string>
<string name="dynisf_adjust_sensitivity_summary">K výpočtu citlivosti použitej pre zvýšenie, alebo zníženie bazálu sa používa CDD za posledných 24 h / 7 D a tiež upravuje cieľovú glykémiu, pokiaľ je táto možnosť povolená, rovnako, ako to robí Autosens. Túto možnosť je doporučené na začiatok vypnúť.</string>
<string name="DynISFAdjust_title" formatted="false">Korekčný faktor pre Dynamickú ISF v %</string> <string name="DynISFAdjust_title" formatted="false">Korekčný faktor pre Dynamickú ISF v %</string>
<string name="DynISFAdjust_summary" formatted="false">Korekčný faktor pre dynamickú ISF. Pre agresivnejšie korekčné dávky nastavte hodnoty väčšie ako 100%, pre menej agresívne korekcie, menšie než 100%.</string> <string name="DynISFAdjust_summary" formatted="false">Korekčný faktor pre dynamickú ISF. Pre agresivnejšie korekčné dávky nastavte hodnoty väčšie ako 100%, pre menej agresívne korekcie, menšie než 100%.</string>
<string name="high_temptarget_raises_sensitivity_title">Vysoký dočasný cieľ zvýši citlivosť</string> <string name="high_temptarget_raises_sensitivity_title">Vysoký dočasný cieľ zvýši citlivosť</string>

View file

@ -35,7 +35,7 @@
<string name="diawarning">Напоминание: новые профили инсулина требуют как минимум 5 часов длительности действия DIA. 5-6 часовая DIA эквивалентна трехчасовой на старых профилях.</string> <string name="diawarning">Напоминание: новые профили инсулина требуют как минимум 5 часов длительности действия DIA. 5-6 часовая DIA эквивалентна трехчасовой на старых профилях.</string>
<string name="profile">Профиль</string> <string name="profile">Профиль</string>
<string name="doprofileswitch">Переключить профиль</string> <string name="doprofileswitch">Переключить профиль</string>
<string name="exitwizard">Пропустить Мастер установки</string> <string name="exitwizard">Пропустить Мастер настройки</string>
<string name="setupwizard_loop_description">Нажмите на кнопку ниже, чтобы AAPS мог предложить/внести изменения в базал</string> <string name="setupwizard_loop_description">Нажмите на кнопку ниже, чтобы AAPS мог предложить/внести изменения в базал</string>
<string name="setupwizard_sensitivity_description">Плагин чувствительности Sensitivity применяется для определения чувствительности к инсулину и вычисления активных углеводов COB. Дополнительная информация:</string> <string name="setupwizard_sensitivity_description">Плагин чувствительности Sensitivity применяется для определения чувствительности к инсулину и вычисления активных углеводов COB. Дополнительная информация:</string>
<string name="setupwizard_sensitivity_url">https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html</string> <string name="setupwizard_sensitivity_url">https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html</string>

View file

@ -16,7 +16,7 @@
<string name="version_expire">Versjon %1$s utløper den %2$s</string> <string name="version_expire">Versjon %1$s utløper den %2$s</string>
<!-- Signature verifier --> <!-- Signature verifier -->
<!-- BG Quality --> <!-- BG Quality -->
<string name="recalculated_data_used">Bruker rekalkulerte data</string> <string name="recalculated_data_used">Rekalkulerte data benyttes fordi noe BS-data mangler eller at BS ankommer på et ikke-forventet tidspunkt. Vil nullstille seg etter ca 24 timer. Ingen handling kreves</string>
<string name="bg_too_close">BS for nær:\n%1$s\n%2$s</string> <string name="bg_too_close">BS for nær:\n%1$s\n%2$s</string>
<string name="a11y_bg_quality_recalculated">beregnet på nytt</string> <string name="a11y_bg_quality_recalculated">beregnet på nytt</string>
<string name="a11y_bg_quality_doubles">doble registreringer</string> <string name="a11y_bg_quality_doubles">doble registreringer</string>

View file

@ -211,7 +211,7 @@
<string name="change_your_input">Endre dine inndata!</string> <string name="change_your_input">Endre dine inndata!</string>
<string name="openaps">OpenAPS</string> <string name="openaps">OpenAPS</string>
<string name="uploader">Opplaster-batteri</string> <string name="uploader">Opplaster-batteri</string>
<string name="data_status">BS data status</string> <string name="data_status">Status BS-data</string>
<string name="quickwizard_settings">Innstillinger for hurtigknapp</string> <string name="quickwizard_settings">Innstillinger for hurtigknapp</string>
<string name="keep_screen_on_title">Hold skjermen påslått</string> <string name="keep_screen_on_title">Hold skjermen påslått</string>
<string name="keep_screen_on_summary">Forhindre Android fra å slå av skjermen. Mobilen vil bruke mye batteri hvis den ikke kobles til strømledning.</string> <string name="keep_screen_on_summary">Forhindre Android fra å slå av skjermen. Mobilen vil bruke mye batteri hvis den ikke kobles til strømledning.</string>

View file

@ -2,9 +2,9 @@
<resources> <resources>
<string name="smoothing_shortname">UTJEVNING</string> <string name="smoothing_shortname">UTJEVNING</string>
<string name="exponential_smoothing_name">Eksponentiell utjevning</string> <string name="exponential_smoothing_name">Eksponentiell utjevning</string>
<string name="description_exponential_smoothing">"Andre ordens algoritme for eksponentiell utjevning"</string> <string name="description_exponential_smoothing">"Algoritme for eksponentiell utjevning, nyeste BS-verdi påvirkes"</string>
<string name="avg_smoothing_name">Gjennomsnittlig utjevning</string> <string name="avg_smoothing_name">Gjennomsnittlig utjevning</string>
<string name="description_avg_smoothing">"Gjennomsnittlig utjevnings-algoritme, nyeste verdi påvirkes ikke"</string> <string name="description_avg_smoothing">"Algoritme for gjennomsnittlig utjevning, nyeste BS-verdi påvirkes ikke. Kan minne om BYODA G6 sin utjevningsalgoritme"</string>
<string name="no_smoothing_name">Ingen utjevning</string> <string name="no_smoothing_name">Ingen utjevning</string>
<string name="description_no_smoothing">"Ingen utjevning utføres på motatte blodsukkerverdier. Bruk dette valget når du allerede har filtrerte data, f.eks. fra BYODA G6."</string> <string name="description_no_smoothing">"Ingen utjevning utføres på mottatte blodsukkerverdier. Bruk dette valget når du allerede har filtrerte data, f.eks. fra BYODA G6."</string>
</resources> </resources>

View file

@ -14,10 +14,14 @@ import app.aaps.core.interfaces.rx.events.EventPreferenceChange
import app.aaps.core.interfaces.sharedPreferences.SP import app.aaps.core.interfaces.sharedPreferences.SP
import app.aaps.database.entities.GlucoseValue import app.aaps.database.entities.GlucoseValue
import app.aaps.plugins.sync.R import app.aaps.plugins.sync.R
import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import java.math.BigDecimal
import java.math.MathContext
import java.math.RoundingMode
import java.net.SocketAddress import java.net.SocketAddress
import java.net.URI import java.net.URI
import java.time.Clock import java.time.Clock
@ -96,6 +100,7 @@ class GarminPlugin @Inject constructor(
registerEndpoint("/get", ::onGetBloodGlucose) registerEndpoint("/get", ::onGetBloodGlucose)
registerEndpoint("/carbs", ::onPostCarbs) registerEndpoint("/carbs", ::onPostCarbs)
registerEndpoint("/connect", ::onConnectPump) registerEndpoint("/connect", ::onConnectPump)
registerEndpoint("/sgv.json", ::onSgv)
} }
} else if (server != null) { } else if (server != null) {
aapsLogger.info(LTag.GARMIN, "stopping HTTP server") aapsLogger.info(LTag.GARMIN, "stopping HTTP server")
@ -277,4 +282,54 @@ class GarminPlugin @Inject constructor(
jo.addProperty("connected", loopHub.isConnected) jo.addProperty("connected", loopHub.isConnected)
return jo.toString() return jo.toString()
} }
private fun glucoseSlopeMgDlPerMilli(glucose1: GlucoseValue, glucose2: GlucoseValue): Double {
return (glucose2.value - glucose1.value) / (glucose2.timestamp - glucose1.timestamp)
}
/** Returns glucose values in Nightscout/Xdrip format. */
@VisibleForTesting
@Suppress("UNUSED_PARAMETER")
fun onSgv(call: SocketAddress, uri: URI, requestBody: String?): CharSequence {
val count = getQueryParameter(uri,"count", 24L)
.toInt().coerceAtMost(1000).coerceAtLeast(1)
val briefMode = getQueryParameter(uri, "brief_mode", false)
// Guess a start time to get [count+1] readings. This is a heuristic that only works if we get readings
// every 5 minutes and we're not missing readings. We truncate in case we get more readings but we'll
// get less, e.g., in case we're missing readings for the last half hour. We get one extra reading,
// to compute the glucose delta.
val from = clock.instant().minus(Duration.ofMinutes(5L * (count + 1)))
val glucoseValues = loopHub.getGlucoseValues(from, false)
val joa = JsonArray()
for (i in 0 until count.coerceAtMost(glucoseValues.size)) {
val jo = JsonObject()
val glucose = glucoseValues[i]
if (!briefMode) {
jo.addProperty("_id", glucose.id.toString())
jo.addProperty("device", glucose.sourceSensor.toString())
val timestamp = Instant.ofEpochMilli(glucose.timestamp)
jo.addProperty("deviceString", timestamp.toString())
jo.addProperty("sysTime", timestamp.toString())
glucose.raw?.let { raw -> jo.addProperty("unfiltered", raw) }
}
jo.addProperty("date", glucose.timestamp)
jo.addProperty("sgv", glucose.value.roundToInt())
if (i + 1 < glucoseValues.size) {
// Compute the 5 minute delta.
val delta = 300_000.0 * glucoseSlopeMgDlPerMilli(glucoseValues[i + 1], glucose)
jo.addProperty("delta", BigDecimal(delta, MathContext(3, RoundingMode.HALF_UP)))
}
jo.addProperty("direction", glucose.trendArrow.text)
glucose.noise?.let { n -> jo.addProperty("noise", n) }
if (i == 0) {
when (loopHub.glucoseUnit) {
GlucoseUnit.MGDL -> jo.addProperty("units_hint", "mgdl")
GlucoseUnit.MMOL -> jo.addProperty("units_hint", "mmol")
}
}
joa.add(jo)
}
return joa.toString()
}
} }

View file

@ -128,7 +128,7 @@
<string name="description_wear">Supervisar y controlar AAPS usando un reloj WearOS</string> <string name="description_wear">Supervisar y controlar AAPS usando un reloj WearOS</string>
<string name="no_watch_connected">(Ningún reloj conectado)</string> <string name="no_watch_connected">(Ningún reloj conectado)</string>
<string name="pump_status">Estado de la bomba de insulina</string> <string name="pump_status">Estado de la bomba de insulina</string>
<string name="loop_status">Estado del lazo</string> <string name="loop_status">Estado del bucle</string>
<string name="wizard_result">Calc. Asistente:\nInsulina: %1$.2fU\nCarbohidratos: %2$dg</string> <string name="wizard_result">Calc. Asistente:\nInsulina: %1$.2fU\nCarbohidratos: %2$dg</string>
<string name="quick_wizard_not_available">El asistente rápido seleccionado ya no está disponible, por favor actualice su tarjeta</string> <string name="quick_wizard_not_available">El asistente rápido seleccionado ya no está disponible, por favor actualice su tarjeta</string>
<string name="quick_wizard_message">Asistente Rápido: %1$s\nInsulina: %2$.2fU\nCarbohidratos: %3$dg</string> <string name="quick_wizard_message">Asistente Rápido: %1$s\nInsulina: %2$.2fU\nCarbohidratos: %3$dg</string>

View file

@ -17,6 +17,7 @@
<string name="description_ns_client_v3">Synchronise vos données avec Nightscout en utilisant l\'API v3</string> <string name="description_ns_client_v3">Synchronise vos données avec Nightscout en utilisant l\'API v3</string>
<string name="blocked_by_charging">Bloqué par les options de recharge</string> <string name="blocked_by_charging">Bloqué par les options de recharge</string>
<string name="blocked_by_connectivity">Bloqué par les options de connectivité</string> <string name="blocked_by_connectivity">Bloqué par les options de connectivité</string>
<string name="no_connectivity">Aucune connectivité</string>
<string name="unsupported_ns_version">Version de Nightscout non supportée</string> <string name="unsupported_ns_version">Version de Nightscout non supportée</string>
<string name="openaps_short">OAPS</string> <string name="openaps_short">OAPS</string>
<string name="uploader_short">UPLD</string> <string name="uploader_short">UPLD</string>

View file

@ -17,6 +17,7 @@
<string name="description_ns_client_v3">Synchronizuje vaše dáta s Nightscoutom pomocou v3 API</string> <string name="description_ns_client_v3">Synchronizuje vaše dáta s Nightscoutom pomocou v3 API</string>
<string name="blocked_by_charging">Zablokované možnosti nabíjania</string> <string name="blocked_by_charging">Zablokované možnosti nabíjania</string>
<string name="blocked_by_connectivity">Zablokované možnosti pripojenia</string> <string name="blocked_by_connectivity">Zablokované možnosti pripojenia</string>
<string name="no_connectivity">Žiadne pripojenie</string>
<string name="unsupported_ns_version">Nepodporovaná verzia Nighscoutu</string> <string name="unsupported_ns_version">Nepodporovaná verzia Nighscoutu</string>
<string name="openaps_short">OAPS</string> <string name="openaps_short">OAPS</string>
<string name="uploader_short">UPLD</string> <string name="uploader_short">UPLD</string>

View file

@ -21,6 +21,10 @@ import org.mockito.Mockito.times
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.atLeastOnce
import org.mockito.kotlin.eq
import org.mockito.kotlin.whenever
import java.net.SocketAddress import java.net.SocketAddress
import java.net.URI import java.net.URI
import java.time.Clock import java.time.Clock
@ -28,6 +32,7 @@ import java.time.Instant
import java.time.ZoneId import java.time.ZoneId
import java.time.temporal.ChronoUnit import java.time.temporal.ChronoUnit
import java.util.concurrent.locks.Condition import java.util.concurrent.locks.Condition
import kotlin.ranges.LongProgression.Companion.fromClosedRange
class GarminPluginTest: TestBase() { class GarminPluginTest: TestBase() {
private lateinit var gp: GarminPlugin private lateinit var gp: GarminPlugin
@ -71,8 +76,9 @@ class GarminPluginTest: TestBase() {
"device" to "Test_Device") "device" to "Test_Device")
private fun createGlucoseValue(timestamp: Instant, value: Double = 93.0) = GlucoseValue( private fun createGlucoseValue(timestamp: Instant, value: Double = 93.0) = GlucoseValue(
id = 10 * timestamp.toEpochMilli(),
timestamp = timestamp.toEpochMilli(), raw = 90.0, value = value, timestamp = timestamp.toEpochMilli(), raw = 90.0, value = value,
trendArrow = GlucoseValue.TrendArrow.FLAT, noise = null, trendArrow = GlucoseValue.TrendArrow.FLAT, noise = 4.5,
sourceSensor = GlucoseValue.SourceSensor.RANDOM sourceSensor = GlucoseValue.SourceSensor.RANDOM
) )
@ -205,4 +211,56 @@ class GarminPluginTest: TestBase() {
verify(loopHub).connectPump() verify(loopHub).connectPump()
verify(loopHub).isConnected verify(loopHub).isConnected
} }
@Test
fun onSgv_NoGlucose() {
whenever(loopHub.glucoseUnit).thenReturn(GlucoseUnit.MMOL)
whenever(loopHub.getGlucoseValues(any(), eq(false))).thenReturn(emptyList())
assertEquals("[]", gp.onSgv(mock(), createUri(mapOf()), null))
verify(loopHub).getGlucoseValues(clock.instant().minusSeconds(25L * 300L), false)
}
@Test
fun onSgv_NoDelta() {
whenever(loopHub.glucoseUnit).thenReturn(GlucoseUnit.MMOL)
whenever(loopHub.getGlucoseValues(any(), eq(false))).thenReturn(
listOf(createGlucoseValue(
clock.instant().minusSeconds(100L), 99.3)))
assertEquals(
"""[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol"}]""",
gp.onSgv(mock(), createUri(mapOf()), null))
verify(loopHub).getGlucoseValues(clock.instant().minusSeconds(25L * 300L), false)
verify(loopHub).glucoseUnit
}
@Test
fun onSgv() {
whenever(loopHub.glucoseUnit).thenReturn(GlucoseUnit.MMOL)
whenever(loopHub.getGlucoseValues(any(), eq(false))).thenAnswer { i ->
val from = i.getArgument<Instant>(0)
fromClosedRange(from.toEpochMilli(), clock.instant().toEpochMilli(), 300_000L)
.map(Instant::ofEpochMilli)
.mapIndexed { idx, ts -> createGlucoseValue(ts, 100.0+(10 * idx)) }.reversed()}
assertEquals(
"""[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol"}]""",
gp.onSgv(mock(), createUri(mapOf("count" to "1")), null))
verify(loopHub).getGlucoseValues(
clock.instant().minusSeconds(600L), false)
assertEquals(
"""[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol"},""" +
"""{"_id":"-2900000","device":"RANDOM","deviceString":"1969-12-31T23:55:10Z","sysTime":"1969-12-31T23:55:10Z","unfiltered":90.0,"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""",
gp.onSgv(mock(), createUri(mapOf("count" to "2")), null))
verify(loopHub).getGlucoseValues(
clock.instant().minusSeconds(900L), false)
assertEquals(
"""[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol"},""" +
"""{"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""",
gp.onSgv(mock(), createUri(mapOf("count" to "2", "brief_mode" to "true")), null))
verify(loopHub, times(2)).getGlucoseValues(
clock.instant().minusSeconds(900L), false)
verify(loopHub, atLeastOnce()).glucoseUnit
}
} }

View file

@ -28,23 +28,23 @@
<string name="combo_reservoir_normal">Нормальный</string> <string name="combo_reservoir_normal">Нормальный</string>
<string name="combo_notification_check_time_date">Необходимо обновить часы помпы</string> <string name="combo_notification_check_time_date">Необходимо обновить часы помпы</string>
<string name="combo_pump_tbr_cancelled_warrning">Предупреждение об отмене скорости временного базала подтверждено</string> <string name="combo_pump_tbr_cancelled_warrning">Предупреждение об отмене скорости временного базала подтверждено</string>
<string name="combo_error_no_connection_no_bolus_delivered">Не удалось подключиться к помпе. Болюс не подан</string> <string name="combo_error_no_connection_no_bolus_delivered">Не удалось подключиться к помпе. Болюс не введен</string>
<string name="combo_error_no_bolus_delivered">Подача болюса не состоялась. Чтобы удостовериться, проверьте помпу во избежание двойного болюса и повторите подачу. Для защиты от ложных срабатываний болюсы не повторяются автоматически.</string> <string name="combo_error_no_bolus_delivered">Болюс не введен. Чтобы удостовериться, проверьте помпу во избежание двойного болюса и повторите подачу. Для защиты от ложных срабатываний болюсы не повторяются автоматически.</string>
<string name="combo_error_partial_bolus_delivered">Подано только %1$.2f ед. из запрошенного болюса %2$.2f ед. из-за ошибки. Пожалуйста, проверьте помпу, чтобы удостовериться в этом и принять соответствующие меры.</string> <string name="combo_error_partial_bolus_delivered">Введено только %1$.2f ед. из запрошенного болюса %2$.2f ед. из-за ошибки. Пожалуйста, проверьте помпу, чтобы удостовериться в этом и принять соответствующие меры.</string>
<string name="combo_error_bolus_verification_failed">Подача болюса и проверка истории помпы не состоялись, пожалуйста проверьте помпу. Если болюс был подан, он будет добавлен в назначения во время следующего соединения с помпой.</string> <string name="combo_error_bolus_verification_failed">Ввод болюса и проверка истории помпы не состоялись, пожалуйста проверьте помпу. Если болюс был введен, он будет добавлен в назначения во время следующего соединения с помпой.</string>
<string name="combo_reservoir_level_insufficient_for_bolus">В резервуаре недостаточно инсулина для болюса</string> <string name="combo_reservoir_level_insufficient_for_bolus">В резервуаре недостаточно инсулина для болюса</string>
<string name="combo_invalid_setup">Недопустимые установки помпы, проверьте документацию и убедитесь, что меню Quick Info называется QUICK INFO, используя приложение 360 для конфигурации помпы.</string> <string name="combo_invalid_setup">Недопустимые установки помпы, проверьте документацию и убедитесь, что меню Quick Info называется QUICK INFO, используя приложение 360 для конфигурации помпы.</string>
<string name="combo_actvity_reading_basal_profile">Чтение базального профиля</string> <string name="combo_actvity_reading_basal_profile">Чтение базального профиля</string>
<string name="combo_bolus_rejected_due_to_pump_history_change">История событий помпы изменилась с момента вычисления болюса. Болюс не подан. Пожалуйста пересчитайте потребность в болюсе.</string> <string name="combo_bolus_rejected_due_to_pump_history_change">История событий помпы изменилась с момента вычисления болюса. Болюс не введен. Пожалуйста пересчитайте потребность в болюсе.</string>
<string name="combo_error_updating_treatment_record">Болюс подан успешно, но запись о назначении не сделана. Это может быть вызвано тем, что за последние две минуты назначено два болюса одного объема. Пожалуйста проверьте историю событий помпы и записи о назначениях и добавьте пропущенные записи из Портала назначений. Не добавляйте записи с одним и тем же временем и одинаковым объемом.</string> <string name="combo_error_updating_treatment_record">Болюс введен успешно, но запись о назначении не сделана. Это может быть вызвано тем, что за последние две минуты назначено два болюса одного объема. Пожалуйста проверьте историю событий помпы и записи о назначениях и добавьте пропущенные записи из Портала назначений. Не добавляйте записи с одним и тем же временем и одинаковым объемом.</string>
<string name="combo_high_temp_rejected_due_to_pump_history_changes">Временная верхняя цель отклонена т. к. калькуляция не учитывала недавние изменения в истории событий помпы</string> <string name="combo_high_temp_rejected_due_to_pump_history_changes">Временная верхняя цель отклонена т. к. калькуляция не учитывала недавние изменения в истории событий помпы</string>
<string name="combo_activity_checking_pump_state">Обновление статуса помпы</string> <string name="combo_activity_checking_pump_state">Обновление статуса помпы</string>
<string name="combo_warning_pump_basal_rate_changed">Скорость базала на помпе изменилась и вскоре будет обновлена</string> <string name="combo_warning_pump_basal_rate_changed">Скорость базала на помпе изменилась и вскоре будет обновлена</string>
<string name="combo_error_failure_reading_changed_basal_rate">Скорость базала на помпе изменилась, но учесть ее не удалось</string> <string name="combo_error_failure_reading_changed_basal_rate">Скорость базала на помпе изменилась, но учесть ее не удалось</string>
<string name="combo_activity_checking_for_history_changes">Проверка изменений в истории событий помпы</string> <string name="combo_activity_checking_for_history_changes">Проверка изменений в истории событий помпы</string>
<string name="combo_error_multiple_boluses_with_identical_timestamp">Только что импортировано несколько болюсов с одинаковым количеством инсулина в течение одной минуты. В лог лечения может быть добавлена только одна запись. Пожалуйста проверьте помпу и вручную введите запись о болюсе через вкладку портала назначений. Убедитесь, что данному времени соответствует только одна запись о болюсе.</string> <string name="combo_error_multiple_boluses_with_identical_timestamp">Только что импортировано несколько болюсов с одинаковым количеством инсулина в течение одной минуты. В лог лечения может быть добавлена только одна запись. Пожалуйста проверьте помпу и вручную введите запись о болюсе через вкладку портала назначений. Убедитесь, что данному времени соответствует только одна запись о болюсе.</string>
<string name="combo_check_date">Новый болюс старше 24 часов или запись относится к будущему. Пожалуйста убедитесь что дата на помпе установлена правильно.</string> <string name="combo_check_date">Новый болюс старше 24 часов или запись относится к будущему. Убедитесь что дата на помпе установлена правильно.</string>
<string name="combo_suspious_bolus_time">Время/дата поданного болюса неверны. Вероятно, кол-во активного инсулина IOB также неверно. Проверьте время/дату помпы.</string> <string name="combo_suspious_bolus_time">Время/дата болюса неверны. Вероятно, кол-во активного инсулина IOB также неверно. Проверьте время/дату помпы.</string>
<string name="combo_bolus_count">Отсчет болюса</string> <string name="combo_bolus_count">Отсчет болюса</string>
<string name="combo_tbr_count">Отсчет временного базала TBR</string> <string name="combo_tbr_count">Отсчет временного базала TBR</string>
<string name="bolusstopped">Болюс остановлен</string> <string name="bolusstopped">Болюс остановлен</string>

View file

@ -53,7 +53,7 @@
<string name="omnipod_common_overview_pod_unique_id">ID unique</string> <string name="omnipod_common_overview_pod_unique_id">ID unique</string>
<string name="omnipod_common_overview_lot_number">Numéro de lot</string> <string name="omnipod_common_overview_lot_number">Numéro de lot</string>
<string name="omnipod_common_overview_pod_sequence_number">Numéro de série</string> <string name="omnipod_common_overview_pod_sequence_number">Numéro de série</string>
<string name="omnipod_common_overview_pod_expiry_date">Pod Expiré</string> <string name="omnipod_common_overview_pod_expiry_date">Pod expire le</string>
<string name="omnipod_common_overview_last_connection">Dernière connexion</string> <string name="omnipod_common_overview_last_connection">Dernière connexion</string>
<string name="omnipod_common_overview_last_bolus">Dernier bolus</string> <string name="omnipod_common_overview_last_bolus">Dernier bolus</string>
<string name="omnipod_common_overview_temp_basal_rate">Débit de Basal Temp.</string> <string name="omnipod_common_overview_temp_basal_rate">Débit de Basal Temp.</string>

View file

@ -158,6 +158,7 @@
<string name="omnipod_common_pod_status_activation_time_exceeded">Activation time exceeded</string> <string name="omnipod_common_pod_status_activation_time_exceeded">Activation time exceeded</string>
<string name="omnipod_common_pod_status_inactive">Inactive</string> <string name="omnipod_common_pod_status_inactive">Inactive</string>
<string name="omnipod_common_pod_status_pod_fault_description">Pod Fault: %1$03d %2$s</string> <string name="omnipod_common_pod_status_pod_fault_description">Pod Fault: %1$03d %2$s</string>
<string name="omnipod_common_pod_status_normal">Normal</string>
<!-- Omnipod - Commands --> <!-- Omnipod - Commands -->
<string name="omnipod_common_cmd_deactivate_pod">Deactivate Pod</string> <string name="omnipod_common_cmd_deactivate_pod">Deactivate Pod</string>

View file

@ -991,9 +991,9 @@ class OmnipodDashPumpPlugin @Inject constructor(
val extended = JSONObject() val extended = JSONObject()
try { try {
val podStatus = when { val podStatus = when {
podStateManager.isPodRunning && podStateManager.isSuspended -> "suspended" podStateManager.isPodRunning && podStateManager.isSuspended -> rh.gs(info.nightscout.androidaps.plugins.pump.omnipod.common.R.string.omnipod_common_pod_status_suspended).lowercase()
podStateManager.isPodRunning -> "normal" podStateManager.isPodRunning -> rh.gs(info.nightscout.androidaps.plugins.pump.omnipod.common.R.string.omnipod_common_pod_status_normal).lowercase()
else -> "no active Pod" else -> rh.gs(info.nightscout.androidaps.plugins.pump.omnipod.common.R.string.omnipod_common_pod_status_no_active_pod).lowercase()
} }
status.put("status", podStatus) status.put("status", podStatus)
status.put("timestamp", dateUtil.toISOString(podStateManager.lastUpdatedSystem)) status.put("timestamp", dateUtil.toISOString(podStateManager.lastUpdatedSystem))

View file

@ -42,7 +42,7 @@
<string name="record_pump_site_change">Внести запись о смене места катетера помпы</string> <string name="record_pump_site_change">Внести запись о смене места катетера помпы</string>
<string name="record_insulin_cartridge_change">Внести запись о замене картриджа инсулина</string> <string name="record_insulin_cartridge_change">Внести запись о замене картриджа инсулина</string>
<!-- InsulinDialog --> <!-- InsulinDialog -->
<string name="do_not_bolus_record_only">Не подавать болюс, только внести запись</string> <string name="do_not_bolus_record_only">Не вводить болюс, только внести запись</string>
<!-- ProfileSwitchDialog --> <!-- ProfileSwitchDialog -->
<string name="reuse_profile_pct_hours">Повторно использовать %1$d%%%2$dч</string> <string name="reuse_profile_pct_hours">Повторно использовать %1$d%%%2$dч</string>
<string name="timeshift_label">Сдвиг по времени</string> <string name="timeshift_label">Сдвиг по времени</string>

View file

@ -116,7 +116,7 @@
<string name="action_confirm">ПОДТВЕРДИТЬ</string> <string name="action_confirm">ПОДТВЕРДИТЬ</string>
<string name="action_timeshift">сдвиг по времени</string> <string name="action_timeshift">сдвиг по времени</string>
<string name="action_bolus">Болюс</string> <string name="action_bolus">Болюс</string>
<string name="bolus_progress">Подается болюс</string> <string name="bolus_progress">Вводится болюс</string>
<string name="press_to_cancel">нажмите для отмены</string> <string name="press_to_cancel">нажмите для отмены</string>
<string name="cancel_bolus">ОТМЕНИТЬ БОЛЮС</string> <string name="cancel_bolus">ОТМЕНИТЬ БОЛЮС</string>
<string name="status_pump">Помпа</string> <string name="status_pump">Помпа</string>
@ -161,10 +161,10 @@
<string name="digitalstyle_pref_your_color">Ваш цвет:</string> <string name="digitalstyle_pref_your_color">Ваш цвет:</string>
<string name="digitalstyle_pref_your_color_saturation">Ваша цветовая насыщенность:</string> <string name="digitalstyle_pref_your_color_saturation">Ваша цветовая насыщенность:</string>
<string name="digitalstyle_pref_your_color_opacity">Непрозрачность вашего цвета:</string> <string name="digitalstyle_pref_your_color_opacity">Непрозрачность вашего цвета:</string>
<string name="bolus_progress_channel_name">Подается болюс</string> <string name="bolus_progress_channel_name">Вводится болюс</string>
<string name="bolus_progress_silent_channel_name">Беззвучная подача болюса</string> <string name="bolus_progress_silent_channel_name">Беззвучный ввод болюса</string>
<string name="bolus_progress_channel_description">Подача и отмена болюса</string> <string name="bolus_progress_channel_description">Ввод и отмена болюса</string>
<string name="bolus_progress_silent_channel_description">Подача и отмена болюса с меньшими вибрациями</string> <string name="bolus_progress_silent_channel_description">Введение и отмена болюса с меньшими вибрациями</string>
<string name="simple_ui_off">Выкл</string> <string name="simple_ui_off">Выкл</string>
<string name="simple_ui_charging">Во время зарядки</string> <string name="simple_ui_charging">Во время зарядки</string>
<string name="simple_ui_always_on">Режим: всегда вкл</string> <string name="simple_ui_always_on">Режим: всегда вкл</string>
@ -192,7 +192,7 @@
<string name="cob_000g">000г</string> <string name="cob_000g">000г</string>
<string name="svg_00_0" comment="use , or . only">00,0</string> <string name="svg_00_0" comment="use , or . only">00,0</string>
<string name="iob_0_00u">0,00 ед</string> <string name="iob_0_00u">0,00 ед</string>
<string name="snooze_alert">Оповещение о переходе AAPS в режим энергосбережения</string> <string name="snooze_alert">Отложить оповещения AAPS</string>
<string name="sending_snooze">Отправка команды отложить оповещения AAPS</string> <string name="sending_snooze">Отправка команды отложить оповещения AAPS</string>
<string name="short_hour">ч</string> <string name="short_hour">ч</string>
<string name="week_short">н</string> <string name="week_short">н</string>