Merge remote-tracking branch 'origin/dev' into develop

* origin/dev: (35 commits)
  fix displaying target in mmol
  Profile.getValuesList: don't add trailing newline.
  Fix some warnings.
  Use OK/Cancel buttons for profile removal dialog.
  static variables -> object variables
  Avoid npe if no string is assigned to the profile switch
  isValid implementation
  Show profile on tap in Treatments->ProfileSwitch
  Check for tempbasal not RealTempbasla
  Overlapping interval - regard first element on cut
  AcceptTempButton visible
  show notification on toast alarm
  parse 12h format properly
  fix index
  Show profile switch button in profiles
  set pump time only if needed
  restrict DIA for expectedDelta
  Overlappinginterfals - find first element
  Extract method Profile.toTargetRangeString.
  Simplify.
  ...

# Conflicts:
#	app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java
This commit is contained in:
Johannes Mockenhaupt 2017-08-19 22:38:58 +02:00
commit bffcd3ceee
No known key found for this signature in database
GPG key ID: 9E1EA6AF7BBBB0D1
53 changed files with 892 additions and 74 deletions

View file

@ -32,6 +32,9 @@ import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesFragme
import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin; import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin;
import info.nightscout.androidaps.plugins.InsulinFastacting.InsulinFastactingFragment; import info.nightscout.androidaps.plugins.InsulinFastacting.InsulinFastactingFragment;
import info.nightscout.androidaps.plugins.InsulinFastactingProlonged.InsulinFastactingProlongedFragment; import info.nightscout.androidaps.plugins.InsulinFastactingProlonged.InsulinFastactingProlongedFragment;
import info.nightscout.androidaps.plugins.InsulinOrefCurves.InsulinOrefFreePeakFragment;
import info.nightscout.androidaps.plugins.InsulinOrefCurves.InsulinOrefRapidActingFragment;
import info.nightscout.androidaps.plugins.InsulinOrefCurves.InsulinOrefUltraRapidActingFragment;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.LoopFragment; import info.nightscout.androidaps.plugins.Loop.LoopFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalFragment; import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalFragment;
@ -114,6 +117,9 @@ public class MainApp extends Application {
if (Config.ACTION) pluginsList.add(ActionsFragment.getPlugin()); if (Config.ACTION) pluginsList.add(ActionsFragment.getPlugin());
pluginsList.add(InsulinFastactingFragment.getPlugin()); pluginsList.add(InsulinFastactingFragment.getPlugin());
pluginsList.add(InsulinFastactingProlongedFragment.getPlugin()); pluginsList.add(InsulinFastactingProlongedFragment.getPlugin());
pluginsList.add(InsulinOrefRapidActingFragment.getPlugin());
pluginsList.add(InsulinOrefUltraRapidActingFragment.getPlugin());
pluginsList.add(InsulinOrefFreePeakFragment.getPlugin());
pluginsList.add(SensitivityOref0Plugin.getPlugin()); pluginsList.add(SensitivityOref0Plugin.getPlugin());
pluginsList.add(SensitivityAAPSPlugin.getPlugin()); pluginsList.add(SensitivityAAPSPlugin.getPlugin());
pluginsList.add(SensitivityWeightedAveragePlugin.getPlugin()); pluginsList.add(SensitivityWeightedAveragePlugin.getPlugin());

View file

@ -15,6 +15,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.plugins.PumpCombo.ComboPlugin; import info.nightscout.androidaps.plugins.PumpCombo.ComboPlugin;
import info.nightscout.androidaps.plugins.InsulinOrefCurves.InsulinOrefFreePeakPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.BluetoothDevicePreference; import info.nightscout.androidaps.plugins.PumpDanaR.BluetoothDevicePreference;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
@ -146,6 +147,11 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
if (virtualPumpPlugin != null && virtualPumpPlugin.isEnabled(PluginBase.PUMP)) { if (virtualPumpPlugin != null && virtualPumpPlugin.isEnabled(PluginBase.PUMP)) {
addPreferencesFromResource(R.xml.pref_virtualpump); addPreferencesFromResource(R.xml.pref_virtualpump);
} }
InsulinOrefFreePeakPlugin insulinOrefFreePeakPlugin = (InsulinOrefFreePeakPlugin) MainApp.getSpecificPlugin(InsulinOrefFreePeakPlugin.class);
if(insulinOrefFreePeakPlugin.isEnabled(PluginBase.INSULIN)){
addPreferencesFromResource(R.xml.pref_insulinoreffreepeak);
}
NSClientInternalPlugin nsClientInternalPlugin = (NSClientInternalPlugin) MainApp.getSpecificPlugin(NSClientInternalPlugin.class); NSClientInternalPlugin nsClientInternalPlugin = (NSClientInternalPlugin) MainApp.getSpecificPlugin(NSClientInternalPlugin.class);
if (nsClientInternalPlugin != null && nsClientInternalPlugin.isEnabled(PluginBase.GENERAL)) { if (nsClientInternalPlugin != null && nsClientInternalPlugin.isEnabled(PluginBase.GENERAL)) {
addPreferencesFromResource(R.xml.pref_nsclientinternal); addPreferencesFromResource(R.xml.pref_nsclientinternal);

View file

@ -37,6 +37,7 @@ import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientPlugin;
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin; import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
import info.nightscout.androidaps.receivers.DataReceiver; import info.nightscout.androidaps.receivers.DataReceiver;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
import info.nightscout.utils.BundleLogger;
import info.nightscout.utils.SP; import info.nightscout.utils.SP;
@ -56,7 +57,7 @@ public class DataService extends IntentService {
@Override @Override
protected void onHandleIntent(final Intent intent) { protected void onHandleIntent(final Intent intent) {
if (Config.logFunctionCalls) if (Config.logFunctionCalls)
log.debug("onHandleIntent " + intent); log.debug("onHandleIntent " + BundleLogger.log(intent.getExtras()));
if (ConfigBuilderPlugin.getActiveBgSource().getClass().equals(SourceXdripPlugin.class)) { if (ConfigBuilderPlugin.getActiveBgSource().getClass().equals(SourceXdripPlugin.class)) {
xDripEnabled = true; xDripEnabled = true;

View file

@ -22,12 +22,12 @@ public class DetailedBolusInfo {
public double insulin = 0; public double insulin = 0;
public double carbs = 0; public double carbs = 0;
public int source = Source.NONE; public int source = Source.NONE;
public boolean isValid = true;
public double glucose = 0; // Bg value in current units public double glucose = 0; // Bg value in current units
public String glucoseType = ""; // NS values: Manual, Finger, Sensor public String glucoseType = ""; // NS values: Manual, Finger, Sensor
public int carbTime = 0; // time shift of carbs in minutes public int carbTime = 0; // time shift of carbs in minutes
public JSONObject boluscalc = null; // additional bolus wizard info public JSONObject boluscalc = null; // additional bolus wizard info
public Context context = null; // context for progress dialog public Context context = null; // context for progress dialog
public boolean addToTreatments = true;
public long pumpId = 0; // id of record if comming from pump history (not a newly created treatment) public long pumpId = 0; // id of record if comming from pump history (not a newly created treatment)
public boolean isSMB = false; // is a Super-MicroBolus public boolean isSMB = false; // is a Super-MicroBolus
} }

View file

@ -15,7 +15,7 @@ public class OverlappingIntervals<T extends Interval> extends Intervals<T> {
boolean needToCut = false; boolean needToCut = false;
long cutTime = 0; long cutTime = 0;
for (int index = rawData.size()-1; index > 0; index--) { //begin with newest for (int index = rawData.size()-1; index >= 0; index--) { //begin with newest
Interval cur = rawData.valueAt(index); Interval cur = rawData.valueAt(index);
if (cur.isEndingEvent()){ if (cur.isEndingEvent()){
needToCut = true; needToCut = true;
@ -31,7 +31,7 @@ public class OverlappingIntervals<T extends Interval> extends Intervals<T> {
@Nullable @Nullable
public synchronized T getValueByInterval(long time) { public synchronized T getValueByInterval(long time) {
for (int index = rawData.size()-1; index > 0; index--) { //begin with newest for (int index = rawData.size()-1; index >= 0; index--) { //begin with newest
T cur = rawData.valueAt(index); T cur = rawData.valueAt(index);
if (cur.match(time)){ if (cur.match(time)){
return cur; return cur;

View file

@ -212,6 +212,7 @@ public class Profile {
retValue += format.format(o2.getDouble("value")); retValue += format.format(o2.getDouble("value"));
} }
retValue += " " + units; retValue += " " + units;
if (index + 1 < array.length())
retValue += "\n"; retValue += "\n";
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
@ -391,4 +392,10 @@ public class Profile {
if (units.equals(Constants.MGDL)) return DecimalFormatter.to0Decimal(valueInMgdl); if (units.equals(Constants.MGDL)) return DecimalFormatter.to0Decimal(valueInMgdl);
else return DecimalFormatter.to1Decimal(valueInMmol); else return DecimalFormatter.to1Decimal(valueInMmol);
} }
// targets are stored in mg/dl
public static String toTargetRangeString(double low, double high, String units) {
if (low == high) return toUnitsString(low, Profile.fromMgdlToUnits(low, Constants.MMOL), units);
else return toUnitsString(low, Profile.fromMgdlToUnits(low, Constants.MMOL), units) + " - " + toUnitsString(high, Profile.fromMgdlToUnits(high, Constants.MMOL), units);
}
} }

View file

@ -598,6 +598,16 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
scheduleTreatmentChange(); scheduleTreatmentChange();
} }
public void update(Treatment treatment) {
try {
getDaoTreatments().update(treatment);
updateEarliestDataChange(treatment.date);
} catch (SQLException e) {
e.printStackTrace();
}
scheduleTreatmentChange();
}
public void deleteTreatmentById(String _id) { public void deleteTreatmentById(String _id) {
Treatment stored = findTreatmentById(_id); Treatment stored = findTreatmentById(_id);
if (stored != null) { if (stored != null) {

View file

@ -181,6 +181,8 @@ public class Treatment implements DataPointWithLabelInterface {
// ----------------- DataPointInterface end -------------------- // ----------------- DataPointInterface end --------------------
public Iob iobCalc(long time, double dia) { public Iob iobCalc(long time, double dia) {
if (!isValid)
return new Iob();
InsulinInterface insulinInterface = MainApp.getInsulinIterfaceById(insulinInterfaceID); InsulinInterface insulinInterface = MainApp.getInsulinIterfaceById(insulinInterfaceID);
if (insulinInterface == null) if (insulinInterface == null)
insulinInterface = ConfigBuilderPlugin.getActiveInsulin(); insulinInterface = ConfigBuilderPlugin.getActiveInsulin();

View file

@ -12,6 +12,10 @@ import info.nightscout.androidaps.db.Treatment;
public interface InsulinInterface { public interface InsulinInterface {
final int FASTACTINGINSULIN = 0; final int FASTACTINGINSULIN = 0;
final int FASTACTINGINSULINPROLONGED = 1; final int FASTACTINGINSULINPROLONGED = 1;
final int OREF_RAPID_ACTING = 2;
final int OREF_ULTRA_RAPID_ACTING = 3;
final int OREF_FREE_PEAK = 4;
int getId(); int getId();
String getFriendlyName(); String getFriendlyName();

View file

@ -215,7 +215,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL
} }
break; break;
case R.id.actions_canceltempbasal: case R.id.actions_canceltempbasal:
if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) { if (MainApp.getConfigBuilder().isTempBasalInProgress()) {
sHandler.post(new Runnable() { sHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {

View file

@ -164,8 +164,8 @@ public class FillDialog extends DialogFragment implements OnClickListener {
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
detailedBolusInfo.insulin = finalInsulinAfterConstraints; detailedBolusInfo.insulin = finalInsulinAfterConstraints;
detailedBolusInfo.context = context; detailedBolusInfo.context = context;
detailedBolusInfo.addToTreatments = false;
detailedBolusInfo.source = Source.NONE; detailedBolusInfo.source = Source.NONE;
detailedBolusInfo.isValid = false; // do not count it in IOB (for pump history)
PumpEnactResult result = pump.deliverTreatment(detailedBolusInfo); PumpEnactResult result = pump.deliverTreatment(detailedBolusInfo);
if (!result.success) { if (!result.success) {
AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog.Builder builder = new AlertDialog.Builder(context);

View file

@ -887,10 +887,8 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain
@Override @Override
// return true if new record is created // return true if new record is created
public boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo) { public boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo) {
if (!detailedBolusInfo.addToTreatments)
return false;
boolean newRecordCreated = activeTreatments.addToHistoryTreatment(detailedBolusInfo); boolean newRecordCreated = activeTreatments.addToHistoryTreatment(detailedBolusInfo);
if (newRecordCreated) if (newRecordCreated && detailedBolusInfo.isValid)
NSUpload.uploadBolusWizardRecord(detailedBolusInfo); NSUpload.uploadBolusWizardRecord(detailedBolusInfo);
return newRecordCreated; return newRecordCreated;
} }

View file

@ -28,7 +28,7 @@ public class DetailedBolusInfoStorage {
public static DetailedBolusInfo findDetailedBolusInfo(long bolustime) { public static DetailedBolusInfo findDetailedBolusInfo(long bolustime) {
DetailedBolusInfo found = null; DetailedBolusInfo found = null;
for (int i = 0; i < store.size(); i++) { for (int i = 0; i < store.size(); i++) {
long infoTime = store.get(0).date; long infoTime = store.get(i).date;
log.debug("Existing info: " + new Date(infoTime).toLocaleString()); log.debug("Existing info: " + new Date(infoTime).toLocaleString());
if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) { if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
found = store.get(i); found = store.get(i);

View file

@ -21,7 +21,6 @@ import info.nightscout.androidaps.interfaces.InsulinInterface;
*/ */
public class ActivityGraph extends GraphView { public class ActivityGraph extends GraphView {
Context context; Context context;
public ActivityGraph(Context context) { public ActivityGraph(Context context) {
@ -35,6 +34,8 @@ public class ActivityGraph extends GraphView {
} }
public void show(InsulinInterface insulin) { public void show(InsulinInterface insulin) {
removeAllSeries();
mSecondScale = null;
double dia = insulin.getDia(); double dia = insulin.getDia();
int hours = (int) Math.floor(dia + 1); int hours = (int) Math.floor(dia + 1);

View file

@ -0,0 +1,108 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Iob;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.plugins.Overview.Notification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
/**
* Created by adrian on 13.08.2017.
*/
public abstract class InsulinOrefBasePlugin implements PluginBase, InsulinInterface {
public static double MIN_DIA = 5;
long lastWarned = 0;
@Override
public int getType() {
return INSULIN;
}
@Override
public String getNameShort() {
return MainApp.sResources.getString(R.string.insulin_shortname);
}
@Override
public boolean canBeHidden(int type) {
return true;
}
@Override
public boolean hasFragment() {
return true;
}
@Override
public boolean showInList(int type) {
return true;
}
@Override
public double getDia() {
double dia = getUserDefinedDia();
if(dia >= MIN_DIA){
return dia;
} else {
if((System.currentTimeMillis() - lastWarned) > 60*1000) {
lastWarned = System.currentTimeMillis();
Notification notification = new Notification(Notification.SHORT_DIA, String.format(MainApp.sResources.getString(R.string.dia_too_short), dia, MIN_DIA), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
}
return MIN_DIA;
}
}
public double getUserDefinedDia() {
return MainApp.getConfigBuilder().getProfile() != null ? MainApp.getConfigBuilder().getProfile().getDia() : Constants.defaultDIA;
}
@Override
public Iob iobCalcForTreatment(Treatment treatment, long time, Double dia) {
Iob result = new Iob();
int peak = getPeak();
if (treatment.insulin != 0d) {
long bolusTime = treatment.date;
double t = (time - bolusTime) / 1000d / 60d;
double td = getDia()*60; //getDIA() always > 5
double tp = peak;
// force the IOB to 0 if over DIA hours have passed
if (t < td) {
double tau = tp * (1 - tp / td) / (1 - 2 * tp / td);
double a = 2 * tau / td;
double S = 1 / (1 - a + (1 + a) * Math.exp(-td / tau));
result.activityContrib = treatment.insulin * (S / Math.pow(tau, 2)) * t * (1 - t / td) * Math.exp(-t / tau);
result.iobContrib = treatment.insulin * (1 - S * (1 - a) * ((Math.pow(t, 2) / (tau * td * (1 - a)) - t / tau - 1) * Math.exp(-t / tau) + 1));
}
}
return result;
}
@Override
public String getComment() {
String comment = commentStandardText();
double userDia = getUserDefinedDia();
if(userDia < MIN_DIA){
comment += "\n" + String.format(MainApp.sResources.getString(R.string.dia_too_short), userDia, MIN_DIA);
}
return comment;
}
abstract int getPeak();
abstract String commentStandardText();
}

View file

@ -0,0 +1,58 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.InsulinFastacting.ActivityGraph;
/**
* Created by adrian on 14/08/17.
*/
public class InsulinOrefFreePeakFragment extends Fragment {
static InsulinOrefFreePeakPlugin insulinPlugin = new InsulinOrefFreePeakPlugin();
static public InsulinOrefFreePeakPlugin getPlugin() {
return insulinPlugin;
}
TextView insulinName;
TextView insulinComment;
TextView insulinDia;
ActivityGraph insulinGraph;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.insulin_fragment, container, false);
insulinName = (TextView) view.findViewById(R.id.insulin_name);
insulinComment = (TextView) view.findViewById(R.id.insulin_comment);
insulinDia = (TextView) view.findViewById(R.id.insulin_dia);
insulinGraph = (ActivityGraph) view.findViewById(R.id.insuling_graph);
updateGUI();
return view;
}
@Override
public void onResume() {
super.onResume();
updateGUI();
}
private void updateGUI() {
insulinName.setText(insulinPlugin.getFriendlyName());
insulinComment.setText(insulinPlugin.getComment());
insulinDia.setText(MainApp.sResources.getText(R.string.dia) + " " + new Double(insulinPlugin.getDia()).toString() + "h");
insulinGraph.show(insulinPlugin);
}
}

View file

@ -0,0 +1,67 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.utils.SP;
/**
* Created by adrian on 14/08/17.
*/
public class InsulinOrefFreePeakPlugin extends InsulinOrefBasePlugin {
private static boolean fragmentEnabled = false;
private static boolean fragmentVisible = false;
public static final int DEFAULT_PEAK = 75;
@Override
public int getId() {
return OREF_FREE_PEAK;
}
@Override
public String getName() {
return MainApp.sResources.getString(R.string.free_peak_oref);
}
@Override
public String getFragmentClass() {
return InsulinOrefFreePeakFragment.class.getName();
}
@Override
public String getFriendlyName() {
return MainApp.sResources.getString(R.string.free_peak_oref);
}
@Override
public String commentStandardText() {
return MainApp.sResources.getString(R.string.insulin_peak_time) + ": " + getPeak();
}
@Override
public boolean isEnabled(int type) {
return type == INSULIN && fragmentEnabled;
}
@Override
public boolean isVisibleInTabs(int type) {
return type == INSULIN && fragmentVisible;
}
@Override
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
if (type == INSULIN) this.fragmentEnabled = fragmentEnabled;
}
@Override
public void setFragmentVisible(int type, boolean fragmentVisible) {
if (type == INSULIN) this.fragmentVisible = fragmentVisible;
}
@Override
int getPeak() {
return SP.getInt(R.string.key_insulin_oref_peak, DEFAULT_PEAK);
}
}

View file

@ -0,0 +1,57 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.InsulinFastacting.ActivityGraph;
/**
* Created by adrian on 14/08/17.
*/
public class InsulinOrefRapidActingFragment extends Fragment {
static InsulinOrefRapidActingPlugin insulinPlugin = new InsulinOrefRapidActingPlugin();
static public InsulinOrefRapidActingPlugin getPlugin() {
return insulinPlugin;
}
TextView insulinName;
TextView insulinComment;
TextView insulinDia;
ActivityGraph insulinGraph;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.insulin_fragment, container, false);
insulinName = (TextView) view.findViewById(R.id.insulin_name);
insulinComment = (TextView) view.findViewById(R.id.insulin_comment);
insulinDia = (TextView) view.findViewById(R.id.insulin_dia);
insulinGraph = (ActivityGraph) view.findViewById(R.id.insuling_graph);
updateGUI();
return view;
}
@Override
public void onResume() {
super.onResume();
updateGUI();
}
private void updateGUI() {
insulinName.setText(insulinPlugin.getFriendlyName());
insulinComment.setText(insulinPlugin.getComment());
insulinDia.setText(MainApp.sResources.getText(R.string.dia) + " " + new Double(insulinPlugin.getDia()).toString() + "h");
insulinGraph.show(insulinPlugin);
}
}

View file

@ -0,0 +1,66 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
/**
* Created by adrian on 14/08/17.
*/
public class InsulinOrefRapidActingPlugin extends InsulinOrefBasePlugin {
private static boolean fragmentEnabled = false;
private static boolean fragmentVisible = false;
public static final int PEAK = 75;
@Override
public int getId() {
return OREF_RAPID_ACTING;
}
@Override
public String getName() {
return MainApp.sResources.getString(R.string.rapid_acting_oref);
}
@Override
public String getFragmentClass() {
return InsulinOrefRapidActingFragment.class.getName();
}
@Override
public String getFriendlyName() {
return MainApp.sResources.getString(R.string.rapid_acting_oref);
}
@Override
public String commentStandardText() {
return MainApp.sResources.getString(R.string.fastactinginsulincomment);
}
@Override
public boolean isEnabled(int type) {
return type == INSULIN && fragmentEnabled;
}
@Override
public boolean isVisibleInTabs(int type) {
return type == INSULIN && fragmentVisible;
}
@Override
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
if (type == INSULIN) this.fragmentEnabled = fragmentEnabled;
}
@Override
public void setFragmentVisible(int type, boolean fragmentVisible) {
if (type == INSULIN) this.fragmentVisible = fragmentVisible;
}
@Override
int getPeak() {
return PEAK;
}
}

View file

@ -0,0 +1,58 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.InsulinFastacting.ActivityGraph;
/**
* Created by adrian on 14/08/17.
*/
public class InsulinOrefUltraRapidActingFragment extends Fragment {
static InsulinOrefUltraRapidActingPlugin insulinPlugin = new InsulinOrefUltraRapidActingPlugin();
static public InsulinOrefUltraRapidActingPlugin getPlugin() {
return insulinPlugin;
}
TextView insulinName;
TextView insulinComment;
TextView insulinDia;
ActivityGraph insulinGraph;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.insulin_fragment, container, false);
insulinName = (TextView) view.findViewById(R.id.insulin_name);
insulinComment = (TextView) view.findViewById(R.id.insulin_comment);
insulinDia = (TextView) view.findViewById(R.id.insulin_dia);
insulinGraph = (ActivityGraph) view.findViewById(R.id.insuling_graph);
updateGUI();
return view;
}
@Override
public void onResume() {
super.onResume();
updateGUI();
}
private void updateGUI() {
insulinName.setText(insulinPlugin.getFriendlyName());
insulinComment.setText(insulinPlugin.getComment());
insulinDia.setText(MainApp.sResources.getText(R.string.dia) + " " + new Double(insulinPlugin.getDia()).toString() + "h");
insulinGraph.show(insulinPlugin);
}
}

View file

@ -0,0 +1,66 @@
package info.nightscout.androidaps.plugins.InsulinOrefCurves;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
/**
* Created by adrian on 14/08/17.
*/
public class InsulinOrefUltraRapidActingPlugin extends InsulinOrefBasePlugin {
private static boolean fragmentEnabled = false;
private static boolean fragmentVisible = false;
public static final int PEAK = 55;
@Override
public int getId() {
return OREF_ULTRA_RAPID_ACTING;
}
@Override
public String getName() {
return MainApp.sResources.getString(R.string.ultrarapid_oref);
}
@Override
public String getFragmentClass() {
return InsulinOrefUltraRapidActingFragment.class.getName();
}
@Override
public String getFriendlyName() {
return MainApp.sResources.getString(R.string.ultrarapid_oref);
}
@Override
public String commentStandardText() {
return MainApp.sResources.getString(R.string.ultrafastactinginsulincomment);
}
@Override
public boolean isEnabled(int type) {
return type == INSULIN && fragmentEnabled;
}
@Override
public boolean isVisibleInTabs(int type) {
return type == INSULIN && fragmentVisible;
}
@Override
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
if (type == INSULIN) this.fragmentEnabled = fragmentEnabled;
}
@Override
public void setFragmentVisible(int type, boolean fragmentVisible) {
if (type == INSULIN) this.fragmentVisible = fragmentVisible;
}
@Override
int getPeak() {
return PEAK;
}
}

View file

@ -208,7 +208,7 @@ public class DetermineBasalAdapterAMAJS {
mProfile = new V8Object(mV8rt); mProfile = new V8Object(mV8rt);
mProfile.add("max_iob", maxIob); mProfile.add("max_iob", maxIob);
mProfile.add("dia", profile.getDia()); mProfile.add("dia", Math.min(profile.getDia(), 3d));
mProfile.add("type", "current"); mProfile.add("type", "current");
mProfile.add("max_daily_basal", profile.getMaxDailyBasal()); mProfile.add("max_daily_basal", profile.getMaxDailyBasal());
mProfile.add("max_basal", maxBasal); mProfile.add("max_basal", maxBasal);

View file

@ -231,7 +231,7 @@ public class DetermineBasalAdapterMAJS {
String units = profile.getUnits(); String units = profile.getUnits();
mProfile.add("max_iob", maxIob); mProfile.add("max_iob", maxIob);
mProfile.add("dia", profile.getDia()); mProfile.add("dia", Math.min(profile.getDia(), 3d));
mProfile.add("type", "current"); mProfile.add("type", "current");
mProfile.add("max_daily_basal", profile.getMaxDailyBasal()); mProfile.add("max_daily_basal", profile.getMaxDailyBasal());
mProfile.add("max_basal", maxBasal); mProfile.add("max_basal", maxBasal);

View file

@ -47,6 +47,9 @@ public class Notification {
public static final int NSANNOUNCEMENT = 18; public static final int NSANNOUNCEMENT = 18;
public static final int NSALARM = 19; public static final int NSALARM = 19;
public static final int NSURGENTALARM = 20; public static final int NSURGENTALARM = 20;
public static final int SHORT_DIA = 21;
public static final int TOAST_ALARM = 22;
public int id; public int id;
public Date date; public Date date;

View file

@ -952,19 +952,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
tempTargetView.setTextColor(Color.BLACK); tempTargetView.setTextColor(Color.BLACK);
tempTargetView.setBackgroundColor(MainApp.sResources.getColor(R.color.tempTargetBackground)); tempTargetView.setBackgroundColor(MainApp.sResources.getColor(R.color.tempTargetBackground));
tempTargetView.setVisibility(View.VISIBLE); tempTargetView.setVisibility(View.VISIBLE);
if (tempTarget.low == tempTarget.high) tempTargetView.setText(Profile.toTargetRangeString(tempTarget.low, tempTarget.high, units));
tempTargetView.setText(Profile.toUnitsString(tempTarget.low, Profile.fromMgdlToUnits(tempTarget.low, units), units));
else
tempTargetView.setText(Profile.toUnitsString(tempTarget.low, Profile.fromMgdlToUnits(tempTarget.low, units), units) + " - " + Profile.toUnitsString(tempTarget.high, Profile.fromMgdlToUnits(tempTarget.high, units), units));
} else { } else {
tempTargetView.setTextColor(Color.WHITE); tempTargetView.setTextColor(Color.WHITE);
tempTargetView.setBackgroundColor(MainApp.sResources.getColor(R.color.tempTargetDisabledBackground)); tempTargetView.setBackgroundColor(MainApp.sResources.getColor(R.color.tempTargetDisabledBackground));
double low = MainApp.getConfigBuilder().getProfile().getTargetLow(); tempTargetView.setText(Profile.toTargetRangeString(profile.getTargetLow(), profile.getTargetHigh(), units));
double high = MainApp.getConfigBuilder().getProfile().getTargetHigh();
if (low == high)
tempTargetView.setText("" + low);
else
tempTargetView.setText(low + " - " + high);
tempTargetView.setVisibility(View.VISIBLE); tempTargetView.setVisibility(View.VISIBLE);
} }
if (Config.NSCLIENT && tempTarget == null) { if (Config.NSCLIENT && tempTarget == null) {
@ -1605,7 +1597,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
List<Treatment> treatments = MainApp.getConfigBuilder().getTreatmentsFromHistory(); List<Treatment> treatments = MainApp.getConfigBuilder().getTreatmentsFromHistory();
for (int tx = 0; tx < treatments.size(); tx++) { for (int tx = 0; tx < treatments.size(); tx++) {
DataPointWithLabelInterface t = treatments.get(tx); Treatment t = treatments.get(tx);
if (!t.isValid)
continue;
if (t.getX() < fromTime || t.getX() > endTime) continue; if (t.getX() < fromTime || t.getX() > endTime) continue;
t.setY(getNearestBg((long) t.getX(), bgReadingsArray)); t.setY(getNearestBg((long) t.getX(), bgReadingsArray));
filteredTreatments.add(t); filteredTreatments.add(t);

View file

@ -500,9 +500,13 @@ public class CircadianPercentageProfileFragment extends SubscriberFragment {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || !MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable) { if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) {
profileswitchButton.setVisibility(View.GONE); profileswitchButton.setVisibility(View.GONE);
} else if (!MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable) {
profileswitchButton.setText(MainApp.instance().getText(R.string.activate_profile));
profileswitchButton.setVisibility(View.VISIBLE);
} else { } else {
profileswitchButton.setText(MainApp.instance().getText(R.string.send_to_pump));
profileswitchButton.setVisibility(View.VISIBLE); profileswitchButton.setVisibility(View.VISIBLE);
} }
} }

View file

@ -148,9 +148,13 @@ public class LocalProfileFragment extends SubscriberFragment {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || !MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable) { if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) {
profileswitchButton.setVisibility(View.GONE); profileswitchButton.setVisibility(View.GONE);
} else if (!MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable) {
profileswitchButton.setText(MainApp.instance().getText(R.string.activate_profile));
profileswitchButton.setVisibility(View.VISIBLE);
} else { } else {
profileswitchButton.setText(MainApp.instance().getText(R.string.send_to_pump));
profileswitchButton.setVisibility(View.VISIBLE); profileswitchButton.setVisibility(View.VISIBLE);
} }
} }

View file

@ -24,14 +24,14 @@ public class NSProfileFragment extends SubscriberFragment {
return nsProfilePlugin; return nsProfilePlugin;
} }
private static TextView noProfile; private TextView noProfile;
private static TextView units; private TextView units;
private static TextView dia; private TextView dia;
private static TextView activeProfile; private TextView activeProfile;
private static TextView ic; private TextView ic;
private static TextView isf; private TextView isf;
private static TextView basal; private TextView basal;
private static TextView target; private TextView target;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,

View file

@ -156,9 +156,13 @@ public class SimpleProfileFragment extends SubscriberFragment {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || !MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable) { if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) {
profileswitchButton.setVisibility(View.GONE); profileswitchButton.setVisibility(View.GONE);
} else if (!MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable) {
profileswitchButton.setText(MainApp.instance().getText(R.string.activate_profile));
profileswitchButton.setVisibility(View.VISIBLE);
} else { } else {
profileswitchButton.setText(MainApp.instance().getText(R.string.send_to_pump));
profileswitchButton.setVisibility(View.VISIBLE); profileswitchButton.setVisibility(View.VISIBLE);
} }
} }

View file

@ -33,16 +33,16 @@ import info.nightscout.utils.DecimalFormatter;
public class ProfileViewDialog extends DialogFragment { public class ProfileViewDialog extends DialogFragment {
private static Logger log = LoggerFactory.getLogger(ProfileViewDialog.class); private static Logger log = LoggerFactory.getLogger(ProfileViewDialog.class);
private static TextView noProfile; private TextView noProfile;
private static TextView units; private TextView units;
private static TextView dia; private TextView dia;
private static TextView activeProfile; private TextView activeProfile;
private static TextView ic; private TextView ic;
private static TextView isf; private TextView isf;
private static TextView basal; private TextView basal;
private static TextView target; private TextView target;
private static Button refreshButton; private Button refreshButton;
Handler mHandler; Handler mHandler;
static HandlerThread mHandlerThread; static HandlerThread mHandlerThread;

View file

@ -13,9 +13,11 @@ import info.nightscout.androidaps.Config;
public class MsgSetTime extends MessageBase { public class MsgSetTime extends MessageBase {
private static Logger log = LoggerFactory.getLogger(MsgSetTime.class); private static Logger log = LoggerFactory.getLogger(MsgSetTime.class);
private static Date time;
public MsgSetTime(Date time) { public MsgSetTime(Date time) {
SetCommand(0x330a); SetCommand(0x330a);
this.time = time;
AddParamDateTime(time); AddParamDateTime(time);
} }
@ -23,6 +25,6 @@ public class MsgSetTime extends MessageBase {
int result = intFromBuff(bytes, 0, 1); int result = intFromBuff(bytes, 0, 1);
if (Config.logDanaMessageDetail) if (Config.logDanaMessageDetail)
log.debug("Result: " + result); log.debug("Result of setting time: " + time + " is " + result);
} }
} }

View file

@ -27,7 +27,7 @@ public class MsgSettingPumpTime extends MessageBase {
); );
if (Config.logDanaMessageDetail) if (Config.logDanaMessageDetail)
log.debug("Pump time: " + time); log.debug("Pump time: " + time + " Phone time: " + new Date());
DanaRPump.getInstance().pumpTime = time; DanaRPump.getInstance().pumpTime = time;
} }

View file

@ -326,11 +326,18 @@ public class DanaRExecutionService extends Service {
//0x3201 //0x3201
mSerialIOThread.sendMessage(new MsgSettingMaxValues()); mSerialIOThread.sendMessage(new MsgSettingMaxValues());
mSerialIOThread.sendMessage(new MsgSettingGlucose()); mSerialIOThread.sendMessage(new MsgSettingGlucose());
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile());
mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios());
mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll());
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
log.debug("Pump time difference: " + timeDiff + " seconds");
if (Math.abs(timeDiff) > 10) {
mSerialIOThread.sendMessage(new MsgSetTime(new Date())); mSerialIOThread.sendMessage(new MsgSetTime(new Date()));
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
log.debug("Pump time difference: " + timeDiff + " seconds");
}
danaRPump.lastSettingsRead = now; danaRPump.lastSettingsRead = now;
} }

View file

@ -322,9 +322,15 @@ public class DanaRKoreanExecutionService extends Service {
//0x3201 //0x3201
mSerialIOThread.sendMessage(new MsgSettingMaxValues()); mSerialIOThread.sendMessage(new MsgSettingMaxValues());
mSerialIOThread.sendMessage(new MsgSettingGlucose()); mSerialIOThread.sendMessage(new MsgSettingGlucose());
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios());
long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
log.debug("Pump time difference: " + timeDiff + " seconds");
if (Math.abs(timeDiff) > 10) {
mSerialIOThread.sendMessage(new MsgSetTime(new Date())); mSerialIOThread.sendMessage(new MsgSetTime(new Date()));
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
log.debug("Pump time difference: " + timeDiff + " seconds");
}
danaRPump.lastSettingsRead = now; danaRPump.lastSettingsRead = now;
} }

View file

@ -99,14 +99,14 @@ public class MsgHistoryEvents_v2 extends MessageBase {
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus); MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
break; break;
case DanaRPump.BOLUS: case DanaRPump.BOLUS:
log.debug("EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
detailedBolusInfo.insulin = param1 / 100d; detailedBolusInfo.insulin = param1 / 100d;
MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo); boolean newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
break; break;
case DanaRPump.DUALBOLUS: case DanaRPump.DUALBOLUS:
log.debug("EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
detailedBolusInfo.insulin = param1 / 100d; detailedBolusInfo.insulin = param1 / 100d;
MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo); newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
break; break;
case DanaRPump.DUALEXTENDEDSTART: case DanaRPump.DUALEXTENDEDSTART:
log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min"); log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
@ -134,9 +134,9 @@ public class MsgHistoryEvents_v2 extends MessageBase {
log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h"); log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
break; break;
case DanaRPump.CARBS: case DanaRPump.CARBS:
log.debug("EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
detailedBolusInfo.carbs = param1; detailedBolusInfo.carbs = param1;
MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo); newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
break; break;
default: default:
log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2); log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);

View file

@ -297,11 +297,18 @@ public class DanaRv2ExecutionService extends Service {
//0x3201 //0x3201
mSerialIOThread.sendMessage(new MsgSettingMaxValues()); mSerialIOThread.sendMessage(new MsgSettingMaxValues());
mSerialIOThread.sendMessage(new MsgSettingGlucose()); mSerialIOThread.sendMessage(new MsgSettingGlucose());
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile());
mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios());
mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll());
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
log.debug("Pump time difference: " + timeDiff + " seconds");
if (Math.abs(timeDiff) > 10) {
mSerialIOThread.sendMessage(new MsgSetTime(new Date())); mSerialIOThread.sendMessage(new MsgSetTime(new Date()));
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
log.debug("Pump time difference: " + timeDiff + " seconds");
}
danaRPump.lastSettingsRead = now; danaRPump.lastSettingsRead = now;
} }

View file

@ -179,6 +179,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface {
for (Integer pos = 0; pos < treatments.size(); pos++) { for (Integer pos = 0; pos < treatments.size(); pos++) {
Treatment t = treatments.get(pos); Treatment t = treatments.get(pos);
if (!t.isValid) continue;
if (t.date > time) continue; if (t.date > time) continue;
Iob tIOB = t.iobCalc(time, dia); Iob tIOB = t.iobCalc(time, dia);
total.iob += tIOB.iobContrib; total.iob += tIOB.iobContrib;
@ -222,6 +223,8 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface {
long dia_ago = now - (new Double(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue(); long dia_ago = now - (new Double(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue();
for (Treatment treatment : treatments) { for (Treatment treatment : treatments) {
if (!treatment.isValid)
continue;
long t = treatment.date; long t = treatment.date;
if (t > dia_ago && t <= now) { if (t > dia_ago && t <= now) {
if (treatment.carbs >= 1) { if (treatment.carbs >= 1) {
@ -250,6 +253,8 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface {
List<Treatment> in5minback = new ArrayList<>(); List<Treatment> in5minback = new ArrayList<>();
for (Integer pos = 0; pos < treatments.size(); pos++) { for (Integer pos = 0; pos < treatments.size(); pos++) {
Treatment t = treatments.get(pos); Treatment t = treatments.get(pos);
if (!t.isValid)
continue;
if (t.date <= time && t.date > time - 5 * 60 * 1000 && t.carbs > 0) if (t.date <= time && t.date > time - 5 * 60 * 1000 && t.carbs > 0)
in5minback.add(t); in5minback.add(t);
} }
@ -411,6 +416,8 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface {
treatment.source = detailedBolusInfo.source; treatment.source = detailedBolusInfo.source;
treatment.pumpId = detailedBolusInfo.pumpId; treatment.pumpId = detailedBolusInfo.pumpId;
treatment.insulin = detailedBolusInfo.insulin; treatment.insulin = detailedBolusInfo.insulin;
treatment.isValid = detailedBolusInfo.isValid;
treatment.isSMB = detailedBolusInfo.isSMB;
if (detailedBolusInfo.carbTime == 0) if (detailedBolusInfo.carbTime == 0)
treatment.carbs = detailedBolusInfo.carbs; treatment.carbs = detailedBolusInfo.carbs;
treatment.source = detailedBolusInfo.source; treatment.source = detailedBolusInfo.source;

View file

@ -0,0 +1,108 @@
package info.nightscout.androidaps.plugins.Treatments.fragments;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.plugins.PumpDanaR.Dialogs.ProfileViewDialog;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
/**
* Created by adrian on 17/08/17.
*/
public class ProfileViewerDialog extends DialogFragment {
private long time;
private static Logger log = LoggerFactory.getLogger(ProfileViewDialog.class);
private TextView noProfile;
private TextView units;
private TextView dia;
private TextView activeProfile;
private TextView ic;
private TextView isf;
private TextView basal;
private TextView target;
private View dateDelimiter;
private LinearLayout dateLayout;
private TextView dateTextView;
private Button refreshButton;
static ProfileViewerDialog newInstance(long time) {
ProfileViewerDialog dialog = new ProfileViewerDialog();
Bundle args = new Bundle();
args.putLong("time", time);
dialog.setArguments(args);
return dialog;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
time = getArguments().getLong("time");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.nsprofileviewer_fragment, container, false);
noProfile = (TextView) layout.findViewById(R.id.profileview_noprofile);
units = (TextView) layout.findViewById(R.id.profileview_units);
dia = (TextView) layout.findViewById(R.id.profileview_dia);
activeProfile = (TextView) layout.findViewById(R.id.profileview_activeprofile);
ic = (TextView) layout.findViewById(R.id.profileview_ic);
isf = (TextView) layout.findViewById(R.id.profileview_isf);
basal = (TextView) layout.findViewById(R.id.profileview_basal);
target = (TextView) layout.findViewById(R.id.profileview_target);
refreshButton = (Button) layout.findViewById(R.id.profileview_reload);
refreshButton.setVisibility(View.GONE);
dateDelimiter = layout.findViewById(R.id.profileview_datedelimiter);
dateDelimiter.setVisibility(View.VISIBLE);
dateLayout = (LinearLayout) layout.findViewById(R.id.profileview_datelayout);
dateLayout.setVisibility(View.VISIBLE);
dateTextView = (TextView) layout.findViewById(R.id.profileview_date);
setContent();
return layout;
}
private void setContent() {
Profile profile = null;
ProfileSwitch profileSwitch = MainApp.getConfigBuilder().getProfileSwitchFromHistory(time);
if(profileSwitch!=null && profileSwitch.profileJson != null){
profile = profileSwitch.getProfileObject();
}
if (profile != null) {
noProfile.setVisibility(View.GONE);
units.setText(profile.getUnits());
dia.setText(DecimalFormatter.to2Decimal(profile.getDia()) + " h");
activeProfile.setText(profileSwitch.profileName);
dateTextView.setText(DateUtil.dateAndTimeString(profileSwitch.date));
ic.setText(profile.getIcList());
isf.setText(profile.getIsfList());
basal.setText(profile.getBasalList());
target.setText(profile.getTargetList());
} else {
noProfile.setVisibility(View.VISIBLE);
}
}
}

View file

@ -85,6 +85,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
holder.mealOrCorrection.setText(t.mealBolus ? MainApp.sResources.getString(R.string.mealbolus) : MainApp.sResources.getString(R.string.correctionbous)); holder.mealOrCorrection.setText(t.mealBolus ? MainApp.sResources.getString(R.string.mealbolus) : MainApp.sResources.getString(R.string.correctionbous));
holder.ph.setVisibility(t.source == Source.PUMP ? View.VISIBLE : View.GONE); holder.ph.setVisibility(t.source == Source.PUMP ? View.VISIBLE : View.GONE);
holder.ns.setVisibility(t._id != null ? View.VISIBLE : View.GONE); holder.ns.setVisibility(t._id != null ? View.VISIBLE : View.GONE);
holder.invalid.setVisibility(t.isValid ? View.GONE : View.VISIBLE);
if (iob.iobContrib != 0) if (iob.iobContrib != 0)
holder.iob.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive)); holder.iob.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive));
else else
@ -113,6 +114,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
TextView remove; TextView remove;
TextView ph; TextView ph;
TextView ns; TextView ns;
TextView invalid;
TreatmentsViewHolder(View itemView) { TreatmentsViewHolder(View itemView) {
super(itemView); super(itemView);
@ -125,6 +127,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
mealOrCorrection = (TextView) itemView.findViewById(R.id.treatments_mealorcorrection); mealOrCorrection = (TextView) itemView.findViewById(R.id.treatments_mealorcorrection);
ph = (TextView) itemView.findViewById(R.id.pump_sign); ph = (TextView) itemView.findViewById(R.id.pump_sign);
ns = (TextView) itemView.findViewById(R.id.ns_sign); ns = (TextView) itemView.findViewById(R.id.ns_sign);
invalid = (TextView) itemView.findViewById(R.id.invalid_sign);
remove = (TextView) itemView.findViewById(R.id.treatments_remove); remove = (TextView) itemView.findViewById(R.id.treatments_remove);
remove.setOnClickListener(this); remove.setOnClickListener(this);
remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
@ -141,10 +144,15 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
final String _id = treatment._id; final String _id = treatment._id;
if (treatment.source == Source.PUMP) {
treatment.isValid = false;
MainApp.getDbHelper().update(treatment);
} else {
if (_id != null && !_id.equals("")) { if (_id != null && !_id.equals("")) {
NSUpload.removeCareportalEntryFromNS(_id); NSUpload.removeCareportalEntryFromNS(_id);
} }
MainApp.getDbHelper().delete(treatment); MainApp.getDbHelper().delete(treatment);
}
updateGUI(); updateGUI();
Answers.getInstance().logCustom(new CustomEvent("RemoveTreatment")); Answers.getInstance().logCustom(new CustomEvent("RemoveTreatment"));
} }

View file

@ -7,6 +7,7 @@ import android.content.Intent;
import android.graphics.Paint; import android.graphics.Paint;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.widget.CardView; import android.support.v7.widget.CardView;
@ -84,6 +85,9 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
else else
holder.date.setTextColor(holder.duration.getCurrentTextColor()); holder.date.setTextColor(holder.duration.getCurrentTextColor());
holder.remove.setTag(profileSwitch); holder.remove.setTag(profileSwitch);
holder.name.setTag(profileSwitch);
holder.date.setTag(profileSwitch);
} }
@Override @Override
@ -116,6 +120,9 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
remove = (TextView) itemView.findViewById(R.id.profileswitch_remove); remove = (TextView) itemView.findViewById(R.id.profileswitch_remove);
remove.setOnClickListener(this); remove.setOnClickListener(this);
remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
name.setOnClickListener(this);
date.setOnClickListener(this);
} }
@Override @Override
@ -123,9 +130,11 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
final ProfileSwitch profileSwitch = (ProfileSwitch) v.getTag(); final ProfileSwitch profileSwitch = (ProfileSwitch) v.getTag();
switch (v.getId()) { switch (v.getId()) {
case R.id.profileswitch_remove: case R.id.profileswitch_remove:
OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.confirmation), MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(profileSwitch.date), new Runnable() { AlertDialog.Builder builder = new AlertDialog.Builder(context);
@Override builder.setTitle(MainApp.sResources.getString(R.string.confirmation));
public void run() { builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(profileSwitch.date));
builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
final String _id = profileSwitch._id; final String _id = profileSwitch._id;
if (_id != null && !_id.equals("")) { if (_id != null && !_id.equals("")) {
NSUpload.removeCareportalEntryFromNS(_id); NSUpload.removeCareportalEntryFromNS(_id);
@ -133,6 +142,15 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
MainApp.getDbHelper().delete(profileSwitch); MainApp.getDbHelper().delete(profileSwitch);
} }
}); });
builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null);
builder.show();
break;
case R.id.profileswitch_date:
case R.id.profileswitch_name:
long time = ((ProfileSwitch)v.getTag()).date;
ProfileViewerDialog pvd = ProfileViewerDialog.newInstance(time);
FragmentManager manager = getFragmentManager();
pvd.show(manager, "ProfileViewDialog");
break; break;
} }
} }

View file

@ -141,7 +141,6 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements
@Override @Override
public void onClick(View v) { public void onClick(View v) {
final TempTarget tempTarget = (TempTarget) v.getTag(); final TempTarget tempTarget = (TempTarget) v.getTag();
final Context finalContext = context;
switch (v.getId()) { switch (v.getId()) {
case R.id.temptargetrange_remove: case R.id.temptargetrange_remove:
AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog.Builder builder = new AlertDialog.Builder(context);

View file

@ -472,7 +472,7 @@ public class ActionStringHandler {
//Check for Temp-Target: //Check for Temp-Target:
TempTarget tempTarget = MainApp.getConfigBuilder().getTempTargetFromHistory(System.currentTimeMillis()); TempTarget tempTarget = MainApp.getConfigBuilder().getTempTargetFromHistory(System.currentTimeMillis());
if (tempTarget != null) { if (tempTarget != null) {
ret += "Temp Target: " + Profile.toUnitsString(tempTarget.low, Profile.fromMgdlToUnits(tempTarget.low, profile.getUnits()), profile.getUnits()) + " - " + Profile.toUnitsString(tempTarget.high, Profile.fromMgdlToUnits(tempTarget.high, profile.getUnits()), profile.getUnits()); ret += "Temp Target: " + Profile.toTargetRangeString(tempTarget.low, tempTarget.low, profile.getUnits());
ret += "\nuntil: " + DateUtil.timeString(tempTarget.originalEnd()); ret += "\nuntil: " + DateUtil.timeString(tempTarget.originalEnd());
ret += "\n\n"; ret += "\n\n";
} }
@ -615,7 +615,7 @@ public class ActionStringHandler {
public void run() { public void run() {
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
detailedBolusInfo.insulin = amount; detailedBolusInfo.insulin = amount;
detailedBolusInfo.addToTreatments = false; detailedBolusInfo.isValid = false;
detailedBolusInfo.source = Source.USER; detailedBolusInfo.source = Source.USER;
PumpEnactResult result = MainApp.getConfigBuilder().deliverTreatment(detailedBolusInfo); PumpEnactResult result = MainApp.getConfigBuilder().deliverTreatment(detailedBolusInfo);
if (!result.success) { if (!result.success) {

View file

@ -0,0 +1,21 @@
package info.nightscout.utils;
import android.os.Bundle;
/**
* Created by mike on 14.08.2017.
*/
public class BundleLogger {
public static String log(Bundle bundle) {
if (bundle == null) {
return null;
}
String string = "Bundle{";
for (String key : bundle.keySet()) {
string += " " + key + " => " + bundle.get(key) + ";";
}
string += " }Bundle";
return string;
}
}

View file

@ -85,12 +85,16 @@ public class DateUtil {
} }
public static int toSeconds(String hh_colon_mm) { public static int toSeconds(String hh_colon_mm) {
Pattern p = Pattern.compile("(\\d+):(\\d+)"); Pattern p = Pattern.compile("(\\d+):(\\d+)( a.m.| p.m.|)");
Matcher m = p.matcher(hh_colon_mm); Matcher m = p.matcher(hh_colon_mm);
int retval = 0; int retval = 0;
if (m.find()) { if (m.find()) {
retval = SafeParse.stringToInt(m.group(1)) * 60 * 60 + SafeParse.stringToInt(m.group(2)) * 60; retval = SafeParse.stringToInt(m.group(1)) * 60 * 60 + SafeParse.stringToInt(m.group(2)) * 60;
if (m.group(3).equals(" .a.m") && m.group(1).equals("12"))
retval -= 12 * 60 * 60;
if (m.group(3).equals(" p.m.") && !m.group(1).equals("12"))
retval += 12 * 60 * 60;
} }
return retval; return retval;
} }

View file

@ -6,6 +6,10 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.widget.Toast; import android.widget.Toast;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.plugins.Overview.Notification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
public class ToastUtils { public class ToastUtils {
public static void showToastInUiThread(final Context ctx, public static void showToastInUiThread(final Context ctx,
@ -25,6 +29,13 @@ public class ToastUtils {
showToastInUiThread(ctx, string); showToastInUiThread(ctx, string);
playSound(ctx, soundID); playSound(ctx, soundID);
new Thread(new Runnable() {
@Override
public void run() {
Notification notification = new Notification(Notification.TOAST_ALARM, string, Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
}
}).start();
} }
private static void playSound(final Context ctx, final int soundID) { private static void playSound(final Context ctx, final int soundID) {

View file

@ -35,7 +35,7 @@
android:layout_weight="2" android:layout_weight="2"
android:gravity="end" android:gravity="end"
android:paddingRight="5dp" android:paddingRight="5dp"
android:text="@string/nsprofileview_activeprofile_label" android:text="@string/careportal_newnstreatment_profile_label"
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
@ -60,6 +60,55 @@
</LinearLayout> </LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:layout_marginBottom="5dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="5dp"
android:background="@color/listdelimiter"
android:id="@+id/profileview_datedelimiter"
android:visibility="gone"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/profileview_datelayout"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="end"
android:paddingRight="5dp"
android:text="@string/date"
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_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:paddingLeft="5dp"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
<View <View
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="2dip" android:layout_height="2dip"

View file

@ -375,7 +375,8 @@
android:id="@+id/overview_accepttemplayout" android:id="@+id/overview_accepttemplayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal"
android:visibility="gone">
<Button <Button
android:id="@+id/overview_accepttempbutton" android:id="@+id/overview_accepttempbutton"
@ -386,8 +387,7 @@
android:layout_marginTop="3dp" android:layout_marginTop="3dp"
android:layout_weight="0.5" android:layout_weight="0.5"
android:text="Accept new temp\n0.25U/h" android:text="Accept new temp\n0.25U/h"
android:textColor="@color/colorAcceptTempButton" android:textColor="@color/colorAcceptTempButton" />
android:visibility="gone" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

View file

@ -80,7 +80,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginRight="30dp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
@ -106,6 +105,14 @@
android:text="NS" android:text="NS"
android:textColor="@color/colorSetTempButton" /> android:textColor="@color/colorSetTempButton" />
<TextView
android:id="@+id/invalid_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:text="@string/invalid"
android:textColor="@android:color/holo_red_light" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">AndroidAPS</string>
</resources>

View file

@ -581,4 +581,5 @@
<string name="sms_delta">Delta:</string> <string name="sms_delta">Delta:</string>
<string name="sms_iob">IOB:</string> <string name="sms_iob">IOB:</string>
<string name="sms_minago" formatted="false">%dmin sedan</string> <string name="sms_minago" formatted="false">%dmin sedan</string>
<string name="app_name">AndroidAPS</string>
</resources> </resources>

View file

@ -15,6 +15,7 @@
<item>@string/bg_lang</item> <item>@string/bg_lang</item>
<item>@string/cs_lang</item> <item>@string/cs_lang</item>
<item>@string/de_lang</item> <item>@string/de_lang</item>
<item>@string/nl_lang</item>
<item>@string/es_lang</item> <item>@string/es_lang</item>
<item>@string/el_lang</item> <item>@string/el_lang</item>
<item>@string/it_lang</item> <item>@string/it_lang</item>
@ -27,6 +28,7 @@
<item>bg</item> <item>bg</item>
<item>cs</item> <item>cs</item>
<item>de</item> <item>de</item>
<item>nl</item>
<item>es</item> <item>es</item>
<item>el</item> <item>el</item>
<item>it</item> <item>it</item>

View file

@ -203,6 +203,7 @@
<string name="filenotfound">File not found</string> <string name="filenotfound">File not found</string>
<string name="nav_export">Export settings</string> <string name="nav_export">Export settings</string>
<string name="nav_import">Import settings</string> <string name="nav_import">Import settings</string>
<string name="nl_lang">Dutch</string>
<string name="de_lang">German</string> <string name="de_lang">German</string>
<string name="es_lang">Spanish</string> <string name="es_lang">Spanish</string>
<string name="el_lang">Greek</string> <string name="el_lang">Greek</string>
@ -580,6 +581,7 @@
<string name="configbuilder_insulin">Insulin</string> <string name="configbuilder_insulin">Insulin</string>
<string name="fastactinginsulin">Fast Acting Insulin</string> <string name="fastactinginsulin">Fast Acting Insulin</string>
<string name="fastactinginsulincomment">Novorapid, Novolog, Humalog</string> <string name="fastactinginsulincomment">Novorapid, Novolog, Humalog</string>
<string name="ultrafastactinginsulincomment">Fiasp</string>
<string name="insulin_shortname">INS</string> <string name="insulin_shortname">INS</string>
<string name="fastactinginsulinprolonged">Fast Acting Insulin Prolonged</string> <string name="fastactinginsulinprolonged">Fast Acting Insulin Prolonged</string>
<string name="key_usesuperbolus" translatable="false">key_usersuperbolus</string> <string name="key_usesuperbolus" translatable="false">key_usersuperbolus</string>
@ -692,5 +694,15 @@
<string name="careportal_pump_label">PUMP</string> <string name="careportal_pump_label">PUMP</string>
<string name="overview_newtempbasal_basalabsolute">Basal value [U/h]</string> <string name="overview_newtempbasal_basalabsolute">Basal value [U/h]</string>
<string name="careportal_newnstreatment_duration_min_label">Duration [min]</string> <string name="careportal_newnstreatment_duration_min_label">Duration [min]</string>
<string name="key_insulin_oref_peak" translatable="false">insulin_oref_peak</string>
<string name="insulin_oref_peak">IOB Curve Peak Time</string>
<string name="insulin_peak_time">Peak Time [min]</string>
<string name="free_peak_oref">Free-Peak Oref</string>
<string name="rapid_acting_oref">Rapid-Acting Oref</string>
<string name="ultrarapid_oref">Ultra-Rapid Oref</string>
<string name="dia_too_short" formatted="false">"DIA of %s too short - using %s instead!"</string>
<string name="activate_profile">ACTIVATE PROFILE</string>
<string name="date">Date</string>
<string name="invalid">INVALID</string>
</resources> </resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:validate="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:key="InsulinOrefFreePeak"
android:title="@string/insulin_oref_peak">
<com.andreabaccega.widget.ValidatingEditTextPreference
validate:testType="numericRange"
validate:minNumber="35"
validate:maxNumber="120"
android:digits="0123456789"
android:defaultValue="75"
android:selectAllOnFocus="true"
android:inputType="number"
android:maxLines="20"
android:title="@string/insulin_peak_time"
android:key="@string/key_insulin_oref_peak" />
</PreferenceCategory>
</PreferenceScreen>