Merge pull request #16 from MilosKozak/master

dev
This commit is contained in:
LadyViktoria 2016-06-19 20:18:37 +02:00 committed by GitHub
commit b283ef4a14
40 changed files with 1665 additions and 398 deletions

View file

@ -60,8 +60,9 @@
<!-- Service processing incomming data --> <!-- Service processing incomming data -->
<service <service
android:name=".Services.DataService" android:name=".Services.DataService"
android:exported="false"></service> android:exported="false" />
<activity android:name=".PreferencesActivity"></activity>
</application> </application>
</manifest> </manifest>

View file

@ -4,6 +4,13 @@ package info.nightscout.androidaps;
* Created by mike on 07.06.2016. * Created by mike on 07.06.2016.
*/ */
public class Config { public class Config {
// MAIN FUCTIONALITY
public static final boolean APS = true;
// PLUGINS
public static final boolean LOWSUSPEDENABLED = APS && true;
public static final boolean OPENAPSMAENABLED = APS && true;
public static final boolean LOOPENABLED = APS && true;
public static final boolean detailedLog = true; public static final boolean detailedLog = true;
public static final boolean logFunctionCalls = true; public static final boolean logFunctionCalls = true;
public static final boolean logIncommingBG = true; public static final boolean logIncommingBG = true;
@ -12,4 +19,8 @@ public class Config {
public static final boolean logPumpComm = true; public static final boolean logPumpComm = true;
public static final boolean logPrefsChange = true; public static final boolean logPrefsChange = true;
public static final boolean logConfigBuilder = true; public static final boolean logConfigBuilder = true;
public static final boolean logConstrainsChnages = true;
// Developing mode only - never turn on
public static final boolean fakeGlucoseData = true;
} }

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps; package info.nightscout.androidaps;
import android.content.Intent;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
@ -19,10 +20,12 @@ import java.util.Iterator;
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.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
import info.nightscout.androidaps.plugins.LowSuspend.LowSuspendFragment; import info.nightscout.androidaps.plugins.LowSuspend.LowSuspendFragment;
import info.nightscout.androidaps.plugins.NSProfileViewer.NSProfileViewerFragment; import info.nightscout.androidaps.plugins.NSProfileViewer.NSProfileViewerFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAFragment; import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAFragment;
import info.nightscout.androidaps.plugins.Overview.OverviewFragment; import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
import info.nightscout.androidaps.plugins.SafetyFragment.SafetyFragment;
import info.nightscout.androidaps.plugins.SimpleProfile.SimpleProfileFragment; import info.nightscout.androidaps.plugins.SimpleProfile.SimpleProfileFragment;
import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment; import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
@ -58,12 +61,17 @@ public class MainActivity extends AppCompatActivity {
// Register all tabs in app here // Register all tabs in app here
pluginsList.add(OverviewFragment.newInstance()); pluginsList.add(OverviewFragment.newInstance());
pluginsList.add(VirtualPumpFragment.newInstance()); pluginsList.add(VirtualPumpFragment.newInstance());
if (Config.LOOPENABLED)
pluginsList.add(LoopFragment.newInstance());
if (Config.LOWSUSPEDENABLED)
pluginsList.add(LowSuspendFragment.newInstance()); pluginsList.add(LowSuspendFragment.newInstance());
if (Config.OPENAPSMAENABLED)
pluginsList.add(OpenAPSMAFragment.newInstance()); pluginsList.add(OpenAPSMAFragment.newInstance());
pluginsList.add(NSProfileViewerFragment.newInstance()); pluginsList.add(NSProfileViewerFragment.newInstance());
pluginsList.add(SimpleProfileFragment.newInstance()); pluginsList.add(SimpleProfileFragment.newInstance());
pluginsList.add(TreatmentsFragment.newInstance()); pluginsList.add(TreatmentsFragment.newInstance());
pluginsList.add(TempBasalsFragment.newInstance()); pluginsList.add(TempBasalsFragment.newInstance());
pluginsList.add(SafetyFragment.newInstance());
pluginsList.add(ObjectivesFragment.newInstance()); pluginsList.add(ObjectivesFragment.newInstance());
pluginsList.add(configBuilderFragment = ConfigBuilderFragment.newInstance()); pluginsList.add(configBuilderFragment = ConfigBuilderFragment.newInstance());
toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar = (Toolbar) findViewById(R.id.toolbar);
@ -72,8 +80,8 @@ public class MainActivity extends AppCompatActivity {
registerBus(); registerBus();
configBuilderFragment.initialize(); configBuilderFragment.initialize();
setUpTabs(false);
} }
setUpTabs(false);
} }
@Subscribe @Subscribe
@ -103,7 +111,28 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId(); int id = item.getItemId();
switch (id) {
case R.id.nav_preferences: {
Intent i = new Intent(getApplicationContext(), PreferencesActivity.class);
startActivity(i);
break;
}
case R.id.nav_resetdb:
MainApp.getDbHelper().resetDatabases();
break;
case R.id.nav_exit:
log.debug("Exiting");
//chancelAlarmManager();
//MainApp.bus().post(new StopEvent());
MainApp.closeDbHelper();
finish();
System.runFinalization();
System.exit(0);
break;
}
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

View file

@ -0,0 +1,37 @@
package info.nightscout.androidaps;
import android.content.SharedPreferences;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import info.nightscout.androidaps.events.EventPreferenceChange;
public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
MainApp.bus().post(new EventPreferenceChange());
}
public static class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_treatments);
if (Config.OPENAPSMAENABLED)
addPreferencesFromResource(R.xml.pref_openapsma);
if (Config.LOWSUSPEDENABLED)
addPreferencesFromResource(R.xml.pref_lowsuspend);
}
}
}

View file

@ -136,6 +136,10 @@ public class DataService extends IntentService {
String profile = bundles.getString("profile"); String profile = bundles.getString("profile");
NSProfile nsProfile = new NSProfile(new JSONObject(profile), activeProfile); NSProfile nsProfile = new NSProfile(new JSONObject(profile), activeProfile);
EventNewBasalProfile event = new EventNewBasalProfile(nsProfile); EventNewBasalProfile event = new EventNewBasalProfile(nsProfile);
if (MainActivity.getConfigBuilder() == null) {
log.error("Config builder not ready on receive profile");
return;
}
PumpInterface pump = MainActivity.getConfigBuilder().getActivePump(); PumpInterface pump = MainActivity.getConfigBuilder().getActivePump();
if (pump != null) { if (pump != null) {
pump.setNewBasalProfile(nsProfile); pump.setNewBasalProfile(nsProfile);
@ -178,6 +182,7 @@ public class DataService extends IntentService {
stored._id = _id; stored._id = _id;
MainApp.getDbHelper().getDaoTreatments().update(stored); MainApp.getDbHelper().getDaoTreatments().update(stored);
} }
MainApp.bus().post(new EventTreatmentChange());
return; return;
} else { } else {
if (Config.logIncommingData) if (Config.logIncommingData)
@ -192,10 +197,10 @@ public class DataService extends IntentService {
MainApp.getDbHelper().getDaoTreatments().create(treatment); MainApp.getDbHelper().getDaoTreatments().create(treatment);
if (Config.logIncommingData) if (Config.logIncommingData)
log.debug("ADD: Stored treatment: " + treatment.log()); log.debug("ADD: Stored treatment: " + treatment.log());
MainApp.bus().post(new EventTreatmentChange());
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
MainApp.bus().post(new EventTreatmentChange());
} }
} catch (JSONException e) { } catch (JSONException e) {
@ -251,10 +256,10 @@ public class DataService extends IntentService {
MainApp.getDbHelper().getDaoTreatments().create(treatment); MainApp.getDbHelper().getDaoTreatments().create(treatment);
if (Config.logIncommingData) if (Config.logIncommingData)
log.debug("CHANGE: Stored treatment: " + treatment.log()); log.debug("CHANGE: Stored treatment: " + treatment.log());
MainApp.bus().post(new EventTreatmentChange());
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
MainApp.bus().post(new EventTreatmentChange());
} }
} catch (JSONException e) { } catch (JSONException e) {

View file

@ -1,6 +1,9 @@
package info.nightscout.androidaps.data; package info.nightscout.androidaps.data;
public class Result extends Object { import android.os.Parcel;
import android.os.Parcelable;
public class Result extends Object implements Parcelable{
public boolean success = false; public boolean success = false;
public boolean enacted = false; public boolean enacted = false;
public String comment = ""; public String comment = "";
@ -13,4 +16,52 @@ public class Result extends Object {
public String log() { public String log() {
return "Success: " + success + " Enacted: " + enacted + " Comment: " + comment + " Duration: " + duration + " Absolute: " + absolute + " Percent: " + percent; return "Success: " + success + " Enacted: " + enacted + " Comment: " + comment + " Duration: " + duration + " Absolute: " + absolute + " Percent: " + percent;
} }
public String toString() {
String ret = "Success: " + success;
if (enacted) {
ret += "\nEnacted: " + enacted + "\nComment: " + comment + "\nDuration: " + duration + " min\nAbsolute: " + absolute + " U/h";
} else {
ret += "\nComment: " + comment;
}
return ret;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(success ? 1 : 0);
dest.writeInt(enacted ? 1 : 0);
dest.writeString(comment);
dest.writeInt(duration);
dest.writeDouble(absolute);
dest.writeInt(percent);
}
public final Parcelable.Creator<Result> CREATOR = new Parcelable.Creator<Result>() {
public Result createFromParcel(Parcel in) {
return new Result(in);
}
public Result[] newArray(int size) {
return new Result[size];
}
};
protected Result(Parcel in) {
success = in.readInt() == 1 ? true : false;
enacted = in.readInt() == 1 ? true : false;
duration = in.readInt();
comment = in.readString();
absolute = in.readDouble();
percent = in.readInt();
}
public Result() {}
} }

View file

@ -23,8 +23,12 @@ import com.j256.ormlite.table.TableUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.events.EventTreatmentChange;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static Logger log = LoggerFactory.getLogger(DatabaseHelper.class); private static Logger log = LoggerFactory.getLogger(DatabaseHelper.class);
@ -82,6 +86,9 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
TableUtils.createTableIfNotExists(connectionSource, TempBasal.class); TableUtils.createTableIfNotExists(connectionSource, TempBasal.class);
TableUtils.createTableIfNotExists(connectionSource, Treatment.class); TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
TableUtils.createTableIfNotExists(connectionSource, BgReading.class); TableUtils.createTableIfNotExists(connectionSource, BgReading.class);
MainApp.bus().post(new EventNewBG());
MainApp.bus().post(new EventTreatmentChange());
MainApp.bus().post(new EventTempBasalChange());
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -214,6 +221,12 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} }
public GlucoseStatus() {} public GlucoseStatus() {}
public GlucoseStatus(Double glucose, Double delta, Double avgdelta) {
this.glucose = glucose;
this.delta = delta;
this.avgdelta = avgdelta;
}
} }
@Nullable @Nullable
@ -232,8 +245,12 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
int sizeRecords = bgReadings.size(); int sizeRecords = bgReadings.size();
if (sizeRecords < 4 || bgReadings.get(sizeRecords - 4).timestamp < new Date().getTime() - 7 * 60 * 1000l) if (sizeRecords < 4 || bgReadings.get(sizeRecords - 4).timestamp < new Date().getTime() - 7 * 60 * 1000l) {
if (Config.fakeGlucoseData) {
return new GlucoseStatus(Math.random() * 400, (Math. random() - 0.5)* 18, (Math. random() - 0.5)* 18);
}
return null; return null;
}
int minutes = 5; int minutes = 5;
double change; double change;

View file

@ -6,6 +6,9 @@ import com.j256.ormlite.table.DatabaseTable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
@ -183,8 +186,7 @@ public class TempBasal {
return (remainingMin < 0) ? 0 : (int) remainingMin; return (remainingMin < 0) ? 0 : (int) remainingMin;
} }
@Override public String log() {
public String toString() {
return "TempBasal{" + return "TempBasal{" +
"timeIndex=" + timeIndex + "timeIndex=" + timeIndex +
", timeStart=" + timeStart + ", timeStart=" + timeStart +
@ -196,4 +198,20 @@ public class TempBasal {
", isExtended=" + isExtended + ", isExtended=" + isExtended +
'}'; '}';
} }
public String toString() {
DateFormat formatDateToJustTime = new SimpleDateFormat("HH:mm");
DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00");
if (isAbsolute) {
return formatNumber2decimalplaces.format(absolute) + "U/h @" +
formatDateToJustTime.format(timeStart) +
" " + getRealDuration() + "/" + duration + "min";
} else { // percent
return percent + "% @" +
formatDateToJustTime.format(timeStart) +
" " + getRealDuration() + "/" + duration + "min";
}
}
} }

View file

@ -0,0 +1,7 @@
package info.nightscout.androidaps.events;
/**
* Created by mike on 19.06.2016.
*/
public class EventPreferenceChange {
}

View file

@ -1,7 +1,13 @@
package info.nightscout.androidaps.interfaces; package info.nightscout.androidaps.interfaces;
import info.nightscout.androidaps.plugins.APSResult;
/** /**
* Created by mike on 15.06.2016. * Created by mike on 15.06.2016.
*/ */
public interface ConstrainsInterface { public interface ConstrainsInterface {
boolean isAutomaticProcessingEnabled();
boolean manualConfirmationNeeded();
APSResult applyBasalConstrains(APSResult result);
} }

View file

@ -13,6 +13,7 @@ public interface PluginBase {
int APS = 5; int APS = 5;
int PUMP = 6; int PUMP = 6;
int CONSTRAINS = 7; int CONSTRAINS = 7;
int LOOP = 8;
public int getType(); public int getType();

View file

@ -3,6 +3,8 @@ package info.nightscout.androidaps.interfaces;
import org.json.JSONObject; import org.json.JSONObject;
import info.nightscout.androidaps.data.Result; import info.nightscout.androidaps.data.Result;
import info.nightscout.androidaps.db.TempBasal;
import info.nightscout.androidaps.plugins.APSResult;
import info.nightscout.client.data.NSProfile; import info.nightscout.client.data.NSProfile;
/** /**
@ -22,6 +24,7 @@ public interface PumpInterface {
double getBaseBasalRate(); // base basal rate, not temp basal double getBaseBasalRate(); // base basal rate, not temp basal
double getTempBasalAbsoluteRate(); double getTempBasalAbsoluteRate();
double getTempBasalRemainingMinutes(); double getTempBasalRemainingMinutes();
TempBasal getTempBasal();
Result deliverTreatment(Double insulin, Double carbs); Result deliverTreatment(Double insulin, Double carbs);
Result setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes); Result setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes);
@ -29,6 +32,7 @@ public interface PumpInterface {
Result setExtendedBolus(Double insulin, Integer durationInMinutes); Result setExtendedBolus(Double insulin, Integer durationInMinutes);
Result cancelTempBasal(); Result cancelTempBasal();
Result cancelExtendedBolus(); Result cancelExtendedBolus();
Result applyAPSRequest(APSResult request);
// Status to be passed to NS // Status to be passed to NS
JSONObject getJSONStatus(); JSONObject getJSONStatus();

View file

@ -6,6 +6,6 @@ import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
* Created by mike on 14.06.2016. * Created by mike on 14.06.2016.
*/ */
public interface TempBasalsInterface { public interface TempBasalsInterface {
void updateTotalIOBIfNeeded(); void updateTotalIOB();
IobTotal getLastCalculation(); IobTotal getLastCalculation();
} }

View file

@ -7,7 +7,8 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
* Created by mike on 14.06.2016. * Created by mike on 14.06.2016.
*/ */
public interface TreatmentsInterface { public interface TreatmentsInterface {
void updateTotalIOBIfNeeded();
void updateTotalIOB();
IobTotal getLastCalculation(); IobTotal getLastCalculation();
TreatmentsFragment.MealData getMealData(); TreatmentsFragment.MealData getMealData();
} }

View file

@ -57,7 +57,7 @@ public class APSResult implements Parcelable {
} }
}; };
private APSResult(Parcel in) { protected APSResult(Parcel in) {
reason = in.readString(); reason = in.readString();
rate = in.readDouble(); rate = in.readDouble();
duration = in.readInt(); duration = in.readInt();
@ -66,4 +66,13 @@ public class APSResult implements Parcelable {
public APSResult() {} public APSResult() {}
public APSResult clone() {
APSResult newResult = new APSResult();
newResult.reason = new String(reason);
newResult.rate = rate;
newResult.duration = duration;
newResult.changeRequested = changeRequested;
return newResult;
}
} }

View file

@ -2,8 +2,11 @@ package info.nightscout.androidaps.plugins.ConfigBuilder;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.ResolveInfo;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -22,24 +25,33 @@ import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.Services.Intents;
import info.nightscout.androidaps.data.Result; import info.nightscout.androidaps.data.Result;
import info.nightscout.androidaps.db.TempBasal; import info.nightscout.androidaps.db.TempBasal;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.ConstrainsInterface; import info.nightscout.androidaps.interfaces.ConstrainsInterface;
import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.ProfileInterface;
import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TempBasalsInterface;
import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface;
import info.nightscout.androidaps.plugins.APSResult;
import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment; import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
import info.nightscout.client.data.NSProfile; import info.nightscout.client.data.NSProfile;
import info.nightscout.utils.DateUtil;
public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpInterface, ConstrainsInterface { public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpInterface, ConstrainsInterface {
private static Logger log = LoggerFactory.getLogger(ConfigBuilderFragment.class); private static Logger log = LoggerFactory.getLogger(ConfigBuilderFragment.class);
@ -47,6 +59,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
private static final String PREFS_NAME = "Settings"; private static final String PREFS_NAME = "Settings";
ListView pumpListView; ListView pumpListView;
ListView loopListView;
ListView treatmentsListView; ListView treatmentsListView;
ListView tempsListView; ListView tempsListView;
ListView profileListView; ListView profileListView;
@ -55,6 +68,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
ListView generalListView; ListView generalListView;
PluginCustomAdapter pumpDataAdapter = null; PluginCustomAdapter pumpDataAdapter = null;
PluginCustomAdapter loopDataAdapter = null;
PluginCustomAdapter treatmentsDataAdapter = null; PluginCustomAdapter treatmentsDataAdapter = null;
PluginCustomAdapter tempsDataAdapter = null; PluginCustomAdapter tempsDataAdapter = null;
PluginCustomAdapter profileDataAdapter = null; PluginCustomAdapter profileDataAdapter = null;
@ -99,6 +113,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
Bundle savedInstanceState) { Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.configbuilder_fragment, container, false); View view = inflater.inflate(R.layout.configbuilder_fragment, container, false);
pumpListView = (ListView) view.findViewById(R.id.configbuilder_pumplistview); pumpListView = (ListView) view.findViewById(R.id.configbuilder_pumplistview);
loopListView = (ListView) view.findViewById(R.id.configbuilder_looplistview);
treatmentsListView = (ListView) view.findViewById(R.id.configbuilder_treatmentslistview); treatmentsListView = (ListView) view.findViewById(R.id.configbuilder_treatmentslistview);
tempsListView = (ListView) view.findViewById(R.id.configbuilder_tempslistview); tempsListView = (ListView) view.findViewById(R.id.configbuilder_tempslistview);
profileListView = (ListView) view.findViewById(R.id.configbuilder_profilelistview); profileListView = (ListView) view.findViewById(R.id.configbuilder_profilelistview);
@ -114,6 +129,9 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
pumpDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainActivity.getSpecificPluginsList(PluginBase.PUMP)); pumpDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainActivity.getSpecificPluginsList(PluginBase.PUMP));
pumpListView.setAdapter(pumpDataAdapter); pumpListView.setAdapter(pumpDataAdapter);
setListViewHeightBasedOnChildren(pumpListView); setListViewHeightBasedOnChildren(pumpListView);
loopDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainActivity.getSpecificPluginsList(PluginBase.LOOP));
loopListView.setAdapter(loopDataAdapter);
setListViewHeightBasedOnChildren(loopListView);
treatmentsDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainActivity.getSpecificPluginsList(PluginBase.TREATMENT)); treatmentsDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainActivity.getSpecificPluginsList(PluginBase.TREATMENT));
treatmentsListView.setAdapter(treatmentsDataAdapter); treatmentsListView.setAdapter(treatmentsDataAdapter);
setListViewHeightBasedOnChildren(treatmentsListView); setListViewHeightBasedOnChildren(treatmentsListView);
@ -229,10 +247,40 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
return activePump.getTempBasalRemainingMinutes(); return activePump.getTempBasalRemainingMinutes();
} }
@Override
public TempBasal getTempBasal() {
return activePump.getTempBasal();
}
@Override @Override
public Result deliverTreatment(Double insulin, Double carbs) { public Result deliverTreatment(Double insulin, Double carbs) {
// TODO: constrains here SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
return activePump.deliverTreatment(insulin, carbs); Double maxbolus = Double.parseDouble(SP.getString("treatmentssafety_maxbolus", "3"));
Double maxcarbs = Double.parseDouble(SP.getString("treatmentssafety_maxcarbs", "48"));
if (insulin > maxbolus || carbs > maxcarbs) {
Result failResult = new Result();
failResult.success = false;
failResult.comment = MainApp.instance().getString(R.string.constrains_violation);
return failResult;
}
Result result = activePump.deliverTreatment(insulin, carbs);
if (result.success) {
Treatment t = new Treatment();
t.insulin = result.bolusDelivered;
t.carbs = carbs;
t.created_at = new Date();
try {
MainApp.instance().getDbHelper().getDaoTreatments().create(t);
} catch (SQLException e) {
e.printStackTrace();
}
t.setTimeIndex(t.getTimeIndex());
t.sendToNSClient();
MainApp.bus().post(new EventTreatmentChange());
}
return result;
} }
@Override @Override
@ -255,7 +303,10 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
@Override @Override
public Result cancelTempBasal() { public Result cancelTempBasal() {
return activePump.cancelTempBasal(); Result result = activePump.cancelTempBasal();
if (result.enacted)
uploadTempBasalEnd();
return result;
} }
@Override @Override
@ -263,6 +314,14 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
return activePump.cancelExtendedBolus(); return activePump.cancelExtendedBolus();
} }
@Override
public Result applyAPSRequest(APSResult request) {
Result result = activePump.applyAPSRequest(request);
if (result.enacted)
uploadTempBasalStart(result.absolute, result.duration);
return result;
}
@Override @Override
public JSONObject getJSONStatus() { public JSONObject getJSONStatus() {
return activePump.getJSONStatus(); return activePump.getJSONStatus();
@ -392,6 +451,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
// Single selection allowed // Single selection allowed
case PluginBase.PROFILE: case PluginBase.PROFILE:
case PluginBase.PUMP: case PluginBase.PUMP:
case PluginBase.LOOP:
case PluginBase.TEMPBASAL: case PluginBase.TEMPBASAL:
case PluginBase.TREATMENT: case PluginBase.TREATMENT:
boolean newSelection = changedPlugin.isEnabled(); boolean newSelection = changedPlugin.isEnabled();
@ -412,7 +472,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
} }
private void verifySelectionInCategories() { private void verifySelectionInCategories() {
for (int category : new int[]{PluginBase.GENERAL, PluginBase.APS, PluginBase.PROFILE, PluginBase.PUMP, PluginBase.TEMPBASAL, PluginBase.TREATMENT}) { for (int category : new int[]{PluginBase.GENERAL, PluginBase.APS, PluginBase.PROFILE, PluginBase.PUMP, PluginBase.LOOP, PluginBase.TEMPBASAL, PluginBase.TREATMENT}) {
ArrayList<PluginBase> pluginsInCategory = MainActivity.getSpecificPluginsList(category); ArrayList<PluginBase> pluginsInCategory = MainActivity.getSpecificPluginsList(category);
switch (category) { switch (category) {
// Multiple selection allowed // Multiple selection allowed
@ -441,6 +501,16 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
} }
} }
break; break;
case PluginBase.LOOP:
PluginBase loop = getTheOneEnabledInArray(pluginsInCategory);
if (Config.logConfigBuilder)
log.debug("Selected loop interface: " + loop.getName());
for (PluginBase p : pluginsInCategory) {
if (!p.getName().equals(loop.getName())) {
p.setFragmentVisible(false);
}
}
break;
case PluginBase.TEMPBASAL: case PluginBase.TEMPBASAL:
activeTempBasals = (TempBasalsInterface) getTheOneEnabledInArray(pluginsInCategory); activeTempBasals = (TempBasalsInterface) getTheOneEnabledInArray(pluginsInCategory);
if (Config.logConfigBuilder) if (Config.logConfigBuilder)
@ -535,4 +605,99 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params); listView.setLayoutParams(params);
} }
/**
* Constrains interface
**/
@Override
public boolean isAutomaticProcessingEnabled() {
boolean result = true;
ArrayList<PluginBase> constrainsPlugins = MainActivity.getSpecificPluginsList(PluginBase.CONSTRAINS);
for (PluginBase p : constrainsPlugins) {
ConstrainsInterface constrain = (ConstrainsInterface) p;
if (!p.isEnabled()) continue;
result = result && constrain.isAutomaticProcessingEnabled();
}
return result;
}
@Override
public boolean manualConfirmationNeeded() {
boolean result = false;
ArrayList<PluginBase> constrainsPlugins = MainActivity.getSpecificPluginsList(PluginBase.CONSTRAINS);
for (PluginBase p : constrainsPlugins) {
ConstrainsInterface constrain = (ConstrainsInterface) p;
if (!p.isEnabled()) continue;
result = result || constrain.manualConfirmationNeeded();
}
return result;
}
@Override
public APSResult applyBasalConstrains(APSResult result) {
ArrayList<PluginBase> constrainsPlugins = MainActivity.getSpecificPluginsList(PluginBase.CONSTRAINS);
for (PluginBase p : constrainsPlugins) {
ConstrainsInterface constrain = (ConstrainsInterface) p;
if (!p.isEnabled()) continue;
constrain.applyBasalConstrains(result);
}
return result;
}
public static void uploadTempBasalStart(Double absolute, double durationInMinutes) {
try {
//SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
//boolean useAbsoluteForUpload = sp.getBoolean("ns_sync_use_absolute", false);
Context context = MainApp.instance().getApplicationContext();
JSONObject data = new JSONObject();
data.put("eventType", "Temp Basal");
data.put("duration", durationInMinutes);
//if (useAbsoluteForUpload && absolute != null)
data.put("absolute", absolute);
//else
// data.put("percent", percent - 100);
data.put("created_at", DateUtil.toISOString(new Date()));
data.put("enteredBy", MainApp.instance().getString(R.string.app_name));
Bundle bundle = new Bundle();
bundle.putString("action", "dbAdd");
bundle.putString("collection", "treatments");
bundle.putString("data", data.toString());
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(intent);
List<ResolveInfo> q = context.getPackageManager().queryBroadcastReceivers(intent, 0);
if (q.size() < 1) {
log.error("DBADD No receivers");
} else log.debug("DBADD dbAdd " + q.size() + " receivers " + data.toString());
} catch (JSONException e) {
}
}
public static void uploadTempBasalEnd() {
try {
Context context = MainApp.instance().getApplicationContext();
JSONObject data = new JSONObject();
data.put("eventType", "Temp Basal");
data.put("created_at", DateUtil.toISOString(new Date()));
data.put("enteredBy", MainApp.instance().getString(R.string.app_name));
Bundle bundle = new Bundle();
bundle.putString("action", "dbAdd");
bundle.putString("collection", "treatments");
bundle.putString("data", data.toString());
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(intent);
List<ResolveInfo> q = context.getPackageManager().queryBroadcastReceivers(intent, 0);
if (q.size() < 1) {
log.error("DBADD No receivers");
} else log.debug("DBADD dbAdd " + q.size() + " receivers " + data.toString());
} catch (JSONException e) {
}
}
} }

View file

@ -0,0 +1,326 @@
package info.nightscout.androidaps.plugins.Loop;
import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Date;
import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Result;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.ConstrainsInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.APSResult;
public class LoopFragment extends Fragment implements View.OnClickListener, PluginBase {
private static Logger log = LoggerFactory.getLogger(LoopFragment.class);
Button runNowButton;
TextView lastRunView;
TextView lastEnactView;
TextView sourceView;
TextView requestView;
TextView constrainsProcessedView;
TextView setByPumpView;
boolean confirmed;
class LastRun implements Parcelable {
public APSResult request = null;
public APSResult constrainsProcessed = null;
public Result setByPump = null;
public String source = null;
public Date lastAPSRun = null;
public Date lastEnact = null;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(request, 0);
dest.writeParcelable(constrainsProcessed, 0);
dest.writeParcelable(setByPump, 0);
dest.writeString(source);
dest.writeLong(lastAPSRun.getTime());
dest.writeLong(lastEnact.getTime());
}
public final Parcelable.Creator<LastRun> CREATOR = new Parcelable.Creator<LastRun>() {
public LastRun createFromParcel(Parcel in) {
return new LastRun(in);
}
public LastRun[] newArray(int size) {
return new LastRun[size];
}
};
private LastRun(Parcel in) {
request = in.readParcelable(APSResult.class.getClassLoader());
constrainsProcessed = in.readParcelable(APSResult.class.getClassLoader());
setByPump = in.readParcelable(Result.class.getClassLoader());
source = in.readString();
lastAPSRun = new Date(in.readLong());
lastEnact = new Date(in.readLong());
}
public LastRun() {
}
}
static LastRun lastRun = null;
private boolean fragmentEnabled = false;
private boolean fragmentVisible = true;
@Override
public int getType() {
return PluginBase.LOOP;
}
@Override
public String getName() {
return MainApp.instance().getString(R.string.loop);
}
@Override
public boolean isEnabled() {
return fragmentEnabled;
}
@Override
public boolean isVisibleInTabs() {
return fragmentVisible;
}
@Override
public boolean canBeHidden() {
return true;
}
@Override
public void setFragmentEnabled(boolean fragmentEnabled) {
this.fragmentEnabled = fragmentEnabled;
}
@Override
public void setFragmentVisible(boolean fragmentVisible) {
this.fragmentVisible = fragmentVisible;
}
public LoopFragment() {
super();
registerBus();
}
public static LoopFragment newInstance() {
LoopFragment fragment = new LoopFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.loop_fragment, container, false);
lastRunView = (TextView) view.findViewById(R.id.loop_lastrun);
lastEnactView = (TextView) view.findViewById(R.id.loop_lastenact);
sourceView = (TextView) view.findViewById(R.id.loop_source);
requestView = (TextView) view.findViewById(R.id.loop_request);
constrainsProcessedView = (TextView) view.findViewById(R.id.loop_constrainsprocessed);
setByPumpView = (TextView) view.findViewById(R.id.loop_setbypump);
runNowButton = (Button) view.findViewById(R.id.loop_run);
runNowButton.setOnClickListener(this);
if (savedInstanceState != null) {
lastRun = savedInstanceState.getParcelable("lastrun");
}
updateGUI();
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("lastrun", lastRun);
}
private void registerBus() {
try {
MainApp.bus().unregister(this);
} catch (RuntimeException x) {
// Ignore
}
MainApp.bus().register(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.loop_run:
invoke();
break;
}
}
@Subscribe
public void onStatusEvent(final EventTreatmentChange ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// invoke();
}
});
else
log.debug("EventTreatmentChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
ConstrainsInterface constrainsInterface = MainActivity.getConfigBuilder();
if (constrainsInterface.isAutomaticProcessingEnabled()) {
invoke();
updateGUI();
}
}
private void invoke() {
ConstrainsInterface constrainsInterface = MainActivity.getConfigBuilder();
PumpInterface pumpInterface = MainActivity.getConfigBuilder().getActivePump();
APSResult result = null;
if (constrainsInterface == null || pumpInterface == null || !isEnabled())
return;
APSInterface usedAPS = null;
ArrayList<PluginBase> apsPlugins = MainActivity.getSpecificPluginsList(PluginBase.APS);
for (PluginBase p : apsPlugins) {
APSInterface aps = (APSInterface) p;
if (!p.isEnabled()) continue;
aps.invoke();
result = aps.getLastAPSResult();
if (result == null) continue;
if (result.changeRequested) {
// APS plugin is requesting change, stop processing
usedAPS = aps;
break;
}
}
// Check if we have any result
if (result == null) {
clearGUI();
final Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
lastRunView.setText(activity.getString(R.string.noapsselected));
}
});
return;
}
confirmed = false;
if (constrainsInterface.manualConfirmationNeeded()) {
// TODO: user notification here
confirmed = true;
} else {
confirmed = true;
}
// check rate for constrais
APSResult resultAfterConstrains = result.clone();
if (result.changeRequested) {
constrainsInterface.applyBasalConstrains(resultAfterConstrains);
Result applyResult = pumpInterface.applyAPSRequest(resultAfterConstrains);
Date lastEnact = lastRun != null ? lastRun.lastEnact : new Date(0, 0, 0);
lastRun = new LastRun();
lastRun.request = result;
lastRun.constrainsProcessed = resultAfterConstrains;
lastRun.setByPump = applyResult;
lastRun.source = ((PluginBase) usedAPS).getName();
lastRun.lastAPSRun = new Date();
if (applyResult.enacted)
lastRun.lastEnact = lastRun.lastAPSRun;
else
lastRun.lastEnact = lastEnact;
} else {
if (lastRun == null) lastRun = new LastRun();
lastRun.request = result;
lastRun.constrainsProcessed = resultAfterConstrains;
lastRun.setByPump = null;
lastRun.source = null;
lastRun.lastAPSRun = new Date();
}
updateGUI();
}
void updateGUI() {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (lastRun != null) {
requestView.setText(lastRun.request != null ? lastRun.request.toString() : "");
constrainsProcessedView.setText(lastRun.constrainsProcessed != null ? lastRun.constrainsProcessed.toString() : "");
setByPumpView.setText(lastRun.setByPump != null ? lastRun.setByPump.toString() : "");
sourceView.setText(lastRun.source != null ? lastRun.source.toString() : "");
lastRunView.setText(lastRun.lastAPSRun != null && lastRun.lastAPSRun.getTime() != 0 ? lastRun.lastAPSRun.toLocaleString() : "");
lastEnactView.setText(lastRun.lastEnact!= null && lastRun.lastEnact.getTime() != 0 ? lastRun.lastEnact.toLocaleString() : "");
}
}
});
}
void clearGUI() {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
requestView.setText("");
constrainsProcessedView.setText("");
setByPumpView.setText("");
sourceView.setText("");
lastRunView.setText("");
lastEnactView.setText("");
}
});
}
}

View file

