Merge branch 'dev' of https://github.com/nightscout/AndroidAPS into dev
This commit is contained in:
commit
6e94f7ab2d
21 changed files with 155 additions and 33 deletions
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue