commit
db6d5527b1
109 changed files with 20710 additions and 17609 deletions
|
@ -1,6 +1,6 @@
|
|||
Reporting bugs
|
||||
--------------
|
||||
- Note the precise time the problem occurred and describe the circumstances and steps that caused
|
||||
- **Note the precise time the problem occurred** and describe the circumstances and steps that caused
|
||||
the problem
|
||||
- Note the Build version (found in the About dialog in the app, when pressing the three dots in the
|
||||
upper-right corner).
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# AndroidAPS
|
||||
|
||||
* Check the wiki: https://github.com/MilosKozak/AndroidAPS/wiki
|
||||
* Check the wiki: http://wiki.androidaps.org
|
||||
* Everyone who’s been looping with AndroidAPS needs to fill out the form after 3 days of looping https://docs.google.com/forms/d/14KcMjlINPMJHVt28MDRupa4sz4DDIooI4SrW0P3HSN8/viewform?c=0&w=1
|
||||
|
||||
[![Gitter](https://badges.gitter.im/MilosKozak/AndroidAPS.svg)](https://gitter.im/MilosKozak/AndroidAPS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
|
|
@ -63,7 +63,7 @@ android {
|
|||
targetSdkVersion 25
|
||||
multiDexEnabled true
|
||||
versionCode 1500
|
||||
version "2.0h-dev"
|
||||
version "2.0"
|
||||
buildConfigField "String", "VERSION", '"' + version + '"'
|
||||
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
|
||||
buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"'
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_MMS" />
|
||||
<uses-permission android:name="android.permission.SEND_SMS" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.SEND_MMS" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
@ -34,6 +35,9 @@
|
|||
android:label="@string/app_name"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme.NoActionBar">
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.car.application"
|
||||
android:resource="@xml/automotive_app_desc" />
|
||||
<activity android:name=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
|
|
@ -19,23 +19,22 @@ tempBasalFunctions.setTempBasal = function setTempBasal(rate, duration, profile,
|
|||
//var maxSafeBasal = Math.min(profile.max_basal, 3 * profile.max_daily_basal, 4 * profile.current_basal);
|
||||
|
||||
var maxSafeBasal = tempBasalFunctions.getMaxSafeBasal(profile);
|
||||
var round_basal = require('./round-basal');
|
||||
var round_basal = require('./round-basal');
|
||||
|
||||
if (rate < 0) {
|
||||
rate = 0;
|
||||
} // if >30m @ 0 required, zero temp will be extended to 30m instead
|
||||
else if (rate > maxSafeBasal) {
|
||||
} else if (rate > maxSafeBasal) {
|
||||
rate = maxSafeBasal;
|
||||
}
|
||||
|
||||
var suggestedRate = round_basal(rate, profile);
|
||||
if (typeof(currenttemp) !== 'undefined' && typeof(currenttemp.duration) !== 'undefined' && typeof(currenttemp.rate) !== 'undefined' && currenttemp.duration > (duration-10) && currenttemp.duration <= 120 && suggestedRate <= currenttemp.rate * 1.2 && suggestedRate >= currenttemp.rate * 0.8) {
|
||||
if (typeof(currenttemp) !== 'undefined' && typeof(currenttemp.duration) !== 'undefined' && typeof(currenttemp.rate) !== 'undefined' && currenttemp.duration > (duration-10) && currenttemp.duration <= 120 && suggestedRate <= currenttemp.rate * 1.2 && suggestedRate >= currenttemp.rate * 0.8 && duration > 0 ) {
|
||||
rT.reason += " "+currenttemp.duration+"m left and " + currenttemp.rate + " ~ req " + suggestedRate + "U/hr: no temp required";
|
||||
return rT;
|
||||
}
|
||||
|
||||
if (suggestedRate === profile.current_basal) {
|
||||
if (profile.skip_neutral_temps) {
|
||||
if (profile.skip_neutral_temps === true) {
|
||||
if (typeof(currenttemp) !== 'undefined' && typeof(currenttemp.duration) !== 'undefined' && currenttemp.duration > 0) {
|
||||
reason(rT, 'Suggested rate is same as profile rate, a temp basal is active, canceling current temp');
|
||||
rT.duration = 0;
|
||||
|
|
|
@ -182,7 +182,7 @@ public class MainActivity extends AppCompatActivity {
|
|||
|
||||
@Subscribe
|
||||
public void onStatusEvent(final EventRefreshGui ev) {
|
||||
String lang = SP.getString("language", "en");
|
||||
String lang = SP.getString(R.string.key_language, "en");
|
||||
LocaleHelper.setLocale(getApplicationContext(), lang);
|
||||
runOnUiThread(() -> {
|
||||
if (ev.recreate) {
|
||||
|
@ -326,6 +326,7 @@ public class MainActivity extends AppCompatActivity {
|
|||
case AndroidPermission.CASE_LOCATION:
|
||||
case AndroidPermission.CASE_SMS:
|
||||
case AndroidPermission.CASE_BATTERY:
|
||||
case AndroidPermission.CASE_PHONESTATE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@ public class ConstraintChecker implements ConstraintsInterface {
|
|||
return isSMBModeEnabled(new Constraint<>(true));
|
||||
}
|
||||
|
||||
public Constraint<Boolean> isUAMEnabled() {
|
||||
return isUAMEnabled(new Constraint<>(true));
|
||||
}
|
||||
|
||||
public Constraint<Boolean> isAdvancedFilteringEnabled() {
|
||||
return isAdvancedFilteringEnabled(new Constraint<>(true));
|
||||
}
|
||||
|
@ -130,6 +134,18 @@ public class ConstraintChecker implements ConstraintsInterface {
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Constraint<Boolean> isUAMEnabled(Constraint<Boolean> value) {
|
||||
|
||||
ArrayList<PluginBase> constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||
for (PluginBase p : constraintsPlugins) {
|
||||
ConstraintsInterface constraint = (ConstraintsInterface) p;
|
||||
if (!p.isEnabled(PluginType.CONSTRAINTS)) continue;
|
||||
constraint.isUAMEnabled(value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Constraint<Boolean> isAdvancedFilteringEnabled(Constraint<Boolean> value) {
|
||||
ArrayList<PluginBase> constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||
|
|
|
@ -23,6 +23,7 @@ import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
|||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.FabricPrivacy;
|
||||
import info.nightscout.utils.MidnightTime;
|
||||
|
||||
public class Profile {
|
||||
private static Logger log = LoggerFactory.getLogger(Profile.class);
|
||||
|
@ -381,7 +382,7 @@ public class Profile {
|
|||
}
|
||||
|
||||
public double getIsf() {
|
||||
return getIsfTimeFromMidnight(secondsFromMidnight(System.currentTimeMillis()));
|
||||
return getIsfTimeFromMidnight(secondsFromMidnight());
|
||||
}
|
||||
|
||||
public double getIsf(long time) {
|
||||
|
@ -397,11 +398,11 @@ public class Profile {
|
|||
public String getIsfList() {
|
||||
if (isf_v == null)
|
||||
isf_v = convertToSparseArray(isf);
|
||||
return getValuesList(isf_v, null, new DecimalFormat("0.0"), getUnits() + "/U");
|
||||
return getValuesList(isf_v, null, new DecimalFormat("0.0"), getUnits() + MainApp.gs(R.string.profile_per_unit));
|
||||
}
|
||||
|
||||
public double getIc() {
|
||||
return getIcTimeFromMidnight(secondsFromMidnight(System.currentTimeMillis()));
|
||||
return getIcTimeFromMidnight(secondsFromMidnight());
|
||||
}
|
||||
|
||||
public double getIc(long time) {
|
||||
|
@ -417,11 +418,11 @@ public class Profile {
|
|||
public String getIcList() {
|
||||
if (ic_v == null)
|
||||
ic_v = convertToSparseArray(ic);
|
||||
return getValuesList(ic_v, null, new DecimalFormat("0.0"), "g/U");
|
||||
return getValuesList(ic_v, null, new DecimalFormat("0.0"), MainApp.gs(R.string.profile_carbs_per_unit));
|
||||
}
|
||||
|
||||
public double getBasal() {
|
||||
return getBasalTimeFromMidnight(secondsFromMidnight(System.currentTimeMillis()));
|
||||
return getBasalTimeFromMidnight(secondsFromMidnight());
|
||||
}
|
||||
|
||||
public double getBasal(long time) {
|
||||
|
@ -438,7 +439,7 @@ public class Profile {
|
|||
public String getBasalList() {
|
||||
if (basal_v == null)
|
||||
basal_v = convertToSparseArray(basal);
|
||||
return getValuesList(basal_v, null, new DecimalFormat("0.00"), "U/h");
|
||||
return getValuesList(basal_v, null, new DecimalFormat("0.00"), MainApp.gs(R.string.profile_ins_units_per_hout));
|
||||
}
|
||||
|
||||
public class BasalValue {
|
||||
|
@ -465,7 +466,7 @@ public class Profile {
|
|||
}
|
||||
|
||||
public double getTarget() {
|
||||
return getTarget(secondsFromMidnight(System.currentTimeMillis()));
|
||||
return getTarget(secondsFromMidnight());
|
||||
}
|
||||
|
||||
protected double getTarget(int timeAsSeconds) {
|
||||
|
@ -473,7 +474,7 @@ public class Profile {
|
|||
}
|
||||
|
||||
public double getTargetLow() {
|
||||
return getTargetLowTimeFromMidnight(secondsFromMidnight(System.currentTimeMillis()));
|
||||
return getTargetLowTimeFromMidnight(secondsFromMidnight());
|
||||
}
|
||||
|
||||
public double getTargetLow(long time) {
|
||||
|
@ -487,7 +488,7 @@ public class Profile {
|
|||
}
|
||||
|
||||
public double getTargetHigh() {
|
||||
return getTargetHighTimeFromMidnight(secondsFromMidnight(System.currentTimeMillis()));
|
||||
return getTargetHighTimeFromMidnight(secondsFromMidnight());
|
||||
}
|
||||
|
||||
public double getTargetHigh(long time) {
|
||||
|
@ -518,24 +519,13 @@ public class Profile {
|
|||
}
|
||||
|
||||
public static int secondsFromMidnight() {
|
||||
Calendar c = Calendar.getInstance();
|
||||
long now = c.getTimeInMillis();
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
long passed = now - c.getTimeInMillis();
|
||||
long passed = DateUtil.now() - MidnightTime.calc();
|
||||
return (int) (passed / 1000);
|
||||
}
|
||||
|
||||
public static int secondsFromMidnight(long date) {
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.setTimeInMillis(date);
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
long passed = date - c.getTimeInMillis();
|
||||
long midnight = MidnightTime.calc(date);
|
||||
long passed = date - midnight;
|
||||
return (int) (passed / 1000);
|
||||
}
|
||||
|
||||
|
|
|
@ -220,14 +220,8 @@ public class BgReading implements DataPointWithLabelInterface {
|
|||
@Override
|
||||
public int getColor() {
|
||||
String units = ProfileFunctions.getInstance().getProfileUnits();
|
||||
Double lowLine = SP.getDouble("low_mark", 0d);
|
||||
Double highLine = SP.getDouble("high_mark", 0d);
|
||||
if (lowLine < 1) {
|
||||
lowLine = Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units);
|
||||
}
|
||||
if (highLine < 1) {
|
||||
highLine = Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units);
|
||||
}
|
||||
Double lowLine = OverviewPlugin.getPlugin().determineLowLine(units);
|
||||
Double highLine = OverviewPlugin.getPlugin().determineHighLine(units);
|
||||
int color = MainApp.gc(R.color.inrange);
|
||||
if (isPrediction())
|
||||
return getPredectionColor();
|
||||
|
|
|
@ -156,6 +156,12 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||
log.info("Do nothing for downgrading...");
|
||||
log.debug("oldVersion: {}, newVersion: {}", oldVersion, newVersion);
|
||||
}
|
||||
|
||||
public int getOldVersion() {
|
||||
return oldVersion;
|
||||
}
|
||||
|
@ -397,7 +403,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
QueryBuilder<BgReading, Long> queryBuilder = daoBgReadings.queryBuilder();
|
||||
queryBuilder.orderBy("date", false);
|
||||
queryBuilder.limit(1L);
|
||||
queryBuilder.where().gt("value", 38).and().eq("isValid", true);
|
||||
queryBuilder.where().ge("value", 39).and().eq("isValid", true);
|
||||
PreparedQuery<BgReading> preparedQuery = queryBuilder.prepare();
|
||||
bgList = daoBgReadings.query(preparedQuery);
|
||||
|
||||
|
@ -435,7 +441,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
QueryBuilder<BgReading, Long> queryBuilder = daoBgreadings.queryBuilder();
|
||||
queryBuilder.orderBy("date", ascending);
|
||||
Where where = queryBuilder.where();
|
||||
where.ge("date", mills).and().gt("value", 38).and().eq("isValid", true);
|
||||
where.ge("date", mills).and().ge("value", 39).and().eq("isValid", true);
|
||||
PreparedQuery<BgReading> preparedQuery = queryBuilder.prepare();
|
||||
bgReadings = daoBgreadings.query(preparedQuery);
|
||||
return bgReadings;
|
||||
|
@ -452,7 +458,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
|
|||
QueryBuilder<BgReading, Long> queryBuilder = daoBgreadings.queryBuilder();
|
||||
queryBuilder.orderBy("date", ascending);
|
||||
Where where = queryBuilder.where();
|
||||
where.between("date", start, end).and().gt("value", 38).and().eq("isValid", true);
|
||||
where.between("date", start, end).and().ge("value", 39).and().eq("isValid", true);
|
||||
PreparedQuery<BgReading> preparedQuery = queryBuilder.prepare();
|
||||
bgReadings = daoBgreadings.query(preparedQuery);
|
||||
return bgReadings;
|
||||
|
|
|
@ -101,6 +101,11 @@ public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
|
|||
return profile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Note: the name returned here is used as the PS name when uploading to NS. When such a PS is retrieved
|
||||
* again from NS, the added parts must be removed again, see
|
||||
* {@link info.nightscout.utils.PercentageSplitter#pureName}
|
||||
*/
|
||||
public String getCustomizedName() {
|
||||
String name = profileName;
|
||||
if(LocalProfilePlugin.LOCAL_PROFILE.equals(name)){
|
||||
|
|
|
@ -27,6 +27,10 @@ public interface ConstraintsInterface {
|
|||
return value;
|
||||
}
|
||||
|
||||
default Constraint<Boolean> isUAMEnabled(Constraint<Boolean> value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
default Constraint<Boolean> isAdvancedFilteringEnabled(Constraint<Boolean> value) {
|
||||
return value;
|
||||
}
|
||||
|
|
|
@ -99,13 +99,13 @@ public class L {
|
|||
private static void initialize() {
|
||||
logElements = new ArrayList<>();
|
||||
logElements.add(new LogElement(APS, true));
|
||||
logElements.add(new LogElement(AUTOSENS, true));
|
||||
logElements.add(new LogElement(AUTOSENS, false));
|
||||
logElements.add(new LogElement(BGSOURCE, true));
|
||||
logElements.add(new LogElement(CONFIGBUILDER, true));
|
||||
logElements.add(new LogElement(CONFIGBUILDER, false));
|
||||
logElements.add(new LogElement(CONSTRAINTS, true));
|
||||
logElements.add(new LogElement(CORE, true));
|
||||
logElements.add(new LogElement(DATABASE, true));
|
||||
logElements.add(new LogElement(DATAFOOD, true));
|
||||
logElements.add(new LogElement(DATAFOOD, false));
|
||||
logElements.add(new LogElement(DATASERVICE, true));
|
||||
logElements.add(new LogElement(DATATREATMENTS, true));
|
||||
logElements.add(new LogElement(EVENTS, false, true));
|
||||
|
|
|
@ -270,7 +270,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
if (profile == null) {
|
||||
editBg.setParams(bg, 0d, 500d, 0.1d, new DecimalFormat("0.0"), false, bgTextWatcher);
|
||||
editTemptarget.setParams(bg, 0d, 500d, 0.1d, new DecimalFormat("0.0"), false);
|
||||
} else if (profile.getUnits().equals(Constants.MMOL)) {
|
||||
} else if (units.equals(Constants.MMOL)) {
|
||||
editBg.setParams(bg, 0d, 30d, 0.1d, new DecimalFormat("0.0"), false, bgTextWatcher);
|
||||
editTemptarget.setParams(bg, 0d, 30d, 0.1d, new DecimalFormat("0.0"), false);
|
||||
} else {
|
||||
|
@ -279,7 +279,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
}
|
||||
|
||||
sensorRadioButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
Double bg1 = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, profile.getUnits());
|
||||
Double bg1 = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, units);
|
||||
if (savedInstanceState != null && savedInstanceState.getDouble("editBg") != bg1) {
|
||||
editBg.setValue(savedInstanceState.getDouble("editBg"));
|
||||
} else {
|
||||
|
@ -459,7 +459,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
if ((data.size() > 0) &&
|
||||
(data.get(0).date > millis - 7 * 60 * 1000L) &&
|
||||
(data.get(0).date < millis + 7 * 60 * 1000L)) {
|
||||
editBg.setValue(Profile.fromMgdlToUnits(data.get(0).value, profile != null ? profile.getUnits() : Constants.MGDL));
|
||||
editBg.setValue(Profile.fromMgdlToUnits(data.get(0).value, units));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -736,8 +736,8 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
.reason(reason)
|
||||
.source(Source.USER);
|
||||
if (tempTarget.durationInMinutes != 0) {
|
||||
tempTarget.low(Profile.toMgdl(targetBottom, profile.getUnits()))
|
||||
.high(Profile.toMgdl(targetTop, profile.getUnits()));
|
||||
tempTarget.low(Profile.toMgdl(targetBottom, units))
|
||||
.high(Profile.toMgdl(targetTop, units));
|
||||
} else {
|
||||
tempTarget.low(0).high(0);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAPlugin;
|
|||
import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
||||
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityOref1Plugin;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.HardLimits;
|
||||
import info.nightscout.utils.Round;
|
||||
|
@ -94,6 +95,17 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Constraint<Boolean> isUAMEnabled(Constraint<Boolean> value) {
|
||||
boolean enabled = SP.getBoolean(R.string.key_use_uam, false);
|
||||
if (!enabled)
|
||||
value.set(false, MainApp.gs(R.string.uamdisabledinpreferences), this);
|
||||
boolean oref1Enabled = SensitivityOref1Plugin.getPlugin().isEnabled(PluginType.SENSITIVITY);
|
||||
if (!oref1Enabled)
|
||||
value.set(false, MainApp.gs(R.string.uamdisabledoref1notselected), this);
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Constraint<Boolean> isAdvancedFilteringEnabled(Constraint<Boolean> value) {
|
||||
BgSourceInterface bgSource = ConfigBuilderPlugin.getPlugin().getActiveBgSource();
|
||||
|
|
|
@ -21,6 +21,7 @@ import info.nightscout.androidaps.plugins.Overview.graphExtensions.Scale;
|
|||
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityAAPSPlugin;
|
||||
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityWeightedAveragePlugin;
|
||||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
/**
|
||||
|
@ -40,7 +41,7 @@ public class AutosensData implements DataPointWithLabelInterface {
|
|||
double min5minCarbImpact = 0d;
|
||||
double remaining = 0d;
|
||||
|
||||
public CarbsInPast(Treatment t) {
|
||||
CarbsInPast(Treatment t) {
|
||||
time = t.date;
|
||||
carbs = t.carbs;
|
||||
remaining = t.carbs;
|
||||
|
@ -56,6 +57,18 @@ public class AutosensData implements DataPointWithLabelInterface {
|
|||
min5minCarbImpact = SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact);
|
||||
}
|
||||
}
|
||||
|
||||
CarbsInPast (CarbsInPast other) {
|
||||
this.time = other.time;
|
||||
this.carbs = other.carbs;
|
||||
this.min5minCarbImpact = other.min5minCarbImpact;
|
||||
this.remaining = other.remaining;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("CarbsInPast: time: %s carbs: %.02f min5minCI: %.02f remaining: %.2f", new Date(time).toLocaleString(), carbs, min5minCarbImpact, remaining);
|
||||
}
|
||||
}
|
||||
|
||||
public long time = 0L;
|
||||
|
@ -89,11 +102,18 @@ public class AutosensData implements DataPointWithLabelInterface {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AutosensData: " + new Date(time).toLocaleString() + " " + pastSensitivity + " Delta=" + delta + " avgDelta=" + avgDelta + " Bgi=" + bgi + " Deviation=" + deviation + " avgDeviation=" + avgDeviation + " Absorbed=" + absorbed + " CarbsFromBolus=" + carbsFromBolus + " COB=" + cob + " autosensRatio=" + autosensResult.ratio + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation=" + slopeFromMinDeviation;
|
||||
return String.format("AutosensData: %s pastSensitivity=%s delta=%.02f avgDelta=%.02f bgi=%.02f deviation=%.02f avgDeviation=%.02f absorbed=%.02f carbsFromBolus=%.02f cob=%.02f autosensRatio=%.02f slopeFromMaxDeviation=%.02f slopeFromMinDeviation=%.02f activeCarbsList=%s",
|
||||
new Date(time).toLocaleString(), pastSensitivity, delta, avgDelta, bgi, deviation, avgDeviation, absorbed, carbsFromBolus, cob, autosensResult.ratio, slopeFromMaxDeviation, slopeFromMinDeviation, activeCarbsList.toString());
|
||||
}
|
||||
|
||||
public int minOld() {
|
||||
return (int) ((System.currentTimeMillis() - time) / 1000 / 60);
|
||||
public List<CarbsInPast> cloneCarbsList() {
|
||||
List<CarbsInPast> newActiveCarbsList = new ArrayList<>();
|
||||
|
||||
for(CarbsInPast c: activeCarbsList) {
|
||||
newActiveCarbsList.add(new CarbsInPast(c));
|
||||
}
|
||||
|
||||
return newActiveCarbsList;
|
||||
}
|
||||
|
||||
// remove carbs older than timeframe
|
||||
|
@ -111,7 +131,7 @@ public class AutosensData implements DataPointWithLabelInterface {
|
|||
if (c.remaining > 0)
|
||||
cob -= c.remaining;
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
log.debug("Removing carbs at " + new Date(toTime).toLocaleString() + " + after " + maxAbsorptionHours + "h :" + new Date(c.time).toLocaleString());
|
||||
log.debug("Removing carbs at " + new Date(toTime).toLocaleString() + " after " + maxAbsorptionHours + "h > " + c.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -146,8 +146,8 @@ public class IobCobCalculatorPlugin extends PluginBase {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
double averageDiff = totalDiff / (bgReadings.size() - 1) / 1000d;
|
||||
boolean is5mindata = averageDiff < 10;
|
||||
long averageDiff = totalDiff / bgReadings.size() / 1000;
|
||||
boolean is5mindata = averageDiff < 1;
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
log.debug("Interval detection: values: " + bgReadings.size() + " averageDiff: " + averageDiff + "[s] is5minData: " + is5mindata);
|
||||
return is5mindata;
|
||||
|
@ -231,13 +231,15 @@ public class IobCobCalculatorPlugin extends PluginBase {
|
|||
|
||||
bucketed_data = new ArrayList<>();
|
||||
bucketed_data.add(bgReadings.get(0));
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
log.debug("Adding. bgTime: " + DateUtil.toISOString(bgReadings.get(0).date) + " lastbgTime: " + "none-first-value" + " " + bgReadings.get(0).toString());
|
||||
int j = 0;
|
||||
for (int i = 1; i < bgReadings.size(); ++i) {
|
||||
long bgTime = bgReadings.get(i).date;
|
||||
long lastbgTime = bgReadings.get(i - 1).date;
|
||||
//log.error("Processing " + i + ": " + new Date(bgTime).toString() + " " + bgReadings.get(i).value + " Previous: " + new Date(lastbgTime).toString() + " " + bgReadings.get(i - 1).value);
|
||||
if (bgReadings.get(i).value < 39 || bgReadings.get(i - 1).value < 39) {
|
||||
continue;
|
||||
throw new IllegalStateException("<39");
|
||||
}
|
||||
|
||||
long elapsed_minutes = (bgTime - lastbgTime) / (60 * 1000);
|
||||
|
@ -294,6 +296,13 @@ public class IobCobCalculatorPlugin extends PluginBase {
|
|||
long adjusted = (msecDiff - T.mins(5).msecs()) / 1000;
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
log.debug("Adjusting bucketed data time. Current: " + DateUtil.toISOString(current.date) + " to: " + DateUtil.toISOString(previous.date + T.mins(5).msecs()) + " by " + adjusted + " sec");
|
||||
if (Math.abs(adjusted) > 90) {
|
||||
// too big adjustment, fallback to non 5 min data
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
log.debug("Fallback to non 5 min data");
|
||||
createBucketedDataRecalculated();
|
||||
return;
|
||||
}
|
||||
current.date = previous.date + T.mins(5).msecs();
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,10 @@ import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
|||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.FabricPrivacy;
|
||||
import info.nightscout.utils.MidnightTime;
|
||||
import info.nightscout.utils.Profiler;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static info.nightscout.utils.DateUtil.now;
|
||||
|
@ -74,6 +77,7 @@ public class IobCobOref1Thread extends Thread {
|
|||
|
||||
@Override
|
||||
public final void run() {
|
||||
long start = DateUtil.now();
|
||||
mWakeLock.acquire();
|
||||
try {
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
|
@ -148,7 +152,7 @@ public class IobCobOref1Thread extends Thread {
|
|||
AutosensData autosensData = new AutosensData();
|
||||
autosensData.time = bgTime;
|
||||
if (previous != null)
|
||||
autosensData.activeCarbsList = new ArrayList<>(previous.activeCarbsList);
|
||||
autosensData.activeCarbsList = previous.cloneCarbsList();
|
||||
else
|
||||
autosensData.activeCarbsList = new ArrayList<>();
|
||||
|
||||
|
@ -242,6 +246,7 @@ public class IobCobOref1Thread extends Thread {
|
|||
for (int ir = 0; ir < recentTreatments.size(); ir++) {
|
||||
autosensData.carbsFromBolus += recentTreatments.get(ir).carbs;
|
||||
autosensData.activeCarbsList.add(new AutosensData.CarbsInPast(recentTreatments.get(ir)));
|
||||
autosensData.pastSensitivity += "[" + DecimalFormatter.to0Decimal(recentTreatments.get(ir).carbs) + "g]";
|
||||
}
|
||||
|
||||
|
||||
|
@ -339,19 +344,19 @@ public class IobCobOref1Thread extends Thread {
|
|||
// Exclude meal-related deviations (carb absorption) from autosens
|
||||
if (autosensData.type.equals("non-meal")) {
|
||||
if (Math.abs(deviation) < Constants.DEVIATION_TO_BE_EQUAL) {
|
||||
autosensData.pastSensitivity = "=";
|
||||
autosensData.pastSensitivity += "=";
|
||||
autosensData.validDeviation = true;
|
||||
} else if (deviation > 0) {
|
||||
autosensData.pastSensitivity = "+";
|
||||
autosensData.pastSensitivity += "+";
|
||||
autosensData.validDeviation = true;
|
||||
} else {
|
||||
autosensData.pastSensitivity = "-";
|
||||
autosensData.pastSensitivity += "-";
|
||||
autosensData.validDeviation = true;
|
||||
}
|
||||
} else if (autosensData.type.equals("uam")) {
|
||||
autosensData.pastSensitivity = "u";
|
||||
autosensData.pastSensitivity += "u";
|
||||
} else {
|
||||
autosensData.pastSensitivity = "x";
|
||||
autosensData.pastSensitivity += "x";
|
||||
}
|
||||
//log.debug("TIME: " + new Date(bgTime).toString() + " BG: " + bg + " SENS: " + sens + " DELTA: " + delta + " AVGDELTA: " + avgDelta + " IOB: " + iob.iob + " ACTIVITY: " + iob.activity + " BGI: " + bgi + " DEVIATION: " + deviation);
|
||||
|
||||
|
@ -391,8 +396,11 @@ public class IobCobOref1Thread extends Thread {
|
|||
} finally {
|
||||
mWakeLock.release();
|
||||
MainApp.bus().post(new EventIobCalculationProgress(""));
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
if (L.isEnabled(L.AUTOSENS)) {
|
||||
log.debug("AUTOSENSDATA thread ended: " + from);
|
||||
log.debug("Midnights: " + MidnightTime.log());
|
||||
}
|
||||
Profiler.log(log, "IobCobOref1Thread", start);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,10 @@ import info.nightscout.androidaps.plugins.Sensitivity.SensitivityWeightedAverage
|
|||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.FabricPrivacy;
|
||||
import info.nightscout.utils.MidnightTime;
|
||||
import info.nightscout.utils.Profiler;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static info.nightscout.utils.DateUtil.now;
|
||||
|
@ -73,6 +76,7 @@ public class IobCobThread extends Thread {
|
|||
|
||||
@Override
|
||||
public final void run() {
|
||||
long start = DateUtil.now();
|
||||
mWakeLock.acquire();
|
||||
try {
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
|
@ -147,7 +151,7 @@ public class IobCobThread extends Thread {
|
|||
AutosensData autosensData = new AutosensData();
|
||||
autosensData.time = bgTime;
|
||||
if (previous != null)
|
||||
autosensData.activeCarbsList = new ArrayList<>(previous.activeCarbsList);
|
||||
autosensData.activeCarbsList = previous.cloneCarbsList();
|
||||
else
|
||||
autosensData.activeCarbsList = new ArrayList<>();
|
||||
|
||||
|
@ -241,6 +245,7 @@ public class IobCobThread extends Thread {
|
|||
for (int ir = 0; ir < recentTreatments.size(); ir++) {
|
||||
autosensData.carbsFromBolus += recentTreatments.get(ir).carbs;
|
||||
autosensData.activeCarbsList.add(new AutosensData.CarbsInPast(recentTreatments.get(ir)));
|
||||
autosensData.pastSensitivity += "[" + DecimalFormatter.to0Decimal(recentTreatments.get(ir).carbs) + "g]";
|
||||
}
|
||||
|
||||
|
||||
|
@ -284,17 +289,17 @@ public class IobCobThread extends Thread {
|
|||
// calculate autosens only without COB
|
||||
if (autosensData.cob <= 0) {
|
||||
if (Math.abs(deviation) < Constants.DEVIATION_TO_BE_EQUAL) {
|
||||
autosensData.pastSensitivity = "=";
|
||||
autosensData.pastSensitivity += "=";
|
||||
autosensData.validDeviation = true;
|
||||
} else if (deviation > 0) {
|
||||
autosensData.pastSensitivity = "+";
|
||||
autosensData.pastSensitivity += "+";
|
||||
autosensData.validDeviation = true;
|
||||
} else {
|
||||
autosensData.pastSensitivity = "-";
|
||||
autosensData.pastSensitivity += "-";
|
||||
autosensData.validDeviation = true;
|
||||
}
|
||||
} else {
|
||||
autosensData.pastSensitivity = "C";
|
||||
autosensData.pastSensitivity += "C";
|
||||
}
|
||||
//log.debug("TIME: " + new Date(bgTime).toString() + " BG: " + bg + " SENS: " + sens + " DELTA: " + delta + " AVGDELTA: " + avgDelta + " IOB: " + iob.iob + " ACTIVITY: " + iob.activity + " BGI: " + bgi + " DEVIATION: " + deviation);
|
||||
|
||||
|
@ -318,8 +323,11 @@ public class IobCobThread extends Thread {
|
|||
} finally {
|
||||
mWakeLock.release();
|
||||
MainApp.bus().post(new EventIobCalculationProgress(""));
|
||||
if (L.isEnabled(L.AUTOSENS))
|
||||
if (L.isEnabled(L.AUTOSENS)) {
|
||||
log.debug("AUTOSENSDATA thread ended: " + from);
|
||||
log.debug("Midnights: " + MidnightTime.log());
|
||||
}
|
||||
Profiler.log(log, "IobCobThread", start);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -307,6 +307,11 @@ public class APSResult {
|
|||
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
Profile profile = ProfileFunctions.getInstance().getProfile();
|
||||
|
||||
if (profile == null) {
|
||||
log.error("FALSE: No Profile");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (usePercent) {
|
||||
if (activeTemp == null && percent == 100) {
|
||||
if (L.isEnabled(L.APS))
|
||||
|
|
|
@ -409,8 +409,10 @@ public class LoopPlugin extends PluginBase {
|
|||
.setAutoCancel(true)
|
||||
.setPriority(Notification.PRIORITY_HIGH)
|
||||
.setCategory(Notification.CATEGORY_ALARM)
|
||||
.setVisibility(Notification.VISIBILITY_PUBLIC)
|
||||
.setLocalOnly(true);
|
||||
.setVisibility(Notification.VISIBILITY_PUBLIC);
|
||||
if (SP.getBoolean("wearcontrol", false)) {
|
||||
builder.setLocalOnly(true);
|
||||
}
|
||||
|
||||
// Creates an explicit intent for an Activity in your app
|
||||
Intent resultIntent = new Intent(MainApp.instance().getApplicationContext(), MainActivity.class);
|
||||
|
|
|
@ -73,8 +73,8 @@ public class MaintenancePlugin extends PluginBase {
|
|||
}
|
||||
|
||||
public void sendLogs() {
|
||||
String recipient = SP.getString("key_maintenance_logs_email", "logs@androidaps.org");
|
||||
int amount = SP.getInt("key_maintenance_logs_amount", 2);
|
||||
String recipient = SP.getString(R.string.key_maintenance_logs_email, "logs@androidaps.org");
|
||||
int amount = SP.getInt(R.string.key_maintenance_logs_amount, 2);
|
||||
|
||||
String logDirectory = LoggerUtils.getLogDirectory();
|
||||
List<File> logs = this.getLogfiles(logDirectory, amount);
|
||||
|
@ -103,7 +103,7 @@ public class MaintenancePlugin extends PluginBase {
|
|||
Arrays.sort(files, (f1, f2) -> f1.getName().compareTo(f2.getName()));
|
||||
|
||||
List<File> delFiles = Arrays.asList(files);
|
||||
int amount = SP.getInt("key_logshipper_amount", 2);
|
||||
int amount = SP.getInt(R.string.key_logshipper_amount, 2);
|
||||
int keepIndex = amount - 1;
|
||||
|
||||
if (keepIndex < delFiles.size()) {
|
||||
|
@ -213,6 +213,10 @@ public class MaintenancePlugin extends PluginBase {
|
|||
builder.append("ADD TIME OF EVENT HERE: " + System.lineSeparator());
|
||||
builder.append("ADD ISSUE DESCRIPTION OR GITHUB ISSUE REFERENCE NUMBER: " + System.lineSeparator());
|
||||
builder.append("-------------------------------------------------------" + System.lineSeparator());
|
||||
builder.append("(Please remember this will send only very recent logs." + System.lineSeparator());
|
||||
builder.append("If you want to provide logs for event older than a few hours," + System.lineSeparator());
|
||||
builder.append("you have to do it manually)" + System.lineSeparator());
|
||||
builder.append("-------------------------------------------------------" + System.lineSeparator());
|
||||
builder.append(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION + System.lineSeparator());
|
||||
if (Config.NSCLIENT)
|
||||
builder.append("NSCLIENT" + System.lineSeparator());
|
||||
|
|
|
@ -211,6 +211,7 @@ public class DetermineBasalAdapterSMBJS {
|
|||
double autosensDataRatio,
|
||||
boolean tempTargetSet,
|
||||
boolean microBolusAllowed,
|
||||
boolean uamAllowed,
|
||||
boolean advancedFiltering
|
||||
) throws JSONException {
|
||||
|
||||
|
@ -247,7 +248,7 @@ public class DetermineBasalAdapterSMBJS {
|
|||
// mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact));
|
||||
//}
|
||||
mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap);
|
||||
mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false));
|
||||
mProfile.put("enableUAM", uamAllowed);
|
||||
mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable);
|
||||
mProfile.put("enableSMB_with_COB", SP.getBoolean(R.string.key_enableSMB_with_COB, false));
|
||||
mProfile.put("enableSMB_with_temptarget", SP.getBoolean(R.string.key_enableSMB_with_temptarget, false));
|
||||
|
|
|
@ -198,6 +198,10 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
|
|||
MainApp.getConstraintChecker().isAdvancedFilteringEnabled(advancedFiltering);
|
||||
inputConstraints.copyReasons(advancedFiltering);
|
||||
|
||||
Constraint<Boolean> uam = new Constraint<>(true);
|
||||
MainApp.getConstraintChecker().isUAMEnabled(uam);
|
||||
inputConstraints.copyReasons(uam);
|
||||
|
||||
if (L.isEnabled(L.APS))
|
||||
Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart);
|
||||
if (L.isEnabled(L.APS))
|
||||
|
@ -209,6 +213,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
|
|||
lastAutosensResult.ratio, //autosensDataRatio
|
||||
isTempTarget,
|
||||
smbAllowed.value(),
|
||||
uam.value(),
|
||||
advancedFiltering.value()
|
||||
);
|
||||
} catch (JSONException e) {
|
||||
|
|
|
@ -107,9 +107,9 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
|
|||
|
||||
@Override
|
||||
public void onPause() {
|
||||
running = false;
|
||||
super.onPause();
|
||||
MainApp.unsubscribe(this);
|
||||
running = false;
|
||||
if (L.isEnabled(L.UI))
|
||||
log.debug("onPause");
|
||||
}
|
||||
|
@ -173,10 +173,12 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
|
|||
Activity activity = getActivity();
|
||||
if (activity != null) {
|
||||
activity.runOnUiThread(() -> {
|
||||
try {
|
||||
if (running) {
|
||||
if (L.isEnabled(L.UI))
|
||||
log.debug("executing");
|
||||
try {
|
||||
dismiss();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Unhandled exception", e);
|
||||
}
|
||||
|
|
|
@ -446,7 +446,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
super.onCreateContextMenu(menu, v, menuInfo);
|
||||
if (v == apsModeView) {
|
||||
final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
|
||||
final PumpDescription pumpDescription = ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription();
|
||||
final PumpDescription pumpDescription =
|
||||
ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription();
|
||||
if (!ProfileFunctions.getInstance().isProfileValid("ContexMenuCreation"))
|
||||
return;
|
||||
menu.setHeaderTitle(MainApp.gs(R.string.loop));
|
||||
|
@ -457,19 +458,23 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
menu.add(MainApp.gs(R.string.suspendloopfor2h));
|
||||
menu.add(MainApp.gs(R.string.suspendloopfor3h));
|
||||
menu.add(MainApp.gs(R.string.suspendloopfor10h));
|
||||
if (pumpDescription.tempDurationStep15mAllowed)
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor15m));
|
||||
if (pumpDescription.tempDurationStep30mAllowed)
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor30m));
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor1h));
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor2h));
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor3h));
|
||||
} else {
|
||||
if (!loopPlugin.isDisconnected()) {
|
||||
menu.add(MainApp.gs(R.string.resume));
|
||||
}
|
||||
}
|
||||
if (!loopPlugin.isEnabled(PluginType.LOOP))
|
||||
}
|
||||
|
||||
if (!loopPlugin.isEnabled(PluginType.LOOP)) {
|
||||
menu.add(MainApp.gs(R.string.enableloop));
|
||||
}
|
||||
|
||||
if (!loopPlugin.isDisconnected()) {
|
||||
showSuspendtPump(menu, pumpDescription);
|
||||
} else {
|
||||
menu.add(MainApp.gs(R.string.reconnect));
|
||||
}
|
||||
|
||||
} else if (v == activeProfileView) {
|
||||
menu.setHeaderTitle(MainApp.gs(R.string.profile));
|
||||
menu.add(MainApp.gs(R.string.danar_viewprofile));
|
||||
|
@ -488,6 +493,17 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
}
|
||||
}
|
||||
|
||||
private void showSuspendtPump(ContextMenu menu,
|
||||
PumpDescription pumpDescription) {
|
||||
if (pumpDescription.tempDurationStep15mAllowed)
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor15m));
|
||||
if (pumpDescription.tempDurationStep30mAllowed)
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor30m));
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor1h));
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor2h));
|
||||
menu.add(MainApp.gs(R.string.disconnectpumpfor3h));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
final Profile profile = ProfileFunctions.getInstance().getProfile();
|
||||
|
@ -516,7 +532,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
updateGUI("suspendmenu");
|
||||
NSUpload.uploadOpenAPSOffline(0);
|
||||
return true;
|
||||
} else if (item.getTitle().equals(MainApp.gs(R.string.resume))) {
|
||||
} else if (item.getTitle().equals(MainApp.gs(R.string.resume)) ||
|
||||
item.getTitle().equals(MainApp.gs(R.string.reconnect))) {
|
||||
loopPlugin.suspendTo(0L);
|
||||
updateGUI("suspendmenu");
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelTempBasal(true, new Callback() {
|
||||
|
@ -1095,7 +1112,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
apsModeView.setBackgroundColor(MainApp.gc(R.color.looppumpsuspended));
|
||||
apsModeView.setText(String.format(MainApp.gs(R.string.loopsuperbolusfor), loopPlugin.minutesToEndOfSuspend()));
|
||||
apsModeView.setTextColor(Color.WHITE);
|
||||
} else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isDisconnected()) {
|
||||
} else if (loopPlugin.isDisconnected()) {
|
||||
apsModeView.setBackgroundColor(MainApp.gc(R.color.looppumpsuspended));
|
||||
apsModeView.setText(String.format(MainApp.gs(R.string.loopdisconnectedfor), loopPlugin.minutesToEndOfSuspend()));
|
||||
apsModeView.setTextColor(Color.WHITE);
|
||||
|
@ -1364,7 +1381,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
|
||||
// Sensitivity
|
||||
if (sensitivityView != null) {
|
||||
AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensDataSynchronized("Overview");
|
||||
AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Overview");
|
||||
if (autosensData != null)
|
||||
sensitivityView.setText(String.format("%.0f%%", autosensData.autosensResult.ratio * 100));
|
||||
else
|
||||
|
|
|
@ -68,6 +68,10 @@ public class Notification {
|
|||
public static final int NSMALFUNCTION = 40;
|
||||
public static final int NEWVERSIONDETECTED = 41;
|
||||
public static final int SENDLOGFILES = 42;
|
||||
public static final int DEVICENOTPAIRED = 43;
|
||||
public static final int MEDTRONIC_PUMP_ALARM = 44;
|
||||
public static final int RILEYLINK_CONNECTION = 45;
|
||||
public static final int PERMISSION_PHONESTATE = 46;
|
||||
|
||||
|
||||
public int id;
|
||||
|
|
|
@ -13,6 +13,14 @@ import android.os.Build;
|
|||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.app.TaskStackBuilder;
|
||||
|
||||
// Android Auto
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.app.NotificationManagerCompat;
|
||||
import android.support.v4.app.RemoteInput;
|
||||
|
||||
|
||||
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
|
@ -60,6 +68,18 @@ public class PersistentNotificationPlugin extends PluginBase {
|
|||
public static final int ONGOING_NOTIFICATION_ID = 4711;
|
||||
private final Context ctx;
|
||||
|
||||
/// For Android Auto
|
||||
/// Intents are not declared in manifest and not consumed, this is intentionally because actually we can't do anything with
|
||||
private static final String PACKAGE = "info.nightscout";
|
||||
private static final String READ_ACTION =
|
||||
"info.nightscout.androidaps.ACTION_MESSAGE_READ";
|
||||
private static final String REPLY_ACTION =
|
||||
"info.nightscout.androidaps.ACTION_MESSAGE_REPLY";
|
||||
private static final String CONVERSATION_ID = "conversation_id";
|
||||
private static final String EXTRA_VOICE_REPLY = "extra_voice_reply";
|
||||
/// End Android Auto
|
||||
|
||||
|
||||
public PersistentNotificationPlugin(Context ctx) {
|
||||
super(new PluginDescription()
|
||||
.mainType(PluginType.GENERAL)
|
||||
|
@ -107,7 +127,8 @@ public class PersistentNotificationPlugin extends PluginBase {
|
|||
return null;
|
||||
}
|
||||
|
||||
String line1 = "";
|
||||
String line1;
|
||||
String line1_aa;
|
||||
|
||||
if (ConfigBuilderPlugin.getPlugin().getActiveProfileInterface() == null || !ProfileFunctions.getInstance().isProfileValid("Notificiation"))
|
||||
return null;
|
||||
|
@ -118,22 +139,25 @@ public class PersistentNotificationPlugin extends PluginBase {
|
|||
GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData();
|
||||
|
||||
if (lastBG != null) {
|
||||
line1 = lastBG.valueToUnitsToString(units);
|
||||
line1 = line1_aa = lastBG.valueToUnitsToString(units);
|
||||
if (glucoseStatus != null) {
|
||||
line1 += " Δ" + deltastring(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units)
|
||||
+ " avgΔ" + deltastring(glucoseStatus.avgdelta, glucoseStatus.avgdelta * Constants.MGDL_TO_MMOLL, units);
|
||||
line1_aa += " " + lastBG.directionToSymbol();
|
||||
} else {
|
||||
line1 += " " +
|
||||
MainApp.gs(R.string.old_data) +
|
||||
" ";
|
||||
line1_aa += line1 + ".";
|
||||
}
|
||||
} else {
|
||||
line1 = MainApp.gs(R.string.missed_bg_readings);
|
||||
line1 = line1_aa = MainApp.gs(R.string.missed_bg_readings);
|
||||
}
|
||||
|
||||
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis());
|
||||
if (activeTemp != null) {
|
||||
line1 += " " + activeTemp.toStringShort();
|
||||
line1_aa += " " + activeTemp.toStringShort() + ".";
|
||||
}
|
||||
|
||||
//IOB
|
||||
|
@ -143,12 +167,55 @@ public class PersistentNotificationPlugin extends PluginBase {
|
|||
IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round();
|
||||
|
||||
|
||||
String line2 = MainApp.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString();;
|
||||
String line2 = MainApp.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString();
|
||||
String line2_aa = MainApp.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U. " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString() + ".";
|
||||
|
||||
|
||||
String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getPlugin().getActivePump().getBaseBasalRate()) + " U/h";
|
||||
String line3_aa = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getPlugin().getActivePump().getBaseBasalRate()) + " U/h.";
|
||||
|
||||
|
||||
line3 += " - " + ProfileFunctions.getInstance().getProfileName();
|
||||
line3_aa += " - " + ProfileFunctions.getInstance().getProfileName() + ".";
|
||||
|
||||
/// For Android Auto
|
||||
Intent msgReadIntent = new Intent()
|
||||
.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
|
||||
.setAction(READ_ACTION)
|
||||
.putExtra(CONVERSATION_ID, ONGOING_NOTIFICATION_ID)
|
||||
.setPackage(PACKAGE);
|
||||
|
||||
PendingIntent msgReadPendingIntent =
|
||||
PendingIntent.getBroadcast(ctx,
|
||||
ONGOING_NOTIFICATION_ID,
|
||||
msgReadIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
Intent msgReplyIntent = new Intent()
|
||||
.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
|
||||
.setAction(REPLY_ACTION)
|
||||
.putExtra(CONVERSATION_ID, ONGOING_NOTIFICATION_ID)
|
||||
.setPackage(PACKAGE);
|
||||
|
||||
PendingIntent msgReplyPendingIntent = PendingIntent.getBroadcast(
|
||||
ctx,
|
||||
ONGOING_NOTIFICATION_ID,
|
||||
msgReplyIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
// Build a RemoteInput for receiving voice input from devices
|
||||
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY).build();
|
||||
|
||||
// Create the UnreadConversation
|
||||
NotificationCompat.CarExtender.UnreadConversation.Builder unreadConversationBuilder =
|
||||
new NotificationCompat.CarExtender.UnreadConversation.Builder(line1_aa + "\n" + line2_aa)
|
||||
.setLatestTimestamp(System.currentTimeMillis())
|
||||
.setReadPendingIntent(msgReadPendingIntent)
|
||||
.setReplyAction(msgReplyPendingIntent, remoteInput);
|
||||
|
||||
/// Add dot to produce a "more natural sounding result"
|
||||
unreadConversationBuilder.addMessage(line3_aa);
|
||||
/// End Android Auto
|
||||
|
||||
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID);
|
||||
|
@ -167,6 +234,11 @@ public class PersistentNotificationPlugin extends PluginBase {
|
|||
builder.setContentTitle(line1);
|
||||
builder.setContentText(line2);
|
||||
builder.setSubText(line3);
|
||||
/// Android Auto
|
||||
builder.extend(new NotificationCompat.CarExtender()
|
||||
.setUnreadConversation(unreadConversationBuilder.build()));
|
||||
/// End Android Auto
|
||||
|
||||
|
||||
Intent resultIntent = new Intent(ctx, MainActivity.class);
|
||||
|
||||
|
|
|
@ -156,7 +156,7 @@ public class LocalProfileFragment extends SubscriberFragment {
|
|||
public String getSumLabel() {
|
||||
ProfileStore profile = LocalProfilePlugin.getPlugin().createProfileStore();
|
||||
if (profile != null)
|
||||
return " ∑" + DecimalFormatter.to2Decimal(profile.getDefaultProfile().baseBasalSum()) + "U";
|
||||
return " ∑" + DecimalFormatter.to2Decimal(profile.getDefaultProfile().baseBasalSum()) + MainApp.gs(R.string.insulin_unit_shortname);
|
||||
else
|
||||
return MainApp.gs(R.string.localprofile);
|
||||
}
|
||||
|
|
|
@ -52,6 +52,8 @@ public class NSProfileFragment extends SubscriberFragment {
|
|||
TextView isf;
|
||||
@BindView(R.id.profileview_basal)
|
||||
TextView basal;
|
||||
@BindView(R.id.profileview_basaltotal)
|
||||
TextView basaltotal;
|
||||
@BindView(R.id.profileview_target)
|
||||
TextView target;
|
||||
@BindView(R.id.basal_graph)
|
||||
|
@ -116,6 +118,7 @@ public class NSProfileFragment extends SubscriberFragment {
|
|||
ic.setText(profile.getIcList());
|
||||
isf.setText(profile.getIsfList());
|
||||
basal.setText(profile.getBasalList());
|
||||
basaltotal.setText(String.format(MainApp.gs(R.string.profile_total), DecimalFormatter.to2Decimal(profile.baseBasalSum())));
|
||||
target.setText(profile.getTargetList());
|
||||
basalGraph.show(profile);
|
||||
}
|
||||
|
@ -141,6 +144,7 @@ public class NSProfileFragment extends SubscriberFragment {
|
|||
ic.setText("");
|
||||
isf.setText("");
|
||||
basal.setText("");
|
||||
basaltotal.setText("");
|
||||
target.setText("");
|
||||
activateButton.setVisibility(View.GONE);
|
||||
}
|
||||
|
|
|
@ -653,11 +653,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a DetailedBolusInfo from a pump bolus and adds it as a Treatment to the DB.
|
||||
* Handles edge cases when dates aren't unique which are extremely unlikely to occur,
|
||||
* but if they do, the user should be warned since a bolus will be missing from calculations.
|
||||
*/
|
||||
/** Creates a treatment record based on the request in DetailBolusInfo and the delivered bolus. */
|
||||
private boolean addBolusToTreatments(DetailedBolusInfo detailedBolusInfo, Bolus lastPumpBolus) {
|
||||
DetailedBolusInfo dbi = detailedBolusInfo.copy();
|
||||
dbi.date = calculateFakeBolusDate(lastPumpBolus);
|
||||
|
@ -665,15 +661,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
|
|||
dbi.source = Source.PUMP;
|
||||
dbi.insulin = lastPumpBolus.amount;
|
||||
try {
|
||||
boolean treatmentCreated = TreatmentsPlugin.getPlugin().addToHistoryTreatment(dbi, false);
|
||||
if (!treatmentCreated) {
|
||||
log.error("Adding treatment record overrode an existing record: " + dbi);
|
||||
if (dbi.isSMB) {
|
||||
Notification notification = new Notification(Notification.COMBO_PUMP_ALARM, MainApp.gs(R.string.combo_error_updating_treatment_record), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(notification));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
TreatmentsPlugin.getPlugin().addToHistoryTreatment(dbi, true);
|
||||
} catch (Exception e) {
|
||||
log.error("Adding treatment record failed", e);
|
||||
if (dbi.isSMB) {
|
||||
|
@ -1149,6 +1137,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
|
|||
return historyResult.success;
|
||||
}
|
||||
|
||||
/** Return value indicates whether a new record was created. */
|
||||
private boolean updateDbFromPumpHistory(@NonNull PumpHistory history) {
|
||||
boolean updated = false;
|
||||
for (Bolus pumpBolus : history.bolusHistory) {
|
||||
|
@ -1158,8 +1147,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
|
|||
dbi.source = Source.PUMP;
|
||||
dbi.insulin = pumpBolus.amount;
|
||||
dbi.eventType = CareportalEvent.CORRECTIONBOLUS;
|
||||
if (TreatmentsPlugin.getPlugin().getService().getPumpRecordById(dbi.pumpId) == null) {
|
||||
TreatmentsPlugin.getPlugin().addToHistoryTreatment(dbi, false);
|
||||
if (TreatmentsPlugin.getPlugin().addToHistoryTreatment(dbi, true)) {
|
||||
updated = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgPCCommStart;
|
|||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgPCCommStop;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
|
||||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.ToastUtils;
|
||||
|
||||
|
@ -236,4 +237,15 @@ public abstract class AbstractDanaRExecutionService extends Service {
|
|||
result.comment = "OK";
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void waitForWholeMinute() {
|
||||
while (true) {
|
||||
long time = DateUtil.now();
|
||||
long timeToWholeMinute = (60000 - time % 60000);
|
||||
if (timeToWholeMinute > 59800 || timeToWholeMinute < 3000)
|
||||
break;
|
||||
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int) (timeToWholeMinute / 1000))));
|
||||
SystemClock.sleep(Math.min(timeToWholeMinute, 100));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory;
|
|||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
||||
|
@ -51,5 +52,9 @@ public class MsgInitConnStatusBolus_k extends MessageBase {
|
|||
} else {
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED));
|
||||
}
|
||||
|
||||
// This is last message of initial sequence
|
||||
if (ConfigBuilderPlugin.getPlugin().getActivePump() != null)
|
||||
ConfigBuilderPlugin.getPlugin().getActivePump().finishHandshaking();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface;
|
|||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
||||
|
@ -55,8 +56,8 @@ import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgSettingBasal_k
|
|||
import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgStatusBasic_k;
|
||||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.androidaps.queue.commands.Command;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.T;
|
||||
|
||||
public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
|
||||
|
||||
|
@ -189,7 +190,9 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
|
|||
if (L.isEnabled(L.PUMP))
|
||||
log.debug("Pump time difference: " + timeDiff + " seconds");
|
||||
if (Math.abs(timeDiff) > 10) {
|
||||
mSerialIOThread.sendMessage(new MsgSetTime(new Date()));
|
||||
waitForWholeMinute(); // Dana can set only whole minute
|
||||
// add 10sec to be sure we are over minute (will be cutted off anyway)
|
||||
mSerialIOThread.sendMessage(new MsgSetTime(new Date(DateUtil.now() + T.secs(10).msecs())));
|
||||
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
|
||||
timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
|
||||
if (L.isEnabled(L.PUMP))
|
||||
|
|
|
@ -415,6 +415,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
|
|||
if (!result.success) {
|
||||
String error = "" + DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode;
|
||||
switch (DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode) {
|
||||
// 4 reported as max bolus violation. Check later
|
||||
case 0x10:
|
||||
error = MainApp.gs(R.string.maxbolusviolation);
|
||||
break;
|
||||
|
|
|
@ -45,6 +45,12 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
|
|||
public DanaRS_Packet_APS_History_Events(long from) {
|
||||
this();
|
||||
GregorianCalendar cal = new GregorianCalendar();
|
||||
|
||||
if (from > DateUtil.now()) {
|
||||
log.debug("Asked to load from the future");
|
||||
from = 0;
|
||||
}
|
||||
|
||||
if (from != 0)
|
||||
cal.setTimeInMillis(from);
|
||||
else
|
||||
|
|
|
@ -144,9 +144,9 @@ public class BLEComm {
|
|||
|
||||
if (L.isEnabled(L.PUMPBTCOMM))
|
||||
log.debug("Trying to create a new connection from: " + from);
|
||||
mBluetoothDeviceName = device.getName();
|
||||
mBluetoothGatt = device.connectGatt(service.getApplicationContext(), false, mGattCallback);
|
||||
setCharacteristicNotification(getUARTReadBTGattChar(), true);
|
||||
mBluetoothDeviceName = device.getName();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -662,7 +662,13 @@ public class BLEComm {
|
|||
|
||||
private void SendPumpCheck() {
|
||||
// 1st message sent to pump after connect
|
||||
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PUMP_CHECK, null, getConnectDeviceName());
|
||||
String devicename = getConnectDeviceName();
|
||||
if(devicename == null || devicename.equals("")){
|
||||
Notification n = new Notification(Notification.DEVICENOTPAIRED, MainApp.gs(R.string.pairfirst), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(n));
|
||||
return;
|
||||
}
|
||||
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PUMP_CHECK, null, devicename);
|
||||
if (L.isEnabled(L.PUMPBTCOMM))
|
||||
log.debug(">>>>> " + "ENCRYPTION__PUMP_CHECK (0x00)" + " " + DanaRS_Packet.toHexString(bytes));
|
||||
writeCharacteristic_NO_RESPONSE(getUARTWriteBTGattChar(), bytes);
|
||||
|
|
|
@ -26,23 +26,30 @@ public class MsgHistoryEvents_v2 extends MessageBase {
|
|||
|
||||
public static long lastEventTimeLoaded = 0;
|
||||
|
||||
public MsgHistoryEvents_v2() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
public MsgHistoryEvents_v2(long from) {
|
||||
SetCommand(0xE003);
|
||||
|
||||
if (from > DateUtil.now()) {
|
||||
log.debug("Asked to load from the future");
|
||||
from = 0;
|
||||
}
|
||||
|
||||
if (from == 0) {
|
||||
AddParamByte((byte) 0);
|
||||
AddParamByte((byte) 1);
|
||||
AddParamByte((byte) 1);
|
||||
AddParamByte((byte) 0);
|
||||
AddParamByte((byte) 0);
|
||||
} else {
|
||||
GregorianCalendar gfrom = new GregorianCalendar();
|
||||
gfrom.setTimeInMillis(from);
|
||||
AddParamDate(gfrom);
|
||||
done = false;
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
log.debug("New message");
|
||||
}
|
||||
|
||||
public MsgHistoryEvents_v2() {
|
||||
SetCommand(0xE003);
|
||||
AddParamByte((byte) 0);
|
||||
AddParamByte((byte) 1);
|
||||
AddParamByte((byte) 1);
|
||||
AddParamByte((byte) 0);
|
||||
AddParamByte((byte) 0);
|
||||
done = false;
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
log.debug("New message");
|
||||
|
|
|
@ -25,6 +25,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface;
|
|||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
|
||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||
|
@ -71,7 +72,6 @@ import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
|||
import info.nightscout.androidaps.queue.Callback;
|
||||
import info.nightscout.androidaps.queue.commands.Command;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.T;
|
||||
|
||||
|
@ -465,16 +465,10 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
|
|||
if (!isConnected())
|
||||
return new PumpEnactResult().success(false);
|
||||
SystemClock.sleep(300);
|
||||
MsgHistoryEvents_v2 msg;
|
||||
if (lastHistoryFetched == 0) {
|
||||
msg = new MsgHistoryEvents_v2();
|
||||
if (L.isEnabled(L.PUMP))
|
||||
log.debug("Loading complete event history");
|
||||
} else {
|
||||
msg = new MsgHistoryEvents_v2(lastHistoryFetched);
|
||||
MsgHistoryEvents_v2 msg = new MsgHistoryEvents_v2(lastHistoryFetched);
|
||||
if (L.isEnabled(L.PUMP))
|
||||
log.debug("Loading event history from: " + DateUtil.dateAndTimeFullString(lastHistoryFetched));
|
||||
}
|
||||
|
||||
mSerialIOThread.sendMessage(msg);
|
||||
while (!msg.done && mRfcommSocket.isConnected()) {
|
||||
SystemClock.sleep(100);
|
||||
|
@ -503,17 +497,6 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
|
|||
return true;
|
||||
}
|
||||
|
||||
void waitForWholeMinute() {
|
||||
while (true) {
|
||||
long time = DateUtil.now();
|
||||
long timeToWholeMinute = (60000 - time % 60000);
|
||||
if (timeToWholeMinute > 59800 || timeToWholeMinute < 3000)
|
||||
break;
|
||||
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int) (timeToWholeMinute / 1000))));
|
||||
SystemClock.sleep(Math.min(timeToWholeMinute, 100));
|
||||
}
|
||||
}
|
||||
|
||||
public PumpEnactResult setUserOptions() {
|
||||
if (!isConnected())
|
||||
return new PumpEnactResult().success(false);
|
||||
|
|
|
@ -519,12 +519,13 @@ public class SmsCommunicatorPlugin extends PluginBase {
|
|||
} else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed &&
|
||||
suspendWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - suspendWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) {
|
||||
suspendWaitingForConfirmation.processed = true;
|
||||
final int dur = suspendWaitingForConfirmation.duration;
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelTempBasal(true, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (result.success) {
|
||||
LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + suspendWaitingForConfirmation.duration * 60L * 1000);
|
||||
NSUpload.uploadOpenAPSOffline(suspendWaitingForConfirmation.duration * 60);
|
||||
LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + dur * 60L * 1000);
|
||||
NSUpload.uploadOpenAPSOffline(dur * 60);
|
||||
MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED"));
|
||||
String reply = MainApp.gs(R.string.smscommunicator_loopsuspended) + " " +
|
||||
MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed);
|
||||
|
|
|
@ -11,7 +11,7 @@ import info.nightscout.androidaps.db.Source;
|
|||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
|
||||
import info.nightscout.androidaps.queue.Callback;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.T;
|
||||
|
||||
import static info.nightscout.utils.DateUtil.now;
|
||||
|
||||
|
@ -29,17 +29,14 @@ public class CarbsGenerator {
|
|||
}
|
||||
|
||||
public static void createCarb(int carbs, long time, String eventType, @Nullable String notes) {
|
||||
long now = DateUtil.now();
|
||||
int carbTime = (int) ((time - now) / 1000 / 60);
|
||||
DetailedBolusInfo carbInfo = new DetailedBolusInfo();
|
||||
carbInfo.date = now;
|
||||
carbInfo.carbTime = carbTime;
|
||||
carbInfo.date = time;
|
||||
carbInfo.eventType = eventType;
|
||||
carbInfo.carbs = carbs;
|
||||
carbInfo.context = MainApp.instance();
|
||||
carbInfo.source = Source.USER;
|
||||
carbInfo.notes = notes;
|
||||
if (ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) {
|
||||
if (ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now() && carbInfo.date > now()- T.mins(2).msecs()) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().bolus(carbInfo, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -54,6 +51,8 @@ public class CarbsGenerator {
|
|||
}
|
||||
});
|
||||
} else {
|
||||
// Don't send to pump if it is in the future or more than 5 minutes in the past
|
||||
// as pumps might return those as as "now" when reading the history.
|
||||
TreatmentsPlugin.getPlugin().addToHistoryTreatment(carbInfo, false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -506,26 +506,14 @@ public class TreatmentService extends OrmLiteBaseService<DatabaseHelper> {
|
|||
return null;
|
||||
}
|
||||
|
||||
public static class UpdateReturn {
|
||||
|
||||
boolean newRecord;
|
||||
boolean success;
|
||||
|
||||
public UpdateReturn() {
|
||||
success = false;
|
||||
newRecord = false;
|
||||
}
|
||||
|
||||
|
||||
public class UpdateReturn {
|
||||
public UpdateReturn(boolean success, boolean newRecord) {
|
||||
this.success = success;
|
||||
this.newRecord = newRecord;
|
||||
}
|
||||
|
||||
public void or(UpdateReturn ur) {
|
||||
success = success || ur.success;
|
||||
newRecord = newRecord || ur.newRecord;
|
||||
}
|
||||
boolean newRecord;
|
||||
boolean success;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -43,7 +43,6 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
|||
import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
|
||||
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
|
||||
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
||||
|
@ -51,6 +50,7 @@ import info.nightscout.androidaps.plugins.Sensitivity.SensitivityAAPSPlugin;
|
|||
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityWeightedAveragePlugin;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.FabricPrivacy;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.T;
|
||||
|
||||
|
@ -259,7 +259,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
if (t > absorptionTime_ago && t <= now) {
|
||||
if (treatment.carbs >= 1) {
|
||||
result.carbs += treatment.carbs;
|
||||
if (t > result.lastCarbTime)
|
||||
if(t > result.lastCarbTime)
|
||||
result.lastCarbTime = t;
|
||||
}
|
||||
}
|
||||
|
@ -379,7 +379,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
TemporaryBasal t = tempBasals.get(pos);
|
||||
if (t.date > time) continue;
|
||||
IobTotal calc;
|
||||
if (truncate && t.end() > truncateTime) {
|
||||
if(truncate && t.end() > truncateTime){
|
||||
TemporaryBasal dummyTemp = new TemporaryBasal();
|
||||
dummyTemp.copyFrom(t);
|
||||
dummyTemp.cutEndTo(truncateTime);
|
||||
|
@ -398,7 +398,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
ExtendedBolus e = extendedBoluses.get(pos);
|
||||
if (e.date > time) continue;
|
||||
IobTotal calc;
|
||||
if (truncate && e.end() > truncateTime) {
|
||||
if(truncate && e.end() > truncateTime){
|
||||
ExtendedBolus dummyExt = new ExtendedBolus();
|
||||
dummyExt.copyFrom(e);
|
||||
dummyExt.cutEndTo(truncateTime);
|
||||
|
@ -495,12 +495,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
// return true if new record is created
|
||||
@Override
|
||||
public boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo, boolean allowUpdate) {
|
||||
|
||||
if (detailedBolusInfo.insulin == 0 && detailedBolusInfo.carbs == 0) {
|
||||
log.error("Not valid record");
|
||||
return false;
|
||||
}
|
||||
|
||||
Treatment treatment = new Treatment();
|
||||
treatment.date = detailedBolusInfo.date;
|
||||
treatment.source = detailedBolusInfo.source;
|
||||
|
@ -513,27 +507,19 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
treatment.source = detailedBolusInfo.source;
|
||||
treatment.mealBolus = treatment.carbs > 0;
|
||||
treatment.boluscalc = detailedBolusInfo.boluscalc != null ? detailedBolusInfo.boluscalc.toString() : null;
|
||||
TreatmentService.UpdateReturn creatOrUpdateResult = new TreatmentService.UpdateReturn();
|
||||
TreatmentService.UpdateReturn creatOrUpdateResultCarbs = new TreatmentService.UpdateReturn();
|
||||
if (treatment.insulin > 0) {
|
||||
creatOrUpdateResult = getService().createOrUpdate(treatment);
|
||||
TreatmentService.UpdateReturn creatOrUpdateResult = getService().createOrUpdate(treatment);
|
||||
boolean newRecordCreated = creatOrUpdateResult.newRecord;
|
||||
//log.debug("Adding new Treatment record" + treatment.toString());
|
||||
}
|
||||
|
||||
if (detailedBolusInfo.carbTime != 0 && detailedBolusInfo.carbs > 0) {
|
||||
if (detailedBolusInfo.carbTime != 0) {
|
||||
Treatment carbsTreatment = new Treatment();
|
||||
carbsTreatment.source = detailedBolusInfo.source;
|
||||
carbsTreatment.pumpId = detailedBolusInfo.pumpId; // but this should never happen
|
||||
carbsTreatment.date = detailedBolusInfo.date + T.mins(detailedBolusInfo.carbTime).msecs() + T.secs(1).msecs(); // add 1 sec to make them different records
|
||||
carbsTreatment.date = detailedBolusInfo.date + detailedBolusInfo.carbTime * 60 * 1000L + 1000L; // add 1 sec to make them different records
|
||||
carbsTreatment.carbs = detailedBolusInfo.carbs;
|
||||
carbsTreatment.source = detailedBolusInfo.source;
|
||||
creatOrUpdateResultCarbs = getService().createOrUpdate(carbsTreatment);
|
||||
getService().createOrUpdate(carbsTreatment);
|
||||
//log.debug("Adding new Treatment record" + carbsTreatment);
|
||||
}
|
||||
|
||||
creatOrUpdateResult.or(creatOrUpdateResultCarbs);
|
||||
boolean newRecordCreated = creatOrUpdateResult.newRecord;
|
||||
|
||||
if (newRecordCreated && detailedBolusInfo.isValid)
|
||||
NSUpload.uploadTreatmentRecord(detailedBolusInfo);
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ public class CommandQueue {
|
|||
}
|
||||
|
||||
private synchronized void removeAll(Command.CommandType type) {
|
||||
for (int i = 0; i < queue.size(); i++) {
|
||||
for (int i = queue.size() - 1; i >= 0; i--) {
|
||||
if (queue.get(i).commandType == type) {
|
||||
queue.remove(i);
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ public class SWItem {
|
|||
}
|
||||
|
||||
public static LinearLayout generateLayout(View view) {
|
||||
LinearLayout layout = (LinearLayout) view.findViewById(view.getId());
|
||||
LinearLayout layout = (LinearLayout) view;
|
||||
layout.removeAllViews();
|
||||
return layout;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ public class AndroidPermission {
|
|||
public static final int CASE_SMS = 0x2;
|
||||
public static final int CASE_LOCATION = 0x3;
|
||||
public static final int CASE_BATTERY = 0x4;
|
||||
public static final int CASE_PHONESTATE = 0x5;
|
||||
|
||||
public static void askForPermission(Activity activity, String[] permission, Integer requestCode) {
|
||||
boolean test = false;
|
||||
|
@ -44,7 +45,7 @@ public class AndroidPermission {
|
|||
}
|
||||
|
||||
public static synchronized void notifyForSMSPermissions(Activity activity) {
|
||||
if (SP.getBoolean(R.string.smscommunicator_remotecommandsallowed, false)) {
|
||||
if (SP.getBoolean(R.string.key_smscommunicator_remotecommandsallowed, false)) {
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
|
||||
if (!checkForPermission(activity, Manifest.permission.RECEIVE_SMS)) {
|
||||
NotificationWithAction notification = new NotificationWithAction(Notification.PERMISSION_SMS, MainApp.gs(R.string.smscommunicator_missingsmspermission), Notification.URGENT);
|
||||
|
@ -55,6 +56,16 @@ public class AndroidPermission {
|
|||
} else
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.PERMISSION_SMS));
|
||||
}
|
||||
// Following is a bug in Android 8
|
||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) {
|
||||
if (!checkForPermission(activity, Manifest.permission.READ_PHONE_STATE)) {
|
||||
NotificationWithAction notification = new NotificationWithAction(Notification.PERMISSION_PHONESTATE, MainApp.gs(R.string.smscommunicator_missingphonestatepermission), Notification.URGENT);
|
||||
notification.action(MainApp.gs(R.string.request), () ->
|
||||
AndroidPermission.askForPermission(activity, new String[]{Manifest.permission.READ_PHONE_STATE}, AndroidPermission.CASE_PHONESTATE));
|
||||
MainApp.bus().post(new EventNewNotification(notification));
|
||||
} else
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.PERMISSION_PHONESTATE));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -110,12 +110,13 @@ public class FabricPrivacy {
|
|||
CustomEvent pluginStats = new CustomEvent("PluginStats");
|
||||
pluginStats.putCustomAttribute("version", BuildConfig.VERSION);
|
||||
pluginStats.putCustomAttribute("HEAD", BuildConfig.HEAD);
|
||||
pluginStats.putCustomAttribute("language", SP.getString(R.string.key_language,"default"));
|
||||
for (PluginBase plugin : MainApp.getPluginsList()) {
|
||||
if (!plugin.pluginDescription.alwaysEnabled) {
|
||||
if (plugin.isEnabled(plugin.getType()))
|
||||
if (plugin.isEnabled(plugin.getType()) && !plugin.pluginDescription.alwaysEnabled) {
|
||||
// Fabric allows no more than 20 attributes attached to an event. By reporting disabled plugins as
|
||||
// well, we would exceed that threshold, so only report what is enabled
|
||||
// TODO >2.0: consider reworking this to upload an event per enabled plugin instead.
|
||||
pluginStats.putCustomAttribute(plugin.getClass().getSimpleName(), "enabled");
|
||||
else
|
||||
pluginStats.putCustomAttribute(plugin.getClass().getSimpleName(), "disabled");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ public class JsonHelper {
|
|||
public static Object safeGetObject(JSONObject json, String fieldName, Object defaultValue) {
|
||||
Object result = defaultValue;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.get(fieldName);
|
||||
} catch (JSONException ignored) {
|
||||
|
@ -36,7 +36,7 @@ public class JsonHelper {
|
|||
public static String safeGetString(JSONObject json, String fieldName) {
|
||||
String result = null;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.getString(fieldName);
|
||||
} catch (JSONException ignored) {
|
||||
|
@ -49,7 +49,7 @@ public class JsonHelper {
|
|||
public static String safeGetString(JSONObject json, String fieldName, String defaultValue) {
|
||||
String result = defaultValue;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.getString(fieldName);
|
||||
} catch (JSONException ignored) {
|
||||
|
@ -62,7 +62,7 @@ public class JsonHelper {
|
|||
public static double safeGetDouble(JSONObject json, String fieldName) {
|
||||
double result = 0d;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.getDouble(fieldName);
|
||||
} catch (JSONException ignored) {
|
||||
|
@ -75,7 +75,7 @@ public class JsonHelper {
|
|||
public static int safeGetInt(JSONObject json, String fieldName) {
|
||||
int result = 0;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.getInt(fieldName);
|
||||
} catch (JSONException ignored) {
|
||||
|
@ -88,7 +88,7 @@ public class JsonHelper {
|
|||
public static long safeGetLong(JSONObject json, String fieldName) {
|
||||
long result = 0;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.getLong(fieldName);
|
||||
} catch (JSONException e) {
|
||||
|
@ -101,7 +101,7 @@ public class JsonHelper {
|
|||
public static boolean safeGetBoolean(JSONObject json, String fieldName) {
|
||||
boolean result = false;
|
||||
|
||||
if (json.has(fieldName)) {
|
||||
if (json != null && json.has(fieldName)) {
|
||||
try {
|
||||
result = json.getBoolean(fieldName);
|
||||
} catch (JSONException e) {
|
||||
|
|
43
app/src/main/java/info/nightscout/utils/MidnightTime.java
Normal file
43
app/src/main/java/info/nightscout/utils/MidnightTime.java
Normal file
|
@ -0,0 +1,43 @@
|
|||
package info.nightscout.utils;
|
||||
|
||||
import android.util.LongSparseArray;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
public class MidnightTime {
|
||||
private static LongSparseArray times = new LongSparseArray();
|
||||
|
||||
private static long hits = 0;
|
||||
private static long misses = 0;
|
||||
|
||||
public static long calc() {
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
return c.getTimeInMillis();
|
||||
}
|
||||
|
||||
public static long calc(long time) {
|
||||
Long m = (Long) times.get(time);
|
||||
if (m != null) {
|
||||
++hits;
|
||||
return m;
|
||||
}
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.setTimeInMillis(time);
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
m = c.getTimeInMillis();
|
||||
times.append(time, m);
|
||||
++misses;
|
||||
return m;
|
||||
}
|
||||
|
||||
public static String log() {
|
||||
return "Hits: " + hits + " misses: " + misses + " stored: " + times.size();
|
||||
}
|
||||
}
|
|
@ -8,23 +8,15 @@ import java.util.regex.Pattern;
|
|||
*/
|
||||
|
||||
public class PercentageSplitter {
|
||||
// "Profile name (200%,2h)"
|
||||
private static final Pattern percentagePattern = Pattern.compile("(.+)\\(\\d+%,\\d+h\\)");
|
||||
// "Profile name (200%)"
|
||||
private static final Pattern percentageShiftPattern = Pattern.compile("(.+)\\(\\d+%\\)");
|
||||
// Matches "Profile name (200%,-2h)", "Profile name (50%)
|
||||
private static final Pattern splitPattern = Pattern.compile("(.+)\\(\\d+%(,-?\\d+h)?\\)");
|
||||
|
||||
/** Removes the suffix for percentage and timeshift from a profile name. */
|
||||
/** Removes the suffix for percentage and timeshift from a profile name. This is the inverse of what
|
||||
* {@link info.nightscout.androidaps.db.ProfileSwitch#getCustomizedName()} does.
|
||||
* Since the customized name is used for the PS upload to NS, this is needed get the original profile name
|
||||
* when retrieving the PS from NS again. */
|
||||
public static String pureName(String name) {
|
||||
Matcher percentageMatch = percentagePattern.matcher(name);
|
||||
if (percentageMatch.find()) {
|
||||
return percentageMatch.group(1).trim();
|
||||
}
|
||||
|
||||
Matcher percentageShiftMatch = percentageShiftPattern.matcher(name);
|
||||
if (percentageShiftMatch.find()) {
|
||||
return percentageShiftMatch.group(1).trim();
|
||||
}
|
||||
|
||||
return name;
|
||||
Matcher percentageMatch = splitPattern.matcher(name);
|
||||
return percentageMatch.find() ? percentageMatch.group(1).trim() : name;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ public class SafeParse {
|
|||
public static Double stringToDouble(String input) {
|
||||
Double result = 0d;
|
||||
input = input.replace(",", ".");
|
||||
input = input.replace("−", "-");
|
||||
if (input.equals(""))
|
||||
return 0d;
|
||||
try {
|
||||
|
@ -24,6 +25,7 @@ public class SafeParse {
|
|||
public static Integer stringToInt(String input) {
|
||||
Integer result = 0;
|
||||
input = input.replace(",", ".");
|
||||
input = input.replace("−", "-");
|
||||
if (input.equals(""))
|
||||
return 0;
|
||||
try {
|
||||
|
@ -37,6 +39,7 @@ public class SafeParse {
|
|||
public static Long stringToLong(String input) {
|
||||
Long result = 0L;
|
||||
input = input.replace(",", ".");
|
||||
input = input.replace("−", "-");
|
||||
if (input.equals(""))
|
||||
return 0L;
|
||||
try {
|
||||
|
|
|
@ -345,6 +345,42 @@
|
|||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="2"
|
||||
android:gravity="end"
|
||||
android:paddingRight="5dp"
|
||||
android:text=""
|
||||
android:textSize="14sp" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="5dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0"
|
||||
android:gravity="center_horizontal"
|
||||
android:paddingEnd="2dp"
|
||||
android:paddingStart="2dp"
|
||||
android:text=""
|
||||
android:textSize="14sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/profileview_basaltotal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="start"
|
||||
android:paddingLeft="17dp"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<info.nightscout.androidaps.plugins.Treatments.fragments.ProfileGraph
|
||||
android:id="@+id/basal_graph"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -1,3 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="alert_w31">Waarskuwing W31: Kasset laag</string>
|
||||
<string name="alert_w32">Waarskuwing W32: Battery laag</string>
|
||||
<string name="alert_w33">Waarskuwing W33: Ongeldige tyd/datum</string>
|
||||
<string name="alert_w34">Waakskuwing W34: Einde van waarborg</string>
|
||||
<string name="alert_w36">Waarskuwing W36: TBR gekanselleer</string>
|
||||
<string name="alert_w38">Waarskuwing W38: Bolus gekanselleer</string>
|
||||
<string name="alert_w39">Waarskuwing W39: Leentyd waarskuwing</string>
|
||||
<string name="alert_m20">Onderhoud M20: Kasset nie ingevoeg</string>
|
||||
<string name="alert_m21">Onderhoud M21: kasset leeg</string>
|
||||
<string name="alert_m22">Onderhoud M22: Battery leeg</string>
|
||||
<string name="alert_m23">Onderhoud M23: Outomaties af</string>
|
||||
<string name="alert_m24">Onderhoud M24: verstopping</string>
|
||||
<string name="alert_m25">Onderhoud M25: Leentyd oor - einde van bewerking</string>
|
||||
<string name="alert_m26">Onderhoud M26: Kasset-verandering nie voltooi nie</string>
|
||||
<string name="alert_m27">Onderhoud M27: Data aflaai het misluk</string>
|
||||
<string name="alert_m28">Onderhoud M28: Wag-modus uit tyd uit</string>
|
||||
<string name="alert_m29">Onderhoud M29: Battery-tipe nie voltooi nie</string>
|
||||
<string name="alert_m30">Onderhoud M30: Kasset-tipe nie voltooi nie</string>
|
||||
<string name="alert_e6">Fout E6: Meganiese fout</string>
|
||||
<string name="alert_e7">Fout E7: Elektroniese fout</string>
|
||||
<string name="alert_e10">Fout E10: Terugdraai fout</string>
|
||||
<string name="alert_e13">Fout E13: Taal fout</string>
|
||||
</resources>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -532,6 +532,7 @@
|
|||
<string name="disconnectpumpfor2h">Изключи помпата за 2 ч</string>
|
||||
<string name="disconnectpumpfor3h">Изключи помпата за 3 ч</string>
|
||||
<string name="resume">Възстанови</string>
|
||||
<string name="reconnect">Свържи помпа</string>
|
||||
<string name="smscommunicator_wrongduration">Грешна продължителност</string>
|
||||
<string name="smscommunicator_loopsuspended">APS забранен</string>
|
||||
<string name="smscommunicator_loopresumed">APS възобновен</string>
|
||||
|
@ -888,6 +889,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Затворения кръг е забранен в настройките</string>
|
||||
<string name="autosensdisabledinpreferences">Аутосенс е забранен в настройките</string>
|
||||
<string name="smbdisabledinpreferences">SMB е забранен в настройките</string>
|
||||
<string name="uamdisabledinpreferences">UAM е забранен в настройките</string>
|
||||
<string name="uamdisabledoref1notselected">UAM изключен, защото му трябва Oref1 плъгин за чувствителност </string>
|
||||
<string name="limitingbasalratio">Ограничаване на макс. базална стойност до %1$.2f Е/ч поради %2$s</string>
|
||||
<string name="pumplimit">лимит на помпата</string>
|
||||
<string name="itmustbepositivevalue">трябва да бъде положително число</string>
|
||||
|
@ -1036,8 +1039,7 @@
|
|||
<string name="nav_logsettings">Настройки на логовете</string>
|
||||
<string name="resettodefaults">Възстанови настройките по подразбиране</string>
|
||||
<string name="nsmalfunction">Грешка в NSClient. Рестартирайте Nightscout и NSClient</string>
|
||||
<string name="as">като
|
||||
</string>
|
||||
<string name="as">АS</string>
|
||||
<string name="versionavailable">Има налично обновяване до версия %1$s </string>
|
||||
<string name="time_offset">времево отместване</string>
|
||||
<string name="setupwizard_preferred_aps_mode">Предпочитаният режим на APS</string>
|
||||
|
@ -1051,6 +1053,11 @@
|
|||
<string name="insulinlimitviolation">Нарушение на макс дневен инсулин</string>
|
||||
<string name="loop_openmode_min_change">Минимална стойност за промяна [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">AndroidAPS ще покаже запитването за промяна на базала само ако е по-голямо от тази стойност.(Стандартно 20%)</string>
|
||||
<string name="pairfirst">Моля първо свържете помпата с телефона от Bluetooth настройките </string>
|
||||
<string name="profile_total">Общо %1$s Е</string>
|
||||
<string name="profile_ins_units_per_hout">Е/ч</string>
|
||||
<string name="profile_carbs_per_unit">гр/Е</string>
|
||||
<string name="profile_per_unit">/Е</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d дeн</item>
|
||||
<item quantity="other">%1$d дни</item>
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
<string name="description_treatments">Ukládá všechny ošetření do databáze</string>
|
||||
<string name="description_wear">Zobrazování stavu a řízení AndroidAPS z hodinek s WearOS</string>
|
||||
<string name="description_xdrip_status_line">Zobrazování informací o smyčce na xDrip+ watchface.</string>
|
||||
<string name="description_sms_communicator">Vzdálené řizení pomocí SMS příkazů</string>
|
||||
<string name="description_sms_communicator">Vzdálené řízení pomocí SMS příkazů</string>
|
||||
<string name="objectives_button_start">Začátek</string>
|
||||
<string name="objectives_button_verify">Kontrola</string>
|
||||
<string name="nsprofileview_units_label">Jednotky</string>
|
||||
|
@ -532,6 +532,7 @@
|
|||
<string name="disconnectpumpfor2h">Odpojit pumpu na 2 h</string>
|
||||
<string name="disconnectpumpfor3h">Odpojit pumpu na 3 h</string>
|
||||
<string name="resume">Uvolnit</string>
|
||||
<string name="reconnect">Znovu připojit pumpu</string>
|
||||
<string name="smscommunicator_wrongduration">Chybná doba trvání</string>
|
||||
<string name="smscommunicator_loopsuspended">Smyčka pozastavena</string>
|
||||
<string name="smscommunicator_loopresumed">Smyčka obnovena</string>
|
||||
|
@ -556,6 +557,7 @@
|
|||
<string name="danar_bluetooth_status">Stav Bluetooth</string>
|
||||
<string name="nav_about">O aplikaci</string>
|
||||
<string name="smscommunicator_missingsmspermission">Chybějící povolení SMS</string>
|
||||
<string name="smscommunicator_missingphonestatepermission">Chybí oprávnění pro zjišťování stavu telefonu</string>
|
||||
<string name="xdripstatus_settings">Status z xDripu (hodinky)</string>
|
||||
<string name="xdripstatus">Statusový řádek xDripu (hodinky)</string>
|
||||
<string name="xdripstatus_shortname">XDS</string>
|
||||
|
@ -807,7 +809,7 @@
|
|||
<string name="hour">hodin</string>
|
||||
<string name="day">dní</string>
|
||||
<string name="week">týdnů</string>
|
||||
<string name="time_plural"> </string>
|
||||
<string name="time_plural"></string>
|
||||
<string name="insight_keepalive_format_string">%1$d vyprší %2$s</string>
|
||||
<string name="insight_keep_alive_status">Stav keep-alive</string>
|
||||
<string name="statistics">Statistika</string>
|
||||
|
@ -888,6 +890,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Uzavřená smyčka zakázána v nastavení</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens zakázán v nastavení</string>
|
||||
<string name="smbdisabledinpreferences">SMB zakázáno v nastavení</string>
|
||||
<string name="uamdisabledinpreferences">UAM zakázáno v nastavení</string>
|
||||
<string name="uamdisabledoref1notselected">UAM zakázáno, protože není povolen Oref1 plugin</string>
|
||||
<string name="limitingbasalratio">Max bazál omezen na %1$.2f U/h: %2$s</string>
|
||||
<string name="pumplimit">limit pumpy</string>
|
||||
<string name="itmustbepositivevalue">požadována kladná hodnota</string>
|
||||
|
@ -915,7 +919,7 @@
|
|||
<string name="loopdisconnectedfor">Odpojeno (%1$d m)</string>
|
||||
<string name="automatic_careportal_events">Automatické vkládání péče</string>
|
||||
<string name="automatically_upload_insulin_cannula_and_battery_changes_to_nightscout">Automaticky vloží výměnu inzulínu, setu, baterie a alarmů pumpy do NS</string>
|
||||
<string name="openapssmb_maxiob_title">Maximální celkové IOB, které OpenAPS nemůže překročit [U]</string>
|
||||
<string name="openapssmb_maxiob_title">Maximální celková hodnota IOB, kterou OpenAPS nemůže překročit [U]</string>
|
||||
<string name="openapssmb_maxiob_summary">Tato hodnota je v kontextu OpenAPS nazývána Max IOB.\nOpenAPS nikdy nepřidá inzulín, pokud je současné IOB větší než tato hodnota</string>
|
||||
<string name="pump_stopped">Pumpa zastavena</string>
|
||||
<string name="pump_started">Pumpa spuštěna</string>
|
||||
|
@ -964,7 +968,7 @@
|
|||
<string name="readstatus">Načíst status</string>
|
||||
<string name="adjustprofileinns">Změny musí být prováděny v NS</string>
|
||||
<string name="exitwizard">Přeskočit průvodce</string>
|
||||
<string name="setupwizard_loop_description">Stiskněte tlačítko níže pro povolení AndroidAPS navrhovat nebo provádět změny bazálu</string>
|
||||
<string name="setupwizard_loop_description">Stiskněte tlačítko níže, chcete-li AndroidAPS povolit navrhovat nebo provádět změny bazálu</string>
|
||||
<string name="setupwizard_objectives_description">Stiskněte tlačítko níže pro povolení Cílů. Po ukončení průvodce přejděte na záložku Cílů, abyste získali všechny funkce AndroidAPS.\n</string>
|
||||
<string name="enableobjectives">Povolit Cíle</string>
|
||||
<string name="apssetup">Nastavení APS</string>
|
||||
|
@ -1050,6 +1054,11 @@
|
|||
<string name="insulinlimitviolation">Překročen limit inzulínu</string>
|
||||
<string name="loop_openmode_min_change">Minimální změna pro výzvu [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Smyčka vytvoří novou žádost o změnu pouze v případě, že změna je větší než tato hodnota. Výchozí hodnota je 20 %</string>
|
||||
<string name="pairfirst">Spárujte pumpu s telefonem!</string>
|
||||
<string name="profile_total">== ∑ %1$s U</string>
|
||||
<string name="profile_ins_units_per_hout">U/h</string>
|
||||
<string name="profile_carbs_per_unit">g/U</string>
|
||||
<string name="profile_per_unit">/U</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d den</item>
|
||||
<item quantity="few">%1$d dnů</item>
|
||||
|
|
|
@ -889,6 +889,8 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
|
|||
<string name="closedmodedisabledinpreferences">Closed-Loop-Modus in den Einstellungen deaktiviert</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens in den Einstellungen deaktiviert</string>
|
||||
<string name="smbdisabledinpreferences">SMB in Einstellungen deaktiviert</string>
|
||||
<string name="uamdisabledinpreferences">UAM in Einstellungen deaktiviert</string>
|
||||
<string name="uamdisabledoref1notselected">UAM deaktiviert, da diese auf die Oref1 Empfindlichkeitserkennung angewiesen sind.</string>
|
||||
<string name="limitingbasalratio">Begrenzung der max. Basalrate auf %1$.2f IE/h wegen %2$s</string>
|
||||
<string name="pumplimit">Limit der Pumpe</string>
|
||||
<string name="itmustbepositivevalue">Es muss ein positiver Wert sein.</string>
|
||||
|
@ -955,7 +957,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
|
|||
<string name="virtualpump_pump_def">Bolus: Schritt=%1$s\nVerzögerter Bolus: [Schritt=%2$s, Dauer=%3$smin-%4$sh]\nBasal: Schritt=%5$s\nTBR: %6$s (bei %7$s), Dauer=%8$smin-%9$sh\n%10$s</string>
|
||||
<string name="virtualpump_pump_def_extended_note">* Bei der virtuellen Pumpe können nur einzelne Werte und keine Bereiche zur Festlegung der Basal/Bolus-Granularität gewählt werden.</string>
|
||||
<string name="ns_autobackfill_title">BZ automatisch auffüllen</string>
|
||||
<string name="wear_wizard_settings">Einrichtungsassistent</string>
|
||||
<string name="wear_wizard_settings">Wizard-Einstellungen</string>
|
||||
<string name="wear_wizard_settings_summary">Berechnungen, die im Assistenten berücksichtigt werden:</string>
|
||||
<string name="wear_display_settings">Anzeigeeinstellungen</string>
|
||||
<string name="wear_general_settings">Allgemeine Einstellungen</string>
|
||||
|
@ -1005,7 +1007,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
|
|||
<string name="close_navigation">Menü schließen</string>
|
||||
<string name="nav_plugin_preferences">Plugin-Einstellungen</string>
|
||||
<string name="completed_well_done">Abgeschlossen, gut gemacht!</string>
|
||||
<string name="not_completed_yet">Noch nicht vollständig ausgefüllt</string>
|
||||
<string name="not_completed_yet">Noch nicht abgeschlossen</string>
|
||||
<string name="time_elapsed">Verstrichene Zeit</string>
|
||||
<string name="nth_objective">%1$d. Ziel</string>
|
||||
<string name="poctech">Poctech</string>
|
||||
|
@ -1052,6 +1054,11 @@ Unerwartetes Verhalten.</string>
|
|||
<string name="insulinlimitviolation">Insulin-Beschränkung verletzt</string>
|
||||
<string name="loop_openmode_min_change">Minimaler Wert zur Anfrage einer Änderung [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Der Loop fordert eine neue Änderung nur dann an, wenn die Änderung größer als dieser Wert ist. Der Standard-Wert ist 20%.</string>
|
||||
<string name="pairfirst">Bitte kopple deine Pumpe mit deinem Telefon!</string>
|
||||
<string name="profile_total">== ∑ %1$s IE</string>
|
||||
<string name="profile_ins_units_per_hout">IE/h</string>
|
||||
<string name="profile_carbs_per_unit">g/IE</string>
|
||||
<string name="profile_per_unit">/IE</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d Tag</item>
|
||||
<item quantity="other">%1$d Tage</item>
|
||||
|
|
|
@ -532,6 +532,7 @@
|
|||
<string name="disconnectpumpfor2h">Αποσύνδεση αντλίας για 2h</string>
|
||||
<string name="disconnectpumpfor3h">Αποσύνδεση αντλίας για 3h</string>
|
||||
<string name="resume">Επαναφορά</string>
|
||||
<string name="reconnect">Επανασύνδεση αντλίας</string>
|
||||
<string name="smscommunicator_wrongduration">Λάθος διάρκεια</string>
|
||||
<string name="smscommunicator_loopsuspended">Κύκλωμα σε αναστολή</string>
|
||||
<string name="smscommunicator_loopresumed">Επαναφορά κυκλώματος</string>
|
||||
|
|
|
@ -2,17 +2,10 @@
|
|||
<!--Generated by crowdin.com-->
|
||||
<resources>
|
||||
<string name="treatmentssafety_title">Seguridad de tratamientos</string>
|
||||
<string name="treatmentssafety_maxbolus_title">Máximo Bolo permitido [U]</string>
|
||||
<string name="treatmentssafety_maxcarbs_title">Carbohidratos máximo permitidos [g]</string>
|
||||
<string name="nav_preferences">Preferencias</string>
|
||||
<string name="nav_refreshtreatments">Actualizar los tratamientos desde NS</string>
|
||||
<string name="nav_resetdb">Restablecer las bases de datos</string>
|
||||
<string name="reset_db_confirm">¿Realmente quiere restablecer las bases de datos?</string>
|
||||
<string name="nav_exit">Salir</string>
|
||||
<string name="danar_useextended_title">Usar bolos extendidos para >200%</string>
|
||||
<string name="danar_bt_name_title">Dispositivo Bluetooth DanaR</string>
|
||||
<string name="ns_sync_use_absolute_title">Usar siempre valores basales absolutos</string>
|
||||
<string name="alert_dialog_storage_permission_text">Por favor reinicia el teléfono o AndroidAPS desde ajustes de sistema, sino AndroidAPS no guardará registros (importante para trazar y verificar que el algoritmo funcione correctamente)</string>
|
||||
<string name="description_actions">Algunos botones para acceder rápidamente a funciones comunes</string>
|
||||
<string name="description_careportal">Insertar notas de registro avanzadas.</string>
|
||||
<string name="description_config_builder">Utilizado para configurar complementos activos</string>
|
||||
|
@ -29,7 +22,7 @@
|
|||
<string name="description_overview">Muestra el estado actual de tu lazo y los botones para las acciones más usadas</string>
|
||||
<string name="description_persistent_notification">Muestra una notificación en curso con un breve resumen de lo que está haciendo tu lazo</string>
|
||||
<string name="description_profile_local">Define un perfil que estará disponible sin conexión.</string>
|
||||
<string name="description_profile_nightscout">Proporciona el perfil definidos en Nightscout</string>
|
||||
<string name="description_profile_nightscout">Proporciona el perfil definido en Nightscout</string>
|
||||
<string name="description_profile_simple">Definir un perfil con un solo bloque de tiempo.</string>
|
||||
<string name="description_pump_combo">Integración de bombas de insulina Accu-Check Combo, necesita tener ruffy instalado</string>
|
||||
<string name="description_pump_dana_r">Integración de bombas de insulina de DANA Diabecare R</string>
|
||||
|
@ -888,6 +881,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Lazo cerrado deshabilitado en preferencias</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens deshabilitado en preferencias</string>
|
||||
<string name="smbdisabledinpreferences">SMB deshabilitado en preferencias</string>
|
||||
<string name="uamdisabledinpreferences">UAM, comidas no previstas, no habilitadas en las preferencias</string>
|
||||
<string name="uamdisabledoref1notselected">UAM deshabilitado al usar el plugin de sensibilidad Oref1</string>
|
||||
<string name="limitingbasalratio">Limitando max basal rate a %1$.2f U/h debido a %2$s</string>
|
||||
<string name="pumplimit">límite de la bomba</string>
|
||||
<string name="itmustbepositivevalue">tiene que ser un valor positivo</string>
|
||||
|
|
|
@ -229,7 +229,7 @@
|
|||
<string name="openapsma_maxbasal_summary">Cette valeur est appelée Basal Maximum dans le contexte OpenAPS</string>
|
||||
<string name="openapsma_maxiob_title">Le Basal IA maximum que l\'OpenAPS pourra délivrer [U]</string>
|
||||
<string name="openapsma_maxiob_summary">Cette valeur est appelée Max IA (Insuline Active) dans le contexte OpenAPS\nC\'estlle maximum d\'insuline en [U] que APS peut délivrer en une seule fois.</string>
|
||||
<string name="dismiss">REJETER</string>
|
||||
<string name="dismiss">FERMER</string>
|
||||
<string name="danarpump">DanaR</string>
|
||||
<string name="connecting">Connection en cours</string>
|
||||
<string name="connected">Connectée</string>
|
||||
|
@ -533,6 +533,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
|
|||
<string name="disconnectpumpfor2h">Déconnecter la pompe 2h</string>
|
||||
<string name="disconnectpumpfor3h">Déconnecter la pompe 3h</string>
|
||||
<string name="resume">Reprendre</string>
|
||||
<string name="reconnect">Rebrancher la pompe</string>
|
||||
<string name="smscommunicator_wrongduration">Durée incorrecte</string>
|
||||
<string name="smscommunicator_loopsuspended">Boucle suspendue</string>
|
||||
<string name="smscommunicator_loopresumed">Boucle relancée</string>
|
||||
|
@ -557,6 +558,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
|
|||
<string name="danar_bluetooth_status">État Bluetooth</string>
|
||||
<string name="nav_about">À propos de</string>
|
||||
<string name="smscommunicator_missingsmspermission">Autorisation SMS manquante</string>
|
||||
<string name="smscommunicator_missingphonestatepermission">Autorisation du téléphone manquante</string>
|
||||
<string name="xdripstatus_settings">état Xdrip (montre)</string>
|
||||
<string name="xdripstatus">Barre d\'état pour xDrip (Montre)</string>
|
||||
<string name="xdripstatus_shortname">xds</string>
|
||||
|
@ -889,6 +891,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
|
|||
<string name="closedmodedisabledinpreferences">Mode de Boucle Fermée désactivé dans les préférences</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens désactivé dans les préférences</string>
|
||||
<string name="smbdisabledinpreferences">SMB désactivée dans les préférences</string>
|
||||
<string name="uamdisabledinpreferences">Repas Non Prévu (UAM) désactivé dans les préférences</string>
|
||||
<string name="uamdisabledoref1notselected">Repas Non Prévu (UAM) désactivé car il utilise le plugin Sensibilité de Oref1</string>
|
||||
<string name="limitingbasalratio">Limiter le taux basal max à %1$.2f U/h en raison de %2$s</string>
|
||||
<string name="pumplimit">Limite de la pompe</string>
|
||||
<string name="itmustbepositivevalue">la valeur doit être positive</string>
|
||||
|
@ -1051,6 +1055,11 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
|
|||
<string name="insulinlimitviolation">Violation d\'une limite d\'insuline</string>
|
||||
<string name="loop_openmode_min_change">Changement minimum possible [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Le fonctionnement de la Boucle demandera une confirmation uniquement si le changement est supérieur à cette valeur. Par défaut, la valeur est 20%</string>
|
||||
<string name="pairfirst">Appairez SVP votre pompe avec votre téléphone !</string>
|
||||
<string name="profile_total">== ∑ %1$s U</string>
|
||||
<string name="profile_ins_units_per_hout">U/h</string>
|
||||
<string name="profile_carbs_per_unit">g/U</string>
|
||||
<string name="profile_per_unit">/U</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d jour</item>
|
||||
<item quantity="other">%1$d jours</item>
|
||||
|
|
|
@ -738,7 +738,7 @@
|
|||
<string name="combo_pump_state_label">Stato</string>
|
||||
<string name="combo_pump_activity_label">Attivita\'</string>
|
||||
<string name="combo_no_pump_connection">Nessuna connessione per %1$d min</string>
|
||||
<string name="combo_tbr_remaining"><div class="notranslate"> 0%</div> (%2$d min restanti)</string>
|
||||
<string name="combo_tbr_remaining">%1$d%% (%2$d min restanti)</string>
|
||||
<string name="combo_pump_state_initializing">Inizializzazione in corso</string>
|
||||
<string name="combo_pump_state_suspended_due_to_error">Sospesa a causa di errore</string>
|
||||
<string name="combo_pump_state_suspended_by_user">Sospeso dall\'utente</string>
|
||||
|
|
3
app/src/main/res/values-ja/insight_alerts.xml
Normal file
3
app/src/main/res/values-ja/insight_alerts.xml
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources></resources>
|
3
app/src/main/res/values-ja/strings.xml
Normal file
3
app/src/main/res/values-ja/strings.xml
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources></resources>
|
|
@ -889,6 +889,8 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="closedmodedisabledinpreferences">Closed Loop modus gedeactiveerd in de voorkeuren</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens gedeactiveerd in de voorkeuren</string>
|
||||
<string name="smbdisabledinpreferences">SMB gedeactiveerd in de voorkeuren</string>
|
||||
<string name="uamdisabledinpreferences">UAM gedeactiveerd in configuratie</string>
|
||||
<string name="uamdisabledoref1notselected">UAM gedeactiveerd omdat het Oref1 gevoeligheid plugin nodig heeft</string>
|
||||
<string name="limitingbasalratio">Beperken van basaal tot max %1$.2f E/uur wegens de %2$s</string>
|
||||
<string name="pumplimit">Pomp limiet</string>
|
||||
<string name="itmustbepositivevalue">dit moet een positieve waarde zijn</string>
|
||||
|
@ -953,6 +955,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="virtualpump_type">Virtuele pomp Type</string>
|
||||
<string name="virtualpump_definition">Pomp definitie</string>
|
||||
<string name="virtualpump_pump_def">Bolus: Stap=%1$s\nExtended Bolus: [Stap=%2$s, Duur=%3$smin-%4$sh]\nBasaal: Stap=%5$s\nTBR: %6$s (by %7$s), Duur=%8$smin-%9$sh\n%10$s</string>
|
||||
<string name="virtualpump_pump_def_extended_note">* Alleen absolute waardes (geen van-tot bereik) worden ondersteund voor basaal / bolus in virtuele pomp.</string>
|
||||
<string name="ns_autobackfill_title">Automatische BG aanvullen</string>
|
||||
<string name="wear_wizard_settings">Wizard instellingen</string>
|
||||
<string name="wear_wizard_settings_summary">Berekeningen inclusief in het resultaat van de wizard</string>
|
||||
|
|
|
@ -532,6 +532,7 @@
|
|||
<string name="disconnectpumpfor2h">Wyłącz pompę na 2 h</string>
|
||||
<string name="disconnectpumpfor3h">Wyłącz pompę na 3 h</string>
|
||||
<string name="resume">Wznów</string>
|
||||
<string name="reconnect">Połącz ponownie pompę</string>
|
||||
<string name="smscommunicator_wrongduration">Zły czas trwania</string>
|
||||
<string name="smscommunicator_loopsuspended">Pętla wstrzymana</string>
|
||||
<string name="smscommunicator_loopresumed">Pętla wznowiona</string>
|
||||
|
@ -556,6 +557,7 @@
|
|||
<string name="danar_bluetooth_status">Status Bluetooth</string>
|
||||
<string name="nav_about">O programie</string>
|
||||
<string name="smscommunicator_missingsmspermission">Brak uprawnień SMS</string>
|
||||
<string name="smscommunicator_missingphonestatepermission">Brak uprawnień do wykrywania stanu telefonu</string>
|
||||
<string name="xdripstatus_settings">xDrip Status (watch)</string>
|
||||
<string name="xdripstatus">Linia Statusu xDrip (watch)</string>
|
||||
<string name="xdripstatus_shortname">xds</string>
|
||||
|
@ -771,8 +773,8 @@
|
|||
<string name="combo_error_bolus_verification_failed">Dostarczanie bolusa i sprawdzenia historii pompy nie powiodło się, Sprawdź pompę. Jeśli dostarczono bolusa, dane zostaną uzupełnione podczas następnego połączenia z pompą.</string>
|
||||
<string name="combo_reservoir_level_insufficient_for_bolus">Za mało insuliny na bolus pozostało w zbiorniku</string>
|
||||
<string name="extendedbolusdeliveryerror">Błąd dostarczania bolusa przedłużonego</string>
|
||||
<string name="insightpump_shortname">Wgląd</string>
|
||||
<string name="insightpump">Wgląd w pompę</string>
|
||||
<string name="insightpump_shortname">Insight</string>
|
||||
<string name="insightpump">Pompa Insight</string>
|
||||
<string name="status_no_colon">Status</string>
|
||||
<string name="changed">Zmieniono</string>
|
||||
<string name="pump_stopped_uppercase">POMPA ZATRZYMANA</string>
|
||||
|
@ -889,6 +891,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Tryb zamkniętej pętli wyłączony w ustawieniach</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens wyłączony w ustawieniach</string>
|
||||
<string name="smbdisabledinpreferences">SMB wyłączone w ustawieniach</string>
|
||||
<string name="uamdisabledinpreferences">UAM wyłączone w ustawieniach</string>
|
||||
<string name="uamdisabledoref1notselected">UAM jest wyłączone ponieważ zależy od wtyczki wrażliwości Oref1</string>
|
||||
<string name="limitingbasalratio">Ograniczam maks. dawkę bazową do %1$.2f U/h z uwagi na %2$s</string>
|
||||
<string name="pumplimit">ograniczenie pompy</string>
|
||||
<string name="itmustbepositivevalue">wartość musi być dodatnia</string>
|
||||
|
@ -1051,6 +1055,11 @@
|
|||
<string name="insulinlimitviolation">Przekroczono limit insuliny</string>
|
||||
<string name="loop_openmode_min_change">Minimalna żądana zmiana [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Pętla wprowadzi żądanie zmiany tylko w przypadku, gdy będzie ona większa niż ta wartość. Wartość domyślna to 20%</string>
|
||||
<string name="pairfirst">Proszę sparować swoją pompę z telefonem!</string>
|
||||
<string name="profile_total">== ∑ %1$s U</string>
|
||||
<string name="profile_ins_units_per_hout">U/h</string>
|
||||
<string name="profile_carbs_per_unit">g/U</string>
|
||||
<string name="profile_per_unit">/U</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d dzień</item>
|
||||
<item quantity="few">%1$d dni</item>
|
||||
|
|
|
@ -556,6 +556,7 @@
|
|||
<string name="danar_bluetooth_status">Status bluetooth</string>
|
||||
<string name="nav_about">Despre</string>
|
||||
<string name="smscommunicator_missingsmspermission">Lipsesc permisiunile de SMS</string>
|
||||
<string name="smscommunicator_missingphonestatepermission">Nu este acordată permisiunea de citire a stării telefonului</string>
|
||||
<string name="xdripstatus_settings">Status xDrip (ceas)</string>
|
||||
<string name="xdripstatus">Linie de status xDrip (ceas)</string>
|
||||
<string name="xdripstatus_shortname">xds</string>
|
||||
|
@ -888,6 +889,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Modul buclă închisă dezactivat în preferințe</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens dezactivat în preferințe</string>
|
||||
<string name="smbdisabledinpreferences">SMB dezactivat în preferințe</string>
|
||||
<string name="uamdisabledinpreferences">UAM dezactivat din setări</string>
|
||||
<string name="uamdisabledoref1notselected">UAM dezactivat deoarece este bazat pe plugin-ul Oref1 pentru sensibilitate</string>
|
||||
<string name="limitingbasalratio">Se limitează maximul ratei bazale la %1$.2f U/o datorită %2$s</string>
|
||||
<string name="pumplimit">limită pompă</string>
|
||||
<string name="itmustbepositivevalue">trebuie să fie o valoare pozitivă</string>
|
||||
|
@ -1050,6 +1053,7 @@
|
|||
<string name="insulinlimitviolation">Încălcare a limitării cantităţii de insulină</string>
|
||||
<string name="loop_openmode_min_change">Cerere de schimbare minimală [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Bucla va afişa o nouă cerere de schimbare doar dacă schimbarea are o valoare decât aceasta. Valoarea implicită este 20%</string>
|
||||
<string name="pairfirst">Vă rog să conectați pompa cu telefonul!</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d zi</item>
|
||||
<item quantity="few">%1$d zi</item>
|
||||
|
|
|
@ -532,6 +532,7 @@
|
|||
<string name="disconnectpumpfor2h">отсоединить помпу на 2 часа</string>
|
||||
<string name="disconnectpumpfor3h">отсоединить помпу на 3 часа</string>
|
||||
<string name="resume">возобновить</string>
|
||||
<string name="reconnect">Возобновить соединение с помпой</string>
|
||||
<string name="smscommunicator_wrongduration">неверное значение длительности</string>
|
||||
<string name="smscommunicator_loopsuspended">ЗЦ остановлен</string>
|
||||
<string name="smscommunicator_loopresumed">ЗЦикл возобновлен</string>
|
||||
|
@ -888,6 +889,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Режим замкнутого цикла отключен в настройках</string>
|
||||
<string name="autosensdisabledinpreferences">Автоматический подбор чувствительности Autosens отключен в настройках</string>
|
||||
<string name="smbdisabledinpreferences">Супер микро болюс SMB отключен в настройках</string>
|
||||
<string name="uamdisabledinpreferences">Незапланированный прием пищи UAM отключен в настройках</string>
|
||||
<string name="uamdisabledoref1notselected">Незапланированный прием пищи UAM отключен, поскольку он основывается на плагине чувствительности из Oref1</string>
|
||||
<string name="limitingbasalratio">Макс базальный уровень ограничен до %1$.2f ед/ч вследствие %2$s</string>
|
||||
<string name="pumplimit">лимит помпы</string>
|
||||
<string name="itmustbepositivevalue">величина должна быть положительной</string>
|
||||
|
@ -1052,4 +1055,9 @@ Context | Edit Context</string>
|
|||
<string name="insulinlimitviolation">Нарушение ограничения инсулина</string>
|
||||
<string name="loop_openmode_min_change">Минимальный запрос на изменения [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Алгоритм Ипж выдаст всплывающее окно с запросом на новые изменения, только если изменение больше, чем это значение. Значение по умолчанию — 20%</string>
|
||||
<string name="pairfirst">Выполните сопряжение помпы с телефоном!</string>
|
||||
<string name="profile_total">== ∑ %1$s ед</string>
|
||||
<string name="profile_ins_units_per_hout">Ед/ч</string>
|
||||
<string name="profile_carbs_per_unit">г/ед</string>
|
||||
<string name="profile_per_unit">/ед</string>
|
||||
</resources>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<resources>
|
||||
<string name="treatmentssafety_title">Bezpečnosť zadania ošetrenia</string>
|
||||
<string name="treatmentssafety_maxbolus_title">Maximálny povolený bolus [U]</string>
|
||||
<string name="treatmentssafety_maxcarbs_title">Maximálne povolené sacharidy [g]</string>
|
||||
<string name="treatmentssafety_maxcarbs_title">Maximálne povolené množstvo sacharidov [g]</string>
|
||||
<string name="nav_preferences">Nastavenia</string>
|
||||
<string name="nav_refreshtreatments">Obnoviť ošetrenia z NS</string>
|
||||
<string name="nav_resetdb">Vymaž databázu</string>
|
||||
|
@ -228,8 +228,7 @@
|
|||
<string name="openapsma_maxbasal_title">Maximálny povolený dočasný bazál [U/h]</string>
|
||||
<string name="openapsma_maxbasal_summary">Táto hodnota je nazývaná v OpenAPS ako \"max basal\"</string>
|
||||
<string name="openapsma_maxiob_title">Maximálny bazálny IOB, ktorý OpenAPS môže podať [U]</string>
|
||||
<string name="openapsma_maxiob_summary">Táto hodnota je nazývaná v kontexte OpenAPS ako max IOB, je to maximálne množstvo inzulínu v [U], ktoré APS môže naraz podať.
|
||||
</string>
|
||||
<string name="openapsma_maxiob_summary">Táto hodnota je nazývaná v kontexte OpenAPS ako max IOB, je to maximálne množstvo inzulínu v [U], ktoré APS môže naraz podať.</string>
|
||||
<string name="dismiss">POTVRDIŤ</string>
|
||||
<string name="danarpump">DanaR</string>
|
||||
<string name="connecting">Pripájanie</string>
|
||||
|
@ -889,6 +888,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Uzavretý okruh zakázaný v nastaveniach</string>
|
||||
<string name="autosensdisabledinpreferences">Automatická detekcia citlivosti zakázaná v nastaveniach</string>
|
||||
<string name="smbdisabledinpreferences">SMB zakázané v nastaveniach</string>
|
||||
<string name="uamdisabledinpreferences">UAM zakázané v nastaveniach</string>
|
||||
<string name="uamdisabledoref1notselected">UAM zakázané, pretože nie je povolený plug-in Oref1</string>
|
||||
<string name="limitingbasalratio">Max bazál obmedzený na %1$.2f U/h: %2$s</string>
|
||||
<string name="pumplimit">limit pumpy</string>
|
||||
<string name="itmustbepositivevalue">požadovaná kladná hodnota</string>
|
||||
|
@ -1051,6 +1052,7 @@
|
|||
<string name="insulinlimitviolation">Prekročený limit inzulínu</string>
|
||||
<string name="loop_openmode_min_change">Minimálna požiadavka na zmenu [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Uzavretý okruh si vyžiada iba vtedy, ak je zmena väčšia ako táto hodnota. Štandardná hodnota je 20%</string>
|
||||
<string name="pairfirst">Prosím spárujte pumpu s telefónom!</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d deň</item>
|
||||
<item quantity="few">%1$d dní</item>
|
||||
|
|
|
@ -532,6 +532,7 @@
|
|||
<string name="disconnectpumpfor2h">Koppla loss pump i 2 timmar</string>
|
||||
<string name="disconnectpumpfor3h">Koppla loss pump i 3 timmar</string>
|
||||
<string name="resume">Återuppta</string>
|
||||
<string name="reconnect">Återanslut Pump</string>
|
||||
<string name="smscommunicator_wrongduration">Fel duration</string>
|
||||
<string name="smscommunicator_loopsuspended">Loop pausad</string>
|
||||
<string name="smscommunicator_loopresumed">Loop återupptagen</string>
|
||||
|
@ -556,6 +557,7 @@
|
|||
<string name="danar_bluetooth_status">Bluetoothstatus</string>
|
||||
<string name="nav_about">Om</string>
|
||||
<string name="smscommunicator_missingsmspermission">Saknar behörighet att skicka SMS</string>
|
||||
<string name="smscommunicator_missingphonestatepermission">Behörighet saknas</string>
|
||||
<string name="xdripstatus_settings">xDrip Status (klocka)</string>
|
||||
<string name="xdripstatus">xDrip Statusrad (klocka)</string>
|
||||
<string name="xdripstatus_shortname">xds</string>
|
||||
|
@ -888,6 +890,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Closed Loop inaktiverat i Inställningar</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens inaktiverat i Inställningar</string>
|
||||
<string name="smbdisabledinpreferences">SMB inaktiverat i Inställningar</string>
|
||||
<string name="uamdisabledinpreferences">UAM är inaktiverat i inställningarna</string>
|
||||
<string name="uamdisabledoref1notselected">UAM är inaktiverat eftersom det kräver Oref1 känslighetsplugin</string>
|
||||
<string name="limitingbasalratio">Begränsar max basal till %1$.2f E/h pga %2$s</string>
|
||||
<string name="pumplimit">pumpbegränsning</string>
|
||||
<string name="itmustbepositivevalue">det måste vara ett positivt värde</string>
|
||||
|
@ -1050,6 +1054,7 @@
|
|||
<string name="insulinlimitviolation">Insulingräns nådd</string>
|
||||
<string name="loop_openmode_min_change">Minsta ändring som ger notifiering [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Loopen kommer att be om justering endast om ändringen är större än detta värde. Standardvärde är 20%</string>
|
||||
<string name="pairfirst">Vänligen para ihop pumpen med telefonen.</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d dag</item>
|
||||
<item quantity="other">%1$d dagar</item>
|
||||
|
|
26
app/src/main/res/values-tr/insight_alerts.xml
Normal file
26
app/src/main/res/values-tr/insight_alerts.xml
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources>
|
||||
<string name="alert_w31">Uyarı W31: Kartuş düşük</string>
|
||||
<string name="alert_w32">Uyarı W32: Pil bitmek üzere</string>
|
||||
<string name="alert_w33">Uyarı W33: Geçersiz saat/tarih</string>
|
||||
<string name="alert_w34">Garanti süresi doldu</string>
|
||||
<string name="alert_w36">Uyarı W36: Geçici bazal iptal edildi</string>
|
||||
<string name="alert_w38">Uyarı W38: Bolus iptal edildi</string>
|
||||
<string name="alert_w39">Uyarı W39: Kiralama süresi uyarısı</string>
|
||||
<string name="alert_m20">Bakım M20: Kartuş takılı değil</string>
|
||||
<string name="alert_m21">Bakım M21: Kartuş boş</string>
|
||||
<string name="alert_m22">Bakım M22: Pil boş</string>
|
||||
<string name="alert_m23">Bakım M23: Otomatik kapalı</string>
|
||||
<string name="alert_m24">Bakım M24: Tıkanıklık</string>
|
||||
<string name="alert_m25">Bakım M25: Kiralama süresi doldu</string>
|
||||
<string name="alert_m26">Bakım M26: Kartuş değişimi tamamlanamadı</string>
|
||||
<string name="alert_m27">Bakım M27: Veri yükleme başarısız</string>
|
||||
<string name="alert_m28">Bakım M28: Duraklat modunda zaman aşımı</string>
|
||||
<string name="alert_m29">Bakım M29: Pil türü seçili değil</string>
|
||||
<string name="alert_m30">Bakım M30: Kartuş türü ayarlı değil</string>
|
||||
<string name="alert_e6">Hata E6: Mekanik hata</string>
|
||||
<string name="alert_e7">Hata E7: Elektronik hata</string>
|
||||
<string name="alert_e10">Hata E10: Geri sarma hata</string>
|
||||
<string name="alert_e13">Hata E13: Dil ekranında hata</string>
|
||||
</resources>
|
1075
app/src/main/res/values-tr/strings.xml
Normal file
1075
app/src/main/res/values-tr/strings.xml
Normal file
File diff suppressed because it is too large
Load diff
|
@ -12,6 +12,7 @@
|
|||
|
||||
<string-array name="languagesArray">
|
||||
<item>@string/en_lang</item>
|
||||
<item>@string/af_lang</item>
|
||||
<item>@string/bg_lang</item>
|
||||
<item>@string/cs_lang</item>
|
||||
<item>@string/de_lang</item>
|
||||
|
@ -28,10 +29,12 @@
|
|||
<item>@string/sk_lang</item>
|
||||
<item>@string/sv_lang</item>
|
||||
<item>@string/pl_lang</item>
|
||||
<item>@string/tr_lang</item>
|
||||
<item>@string/zh_lang</item>
|
||||
</string-array>
|
||||
<string-array name="languagesValues" translatable="false">
|
||||
<item>en</item>
|
||||
<item>af</item>
|
||||
<item>bg</item>
|
||||
<item>cs</item>
|
||||
<item>de</item>
|
||||
|
@ -48,6 +51,7 @@
|
|||
<item>sk</item>
|
||||
<item>sv</item>
|
||||
<item>pl</item>
|
||||
<item>tr</item>
|
||||
<item>zh</item>
|
||||
</string-array>
|
||||
|
||||
|
|
|
@ -183,6 +183,7 @@
|
|||
<string name="objectives_pumpstatusavailableinns">Pump status available in NS</string>
|
||||
<string name="objectives_manualenacts">Manual enacts</string>
|
||||
<string name="loopdisabled">LOOP DISABLED BY CONSTRAINTS</string>
|
||||
<string name="af_lang" translatable="false">Afrikaans</string>
|
||||
<string name="cs_lang" translatable="false">Czech</string>
|
||||
<string name="en_lang" translatable="false">English</string>
|
||||
<string name="treatments_wizard_basaliob_label">Basal IOB</string>
|
||||
|
@ -247,7 +248,8 @@
|
|||
<string name="sv_lang" translatable="false">Swedish</string>
|
||||
<string name="fr_lang" translatable="false">French</string>
|
||||
<string name="zh_lang" translatable="false">Chinese</string>
|
||||
<string name="pl_lang" translatable="false">Polski</string>
|
||||
<string name="tr_lang" translatable="false">Turkish</string>
|
||||
<string name="pl_lang" translatable="false">Polish</string>
|
||||
<string name="openapsma_maxbasal_title">Max U/hr a Temp Basal can be set to</string>
|
||||
<string name="openapsma_maxbasal_summary">This value is called max basal in OpenAPS context</string>
|
||||
<string name="openapsma_maxiob_title">Maximum basal IOB OpenAPS can deliver [U]</string>
|
||||
|
@ -583,6 +585,7 @@
|
|||
<string name="disconnectpumpfor2h">Disconnect pump for 2 h</string>
|
||||
<string name="disconnectpumpfor3h">Disconnect pump for 3 h</string>
|
||||
<string name="resume">Resume</string>
|
||||
<string name="reconnect">Reconnect Pump</string>
|
||||
<string name="smscommunicator_wrongduration">Wrong duration</string>
|
||||
<string name="smscommunicator_loopsuspended">Loop suspended</string>
|
||||
<string name="smscommunicator_loopresumed">Loop resumed</string>
|
||||
|
@ -609,6 +612,7 @@
|
|||
<string name="danar_bluetooth_status">Bluetooth status</string>
|
||||
<string name="nav_about">About</string>
|
||||
<string name="smscommunicator_missingsmspermission">Missing SMS permission</string>
|
||||
<string name="smscommunicator_missingphonestatepermission">Missing phone state permission</string>
|
||||
<string name="xdripstatus_settings">xDrip Status (watch)</string>
|
||||
<string name="xdripstatus">xDrip Statusline (watch)</string>
|
||||
<string name="xdripstatus_shortname">xds</string>
|
||||
|
@ -1006,6 +1010,8 @@
|
|||
<string name="closedmodedisabledinpreferences">Closed loop mode disabled in preferences</string>
|
||||
<string name="autosensdisabledinpreferences">Autosens disabled in preferences</string>
|
||||
<string name="smbdisabledinpreferences">SMB disabled in preferences</string>
|
||||
<string name="uamdisabledinpreferences">UAM disabled in preferences</string>
|
||||
<string name="uamdisabledoref1notselected">UAM disabled because it rely on Oref1 sensitivity plugin</string>
|
||||
<string name="limitingbasalratio">Limiting max basal rate to %1$.2f U/h because of %2$s</string>
|
||||
<string name="pumplimit">pump limit</string>
|
||||
<string name="key_openapsma_max_basal" translatable="false">openapsma_max_basal</string>
|
||||
|
@ -1171,9 +1177,10 @@
|
|||
<string name="error_adding_treatment_title">Treatment data incomplete</string>
|
||||
<string name="maintenance_settings">Maintenance Settings</string>
|
||||
<string name="maintenance_email">Email</string>
|
||||
<string name="key_maintenance_logs_email" translatable="false">email</string>
|
||||
<string name="key_maintenance_logs_email" translatable="false">maintenance_logs_email</string>
|
||||
<string name="invalid_email_message">Invalid Email</string>
|
||||
<string name="key_maintenance_logs_amount" translatable="false">amount of logs to send</string>
|
||||
<string name="key_maintenance_logs_amount" translatable="false">maintenance_logs_amount</string>
|
||||
<string name="key_logshipper_amount" translatable="false">logshipper_amount</string>
|
||||
<string name="maintenance_amount">No of Logs to send</string>
|
||||
<string name="maintenance">Maintenance</string>
|
||||
<string name="maintenance_shortname">MAINT</string>
|
||||
|
@ -1205,6 +1212,12 @@
|
|||
<string name="loop_openmode_min_change">Minimal request change [%]</string>
|
||||
<string name="loop_openmode_min_change_summary">Loop will popup new change request only if change is bigger than this value. Default value is 20%</string>
|
||||
<string name="key_short_tabtitles" translatable="false">short_tabtitles</string>
|
||||
<string name="pairfirst">Please pair your pump with your phone!</string>
|
||||
|
||||
<string name="profile_total">== ∑ %1$s U</string>
|
||||
<string name="profile_ins_units_per_hout">U/h</string>
|
||||
<string name="profile_carbs_per_unit">g/U</string>
|
||||
<string name="profile_per_unit">/U</string>
|
||||
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d day</item>
|
||||
|
|
4
app/src/main/res/xml/automotive_app_desc.xml
Normal file
4
app/src/main/res/xml/automotive_app_desc.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<automotiveApp>
|
||||
<uses name="notification" />
|
||||
</automotiveApp>
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<PreferenceCategory
|
||||
android:key="language"
|
||||
android:title="@string/configbuilder_general">
|
||||
|
||||
<ListPreference
|
||||
|
@ -9,6 +8,6 @@
|
|||
android:defaultValue="en"
|
||||
android:entries="@array/languagesArray"
|
||||
android:entryValues="@array/languagesValues"
|
||||
android:key="language" />
|
||||
android:key="@string/key_language" />
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
|
@ -24,6 +24,7 @@ import info.nightscout.androidaps.logging.L;
|
|||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentService;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
||||
|
@ -100,6 +101,9 @@ public class AAPSMocker {
|
|||
when(MainApp.gs(R.string.careportal_profileswitch)).thenReturn("Profile Switch");
|
||||
when(MainApp.gs(R.string.configbuilder_insulin)).thenReturn("Insulin");
|
||||
when(MainApp.gs(R.string.bolusdelivering)).thenReturn("Delivering 0.0U");
|
||||
when(MainApp.gs(R.string.profile_per_unit)).thenReturn("/U");
|
||||
when(MainApp.gs(R.string.profile_carbs_per_unit)).thenReturn("g/U");
|
||||
when(MainApp.gs(R.string.profile_ins_units_per_hout)).thenReturn("U/h");
|
||||
}
|
||||
|
||||
public static MainApp mockMainApp() {
|
||||
|
@ -176,8 +180,10 @@ public class AAPSMocker {
|
|||
public static DanaRPlugin mockDanaRPlugin() {
|
||||
PowerMockito.mockStatic(DanaRPlugin.class);
|
||||
DanaRPlugin danaRPlugin = mock(DanaRPlugin.class);
|
||||
DanaRv2Plugin danaRv2Plugin = mock(DanaRv2Plugin.class);
|
||||
DanaRKoreanPlugin danaRKoreanPlugin = mock(DanaRKoreanPlugin.class);
|
||||
when(MainApp.getSpecificPlugin(DanaRPlugin.class)).thenReturn(danaRPlugin);
|
||||
when(MainApp.getSpecificPlugin(DanaRv2Plugin.class)).thenReturn(danaRv2Plugin);
|
||||
when(MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).thenReturn(danaRKoreanPlugin);
|
||||
return danaRPlugin;
|
||||
}
|
||||
|
|
|
@ -117,6 +117,7 @@ public class MainAppTest {
|
|||
|
||||
@Test
|
||||
public void isEngineeringModeOrReleaseTest() {
|
||||
mainApp.devBranch = true;
|
||||
Assert.assertEquals(!Config.APS, mainApp.isEngineeringModeOrRelease());
|
||||
}
|
||||
|
||||
|
|
|
@ -120,9 +120,10 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
Assert.assertEquals(bgReadingList.get(0).date, iobCobCalculatorPlugin.getBucketedData().get(0).date);
|
||||
Assert.assertEquals(bgReadingList.get(3).date, iobCobCalculatorPlugin.getBucketedData().get(3).date);
|
||||
Assert.assertEquals(bgReadingList.size(), iobCobCalculatorPlugin.getBucketedData().size());
|
||||
|
@ -134,9 +135,10 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
Assert.assertEquals(bgReadingList.get(0).date, iobCobCalculatorPlugin.getBucketedData().get(0).date);
|
||||
Assert.assertEquals(bgReadingList.get(2).date, iobCobCalculatorPlugin.getBucketedData().get(3).date);
|
||||
Assert.assertEquals(bgReadingList.size() + 1, iobCobCalculatorPlugin.getBucketedData().size());
|
||||
|
@ -150,9 +152,10 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(T.mins(0).msecs()).value(100));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
|
||||
Assert.assertEquals(T.mins(15).msecs(), iobCobCalculatorPlugin.getBucketedData().get(1).date);
|
||||
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.getBucketedData().get(2).date);
|
||||
|
@ -165,9 +168,10 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
Assert.assertEquals(null, iobCobCalculatorPlugin.getBucketedData());
|
||||
|
||||
// data should be reconstructed
|
||||
|
@ -177,9 +181,10 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(40));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
|
||||
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(6).date);
|
||||
Assert.assertEquals(7, iobCobCalculatorPlugin.getBucketedData().size());
|
||||
|
@ -196,9 +201,10 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(40));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
|
||||
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
|
||||
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(6).date);
|
||||
Assert.assertEquals(7, iobCobCalculatorPlugin.getBucketedData().size());
|
||||
|
@ -333,11 +339,40 @@ public class IobCobCalculatorPluginTest {
|
|||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:44:57Z")).value(100));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
|
||||
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
|
||||
|
||||
iobCobCalculatorPlugin.createBucketedData();
|
||||
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T13:34:57Z").getTime(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
|
||||
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T03:44:57Z").getTime(), iobCobCalculatorPlugin.getBucketedData().get(iobCobCalculatorPlugin.getBucketedData().size() - 1).date);
|
||||
|
||||
// 5min 4sec data
|
||||
bgReadingList.clear();
|
||||
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:33:40Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:28:36Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:23:32Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:18:28Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:13:24Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:08:19Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T06:03:16Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:58:11Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:53:07Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:48:03Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:42:58Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:37:54Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:32:51Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:27:46Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:22:42Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:17:38Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:12:33Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:07:29Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T05:02:26Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T04:57:21Z")).value(100));
|
||||
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-10-05T04:52:17Z")).value(100));
|
||||
|
||||
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
|
||||
|
||||
Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.Constraint;
|
||||
import info.nightscout.androidaps.interfaces.PluginType;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.ToastUtils;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* Created by Rumen on 01.08.2018
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, ToastUtils.class, Context.class, SP.class})
|
||||
public class DanaRv2PluginTest {
|
||||
DanaRv2Plugin danaRv2Plugin;
|
||||
|
||||
@Test
|
||||
public void getPlugin() {
|
||||
danaRv2Plugin.getPlugin();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void basalRateShouldBeLimited() throws Exception {
|
||||
danaRv2Plugin.setPluginEnabled(PluginType.PUMP, true);
|
||||
danaRv2Plugin.setPluginEnabled(PluginType.PUMP, true);
|
||||
DanaRPump.getInstance().maxBasal = 0.8d;
|
||||
|
||||
Constraint<Double> c = new Constraint<>(Constants.REALLYHIGHBASALRATE);
|
||||
danaRv2Plugin.applyBasalConstraints(c, AAPSMocker.getValidProfile());
|
||||
Assert.assertEquals(0.8d, c.value());
|
||||
Assert.assertEquals("DanaRv2: Limiting basal rate to 0.80 U/h because of pump limit", c.getReasons());
|
||||
Assert.assertEquals("DanaRv2: Limiting basal rate to 0.80 U/h because of pump limit", c.getMostLimitedReasons());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void percentBasalRateShouldBeLimited() throws Exception {
|
||||
danaRv2Plugin.setPluginEnabled(PluginType.PUMP, true);
|
||||
danaRv2Plugin.setPluginEnabled(PluginType.PUMP, true);
|
||||
DanaRPump.getInstance().maxBasal = 0.8d;
|
||||
|
||||
Constraint<Integer> c = new Constraint<>(Constants.REALLYHIGHPERCENTBASALRATE);
|
||||
danaRv2Plugin.applyBasalPercentConstraints(c, AAPSMocker.getValidProfile());
|
||||
Assert.assertEquals((Integer) 200, c.value());
|
||||
Assert.assertEquals("DanaRv2: Limiting percent rate to 200% because of pump limit", c.getReasons());
|
||||
Assert.assertEquals("DanaRv2: Limiting percent rate to 200% because of pump limit", c.getMostLimitedReasons());
|
||||
}
|
||||
|
||||
@Before
|
||||
public void prepareMocks() throws Exception {
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockConfigBuilder();
|
||||
AAPSMocker.mockBus();
|
||||
AAPSMocker.mockStrings();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockCommandQueue();
|
||||
|
||||
// when(SP.getString(R.string.key_danars_address, "")).thenReturn("");
|
||||
|
||||
danaRv2Plugin = DanaRv2Plugin.getPlugin();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MessageHashTable_v2;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusAPS_v2;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
/**
|
||||
* Created by Rumen Georgiev on 30.10.2018.
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class})
|
||||
public class MessageHashTable_v2Test {
|
||||
@Test
|
||||
public void runTest() {
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
AAPSMocker.mockBus();
|
||||
|
||||
MessageHashTable_v2 packet = new MessageHashTable_v2();
|
||||
|
||||
MessageBase forTesting = new MsgStatusAPS_v2();
|
||||
MessageBase testPacket = MessageHashTable_v2.findMessage(forTesting.getCommand());
|
||||
assertEquals(0xE001, testPacket.getCommand());
|
||||
// try putting another command
|
||||
MessageBase testMessage = new MessageBase();
|
||||
testMessage.SetCommand(0xE005);
|
||||
packet.put(testMessage);
|
||||
assertEquals(0xE005, packet.findMessage(0xE005).getCommand());
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
double[] createArray(int length, double fillWith){
|
||||
double[] ret = new double[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgCheckValue;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgCheckValue_v2;
|
||||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.androidaps.queue.CommandQueue;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.powermock.api.mockito.PowerMockito.when;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class, DanaRv2Plugin.class, DanaRPlugin.class, ConfigBuilderPlugin.class, CommandQueue.class})
|
||||
public class MsgCheckValue_v2Test {
|
||||
@Test
|
||||
public void runTest() {
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
AAPSMocker.mockBus();
|
||||
AAPSMocker.mockDanaRPlugin();
|
||||
AAPSMocker.mockConfigBuilder();
|
||||
AAPSMocker.mockCommandQueue();
|
||||
Treatment t = new Treatment();
|
||||
MsgCheckValue_v2 packet = new MsgCheckValue_v2();
|
||||
// test message decoding
|
||||
packet.handleMessage(createArray(34, (byte) 3));
|
||||
DanaRPump pump = DanaRPump.getInstance();
|
||||
assertEquals(DanaRPump.EXPORT_MODEL, pump.model);
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
double[] createArray(int length, double fillWith){
|
||||
double[] ret = new double[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgHistoryEvents_v2;
|
||||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentService;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Created by Rumen Georgiev on 30.10.2018.
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class, TreatmentsPlugin.class, TreatmentService.class})
|
||||
public class MsgHistoryEvents_v2Test {
|
||||
@Test
|
||||
public void runTest() throws Exception {
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
AAPSMocker.mockBus();
|
||||
AAPSMocker.mockDatabaseHelper();
|
||||
AAPSMocker.mockTreatmentPlugin();
|
||||
AAPSMocker.mockTreatmentService();
|
||||
MsgHistoryEvents_v2 packet = new MsgHistoryEvents_v2();
|
||||
|
||||
// test message decoding
|
||||
//last message in history
|
||||
packet.handleMessage(createArray(34, (byte) 0xFF));
|
||||
assertEquals(true, packet.done);
|
||||
// passing an bigger number
|
||||
packet = new MsgHistoryEvents_v2();
|
||||
packet.handleMessage(createArray(34, (byte) 17));
|
||||
assertEquals(false, packet.done);
|
||||
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
double[] createArray(int length, double fillWith){
|
||||
double[] ret = new double[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgSetHistoryEntry_v2;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
/**
|
||||
* Created by Rumen Georgiev on 30.10.2018.
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class, DanaRv2Plugin.class, DanaRPlugin.class})
|
||||
public class MsgSetHistoryEntry_v2Test {
|
||||
@Test
|
||||
public void runTest() {
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
AAPSMocker.mockBus();
|
||||
AAPSMocker.mockDanaRPlugin();
|
||||
|
||||
MsgSetHistoryEntry_v2 initializerTest = new MsgSetHistoryEntry_v2((byte) 1, System.currentTimeMillis(), 1, 0);
|
||||
MsgSetHistoryEntry_v2 packet = new MsgSetHistoryEntry_v2();
|
||||
// test message decoding
|
||||
// != 1 fails
|
||||
packet.handleMessage(createArray(34, (byte) 2));
|
||||
assertEquals(true, packet.failed);
|
||||
// passing an bigger number
|
||||
packet = new MsgSetHistoryEntry_v2();
|
||||
packet.handleMessage(createArray(34, (byte) 1));
|
||||
assertEquals(false, packet.failed);
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
double[] createArray(int length, double fillWith){
|
||||
double[] ret = new double[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusAPS_v2;
|
||||
import info.nightscout.utils.SP;
|
||||
import static org.junit.Assert.*;
|
||||
/**
|
||||
* Created by Rumen Georgiev on 30.10.2018
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class})
|
||||
public class MsgStatusAPS_v2Test {
|
||||
@Mock
|
||||
Context context;
|
||||
@Test
|
||||
public void runTest() throws Exception{
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
|
||||
try {
|
||||
AAPSMocker.mockTreatmentService();
|
||||
} catch (Exception e){
|
||||
|
||||
}
|
||||
MsgStatusAPS_v2 packet = new MsgStatusAPS_v2();
|
||||
// test iob
|
||||
//TODO Find a way to mock treatments plugin
|
||||
byte[] testArray = createArray(34, (byte) 7);
|
||||
double iob = MessageBase.intFromBuff(testArray, 0, 2) / 100d;
|
||||
packet.handleMessage(testArray);
|
||||
DanaRPump pump = DanaRPump.getInstance();
|
||||
assertEquals(iob, pump.iob, 0);
|
||||
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusBolusExtended_v2;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.Treatments.Treatment;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Created by Rumen Georgiev on 30.10.2018
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class})
|
||||
public class MsgStatusBolusExtended_v2Test {
|
||||
@Mock
|
||||
Context context;
|
||||
@Test
|
||||
public void runTest() throws Exception{
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
try {
|
||||
AAPSMocker.mockTreatmentService();
|
||||
} catch (Exception e){
|
||||
|
||||
}
|
||||
MsgStatusBolusExtended_v2 packet = new MsgStatusBolusExtended_v2();
|
||||
// test message decoding
|
||||
//TODO Find a way to mock treatments plugin
|
||||
packet.handleMessage(createArray(34, (byte) 7));
|
||||
DanaRPump pump = DanaRPump.getInstance();
|
||||
assertEquals((double) MessageBase.intFromBuff(createArray(10, (byte) 7), 2, 2)/100d, pump.extendedBolusAmount,0);
|
||||
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusTempBasal_v2;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
/**
|
||||
* Created by Rumen Georgiev on 30.10.2018.
|
||||
*/
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, SP.class, L.class, DanaRv2Plugin.class, DanaRPlugin.class})
|
||||
public class MsgStatusTempBasal_v2Test {
|
||||
@Test
|
||||
public void runTest() {
|
||||
AAPSMocker.mockMainApp();
|
||||
AAPSMocker.mockApplicationContext();
|
||||
AAPSMocker.mockSP();
|
||||
AAPSMocker.mockL();
|
||||
AAPSMocker.mockBus();
|
||||
AAPSMocker.mockDanaRPlugin();
|
||||
|
||||
MsgStatusTempBasal_v2 packet = new MsgStatusTempBasal_v2();
|
||||
DanaRPump pump = DanaRPump.getInstance();
|
||||
// test message decoding
|
||||
packet.handleMessage(createArray(34, (byte) 1));
|
||||
assertEquals(true, pump.isTempBasalInProgress);
|
||||
// passing an bigger number
|
||||
packet = new MsgStatusTempBasal_v2();
|
||||
|
||||
packet.handleMessage(createArray(34, (byte) 2));
|
||||
assertEquals(false, pump.isTempBasalInProgress);
|
||||
}
|
||||
|
||||
byte[] createArray(int length, byte fillWith){
|
||||
byte[] ret = new byte[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
double[] createArray(int length, double fillWith){
|
||||
double[] ret = new double[length];
|
||||
for(int i = 0; i<length; i++){
|
||||
ret[i] = fillWith;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
|
@ -19,7 +19,12 @@ public class PercentageSplitterTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void pureNameTestPercentageAndShift() {
|
||||
public void pureNameTestPercentageAndPositiveTimeShift() {
|
||||
assertEquals("Fiasp", PercentageSplitter.pureName("Fiasp (101%,2h)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pureNameTestPercentageAndNegtiveTimeShift() {
|
||||
assertEquals("Fiasp", PercentageSplitter.pureName("Fiasp (50%,-2h)"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
google()
|
||||
jcenter()
|
||||
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.1.4'
|
||||
classpath 'com.android.tools.build:gradle:3.2.0'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
|
@ -590,7 +590,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
|
|||
} else
|
||||
|
||||
Log.d("addToWatchSet", "start removing bgDataList.size(): " + bgDataList.size());
|
||||
HashSet removeSet = new HashSet();
|
||||
HashSet<BgWatchData> removeSet = new HashSet<>();
|
||||
double threshold = (System.currentTimeMillis() - (1000 * 60 * 5 * holdInMemory()));
|
||||
for (BgWatchData data : bgDataList) {
|
||||
if (data.timestamp < threshold) {
|
||||
|
|
Loading…
Reference in a new issue