@ -13,8 +13,6 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -28,12 +26,22 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.plugins.APSResult; import info.nightscout.androidaps.plugins.APSResult;
import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.client.data.NSProfile; import info.nightscout.client.data.NSProfile;
/**
* LOW SUSPEND ALGORITHM
* <p/>
* Define projection as BG + 6 * avgdelta (estimated BG in 30 min)
* <p/>
* If BG is bellow low threshold and projection too: set basal rate to 0 U/h if low temp is not running
* else if projection is bellow low threshold: set basal rate to 0 U/h if low temp is not running
* else if exists low temp: cancel it
* else no change
*/
public class LowSuspendFragment extends Fragment implements View.OnClickListener, PluginBase, APSInterface { public class LowSuspendFragment extends Fragment implements View.OnClickListener, PluginBase, APSInterface {
private static Logger log = LoggerFactory.getLogger(LowSuspendFragment.class); private static Logger log = LoggerFactory.getLogger(LowSuspendFragment.class);
@ -90,7 +98,8 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
lastAPSResult = in.readParcelable(APSResult.class.getClassLoader()); lastAPSResult = in.readParcelable(APSResult.class.getClassLoader());
} }
public LastRun() {} public LastRun() {
}
} }
static LastRun lastRun = null; static LastRun lastRun = null;
@ -124,8 +133,8 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
} }
@Override @Override
public void setFragmentEnabled(boolean selected) { public void setFragmentEnabled(boolean fragmentEnabled) {
this.fragmentEnabled = selected; this.fragmentEnabled = fragmentEnabled;
} }
@Override @Override
@ -207,20 +216,6 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
} }
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
invoke();
}
});
else
log.debug("EventNewBG: Activity is null");
}
@Override @Override
public void invoke() { public void invoke() {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
@ -228,21 +223,31 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile(); NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile();
PumpInterface pump = MainActivity.getConfigBuilder().getActivePump(); PumpInterface pump = MainActivity.getConfigBuilder().getActivePump();
if (!isEnabled()) {
updateResultGUI(MainApp.instance().getString(R.string.openapsma_disabled));
if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_disabled));
return;
}
if (glucoseStatus == null) { if (glucoseStatus == null) {
resultView.setText(getString(R.string.openapsma_noglucosedata)); updateResultGUI(MainApp.instance().getString(R.string.openapsma_noglucosedata));
if (Config.logAPSResult) log.debug(getString(R.string.openapsma_noglucosedata)); if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata));
return; return;
} }
if (profile == null) { if (profile == null) {
resultView.setText(getString(R.string.openapsma_noprofile)); updateResultGUI(MainApp.instance().getString(R.string.openapsma_noprofile));
if (Config.logAPSResult) log.debug(getString(R.string.openapsma_noprofile)); if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_noprofile));
return; return;
} }
if (pump == null) { if (pump == null) {
resultView.setText(getString(R.string.openapsma_nopump)); updateResultGUI(MainApp.instance().getString(R.string.openapsma_nopump));
if (Config.logAPSResult) log.debug(getString(R.string.openapsma_nopump)); if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_nopump));
return; return;
} }
@ -251,7 +256,7 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
minBgDefault = "5"; minBgDefault = "5";
} }
double minBg = NSProfile.toMgdl(Double.parseDouble(SP.getString("min_bg", minBgDefault).replace(",", ".")), profile.getUnits()); double minBg = NSProfile.toMgdl(Double.parseDouble(SP.getString("lowsuspend_lowthreshold", minBgDefault).replace(",", ".")), profile.getUnits());
boolean lowProjected = (glucoseStatus.glucose + 6.0 * glucoseStatus.avgdelta) < minBg; boolean lowProjected = (glucoseStatus.glucose + 6.0 * glucoseStatus.avgdelta) < minBg;
boolean low = glucoseStatus.glucose < minBg; boolean low = glucoseStatus.glucose < minBg;
@ -267,29 +272,29 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
request.changeRequested = true; request.changeRequested = true;
request.rate = 0d; request.rate = 0d;
request.duration = 30; request.duration = 30;
request.reason = getString(R.string.lowsuspend_lowmessage); request.reason = MainApp.instance().getString(R.string.lowsuspend_lowmessage);
} else { } else {
request.changeRequested = false; request.changeRequested = false;
request.reason = getString(R.string.nochangerequested); request.reason = MainApp.instance().getString(R.string.nochangerequested);
} }
} else if (lowProjected) { } else if (lowProjected) {
if (!isTempBasalInProgress || tempBasalRate != 0d) { if (!isTempBasalInProgress || tempBasalRate != 0d) {
request.changeRequested = true; request.changeRequested = true;
request.rate = 0d; request.rate = 0d;
request.duration = 30; request.duration = 30;
request.reason = getString(R.string.lowsuspend_lowprojectedmessage); request.reason = MainApp.instance().getString(R.string.lowsuspend_lowprojectedmessage);
} else { } else {
request.changeRequested = false; request.changeRequested = false;
request.reason = getString(R.string.nochangerequested); request.reason = MainApp.instance().getString(R.string.nochangerequested);
} }
} else if (tempBasalRate == 0d) { } else if (isTempBasalInProgress && tempBasalRate == 0d) {
request.changeRequested = true; request.changeRequested = true;
request.rate = baseBasalRate; request.rate = baseBasalRate;
request.duration = 30; request.duration = 30;
request.reason = getString(R.string.lowsuspend_cancelmessage); request.reason = MainApp.instance().getString(R.string.lowsuspend_cancelmessage);
} else { } else {
request.changeRequested = false; request.changeRequested = false;
request.reason = getString(R.string.nochangerequested); request.reason = MainApp.instance().getString(R.string.nochangerequested);
} }
lastRun = new LastRun(); lastRun = new LastRun();
@ -304,6 +309,11 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
} }
void updateGUI() { void updateGUI() {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (lastRun != null) { if (lastRun != null) {
DecimalFormat formatNumber1decimalplaces = new DecimalFormat("0.0"); DecimalFormat formatNumber1decimalplaces = new DecimalFormat("0.0");
glucoseStatusView.setText(lastRun.lastGlucoseStatus.toString()); glucoseStatusView.setText(lastRun.lastGlucoseStatus.toString());
@ -313,4 +323,23 @@ public class LowSuspendFragment extends Fragment implements View.OnClickListener
lastRunView.setText(lastRun.lastAPSRun.toLocaleString()); lastRunView.setText(lastRun.lastAPSRun.toLocaleString());
} }
} }
});
else
log.debug("EventNewBG: Activity is null");
}
void updateResultGUI(final String text) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
resultView.setText(text);
glucoseStatusView.setText("");
minBgView.setText("");
requestView.setText("");
lastRunView.setText("");
}
});
}
} }

View file

@ -1,25 +0,0 @@
package info.nightscout.androidaps.plugins.LowSuspend;
import org.json.JSONException;
import org.json.JSONObject;
public class LowSuspendResult {
public boolean lowProjected;
public boolean low;
public String reason;
public int percent;
public JSONObject json() {
JSONObject json = new JSONObject();
try {
json.put("low", low);
json.put("lowProjected", lowProjected);
json.put("reason", reason);
json.put("percent", percent);
} catch (JSONException e) {
e.printStackTrace();
}
return json;
}
}

View file

@ -27,6 +27,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.ConstrainsInterface; import info.nightscout.androidaps.interfaces.ConstrainsInterface;
import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.plugins.APSResult;
public class ObjectivesFragment extends Fragment implements View.OnClickListener, PluginBase, ConstrainsInterface { public class ObjectivesFragment extends Fragment implements View.OnClickListener, PluginBase, ConstrainsInterface {
private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class); private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class);
@ -312,4 +313,22 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
} }
/**
* Constrains interface
**/
@Override
public boolean isAutomaticProcessingEnabled() {
return objectives.get(3).started.getTime() > 0;
}
@Override
public boolean manualConfirmationNeeded() {
return objectives.get(3).started.getTime() < 0;
}
@Override
public APSResult applyBasalConstrains(APSResult result) {
return result;
}
} }

View file

@ -1,7 +1,11 @@
package info.nightscout.androidaps.plugins.OpenAPSMA; package info.nightscout.androidaps.plugins.OpenAPSMA;
import android.os.Parcel;
import android.os.Parcelable;
import com.eclipsesource.v8.V8Object; import com.eclipsesource.v8.V8Object;
import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import info.nightscout.androidaps.plugins.APSResult; import info.nightscout.androidaps.plugins.APSResult;
@ -9,9 +13,9 @@ import info.nightscout.androidaps.plugins.APSResult;
public class DetermineBasalResult extends APSResult { public class DetermineBasalResult extends APSResult {
public JSONObject json = new JSONObject(); public JSONObject json = new JSONObject();
public final double eventualBG; public double eventualBG;
public final double snoozeBG; public double snoozeBG;
public final String mealAssist; public String mealAssist;
public DetermineBasalResult(V8Object result, JSONObject j) { public DetermineBasalResult(V8Object result, JSONObject j) {
json = j; json = j;
@ -39,4 +43,55 @@ public class DetermineBasalResult extends APSResult {
result.release(); result.release();
} }
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(json.toString());
dest.writeDouble(eventualBG);
dest.writeDouble(snoozeBG);
dest.writeString(mealAssist);
}
public final Parcelable.Creator<DetermineBasalResult> CREATOR = new Parcelable.Creator<DetermineBasalResult>() {
public DetermineBasalResult createFromParcel(Parcel in) {
return new DetermineBasalResult(in);
}
public DetermineBasalResult[] newArray(int size) {
return new DetermineBasalResult[size];
}
};
private DetermineBasalResult(Parcel in) {
super(in);
try {
json = new JSONObject(in.readString());
} catch (JSONException e) {
e.printStackTrace();
}
eventualBG = in.readDouble();
snoozeBG = in.readDouble();
mealAssist = in.readString();
}
public DetermineBasalResult() {}
@Override
public DetermineBasalResult clone() {
DetermineBasalResult newResult = new DetermineBasalResult();
newResult.rate = rate;
newResult.duration = duration;
newResult.changeRequested = changeRequested;
try {
newResult.json = new JSONObject(json.toString());
} catch (JSONException e) {
e.printStackTrace();
}
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
newResult.mealAssist = new String(mealAssist);
return newResult;
}
} }

View file

@ -13,8 +13,6 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import com.squareup.otto.Subscribe;
import org.json.JSONException; import org.json.JSONException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -27,11 +25,8 @@ import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.TempBasal;
import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TempBasalsInterface;
import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface;
@ -73,6 +68,7 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
dest.writeLong(lastAPSRun.getTime()); dest.writeLong(lastAPSRun.getTime());
dest.writeParcelable(lastAPSResult, 0); dest.writeParcelable(lastAPSResult, 0);
} }
public final Parcelable.Creator<LastRun> CREATOR = new Parcelable.Creator<LastRun>() { public final Parcelable.Creator<LastRun> CREATOR = new Parcelable.Creator<LastRun>() {
public LastRun createFromParcel(Parcel in) { public LastRun createFromParcel(Parcel in) {
return new LastRun(in); return new LastRun(in);
@ -90,7 +86,8 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
lastAPSResult = in.readParcelable(APSResult.class.getClassLoader()); lastAPSResult = in.readParcelable(APSResult.class.getClassLoader());
} }
public LastRun() {} public LastRun() {
}
} }
LastRun lastRun = null; LastRun lastRun = null;
@ -140,6 +137,7 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
@Override @Override
public APSResult getLastAPSResult() { public APSResult getLastAPSResult() {
if (lastRun == null) return null;
return lastRun.lastAPSResult; return lastRun.lastAPSResult;
} }
@ -206,34 +204,6 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
} }
@Subscribe
public void onStatusEvent(final EventTreatmentChange ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
invoke();
}
});
else
log.debug("EventTreatmentChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
invoke();
}
});
else
log.debug("EventNewBG: Activity is null");
}
@Override @Override
public void invoke() { public void invoke() {
DetermineBasalAdapterJS determineBasalAdapterJS = null; DetermineBasalAdapterJS determineBasalAdapterJS = null;
@ -248,21 +218,31 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile(); NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile();
PumpInterface pump = MainActivity.getConfigBuilder().getActivePump(); PumpInterface pump = MainActivity.getConfigBuilder().getActivePump();
if (!isEnabled()) {
updateResultGUI(MainApp.instance().getString(R.string.openapsma_disabled));
if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_disabled));
return;
}
if (glucoseStatus == null) { if (glucoseStatus == null) {
resultView.setText(getString(R.string.openapsma_noglucosedata)); updateResultGUI(MainApp.instance().getString(R.string.openapsma_noglucosedata));
if (Config.logAPSResult) log.debug(getString(R.string.openapsma_noglucosedata)); if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata));
return; return;
} }
if (profile == null) { if (profile == null) {
resultView.setText(getString(R.string.openapsma_noprofile)); updateResultGUI(MainApp.instance().getString(R.string.openapsma_noprofile));
if (Config.logAPSResult) log.debug(getString(R.string.openapsma_noprofile)); if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_noprofile));
return; return;
} }
if (pump == null) { if (pump == null) {
resultView.setText(getString(R.string.openapsma_nopump)); updateResultGUI(getString(R.string.openapsma_nopump));
if (Config.logAPSResult) log.debug(getString(R.string.openapsma_nopump)); if (Config.logAPSResult)
log.debug(MainApp.instance().getString(R.string.openapsma_nopump));
return; return;
} }
@ -278,17 +258,15 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
Date now = new Date(); Date now = new Date();
// TODO: objectives limits double maxIob = Double.parseDouble(SP.getString("openapsma_max_iob", "1.5").replace(",", "."));
double maxIob = Double.parseDouble(SP.getString("max_iob", "1.5").replace(",", ".")); double maxBasal = Double.parseDouble(SP.getString("openapsma_max_basal", "1").replace(",", "."));
double maxBasal = Double.parseDouble(SP.getString("max_basal", "1").replace(",", ".")); double minBg = NSProfile.toMgdl(Double.parseDouble(SP.getString("openapsma_min_bg", minBgDefault).replace(",", ".")), units);
// TODO: min_bg, max_bg in prefs double maxBg = NSProfile.toMgdl(Double.parseDouble(SP.getString("openapsma_max_bg", maxBgDefault).replace(",", ".")), units);
double minBg = NSProfile.toMgdl(Double.parseDouble(SP.getString("min_bg", minBgDefault).replace(",", ".")), units);
double maxBg = NSProfile.toMgdl(Double.parseDouble(SP.getString("max_bg", maxBgDefault).replace(",", ".")), units);
TreatmentsInterface treatments = MainActivity.getConfigBuilder().getActiveTreatments(); TreatmentsInterface treatments = MainActivity.getConfigBuilder().getActiveTreatments();
TempBasalsInterface tempBasals = MainActivity.getConfigBuilder().getActiveTempBasals(); TempBasalsInterface tempBasals = MainActivity.getConfigBuilder().getActiveTempBasals();
treatments.updateTotalIOBIfNeeded(); treatments.updateTotalIOB();
tempBasals.updateTotalIOBIfNeeded(); tempBasals.updateTotalIOB();
IobTotal bolusIob = treatments.getLastCalculation(); IobTotal bolusIob = treatments.getLastCalculation();
IobTotal basalIob = tempBasals.getLastCalculation(); IobTotal basalIob = tempBasals.getLastCalculation();
@ -319,6 +297,11 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
} }
void updateGUI() { void updateGUI() {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (lastRun != null) { if (lastRun != null) {
glucoseStatusView.setText(lastRun.lastDetermineBasalAdapterJS.getGlucoseStatusParam()); glucoseStatusView.setText(lastRun.lastDetermineBasalAdapterJS.getGlucoseStatusParam());
currentTempView.setText(lastRun.lastDetermineBasalAdapterJS.getCurrentTempParam()); currentTempView.setText(lastRun.lastDetermineBasalAdapterJS.getCurrentTempParam());
@ -329,6 +312,25 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
requestView.setText(lastRun.lastAPSResult.toString()); requestView.setText(lastRun.lastAPSResult.toString());
lastRunView.setText(lastRun.lastAPSRun.toLocaleString()); lastRunView.setText(lastRun.lastAPSRun.toLocaleString());
} }
}
});
}
void updateResultGUI(final String text) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
resultView.setText(text);
glucoseStatusView.setText("");
currentTempView.setText("");
iobDataView.setText("");
profileView.setText("");
mealDataView.setText("");
requestView.setText("");
lastRunView.setText("");
}
});
} }
} }

View file

@ -1,10 +1,12 @@
package info.nightscout.androidaps.plugins.Treatments.Dialogs; package info.nightscout.androidaps.plugins.Overview.Dialogs;
import android.app.Activity; import android.content.DialogInterface;
import android.app.DialogFragment; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.*; import android.view.*;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.Button;
@ -13,6 +15,8 @@ import android.widget.TextView;
import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.Services.Intents;
import info.nightscout.androidaps.data.Result;
public class NewTreatmentDialogFragment extends DialogFragment implements OnClickListener { public class NewTreatmentDialogFragment extends DialogFragment implements OnClickListener {
@ -41,8 +45,8 @@ public class NewTreatmentDialogFragment extends DialogFragment implements OnClic
switch (view.getId()) { switch (view.getId()) {
case R.id.treatments_newtreatment_deliverbutton: case R.id.treatments_newtreatment_deliverbutton:
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
Double maxbolus = Double.parseDouble(SP.getString("safety_maxbolus", "3")); Double maxbolus = Double.parseDouble(SP.getString("treatmentssafety_maxbolus", "3"));
Double maxcarbs = Double.parseDouble(SP.getString("safety_maxcarbs", "48")); Double maxcarbs = Double.parseDouble(SP.getString("treatmentssafety_maxcarbs", "48"));
String insulinText = this.insulin.getText().toString().replace(",", "."); String insulinText = this.insulin.getText().toString().replace(",", ".");
@ -55,7 +59,15 @@ public class NewTreatmentDialogFragment extends DialogFragment implements OnClic
this.carbs.setText(""); this.carbs.setText("");
} else if (insulin > 0d || carbs > 0d) { } else if (insulin > 0d || carbs > 0d) {
dismiss(); dismiss();
MainActivity.getConfigBuilder().getActivePump().deliverTreatment(insulin, carbs); Result result = MainActivity.getConfigBuilder().getActivePump().deliverTreatment(insulin, carbs);
if (!result.success) {
AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
builder.setTitle(this.getContext().getString(R.string.bolusdeliveryerror));
builder.setMessage(result.comment);
builder.setPositiveButton(this.getContext().getString(R.string.ok), null);
builder.show();
}
} }
break; break;
} }

View file

@ -1,10 +1,9 @@
package info.nightscout.androidaps.plugins.Treatments.Dialogs; package info.nightscout.androidaps.plugins.Overview.Dialogs;
import android.app.Activity;
import android.app.DialogFragment;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.*; import android.view.*;
@ -15,19 +14,15 @@ import android.widget.CompoundButton;
import android.widget.TextView; import android.widget.TextView;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Date;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Iob;
import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TempBasalsInterface;
import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface;
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal; import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
import info.nightscout.client.data.NSProfile; import info.nightscout.client.data.NSProfile;
import info.nightscout.utils.*; import info.nightscout.utils.*;
@ -123,8 +118,6 @@ public class WizardDialogFragment extends DialogFragment implements OnClickListe
} }
private void initDialog() { private void initDialog() {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
String units = SP.getString("ns_units", Constants.MGDL);
NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile(); NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile();
if (profile == null) { if (profile == null) {
@ -133,6 +126,7 @@ public class WizardDialogFragment extends DialogFragment implements OnClickListe
return; return;
} }
String units = profile.getUnits();
bgUnits.setText(units); bgUnits.setText(units);
// Set BG if not old // Set BG if not old
@ -162,8 +156,8 @@ public class WizardDialogFragment extends DialogFragment implements OnClickListe
// IOB calculation // IOB calculation
TreatmentsInterface treatments = MainActivity.getConfigBuilder().getActiveTreatments(); TreatmentsInterface treatments = MainActivity.getConfigBuilder().getActiveTreatments();
TempBasalsInterface tempBasals = MainActivity.getConfigBuilder().getActiveTempBasals(); TempBasalsInterface tempBasals = MainActivity.getConfigBuilder().getActiveTempBasals();
treatments.updateTotalIOBIfNeeded(); treatments.updateTotalIOB();
tempBasals.updateTotalIOBIfNeeded(); tempBasals.updateTotalIOB();
IobTotal bolusIob = treatments.getLastCalculation(); IobTotal bolusIob = treatments.getLastCalculation();
IobTotal basalIob = tempBasals.getLastCalculation(); IobTotal basalIob = tempBasals.getLastCalculation();
@ -177,9 +171,8 @@ public class WizardDialogFragment extends DialogFragment implements OnClickListe
private void calculateInsulin() { private void calculateInsulin() {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
Double maxbolus = Double.parseDouble(SP.getString("safety_maxbolus", "3")); Double maxbolus = Double.parseDouble(SP.getString("treatmentssafety_maxbolus", "3"));
Double maxcarbs = Double.parseDouble(SP.getString("safety_maxcarbs", "48")); Double maxcarbs = Double.parseDouble(SP.getString("treatmentssafety_maxcarbs", "48"));
String units = SP.getString("ns_units", Constants.MGDL);
NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile(); NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile();
@ -229,8 +222,8 @@ public class WizardDialogFragment extends DialogFragment implements OnClickListe
// Insulin from IOB // Insulin from IOB
TreatmentsInterface treatments = MainActivity.getConfigBuilder().getActiveTreatments(); TreatmentsInterface treatments = MainActivity.getConfigBuilder().getActiveTreatments();
TempBasalsInterface tempBasals = MainActivity.getConfigBuilder().getActiveTempBasals(); TempBasalsInterface tempBasals = MainActivity.getConfigBuilder().getActiveTempBasals();
treatments.updateTotalIOBIfNeeded(); treatments.updateTotalIOB();
tempBasals.updateTotalIOBIfNeeded(); tempBasals.updateTotalIOB();
IobTotal bolusIob = treatments.getLastCalculation(); IobTotal bolusIob = treatments.getLastCalculation();
IobTotal basalIob = tempBasals.getLastCalculation(); IobTotal basalIob = tempBasals.getLastCalculation();
@ -268,11 +261,6 @@ public class WizardDialogFragment extends DialogFragment implements OnClickListe
} }
} }
private double fromMgdl(Double value, String units) {
if (units.equals(Constants.MGDL)) return value;
else return value / 18;
}
private Double roundTo(Double x, Double step) { private Double roundTo(Double x, Double step) {
if (x != 0d) { if (x != 0d) {
return Math.round(x / step) * step; return Math.round(x / step) * step;

View file

@ -6,9 +6,12 @@ import android.graphics.Paint;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.jjoe64.graphview.GraphView; import com.jjoe64.graphview.GraphView;
@ -32,9 +35,13 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.TempBasal;
import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialogFragment;
import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialogFragment;
import info.nightscout.client.data.NSProfile; import info.nightscout.client.data.NSProfile;
@ -46,6 +53,10 @@ public class OverviewFragment extends Fragment implements PluginBase {
TextView deltaView; TextView deltaView;
GraphView bgGraph; GraphView bgGraph;
Button cancelTempButton;
Button treatmentButton;
Button wizardButton;
boolean visibleNow = false; boolean visibleNow = false;
Handler loopHandler = new Handler(); Handler loopHandler = new Handler();
Runnable refreshLoop = null; Runnable refreshLoop = null;
@ -108,7 +119,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
updateData(); updateGUI();
} }
}); });
} }
@ -127,8 +138,39 @@ public class OverviewFragment extends Fragment implements PluginBase {
timeAgoView = (TextView) view.findViewById(R.id.overview_timeago); timeAgoView = (TextView) view.findViewById(R.id.overview_timeago);
deltaView = (TextView) view.findViewById(R.id.overview_delta); deltaView = (TextView) view.findViewById(R.id.overview_delta);
bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph); bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph);
cancelTempButton = (Button) view.findViewById(R.id.overview_canceltemp);
treatmentButton = (Button) view.findViewById(R.id.overview_treatment);
wizardButton = (Button) view.findViewById(R.id.overview_wizard);
updateData(); treatmentButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager manager = getFragmentManager();
NewTreatmentDialogFragment treatmentDialogFragment = new NewTreatmentDialogFragment();
treatmentDialogFragment.show(manager, "TreatmentDialog");
}
});
wizardButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager manager = getFragmentManager();
WizardDialogFragment wizardDialogFragment = new WizardDialogFragment();
wizardDialogFragment.show(manager, "WizardDialog");
}
});
cancelTempButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PumpInterface pump = MainActivity.getConfigBuilder().getActivePump();
if (pump.isTempBasalInProgress()) {
pump.cancelTempBasal();
MainApp.bus().post(new EventTempBasalChange());
}
}
});
updateGUI();
return view; return view;
} }
@ -141,7 +183,47 @@ public class OverviewFragment extends Fragment implements PluginBase {
MainApp.bus().register(this); MainApp.bus().register(this);
} }
public void updateData() { @Subscribe
public void onStatusEvent(final EventTempBasalChange ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateGUI();
}
});
else
log.debug("EventTempBasalChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateGUI();
}
});
else
log.debug("EventNewBG: Activity is null");
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
updateGUI();
visibleNow = true;
} else {
visibleNow = false;
}
}
public void updateGUI() {
BgReading actualBG = MainApp.getDbHelper().actualBg(); BgReading actualBG = MainApp.getDbHelper().actualBg();
BgReading lastBG = MainApp.getDbHelper().lastBg(); BgReading lastBG = MainApp.getDbHelper().lastBg();
if (MainActivity.getConfigBuilder() == null || MainActivity.getConfigBuilder().getActiveProfile() == null) // app not initialized yet if (MainActivity.getConfigBuilder() == null || MainActivity.getConfigBuilder().getActiveProfile() == null) // app not initialized yet
@ -156,6 +238,17 @@ public class OverviewFragment extends Fragment implements PluginBase {
if (bgGraph == null) if (bgGraph == null)
return; return;
// **** Temp button ****
PumpInterface pump = MainActivity.getConfigBuilder().getActivePump();
if (pump.isTempBasalInProgress()) {
TempBasal activeTemp = pump.getTempBasal();
cancelTempButton.setVisibility(View.VISIBLE);
cancelTempButton.setText(MainApp.instance().getString(R.string.cancel) + ": " + activeTemp.toString());
} else {
cancelTempButton.setVisibility(View.INVISIBLE);
}
// **** BG value **** // **** BG value ****
if (profile != null && lastBG != null && bgView != null) { if (profile != null && lastBG != null && bgView != null) {
bgView.setText(lastBG.valueToUnitsToString(profile.getUnits())); bgView.setText(lastBG.valueToUnitsToString(profile.getUnits()));
@ -260,44 +353,4 @@ public class OverviewFragment extends Fragment implements PluginBase {
bgGraph.getGridLabelRenderer().setNumVerticalLabels(11); bgGraph.getGridLabelRenderer().setNumVerticalLabels(11);
} }
@Subscribe
public void onStatusEvent(final EventTempBasalChange ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateData();
}
});
else
log.debug("EventTempBasalChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateData();
}
});
else
log.debug("EventNewBG: Activity is null");
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
updateData();
visibleNow = true;
} else {
visibleNow = false;
}
}
} }

View file

@ -0,0 +1,116 @@
package info.nightscout.androidaps.plugins.SafetyFragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.ConstrainsInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.ProfileInterface;
import info.nightscout.androidaps.plugins.APSResult;
import info.nightscout.client.data.NSProfile;
public class SafetyFragment extends Fragment implements PluginBase, ConstrainsInterface {
private static Logger log = LoggerFactory.getLogger(SafetyFragment.class);
@Override
public int getType() {
return PluginBase.CONSTRAINS;
}
@Override
public String getName() {
return MainApp.instance().getString(R.string.safety);
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean isVisibleInTabs() {
return false;
}
@Override
public boolean canBeHidden() {
return true;
}
@Override
public void setFragmentEnabled(boolean fragmentEnabled) {
}
@Override
public void setFragmentVisible(boolean fragmentVisible) {
}
public static SafetyFragment newInstance() {
SafetyFragment fragment = new SafetyFragment();
return fragment;
}
/**
* Constrains interface
**/
@Override
public boolean isAutomaticProcessingEnabled() {
return true;
}
@Override
public boolean manualConfirmationNeeded() {
return false;
}
@Override
public APSResult applyBasalConstrains(APSResult result) {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
Double maxBasal = Double.parseDouble(SP.getString("openapsma_max_basal", "1").replace(",", "."));
NSProfile profile = MainActivity.getConfigBuilder().getActiveProfile().getProfile();
if (result.rate < 0) result.rate = 0;
Integer maxBasalMult = 4;
Integer maxBasalFromDaily = 3;
// Check percentRate but absolute rate too, because we know real current basal in pump
Double origRate = result.rate;
if (result.rate > maxBasal) {
result.rate = maxBasal;
if (Config.logConstrainsChnages)
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + result.rate + "U/h");
}
if (result.rate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
result.rate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
if (Config.logConstrainsChnages)
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + result.rate + "U/h");
}
if (result.rate > profile.getMaxDailyBasal() * maxBasalFromDaily) {
result.rate = profile.getMaxDailyBasal() * maxBasalFromDaily;
if (Config.logConstrainsChnages)
log.debug("Limiting rate " + origRate + " by 3 * maxDailyBasal to " + result.rate + "U/h");
}
return result;
}
}

View file

@ -4,6 +4,7 @@ package info.nightscout.androidaps.plugins.SimpleProfile;
import android.content.SharedPreferences; import android.content.SharedPreferences;
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.NotificationCompat;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -98,11 +99,6 @@ public class SimpleProfileFragment extends Fragment implements PluginBase, Profi
this.fragmentVisible = fragmentVisible; this.fragmentVisible = fragmentVisible;
} }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
@ -160,13 +156,14 @@ public class SimpleProfileFragment extends Fragment implements PluginBase, Profi
@Override @Override
public void onTextChanged(CharSequence s, int start, public void onTextChanged(CharSequence s, int start,
int before, int count) { int before, int count) {
dia = Double.parseDouble(diaView.getText().toString().replace(",", ".")); try { dia = Double.parseDouble(diaView.getText().toString().replace(",", ".")); } catch (Exception e) {};
ic = Double.parseDouble(icView.getText().toString().replace(",", ".")); try { ic = Double.parseDouble(icView.getText().toString().replace(",", ".")); } catch (Exception e) {};
isf = Double.parseDouble(isfView.getText().toString().replace(",", ".")); try { isf = Double.parseDouble(isfView.getText().toString().replace(",", ".")); } catch (Exception e) {};
car = Double.parseDouble(carView.getText().toString().replace(",", ".")); try { car = Double.parseDouble(carView.getText().toString().replace(",", ".")); } catch (Exception e) {};
basal = Double.parseDouble(basalView.getText().toString().replace(",", ".")); try { basal = Double.parseDouble(basalView.getText().toString().replace(",", ".")); } catch (Exception e) {};
targetLow = Double.parseDouble(targetlowView.getText().toString().replace(",", ".")); try { targetLow = Double.parseDouble(targetlowView.getText().toString().replace(",", ".")); } catch (Exception e) {};
targetHigh = Double.parseDouble(targethighView.getText().toString().replace(",", ".")); try { targetHigh = Double.parseDouble(targethighView.getText().toString().replace(",", ".")); } catch (Exception e) {};
storeSettings();
} }
}; };
diaView.addTextChangedListener(textWatch); diaView.addTextChangedListener(textWatch);

View file

@ -56,6 +56,7 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
boolean fragmentEnabled = true; boolean fragmentEnabled = true;
boolean fragmentVisible = true; boolean fragmentVisible = true;
boolean visibleNow = false;
@Override @Override
public String getName() { public String getName() {
@ -95,7 +96,7 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
private void initializeData() { private void initializeData() {
try { try {
Dao<TempBasal, Long> dao = MainApp.getDbHelper().getDaoTempBasals(); Dao<TempBasal, Long> dao = MainApp.getDbHelper().getDaoTempBasals();
/*
// **************** TESTING CREATE FAKE RECORD ***************** // **************** TESTING CREATE FAKE RECORD *****************
TempBasal fake = new TempBasal(); TempBasal fake = new TempBasal();
fake.timeStart = new Date(new Date().getTime() - 45 * 40 * 1000); fake.timeStart = new Date(new Date().getTime() - 45 * 40 * 1000);
@ -106,7 +107,7 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
fake.isExtended = false; fake.isExtended = false;
dao.createOrUpdate(fake); dao.createOrUpdate(fake);
// **************** TESTING CREATE FAKE RECORD ***************** // **************** TESTING CREATE FAKE RECORD *****************
*/
QueryBuilder<TempBasal, Long> queryBuilder = dao.queryBuilder(); QueryBuilder<TempBasal, Long> queryBuilder = dao.queryBuilder();
queryBuilder.orderBy("timeIndex", false); queryBuilder.orderBy("timeIndex", false);
queryBuilder.limit(30l); queryBuilder.limit(30l);
@ -116,9 +117,6 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
log.debug(e.getMessage(), e); log.debug(e.getMessage(), e);
tempBasals = new ArrayList<TempBasal>(); tempBasals = new ArrayList<TempBasal>();
} }
if (recyclerView != null) {
recyclerView.swapAdapter(new RecyclerViewAdapter(tempBasals), false);
}
} }
/* /*
@ -135,7 +133,8 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
return lastCalculation; return lastCalculation;
} }
private void updateTotalIOB() { @Override
public void updateTotalIOB() {
Date now = new Date(); Date now = new Date();
IobTotal total = new IobTotal(); IobTotal total = new IobTotal();
for (Integer pos = 0; pos < tempBasals.size(); pos++) { for (Integer pos = 0; pos < tempBasals.size(); pos++) {
@ -230,6 +229,7 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
super(); super();
registerBus(); registerBus();
initializeData(); initializeData();
updateGUI();
} }
public static TempBasalsFragment newInstance() { public static TempBasalsFragment newInstance() {
@ -271,39 +271,30 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
@Subscribe @Subscribe
public void onStatusEvent(final EventTempBasalChange ev) { public void onStatusEvent(final EventTempBasalChange ev) {
Activity activity = getActivity(); initializeData();
if (activity != null && recyclerView != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateTotalIOB();
recyclerView.getAdapter().notifyDataSetChanged();
}
});
else
log.debug("EventTempBasalChange: Activity is null");
} }
@Subscribe public void updateGUI() {
public void onStatusEvent(final EventNewBG ev) {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity != null && recyclerView != null) if (visibleNow && activity != null && recyclerView != null)
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
updateTotalIOB(); recyclerView.swapAdapter(new RecyclerViewAdapter(tempBasals), false);
recyclerView.getAdapter().notifyDataSetChanged();
} }
}); });
else
log.debug("EventNewBG: Activity is null");
} }
@Override @Override
public void setUserVisibleHint(boolean isVisibleToUser) { public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser); super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) if (isVisibleToUser) {
visibleNow = true;
updateTotalIOBIfNeeded(); updateTotalIOBIfNeeded();
updateGUI();
} else
visibleNow = false;
} }
} }

View file

@ -65,6 +65,7 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
boolean fragmentEnabled = true; boolean fragmentEnabled = true;
boolean fragmentVisible = true; boolean fragmentVisible = true;
boolean visibleNow = false;
@Override @Override
public String getName() { public String getName() {
@ -113,15 +114,11 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
log.debug(e.getMessage(), e); log.debug(e.getMessage(), e);
treatments = new ArrayList<Treatment>(); treatments = new ArrayList<Treatment>();
} }
if (recyclerView != null) {
recyclerView.swapAdapter(new RecyclerViewAdapter(treatments), false);
}
} }
/* /*
* Recalculate IOB if value is older than 1 minute * Recalculate IOB if value is older than 1 minute
*/ */
@Override
public void updateTotalIOBIfNeeded() { public void updateTotalIOBIfNeeded() {
if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000) if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
return; return;
@ -133,7 +130,8 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
return lastCalculation; return lastCalculation;
} }
private void updateTotalIOB() { @Override
public void updateTotalIOB() {
IobTotal total = new IobTotal(); IobTotal total = new IobTotal();
if (MainActivity.getConfigBuilder() == null || MainActivity.getConfigBuilder().getActiveProfile() == null) // app not initialized yet if (MainActivity.getConfigBuilder() == null || MainActivity.getConfigBuilder().getActiveProfile() == null) // app not initialized yet
@ -258,6 +256,7 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
super(); super();
registerBus(); registerBus();
initializeData(); initializeData();
updateGUI();
} }
public static TreatmentsFragment newInstance() { public static TreatmentsFragment newInstance() {
@ -297,17 +296,18 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
switch (view.getId()) { switch (view.getId()) {
case R.id.treatments_reshreshfromnightscout: case R.id.treatments_reshreshfromnightscout:
AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
builder.setTitle("Dialog"); builder.setTitle(this.getContext().getString(R.string.dialog));
builder.setMessage("Do you want to refresh treatments from Nightscout"); builder.setMessage(this.getContext().getString(R.string.refreshfromnightscout));
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
MainApp.getDbHelper().resetTreatments(); MainApp.getDbHelper().resetTreatments();
initializeData(); initializeData();
updateGUI();
Intent restartNSClient = new Intent(Intents.ACTION_RESTART); Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
} }
}); });
builder.setNegativeButton("Cancel", null); builder.setNegativeButton(this.getContext().getString(R.string.cancel), null);
builder.show(); builder.show();
break; break;
@ -325,38 +325,30 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
@Subscribe @Subscribe
public void onStatusEvent(final EventTreatmentChange ev) { public void onStatusEvent(final EventTreatmentChange ev) {
Activity activity = getActivity();
if (activity != null && recyclerView != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
initializeData(); initializeData();
} updateGUI();
});
else
log.debug("EventTreatmentChange: Activity is null");
} }
@Subscribe public void updateGUI() {
public void onStatusEvent(final EventNewBG ev) {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity != null && recyclerView != null) if (visibleNow && activity != null && recyclerView != null)
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
updateTotalIOB(); recyclerView.swapAdapter(new RecyclerViewAdapter(treatments), false);
recyclerView.getAdapter().notifyDataSetChanged();
} }
}); });
else
log.debug("EventNewBG: Activity is null");
} }
@Override @Override
public void setUserVisibleHint(boolean isVisibleToUser) { public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser); super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) if (isVisibleToUser) {
visibleNow = true;
updateTotalIOBIfNeeded(); updateTotalIOBIfNeeded();
updateGUI();
} else
visibleNow = false;
} }
} }

View file

@ -1,7 +1,10 @@
package info.nightscout.androidaps.plugins.VirtualPump; package info.nightscout.androidaps.plugins.VirtualPump;
import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -23,11 +26,13 @@ import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.data.Result; import info.nightscout.androidaps.data.Result;
import info.nightscout.androidaps.db.TempBasal; import info.nightscout.androidaps.db.TempBasal;
import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.plugins.APSResult;
import info.nightscout.client.data.NSProfile; import info.nightscout.client.data.NSProfile;
import info.nightscout.utils.DateUtil; import info.nightscout.utils.DateUtil;
@ -47,8 +52,12 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
TextView batteryView; TextView batteryView;
TextView reservoirView; TextView reservoirView;
Handler loopHandler = new Handler();
Runnable refreshLoop = null;
boolean fragmentEnabled = true; boolean fragmentEnabled = true;
boolean fragmentVisible = true; boolean fragmentVisible = true;
boolean visibleNow = false;
@Override @Override
public String getName() { public String getName() {
@ -90,8 +99,18 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (refreshLoop == null) {
refreshLoop = new Runnable() {
@Override
public void run() {
updateGUI();
loopHandler.postDelayed(refreshLoop, 60 * 1000l);
}
};
loopHandler.postDelayed(refreshLoop, 60 * 1000l);
}
} }
@Override @Override
@ -104,48 +123,10 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
batteryView = (TextView) view.findViewById(R.id.virtualpump_battery); batteryView = (TextView) view.findViewById(R.id.virtualpump_battery);
reservoirView = (TextView) view.findViewById(R.id.virtualpump_reservoir); reservoirView = (TextView) view.findViewById(R.id.virtualpump_reservoir);
updateGUI();
return view; return view;
} }
public void updateView() {
DateFormat formatDateToJustTime = new SimpleDateFormat("HH:mm");
DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00");
checkForExpiredTempsAndExtended();
basaBasalRateView.setText(getBaseBasalRate() + "U");
if (isTempBasalInProgress()) {
if (tempBasal.isAbsolute) {
tempBasalView.setText(formatNumber2decimalplaces.format(tempBasal.absolute) + "U/h @" +
formatDateToJustTime.format(tempBasal.timeStart) +
" " + tempBasal.getRemainingMinutes() + "/" + tempBasal.duration + "min");
} else { // percent
tempBasalView.setText(tempBasal.percent + "% @" +
formatDateToJustTime.format(tempBasal.timeStart) +
" " + tempBasal.getRemainingMinutes() + "/" + tempBasal.duration + "min");
}
} else {
tempBasalView.setText("");
}
if (isExtendedBoluslInProgress()) {
extendedBolusView.setText(formatNumber2decimalplaces.format(extendedBolus.absolute) + "U/h @" +
formatDateToJustTime.format(extendedBolus.timeStart) +
" " + extendedBolus.getRemainingMinutes() + "/" + extendedBolus.duration + "min");
} else {
extendedBolusView.setText("");
}
batteryView.setText(getBatteryPercent() + "%");
reservoirView.setText(getReservoirValue() + "U");
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
updateView();
}
void checkForExpiredTempsAndExtended() { void checkForExpiredTempsAndExtended() {
long now = new Date().getTime(); long now = new Date().getTime();
if (isTempBasalInProgress()) { if (isTempBasalInProgress()) {
@ -161,6 +142,7 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Canceling expired temp: " + tempBasal); log.debug("Canceling expired temp: " + tempBasal);
tempBasal = null; tempBasal = null;
MainApp.bus().post(new EventTreatmentChange());
} }
} }
if (isExtendedBoluslInProgress()) { if (isExtendedBoluslInProgress()) {
@ -229,6 +211,11 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
} }
} }
@Override
public TempBasal getTempBasal() {
return tempBasal;
}
@Override @Override
public double getTempBasalRemainingMinutes() { public double getTempBasalRemainingMinutes() {
if (!isTempBasalInProgress()) if (!isTempBasalInProgress())
@ -243,20 +230,9 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
result.bolusDelivered = insulin; result.bolusDelivered = insulin;
result.comment = getString(R.string.virtualpump_resultok); result.comment = getString(R.string.virtualpump_resultok);
Treatment t = new Treatment();
t.insulin = insulin;
t.carbs = carbs;
t.created_at = new Date();
try {
MainApp.instance().getDbHelper().getDaoTreatments().create(t);
} catch (SQLException e) {
e.printStackTrace();
result.success = false;
result.comment = getString(R.string.virtualpump_sqlerror);
}
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Delivering treatment: " + t + " " + result); log.debug("Delivering treatment insulin: " + insulin + "U carbs: " + carbs + "g " + result);
updateView(); updateGUI();
return result; return result;
} }
@ -272,6 +248,9 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
tempBasal.absolute = absoluteRate; tempBasal.absolute = absoluteRate;
tempBasal.duration = durationInMinutes; tempBasal.duration = durationInMinutes;
result.success = true; result.success = true;
result.enacted = true;
result.absolute = absoluteRate;
result.duration = durationInMinutes;
result.comment = getString(R.string.virtualpump_resultok); result.comment = getString(R.string.virtualpump_resultok);
try { try {
MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal); MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal);
@ -282,22 +261,28 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
} }
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Setting temp basal absolute: " + result); log.debug("Setting temp basal absolute: " + result);
updateView(); updateGUI();
return result; return result;
} }
@Override @Override
public Result setTempBasalPercent(Integer percent, Integer durationInMinutes) { public Result setTempBasalPercent(Integer percent, Integer durationInMinutes) {
checkForExpiredTempsAndExtended(); checkForExpiredTempsAndExtended();
Result result = cancelTempBasal(); Result result = new Result();
if (isTempBasalInProgress()) {
result = cancelTempBasal();
if (!result.success) if (!result.success)
return result; return result;
}
tempBasal = new TempBasal(); tempBasal = new TempBasal();
tempBasal.timeStart = new Date(); tempBasal.timeStart = new Date();
tempBasal.isAbsolute = false; tempBasal.isAbsolute = false;
tempBasal.percent = percent; tempBasal.percent = percent;
tempBasal.duration = durationInMinutes; tempBasal.duration = durationInMinutes;
result.success = true; result.success = true;
result.enacted = true;
result.percent = percent;
result.duration = durationInMinutes;
result.comment = getString(R.string.virtualpump_resultok); result.comment = getString(R.string.virtualpump_resultok);
try { try {
MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal); MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal);
@ -308,7 +293,7 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
} }
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Settings temp basal percent: " + result); log.debug("Settings temp basal percent: " + result);
updateView(); updateGUI();
return result; return result;
} }
@ -324,6 +309,7 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
extendedBolus.absolute = insulin * 60d / durationInMinutes; extendedBolus.absolute = insulin * 60d / durationInMinutes;
extendedBolus.duration = durationInMinutes; extendedBolus.duration = durationInMinutes;
result.success = true; result.success = true;
result.enacted = true;
result.comment = getString(R.string.virtualpump_resultok); result.comment = getString(R.string.virtualpump_resultok);
try { try {
MainApp.instance().getDbHelper().getDaoTempBasals().create(extendedBolus); MainApp.instance().getDbHelper().getDaoTempBasals().create(extendedBolus);
@ -334,7 +320,7 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
} }
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Setting extended bolus: " + result); log.debug("Setting extended bolus: " + result);
updateView(); updateGUI();
return result; return result;
} }
@ -342,22 +328,24 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
public Result cancelTempBasal() { public Result cancelTempBasal() {
checkForExpiredTempsAndExtended(); checkForExpiredTempsAndExtended();
Result result = new Result(); Result result = new Result();
result.success = true;
result.comment = getString(R.string.virtualpump_resultok);
if (isTempBasalInProgress()) { if (isTempBasalInProgress()) {
result.enacted = true;
tempBasal.timeEnd = new Date(); tempBasal.timeEnd = new Date();
try { try {
MainApp.instance().getDbHelper().getDaoTempBasals().update(tempBasal); MainApp.instance().getDbHelper().getDaoTempBasals().update(tempBasal);
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
result.success = false; result.success = false;
result.enacted = false;
result.comment = getString(R.string.virtualpump_sqlerror); result.comment = getString(R.string.virtualpump_sqlerror);
} }
} }
result.success = true;
result.comment = getString(R.string.virtualpump_resultok);
tempBasal = null; tempBasal = null;
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Canceling temp basal: " + result); log.debug("Canceling temp basal: " + result);
updateView(); updateGUI();
return result; return result;
} }
@ -376,14 +364,39 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
} }
} }
result.success = true; result.success = true;
result.enacted = true;
result.comment = getString(R.string.virtualpump_resultok); result.comment = getString(R.string.virtualpump_resultok);
extendedBolus = null; extendedBolus = null;
if (Config.logPumpComm) if (Config.logPumpComm)
log.debug("Canceling extended basal: " + result); log.debug("Canceling extended basal: " + result);
updateView(); updateGUI();
return result; return result;
} }
@Override
public Result applyAPSRequest(APSResult request) {
if (isTempBasalInProgress()) {
if (request.rate == getTempBasalAbsoluteRate()) {
Result noChange = new Result();
noChange.enacted = false;
noChange.comment = "Temp basal set correctly";
noChange.success = true;
return noChange;
} else {
return setTempBasalAbsolute(request.rate, request.duration);
}
}
if (request.rate == getBaseBasalRate()) {
Result noChange = new Result();
noChange.enacted = false;
noChange.comment = "Basal set correctly";
noChange.success = true;
return noChange;
}
return setTempBasalAbsolute(request.rate, request.duration);
}
@Override @Override
public JSONObject getJSONStatus() { public JSONObject getJSONStatus() {
JSONObject pump = new JSONObject(); JSONObject pump = new JSONObject();
@ -410,4 +423,40 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
return pump; return pump;
} }
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
visibleNow = true;
updateGUI();
} else
visibleNow = false;
}
public void updateGUI() {
checkForExpiredTempsAndExtended();
Activity activity = getActivity();
if (activity != null && visibleNow && basaBasalRateView != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
basaBasalRateView.setText(getBaseBasalRate() + "U");
if (isTempBasalInProgress()) {
tempBasalView.setText(tempBasal.toString());
} else {
tempBasalView.setText("");
}
if (isExtendedBoluslInProgress()) {
extendedBolusView.setText(extendedBolus.toString());
} else {
extendedBolusView.setText("");
}
batteryView.setText(getBatteryPercent() + "%");
reservoirView.setText(getReservoirValue() + "U");
}
});
}
} }

View file

@ -16,10 +16,10 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@string/configbuilder_pump" android:text="@string/configbuilder_pump"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold" />
android:layout_marginLeft="5dp" />
<ListView <ListView
android:id="@+id/configbuilder_pumplistview" android:id="@+id/configbuilder_pumplistview"
@ -29,32 +29,34 @@
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:background="@color/cardColorBackground" /> android:background="@color/cardColorBackground" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/configbuilder_treatments" android:layout_marginLeft="5dp"
android:text="@string/configbuilder_aps"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold" />
android:layout_marginLeft="5dp" />
<ListView <ListView
android:id="@+id/configbuilder_treatmentslistview" android:id="@+id/configbuilder_apslistview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:background="@color/cardColorBackground" /> android:background="@color/cardColorBackground" />
<TextView
android:layout_width="wrap_content" <TextView
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:text="@string/configbuilder_tempbasals" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_marginLeft="5dp"
android:textStyle="bold" android:text="@string/configbuilder_loop"
android:layout_marginLeft="5dp" /> android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<ListView
android:id="@+id/configbuilder_tempslistview" <ListView
android:id="@+id/configbuilder_looplistview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
@ -64,10 +66,10 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@string/configbuilder_profile" android:text="@string/configbuilder_profile"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold" />
android:layout_marginLeft="5dp" />
<ListView <ListView
android:id="@+id/configbuilder_profilelistview" android:id="@+id/configbuilder_profilelistview"
@ -80,13 +82,13 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/configbuilder_aps" android:layout_marginLeft="5dp"
android:text="@string/configbuilder_treatments"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold" />
android:layout_marginLeft="5dp" />
<ListView <ListView
android:id="@+id/configbuilder_apslistview" android:id="@+id/configbuilder_treatmentslistview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
@ -96,10 +98,27 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@string/configbuilder_tempbasals"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<ListView
android:id="@+id/configbuilder_tempslistview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@color/cardColorBackground" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@string/configbuilder_constrains" android:text="@string/configbuilder_constrains"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold" />
android:layout_marginLeft="5dp" />
<ListView <ListView
android:id="@+id/configbuilder_constrainslistview" android:id="@+id/configbuilder_constrainslistview"
@ -112,10 +131,10 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@string/configbuilder_general" android:text="@string/configbuilder_general"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold" />
android:layout_marginLeft="5dp" />
<ListView <ListView
android:id="@+id/configbuilder_generallistview" android:id="@+id/configbuilder_generallistview"

View file

@ -0,0 +1,136 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="info.nightscout.androidaps.plugins.Loop.LoopFragment">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollView" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/loop_run"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/openapsma_run" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:background="@color/linearBlockBackground"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/openapsma_lastrun_label"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/loop_lastrun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/openapsma_lastenact_label"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/loop_lastenact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:background="@color/linearBlockBackground"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loop_aps_label"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/loop_source"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/loop_request"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:background="@color/linearBlockBackground"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loop_constrainsprocessed_label"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/loop_constrainsprocessed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:background="@color/linearBlockBackground"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loop_setbypump_label"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/loop_setbypump"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</FrameLayout>

View file

@ -24,7 +24,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -45,7 +45,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -87,7 +87,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -109,7 +109,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView

View file

@ -14,18 +14,25 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button <Button
android:id="@+id/openapsma_run" android:id="@+id/openapsma_run"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/openapsma_run" /> android:text="@string/openapsma_run" />
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -46,7 +53,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -126,7 +133,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -149,7 +156,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="#3e3d3d" android:background="@color/linearBlockBackground"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView

View file

@ -50,6 +50,46 @@
android:id="@+id/overview_bggraph" android:id="@+id/overview_bggraph"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dip" /> android:layout_height="200dip" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel temp basal"
android:id="@+id/overview_canceltemp"
android:background="@color/colorCancelTempButton"
android:layout_margin="10dp"
android:layout_weight="0.5" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Treatment"
android:id="@+id/overview_treatment"
android:background="@color/colorTreatmentButton"
android:layout_margin="10dp"
android:layout_weight="0.5" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Calculator"
android:id="@+id/overview_wizard"
android:background="@color/colorWizardButton"
android:layout_margin="10dp"
android:layout_weight="0.5" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>

View file

@ -6,4 +6,10 @@
<color name="cardColorBackground">#121212</color> <color name="cardColorBackground">#121212</color>
<color name="cardObjectiveText">#779ECB</color> <color name="cardObjectiveText">#779ECB</color>
<color name="linearBlockBackground">#3e3d3d</color>
<color name="colorTreatmentButton">#FFB347</color>
<color name="colorWizardButton">#77dd77</color>
<color name="colorCancelTempButton">#FF47C8FF</color>
</resources> </resources>

View file

@ -3,13 +3,10 @@
<string name="title_activity_main">AndroidAPS</string> <string name="title_activity_main">AndroidAPS</string>
<string name="title_activity_preferences">Preferences</string> <string name="title_activity_preferences">Preferences</string>
<string name="ns_sync_title">Nightscout synchronization</string> <string name="treatmentssafety_title">Tratments safety</string>
<string name="ns_sync_profile_title">Synchronize profile</string> <string name="treatmentssafety_maxbolus_title">Max allowed bolus</string>
<string name="ns_units">Units</string> <string name="treatmentssafety_maxcarbs_title">Max allowed carbs</string>
<string name="safety_title">Safety</string>
<string name="safety_maxbolus_title">Max allowed bolus</string>
<string name="safety_maxcarbs_title">Max allowed carbs</string>
<string name="nav_home">Home</string>
<string name="nav_preferences">Preferences</string> <string name="nav_preferences">Preferences</string>
<string name="nav_refreshtreatments">Refresh treatments from NS</string> <string name="nav_refreshtreatments">Refresh treatments from NS</string>
<string name="nav_backup">Backup</string> <string name="nav_backup">Backup</string>
@ -109,4 +106,29 @@
<string name="minimalduration">Minimal duration</string> <string name="minimalduration">Minimal duration</string>
<string name="configbuilder_constrains">Constrains</string> <string name="configbuilder_constrains">Constrains</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="loop">Loop</string>
<string name="configbuilder_loop">Loop</string>
<string name="loop_aps_label">APS</string>
<string name="loop_constrainsprocessed_label">After processed constrains</string>
<string name="loop_setbypump_label">Set by pump</string>
<string name="openapsma_lastenact_label">Last enacted</string>
<string name="dialog">Dialog</string>
<string name="alert">Alert</string>
<string name="refreshfromnightscout">Do you want to refresh treatments from Nightscout</string>
<string name="ok">OK</string>
<string name="cancel">Cancel</string>
<string name="noapsselected">NO APS SELECTED OR PROVIDED RESULT</string>
<string name="safety">Safety</string>
<string name="limits_title">Limits</string>
<string name="maxbasal_title">Max basal</string>
<string name="maxbasal_summary">Max U/hr a Temp Basal can be set to</string>
<string name="maxbasaliob_title">Max basal IOB</string>
<string name="maxbasaliob_summary">Maximum amount of non-bolus IOB OpenAPS can deliver</string>
<string name="lowsuspend_low_title">Low BG threshold</string>
<string name="openapsma_disabled">Plugin is disabled</string>
<string name="constrains_violation">Constrains violation</string>
<string name="bolusdeliveryerror">Treatment delivery error</string>
</resources> </resources>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="lowsuspend"
android:title="@string/lowsuspend">
<EditTextPreference
android:title="@string/lowsuspend_low_title"
android:key="lowsuspend_lowthreshold"
android:inputType="numberDecimal">
</EditTextPreference>
</PreferenceCategory>
</PreferenceScreen>

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="bgRange"
android:title="APS target BG range">
<EditTextPreference
android:defaultValue=""
android:key="openapsma_min_bg"
android:numeric="decimal"
android:summary="The minimum value you consider to be in range."
android:title="Low Value" />
<EditTextPreference
android:defaultValue=""
android:key="openapsma_max_bg"
android:numeric="decimal"
android:summary="The maximum value you consider to be in range."
android:title="High Value" />
</PreferenceCategory>
<PreferenceCategory
android:key="aps_limits"
android:title="APS Limits">
<EditTextPreference
android:defaultValue="1"
android:key="openapsma_max_basal"
android:numeric="decimal"
android:summary="Max U/hr a Temp Basal can be set to"
android:title="Max Basal" />
<EditTextPreference
android:defaultValue="1.5"
android:key="openapsma_max_iob"
android:numeric="decimal"
android:summary="Maximum amount of non-bolus IOB OpenAPS can deliver"
android:title="Max Basal IOB" />
</PreferenceCategory>
</PreferenceScreen>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="treatmentssafety"
android:title="@string/treatmentssafety_title">
<EditTextPreference
android:title="@string/treatmentssafety_maxbolus_title"
android:key="treatmentssafety_maxbolus"
android:defaultValue="3"
android:inputType="numberDecimal">
</EditTextPreference>
<EditTextPreference
android:title="@string/treatmentssafety_maxcarbs_title"
android:key="treatmentssafety_maxcarbs"
android:defaultValue="48"
android:inputType="numberDecimal">
</EditTextPreference>
</PreferenceCategory>
</PreferenceScreen>