plugins refactoring
This commit is contained in:
parent
7cc0fb593d
commit
b711648bee
9
app/proguard-rules.pro
vendored
9
app/proguard-rules.pro
vendored
|
@ -15,3 +15,12 @@
|
||||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
# public *;
|
# public *;
|
||||||
#}
|
#}
|
||||||
|
-dontwarn android.support.**
|
||||||
|
|
||||||
|
-keep class !android.support.v7.internal.view.menu.**,android.support.** {*;}
|
||||||
|
-ignorewarnings
|
||||||
|
-renamesourcefileattribute SourceFile
|
||||||
|
-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
-keep public class * extends android.support.v4.** {*;}
|
||||||
|
-keep public class * extends android.app.Fragment
|
|
@ -7,7 +7,6 @@ public class Config {
|
||||||
// MAIN FUCTIONALITY
|
// MAIN FUCTIONALITY
|
||||||
public static final boolean APS = BuildConfig.APS;
|
public static final boolean APS = BuildConfig.APS;
|
||||||
// PLUGINS
|
// PLUGINS
|
||||||
public static final boolean LOWSUSPEDENABLED = APS;
|
|
||||||
public static final boolean OPENAPSMAENABLED = APS;
|
public static final boolean OPENAPSMAENABLED = APS;
|
||||||
public static final boolean LOOPENABLED = APS;
|
public static final boolean LOOPENABLED = APS;
|
||||||
|
|
||||||
|
|
|
@ -80,9 +80,9 @@ public class MainActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpTabs(boolean switchToLast) {
|
private void setUpTabs(boolean switchToLast) {
|
||||||
pageAdapter = new TabPageAdapter(getSupportFragmentManager());
|
pageAdapter = new TabPageAdapter(getSupportFragmentManager(), this);
|
||||||
for (PluginBase f : MainApp.getPluginsList()) {
|
for (PluginBase p : MainApp.getPluginsList()) {
|
||||||
pageAdapter.registerNewFragment((Fragment) f);
|
pageAdapter.registerNewFragment(p);
|
||||||
}
|
}
|
||||||
mPager = (ViewPager) findViewById(R.id.pager);
|
mPager = (ViewPager) findViewById(R.id.pager);
|
||||||
mPager.setAdapter(pageAdapter);
|
mPager.setAdapter(pageAdapter);
|
||||||
|
|
|
@ -9,11 +9,18 @@ import com.j256.ormlite.android.apptools.OpenHelperManager;
|
||||||
import com.squareup.otto.Bus;
|
import com.squareup.otto.Bus;
|
||||||
import com.squareup.otto.ThreadEnforcer;
|
import com.squareup.otto.ThreadEnforcer;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
|
import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||||
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
||||||
import info.nightscout.androidaps.plugins.LowSuspend.LowSuspendFragment;
|
|
||||||
import info.nightscout.androidaps.plugins.MM640g.MM640gFragment;
|
import info.nightscout.androidaps.plugins.MM640g.MM640gFragment;
|
||||||
import info.nightscout.androidaps.plugins.NSProfileViewer.NSProfileViewerFragment;
|
import info.nightscout.androidaps.plugins.NSProfileViewer.NSProfileViewerFragment;
|
||||||
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
|
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
|
||||||
|
@ -28,17 +35,9 @@ import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment;
|
||||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
||||||
import info.nightscout.androidaps.plugins.VirtualPump.VirtualPumpFragment;
|
import info.nightscout.androidaps.plugins.VirtualPump.VirtualPumpFragment;
|
||||||
import io.fabric.sdk.android.Fabric;
|
import io.fabric.sdk.android.Fabric;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
|
||||||
|
|
||||||
|
|
||||||
public class MainApp extends Application {
|
public class MainApp extends Application {
|
||||||
private static Logger log = LoggerFactory.getLogger(MainApp.class);
|
private static Logger log = LoggerFactory.getLogger(MainApp.class);
|
||||||
|
|
||||||
private static Bus sBus;
|
private static Bus sBus;
|
||||||
|
@ -46,7 +45,7 @@ public class MainApp extends Application {
|
||||||
public static Resources sResources;
|
public static Resources sResources;
|
||||||
|
|
||||||
private static DatabaseHelper sDatabaseHelper = null;
|
private static DatabaseHelper sDatabaseHelper = null;
|
||||||
private static ConfigBuilderFragment sConfigBuilder = null;
|
private static ConfigBuilderPlugin sConfigBuilder = null;
|
||||||
|
|
||||||
private static ArrayList<PluginBase> pluginsList = null;
|
private static ArrayList<PluginBase> pluginsList = null;
|
||||||
|
|
||||||
|
@ -60,26 +59,26 @@ public class MainApp extends Application {
|
||||||
sResources = getResources();
|
sResources = getResources();
|
||||||
|
|
||||||
if (pluginsList == null) {
|
if (pluginsList == null) {
|
||||||
pluginsList = new ArrayList<PluginBase>();
|
pluginsList = new ArrayList<>();
|
||||||
// Register all tabs in app here
|
// Register all tabs in app here
|
||||||
pluginsList.add(OverviewFragment.newInstance());
|
pluginsList.add(OverviewFragment.getPlugin());
|
||||||
if (Config.DANAR) pluginsList.add(DanaRFragment.newInstance());
|
if (Config.DANAR) pluginsList.add(DanaRFragment.getPlugin());
|
||||||
if (Config.MM640G) pluginsList.add(MM640gFragment.newInstance());
|
if (Config.MM640G) pluginsList.add(MM640gFragment.getPlugin());
|
||||||
pluginsList.add(VirtualPumpFragment.newInstance());
|
pluginsList.add(VirtualPumpFragment.getPlugin());
|
||||||
if (Config.CAREPORTALENABLED) pluginsList.add(CareportalFragment.newInstance());
|
if (Config.CAREPORTALENABLED) pluginsList.add(CareportalFragment.getPlugin());
|
||||||
if (Config.LOOPENABLED) pluginsList.add(LoopFragment.newInstance());
|
if (Config.LOOPENABLED) pluginsList.add(LoopFragment.getPlugin());
|
||||||
if (Config.LOWSUSPEDENABLED) pluginsList.add(LowSuspendFragment.newInstance());
|
if (Config.OPENAPSMAENABLED) pluginsList.add(OpenAPSMAFragment.getPlugin());
|
||||||
if (Config.OPENAPSMAENABLED) pluginsList.add(OpenAPSMAFragment.newInstance());
|
pluginsList.add(NSProfileViewerFragment.getPlugin());
|
||||||
pluginsList.add(NSProfileViewerFragment.newInstance());
|
pluginsList.add(SimpleProfileFragment.getPlugin());
|
||||||
pluginsList.add(SimpleProfileFragment.newInstance());
|
pluginsList.add(TreatmentsFragment.getPlugin());
|
||||||
pluginsList.add(TreatmentsFragment.newInstance());
|
pluginsList.add(TempBasalsFragment.getPlugin());
|
||||||
pluginsList.add(TempBasalsFragment.newInstance());
|
pluginsList.add(SafetyFragment.getPlugin());
|
||||||
pluginsList.add(SafetyFragment.newInstance());
|
if (Config.APS) pluginsList.add(ObjectivesFragment.getPlugin());
|
||||||
if (Config.APS) pluginsList.add(ObjectivesFragment.newInstance());
|
pluginsList.add(SourceXdripFragment.getPlugin());
|
||||||
pluginsList.add(SourceXdripFragment.newInstance());
|
pluginsList.add(SourceNSClientFragment.getPlugin());
|
||||||
pluginsList.add(SourceNSClientFragment.newInstance());
|
if (Config.SMSCOMMUNICATORENABLED)
|
||||||
if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorFragment.newInstance());
|
pluginsList.add(SmsCommunicatorFragment.getPlugin());
|
||||||
pluginsList.add(sConfigBuilder = ConfigBuilderFragment.newInstance());
|
pluginsList.add(sConfigBuilder = ConfigBuilderFragment.getPlugin());
|
||||||
|
|
||||||
MainApp.getConfigBuilder().initialize();
|
MainApp.getConfigBuilder().initialize();
|
||||||
}
|
}
|
||||||
|
@ -88,6 +87,7 @@ public class MainApp extends Application {
|
||||||
public static Bus bus() {
|
public static Bus bus() {
|
||||||
return sBus;
|
return sBus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MainApp instance() {
|
public static MainApp instance() {
|
||||||
return sInstance;
|
return sInstance;
|
||||||
}
|
}
|
||||||
|
@ -106,11 +106,7 @@ public class MainApp extends Application {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setConfigBuilder(ConfigBuilderFragment cb) {
|
public static ConfigBuilderPlugin getConfigBuilder() {
|
||||||
sConfigBuilder = cb;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ConfigBuilderFragment getConfigBuilder() {
|
|
||||||
return sConfigBuilder;
|
return sConfigBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,12 +115,10 @@ public class MainApp extends Application {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<PluginBase> getSpecificPluginsList(int type) {
|
public static ArrayList<PluginBase> getSpecificPluginsList(int type) {
|
||||||
ArrayList<PluginBase> newList = new ArrayList<PluginBase>();
|
ArrayList<PluginBase> newList = new ArrayList<>();
|
||||||
|
|
||||||
if (pluginsList != null) {
|
if (pluginsList != null) {
|
||||||
Iterator<PluginBase> it = pluginsList.iterator();
|
for (PluginBase p : pluginsList) {
|
||||||
while (it.hasNext()) {
|
|
||||||
PluginBase p = it.next();
|
|
||||||
if (p.getType() == type)
|
if (p.getType() == type)
|
||||||
newList.add(p);
|
newList.add(p);
|
||||||
}
|
}
|
||||||
|
@ -135,13 +129,11 @@ public class MainApp extends Application {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<PluginBase> getSpecificPluginsListByInterface(Class interfaceClass) {
|
public static ArrayList<PluginBase> getSpecificPluginsListByInterface(Class interfaceClass) {
|
||||||
ArrayList<PluginBase> newList = new ArrayList<PluginBase>();
|
ArrayList<PluginBase> newList = new ArrayList<>();
|
||||||
|
|
||||||
if (pluginsList != null) {
|
if (pluginsList != null) {
|
||||||
Iterator<PluginBase> it = pluginsList.iterator();
|
for (PluginBase p : pluginsList) {
|
||||||
while (it.hasNext()) {
|
if (p.getClass() != ConfigBuilderPlugin.class && interfaceClass.isAssignableFrom(p.getClass()))
|
||||||
PluginBase p = it.next();
|
|
||||||
if (p.getClass() != ConfigBuilderFragment.class && interfaceClass.isAssignableFrom(p.getClass()))
|
|
||||||
newList.add(p);
|
newList.add(p);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -153,9 +145,7 @@ public class MainApp extends Application {
|
||||||
@Nullable
|
@Nullable
|
||||||
public static PluginBase getSpecificPlugin(Class pluginClass) {
|
public static PluginBase getSpecificPlugin(Class pluginClass) {
|
||||||
if (pluginsList != null) {
|
if (pluginsList != null) {
|
||||||
Iterator<PluginBase> it = pluginsList.iterator();
|
for (PluginBase p : pluginsList) {
|
||||||
while (it.hasNext()) {
|
|
||||||
PluginBase p = it.next();
|
|
||||||
if (p.getClass() == pluginClass)
|
if (p.getClass() == pluginClass)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import info.nightscout.androidaps.events.EventRefreshGui;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.BluetoothDevicePreference;
|
import info.nightscout.androidaps.plugins.DanaR.BluetoothDevicePreference;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.utils.LocaleHelper;
|
import info.nightscout.utils.LocaleHelper;
|
||||||
|
|
||||||
public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
|
public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
@ -84,13 +85,11 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
|
||||||
addPreferencesFromResource(R.xml.pref_closedmode);
|
addPreferencesFromResource(R.xml.pref_closedmode);
|
||||||
if (Config.OPENAPSMAENABLED)
|
if (Config.OPENAPSMAENABLED)
|
||||||
addPreferencesFromResource(R.xml.pref_openapsma);
|
addPreferencesFromResource(R.xml.pref_openapsma);
|
||||||
if (Config.LOWSUSPEDENABLED)
|
|
||||||
addPreferencesFromResource(R.xml.pref_lowsuspend);
|
|
||||||
addPreferencesFromResource(R.xml.pref_nightscout);
|
addPreferencesFromResource(R.xml.pref_nightscout);
|
||||||
if (Config.DANAR) {
|
if (Config.DANAR) {
|
||||||
addPreferencesFromResource(R.xml.pref_danar);
|
addPreferencesFromResource(R.xml.pref_danar);
|
||||||
DanaRFragment danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
DanaRPlugin danaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||||
if (danaRFragment.isEnabled(PluginBase.PROFILE)) {
|
if (danaRPlugin.isEnabled(PluginBase.PROFILE)) {
|
||||||
addPreferencesFromResource(R.xml.pref_danarprofile);
|
addPreferencesFromResource(R.xml.pref_danarprofile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,10 +38,12 @@ import info.nightscout.androidaps.events.EventNewBasalProfile;
|
||||||
import info.nightscout.androidaps.events.EventTreatmentChange;
|
import info.nightscout.androidaps.events.EventTreatmentChange;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.History.DanaRNSHistorySync;
|
import info.nightscout.androidaps.plugins.DanaR.History.DanaRNSHistorySync;
|
||||||
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
|
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.Objectives.ObjectivesPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
|
import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
|
||||||
import info.nightscout.androidaps.plugins.SmsCommunicator.Events.EventNewSMS;
|
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS;
|
||||||
import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorFragment;
|
import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorFragment;
|
||||||
import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment;
|
import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment;
|
||||||
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripFragment;
|
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripFragment;
|
||||||
|
@ -178,14 +180,14 @@ public class DataService extends IntentService {
|
||||||
if (Config.logIncommingData)
|
if (Config.logIncommingData)
|
||||||
log.debug("Received status: " + bundles);
|
log.debug("Received status: " + bundles);
|
||||||
if (bundles.containsKey("nsclientversioncode")) {
|
if (bundles.containsKey("nsclientversioncode")) {
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder();
|
||||||
if (configBuilderFragment != null) {
|
if (configBuilder != null) {
|
||||||
configBuilderFragment.nightscoutVersionCode = bundles.getInt("nightscoutversioncode"); // for ver 1.2.3 contains 10203
|
configBuilder.nightscoutVersionCode = bundles.getInt("nightscoutversioncode"); // for ver 1.2.3 contains 10203
|
||||||
configBuilderFragment.nightscoutVersionName = bundles.getString("nightscoutversionname");
|
configBuilder.nightscoutVersionName = bundles.getString("nightscoutversionname");
|
||||||
configBuilderFragment.nsClientVersionCode = bundles.getInt("nsclientversioncode"); // for ver 1.17 contains 117
|
configBuilder.nsClientVersionCode = bundles.getInt("nsclientversioncode"); // for ver 1.17 contains 117
|
||||||
configBuilderFragment.nsClientVersionName = bundles.getString("nsclientversionname");
|
configBuilder.nsClientVersionName = bundles.getString("nsclientversionname");
|
||||||
log.debug("Got versions: NSClient: " + configBuilderFragment.nsClientVersionName + " Nightscout: " + configBuilderFragment.nightscoutVersionName);
|
log.debug("Got versions: NSClient: " + configBuilder.nsClientVersionName + " Nightscout: " + configBuilder.nightscoutVersionName);
|
||||||
if (configBuilderFragment.nsClientVersionCode < 118)
|
if (configBuilder.nsClientVersionCode < 118)
|
||||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.unsupportedclientver));
|
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.unsupportedclientver));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -222,10 +224,10 @@ public class DataService extends IntentService {
|
||||||
JSONObject devicestatusJson = jsonArray.getJSONObject(0);
|
JSONObject devicestatusJson = jsonArray.getJSONObject(0);
|
||||||
if (devicestatusJson.has("pump")) {
|
if (devicestatusJson.has("pump")) {
|
||||||
// Objectives 0
|
// Objectives 0
|
||||||
ObjectivesFragment objectivesFragment = (ObjectivesFragment) MainApp.getSpecificPlugin(ObjectivesFragment.class);
|
ObjectivesPlugin objectivesPlugin = (ObjectivesPlugin) MainApp.getSpecificPlugin(ObjectivesPlugin.class);
|
||||||
if (objectivesFragment != null) {
|
if (objectivesPlugin != null) {
|
||||||
objectivesFragment.pumpStatusIsAvailableInNS = true;
|
objectivesPlugin.pumpStatusIsAvailableInNS = true;
|
||||||
objectivesFragment.saveProgress();
|
objectivesPlugin.saveProgress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -245,7 +247,7 @@ public class DataService extends IntentService {
|
||||||
log.error("Config builder not ready on receive profile");
|
log.error("Config builder not ready on receive profile");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
if (pump != null) {
|
if (pump != null) {
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||||
if (SP.getBoolean("syncprofiletopump", false))
|
if (SP.getBoolean("syncprofiletopump", false))
|
||||||
|
@ -368,10 +370,10 @@ public class DataService extends IntentService {
|
||||||
MainApp.bus().post(new EventNewBG());
|
MainApp.bus().post(new EventNewBG());
|
||||||
}
|
}
|
||||||
// Objectives 0
|
// Objectives 0
|
||||||
ObjectivesFragment objectivesFragment = (ObjectivesFragment) MainApp.getSpecificPlugin(ObjectivesFragment.class);
|
ObjectivesPlugin objectivesPlugin = (ObjectivesPlugin) MainApp.getSpecificPlugin(ObjectivesPlugin.class);
|
||||||
if (objectivesFragment != null) {
|
if (objectivesPlugin != null) {
|
||||||
objectivesFragment.bgIsAvailableInNS = true;
|
objectivesPlugin.bgIsAvailableInNS = true;
|
||||||
objectivesFragment.saveProgress();
|
objectivesPlugin.saveProgress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.util.List;
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.data.Iob;
|
import info.nightscout.androidaps.data.Iob;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Overview.GraphSeriesExtension.DataPointWithLabelInterface;
|
import info.nightscout.androidaps.plugins.Overview.GraphSeriesExtension.DataPointWithLabelInterface;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
import info.nightscout.utils.DateUtil;
|
import info.nightscout.utils.DateUtil;
|
||||||
|
@ -137,7 +138,7 @@ public class Treatment implements DataPointWithLabelInterface {
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(data);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.interfaces;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public interface FragmentBase {
|
||||||
|
}
|
|
@ -17,7 +17,8 @@ public interface PluginBase {
|
||||||
int BGSOURCE = 9;
|
int BGSOURCE = 9;
|
||||||
int LAST = 10; // keep always highest number
|
int LAST = 10; // keep always highest number
|
||||||
|
|
||||||
public int getType();
|
int getType();
|
||||||
|
String getFragmentClass();
|
||||||
|
|
||||||
String getName();
|
String getName();
|
||||||
boolean isEnabled(int type);
|
boolean isEnabled(int type);
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mike on 14.06.2016.
|
* Created by mike on 14.06.2016.
|
||||||
|
@ -13,6 +14,6 @@ public interface TreatmentsInterface {
|
||||||
|
|
||||||
void updateTotalIOB();
|
void updateTotalIOB();
|
||||||
IobTotal getLastCalculation();
|
IobTotal getLastCalculation();
|
||||||
TreatmentsFragment.MealData getMealData();
|
TreatmentsPlugin.MealData getMealData();
|
||||||
List<Treatment> getTreatments();
|
List<Treatment> getTreatments();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,17 @@ import android.view.ViewGroup;
|
||||||
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.R;
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
|
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
|
||||||
|
|
||||||
public class CareportalFragment extends Fragment implements PluginBase, View.OnClickListener {
|
public class CareportalFragment extends Fragment implements FragmentBase, View.OnClickListener {
|
||||||
|
|
||||||
|
static CareportalPlugin careportalPlugin = new CareportalPlugin();
|
||||||
|
|
||||||
|
static public CareportalPlugin getPlugin() {
|
||||||
|
return careportalPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
public class OptionsToShow {
|
public class OptionsToShow {
|
||||||
public int eventType;
|
public int eventType;
|
||||||
|
@ -73,58 +80,6 @@ public class CareportalFragment extends Fragment implements PluginBase, View.OnC
|
||||||
final OptionsToShow profileswitch = new OptionsToShow(R.id.careportal_profileswitch, R.string.careportal_profileswitch, true, false, false, false, false, false, false, true, false);
|
final OptionsToShow profileswitch = new OptionsToShow(R.id.careportal_profileswitch, R.string.careportal_profileswitch, true, false, false, false, false, false, false, true, false);
|
||||||
final OptionsToShow openapsoffline = new OptionsToShow(R.id.careportal_openapsoffline, R.string.careportal_openapsoffline, false, false, false, false, true, false, false, false, false);
|
final OptionsToShow openapsoffline = new OptionsToShow(R.id.careportal_openapsoffline, R.string.careportal_openapsoffline, false, false, false, false, true, false, false, false, false);
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
|
|
||||||
public CareportalFragment() {
|
|
||||||
// Required empty public constructor
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CareportalFragment newInstance() {
|
|
||||||
CareportalFragment fragment = new CareportalFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.GENERAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.sResources.getString(R.string.careportal);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Careportal;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
|
||||||
|
public class CareportalPlugin implements PluginBase {
|
||||||
|
|
||||||
|
boolean fragmentEnabled = true;
|
||||||
|
boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return CareportalFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.sResources.getString(R.string.careportal);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -47,6 +47,7 @@ import info.nightscout.androidaps.Services.Intents;
|
||||||
import info.nightscout.androidaps.db.BgReading;
|
import info.nightscout.androidaps.db.BgReading;
|
||||||
import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
|
import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
|
||||||
import info.nightscout.client.data.DbLogger;
|
import info.nightscout.client.data.DbLogger;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
@ -513,7 +514,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
||||||
builder.setMessage(confirmText);
|
builder.setMessage(confirmText);
|
||||||
builder.setPositiveButton(getContext().getString(R.string.ok), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getContext().getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(data);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setNegativeButton(getContext().getString(R.string.cancel), null);
|
builder.setNegativeButton(getContext().getString(R.string.cancel), null);
|
||||||
|
|
|
@ -20,48 +20,29 @@ import android.widget.ListAdapter;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.squareup.otto.Subscribe;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
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.Services.Intents;
|
|
||||||
import info.nightscout.androidaps.data.PumpEnactResult;
|
|
||||||
import info.nightscout.androidaps.db.TempBasal;
|
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
|
||||||
import info.nightscout.androidaps.events.EventNewBG;
|
|
||||||
import info.nightscout.androidaps.events.EventRefreshGui;
|
import info.nightscout.androidaps.events.EventRefreshGui;
|
||||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
import info.nightscout.androidaps.interfaces.APSInterface;
|
||||||
import info.nightscout.androidaps.events.EventTreatmentChange;
|
|
||||||
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
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.DanaR.events.EventDanaRBolusProgress;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.APSResult;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.DeviceStatus;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
||||||
import info.nightscout.androidaps.plugins.OpenAPSMA.DetermineBasalResult;
|
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
|
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
|
|
||||||
import info.nightscout.client.data.DbLogger;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.DateUtil;
|
|
||||||
|
|
||||||
public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpInterface, ConstraintsInterface {
|
|
||||||
private static Logger log = LoggerFactory.getLogger(ConfigBuilderFragment.class);
|
public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
||||||
|
|
||||||
|
static ConfigBuilderPlugin configBuilderPlugin = new ConfigBuilderPlugin();
|
||||||
|
|
||||||
|
static public ConfigBuilderPlugin getPlugin() {
|
||||||
|
return configBuilderPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
ListView bgsourceListView;
|
ListView bgsourceListView;
|
||||||
ListView pumpListView;
|
ListView pumpListView;
|
||||||
|
@ -88,49 +69,9 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
PluginCustomAdapter generalDataAdapter = null;
|
PluginCustomAdapter generalDataAdapter = null;
|
||||||
|
|
||||||
|
|
||||||
BgSourceInterface activeBgSource;
|
|
||||||
PumpInterface activePump;
|
|
||||||
ProfileInterface activeProfile;
|
|
||||||
TreatmentsInterface activeTreatments;
|
|
||||||
TempBasalsInterface activeTempBasals;
|
|
||||||
LoopFragment activeLoop;
|
|
||||||
|
|
||||||
public String nightscoutVersionName = "";
|
|
||||||
public Integer nightscoutVersionCode = 0;
|
|
||||||
public String nsClientVersionName = "";
|
|
||||||
public Integer nsClientVersionCode = 0;
|
|
||||||
|
|
||||||
ArrayList<PluginBase> pluginList;
|
|
||||||
|
|
||||||
Date lastDeviceStatusUpload = new Date(0);
|
|
||||||
|
|
||||||
// TODO: sorting
|
// TODO: sorting
|
||||||
// TODO: Toast and sound when command failed
|
// TODO: Toast and sound when command failed
|
||||||
|
|
||||||
public ConfigBuilderFragment() {
|
|
||||||
super();
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initialize() {
|
|
||||||
pluginList = MainApp.getPluginsList();
|
|
||||||
loadSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void registerBus() {
|
|
||||||
try {
|
|
||||||
MainApp.bus().unregister(this);
|
|
||||||
} catch (RuntimeException x) {
|
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
@ -149,10 +90,10 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
nsclientVerView = (TextView) view.findViewById(R.id.configbuilder_nsclientversion);
|
nsclientVerView = (TextView) view.findViewById(R.id.configbuilder_nsclientversion);
|
||||||
nightscoutVerView = (TextView) view.findViewById(R.id.configbuilder_nightscoutversion);
|
nightscoutVerView = (TextView) view.findViewById(R.id.configbuilder_nightscoutversion);
|
||||||
|
|
||||||
nsclientVerView.setText(nsClientVersionName);
|
nsclientVerView.setText(ConfigBuilderPlugin.nsClientVersionName);
|
||||||
nightscoutVerView.setText(nightscoutVersionName);
|
nightscoutVerView.setText(ConfigBuilderPlugin.nightscoutVersionName);
|
||||||
if (nsClientVersionCode < 117) nsclientVerView.setTextColor(Color.RED);
|
if (ConfigBuilderPlugin.nsClientVersionCode < 117) nsclientVerView.setTextColor(Color.RED);
|
||||||
if (nightscoutVersionCode < 900) nightscoutVerView.setTextColor(Color.RED);
|
if (ConfigBuilderPlugin.nightscoutVersionCode < 900) nightscoutVerView.setTextColor(Color.RED);
|
||||||
setViews();
|
setViews();
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
@ -192,340 +133,6 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* PluginBase interface
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.GENERAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.configbuilder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
// Always enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
// Always visible
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ConfigBuilderFragment newInstance() {
|
|
||||||
return new ConfigBuilderFragment();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pump interface
|
|
||||||
*
|
|
||||||
* Config builder return itself as a pump and check constraints before it passes command to pump driver
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean isTempBasalInProgress() {
|
|
||||||
return activePump.isTempBasalInProgress();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isExtendedBoluslInProgress() {
|
|
||||||
return activePump.isExtendedBoluslInProgress();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setNewBasalProfile(NSProfile profile) {
|
|
||||||
activePump.setNewBasalProfile(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBaseBasalRate() {
|
|
||||||
return activePump.getBaseBasalRate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalAbsoluteRate() {
|
|
||||||
return activePump.getTempBasalAbsoluteRate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalRemainingMinutes() {
|
|
||||||
return activePump.getTempBasalRemainingMinutes();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal(Date time) {
|
|
||||||
return activePump.getTempBasal(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal() {
|
|
||||||
return activePump.getTempBasal();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getExtendedBolus() {
|
|
||||||
return activePump.getExtendedBolus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
{
|
|
||||||
"_id": {
|
|
||||||
"$oid": "5789fea07ef0c37deb388240"
|
|
||||||
},
|
|
||||||
"boluscalc": {
|
|
||||||
"profile": "Posunuta snidane",
|
|
||||||
"eventTime": "2016-07-16T09:30:14.139Z",
|
|
||||||
"targetBGLow": "5.6",
|
|
||||||
"targetBGHigh": "5.6",
|
|
||||||
"isf": "17",
|
|
||||||
"ic": "26",
|
|
||||||
"iob": "0.89",
|
|
||||||
"cob": "0",
|
|
||||||
"insulincob": "0",
|
|
||||||
"bg": "3.6",
|
|
||||||
"insulinbg": "-0.12",
|
|
||||||
"bgdiff": "-2",
|
|
||||||
"carbs": "42",
|
|
||||||
"gi": "2",
|
|
||||||
"insulincarbs": "1.62",
|
|
||||||
"othercorrection": "0",
|
|
||||||
"insulin": "0.6000000000000001",
|
|
||||||
"roundingcorrection": "-0.009999999999999898",
|
|
||||||
"carbsneeded": "0"
|
|
||||||
},
|
|
||||||
"enteredBy": "",
|
|
||||||
"eventType": "Bolus Wizard",
|
|
||||||
"glucose": 3.6,
|
|
||||||
"glucoseType": "Sensor",
|
|
||||||
"units": "mmol",
|
|
||||||
"carbs": 42,
|
|
||||||
"insulin": 0.6,
|
|
||||||
"created_at": "2016-07-16T09:30:12.783Z"
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
public PumpEnactResult deliverTreatmentFromBolusWizard(Context context, Double insulin, Integer carbs, Double glucose, String glucoseType, int carbTime, JSONObject boluscalc) {
|
|
||||||
insulin = applyBolusConstraints(insulin);
|
|
||||||
carbs = applyCarbsConstraints(carbs);
|
|
||||||
|
|
||||||
PumpEnactResult result = activePump.deliverTreatment(insulin, carbs, context);
|
|
||||||
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("deliverTreatmentFromBolusWizard insulin: " + insulin + " carbs: " + carbs + " success: " + result.success + " enacted: " + result.enacted + " bolusDelivered: " + result.bolusDelivered);
|
|
||||||
|
|
||||||
if (result.success) {
|
|
||||||
Treatment t = new Treatment();
|
|
||||||
t.insulin = result.bolusDelivered;
|
|
||||||
t.carbs = (double) result.carbsDelivered;
|
|
||||||
t.created_at = new Date();
|
|
||||||
try {
|
|
||||||
MainApp.getDbHelper().getDaoTreatments().create(t);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
t.setTimeIndex(t.getTimeIndex());
|
|
||||||
uploadBolusWizardRecord(t, glucose, glucoseType, carbTime, boluscalc);
|
|
||||||
MainApp.bus().post(new EventTreatmentChange());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
|
||||||
insulin = applyBolusConstraints(insulin);
|
|
||||||
carbs = applyCarbsConstraints(carbs);
|
|
||||||
|
|
||||||
BolusProgressDialog bolusProgressDialog = null;
|
|
||||||
if (context != null) {
|
|
||||||
bolusProgressDialog = new BolusProgressDialog(insulin);
|
|
||||||
bolusProgressDialog.show(((AppCompatActivity) context).getSupportFragmentManager(), "BolusProgress");
|
|
||||||
}
|
|
||||||
|
|
||||||
PumpEnactResult result = activePump.deliverTreatment(insulin, carbs, context);
|
|
||||||
|
|
||||||
if (bolusProgressDialog != null) {
|
|
||||||
bolusProgressDialog.dismiss();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("deliverTreatment insulin: " + insulin + " carbs: " + carbs + " success: " + result.success + " enacted: " + result.enacted + " bolusDelivered: " + result.bolusDelivered);
|
|
||||||
|
|
||||||
if (result.success) {
|
|
||||||
Treatment t = new Treatment();
|
|
||||||
t.insulin = result.bolusDelivered;
|
|
||||||
t.carbs = (double) result.carbsDelivered;
|
|
||||||
t.created_at = new Date();
|
|
||||||
try {
|
|
||||||
MainApp.getDbHelper().getDaoTreatments().create(t);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
t.setTimeIndex(t.getTimeIndex());
|
|
||||||
t.sendToNSClient();
|
|
||||||
MainApp.bus().post(new EventTreatmentChange());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stopBolusDelivering() {
|
|
||||||
activePump.stopBolusDelivering();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* apply constraints, set temp based on absolute valus and expecting absolute result
|
|
||||||
*
|
|
||||||
* @param absoluteRate
|
|
||||||
* @param durationInMinutes
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
|
||||||
Double rateAfterConstraints = applyBasalConstraints(absoluteRate);
|
|
||||||
PumpEnactResult result = activePump.setTempBasalAbsolute(rateAfterConstraints, durationInMinutes);
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("setTempBasalAbsolute rate: " + rateAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted);
|
|
||||||
if (result.enacted && result.success) {
|
|
||||||
if (result.isPercent) {
|
|
||||||
uploadTempBasalStartPercent(result.percent, result.duration);
|
|
||||||
} else {
|
|
||||||
uploadTempBasalStartAbsolute(result.absolute, result.duration);
|
|
||||||
}
|
|
||||||
MainApp.bus().post(new EventTempBasalChange());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* apply constraints, set temp based on percent and expecting result in percent
|
|
||||||
*
|
|
||||||
* @param percent 0 ... 100 ...
|
|
||||||
* @param durationInMinutes
|
|
||||||
* @return result
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
|
||||||
Integer percentAfterConstraints = applyBasalConstraints(percent);
|
|
||||||
PumpEnactResult result = activePump.setTempBasalPercent(percentAfterConstraints, durationInMinutes);
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("setTempBasalPercent percent: " + percentAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted);
|
|
||||||
if (result.enacted && result.success) {
|
|
||||||
uploadTempBasalStartPercent(result.percent, result.duration);
|
|
||||||
MainApp.bus().post(new EventTempBasalChange());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
|
||||||
Double rateAfterConstraints = applyBolusConstraints(insulin);
|
|
||||||
PumpEnactResult result = activePump.setExtendedBolus(rateAfterConstraints, durationInMinutes);
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("setExtendedBolus rate: " + rateAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted);
|
|
||||||
if (result.enacted && result.success) {
|
|
||||||
uploadExtendedBolus(result.bolusDelivered, result.duration);
|
|
||||||
MainApp.bus().post(new EventTreatmentChange());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelTempBasal() {
|
|
||||||
PumpEnactResult result = activePump.cancelTempBasal();
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("cancelTempBasal success: " + result.success + " enacted: " + result.enacted);
|
|
||||||
if (result.enacted && result.success) {
|
|
||||||
uploadTempBasalEnd();
|
|
||||||
MainApp.bus().post(new EventTempBasalChange());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelExtendedBolus() {
|
|
||||||
PumpEnactResult result = activePump.cancelExtendedBolus();
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("cancelExtendedBolus success: " + result.success + " enacted: " + result.enacted);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* expect absolute request and allow both absolute and percent response based on pump capabilities
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public PumpEnactResult applyAPSRequest(APSResult request) {
|
|
||||||
request.rate = applyBasalConstraints(request.rate);
|
|
||||||
PumpEnactResult result;
|
|
||||||
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("applyAPSRequest: " + request.toString());
|
|
||||||
if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - getBaseBasalRate()) < 0.1) {
|
|
||||||
if (isTempBasalInProgress()) {
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("applyAPSRequest: cancelTempBasal()");
|
|
||||||
result = cancelTempBasal();
|
|
||||||
} else {
|
|
||||||
result = new PumpEnactResult();
|
|
||||||
result.absolute = request.rate;
|
|
||||||
result.duration = 0;
|
|
||||||
result.enacted = false;
|
|
||||||
result.comment = "Basal set correctly";
|
|
||||||
result.success = true;
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("applyAPSRequest: Basal set correctly");
|
|
||||||
}
|
|
||||||
} else if (isTempBasalInProgress() && Math.abs(request.rate - getTempBasalAbsoluteRate()) < 0.1) {
|
|
||||||
result = new PumpEnactResult();
|
|
||||||
result.absolute = getTempBasalAbsoluteRate();
|
|
||||||
result.duration = activePump.getTempBasal().getPlannedRemainingMinutes();
|
|
||||||
result.enacted = false;
|
|
||||||
result.comment = "Temp basal set correctly";
|
|
||||||
result.success = true;
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("applyAPSRequest: Temp basal set correctly");
|
|
||||||
} else {
|
|
||||||
if (Config.logCongigBuilderActions)
|
|
||||||
log.debug("applyAPSRequest: setTempBasalAbsolute()");
|
|
||||||
result = setTempBasalAbsolute(request.rate, request.duration);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public JSONObject getJSONStatus() {
|
|
||||||
if (activePump != null)
|
|
||||||
return activePump.getJSONStatus();
|
|
||||||
else return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deviceID() {
|
|
||||||
if (activePump != null)
|
|
||||||
return activePump.deviceID();
|
|
||||||
else return "Unknown";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ConfigBuilderFragment code
|
* ConfigBuilderFragment code
|
||||||
*/
|
*/
|
||||||
|
@ -570,7 +177,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
plugin.setFragmentEnabled(type, cb.isChecked());
|
plugin.setFragmentEnabled(type, cb.isChecked());
|
||||||
plugin.setFragmentVisible(type, cb.isChecked());
|
plugin.setFragmentVisible(type, cb.isChecked());
|
||||||
onEnabledCategoryChanged(plugin, type);
|
onEnabledCategoryChanged(plugin, type);
|
||||||
storeSettings();
|
configBuilderPlugin.storeSettings();
|
||||||
MainApp.bus().post(new EventRefreshGui());
|
MainApp.bus().post(new EventRefreshGui());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -580,7 +187,7 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
CheckBox cb = (CheckBox) v;
|
CheckBox cb = (CheckBox) v;
|
||||||
PluginBase plugin = (PluginBase) cb.getTag();
|
PluginBase plugin = (PluginBase) cb.getTag();
|
||||||
plugin.setFragmentVisible(type, cb.isChecked());
|
plugin.setFragmentVisible(type, cb.isChecked());
|
||||||
storeSettings();
|
configBuilderPlugin.storeSettings();
|
||||||
MainApp.bus().post(new EventRefreshGui());
|
MainApp.bus().post(new EventRefreshGui());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -627,42 +234,19 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BgSourceInterface getActiveBgSource() {
|
|
||||||
return activeBgSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PumpInterface getActivePump() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public ProfileInterface getActiveProfile() {
|
|
||||||
return activeProfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TreatmentsInterface getActiveTreatments() {
|
|
||||||
return activeTreatments;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TempBasalsInterface getActiveTempBasals() {
|
|
||||||
return activeTempBasals;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LoopFragment getActiveLoop() {
|
|
||||||
return activeLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
void onEnabledCategoryChanged(PluginBase changedPlugin, int type) {
|
void onEnabledCategoryChanged(PluginBase changedPlugin, int type) {
|
||||||
int category = changedPlugin.getType();
|
int category = changedPlugin.getType();
|
||||||
ArrayList<PluginBase> pluginsInCategory = null;
|
ArrayList<PluginBase> pluginsInCategory = null;
|
||||||
switch (category) {
|
switch (category) {
|
||||||
// Multiple selection allowed
|
// Multiple selection allowed
|
||||||
case PluginBase.APS:
|
|
||||||
case PluginBase.GENERAL:
|
case PluginBase.GENERAL:
|
||||||
case PluginBase.CONSTRAINTS:
|
case PluginBase.CONSTRAINTS:
|
||||||
case PluginBase.LOOP:
|
case PluginBase.LOOP:
|
||||||
break;
|
break;
|
||||||
// Single selection allowed
|
// Single selection allowed
|
||||||
|
case PluginBase.APS:
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(APSInterface.class);
|
||||||
|
break;
|
||||||
case PluginBase.PROFILE:
|
case PluginBase.PROFILE:
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(ProfileInterface.class);
|
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(ProfileInterface.class);
|
||||||
break;
|
break;
|
||||||
|
@ -693,132 +277,6 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verifySelectionInCategories() {
|
|
||||||
ArrayList<PluginBase> pluginsInCategory;
|
|
||||||
|
|
||||||
// PluginBase.PROFILE
|
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(ProfileInterface.class);
|
|
||||||
activeProfile = (ProfileInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.PROFILE);
|
|
||||||
if (Config.logConfigBuilder)
|
|
||||||
log.debug("Selected profile interface: " + ((PluginBase) activeProfile).getName());
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (!p.getName().equals(((PluginBase) activeProfile).getName())) {
|
|
||||||
p.setFragmentVisible(PluginBase.PROFILE, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginBase.BGSOURCE
|
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(BgSourceInterface.class);
|
|
||||||
activeBgSource = (BgSourceInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.BGSOURCE);
|
|
||||||
if (Config.logConfigBuilder)
|
|
||||||
log.debug("Selected bgSource interface: " + ((PluginBase) activeBgSource).getName());
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (!p.getName().equals(((PluginBase) activeBgSource).getName())) {
|
|
||||||
p.setFragmentVisible(PluginBase.BGSOURCE, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginBase.PUMP
|
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.PUMP);
|
|
||||||
activePump = (PumpInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.PUMP);
|
|
||||||
if (Config.logConfigBuilder)
|
|
||||||
log.debug("Selected pump interface: " + ((PluginBase) activePump).getName());
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (!p.getName().equals(((PluginBase) activePump).getName())) {
|
|
||||||
p.setFragmentVisible(PluginBase.PUMP, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginBase.LOOP
|
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.LOOP);
|
|
||||||
activeLoop = (LoopFragment) getTheOneEnabledInArray(pluginsInCategory, PluginBase.LOOP);
|
|
||||||
if (activeLoop != null) {
|
|
||||||
if (Config.logConfigBuilder)
|
|
||||||
log.debug("Selected loop interface: " + activeLoop.getName());
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (!p.getName().equals(activeLoop.getName())) {
|
|
||||||
p.setFragmentVisible(PluginBase.LOOP, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginBase.TEMPBASAL
|
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.TEMPBASAL);
|
|
||||||
activeTempBasals = (TempBasalsInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.TEMPBASAL);
|
|
||||||
if (Config.logConfigBuilder)
|
|
||||||
log.debug("Selected tempbasal interface: " + ((PluginBase) activeTempBasals).getName());
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (!p.getName().equals(((PluginBase) activeTempBasals).getName())) {
|
|
||||||
p.setFragmentVisible(PluginBase.TEMPBASAL, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginBase.TREATMENT
|
|
||||||
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.TREATMENT);
|
|
||||||
activeTreatments = (TreatmentsInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.TREATMENT);
|
|
||||||
if (Config.logConfigBuilder)
|
|
||||||
log.debug("Selected treatment interface: " + ((PluginBase) activeTreatments).getName());
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (!p.getName().equals(((PluginBase) activeTreatments).getName())) {
|
|
||||||
p.setFragmentVisible(PluginBase.TREATMENT, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private PluginBase getTheOneEnabledInArray(ArrayList<PluginBase> pluginsInCategory, int type) {
|
|
||||||
PluginBase found = null;
|
|
||||||
for (PluginBase p : pluginsInCategory) {
|
|
||||||
if (p.isEnabled(type) && found == null) {
|
|
||||||
found = p;
|
|
||||||
} else if (p.isEnabled(type)) {
|
|
||||||
// set others disabled
|
|
||||||
p.setFragmentEnabled(type, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If none enabled, enable first one
|
|
||||||
if (found == null && pluginsInCategory.size() > 0)
|
|
||||||
found = pluginsInCategory.get(0);
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void storeSettings() {
|
|
||||||
if (pluginList != null) {
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Storing settings");
|
|
||||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
SharedPreferences.Editor editor = settings.edit();
|
|
||||||
|
|
||||||
for (int type = 1; type < PluginBase.LAST; type++) {
|
|
||||||
for (PluginBase p : pluginList) {
|
|
||||||
String settingEnabled = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Enabled";
|
|
||||||
String settingVisible = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Visible";
|
|
||||||
editor.putBoolean(settingEnabled, p.isEnabled(type));
|
|
||||||
editor.putBoolean(settingVisible, p.isVisibleInTabs(type));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
editor.apply();
|
|
||||||
verifySelectionInCategories();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadSettings() {
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Loading stored settings");
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
for (int type = 1; type < PluginBase.LAST; type++) {
|
|
||||||
for (PluginBase p : pluginList) {
|
|
||||||
String settingEnabled = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Enabled";
|
|
||||||
String settingVisible = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Visible";
|
|
||||||
if (SP.contains(settingEnabled))
|
|
||||||
p.setFragmentEnabled(type, SP.getBoolean(settingEnabled, true));
|
|
||||||
if (SP.contains(settingVisible))
|
|
||||||
p.setFragmentVisible(type, SP.getBoolean(settingVisible, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
verifySelectionInCategories();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****
|
/****
|
||||||
* Method for Setting the Height of the ListView dynamically.
|
* Method for Setting the Height of the ListView dynamically.
|
||||||
* *** Hack to fix the issue of not showing all the items of the ListView
|
* *** Hack to fix the issue of not showing all the items of the ListView
|
||||||
|
@ -845,323 +303,4 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
|
||||||
listView.setLayoutParams(params);
|
listView.setLayoutParams(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constraints interface
|
|
||||||
**/
|
|
||||||
@Override
|
|
||||||
public boolean isLoopEnabled() {
|
|
||||||
boolean result = true;
|
|
||||||
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
result = result && constrain.isLoopEnabled();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isClosedModeEnabled() {
|
|
||||||
boolean result = true;
|
|
||||||
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
result = result && constrain.isClosedModeEnabled();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAutosensModeEnabled() {
|
|
||||||
boolean result = true;
|
|
||||||
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
result = result && constrain.isAutosensModeEnabled();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAMAModeEnabled() {
|
|
||||||
boolean result = true;
|
|
||||||
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
result = result && constrain.isAMAModeEnabled();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyBasalConstraints(Double absoluteRate) {
|
|
||||||
Double rateAfterConstrain = absoluteRate;
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
rateAfterConstrain = Math.min(constrain.applyBasalConstraints(absoluteRate), rateAfterConstrain);
|
|
||||||
}
|
|
||||||
return rateAfterConstrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyBasalConstraints(Integer percentRate) {
|
|
||||||
Integer rateAfterConstrain = percentRate;
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
rateAfterConstrain = Math.min(constrain.applyBasalConstraints(percentRate), rateAfterConstrain);
|
|
||||||
}
|
|
||||||
return rateAfterConstrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyBolusConstraints(Double insulin) {
|
|
||||||
Double insulinAfterConstrain = insulin;
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
insulinAfterConstrain = Math.min(constrain.applyBolusConstraints(insulin), insulinAfterConstrain);
|
|
||||||
}
|
|
||||||
return insulinAfterConstrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyCarbsConstraints(Integer carbs) {
|
|
||||||
Integer carbsAfterConstrain = carbs;
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
carbsAfterConstrain = Math.min(constrain.applyCarbsConstraints(carbs), carbsAfterConstrain);
|
|
||||||
}
|
|
||||||
return carbsAfterConstrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyMaxIOBConstraints(Double maxIob) {
|
|
||||||
Double maxIobAfterConstrain = maxIob;
|
|
||||||
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
|
||||||
for (PluginBase p : constraintsPlugins) {
|
|
||||||
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
|
||||||
maxIobAfterConstrain = Math.min(constrain.applyMaxIOBConstraints(maxIob), maxIobAfterConstrain);
|
|
||||||
}
|
|
||||||
return maxIobAfterConstrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void onStatusEvent(final EventNewBG ev) {
|
|
||||||
// Give some time to Loop
|
|
||||||
try {
|
|
||||||
Thread.sleep(120 * 1000L);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
// if status not uploaded, upload pump status only
|
|
||||||
if (new Date().getTime() - lastDeviceStatusUpload.getTime() > 120 * 1000L) {
|
|
||||||
uploadDeviceStatus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void uploadTempBasalStartAbsolute(Double absolute, double durationInMinutes) {
|
|
||||||
try {
|
|
||||||
Context context = MainApp.instance().getApplicationContext();
|
|
||||||
JSONObject data = new JSONObject();
|
|
||||||
data.put("eventType", "Temp Basal");
|
|
||||||
data.put("duration", durationInMinutes);
|
|
||||||
data.put("absolute", absolute);
|
|
||||||
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);
|
|
||||||
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void uploadTempBasalStartPercent(Integer percent, double durationInMinutes) {
|
|
||||||
try {
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
boolean useAbsolute = SP.getBoolean("ns_sync_use_absolute", false);
|
|
||||||
if (useAbsolute) {
|
|
||||||
double absolute = MainApp.getConfigBuilder().getActivePump().getBaseBasalRate() * percent / 100d;
|
|
||||||
uploadTempBasalStartAbsolute(absolute, durationInMinutes);
|
|
||||||
} else {
|
|
||||||
Context context = MainApp.instance().getApplicationContext();
|
|
||||||
JSONObject data = new JSONObject();
|
|
||||||
data.put("eventType", "Temp Basal");
|
|
||||||
data.put("duration", durationInMinutes);
|
|
||||||
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);
|
|
||||||
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void uploadExtendedBolus(Double insulin, double durationInMinutes) {
|
|
||||||
try {
|
|
||||||
Context context = MainApp.instance().getApplicationContext();
|
|
||||||
JSONObject data = new JSONObject();
|
|
||||||
data.put("eventType", "Combo Bolus");
|
|
||||||
data.put("duration", durationInMinutes);
|
|
||||||
data.put("splitNow", 0);
|
|
||||||
data.put("splitExt", 100);
|
|
||||||
data.put("enteredinsulin", insulin);
|
|
||||||
data.put("relative", insulin);
|
|
||||||
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);
|
|
||||||
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void uploadDeviceStatus() {
|
|
||||||
DeviceStatus deviceStatus = new DeviceStatus();
|
|
||||||
try {
|
|
||||||
LoopFragment.LastRun lastRun = LoopFragment.lastRun;
|
|
||||||
if (lastRun != null && lastRun.lastAPSRun.getTime() > new Date().getTime() - 60 * 1000L) {
|
|
||||||
// do not send if result is older than 1 min
|
|
||||||
APSResult apsResult = lastRun.request;
|
|
||||||
apsResult.json().put("timestamp", DateUtil.toISOString(lastRun.lastAPSRun));
|
|
||||||
deviceStatus.suggested = apsResult.json();
|
|
||||||
|
|
||||||
if (lastRun.request instanceof DetermineBasalResult) {
|
|
||||||
DetermineBasalResult result = (DetermineBasalResult) lastRun.request;
|
|
||||||
deviceStatus.iob = result.iob.json();
|
|
||||||
deviceStatus.iob.put("time", DateUtil.toISOString(lastRun.lastAPSRun));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastRun.setByPump != null && lastRun.setByPump.enacted) { // enacted
|
|
||||||
deviceStatus.enacted = lastRun.request.json();
|
|
||||||
deviceStatus.enacted.put("rate", lastRun.setByPump.json().get("rate"));
|
|
||||||
deviceStatus.enacted.put("duration", lastRun.setByPump.json().get("duration"));
|
|
||||||
deviceStatus.enacted.put("recieved", true);
|
|
||||||
JSONObject requested = new JSONObject();
|
|
||||||
requested.put("duration", lastRun.request.duration);
|
|
||||||
requested.put("rate", lastRun.request.rate);
|
|
||||||
requested.put("temp", "absolute");
|
|
||||||
deviceStatus.enacted.put("requested", requested);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (getActivePump() != null) {
|
|
||||||
deviceStatus.device = "openaps://" + getActivePump().deviceID();
|
|
||||||
deviceStatus.pump = getActivePump().getJSONStatus();
|
|
||||||
|
|
||||||
deviceStatus.created_at = DateUtil.toISOString(new Date());
|
|
||||||
|
|
||||||
deviceStatus.sendToNSClient();
|
|
||||||
lastDeviceStatusUpload = new Date();
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void uploadBolusWizardRecord(Treatment t, double glucose, String glucoseType, int carbTime, JSONObject boluscalc) {
|
|
||||||
JSONObject data = new JSONObject();
|
|
||||||
try {
|
|
||||||
data.put("eventType", "Bolus Wizard");
|
|
||||||
if (t.insulin != 0d) data.put("insulin", t.insulin);
|
|
||||||
if (t.carbs != 0d) data.put("carbs", t.carbs.intValue());
|
|
||||||
data.put("created_at", DateUtil.toISOString(t.created_at));
|
|
||||||
data.put("timeIndex", t.timeIndex);
|
|
||||||
if (glucose != 0d) data.put("glucose", glucose);
|
|
||||||
data.put("glucoseType", glucoseType);
|
|
||||||
data.put("boluscalc", boluscalc);
|
|
||||||
if (carbTime != 0) data.put("preBolus", carbTime);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
uploadCareportalEntryToNS(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void uploadCareportalEntryToNS(JSONObject data) {
|
|
||||||
try {
|
|
||||||
if (data.has("preBolus") && data.has("carbs")) {
|
|
||||||
JSONObject prebolus = new JSONObject();
|
|
||||||
prebolus.put("carbs", data.get("carbs"));
|
|
||||||
data.remove("carbs");
|
|
||||||
prebolus.put("eventType", data.get("eventType"));
|
|
||||||
if (data.has("enteredBy")) prebolus.put("enteredBy", data.get("enteredBy"));
|
|
||||||
if (data.has("notes")) prebolus.put("notes", data.get("notes"));
|
|
||||||
long mills = DateUtil.fromISODateString(data.getString("created_at")).getTime();
|
|
||||||
Date preBolusDate = new Date(mills + data.getInt("preBolus") * 60000L);
|
|
||||||
prebolus.put("created_at", DateUtil.toISOString(preBolusDate));
|
|
||||||
uploadCareportalEntryToNS(prebolus);
|
|
||||||
}
|
|
||||||
Context context = MainApp.instance().getApplicationContext();
|
|
||||||
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);
|
|
||||||
DbLogger.dbAdd(intent, data.toString(), NewExtendedBolusDialog.class);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,858 @@
|
||||||
|
package info.nightscout.androidaps.plugins.ConfigBuilder;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.Services.Intents;
|
||||||
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
|
import info.nightscout.androidaps.events.EventNewBG;
|
||||||
|
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||||
|
import info.nightscout.androidaps.events.EventTreatmentChange;
|
||||||
|
import info.nightscout.androidaps.interfaces.APSInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.TempBasalsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.APSResult;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.DeviceStatus;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSMA.DetermineBasalResult;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
|
||||||
|
import info.nightscout.client.data.DbLogger;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
import info.nightscout.utils.DateUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class ConfigBuilderPlugin implements PluginBase, PumpInterface, ConstraintsInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(ConfigBuilderPlugin.class);
|
||||||
|
|
||||||
|
static BgSourceInterface activeBgSource;
|
||||||
|
static PumpInterface activePump;
|
||||||
|
static ProfileInterface activeProfile;
|
||||||
|
static TreatmentsInterface activeTreatments;
|
||||||
|
static TempBasalsInterface activeTempBasals;
|
||||||
|
static APSInterface activeAPS;
|
||||||
|
static LoopPlugin activeLoop;
|
||||||
|
|
||||||
|
static public String nightscoutVersionName = "";
|
||||||
|
static public Integer nightscoutVersionCode = 0;
|
||||||
|
static public String nsClientVersionName = "";
|
||||||
|
static public Integer nsClientVersionCode = 0;
|
||||||
|
|
||||||
|
static ArrayList<PluginBase> pluginList;
|
||||||
|
|
||||||
|
static Date lastDeviceStatusUpload = new Date(0);
|
||||||
|
|
||||||
|
public ConfigBuilderPlugin() {
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return ConfigBuilderFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.configbuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
// Always enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
// Always visible
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize() {
|
||||||
|
pluginList = MainApp.getPluginsList();
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void storeSettings() {
|
||||||
|
if (pluginList != null) {
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Storing settings");
|
||||||
|
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
SharedPreferences.Editor editor = settings.edit();
|
||||||
|
|
||||||
|
for (int type = 1; type < PluginBase.LAST; type++) {
|
||||||
|
for (PluginBase p : pluginList) {
|
||||||
|
String settingEnabled = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Enabled";
|
||||||
|
String settingVisible = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Visible";
|
||||||
|
editor.putBoolean(settingEnabled, p.isEnabled(type));
|
||||||
|
editor.putBoolean(settingVisible, p.isVisibleInTabs(type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
editor.apply();
|
||||||
|
verifySelectionInCategories();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadSettings() {
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Loading stored settings");
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
for (int type = 1; type < PluginBase.LAST; type++) {
|
||||||
|
for (PluginBase p : pluginList) {
|
||||||
|
String settingEnabled = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Enabled";
|
||||||
|
String settingVisible = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Visible";
|
||||||
|
if (SP.contains(settingEnabled))
|
||||||
|
p.setFragmentEnabled(type, SP.getBoolean(settingEnabled, true));
|
||||||
|
if (SP.contains(settingVisible))
|
||||||
|
p.setFragmentVisible(type, SP.getBoolean(settingVisible, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verifySelectionInCategories();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BgSourceInterface getActiveBgSource() {
|
||||||
|
return activeBgSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static ProfileInterface getActiveProfile() {
|
||||||
|
return activeProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TreatmentsInterface getActiveTreatments() {
|
||||||
|
return activeTreatments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TempBasalsInterface getActiveTempBasals() {
|
||||||
|
return activeTempBasals;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static APSInterface getActiveAPS() {
|
||||||
|
return activeAPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LoopPlugin getActiveLoop() {
|
||||||
|
return activeLoop;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifySelectionInCategories() {
|
||||||
|
ArrayList<PluginBase> pluginsInCategory;
|
||||||
|
|
||||||
|
// PluginBase.APS
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(APSInterface.class);
|
||||||
|
activeAPS = (APSInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.APS);
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected APS interface: " + ((PluginBase) activeAPS).getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(((PluginBase) activeAPS).getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.APS, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginBase.PROFILE
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(ProfileInterface.class);
|
||||||
|
activeProfile = (ProfileInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.PROFILE);
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected profile interface: " + ((PluginBase) activeProfile).getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(((PluginBase) activeProfile).getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.PROFILE, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginBase.BGSOURCE
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(BgSourceInterface.class);
|
||||||
|
activeBgSource = (BgSourceInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.BGSOURCE);
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected bgSource interface: " + ((PluginBase) activeBgSource).getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(((PluginBase) activeBgSource).getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.BGSOURCE, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginBase.PUMP
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.PUMP);
|
||||||
|
activePump = (PumpInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.PUMP);
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected pump interface: " + ((PluginBase) activePump).getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(((PluginBase) activePump).getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.PUMP, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginBase.LOOP
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.LOOP);
|
||||||
|
activeLoop = (LoopPlugin) getTheOneEnabledInArray(pluginsInCategory, PluginBase.LOOP);
|
||||||
|
if (activeLoop != null) {
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected loop interface: " + activeLoop.getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(activeLoop.getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.LOOP, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginBase.TEMPBASAL
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.TEMPBASAL);
|
||||||
|
activeTempBasals = (TempBasalsInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.TEMPBASAL);
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected tempbasal interface: " + ((PluginBase) activeTempBasals).getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(((PluginBase) activeTempBasals).getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.TEMPBASAL, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginBase.TREATMENT
|
||||||
|
pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.TREATMENT);
|
||||||
|
activeTreatments = (TreatmentsInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.TREATMENT);
|
||||||
|
if (Config.logConfigBuilder)
|
||||||
|
log.debug("Selected treatment interface: " + ((PluginBase) activeTreatments).getName());
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (!p.getName().equals(((PluginBase) activeTreatments).getName())) {
|
||||||
|
p.setFragmentVisible(PluginBase.TREATMENT, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private PluginBase getTheOneEnabledInArray(ArrayList<PluginBase> pluginsInCategory, int type) {
|
||||||
|
PluginBase found = null;
|
||||||
|
for (PluginBase p : pluginsInCategory) {
|
||||||
|
if (p.isEnabled(type) && found == null) {
|
||||||
|
found = p;
|
||||||
|
} else if (p.isEnabled(type)) {
|
||||||
|
// set others disabled
|
||||||
|
p.setFragmentEnabled(type, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If none enabled, enable first one
|
||||||
|
if (found == null && pluginsInCategory.size() > 0)
|
||||||
|
found = pluginsInCategory.get(0);
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pump interface
|
||||||
|
*
|
||||||
|
* Config builder return itself as a pump and check constraints before it passes command to pump driver
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isTempBasalInProgress() {
|
||||||
|
return activePump.isTempBasalInProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExtendedBoluslInProgress() {
|
||||||
|
return activePump.isExtendedBoluslInProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNewBasalProfile(NSProfile profile) {
|
||||||
|
activePump.setNewBasalProfile(profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getBaseBasalRate() {
|
||||||
|
return activePump.getBaseBasalRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalAbsoluteRate() {
|
||||||
|
return activePump.getTempBasalAbsoluteRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalRemainingMinutes() {
|
||||||
|
return activePump.getTempBasalRemainingMinutes();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal(Date time) {
|
||||||
|
return activePump.getTempBasal(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal() {
|
||||||
|
return activePump.getTempBasal();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getExtendedBolus() {
|
||||||
|
return activePump.getExtendedBolus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PumpEnactResult deliverTreatmentFromBolusWizard(Context context, Double insulin, Integer carbs, Double glucose, String glucoseType, int carbTime, JSONObject boluscalc) {
|
||||||
|
insulin = applyBolusConstraints(insulin);
|
||||||
|
carbs = applyCarbsConstraints(carbs);
|
||||||
|
|
||||||
|
PumpEnactResult result = activePump.deliverTreatment(insulin, carbs, context);
|
||||||
|
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("deliverTreatmentFromBolusWizard insulin: " + insulin + " carbs: " + carbs + " success: " + result.success + " enacted: " + result.enacted + " bolusDelivered: " + result.bolusDelivered);
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
Treatment t = new Treatment();
|
||||||
|
t.insulin = result.bolusDelivered;
|
||||||
|
t.carbs = (double) result.carbsDelivered;
|
||||||
|
t.created_at = new Date();
|
||||||
|
try {
|
||||||
|
MainApp.getDbHelper().getDaoTreatments().create(t);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
t.setTimeIndex(t.getTimeIndex());
|
||||||
|
uploadBolusWizardRecord(t, glucose, glucoseType, carbTime, boluscalc);
|
||||||
|
MainApp.bus().post(new EventTreatmentChange());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
||||||
|
insulin = applyBolusConstraints(insulin);
|
||||||
|
carbs = applyCarbsConstraints(carbs);
|
||||||
|
|
||||||
|
BolusProgressDialog bolusProgressDialog = null;
|
||||||
|
if (context != null) {
|
||||||
|
bolusProgressDialog = new BolusProgressDialog(insulin);
|
||||||
|
bolusProgressDialog.show(((AppCompatActivity) context).getSupportFragmentManager(), "BolusProgress");
|
||||||
|
}
|
||||||
|
|
||||||
|
PumpEnactResult result = activePump.deliverTreatment(insulin, carbs, context);
|
||||||
|
|
||||||
|
if (bolusProgressDialog != null) {
|
||||||
|
bolusProgressDialog.dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("deliverTreatment insulin: " + insulin + " carbs: " + carbs + " success: " + result.success + " enacted: " + result.enacted + " bolusDelivered: " + result.bolusDelivered);
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
Treatment t = new Treatment();
|
||||||
|
t.insulin = result.bolusDelivered;
|
||||||
|
t.carbs = (double) result.carbsDelivered;
|
||||||
|
t.created_at = new Date();
|
||||||
|
try {
|
||||||
|
MainApp.getDbHelper().getDaoTreatments().create(t);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
t.setTimeIndex(t.getTimeIndex());
|
||||||
|
t.sendToNSClient();
|
||||||
|
MainApp.bus().post(new EventTreatmentChange());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopBolusDelivering() {
|
||||||
|
activePump.stopBolusDelivering();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* apply constraints, set temp based on absolute valus and expecting absolute result
|
||||||
|
*
|
||||||
|
* @param absoluteRate
|
||||||
|
* @param durationInMinutes
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
||||||
|
Double rateAfterConstraints = applyBasalConstraints(absoluteRate);
|
||||||
|
PumpEnactResult result = activePump.setTempBasalAbsolute(rateAfterConstraints, durationInMinutes);
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("setTempBasalAbsolute rate: " + rateAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted);
|
||||||
|
if (result.enacted && result.success) {
|
||||||
|
if (result.isPercent) {
|
||||||
|
uploadTempBasalStartPercent(result.percent, result.duration);
|
||||||
|
} else {
|
||||||
|
uploadTempBasalStartAbsolute(result.absolute, result.duration);
|
||||||
|
}
|
||||||
|
MainApp.bus().post(new EventTempBasalChange());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* apply constraints, set temp based on percent and expecting result in percent
|
||||||
|
*
|
||||||
|
* @param percent 0 ... 100 ...
|
||||||
|
* @param durationInMinutes
|
||||||
|
* @return result
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
||||||
|
Integer percentAfterConstraints = applyBasalConstraints(percent);
|
||||||
|
PumpEnactResult result = activePump.setTempBasalPercent(percentAfterConstraints, durationInMinutes);
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("setTempBasalPercent percent: " + percentAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted);
|
||||||
|
if (result.enacted && result.success) {
|
||||||
|
uploadTempBasalStartPercent(result.percent, result.duration);
|
||||||
|
MainApp.bus().post(new EventTempBasalChange());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
||||||
|
Double rateAfterConstraints = applyBolusConstraints(insulin);
|
||||||
|
PumpEnactResult result = activePump.setExtendedBolus(rateAfterConstraints, durationInMinutes);
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("setExtendedBolus rate: " + rateAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted);
|
||||||
|
if (result.enacted && result.success) {
|
||||||
|
uploadExtendedBolus(result.bolusDelivered, result.duration);
|
||||||
|
MainApp.bus().post(new EventTreatmentChange());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelTempBasal() {
|
||||||
|
PumpEnactResult result = activePump.cancelTempBasal();
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("cancelTempBasal success: " + result.success + " enacted: " + result.enacted);
|
||||||
|
if (result.enacted && result.success) {
|
||||||
|
uploadTempBasalEnd();
|
||||||
|
MainApp.bus().post(new EventTempBasalChange());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelExtendedBolus() {
|
||||||
|
PumpEnactResult result = activePump.cancelExtendedBolus();
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("cancelExtendedBolus success: " + result.success + " enacted: " + result.enacted);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* expect absolute request and allow both absolute and percent response based on pump capabilities
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public PumpEnactResult applyAPSRequest(APSResult request) {
|
||||||
|
request.rate = applyBasalConstraints(request.rate);
|
||||||
|
PumpEnactResult result;
|
||||||
|
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("applyAPSRequest: " + request.toString());
|
||||||
|
if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - getBaseBasalRate()) < 0.1) {
|
||||||
|
if (isTempBasalInProgress()) {
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("applyAPSRequest: cancelTempBasal()");
|
||||||
|
result = cancelTempBasal();
|
||||||
|
} else {
|
||||||
|
result = new PumpEnactResult();
|
||||||
|
result.absolute = request.rate;
|
||||||
|
result.duration = 0;
|
||||||
|
result.enacted = false;
|
||||||
|
result.comment = "Basal set correctly";
|
||||||
|
result.success = true;
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("applyAPSRequest: Basal set correctly");
|
||||||
|
}
|
||||||
|
} else if (isTempBasalInProgress() && Math.abs(request.rate - getTempBasalAbsoluteRate()) < 0.1) {
|
||||||
|
result = new PumpEnactResult();
|
||||||
|
result.absolute = getTempBasalAbsoluteRate();
|
||||||
|
result.duration = activePump.getTempBasal().getPlannedRemainingMinutes();
|
||||||
|
result.enacted = false;
|
||||||
|
result.comment = "Temp basal set correctly";
|
||||||
|
result.success = true;
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("applyAPSRequest: Temp basal set correctly");
|
||||||
|
} else {
|
||||||
|
if (Config.logCongigBuilderActions)
|
||||||
|
log.debug("applyAPSRequest: setTempBasalAbsolute()");
|
||||||
|
result = setTempBasalAbsolute(request.rate, request.duration);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public JSONObject getJSONStatus() {
|
||||||
|
if (activePump != null)
|
||||||
|
return activePump.getJSONStatus();
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String deviceID() {
|
||||||
|
if (activePump != null)
|
||||||
|
return activePump.deviceID();
|
||||||
|
else return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constraints interface
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public boolean isLoopEnabled() {
|
||||||
|
boolean result = true;
|
||||||
|
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
result = result && constrain.isLoopEnabled();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isClosedModeEnabled() {
|
||||||
|
boolean result = true;
|
||||||
|
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
result = result && constrain.isClosedModeEnabled();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAutosensModeEnabled() {
|
||||||
|
boolean result = true;
|
||||||
|
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
result = result && constrain.isAutosensModeEnabled();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAMAModeEnabled() {
|
||||||
|
boolean result = true;
|
||||||
|
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
result = result && constrain.isAMAModeEnabled();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyBasalConstraints(Double absoluteRate) {
|
||||||
|
Double rateAfterConstrain = absoluteRate;
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
rateAfterConstrain = Math.min(constrain.applyBasalConstraints(absoluteRate), rateAfterConstrain);
|
||||||
|
}
|
||||||
|
return rateAfterConstrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyBasalConstraints(Integer percentRate) {
|
||||||
|
Integer rateAfterConstrain = percentRate;
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
rateAfterConstrain = Math.min(constrain.applyBasalConstraints(percentRate), rateAfterConstrain);
|
||||||
|
}
|
||||||
|
return rateAfterConstrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyBolusConstraints(Double insulin) {
|
||||||
|
Double insulinAfterConstrain = insulin;
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
insulinAfterConstrain = Math.min(constrain.applyBolusConstraints(insulin), insulinAfterConstrain);
|
||||||
|
}
|
||||||
|
return insulinAfterConstrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyCarbsConstraints(Integer carbs) {
|
||||||
|
Integer carbsAfterConstrain = carbs;
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
carbsAfterConstrain = Math.min(constrain.applyCarbsConstraints(carbs), carbsAfterConstrain);
|
||||||
|
}
|
||||||
|
return carbsAfterConstrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyMaxIOBConstraints(Double maxIob) {
|
||||||
|
Double maxIobAfterConstrain = maxIob;
|
||||||
|
ArrayList<PluginBase> constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
|
||||||
|
for (PluginBase p : constraintsPlugins) {
|
||||||
|
ConstraintsInterface constrain = (ConstraintsInterface) p;
|
||||||
|
if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue;
|
||||||
|
maxIobAfterConstrain = Math.min(constrain.applyMaxIOBConstraints(maxIob), maxIobAfterConstrain);
|
||||||
|
}
|
||||||
|
return maxIobAfterConstrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventNewBG ev) {
|
||||||
|
// Give some time to Loop
|
||||||
|
try {
|
||||||
|
Thread.sleep(120 * 1000L);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
// if status not uploaded, upload pump status only
|
||||||
|
if (new Date().getTime() - lastDeviceStatusUpload.getTime() > 120 * 1000L) {
|
||||||
|
uploadDeviceStatus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uploadTempBasalStartAbsolute(Double absolute, double durationInMinutes) {
|
||||||
|
try {
|
||||||
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
|
JSONObject data = new JSONObject();
|
||||||
|
data.put("eventType", "Temp Basal");
|
||||||
|
data.put("duration", durationInMinutes);
|
||||||
|
data.put("absolute", absolute);
|
||||||
|
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);
|
||||||
|
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uploadTempBasalStartPercent(Integer percent, double durationInMinutes) {
|
||||||
|
try {
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
boolean useAbsolute = SP.getBoolean("ns_sync_use_absolute", false);
|
||||||
|
if (useAbsolute) {
|
||||||
|
double absolute = getBaseBasalRate() * percent / 100d;
|
||||||
|
uploadTempBasalStartAbsolute(absolute, durationInMinutes);
|
||||||
|
} else {
|
||||||
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
|
JSONObject data = new JSONObject();
|
||||||
|
data.put("eventType", "Temp Basal");
|
||||||
|
data.put("duration", durationInMinutes);
|
||||||
|
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);
|
||||||
|
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public 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);
|
||||||
|
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uploadExtendedBolus(Double insulin, double durationInMinutes) {
|
||||||
|
try {
|
||||||
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
|
JSONObject data = new JSONObject();
|
||||||
|
data.put("eventType", "Combo Bolus");
|
||||||
|
data.put("duration", durationInMinutes);
|
||||||
|
data.put("splitNow", 0);
|
||||||
|
data.put("splitExt", 100);
|
||||||
|
data.put("enteredinsulin", insulin);
|
||||||
|
data.put("relative", insulin);
|
||||||
|
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);
|
||||||
|
DbLogger.dbAdd(intent, data.toString(), ConfigBuilderFragment.class);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uploadDeviceStatus() {
|
||||||
|
DeviceStatus deviceStatus = new DeviceStatus();
|
||||||
|
try {
|
||||||
|
LoopPlugin.LastRun lastRun = LoopPlugin.lastRun;
|
||||||
|
if (lastRun != null && lastRun.lastAPSRun.getTime() > new Date().getTime() - 60 * 1000L) {
|
||||||
|
// do not send if result is older than 1 min
|
||||||
|
APSResult apsResult = lastRun.request;
|
||||||
|
apsResult.json().put("timestamp", DateUtil.toISOString(lastRun.lastAPSRun));
|
||||||
|
deviceStatus.suggested = apsResult.json();
|
||||||
|
|
||||||
|
if (lastRun.request instanceof DetermineBasalResult) {
|
||||||
|
DetermineBasalResult result = (DetermineBasalResult) lastRun.request;
|
||||||
|
deviceStatus.iob = result.iob.json();
|
||||||
|
deviceStatus.iob.put("time", DateUtil.toISOString(lastRun.lastAPSRun));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastRun.setByPump != null && lastRun.setByPump.enacted) { // enacted
|
||||||
|
deviceStatus.enacted = lastRun.request.json();
|
||||||
|
deviceStatus.enacted.put("rate", lastRun.setByPump.json().get("rate"));
|
||||||
|
deviceStatus.enacted.put("duration", lastRun.setByPump.json().get("duration"));
|
||||||
|
deviceStatus.enacted.put("recieved", true);
|
||||||
|
JSONObject requested = new JSONObject();
|
||||||
|
requested.put("duration", lastRun.request.duration);
|
||||||
|
requested.put("rate", lastRun.request.rate);
|
||||||
|
requested.put("temp", "absolute");
|
||||||
|
deviceStatus.enacted.put("requested", requested);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (activePump != null) {
|
||||||
|
deviceStatus.device = "openaps://" + deviceID();
|
||||||
|
deviceStatus.pump = getJSONStatus();
|
||||||
|
|
||||||
|
deviceStatus.created_at = DateUtil.toISOString(new Date());
|
||||||
|
|
||||||
|
deviceStatus.sendToNSClient();
|
||||||
|
lastDeviceStatusUpload = new Date();
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uploadBolusWizardRecord(Treatment t, double glucose, String glucoseType, int carbTime, JSONObject boluscalc) {
|
||||||
|
JSONObject data = new JSONObject();
|
||||||
|
try {
|
||||||
|
data.put("eventType", "Bolus Wizard");
|
||||||
|
if (t.insulin != 0d) data.put("insulin", t.insulin);
|
||||||
|
if (t.carbs != 0d) data.put("carbs", t.carbs.intValue());
|
||||||
|
data.put("created_at", DateUtil.toISOString(t.created_at));
|
||||||
|
data.put("timeIndex", t.timeIndex);
|
||||||
|
if (glucose != 0d) data.put("glucose", glucose);
|
||||||
|
data.put("glucoseType", glucoseType);
|
||||||
|
data.put("boluscalc", boluscalc);
|
||||||
|
if (carbTime != 0) data.put("preBolus", carbTime);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
uploadCareportalEntryToNS(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void uploadCareportalEntryToNS(JSONObject data) {
|
||||||
|
try {
|
||||||
|
if (data.has("preBolus") && data.has("carbs")) {
|
||||||
|
JSONObject prebolus = new JSONObject();
|
||||||
|
prebolus.put("carbs", data.get("carbs"));
|
||||||
|
data.remove("carbs");
|
||||||
|
prebolus.put("eventType", data.get("eventType"));
|
||||||
|
if (data.has("enteredBy")) prebolus.put("enteredBy", data.get("enteredBy"));
|
||||||
|
if (data.has("notes")) prebolus.put("notes", data.get("notes"));
|
||||||
|
long mills = DateUtil.fromISODateString(data.getString("created_at")).getTime();
|
||||||
|
Date preBolusDate = new Date(mills + data.getInt("preBolus") * 60000L);
|
||||||
|
prebolus.put("created_at", DateUtil.toISOString(preBolusDate));
|
||||||
|
uploadCareportalEntryToNS(prebolus);
|
||||||
|
}
|
||||||
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
|
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);
|
||||||
|
DbLogger.dbAdd(intent, data.toString(), NewExtendedBolusDialog.class);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -3,17 +3,10 @@ package info.nightscout.androidaps.plugins.DanaR;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ComponentName;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.ServiceConnection;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
@ -24,56 +17,35 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
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.PumpEnactResult;
|
|
||||||
import info.nightscout.androidaps.db.TempBasal;
|
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
|
||||||
import info.nightscout.androidaps.events.EventAppExit;
|
|
||||||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
|
||||||
import info.nightscout.androidaps.plugins.DanaR.Dialogs.ProfileViewDialog;
|
import info.nightscout.androidaps.plugins.DanaR.Dialogs.ProfileViewDialog;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.History.DanaRHistoryActivity;
|
import info.nightscout.androidaps.plugins.DanaR.History.DanaRHistoryActivity;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRNewStatus;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRNewStatus;
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.DateUtil;
|
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
import info.nightscout.utils.Round;
|
|
||||||
import info.nightscout.utils.SetWarnColor;
|
import info.nightscout.utils.SetWarnColor;
|
||||||
import info.nightscout.utils.ToastUtils;
|
|
||||||
|
|
||||||
public class DanaRFragment extends Fragment implements PluginBase, PumpInterface, ConstraintsInterface, ProfileInterface {
|
public class DanaRFragment extends Fragment implements FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(DanaRFragment.class);
|
private static Logger log = LoggerFactory.getLogger(DanaRFragment.class);
|
||||||
|
|
||||||
private Handler mHandler;
|
private static DanaRPlugin danaRPlugin = new DanaRPlugin();
|
||||||
private static HandlerThread mHandlerThread;
|
|
||||||
|
|
||||||
private static ExecutionService mExecutionService;
|
public static DanaRPlugin getPlugin() {
|
||||||
|
return danaRPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
private static DanaRPump sDanaRPump = new DanaRPump();
|
private static Handler sHandler;
|
||||||
private static boolean useExtendedBoluses = false;
|
private static HandlerThread sHandlerThread;
|
||||||
|
|
||||||
boolean fragmentPumpEnabled = true;
|
|
||||||
boolean fragmentProfileEnabled = true;
|
|
||||||
boolean fragmentPumpVisible = true;
|
|
||||||
|
|
||||||
private Handler loopHandler = new Handler();
|
private Handler loopHandler = new Handler();
|
||||||
private Runnable refreshLoop = null;
|
private Runnable refreshLoop = null;
|
||||||
|
@ -91,37 +63,18 @@ public class DanaRFragment extends Fragment implements PluginBase, PumpInterface
|
||||||
Button viewProfileButton;
|
Button viewProfileButton;
|
||||||
Button historyButton;
|
Button historyButton;
|
||||||
|
|
||||||
public static DanaRPump getDanaRPump() {
|
|
||||||
return sDanaRPump;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DanaRFragment() {
|
public DanaRFragment() {
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
if (sHandlerThread == null) {
|
||||||
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
sHandlerThread = new HandlerThread(DanaRFragment.class.getSimpleName());
|
||||||
|
sHandlerThread.start();
|
||||||
mHandlerThread = new HandlerThread(DanaRFragment.class.getSimpleName());
|
sHandler = new Handler(sHandlerThread.getLooper());
|
||||||
mHandlerThread.start();
|
}
|
||||||
|
|
||||||
this.mHandler = new Handler(mHandlerThread.getLooper());
|
|
||||||
registerBus();
|
|
||||||
Context context = MainApp.instance().getApplicationContext();
|
|
||||||
Intent intent = new Intent(context, ExecutionService.class);
|
|
||||||
context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DanaRFragment newInstance() {
|
public static DanaRFragment newInstance() {
|
||||||
return new DanaRFragment();
|
return new DanaRFragment();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
|
||||||
try {
|
|
||||||
MainApp.bus().unregister(this);
|
|
||||||
} catch (RuntimeException x) {
|
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
@ -173,10 +126,10 @@ public class DanaRFragment extends Fragment implements PluginBase, PumpInterface
|
||||||
btConnectionView.setOnClickListener(new View.OnClickListener() {
|
btConnectionView.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
mHandler.post(new Runnable() {
|
sHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
mExecutionService.connect("Connect request from GUI");
|
DanaRPlugin.sExecutionService.connect("Connect request from GUI");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -187,46 +140,17 @@ public class DanaRFragment extends Fragment implements PluginBase, PumpInterface
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("UnusedParameters")
|
|
||||||
@Subscribe
|
|
||||||
public void onStatusEvent(final EventAppExit e) {
|
|
||||||
MainApp.instance().getApplicationContext().unbindService(mConnection);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onPause() {
|
||||||
super.onStart();
|
super.onPause();
|
||||||
Context context = getContext();
|
MainApp.bus().unregister(this);
|
||||||
Intent intent = new Intent(context, ExecutionService.class);
|
|
||||||
context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
ServiceConnection mConnection = new ServiceConnection() {
|
|
||||||
|
|
||||||
public void onServiceDisconnected(ComponentName name) {
|
|
||||||
log.debug("Service is disconnected");
|
|
||||||
mExecutionService = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
|
||||||
log.debug("Service is connected");
|
|
||||||
ExecutionService.LocalBinder mLocalBinder = (ExecutionService.LocalBinder) service;
|
|
||||||
mExecutionService = mLocalBinder.getServiceInstance();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onResume() {
|
||||||
super.onStop();
|
super.onResume();
|
||||||
if (mBounded) {
|
MainApp.bus().register(this);
|
||||||
getContext().unbindService(mConnection);
|
|
||||||
mBounded = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventDanaRConnectionStatus c) {
|
public void onStatusEvent(final EventDanaRConnectionStatus c) {
|
||||||
|
@ -260,521 +184,9 @@ public class DanaRFragment extends Fragment implements PluginBase, PumpInterface
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventPreferenceChange s) {
|
public void onStatusEvent(final EventPreferenceChange s) {
|
||||||
boolean previousValue = useExtendedBoluses;
|
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
|
||||||
if (useExtendedBoluses != previousValue && isExtendedBoluslInProgress()) {
|
|
||||||
mExecutionService.extendedBolusStop();
|
|
||||||
}
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Plugin base interface
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.PUMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.danarpump);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
if (type == PluginBase.PROFILE) return fragmentProfileEnabled;
|
|
||||||
else if (type == PluginBase.PUMP) return fragmentPumpEnabled;
|
|
||||||
else if (type == PluginBase.CONSTRAINTS) return fragmentPumpEnabled;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
if (type == PluginBase.PROFILE || type == PluginBase.CONSTRAINTS) return false;
|
|
||||||
else if (type == PluginBase.PUMP) return fragmentPumpVisible;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
if (type == PluginBase.PROFILE) this.fragmentProfileEnabled = fragmentEnabled;
|
|
||||||
else if (type == PluginBase.PUMP) this.fragmentPumpEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
if (type == PluginBase.PUMP)
|
|
||||||
this.fragmentPumpVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pump interface
|
|
||||||
@Override
|
|
||||||
public boolean isTempBasalInProgress() {
|
|
||||||
if (getRealTempBasal() != null) return true;
|
|
||||||
if (getExtendedBolus() != null && useExtendedBoluses) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isRealTempBasalInProgress() {
|
|
||||||
return getRealTempBasal() != null; //TODO: crosscheck here
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isExtendedBoluslInProgress() {
|
|
||||||
return getExtendedBolus() != null; //TODO: crosscheck here
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setNewBasalProfile(NSProfile profile) {
|
|
||||||
if (mExecutionService == null) {
|
|
||||||
log.error("setNewBasalProfile mExecutionService is null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!mExecutionService.updateBasalsInPump(profile))
|
|
||||||
ToastUtils.showToastInUiThread(getContext(), MainApp.sResources.getString(R.string.failedupdatebasalprofile));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBaseBasalRate() {
|
|
||||||
return getDanaRPump().currentBasal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalAbsoluteRate() {
|
|
||||||
if (isRealTempBasalInProgress()) {
|
|
||||||
if (getRealTempBasal().isAbsolute) {
|
|
||||||
return getRealTempBasal().absolute;
|
|
||||||
} else {
|
|
||||||
Double baseRate = getBaseBasalRate();
|
|
||||||
Double tempRate = baseRate * (getRealTempBasal().percent / 100d);
|
|
||||||
return tempRate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isExtendedBoluslInProgress() && useExtendedBoluses) {
|
|
||||||
return getBaseBasalRate() + getExtendedBolus().absolute;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalRemainingMinutes() {
|
|
||||||
if (isRealTempBasalInProgress())
|
|
||||||
return getRealTempBasal().getPlannedRemainingMinutes();
|
|
||||||
if (isExtendedBoluslInProgress() && useExtendedBoluses)
|
|
||||||
return getExtendedBolus().getPlannedRemainingMinutes();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal() {
|
|
||||||
if (isRealTempBasalInProgress())
|
|
||||||
return getRealTempBasal();
|
|
||||||
if (isExtendedBoluslInProgress() && useExtendedBoluses)
|
|
||||||
return getExtendedBolus();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TempBasal getTempBasal(Date time) {
|
|
||||||
TempBasal temp = MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time);
|
|
||||||
if (temp != null) return temp;
|
|
||||||
if (useExtendedBoluses)
|
|
||||||
return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(time);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TempBasal getRealTempBasal() {
|
|
||||||
return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getExtendedBolus() {
|
|
||||||
return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
|
||||||
insulin = configBuilderFragment.applyBolusConstraints(insulin);
|
|
||||||
if (insulin > 0 || carbs > 0) {
|
|
||||||
Treatment t = new Treatment();
|
|
||||||
boolean connectionOK = false;
|
|
||||||
if (carbs > 0) connectionOK = mExecutionService.carbsEntry(carbs);
|
|
||||||
if (insulin > 0) connectionOK = mExecutionService.bolus(insulin, t);
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
result.success = connectionOK;
|
|
||||||
result.bolusDelivered = t.insulin;
|
|
||||||
result.carbsDelivered = carbs;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("deliverTreatment: OK. Asked: " + insulin + " Delivered: " + result.bolusDelivered);
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
result.success = false;
|
|
||||||
result.bolusDelivered = 0d;
|
|
||||||
result.carbsDelivered = 0;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.danar_invalidinput);
|
|
||||||
log.error("deliverTreatment: Invalid input");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stopBolusDelivering() {
|
|
||||||
if (mExecutionService == null) {
|
|
||||||
log.error("stopBolusDelivering mExecutionService is null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mExecutionService.bolusStop();
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is called from APS
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
|
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
|
||||||
absoluteRate = configBuilderFragment.applyBasalConstraints(absoluteRate);
|
|
||||||
|
|
||||||
final boolean doTempOff = getBaseBasalRate() - absoluteRate == 0d;
|
|
||||||
final boolean doLowTemp = absoluteRate < getBaseBasalRate();
|
|
||||||
final boolean doHighTemp = absoluteRate > getBaseBasalRate() && !useExtendedBoluses;
|
|
||||||
final boolean doExtendedTemp = absoluteRate > getBaseBasalRate() && useExtendedBoluses;
|
|
||||||
|
|
||||||
if (doTempOff) {
|
|
||||||
// If extended in progress
|
|
||||||
if (isExtendedBoluslInProgress() && useExtendedBoluses) {
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Stopping extended bolus (doTempOff)");
|
|
||||||
return cancelExtendedBolus();
|
|
||||||
}
|
|
||||||
// If temp in progress
|
|
||||||
if (isRealTempBasalInProgress()) {
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Stopping temp basal (doTempOff)");
|
|
||||||
return cancelRealTempBasal();
|
|
||||||
}
|
|
||||||
result.success = true;
|
|
||||||
result.enacted = false;
|
|
||||||
result.percent = 100;
|
|
||||||
result.isPercent = true;
|
|
||||||
result.isTempCancel = true;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: doTempOff OK");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doLowTemp || doHighTemp) {
|
|
||||||
Integer percentRate = Double.valueOf(absoluteRate / getBaseBasalRate() * 100).intValue();
|
|
||||||
if (percentRate < 100) percentRate = Round.ceilTo((double) percentRate, 10d).intValue();
|
|
||||||
else percentRate = Round.floorTo((double) percentRate, 10d).intValue();
|
|
||||||
if (percentRate > 200) {
|
|
||||||
percentRate = 200;
|
|
||||||
}
|
|
||||||
// If extended in progress
|
|
||||||
if (isExtendedBoluslInProgress() && useExtendedBoluses) {
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Stopping extended bolus (doLowTemp || doHighTemp)");
|
|
||||||
result = cancelExtendedBolus();
|
|
||||||
if (!result.success) {
|
|
||||||
log.error("setTempBasalAbsolute: Failed to stop previous extended bolus (doLowTemp || doHighTemp)");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Check if some temp is already in progress
|
|
||||||
if (isRealTempBasalInProgress()) {
|
|
||||||
// Correct basal already set ?
|
|
||||||
if (getRealTempBasal().percent == percentRate) {
|
|
||||||
result.success = true;
|
|
||||||
result.percent = percentRate;
|
|
||||||
result.absolute = getTempBasalAbsoluteRate();
|
|
||||||
result.enacted = false;
|
|
||||||
result.duration = ((Double) getTempBasalRemainingMinutes()).intValue();
|
|
||||||
result.isPercent = true;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Correct temp basal already set (doLowTemp || doHighTemp)");
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Stopping temp basal (doLowTemp || doHighTemp)");
|
|
||||||
result = cancelRealTempBasal();
|
|
||||||
// Check for proper result
|
|
||||||
if (!result.success) {
|
|
||||||
log.error("setTempBasalAbsolute: Failed to stop previous temp basal (doLowTemp || doHighTemp)");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Convert duration from minutes to hours
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " mins (doLowTemp || doHighTemp)");
|
|
||||||
return setTempBasalPercent(percentRate, durationInMinutes);
|
|
||||||
}
|
|
||||||
if (doExtendedTemp) {
|
|
||||||
// Check if some temp is already in progress
|
|
||||||
if (isRealTempBasalInProgress()) {
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Stopping temp basal (doExtendedTemp)");
|
|
||||||
result = cancelRealTempBasal();
|
|
||||||
// Check for proper result
|
|
||||||
if (!result.success) {
|
|
||||||
log.error("setTempBasalAbsolute: Failed to stop previous temp basal (doExtendedTemp)");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate # of halfHours from minutes
|
|
||||||
Integer durationInHalfHours = Math.max(durationInMinutes / 30, 1);
|
|
||||||
// We keep current basal running so need to sub current basal
|
|
||||||
Double extendedRateToSet = absoluteRate - getBaseBasalRate();
|
|
||||||
extendedRateToSet = configBuilderFragment.applyBasalConstraints(extendedRateToSet);
|
|
||||||
// needs to be rounded to 0.1
|
|
||||||
extendedRateToSet = Round.roundTo(extendedRateToSet, 0.1d);
|
|
||||||
|
|
||||||
// What is current rate of extended bolusing in u/h?
|
|
||||||
if (Config.logPumpActions) {
|
|
||||||
log.debug("setTempBasalAbsolute: Extended bolus in progress: " + isExtendedBoluslInProgress() + " rate: " + getDanaRPump().extendedBolusAbsoluteRate + "U/h duration remaining: " + getDanaRPump().extendedBolusRemainingMinutes + "min");
|
|
||||||
log.debug("setTempBasalAbsolute: Rate to set: " + extendedRateToSet + "U/h");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare with extended rate in progress
|
|
||||||
if (Math.abs(getDanaRPump().extendedBolusAbsoluteRate - extendedRateToSet) < 0.02D) { // Allow some rounding diff
|
|
||||||
// correct extended already set
|
|
||||||
result.success = true;
|
|
||||||
result.absolute = getDanaRPump().extendedBolusAbsoluteRate;
|
|
||||||
result.enacted = false;
|
|
||||||
result.duration = getDanaRPump().extendedBolusRemainingMinutes;
|
|
||||||
result.isPercent = false;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Correct extended already set");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now set new extended, no need to to stop previous (if running) because it's replaced
|
|
||||||
Double extendedAmount = extendedRateToSet / 2 * durationInHalfHours;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Setting extended: " + extendedAmount + "U halfhours: " + durationInHalfHours);
|
|
||||||
result = setExtendedBolus(extendedAmount, durationInMinutes);
|
|
||||||
if (!result.success) {
|
|
||||||
log.error("setTempBasalAbsolute: Failed to set extended bolus");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalAbsolute: Extended bolus set ok");
|
|
||||||
result.absolute = result.absolute + getBaseBasalRate();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// We should never end here
|
|
||||||
log.error("setTempBasalAbsolute: Internal error");
|
|
||||||
result.success = false;
|
|
||||||
result.comment = "Internal error";
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
|
||||||
percent = configBuilderFragment.applyBasalConstraints(percent);
|
|
||||||
if (percent < 0) {
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.enacted = false;
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.danar_invalidinput);
|
|
||||||
log.error("setTempBasalPercent: Invalid input");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
if (percent > 200) percent = 200;
|
|
||||||
if (getDanaRPump().isTempBasalInProgress && getDanaRPump().tempBasalPercent == percent) {
|
|
||||||
result.enacted = false;
|
|
||||||
result.success = true;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
result.duration = getDanaRPump().tempBasalRemainingMin;
|
|
||||||
result.percent = getDanaRPump().tempBasalPercent;
|
|
||||||
result.isPercent = true;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalPercent: Correct value already set");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
int durationInHours = Math.max(durationInMinutes / 60, 1);
|
|
||||||
boolean connectionOK = mExecutionService.tempBasal(percent, durationInHours);
|
|
||||||
if (connectionOK && getDanaRPump().isTempBasalInProgress && getDanaRPump().tempBasalPercent == percent) {
|
|
||||||
result.enacted = true;
|
|
||||||
result.success = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.duration = getDanaRPump().tempBasalRemainingMin;
|
|
||||||
result.percent = getDanaRPump().tempBasalPercent;
|
|
||||||
result.isPercent = true;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setTempBasalPercent: OK");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
result.enacted = false;
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
|
||||||
log.error("setTempBasalPercent: Failed to set temp basal");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
|
||||||
insulin = configBuilderFragment.applyBolusConstraints(insulin);
|
|
||||||
// needs to be rounded to 0.1
|
|
||||||
insulin = Round.roundTo(insulin, 0.1d);
|
|
||||||
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
if (getDanaRPump().isExtendedInProgress && Math.abs(getDanaRPump().extendedBolusAmount - insulin) < 0.1d) {
|
|
||||||
result.enacted = false;
|
|
||||||
result.success = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
result.duration = getDanaRPump().extendedBolusRemainingMinutes;
|
|
||||||
result.absolute = getDanaRPump().extendedBolusAbsoluteRate;
|
|
||||||
result.isPercent = false;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setExtendedBolus: Correct extended bolus already set");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
int durationInHalfHours = Math.max(durationInMinutes / 30, 1);
|
|
||||||
boolean connectionOK = mExecutionService.extendedBolus(insulin, durationInHalfHours);
|
|
||||||
if (connectionOK && getDanaRPump().isExtendedInProgress && Math.abs(getDanaRPump().extendedBolusAmount - insulin) < 0.1d) {
|
|
||||||
result.enacted = true;
|
|
||||||
result.success = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.duration = getDanaRPump().extendedBolusRemainingMinutes;
|
|
||||||
result.absolute = getDanaRPump().extendedBolusAbsoluteRate;
|
|
||||||
result.bolusDelivered = getDanaRPump().extendedBolusAmount;
|
|
||||||
result.isPercent = false;
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("setExtendedBolus: OK");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
result.enacted = false;
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
|
||||||
log.error("setExtendedBolus: Failed to extended bolus");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelTempBasal() {
|
|
||||||
if (isRealTempBasalInProgress())
|
|
||||||
return cancelRealTempBasal();
|
|
||||||
if (isExtendedBoluslInProgress())
|
|
||||||
return cancelExtendedBolus();
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
result.success = true;
|
|
||||||
result.enacted = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
result.isTempCancel = true;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PumpEnactResult cancelRealTempBasal() {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
if (getDanaRPump().isTempBasalInProgress) {
|
|
||||||
mExecutionService.tempBasalStop();
|
|
||||||
result.enacted = true;
|
|
||||||
result.isTempCancel = true;
|
|
||||||
}
|
|
||||||
if (!getDanaRPump().isTempBasalInProgress) {
|
|
||||||
result.success = true;
|
|
||||||
result.isTempCancel = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("cancelRealTempBasal: OK");
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
|
||||||
result.isTempCancel = true;
|
|
||||||
log.error("cancelRealTempBasal: Failed to cancel temp basal");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelExtendedBolus() {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
if (getDanaRPump().isExtendedInProgress) {
|
|
||||||
mExecutionService.extendedBolusStop();
|
|
||||||
result.enacted = true;
|
|
||||||
result.isTempCancel = true;
|
|
||||||
}
|
|
||||||
if (!getDanaRPump().isExtendedInProgress) {
|
|
||||||
result.success = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
if (Config.logPumpActions)
|
|
||||||
log.debug("cancelExtendedBolus: OK");
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
|
||||||
log.error("cancelExtendedBolus: Failed to cancel extended bolus");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void doConnect(String from) {
|
|
||||||
if (mExecutionService != null) mExecutionService.connect(from);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isConnected() {
|
|
||||||
return mExecutionService != null && mExecutionService.isConnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isConnecting() {
|
|
||||||
return mExecutionService != null && mExecutionService.isConnecting();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSONObject getJSONStatus() {
|
|
||||||
JSONObject pump = new JSONObject();
|
|
||||||
JSONObject battery = new JSONObject();
|
|
||||||
JSONObject status = new JSONObject();
|
|
||||||
JSONObject extended = new JSONObject();
|
|
||||||
try {
|
|
||||||
battery.put("percent", getDanaRPump().batteryRemaining);
|
|
||||||
status.put("status", "normal");
|
|
||||||
status.put("timestamp", DateUtil.toISOString(new Date()));
|
|
||||||
if (isTempBasalInProgress()) {
|
|
||||||
extended.put("TempBasalAbsoluteRate", getTempBasalAbsoluteRate());
|
|
||||||
extended.put("TempBasalStart", DateUtil.toISOString(getTempBasal().timeStart));
|
|
||||||
extended.put("TempBasalRemaining", getTempBasal().getPlannedRemainingMinutes());
|
|
||||||
extended.put("IsExtended", getTempBasal().isExtended);
|
|
||||||
}
|
|
||||||
extended.put("PumpIOB", getDanaRPump().iob);
|
|
||||||
extended.put("LastBolus", DateUtil.toISOString(getDanaRPump().lastBolusTime));
|
|
||||||
extended.put("LastBolusAmount", getDanaRPump().lastBolusAmount);
|
|
||||||
|
|
||||||
pump.put("battery", battery);
|
|
||||||
pump.put("status", status);
|
|
||||||
pump.put("extended", extended);
|
|
||||||
pump.put("reservoir", (int) getDanaRPump().reservoirRemainingUnits);
|
|
||||||
pump.put("clock", DateUtil.toISOString(new Date()));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return pump;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deviceID() {
|
|
||||||
return getDanaRPump().serialNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// GUI functions
|
// GUI functions
|
||||||
private void updateGUI() {
|
private void updateGUI() {
|
||||||
final DateFormat formatTime = DateFormat.getTimeInstance(DateFormat.SHORT);
|
final DateFormat formatTime = DateFormat.getTimeInstance(DateFormat.SHORT);
|
||||||
|
@ -786,149 +198,41 @@ public class DanaRFragment extends Fragment implements PluginBase, PumpInterface
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
if (getDanaRPump().lastConnection.getTime() != 0) {
|
if (DanaRPlugin.getDanaRPump().lastConnection.getTime() != 0) {
|
||||||
Long agoMsec = new Date().getTime() - getDanaRPump().lastConnection.getTime();
|
Long agoMsec = new Date().getTime() - DanaRPlugin.getDanaRPump().lastConnection.getTime();
|
||||||
int agoMin = (int) (agoMsec / 60d / 1000d);
|
int agoMin = (int) (agoMsec / 60d / 1000d);
|
||||||
lastConnectionView.setText(formatTime.format(getDanaRPump().lastConnection) + " (" + agoMin + " " + getString(R.string.minago) + ")");
|
lastConnectionView.setText(formatTime.format(DanaRPlugin.getDanaRPump().lastConnection) + " (" + agoMin + " " + getString(R.string.minago) + ")");
|
||||||
SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d);
|
SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d);
|
||||||
}
|
}
|
||||||
if (getDanaRPump().lastBolusTime.getTime() != 0) {
|
if (DanaRPlugin.getDanaRPump().lastBolusTime.getTime() != 0) {
|
||||||
Long agoMsec = new Date().getTime() - getDanaRPump().lastBolusTime.getTime();
|
Long agoMsec = new Date().getTime() - DanaRPlugin.getDanaRPump().lastBolusTime.getTime();
|
||||||
double agoHours = (int) (agoMsec / 60d / 60d / 1000d);
|
double agoHours = (int) (agoMsec / 60d / 60d / 1000d);
|
||||||
if (agoHours < 6) // max 6h back
|
if (agoHours < 6) // max 6h back
|
||||||
lastBolusView.setText(formatTime.format(getDanaRPump().lastBolusTime) + " (" + DecimalFormatter.to1Decimal(agoHours) + " " + getString(R.string.hoursago) + ") " + DecimalFormatter.to2Decimal(getDanaRPump().lastBolusAmount) + " U");
|
lastBolusView.setText(formatTime.format(DanaRPlugin.getDanaRPump().lastBolusTime) + " (" + DecimalFormatter.to1Decimal(agoHours) + " " + getString(R.string.hoursago) + ") " + DecimalFormatter.to2Decimal(danaRPlugin.getDanaRPump().lastBolusAmount) + " U");
|
||||||
else lastBolusView.setText("");
|
else lastBolusView.setText("");
|
||||||
}
|
}
|
||||||
|
|
||||||
dailyUnitsView.setText(DecimalFormatter.to0Decimal(getDanaRPump().dailyTotalUnits) + " / " + getDanaRPump().maxDailyTotalUnits + " U");
|
dailyUnitsView.setText(DecimalFormatter.to0Decimal(DanaRPlugin.getDanaRPump().dailyTotalUnits) + " / " + DanaRPlugin.getDanaRPump().maxDailyTotalUnits + " U");
|
||||||
SetWarnColor.setColor(dailyUnitsView, getDanaRPump().dailyTotalUnits, getDanaRPump().maxDailyTotalUnits * 0.75d, getDanaRPump().maxDailyTotalUnits * 0.9d);
|
SetWarnColor.setColor(dailyUnitsView, DanaRPlugin.getDanaRPump().dailyTotalUnits, DanaRPlugin.getDanaRPump().maxDailyTotalUnits * 0.75d, DanaRPlugin.getDanaRPump().maxDailyTotalUnits * 0.9d);
|
||||||
basaBasalRateView.setText("( " + (getDanaRPump().activeProfile + 1) + " ) " + DecimalFormatter.to2Decimal(getBaseBasalRate()) + " U/h");
|
basaBasalRateView.setText("( " + (DanaRPlugin.getDanaRPump().activeProfile + 1) + " ) " + DecimalFormatter.to2Decimal(danaRPlugin.getBaseBasalRate()) + " U/h");
|
||||||
if (isRealTempBasalInProgress()) {
|
if (danaRPlugin.isRealTempBasalInProgress()) {
|
||||||
tempBasalView.setText(getRealTempBasal().toString());
|
tempBasalView.setText(danaRPlugin.getRealTempBasal().toString());
|
||||||
} else {
|
} else {
|
||||||
tempBasalView.setText("");
|
tempBasalView.setText("");
|
||||||
}
|
}
|
||||||
if (isExtendedBoluslInProgress()) {
|
if (danaRPlugin.isExtendedBoluslInProgress()) {
|
||||||
extendedBolusView.setText(getExtendedBolus().toString());
|
extendedBolusView.setText(danaRPlugin.getExtendedBolus().toString());
|
||||||
} else {
|
} else {
|
||||||
extendedBolusView.setText("");
|
extendedBolusView.setText("");
|
||||||
}
|
}
|
||||||
reservoirView.setText(DecimalFormatter.to0Decimal(getDanaRPump().reservoirRemainingUnits) + " / 300 U");
|
reservoirView.setText(DecimalFormatter.to0Decimal(DanaRPlugin.getDanaRPump().reservoirRemainingUnits) + " / 300 U");
|
||||||
SetWarnColor.setColorInverse(reservoirView, getDanaRPump().reservoirRemainingUnits, 50d, 20d);
|
SetWarnColor.setColorInverse(reservoirView, DanaRPlugin.getDanaRPump().reservoirRemainingUnits, 50d, 20d);
|
||||||
batteryView.setText("{fa-battery-" + (getDanaRPump().batteryRemaining / 25) + "}");
|
batteryView.setText("{fa-battery-" + (DanaRPlugin.getDanaRPump().batteryRemaining / 25) + "}");
|
||||||
SetWarnColor.setColorInverse(batteryView, getDanaRPump().batteryRemaining, 51d, 26d);
|
SetWarnColor.setColorInverse(batteryView, DanaRPlugin.getDanaRPump().batteryRemaining, 51d, 26d);
|
||||||
iobView.setText(getDanaRPump().iob + " U");
|
iobView.setText(DanaRPlugin.getDanaRPump().iob + " U");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constraint interface
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isLoopEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isClosedModeEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAutosensModeEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAMAModeEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("PointlessBooleanExpression")
|
|
||||||
@Override
|
|
||||||
public Double applyBasalConstraints(Double absoluteRate) {
|
|
||||||
double origAbsoluteRate = absoluteRate;
|
|
||||||
if (getDanaRPump() != null) {
|
|
||||||
if (absoluteRate > getDanaRPump().maxBasal) {
|
|
||||||
absoluteRate = getDanaRPump().maxBasal;
|
|
||||||
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origAbsoluteRate + "U/h by pump constraint to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return absoluteRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("PointlessBooleanExpression")
|
|
||||||
@Override
|
|
||||||
public Integer applyBasalConstraints(Integer percentRate) {
|
|
||||||
Integer origPercentRate = percentRate;
|
|
||||||
if (percentRate < 0) percentRate = 0;
|
|
||||||
if (percentRate > 200) percentRate = 200;
|
|
||||||
if (!Objects.equals(percentRate, origPercentRate) && Config.logConstraintsChanges && !Objects.equals(origPercentRate, Constants.basalPercentOnlyForCheckLimit))
|
|
||||||
log.debug("Limiting percent rate " + origPercentRate + "% to " + percentRate + "%");
|
|
||||||
return percentRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("PointlessBooleanExpression")
|
|
||||||
@Override
|
|
||||||
public Double applyBolusConstraints(Double insulin) {
|
|
||||||
double origInsulin = insulin;
|
|
||||||
if (getDanaRPump() != null) {
|
|
||||||
if (insulin > getDanaRPump().maxBolus) {
|
|
||||||
insulin = getDanaRPump().maxBolus;
|
|
||||||
if (Config.logConstraintsChanges && origInsulin != Constants.bolusOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting bolus " + origInsulin + "U by pump constraint to " + insulin + "U");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return insulin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyCarbsConstraints(Integer carbs) {
|
|
||||||
return carbs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyMaxIOBConstraints(Double maxIob) {
|
|
||||||
return maxIob;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public NSProfile getProfile() {
|
|
||||||
DanaRPump pump = getDanaRPump();
|
|
||||||
if (pump.lastSettingsRead.getTime() == 0)
|
|
||||||
return null; // no info now
|
|
||||||
return pump.createConvertedProfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reply for sms communicator
|
|
||||||
public String shortStatus() {
|
|
||||||
final DateFormat formatTime = DateFormat.getTimeInstance(DateFormat.SHORT);
|
|
||||||
String ret = "";
|
|
||||||
if (getDanaRPump().lastConnection.getTime() != 0) {
|
|
||||||
Long agoMsec = new Date().getTime() - getDanaRPump().lastConnection.getTime();
|
|
||||||
int agoMin = (int) (agoMsec / 60d / 1000d);
|
|
||||||
ret += "LastConn: " + agoMin + " minago\n";
|
|
||||||
}
|
|
||||||
if (getDanaRPump().lastBolusTime.getTime() != 0) {
|
|
||||||
Long agoMsec = new Date().getTime() - getDanaRPump().lastBolusTime.getTime();
|
|
||||||
long agoHours = (int) (agoMsec / 60d / 60d / 1000d);
|
|
||||||
ret += "LastBolus: " + DecimalFormatter.to2Decimal(getDanaRPump().lastBolusAmount) + "U @" + formatTime.format(getDanaRPump().lastBolusTime) + "\n";
|
|
||||||
}
|
|
||||||
if (isRealTempBasalInProgress()) {
|
|
||||||
ret += "Temp: " + getRealTempBasal().toString() + "\n";
|
|
||||||
}
|
|
||||||
if (isExtendedBoluslInProgress()) {
|
|
||||||
ret += "Extended: " + getExtendedBolus().toString() + "\n";
|
|
||||||
}
|
|
||||||
ret += "IOB: " + getDanaRPump().iob + "U\n";
|
|
||||||
ret += "Reserv: " + DecimalFormatter.to0Decimal(getDanaRPump().reservoirRemainingUnits) + "U\n";
|
|
||||||
ret += "Batt: " + getDanaRPump().batteryRemaining + "\n";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
// TODO: daily total constraint
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,721 @@
|
||||||
|
package info.nightscout.androidaps.plugins.DanaR;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.ServiceConnection;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.Constants;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
|
import info.nightscout.androidaps.events.EventAppExit;
|
||||||
|
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
import info.nightscout.utils.DateUtil;
|
||||||
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
|
import info.nightscout.utils.Round;
|
||||||
|
import info.nightscout.utils.ToastUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterface, ProfileInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(DanaRPlugin.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return DanaRFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean fragmentPumpEnabled = true;
|
||||||
|
static boolean fragmentProfileEnabled = true;
|
||||||
|
static boolean fragmentPumpVisible = true;
|
||||||
|
|
||||||
|
public static ExecutionService sExecutionService;
|
||||||
|
|
||||||
|
|
||||||
|
private static DanaRPump sDanaRPump = new DanaRPump();
|
||||||
|
private static boolean useExtendedBoluses = false;
|
||||||
|
|
||||||
|
public static DanaRPump getDanaRPump() {
|
||||||
|
return sDanaRPump;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DanaRPlugin() {
|
||||||
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
||||||
|
|
||||||
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
|
Intent intent = new Intent(context, ExecutionService.class);
|
||||||
|
context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
ServiceConnection mConnection = new ServiceConnection() {
|
||||||
|
|
||||||
|
public void onServiceDisconnected(ComponentName name) {
|
||||||
|
log.debug("Service is disconnected");
|
||||||
|
sExecutionService = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||||
|
log.debug("Service is connected");
|
||||||
|
ExecutionService.LocalBinder mLocalBinder = (ExecutionService.LocalBinder) service;
|
||||||
|
sExecutionService = mLocalBinder.getServiceInstance();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@SuppressWarnings("UnusedParameters")
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventAppExit e) {
|
||||||
|
MainApp.instance().getApplicationContext().unbindService(mConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventPreferenceChange s) {
|
||||||
|
boolean previousValue = useExtendedBoluses;
|
||||||
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
||||||
|
if (useExtendedBoluses != previousValue && isExtendedBoluslInProgress()) {
|
||||||
|
sExecutionService.extendedBolusStop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plugin base interface
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.PUMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.danarpump);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
if (type == PluginBase.PROFILE) return fragmentProfileEnabled;
|
||||||
|
else if (type == PluginBase.PUMP) return fragmentPumpEnabled;
|
||||||
|
else if (type == PluginBase.CONSTRAINTS) return fragmentPumpEnabled;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
if (type == PluginBase.PROFILE || type == PluginBase.CONSTRAINTS) return false;
|
||||||
|
else if (type == PluginBase.PUMP) return fragmentPumpVisible;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
if (type == PluginBase.PROFILE) this.fragmentProfileEnabled = fragmentEnabled;
|
||||||
|
else if (type == PluginBase.PUMP) this.fragmentPumpEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
if (type == PluginBase.PUMP)
|
||||||
|
this.fragmentPumpVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pump interface
|
||||||
|
@Override
|
||||||
|
public boolean isTempBasalInProgress() {
|
||||||
|
if (getRealTempBasal() != null) return true;
|
||||||
|
if (getExtendedBolus() != null && useExtendedBoluses) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRealTempBasalInProgress() {
|
||||||
|
return getRealTempBasal() != null; //TODO: crosscheck here
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExtendedBoluslInProgress() {
|
||||||
|
return getExtendedBolus() != null; //TODO: crosscheck here
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNewBasalProfile(NSProfile profile) {
|
||||||
|
if (sExecutionService == null) {
|
||||||
|
log.error("setNewBasalProfile sExecutionService is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!sExecutionService.updateBasalsInPump(profile))
|
||||||
|
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.failedupdatebasalprofile));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getBaseBasalRate() {
|
||||||
|
return getDanaRPump().currentBasal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalAbsoluteRate() {
|
||||||
|
if (isRealTempBasalInProgress()) {
|
||||||
|
if (getRealTempBasal().isAbsolute) {
|
||||||
|
return getRealTempBasal().absolute;
|
||||||
|
} else {
|
||||||
|
Double baseRate = getBaseBasalRate();
|
||||||
|
Double tempRate = baseRate * (getRealTempBasal().percent / 100d);
|
||||||
|
return tempRate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isExtendedBoluslInProgress() && useExtendedBoluses) {
|
||||||
|
return getBaseBasalRate() + getExtendedBolus().absolute;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalRemainingMinutes() {
|
||||||
|
if (isRealTempBasalInProgress())
|
||||||
|
return getRealTempBasal().getPlannedRemainingMinutes();
|
||||||
|
if (isExtendedBoluslInProgress() && useExtendedBoluses)
|
||||||
|
return getExtendedBolus().getPlannedRemainingMinutes();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal() {
|
||||||
|
if (isRealTempBasalInProgress())
|
||||||
|
return getRealTempBasal();
|
||||||
|
if (isExtendedBoluslInProgress() && useExtendedBoluses)
|
||||||
|
return getExtendedBolus();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TempBasal getTempBasal(Date time) {
|
||||||
|
TempBasal temp = MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time);
|
||||||
|
if (temp != null) return temp;
|
||||||
|
if (useExtendedBoluses)
|
||||||
|
return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(time);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TempBasal getRealTempBasal() {
|
||||||
|
return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getExtendedBolus() {
|
||||||
|
return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
||||||
|
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
|
insulin = configBuilderPlugin.applyBolusConstraints(insulin);
|
||||||
|
if (insulin > 0 || carbs > 0) {
|
||||||
|
Treatment t = new Treatment();
|
||||||
|
boolean connectionOK = false;
|
||||||
|
if (carbs > 0) connectionOK = sExecutionService.carbsEntry(carbs);
|
||||||
|
if (insulin > 0) connectionOK = sExecutionService.bolus(insulin, t);
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
result.success = connectionOK;
|
||||||
|
result.bolusDelivered = t.insulin;
|
||||||
|
result.carbsDelivered = carbs;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("deliverTreatment: OK. Asked: " + insulin + " Delivered: " + result.bolusDelivered);
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
result.success = false;
|
||||||
|
result.bolusDelivered = 0d;
|
||||||
|
result.carbsDelivered = 0;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.danar_invalidinput);
|
||||||
|
log.error("deliverTreatment: Invalid input");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopBolusDelivering() {
|
||||||
|
if (sExecutionService == null) {
|
||||||
|
log.error("stopBolusDelivering sExecutionService is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sExecutionService.bolusStop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is called from APS
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
|
||||||
|
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
|
absoluteRate = configBuilderPlugin.applyBasalConstraints(absoluteRate);
|
||||||
|
|
||||||
|
final boolean doTempOff = getBaseBasalRate() - absoluteRate == 0d;
|
||||||
|
final boolean doLowTemp = absoluteRate < getBaseBasalRate();
|
||||||
|
final boolean doHighTemp = absoluteRate > getBaseBasalRate() && !useExtendedBoluses;
|
||||||
|
final boolean doExtendedTemp = absoluteRate > getBaseBasalRate() && useExtendedBoluses;
|
||||||
|
|
||||||
|
if (doTempOff) {
|
||||||
|
// If extended in progress
|
||||||
|
if (isExtendedBoluslInProgress() && useExtendedBoluses) {
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Stopping extended bolus (doTempOff)");
|
||||||
|
return cancelExtendedBolus();
|
||||||
|
}
|
||||||
|
// If temp in progress
|
||||||
|
if (isRealTempBasalInProgress()) {
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Stopping temp basal (doTempOff)");
|
||||||
|
return cancelRealTempBasal();
|
||||||
|
}
|
||||||
|
result.success = true;
|
||||||
|
result.enacted = false;
|
||||||
|
result.percent = 100;
|
||||||
|
result.isPercent = true;
|
||||||
|
result.isTempCancel = true;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: doTempOff OK");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doLowTemp || doHighTemp) {
|
||||||
|
Integer percentRate = Double.valueOf(absoluteRate / getBaseBasalRate() * 100).intValue();
|
||||||
|
if (percentRate < 100) percentRate = Round.ceilTo((double) percentRate, 10d).intValue();
|
||||||
|
else percentRate = Round.floorTo((double) percentRate, 10d).intValue();
|
||||||
|
if (percentRate > 200) {
|
||||||
|
percentRate = 200;
|
||||||
|
}
|
||||||
|
// If extended in progress
|
||||||
|
if (isExtendedBoluslInProgress() && useExtendedBoluses) {
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Stopping extended bolus (doLowTemp || doHighTemp)");
|
||||||
|
result = cancelExtendedBolus();
|
||||||
|
if (!result.success) {
|
||||||
|
log.error("setTempBasalAbsolute: Failed to stop previous extended bolus (doLowTemp || doHighTemp)");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check if some temp is already in progress
|
||||||
|
if (isRealTempBasalInProgress()) {
|
||||||
|
// Correct basal already set ?
|
||||||
|
if (getRealTempBasal().percent == percentRate) {
|
||||||
|
result.success = true;
|
||||||
|
result.percent = percentRate;
|
||||||
|
result.absolute = getTempBasalAbsoluteRate();
|
||||||
|
result.enacted = false;
|
||||||
|
result.duration = ((Double) getTempBasalRemainingMinutes()).intValue();
|
||||||
|
result.isPercent = true;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Correct temp basal already set (doLowTemp || doHighTemp)");
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Stopping temp basal (doLowTemp || doHighTemp)");
|
||||||
|
result = cancelRealTempBasal();
|
||||||
|
// Check for proper result
|
||||||
|
if (!result.success) {
|
||||||
|
log.error("setTempBasalAbsolute: Failed to stop previous temp basal (doLowTemp || doHighTemp)");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Convert duration from minutes to hours
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " mins (doLowTemp || doHighTemp)");
|
||||||
|
return setTempBasalPercent(percentRate, durationInMinutes);
|
||||||
|
}
|
||||||
|
if (doExtendedTemp) {
|
||||||
|
// Check if some temp is already in progress
|
||||||
|
if (isRealTempBasalInProgress()) {
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Stopping temp basal (doExtendedTemp)");
|
||||||
|
result = cancelRealTempBasal();
|
||||||
|
// Check for proper result
|
||||||
|
if (!result.success) {
|
||||||
|
log.error("setTempBasalAbsolute: Failed to stop previous temp basal (doExtendedTemp)");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate # of halfHours from minutes
|
||||||
|
Integer durationInHalfHours = Math.max(durationInMinutes / 30, 1);
|
||||||
|
// We keep current basal running so need to sub current basal
|
||||||
|
Double extendedRateToSet = absoluteRate - getBaseBasalRate();
|
||||||
|
extendedRateToSet = configBuilderPlugin.applyBasalConstraints(extendedRateToSet);
|
||||||
|
// needs to be rounded to 0.1
|
||||||
|
extendedRateToSet = Round.roundTo(extendedRateToSet, 0.1d);
|
||||||
|
|
||||||
|
// What is current rate of extended bolusing in u/h?
|
||||||
|
if (Config.logPumpActions) {
|
||||||
|
log.debug("setTempBasalAbsolute: Extended bolus in progress: " + isExtendedBoluslInProgress() + " rate: " + getDanaRPump().extendedBolusAbsoluteRate + "U/h duration remaining: " + getDanaRPump().extendedBolusRemainingMinutes + "min");
|
||||||
|
log.debug("setTempBasalAbsolute: Rate to set: " + extendedRateToSet + "U/h");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compare with extended rate in progress
|
||||||
|
if (Math.abs(getDanaRPump().extendedBolusAbsoluteRate - extendedRateToSet) < 0.02D) { // Allow some rounding diff
|
||||||
|
// correct extended already set
|
||||||
|
result.success = true;
|
||||||
|
result.absolute = getDanaRPump().extendedBolusAbsoluteRate;
|
||||||
|
result.enacted = false;
|
||||||
|
result.duration = getDanaRPump().extendedBolusRemainingMinutes;
|
||||||
|
result.isPercent = false;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Correct extended already set");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now set new extended, no need to to stop previous (if running) because it's replaced
|
||||||
|
Double extendedAmount = extendedRateToSet / 2 * durationInHalfHours;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Setting extended: " + extendedAmount + "U halfhours: " + durationInHalfHours);
|
||||||
|
result = setExtendedBolus(extendedAmount, durationInMinutes);
|
||||||
|
if (!result.success) {
|
||||||
|
log.error("setTempBasalAbsolute: Failed to set extended bolus");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalAbsolute: Extended bolus set ok");
|
||||||
|
result.absolute = result.absolute + getBaseBasalRate();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
// We should never end here
|
||||||
|
log.error("setTempBasalAbsolute: Internal error");
|
||||||
|
result.success = false;
|
||||||
|
result.comment = "Internal error";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
|
percent = configBuilderPlugin.applyBasalConstraints(percent);
|
||||||
|
if (percent < 0) {
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.enacted = false;
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.danar_invalidinput);
|
||||||
|
log.error("setTempBasalPercent: Invalid input");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (percent > 200) percent = 200;
|
||||||
|
if (getDanaRPump().isTempBasalInProgress && getDanaRPump().tempBasalPercent == percent) {
|
||||||
|
result.enacted = false;
|
||||||
|
result.success = true;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
result.duration = getDanaRPump().tempBasalRemainingMin;
|
||||||
|
result.percent = getDanaRPump().tempBasalPercent;
|
||||||
|
result.isPercent = true;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalPercent: Correct value already set");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int durationInHours = Math.max(durationInMinutes / 60, 1);
|
||||||
|
boolean connectionOK = sExecutionService.tempBasal(percent, durationInHours);
|
||||||
|
if (connectionOK && getDanaRPump().isTempBasalInProgress && getDanaRPump().tempBasalPercent == percent) {
|
||||||
|
result.enacted = true;
|
||||||
|
result.success = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.duration = getDanaRPump().tempBasalRemainingMin;
|
||||||
|
result.percent = getDanaRPump().tempBasalPercent;
|
||||||
|
result.isPercent = true;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setTempBasalPercent: OK");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result.enacted = false;
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
||||||
|
log.error("setTempBasalPercent: Failed to set temp basal");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
||||||
|
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
|
insulin = configBuilderPlugin.applyBolusConstraints(insulin);
|
||||||
|
// needs to be rounded to 0.1
|
||||||
|
insulin = Round.roundTo(insulin, 0.1d);
|
||||||
|
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
if (getDanaRPump().isExtendedInProgress && Math.abs(getDanaRPump().extendedBolusAmount - insulin) < 0.1d) {
|
||||||
|
result.enacted = false;
|
||||||
|
result.success = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
result.duration = getDanaRPump().extendedBolusRemainingMinutes;
|
||||||
|
result.absolute = getDanaRPump().extendedBolusAbsoluteRate;
|
||||||
|
result.isPercent = false;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setExtendedBolus: Correct extended bolus already set");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int durationInHalfHours = Math.max(durationInMinutes / 30, 1);
|
||||||
|
boolean connectionOK = sExecutionService.extendedBolus(insulin, durationInHalfHours);
|
||||||
|
if (connectionOK && getDanaRPump().isExtendedInProgress && Math.abs(getDanaRPump().extendedBolusAmount - insulin) < 0.1d) {
|
||||||
|
result.enacted = true;
|
||||||
|
result.success = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.duration = getDanaRPump().extendedBolusRemainingMinutes;
|
||||||
|
result.absolute = getDanaRPump().extendedBolusAbsoluteRate;
|
||||||
|
result.bolusDelivered = getDanaRPump().extendedBolusAmount;
|
||||||
|
result.isPercent = false;
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("setExtendedBolus: OK");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result.enacted = false;
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
||||||
|
log.error("setExtendedBolus: Failed to extended bolus");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelTempBasal() {
|
||||||
|
if (isRealTempBasalInProgress())
|
||||||
|
return cancelRealTempBasal();
|
||||||
|
if (isExtendedBoluslInProgress())
|
||||||
|
return cancelExtendedBolus();
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
result.success = true;
|
||||||
|
result.enacted = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
result.isTempCancel = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PumpEnactResult cancelRealTempBasal() {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
if (getDanaRPump().isTempBasalInProgress) {
|
||||||
|
sExecutionService.tempBasalStop();
|
||||||
|
result.enacted = true;
|
||||||
|
result.isTempCancel = true;
|
||||||
|
}
|
||||||
|
if (!getDanaRPump().isTempBasalInProgress) {
|
||||||
|
result.success = true;
|
||||||
|
result.isTempCancel = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("cancelRealTempBasal: OK");
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
||||||
|
result.isTempCancel = true;
|
||||||
|
log.error("cancelRealTempBasal: Failed to cancel temp basal");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelExtendedBolus() {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
if (getDanaRPump().isExtendedInProgress) {
|
||||||
|
sExecutionService.extendedBolusStop();
|
||||||
|
result.enacted = true;
|
||||||
|
result.isTempCancel = true;
|
||||||
|
}
|
||||||
|
if (!getDanaRPump().isExtendedInProgress) {
|
||||||
|
result.success = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
if (Config.logPumpActions)
|
||||||
|
log.debug("cancelExtendedBolus: OK");
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly);
|
||||||
|
log.error("cancelExtendedBolus: Failed to cancel extended bolus");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void doConnect(String from) {
|
||||||
|
if (sExecutionService != null) sExecutionService.connect(from);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isConnected() {
|
||||||
|
return sExecutionService != null && sExecutionService.isConnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isConnecting() {
|
||||||
|
return sExecutionService != null && sExecutionService.isConnecting();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject getJSONStatus() {
|
||||||
|
JSONObject pump = new JSONObject();
|
||||||
|
JSONObject battery = new JSONObject();
|
||||||
|
JSONObject status = new JSONObject();
|
||||||
|
JSONObject extended = new JSONObject();
|
||||||
|
try {
|
||||||
|
battery.put("percent", getDanaRPump().batteryRemaining);
|
||||||
|
status.put("status", "normal");
|
||||||
|
status.put("timestamp", DateUtil.toISOString(new Date()));
|
||||||
|
if (isTempBasalInProgress()) {
|
||||||
|
extended.put("TempBasalAbsoluteRate", getTempBasalAbsoluteRate());
|
||||||
|
extended.put("TempBasalStart", DateUtil.toISOString(getTempBasal().timeStart));
|
||||||
|
extended.put("TempBasalRemaining", getTempBasal().getPlannedRemainingMinutes());
|
||||||
|
extended.put("IsExtended", getTempBasal().isExtended);
|
||||||
|
}
|
||||||
|
extended.put("PumpIOB", getDanaRPump().iob);
|
||||||
|
extended.put("LastBolus", DateUtil.toISOString(getDanaRPump().lastBolusTime));
|
||||||
|
extended.put("LastBolusAmount", getDanaRPump().lastBolusAmount);
|
||||||
|
|
||||||
|
pump.put("battery", battery);
|
||||||
|
pump.put("status", status);
|
||||||
|
pump.put("extended", extended);
|
||||||
|
pump.put("reservoir", (int) getDanaRPump().reservoirRemainingUnits);
|
||||||
|
pump.put("clock", DateUtil.toISOString(new Date()));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return pump;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String deviceID() {
|
||||||
|
return getDanaRPump().serialNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constraint interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLoopEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isClosedModeEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAutosensModeEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAMAModeEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("PointlessBooleanExpression")
|
||||||
|
@Override
|
||||||
|
public Double applyBasalConstraints(Double absoluteRate) {
|
||||||
|
double origAbsoluteRate = absoluteRate;
|
||||||
|
if (getDanaRPump() != null) {
|
||||||
|
if (absoluteRate > getDanaRPump().maxBasal) {
|
||||||
|
absoluteRate = getDanaRPump().maxBasal;
|
||||||
|
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origAbsoluteRate + "U/h by pump constraint to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return absoluteRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("PointlessBooleanExpression")
|
||||||
|
@Override
|
||||||
|
public Integer applyBasalConstraints(Integer percentRate) {
|
||||||
|
Integer origPercentRate = percentRate;
|
||||||
|
if (percentRate < 0) percentRate = 0;
|
||||||
|
if (percentRate > 200) percentRate = 200;
|
||||||
|
if (!Objects.equals(percentRate, origPercentRate) && Config.logConstraintsChanges && !Objects.equals(origPercentRate, Constants.basalPercentOnlyForCheckLimit))
|
||||||
|
log.debug("Limiting percent rate " + origPercentRate + "% to " + percentRate + "%");
|
||||||
|
return percentRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("PointlessBooleanExpression")
|
||||||
|
@Override
|
||||||
|
public Double applyBolusConstraints(Double insulin) {
|
||||||
|
double origInsulin = insulin;
|
||||||
|
if (getDanaRPump() != null) {
|
||||||
|
if (insulin > getDanaRPump().maxBolus) {
|
||||||
|
insulin = getDanaRPump().maxBolus;
|
||||||
|
if (Config.logConstraintsChanges && origInsulin != Constants.bolusOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting bolus " + origInsulin + "U by pump constraint to " + insulin + "U");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return insulin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyCarbsConstraints(Integer carbs) {
|
||||||
|
return carbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyMaxIOBConstraints(Double maxIob) {
|
||||||
|
return maxIob;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public NSProfile getProfile() {
|
||||||
|
DanaRPump pump = getDanaRPump();
|
||||||
|
if (pump.lastSettingsRead.getTime() == 0)
|
||||||
|
return null; // no info now
|
||||||
|
return pump.createConvertedProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reply for sms communicator
|
||||||
|
public String shortStatus() {
|
||||||
|
final DateFormat formatTime = DateFormat.getTimeInstance(DateFormat.SHORT);
|
||||||
|
String ret = "";
|
||||||
|
if (getDanaRPump().lastConnection.getTime() != 0) {
|
||||||
|
Long agoMsec = new Date().getTime() - getDanaRPump().lastConnection.getTime();
|
||||||
|
int agoMin = (int) (agoMsec / 60d / 1000d);
|
||||||
|
ret += "LastConn: " + agoMin + " minago\n";
|
||||||
|
}
|
||||||
|
if (getDanaRPump().lastBolusTime.getTime() != 0) {
|
||||||
|
ret += "LastBolus: " + DecimalFormatter.to2Decimal(getDanaRPump().lastBolusAmount) + "U @" + formatTime.format(getDanaRPump().lastBolusTime) + "\n";
|
||||||
|
}
|
||||||
|
if (isRealTempBasalInProgress()) {
|
||||||
|
ret += "Temp: " + getRealTempBasal().toString() + "\n";
|
||||||
|
}
|
||||||
|
if (isExtendedBoluslInProgress()) {
|
||||||
|
ret += "Extended: " + getExtendedBolus().toString() + "\n";
|
||||||
|
}
|
||||||
|
ret += "IOB: " + getDanaRPump().iob + "U\n";
|
||||||
|
ret += "Reserv: " + DecimalFormatter.to0Decimal(getDanaRPump().reservoirRemainingUnits) + "U\n";
|
||||||
|
ret += "Batt: " + getDanaRPump().batteryRemaining + "\n";
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// TODO: daily total constraint
|
||||||
|
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ 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.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
|
|
||||||
|
@ -49,7 +50,7 @@ public class ProfileViewDialog extends DialogFragment {
|
||||||
mHandlerThread.start();
|
mHandlerThread.start();
|
||||||
|
|
||||||
mHandler = new Handler(mHandlerThread.getLooper());
|
mHandler = new Handler(mHandlerThread.getLooper());
|
||||||
profile = ((DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class)).getProfile();
|
profile = ((DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class)).getProfile();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -73,8 +74,8 @@ public class ProfileViewDialog extends DialogFragment {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
DanaRFragment.getDanaRPump().lastSettingsRead = new Date(0);
|
DanaRPlugin.getDanaRPump().lastSettingsRead = new Date(0);
|
||||||
DanaRFragment.doConnect("ProfileViewDialog");
|
DanaRPlugin.doConnect("ProfileViewDialog");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
dismiss();
|
dismiss();
|
||||||
|
|
|
@ -40,7 +40,7 @@ import info.nightscout.androidaps.Constants;
|
||||||
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.DanaRHistoryRecord;
|
import info.nightscout.androidaps.db.DanaRHistoryRecord;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes;
|
import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
||||||
|
@ -68,7 +68,7 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
LinearLayoutManager llm;
|
LinearLayoutManager llm;
|
||||||
|
|
||||||
static byte showingType = RecordTypes.RECORD_TYPE_ALARM;
|
static byte showingType = RecordTypes.RECORD_TYPE_ALARM;
|
||||||
List<DanaRHistoryRecord> historyList = new ArrayList<DanaRHistoryRecord>();
|
List<DanaRHistoryRecord> historyList = new ArrayList<>();
|
||||||
|
|
||||||
public static class TypeList {
|
public static class TypeList {
|
||||||
public byte type;
|
public byte type;
|
||||||
|
@ -169,7 +169,7 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, getString(R.string.danar_history_glucose)));
|
typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, getString(R.string.danar_history_glucose)));
|
||||||
typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, getString(R.string.danar_history_refill)));
|
typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, getString(R.string.danar_history_refill)));
|
||||||
typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, getString(R.string.danar_history_syspend)));
|
typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, getString(R.string.danar_history_syspend)));
|
||||||
ArrayAdapter<TypeList> spinnerAdapter = new ArrayAdapter<TypeList>(this,
|
ArrayAdapter<TypeList> spinnerAdapter = new ArrayAdapter<>(this,
|
||||||
android.R.layout.simple_spinner_item, typeList);
|
android.R.layout.simple_spinner_item, typeList);
|
||||||
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||||
historyTypeSpinner.setAdapter(spinnerAdapter);
|
historyTypeSpinner.setAdapter(spinnerAdapter);
|
||||||
|
@ -215,7 +215,6 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
TypeList selected = (TypeList) historyTypeSpinner.getSelectedItem();
|
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -252,12 +251,10 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
clearCardView();
|
clearCardView();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
profile = ConfigBuilderPlugin.getActiveProfile().getProfile();
|
||||||
profile = configBuilderFragment.getActiveProfile().getProfile();
|
|
||||||
if (profile == null) {
|
if (profile == null) {
|
||||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile));
|
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile));
|
||||||
finish();
|
finish();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,8 +269,7 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
@Override
|
@Override
|
||||||
public HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
public HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
||||||
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.danar_history_item, viewGroup, false);
|
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.danar_history_item, viewGroup, false);
|
||||||
HistoryViewHolder tempBasalsViewHolder = new HistoryViewHolder(v);
|
return new HistoryViewHolder(v);
|
||||||
return tempBasalsViewHolder;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -398,7 +394,7 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
historyList = dao.query(preparedQuery);
|
historyList = dao.query(preparedQuery);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
historyList = new ArrayList<DanaRHistoryRecord>();
|
historyList = new ArrayList<>();
|
||||||
}
|
}
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -409,7 +405,7 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearCardView() {
|
private void clearCardView() {
|
||||||
historyList = new ArrayList<DanaRHistoryRecord>();
|
historyList = new ArrayList<>();
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -436,10 +432,10 @@ public class DanaRHistoryActivity extends Activity {
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (c.sStatus == c.CONNECTING) {
|
if (c.sStatus == EventDanaRConnectionStatus.CONNECTING) {
|
||||||
statusView.setText(String.format(getString(R.string.danar_history_connectingfor), c.sSecondsElapsed));
|
statusView.setText(String.format(getString(R.string.danar_history_connectingfor), c.sSecondsElapsed));
|
||||||
log.debug("EventDanaRConnectionStatus: " + "Connecting for " + c.sSecondsElapsed + "s");
|
log.debug("EventDanaRConnectionStatus: " + "Connecting for " + c.sSecondsElapsed + "s");
|
||||||
} else if (c.sStatus == c.CONNECTED) {
|
} else if (c.sStatus == EventDanaRConnectionStatus.CONNECTED) {
|
||||||
statusView.setText(MainApp.sResources.getString(R.string.connected));
|
statusView.setText(MainApp.sResources.getString(R.string.connected));
|
||||||
log.debug("EventDanaRConnectionStatus: Connected");
|
log.debug("EventDanaRConnectionStatus: Connected");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -11,7 +11,7 @@ import java.util.List;
|
||||||
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.DanaRHistoryRecord;
|
import info.nightscout.androidaps.db.DanaRHistoryRecord;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes;
|
import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRSyncStatus;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRSyncStatus;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
@ -44,8 +44,8 @@ public class DanaRNSHistorySync {
|
||||||
|
|
||||||
public void sync(int what) {
|
public void sync(int what) {
|
||||||
try {
|
try {
|
||||||
ConfigBuilderFragment configBuilderFragment = MainApp.getConfigBuilder();
|
ConfigBuilderPlugin ConfigBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
NSProfile profile = configBuilderFragment.getActiveProfile().getProfile();
|
NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile();
|
||||||
if (profile == null) {
|
if (profile == null) {
|
||||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile));
|
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile));
|
||||||
return;
|
return;
|
||||||
|
@ -73,7 +73,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("insulin", record.getRecordValue());
|
nsrec.put("insulin", record.getRecordValue());
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_sbolus);
|
ev.message += MainApp.sResources.getString(R.string.danar_sbolus);
|
||||||
break;
|
break;
|
||||||
|
@ -91,7 +91,7 @@ public class DanaRNSHistorySync {
|
||||||
cal.add(Calendar.MINUTE, -1 * record.getRecordDuration());
|
cal.add(Calendar.MINUTE, -1 * record.getRecordDuration());
|
||||||
nsrec.put("created_at", DateUtil.toISOString(cal.getTime()));
|
nsrec.put("created_at", DateUtil.toISOString(cal.getTime()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_ebolus);
|
ev.message += MainApp.sResources.getString(R.string.danar_ebolus);
|
||||||
} else {
|
} else {
|
||||||
|
@ -107,7 +107,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("splitExt", 0);
|
nsrec.put("splitExt", 0);
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_dsbolus);
|
ev.message += MainApp.sResources.getString(R.string.danar_dsbolus);
|
||||||
break;
|
break;
|
||||||
|
@ -123,7 +123,7 @@ public class DanaRNSHistorySync {
|
||||||
cal.add(Calendar.MINUTE, -1 * record.getRecordDuration());
|
cal.add(Calendar.MINUTE, -1 * record.getRecordDuration());
|
||||||
nsrec.put("created_at", DateUtil.toISOString(cal.getTime()));
|
nsrec.put("created_at", DateUtil.toISOString(cal.getTime()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_debolus);
|
ev.message += MainApp.sResources.getString(R.string.danar_debolus);
|
||||||
break;
|
break;
|
||||||
|
@ -140,7 +140,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("notes", "Error");
|
nsrec.put("notes", "Error");
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_error);
|
ev.message += MainApp.sResources.getString(R.string.danar_error);
|
||||||
break;
|
break;
|
||||||
|
@ -152,7 +152,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("notes", "Refill " + record.getRecordValue() + "U");
|
nsrec.put("notes", "Refill " + record.getRecordValue() + "U");
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_refill);
|
ev.message += MainApp.sResources.getString(R.string.danar_refill);
|
||||||
break;
|
break;
|
||||||
|
@ -165,7 +165,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("duration", 60);
|
nsrec.put("duration", 60);
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_basalhour);
|
ev.message += MainApp.sResources.getString(R.string.danar_basalhour);
|
||||||
break;
|
break;
|
||||||
|
@ -181,7 +181,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("glucoseType", "Finger");
|
nsrec.put("glucoseType", "Finger");
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_glucose);
|
ev.message += MainApp.sResources.getString(R.string.danar_glucose);
|
||||||
break;
|
break;
|
||||||
|
@ -193,7 +193,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("carbs", record.getRecordValue());
|
nsrec.put("carbs", record.getRecordValue());
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_carbohydrate);
|
ev.message += MainApp.sResources.getString(R.string.danar_carbohydrate);
|
||||||
break;
|
break;
|
||||||
|
@ -205,7 +205,7 @@ public class DanaRNSHistorySync {
|
||||||
nsrec.put("notes", "Alarm: " + record.getRecordAlarm());
|
nsrec.put("notes", "Alarm: " + record.getRecordAlarm());
|
||||||
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
nsrec.put("created_at", DateUtil.toISOString(record.getRecordDate()));
|
||||||
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
nsrec.put("enteredBy", MainApp.sResources.getString(R.string.app_name));
|
||||||
ConfigBuilderFragment.uploadCareportalEntryToNS(nsrec);
|
ConfigBuilderPlugin.uploadCareportalEntryToNS(nsrec);
|
||||||
uploaded++;
|
uploaded++;
|
||||||
ev.message += MainApp.sResources.getString(R.string.danar_alarm);
|
ev.message += MainApp.sResources.getString(R.string.danar_alarm);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -32,6 +32,7 @@ import info.nightscout.androidaps.db.Treatment;
|
||||||
import info.nightscout.androidaps.events.EventAppExit;
|
import info.nightscout.androidaps.events.EventAppExit;
|
||||||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.SerialIOThread;
|
import info.nightscout.androidaps.plugins.DanaR.SerialIOThread;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||||
|
@ -120,8 +121,7 @@ public class ExecutionService extends Service {
|
||||||
public ExecutionService() {
|
public ExecutionService() {
|
||||||
registerBus();
|
registerBus();
|
||||||
MainApp.instance().getApplicationContext().registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED));
|
MainApp.instance().getApplicationContext().registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED));
|
||||||
DanaRFragment danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
danaRPump = DanaRPlugin.getDanaRPump();
|
||||||
danaRPump = danaRFragment.getDanaRPump();
|
|
||||||
|
|
||||||
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
|
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
|
||||||
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ExecutionService");
|
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ExecutionService");
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mike on 28.05.2016.
|
* Created by mike on 28.05.2016.
|
||||||
|
@ -28,10 +28,10 @@ public class MsgInitConnStatusOption extends MessageBase {
|
||||||
int h = intFromBuff(bytes, 7, 1);
|
int h = intFromBuff(bytes, 7, 1);
|
||||||
int i = intFromBuff(bytes, 8, 1);
|
int i = intFromBuff(bytes, 8, 1);
|
||||||
if (bytes.length >= 21) {
|
if (bytes.length >= 21) {
|
||||||
DanaRFragment.getDanaRPump().password = intFromBuff(bytes, 9, 2) ^ 0x3463;
|
DanaRPlugin.getDanaRPump().password = intFromBuff(bytes, 9, 2) ^ 0x3463;
|
||||||
DanaRFragment.getDanaRPump().isNewPump = true;
|
DanaRPlugin.getDanaRPump().isNewPump = true;
|
||||||
if (Config.logDanaMessageDetail)
|
if (Config.logDanaMessageDetail)
|
||||||
log.debug("Pump password: " + DanaRFragment.getDanaRPump().password);
|
log.debug("Pump password: " + DanaRPlugin.getDanaRPump().password);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mike on 05.07.2016.
|
* Created by mike on 05.07.2016.
|
||||||
|
@ -17,9 +17,9 @@ public class MsgSettingActiveProfile extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRFragment.getDanaRPump().activeProfile = intFromBuff(bytes, 0, 1);
|
DanaRPlugin.getDanaRPump().activeProfile = intFromBuff(bytes, 0, 1);
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail)
|
if (Config.logDanaMessageDetail)
|
||||||
log.debug("Active profile number: " + DanaRFragment.getDanaRPump().activeProfile);
|
log.debug("Active profile number: " + DanaRPlugin.getDanaRPump().activeProfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,7 +18,7 @@ public class MsgSettingBasal extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRPump pump = DanaRFragment.getDanaRPump();
|
DanaRPump pump = DanaRPlugin.getDanaRPump();
|
||||||
if (pump.pumpProfiles == null) pump.pumpProfiles = new double[4][];
|
if (pump.pumpProfiles == null) pump.pumpProfiles = new double[4][];
|
||||||
pump.pumpProfiles[pump.activeProfile] = new double[24];
|
pump.pumpProfiles[pump.activeProfile] = new double[24];
|
||||||
for (int index = 0; index < 24; index++) {
|
for (int index = 0; index < 24; index++) {
|
||||||
|
@ -29,7 +29,7 @@ public class MsgSettingBasal extends MessageBase {
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail)
|
if (Config.logDanaMessageDetail)
|
||||||
for (int index = 0; index < 24; index++) {
|
for (int index = 0; index < 24; index++) {
|
||||||
log.debug("Basal " + String.format("%02d", index) + "h: " + DanaRFragment.getDanaRPump().pumpProfiles[DanaRFragment.getDanaRPump().activeProfile][index]);
|
log.debug("Basal " + String.format("%02d", index) + "h: " + DanaRPlugin.getDanaRPump().pumpProfiles[DanaRPlugin.getDanaRPump().activeProfile][index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,16 +4,15 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mike on 05.07.2016.
|
* Created by mike on 05.07.2016.
|
||||||
*
|
* <p/>
|
||||||
*
|
* <p/>
|
||||||
* THIS IS BROKEN IN PUMP... SENDING ONLY 1 PROFILE
|
* THIS IS BROKEN IN PUMP... SENDING ONLY 1 PROFILE
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class MsgSettingBasalProfileAll extends MessageBase {
|
public class MsgSettingBasalProfileAll extends MessageBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(MsgSettingBasalProfileAll.class);
|
private static Logger log = LoggerFactory.getLogger(MsgSettingBasalProfileAll.class);
|
||||||
|
@ -23,8 +22,8 @@ public class MsgSettingBasalProfileAll extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRPump pump = DanaRFragment.getDanaRPump();
|
DanaRPump pump = DanaRPlugin.getDanaRPump();
|
||||||
if (DanaRFragment.getDanaRPump().basal48Enable) {
|
if (DanaRPlugin.getDanaRPump().basal48Enable) {
|
||||||
pump.pumpProfiles = new double[4][];
|
pump.pumpProfiles = new double[4][];
|
||||||
for (int profile = 0; profile < 4; profile++) {
|
for (int profile = 0; profile < 4; profile++) {
|
||||||
int position = intFromBuff(bytes, 107 * profile, 1);
|
int position = intFromBuff(bytes, 107 * profile, 1);
|
||||||
|
@ -51,10 +50,10 @@ public class MsgSettingBasalProfileAll extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
if (DanaRFragment.getDanaRPump().basal48Enable) {
|
if (DanaRPlugin.getDanaRPump().basal48Enable) {
|
||||||
for (int profile = 0; profile < 4; profile++) {
|
for (int profile = 0; profile < 4; profile++) {
|
||||||
for (int index = 0; index < 24; index++) {
|
for (int index = 0; index < 24; index++) {
|
||||||
log.debug("Basal profile " + profile + ": " + String.format("%02d", index) + "h: " + DanaRFragment.getDanaRPump().pumpProfiles[profile][index]);
|
log.debug("Basal profile " + profile + ": " + String.format("%02d", index) + "h: " + DanaRPlugin.getDanaRPump().pumpProfiles[profile][index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -63,7 +62,7 @@ public class MsgSettingBasalProfileAll extends MessageBase {
|
||||||
log.debug("Basal profile " + profile + ": " +
|
log.debug("Basal profile " + profile + ": " +
|
||||||
String.format("%02d", (index / 2)) +
|
String.format("%02d", (index / 2)) +
|
||||||
":" + String.format("%02d", (index % 2) * 30) + " : " +
|
":" + String.format("%02d", (index % 2) * 30) + " : " +
|
||||||
DanaRFragment.getDanaRPump().pumpProfiles[profile][index]);
|
DanaRPlugin.getDanaRPump().pumpProfiles[profile][index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,12 +18,12 @@ public class MsgSettingGlucose extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRFragment.getDanaRPump().units = intFromBuff(bytes, 0, 1);
|
DanaRPlugin.getDanaRPump().units = intFromBuff(bytes, 0, 1);
|
||||||
DanaRFragment.getDanaRPump().easyBasalMode = intFromBuff(bytes, 1, 1);
|
DanaRPlugin.getDanaRPump().easyBasalMode = intFromBuff(bytes, 1, 1);
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Pump units: " + (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
log.debug("Pump units: " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||||
log.debug("Easy basal mode: " + DanaRFragment.getDanaRPump().easyBasalMode);
|
log.debug("Easy basal mode: " + DanaRPlugin.getDanaRPump().easyBasalMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,14 +18,14 @@ public class MsgSettingMaxValues extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRFragment.getDanaRPump().maxBolus = intFromBuff(bytes, 0, 2) / 100d;
|
DanaRPlugin.getDanaRPump().maxBolus = intFromBuff(bytes, 0, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().maxBasal = intFromBuff(bytes, 2, 2) / 100d;
|
DanaRPlugin.getDanaRPump().maxBasal = intFromBuff(bytes, 2, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().maxDailyTotalUnits = intFromBuff(bytes, 4, 2) / 100;
|
DanaRPlugin.getDanaRPump().maxDailyTotalUnits = intFromBuff(bytes, 4, 2) / 100;
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Max bolus: " + DanaRFragment.getDanaRPump().maxBolus);
|
log.debug("Max bolus: " + DanaRPlugin.getDanaRPump().maxBolus);
|
||||||
log.debug("Max basal: " + DanaRFragment.getDanaRPump().maxBasal);
|
log.debug("Max basal: " + DanaRPlugin.getDanaRPump().maxBasal);
|
||||||
log.debug("Total daily max units: " + DanaRFragment.getDanaRPump().maxDailyTotalUnits);
|
log.debug("Total daily max units: " + DanaRPlugin.getDanaRPump().maxDailyTotalUnits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,27 +18,27 @@ public class MsgSettingProfileRatios extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
if (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
if (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
||||||
DanaRFragment.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||||
DanaRFragment.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
||||||
DanaRFragment.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
||||||
DanaRFragment.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
DanaRPlugin.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
||||||
} else {
|
} else {
|
||||||
DanaRFragment.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||||
DanaRFragment.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
DanaRPlugin.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Pump units (saved): " + (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
log.debug("Pump units (saved): " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||||
log.debug("Current pump CIR: " + DanaRFragment.getDanaRPump().currentCIR);
|
log.debug("Current pump CIR: " + DanaRPlugin.getDanaRPump().currentCIR);
|
||||||
log.debug("Current pump CF: " + DanaRFragment.getDanaRPump().currentCF);
|
log.debug("Current pump CF: " + DanaRPlugin.getDanaRPump().currentCF);
|
||||||
log.debug("Current pump AI: " + DanaRFragment.getDanaRPump().currentAI);
|
log.debug("Current pump AI: " + DanaRPlugin.getDanaRPump().currentAI);
|
||||||
log.debug("Current pump target: " + DanaRFragment.getDanaRPump().currentTarget);
|
log.debug("Current pump target: " + DanaRPlugin.getDanaRPump().currentTarget);
|
||||||
log.debug("Current pump AIDR: " + DanaRFragment.getDanaRPump().currentAIDR);
|
log.debug("Current pump AIDR: " + DanaRPlugin.getDanaRPump().currentAIDR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,38 +18,38 @@ public class MsgSettingProfileRatiosAll extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
if (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
if (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
||||||
DanaRFragment.getDanaRPump().morningCIR = intFromBuff(bytes, 0, 2);
|
DanaRPlugin.getDanaRPump().morningCIR = intFromBuff(bytes, 0, 2);
|
||||||
DanaRFragment.getDanaRPump().morningCF = intFromBuff(bytes, 2, 2);
|
DanaRPlugin.getDanaRPump().morningCF = intFromBuff(bytes, 2, 2);
|
||||||
DanaRFragment.getDanaRPump().afternoonCIR = intFromBuff(bytes, 4, 2);
|
DanaRPlugin.getDanaRPump().afternoonCIR = intFromBuff(bytes, 4, 2);
|
||||||
DanaRFragment.getDanaRPump().afternoonCF = intFromBuff(bytes, 6, 2);
|
DanaRPlugin.getDanaRPump().afternoonCF = intFromBuff(bytes, 6, 2);
|
||||||
DanaRFragment.getDanaRPump().eveningCIR = intFromBuff(bytes, 8, 2);
|
DanaRPlugin.getDanaRPump().eveningCIR = intFromBuff(bytes, 8, 2);
|
||||||
DanaRFragment.getDanaRPump().eveningCF = intFromBuff(bytes, 10, 2);
|
DanaRPlugin.getDanaRPump().eveningCF = intFromBuff(bytes, 10, 2);
|
||||||
DanaRFragment.getDanaRPump().nightCIR = intFromBuff(bytes, 12, 2);
|
DanaRPlugin.getDanaRPump().nightCIR = intFromBuff(bytes, 12, 2);
|
||||||
DanaRFragment.getDanaRPump().nightCF = intFromBuff(bytes, 14, 2);
|
DanaRPlugin.getDanaRPump().nightCF = intFromBuff(bytes, 14, 2);
|
||||||
} else {
|
} else {
|
||||||
DanaRFragment.getDanaRPump().morningCIR = intFromBuff(bytes, 0, 2);
|
DanaRPlugin.getDanaRPump().morningCIR = intFromBuff(bytes, 0, 2);
|
||||||
DanaRFragment.getDanaRPump().morningCF = intFromBuff(bytes, 2, 2) / 100d;
|
DanaRPlugin.getDanaRPump().morningCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().afternoonCIR = intFromBuff(bytes, 4, 2);
|
DanaRPlugin.getDanaRPump().afternoonCIR = intFromBuff(bytes, 4, 2);
|
||||||
DanaRFragment.getDanaRPump().afternoonCF = intFromBuff(bytes, 6, 2) / 100d;
|
DanaRPlugin.getDanaRPump().afternoonCF = intFromBuff(bytes, 6, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().eveningCIR = intFromBuff(bytes, 8, 2);
|
DanaRPlugin.getDanaRPump().eveningCIR = intFromBuff(bytes, 8, 2);
|
||||||
DanaRFragment.getDanaRPump().eveningCF = intFromBuff(bytes, 10, 2) / 100d;
|
DanaRPlugin.getDanaRPump().eveningCF = intFromBuff(bytes, 10, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().nightCIR = intFromBuff(bytes, 12, 2);
|
DanaRPlugin.getDanaRPump().nightCIR = intFromBuff(bytes, 12, 2);
|
||||||
DanaRFragment.getDanaRPump().nightCF = intFromBuff(bytes, 14, 2) / 100d;
|
DanaRPlugin.getDanaRPump().nightCF = intFromBuff(bytes, 14, 2) / 100d;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Pump units: " + (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
log.debug("Pump units: " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||||
log.debug("Current pump morning CIR: " + DanaRFragment.getDanaRPump().morningCIR);
|
log.debug("Current pump morning CIR: " + DanaRPlugin.getDanaRPump().morningCIR);
|
||||||
log.debug("Current pump morning CF: " + DanaRFragment.getDanaRPump().morningCF);
|
log.debug("Current pump morning CF: " + DanaRPlugin.getDanaRPump().morningCF);
|
||||||
log.debug("Current pump afternoon CIR: " + DanaRFragment.getDanaRPump().afternoonCIR);
|
log.debug("Current pump afternoon CIR: " + DanaRPlugin.getDanaRPump().afternoonCIR);
|
||||||
log.debug("Current pump afternoon CF: " + DanaRFragment.getDanaRPump().afternoonCF);
|
log.debug("Current pump afternoon CF: " + DanaRPlugin.getDanaRPump().afternoonCF);
|
||||||
log.debug("Current pump evening CIR: " + DanaRFragment.getDanaRPump().eveningCIR);
|
log.debug("Current pump evening CIR: " + DanaRPlugin.getDanaRPump().eveningCIR);
|
||||||
log.debug("Current pump evening CF: " + DanaRFragment.getDanaRPump().eveningCF);
|
log.debug("Current pump evening CF: " + DanaRPlugin.getDanaRPump().eveningCF);
|
||||||
log.debug("Current pump night CIR: " + DanaRFragment.getDanaRPump().nightCIR);
|
log.debug("Current pump night CIR: " + DanaRPlugin.getDanaRPump().nightCIR);
|
||||||
log.debug("Current pump night CF: " + DanaRFragment.getDanaRPump().nightCF);
|
log.debug("Current pump night CF: " + DanaRPlugin.getDanaRPump().nightCF);
|
||||||
}
|
}
|
||||||
|
|
||||||
DanaRFragment.getDanaRPump().createConvertedProfile();
|
DanaRPlugin.getDanaRPump().createConvertedProfile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
public class MsgSettingPumpTime extends MessageBase {
|
public class MsgSettingPumpTime extends MessageBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(MsgSettingPumpTime.class);
|
private static Logger log = LoggerFactory.getLogger(MsgSettingPumpTime.class);
|
||||||
|
@ -29,6 +29,6 @@ public class MsgSettingPumpTime extends MessageBase {
|
||||||
if (Config.logDanaMessageDetail)
|
if (Config.logDanaMessageDetail)
|
||||||
log.debug("Pump time: " + time);
|
log.debug("Pump time: " + time);
|
||||||
|
|
||||||
DanaRFragment.getDanaRPump().pumpTime = time;
|
DanaRPlugin.getDanaRPump().pumpTime = time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mike on 05.07.2016.
|
* Created by mike on 05.07.2016.
|
||||||
|
@ -17,13 +17,13 @@ public class MsgSettingShippingInfo extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRFragment.getDanaRPump().serialNumber = stringFromBuff(bytes, 0, 10);
|
DanaRPlugin.getDanaRPump().serialNumber = stringFromBuff(bytes, 0, 10);
|
||||||
DanaRFragment.getDanaRPump().shippingDate = dateFromBuff(bytes, 10);
|
DanaRPlugin.getDanaRPump().shippingDate = dateFromBuff(bytes, 10);
|
||||||
DanaRFragment.getDanaRPump().shippingCountry = asciiStringFromBuff(bytes, 13, 3);
|
DanaRPlugin.getDanaRPump().shippingCountry = asciiStringFromBuff(bytes, 13, 3);
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Serial number: " + DanaRFragment.getDanaRPump().serialNumber);
|
log.debug("Serial number: " + DanaRPlugin.getDanaRPump().serialNumber);
|
||||||
log.debug("Shipping date: " + DanaRFragment.getDanaRPump().shippingDate);
|
log.debug("Shipping date: " + DanaRPlugin.getDanaRPump().shippingDate);
|
||||||
log.debug("Shipping country: " + DanaRFragment.getDanaRPump().shippingCountry);
|
log.debug("Shipping country: " + DanaRPlugin.getDanaRPump().shippingCountry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
public class MsgStatus extends MessageBase {
|
public class MsgStatus extends MessageBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(MsgStatus.class);
|
private static Logger log = LoggerFactory.getLogger(MsgStatus.class);
|
||||||
|
@ -14,25 +14,25 @@ public class MsgStatus extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
DanaRFragment.getDanaRPump().dailyTotalUnits = intFromBuff(bytes, 0, 3) / 750d;
|
DanaRPlugin.getDanaRPump().dailyTotalUnits = intFromBuff(bytes, 0, 3) / 750d;
|
||||||
DanaRFragment.getDanaRPump().isExtendedInProgress = intFromBuff(bytes, 3, 1) == 1;
|
DanaRPlugin.getDanaRPump().isExtendedInProgress = intFromBuff(bytes, 3, 1) == 1;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusMinutes = intFromBuff(bytes, 4, 2);
|
DanaRPlugin.getDanaRPump().extendedBolusMinutes = intFromBuff(bytes, 4, 2);
|
||||||
DanaRFragment.getDanaRPump().extendedBolusAmount = intFromBuff(bytes, 6, 2) / 100d;
|
DanaRPlugin.getDanaRPump().extendedBolusAmount = intFromBuff(bytes, 6, 2) / 100d;
|
||||||
Double lastBolusAmount = intFromBuff(bytes, 13, 2) / 100d;
|
Double lastBolusAmount = intFromBuff(bytes, 13, 2) / 100d;
|
||||||
if (lastBolusAmount != 0d) {
|
if (lastBolusAmount != 0d) {
|
||||||
DanaRFragment.getDanaRPump().lastBolusTime = dateTimeFromBuff(bytes, 8);
|
DanaRPlugin.getDanaRPump().lastBolusTime = dateTimeFromBuff(bytes, 8);
|
||||||
DanaRFragment.getDanaRPump().lastBolusAmount = lastBolusAmount;
|
DanaRPlugin.getDanaRPump().lastBolusAmount = lastBolusAmount;
|
||||||
}
|
}
|
||||||
DanaRFragment.getDanaRPump().iob = intFromBuff(bytes, 15, 2) / 100d;
|
DanaRPlugin.getDanaRPump().iob = intFromBuff(bytes, 15, 2) / 100d;
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Daily total: " + DanaRFragment.getDanaRPump().dailyTotalUnits);
|
log.debug("Daily total: " + DanaRPlugin.getDanaRPump().dailyTotalUnits);
|
||||||
log.debug("Is extended bolus running: " + DanaRFragment.getDanaRPump().isExtendedInProgress);
|
log.debug("Is extended bolus running: " + DanaRPlugin.getDanaRPump().isExtendedInProgress);
|
||||||
log.debug("Extended bolus min: " + DanaRFragment.getDanaRPump().extendedBolusMinutes);
|
log.debug("Extended bolus min: " + DanaRPlugin.getDanaRPump().extendedBolusMinutes);
|
||||||
log.debug("Extended bolus amount: " + DanaRFragment.getDanaRPump().extendedBolusAmount);
|
log.debug("Extended bolus amount: " + DanaRPlugin.getDanaRPump().extendedBolusAmount);
|
||||||
log.debug("Last bolus time: " + DanaRFragment.getDanaRPump().lastBolusTime);
|
log.debug("Last bolus time: " + DanaRPlugin.getDanaRPump().lastBolusTime);
|
||||||
log.debug("Last bolus amount: " + DanaRFragment.getDanaRPump().lastBolusAmount);
|
log.debug("Last bolus amount: " + DanaRPlugin.getDanaRPump().lastBolusAmount);
|
||||||
log.debug("IOB: " + DanaRFragment.getDanaRPump().iob);
|
log.debug("IOB: " + DanaRPlugin.getDanaRPump().iob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
|
||||||
|
|
||||||
public class MsgStatusBasic extends MessageBase {
|
public class MsgStatusBasic extends MessageBase {
|
||||||
|
@ -27,17 +27,17 @@ public class MsgStatusBasic extends MessageBase {
|
||||||
boolean isTempBasalInProgress = intFromBuff(bytes, 15, 1) == 1;
|
boolean isTempBasalInProgress = intFromBuff(bytes, 15, 1) == 1;
|
||||||
int batteryRemaining = intFromBuff(bytes, 20, 1);
|
int batteryRemaining = intFromBuff(bytes, 20, 1);
|
||||||
|
|
||||||
DanaRFragment.getDanaRPump().pumpSuspended = pumpSuspended;
|
DanaRPlugin.getDanaRPump().pumpSuspended = pumpSuspended;
|
||||||
DanaRFragment.getDanaRPump().calculatorEnabled = calculatorEnabled;
|
DanaRPlugin.getDanaRPump().calculatorEnabled = calculatorEnabled;
|
||||||
DanaRFragment.getDanaRPump().dailyTotalUnits = dailyTotalUnits;
|
DanaRPlugin.getDanaRPump().dailyTotalUnits = dailyTotalUnits;
|
||||||
DanaRFragment.getDanaRPump().maxDailyTotalUnits = maxDailyTotalUnits;
|
DanaRPlugin.getDanaRPump().maxDailyTotalUnits = maxDailyTotalUnits;
|
||||||
DanaRFragment.getDanaRPump().reservoirRemainingUnits = reservoirRemainingUnits;
|
DanaRPlugin.getDanaRPump().reservoirRemainingUnits = reservoirRemainingUnits;
|
||||||
DanaRFragment.getDanaRPump().bolusBlocked = bolusBlocked;
|
DanaRPlugin.getDanaRPump().bolusBlocked = bolusBlocked;
|
||||||
DanaRFragment.getDanaRPump().currentBasal = currentBasal;
|
DanaRPlugin.getDanaRPump().currentBasal = currentBasal;
|
||||||
DanaRFragment.getDanaRPump().tempBasalPercent = tempBasalPercent;
|
DanaRPlugin.getDanaRPump().tempBasalPercent = tempBasalPercent;
|
||||||
DanaRFragment.getDanaRPump().isExtendedInProgress = isExtendedInProgress;
|
DanaRPlugin.getDanaRPump().isExtendedInProgress = isExtendedInProgress;
|
||||||
DanaRFragment.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress;
|
DanaRPlugin.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress;
|
||||||
DanaRFragment.getDanaRPump().batteryRemaining = batteryRemaining;
|
DanaRPlugin.getDanaRPump().batteryRemaining = batteryRemaining;
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Pump suspended: " + pumpSuspended);
|
log.debug("Pump suspended: " + pumpSuspended);
|
||||||
|
|
|
@ -9,11 +9,10 @@ import java.sql.SQLException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.MainActivity;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.db.TempBasal;
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
public class MsgStatusBolusExtended extends MessageBase {
|
public class MsgStatusBolusExtended extends MessageBase {
|
||||||
|
@ -36,13 +35,13 @@ public class MsgStatusBolusExtended extends MessageBase {
|
||||||
Date extendedBolusStart = isExtendedInProgress ? getDateFromSecAgo(extendedBolusSoFarInSecs) : new Date(0);
|
Date extendedBolusStart = isExtendedInProgress ? getDateFromSecAgo(extendedBolusSoFarInSecs) : new Date(0);
|
||||||
int extendedBolusRemainingMinutes = extendedBolusMinutes - extendedBolusSoFarInMinutes;
|
int extendedBolusRemainingMinutes = extendedBolusMinutes - extendedBolusSoFarInMinutes;
|
||||||
|
|
||||||
DanaRFragment.getDanaRPump().isExtendedInProgress = isExtendedInProgress;
|
DanaRPlugin.getDanaRPump().isExtendedInProgress = isExtendedInProgress;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusMinutes = extendedBolusMinutes;
|
DanaRPlugin.getDanaRPump().extendedBolusMinutes = extendedBolusMinutes;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusAmount = extendedBolusAmount;
|
DanaRPlugin.getDanaRPump().extendedBolusAmount = extendedBolusAmount;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusSoFarInMinutes = extendedBolusSoFarInMinutes;
|
DanaRPlugin.getDanaRPump().extendedBolusSoFarInMinutes = extendedBolusSoFarInMinutes;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusAbsoluteRate = extendedBolusAbsoluteRate;
|
DanaRPlugin.getDanaRPump().extendedBolusAbsoluteRate = extendedBolusAbsoluteRate;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusStart = extendedBolusStart;
|
DanaRPlugin.getDanaRPump().extendedBolusStart = extendedBolusStart;
|
||||||
DanaRFragment.getDanaRPump().extendedBolusRemainingMinutes = extendedBolusRemainingMinutes;
|
DanaRPlugin.getDanaRPump().extendedBolusRemainingMinutes = extendedBolusRemainingMinutes;
|
||||||
|
|
||||||
updateExtendedBolusInDB();
|
updateExtendedBolusInDB();
|
||||||
|
|
||||||
|
@ -63,14 +62,14 @@ public class MsgStatusBolusExtended extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateExtendedBolusInDB() {
|
public static void updateExtendedBolusInDB() {
|
||||||
DanaRFragment danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
DanaRPlugin DanaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||||
DanaRPump danaRPump = danaRFragment.getDanaRPump();
|
DanaRPump danaRPump = DanaRPlugin.getDanaRPump();
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (danaRFragment.isExtendedBoluslInProgress()) {
|
if (DanaRPlugin.isExtendedBoluslInProgress()) {
|
||||||
TempBasal extendedBolus = danaRFragment.getExtendedBolus();
|
TempBasal extendedBolus = DanaRPlugin.getExtendedBolus();
|
||||||
if (danaRPump.isExtendedInProgress) {
|
if (danaRPump.isExtendedInProgress) {
|
||||||
if (extendedBolus.absolute != danaRPump.extendedBolusAbsoluteRate) {
|
if (extendedBolus.absolute != danaRPump.extendedBolusAbsoluteRate) {
|
||||||
// Close current extended
|
// Close current extended
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,25 +18,25 @@ public class MsgStatusProfile extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMessage(byte[] bytes) {
|
public void handleMessage(byte[] bytes) {
|
||||||
if (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
if (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
||||||
DanaRFragment.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||||
DanaRFragment.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
||||||
DanaRFragment.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
||||||
} else {
|
} else {
|
||||||
DanaRFragment.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||||
DanaRFragment.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||||
DanaRFragment.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Pump units (saved): " + (DanaRFragment.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
log.debug("Pump units (saved): " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||||
log.debug("Current pump CIR: " + DanaRFragment.getDanaRPump().currentCIR);
|
log.debug("Current pump CIR: " + DanaRPlugin.getDanaRPump().currentCIR);
|
||||||
log.debug("Current pump CF: " + DanaRFragment.getDanaRPump().currentCF);
|
log.debug("Current pump CF: " + DanaRPlugin.getDanaRPump().currentCF);
|
||||||
log.debug("Current pump AI: " + DanaRFragment.getDanaRPump().currentAI);
|
log.debug("Current pump AI: " + DanaRPlugin.getDanaRPump().currentAI);
|
||||||
log.debug("Current pump target: " + DanaRFragment.getDanaRPump().currentTarget);
|
log.debug("Current pump target: " + DanaRPlugin.getDanaRPump().currentTarget);
|
||||||
log.debug("Current pump AIDR: " + DanaRFragment.getDanaRPump().currentAIDR);
|
log.debug("Current pump AIDR: " + DanaRPlugin.getDanaRPump().currentAIDR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,11 +9,10 @@ import java.sql.SQLException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.MainActivity;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.db.TempBasal;
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||||
|
|
||||||
public class MsgStatusTempBasal extends MessageBase {
|
public class MsgStatusTempBasal extends MessageBase {
|
||||||
|
@ -31,11 +30,11 @@ public class MsgStatusTempBasal extends MessageBase {
|
||||||
int tempBasalRemainingMin = (tempBasalTotalSec - tempBasalRunningSeconds) / 60;
|
int tempBasalRemainingMin = (tempBasalTotalSec - tempBasalRunningSeconds) / 60;
|
||||||
Date tempBasalStart = isTempBasalInProgress ? getDateFromTempBasalSecAgo(tempBasalRunningSeconds) : new Date(0);
|
Date tempBasalStart = isTempBasalInProgress ? getDateFromTempBasalSecAgo(tempBasalRunningSeconds) : new Date(0);
|
||||||
|
|
||||||
DanaRFragment.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress;
|
DanaRPlugin.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress;
|
||||||
DanaRFragment.getDanaRPump().tempBasalPercent = tempBasalPercent;
|
DanaRPlugin.getDanaRPump().tempBasalPercent = tempBasalPercent;
|
||||||
DanaRFragment.getDanaRPump().tempBasalRemainingMin = tempBasalRemainingMin;
|
DanaRPlugin.getDanaRPump().tempBasalRemainingMin = tempBasalRemainingMin;
|
||||||
DanaRFragment.getDanaRPump().tempBasalTotalSec = tempBasalTotalSec;
|
DanaRPlugin.getDanaRPump().tempBasalTotalSec = tempBasalTotalSec;
|
||||||
DanaRFragment.getDanaRPump().tempBasalStart = tempBasalStart;
|
DanaRPlugin.getDanaRPump().tempBasalStart = tempBasalStart;
|
||||||
|
|
||||||
updateTempBasalInDB();
|
updateTempBasalInDB();
|
||||||
|
|
||||||
|
@ -54,14 +53,14 @@ public class MsgStatusTempBasal extends MessageBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateTempBasalInDB() {
|
public static void updateTempBasalInDB() {
|
||||||
DanaRFragment danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
DanaRPlugin DanaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||||
DanaRPump danaRPump = danaRFragment.getDanaRPump();
|
DanaRPump danaRPump = DanaRPlugin.getDanaRPump();
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (danaRFragment.isRealTempBasalInProgress()) {
|
if (DanaRPlugin.isRealTempBasalInProgress()) {
|
||||||
TempBasal tempBasal = danaRFragment.getRealTempBasal();
|
TempBasal tempBasal = DanaRPlugin.getRealTempBasal();
|
||||||
if (danaRPump.isTempBasalInProgress) {
|
if (danaRPump.isTempBasalInProgress) {
|
||||||
if (tempBasal.percent != danaRPump.tempBasalPercent) {
|
if (tempBasal.percent != danaRPump.tempBasalPercent) {
|
||||||
// Close current temp basal
|
// Close current temp basal
|
||||||
|
|
|
@ -2,17 +2,8 @@ package info.nightscout.androidaps.plugins.Loop;
|
||||||
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.TaskStackBuilder;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.HandlerThread;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v7.app.NotificationCompat;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -24,25 +15,21 @@ import com.squareup.otto.Subscribe;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
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.PumpEnactResult;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.events.EventNewBG;
|
import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
|
||||||
import info.nightscout.androidaps.events.EventRefreshOpenLoop;
|
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
|
||||||
import info.nightscout.androidaps.events.EventTreatmentChange;
|
|
||||||
import info.nightscout.androidaps.interfaces.APSInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
|
||||||
|
|
||||||
public class LoopFragment extends Fragment implements View.OnClickListener, PluginBase {
|
public class LoopFragment extends Fragment implements View.OnClickListener, FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(LoopFragment.class);
|
private static Logger log = LoggerFactory.getLogger(LoopFragment.class);
|
||||||
|
|
||||||
|
private static LoopPlugin loopPlugin = new LoopPlugin();
|
||||||
|
|
||||||
|
public static LoopPlugin getPlugin() {
|
||||||
|
return loopPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
Button runNowButton;
|
Button runNowButton;
|
||||||
TextView lastRunView;
|
TextView lastRunView;
|
||||||
TextView lastEnactView;
|
TextView lastEnactView;
|
||||||
|
@ -51,72 +38,6 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
|
||||||
TextView constraintsProcessedView;
|
TextView constraintsProcessedView;
|
||||||
TextView setByPumpView;
|
TextView setByPumpView;
|
||||||
|
|
||||||
Handler mHandler;
|
|
||||||
public static HandlerThread mHandlerThread;
|
|
||||||
|
|
||||||
|
|
||||||
public class LastRun {
|
|
||||||
public APSResult request = null;
|
|
||||||
public APSResult constraintsProcessed = null;
|
|
||||||
public PumpEnactResult setByPump = null;
|
|
||||||
public String source = null;
|
|
||||||
public Date lastAPSRun = null;
|
|
||||||
public Date lastEnact = null;
|
|
||||||
public Date lastOpenModeAccept = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static public 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(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LoopFragment() {
|
|
||||||
super();
|
|
||||||
mHandlerThread = new HandlerThread(LoopFragment.class.getSimpleName());
|
|
||||||
mHandlerThread.start();
|
|
||||||
mHandler = new Handler(mHandlerThread.getLooper());
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static LoopFragment newInstance() {
|
|
||||||
LoopFragment fragment = new LoopFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
@ -136,12 +57,15 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
@Override
|
||||||
try {
|
public void onPause() {
|
||||||
MainApp.bus().unregister(this);
|
super.onPause();
|
||||||
} catch (RuntimeException x) {
|
MainApp.bus().unregister(this);
|
||||||
// Ignore
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
MainApp.bus().register(this);
|
MainApp.bus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,159 +73,44 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.loop_run:
|
case R.id.loop_run:
|
||||||
invoke(true);
|
loopPlugin.invoke(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventTreatmentChange ev) {
|
public void onStatusEvent(final EventLoopUpdateGui ev) {
|
||||||
ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder();
|
|
||||||
invoke(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void onStatusEvent(final EventNewBG ev) {
|
|
||||||
invoke(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void invoke(boolean allowNotification) {
|
|
||||||
ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder();
|
|
||||||
if (!constraintsInterface.isLoopEnabled()) {
|
|
||||||
clearGUI();
|
|
||||||
final Activity activity = getActivity();
|
|
||||||
if (activity != null)
|
|
||||||
activity.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
lastRunView.setText(activity.getString(R.string.loopdisabled));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final ConfigBuilderFragment configBuilder = MainApp.getConfigBuilder();
|
|
||||||
APSResult result = null;
|
|
||||||
|
|
||||||
if (configBuilder == null || !isEnabled(PluginBase.GENERAL))
|
|
||||||
return;
|
|
||||||
|
|
||||||
APSInterface usedAPS = null;
|
|
||||||
ArrayList<PluginBase> apsPlugins = MainApp.getSpecificPluginsList(PluginBase.APS);
|
|
||||||
for (PluginBase p : apsPlugins) {
|
|
||||||
APSInterface aps = (APSInterface) p;
|
|
||||||
if (!p.isEnabled(PluginBase.APS)) 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check rate for constrais
|
|
||||||
final APSResult resultAfterConstraints = result.clone();
|
|
||||||
resultAfterConstraints.rate = constraintsInterface.applyBasalConstraints(resultAfterConstraints.rate);
|
|
||||||
|
|
||||||
if (lastRun == null) lastRun = new LastRun();
|
|
||||||
lastRun.request = result;
|
|
||||||
lastRun.constraintsProcessed = resultAfterConstraints;
|
|
||||||
lastRun.lastAPSRun = new Date();
|
|
||||||
lastRun.source = usedAPS != null ? ((PluginBase) usedAPS).getName() : "";
|
|
||||||
lastRun.setByPump = null;
|
|
||||||
|
|
||||||
if (constraintsInterface.isClosedModeEnabled()) {
|
|
||||||
if (result.changeRequested) {
|
|
||||||
final PumpEnactResult waiting = new PumpEnactResult();
|
|
||||||
final PumpEnactResult previousResult = lastRun.setByPump;
|
|
||||||
waiting.queued = true;
|
|
||||||
lastRun.setByPump = waiting;
|
|
||||||
updateGUI();
|
|
||||||
mHandler.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
final PumpEnactResult applyResult = configBuilder.applyAPSRequest(resultAfterConstraints);
|
|
||||||
if (applyResult.enacted) {
|
|
||||||
lastRun.setByPump = applyResult;
|
|
||||||
lastRun.lastEnact = lastRun.lastAPSRun;
|
|
||||||
} else {
|
|
||||||
lastRun.setByPump = previousResult;
|
|
||||||
}
|
|
||||||
updateGUI();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
lastRun.setByPump = null;
|
|
||||||
lastRun.source = null;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (result.changeRequested && allowNotification) {
|
|
||||||
NotificationCompat.Builder builder =
|
|
||||||
new NotificationCompat.Builder(MainApp.instance().getApplicationContext());
|
|
||||||
builder.setSmallIcon(R.drawable.notification_icon)
|
|
||||||
.setContentTitle(MainApp.sResources.getString(R.string.openloop_newsuggestion))
|
|
||||||
.setContentText(resultAfterConstraints.toString())
|
|
||||||
.setAutoCancel(true)
|
|
||||||
.setPriority(Notification.PRIORITY_HIGH)
|
|
||||||
.setCategory(Notification.CATEGORY_ALARM)
|
|
||||||
.setVisibility(Notification.VISIBILITY_PUBLIC);
|
|
||||||
|
|
||||||
// Creates an explicit intent for an Activity in your app
|
|
||||||
Intent resultIntent = new Intent(MainApp.instance().getApplicationContext(), MainActivity.class);
|
|
||||||
|
|
||||||
// The stack builder object will contain an artificial back stack for the
|
|
||||||
// started Activity.
|
|
||||||
// This ensures that navigating backward from the Activity leads out of
|
|
||||||
// your application to the Home screen.
|
|
||||||
TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainApp.instance().getApplicationContext());
|
|
||||||
stackBuilder.addParentStack(MainActivity.class);
|
|
||||||
// Adds the Intent that starts the Activity to the top of the stack
|
|
||||||
stackBuilder.addNextIntent(resultIntent);
|
|
||||||
PendingIntent resultPendingIntent =
|
|
||||||
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
builder.setContentIntent(resultPendingIntent);
|
|
||||||
builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
|
|
||||||
NotificationManager mNotificationManager =
|
|
||||||
(NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
// mId allows you to update the notification later on.
|
|
||||||
mNotificationManager.notify(Constants.notificationID, builder.build());
|
|
||||||
MainApp.bus().post(new EventRefreshOpenLoop());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
MainApp.getConfigBuilder().uploadDeviceStatus();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventLoopSetLastRunGui ev) {
|
||||||
|
clearGUI();
|
||||||
|
final Activity activity = getActivity();
|
||||||
|
if (activity != null)
|
||||||
|
activity.runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
lastRunView.setText(ev.text);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void updateGUI() {
|
void updateGUI() {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity != null)
|
if (activity != null)
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (lastRun != null) {
|
if (loopPlugin.lastRun != null) {
|
||||||
requestView.setText(lastRun.request != null ? lastRun.request.toSpanned() : "");
|
requestView.setText(loopPlugin.lastRun.request != null ? loopPlugin.lastRun.request.toSpanned() : "");
|
||||||
constraintsProcessedView.setText(lastRun.constraintsProcessed != null ? lastRun.constraintsProcessed.toSpanned() : "");
|
constraintsProcessedView.setText(loopPlugin.lastRun.constraintsProcessed != null ? loopPlugin.lastRun.constraintsProcessed.toSpanned() : "");
|
||||||
setByPumpView.setText(lastRun.setByPump != null ? lastRun.setByPump.toSpanned() : "");
|
setByPumpView.setText(loopPlugin.lastRun.setByPump != null ? loopPlugin.lastRun.setByPump.toSpanned() : "");
|
||||||
sourceView.setText(lastRun.source != null ? lastRun.source : "");
|
sourceView.setText(loopPlugin.lastRun.source != null ? loopPlugin.lastRun.source : "");
|
||||||
lastRunView.setText(lastRun.lastAPSRun != null && lastRun.lastAPSRun.getTime() != 0 ? lastRun.lastAPSRun.toLocaleString() : "");
|
lastRunView.setText(loopPlugin.lastRun.lastAPSRun != null && loopPlugin.lastRun.lastAPSRun.getTime() != 0 ? loopPlugin.lastRun.lastAPSRun.toLocaleString() : "");
|
||||||
lastEnactView.setText(lastRun.lastEnact != null && lastRun.lastEnact.getTime() != 0 ? lastRun.lastEnact.toLocaleString() : "");
|
lastEnactView.setText(loopPlugin.lastRun.lastEnact != null && loopPlugin.lastRun.lastEnact.getTime() != 0 ? loopPlugin.lastRun.lastEnact.toLocaleString() : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,212 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Loop;
|
||||||
|
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.app.TaskStackBuilder;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.HandlerThread;
|
||||||
|
import android.support.v7.app.NotificationCompat;
|
||||||
|
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Constants;
|
||||||
|
import info.nightscout.androidaps.MainActivity;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
import info.nightscout.androidaps.events.EventNewBG;
|
||||||
|
import info.nightscout.androidaps.events.EventRefreshOpenLoop;
|
||||||
|
import info.nightscout.androidaps.events.EventTreatmentChange;
|
||||||
|
import info.nightscout.androidaps.interfaces.APSInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class LoopPlugin implements PluginBase {
|
||||||
|
private static Handler sHandler;
|
||||||
|
private static HandlerThread sHandlerThread;
|
||||||
|
|
||||||
|
private boolean fragmentEnabled = false;
|
||||||
|
private boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
public class LastRun {
|
||||||
|
public APSResult request = null;
|
||||||
|
public APSResult constraintsProcessed = null;
|
||||||
|
public PumpEnactResult setByPump = null;
|
||||||
|
public String source = null;
|
||||||
|
public Date lastAPSRun = null;
|
||||||
|
public Date lastEnact = null;
|
||||||
|
public Date lastOpenModeAccept;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public LastRun lastRun = null;
|
||||||
|
|
||||||
|
public LoopPlugin() {
|
||||||
|
if (sHandlerThread == null) {
|
||||||
|
sHandlerThread = new HandlerThread(LoopFragment.class.getSimpleName());
|
||||||
|
sHandlerThread.start();
|
||||||
|
sHandler = new Handler(sHandlerThread.getLooper());
|
||||||
|
}
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return LoopFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.LOOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventTreatmentChange ev) {
|
||||||
|
invoke(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventNewBG ev) {
|
||||||
|
invoke(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void invoke(boolean allowNotification) {
|
||||||
|
ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder();
|
||||||
|
if (!constraintsInterface.isLoopEnabled()) {
|
||||||
|
MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopdisabled)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder();
|
||||||
|
APSResult result = null;
|
||||||
|
|
||||||
|
if (configBuilder == null || !isEnabled(PluginBase.GENERAL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
APSInterface usedAPS = configBuilder.getActiveAPS();
|
||||||
|
if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginBase.APS)) {
|
||||||
|
usedAPS.invoke();
|
||||||
|
result = usedAPS.getLastAPSResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have any result
|
||||||
|
if (result == null) {
|
||||||
|
MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noapsselected)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check rate for constrais
|
||||||
|
final APSResult resultAfterConstraints = result.clone();
|
||||||
|
resultAfterConstraints.rate = constraintsInterface.applyBasalConstraints(resultAfterConstraints.rate);
|
||||||
|
|
||||||
|
if (lastRun == null) lastRun = new LastRun();
|
||||||
|
lastRun.request = result;
|
||||||
|
lastRun.constraintsProcessed = resultAfterConstraints;
|
||||||
|
lastRun.lastAPSRun = new Date();
|
||||||
|
lastRun.source = ((PluginBase) usedAPS).getName();
|
||||||
|
lastRun.setByPump = null;
|
||||||
|
|
||||||
|
if (constraintsInterface.isClosedModeEnabled()) {
|
||||||
|
if (result.changeRequested) {
|
||||||
|
final PumpEnactResult waiting = new PumpEnactResult();
|
||||||
|
final PumpEnactResult previousResult = lastRun.setByPump;
|
||||||
|
waiting.queued = true;
|
||||||
|
lastRun.setByPump = waiting;
|
||||||
|
MainApp.bus().post(new EventLoopUpdateGui());
|
||||||
|
sHandler.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final PumpEnactResult applyResult = configBuilder.applyAPSRequest(resultAfterConstraints);
|
||||||
|
if (applyResult.enacted) {
|
||||||
|
lastRun.setByPump = applyResult;
|
||||||
|
lastRun.lastEnact = lastRun.lastAPSRun;
|
||||||
|
} else {
|
||||||
|
lastRun.setByPump = previousResult;
|
||||||
|
}
|
||||||
|
MainApp.bus().post(new EventLoopUpdateGui());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
lastRun.setByPump = null;
|
||||||
|
lastRun.source = null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (result.changeRequested && allowNotification) {
|
||||||
|
NotificationCompat.Builder builder =
|
||||||
|
new NotificationCompat.Builder(MainApp.instance().getApplicationContext());
|
||||||
|
builder.setSmallIcon(R.drawable.notification_icon)
|
||||||
|
.setContentTitle(MainApp.sResources.getString(R.string.openloop_newsuggestion))
|
||||||
|
.setContentText(resultAfterConstraints.toString())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setPriority(Notification.PRIORITY_HIGH)
|
||||||
|
.setCategory(Notification.CATEGORY_ALARM)
|
||||||
|
.setVisibility(Notification.VISIBILITY_PUBLIC);
|
||||||
|
|
||||||
|
// Creates an explicit intent for an Activity in your app
|
||||||
|
Intent resultIntent = new Intent(MainApp.instance().getApplicationContext(), MainActivity.class);
|
||||||
|
|
||||||
|
// The stack builder object will contain an artificial back stack for the
|
||||||
|
// started Activity.
|
||||||
|
// This ensures that navigating backward from the Activity leads out of
|
||||||
|
// your application to the Home screen.
|
||||||
|
TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainApp.instance().getApplicationContext());
|
||||||
|
stackBuilder.addParentStack(MainActivity.class);
|
||||||
|
// Adds the Intent that starts the Activity to the top of the stack
|
||||||
|
stackBuilder.addNextIntent(resultIntent);
|
||||||
|
PendingIntent resultPendingIntent =
|
||||||
|
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
|
builder.setContentIntent(resultPendingIntent);
|
||||||
|
builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
|
||||||
|
NotificationManager mNotificationManager =
|
||||||
|
(NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
// mId allows you to update the notification later on.
|
||||||
|
mNotificationManager.notify(Constants.notificationID, builder.build());
|
||||||
|
MainApp.bus().post(new EventRefreshOpenLoop());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MainApp.bus().post(new EventLoopUpdateGui());
|
||||||
|
MainApp.getConfigBuilder().uploadDeviceStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Loop.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventLoopSetLastRunGui {
|
||||||
|
public String text = null;
|
||||||
|
|
||||||
|
public EventLoopSetLastRunGui(String text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Loop.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventLoopUpdateGui {
|
||||||
|
}
|
|
@ -1,289 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.LowSuspend;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.text.Html;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
|
||||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
|
||||||
import info.nightscout.androidaps.interfaces.APSInterface;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.APSResult;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
|
||||||
import info.nightscout.utils.SafeParse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TODO: replace algorithm and name
|
|
||||||
|
|
||||||
public class LowSuspendFragment extends Fragment implements View.OnClickListener, PluginBase, APSInterface {
|
|
||||||
private static Logger log = LoggerFactory.getLogger(LowSuspendFragment.class);
|
|
||||||
|
|
||||||
Button run;
|
|
||||||
TextView lastRunView;
|
|
||||||
TextView glucoseStatusView;
|
|
||||||
TextView minBgView;
|
|
||||||
TextView resultView;
|
|
||||||
TextView requestView;
|
|
||||||
|
|
||||||
// last values
|
|
||||||
class LastRun {
|
|
||||||
public Boolean lastLow = null;
|
|
||||||
public Boolean lastLowProjected = null;
|
|
||||||
public Double lastMinBg = null;
|
|
||||||
public DatabaseHelper.GlucoseStatus lastGlucoseStatus = null;
|
|
||||||
public Date lastAPSRun = null;
|
|
||||||
public APSResult lastAPSResult = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LastRun lastRun = null;
|
|
||||||
|
|
||||||
private boolean fragmentEnabled = false;
|
|
||||||
private boolean fragmentVisible = true;
|
|
||||||
|
|
||||||
public LowSuspendFragment() {
|
|
||||||
super();
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.lowsuspend);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.APS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public APSResult getLastAPSResult() {
|
|
||||||
if (lastRun != null)
|
|
||||||
return lastRun.lastAPSResult;
|
|
||||||
else return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getLastAPSRun() {
|
|
||||||
if (lastRun != null)
|
|
||||||
return lastRun.lastAPSRun;
|
|
||||||
else return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static LowSuspendFragment newInstance() {
|
|
||||||
return new LowSuspendFragment();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
View view = inflater.inflate(R.layout.lowsuspend_fragment, container, false);
|
|
||||||
|
|
||||||
run = (Button) view.findViewById(R.id.lowsuspend_run);
|
|
||||||
run.setOnClickListener(this);
|
|
||||||
lastRunView = (TextView) view.findViewById(R.id.lowsuspend_lastrun);
|
|
||||||
glucoseStatusView = (TextView) view.findViewById(R.id.lowsuspend_glucosestatus);
|
|
||||||
minBgView = (TextView) view.findViewById(R.id.lowsuspend_minbg);
|
|
||||||
resultView = (TextView) view.findViewById(R.id.lowsuspend_result);
|
|
||||||
requestView = (TextView) view.findViewById(R.id.lowsuspend_request);
|
|
||||||
|
|
||||||
updateGUI();
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.lowsuspend_run:
|
|
||||||
invoke();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void invoke() {
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
DatabaseHelper.GlucoseStatus glucoseStatus = MainApp.getDbHelper().getGlucoseStatusData();
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
|
||||||
|
|
||||||
if (!isEnabled(PluginBase.APS)) {
|
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_disabled));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_disabled));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glucoseStatus == null) {
|
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_noglucosedata));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (profile == null) {
|
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_noprofile));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_noprofile));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pump == null) {
|
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_nopump));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_nopump));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String minBgDefault = "90";
|
|
||||||
if (!profile.getUnits().equals(Constants.MGDL)) {
|
|
||||||
minBgDefault = "5";
|
|
||||||
}
|
|
||||||
|
|
||||||
double minBgMgdl = NSProfile.toMgdl(SafeParse.stringToDouble(SP.getString("lowsuspend_lowthreshold", minBgDefault)), profile.getUnits());
|
|
||||||
|
|
||||||
boolean lowProjected = (glucoseStatus.glucose + 6.0 * glucoseStatus.avgdelta) < minBgMgdl;
|
|
||||||
boolean low = glucoseStatus.glucose < minBgMgdl;
|
|
||||||
|
|
||||||
APSResult request = new APSResult();
|
|
||||||
boolean isTempBasalInProgress = pump.isTempBasalInProgress();
|
|
||||||
Double tempBasalRate = pump.getTempBasalAbsoluteRate();
|
|
||||||
Date now = new Date();
|
|
||||||
|
|
||||||
if (low && lowProjected) {
|
|
||||||
if (!isTempBasalInProgress || tempBasalRate != 0d) {
|
|
||||||
request.changeRequested = true;
|
|
||||||
request.rate = 0d;
|
|
||||||
request.duration = 30;
|
|
||||||
request.reason = MainApp.instance().getString(R.string.lowsuspend_lowmessage);
|
|
||||||
} else {
|
|
||||||
request.changeRequested = false;
|
|
||||||
request.reason = MainApp.instance().getString(R.string.nochangerequested);
|
|
||||||
}
|
|
||||||
} else if (lowProjected) {
|
|
||||||
if (!isTempBasalInProgress || tempBasalRate != 0d) {
|
|
||||||
request.changeRequested = true;
|
|
||||||
request.rate = 0d;
|
|
||||||
request.duration = 30;
|
|
||||||
request.reason = MainApp.instance().getString(R.string.lowsuspend_lowprojectedmessage);
|
|
||||||
} else {
|
|
||||||
request.changeRequested = false;
|
|
||||||
request.reason = MainApp.instance().getString(R.string.nochangerequested);
|
|
||||||
}
|
|
||||||
} else if (isTempBasalInProgress && tempBasalRate == 0d) {
|
|
||||||
request.changeRequested = true;
|
|
||||||
request.rate = 0;
|
|
||||||
request.duration = 0;
|
|
||||||
request.reason = MainApp.instance().getString(R.string.lowsuspend_cancelmessage);
|
|
||||||
} else {
|
|
||||||
request.changeRequested = false;
|
|
||||||
request.reason = MainApp.instance().getString(R.string.nochangerequested);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastRun = new LastRun();
|
|
||||||
lastRun.lastMinBg = minBgMgdl;
|
|
||||||
lastRun.lastLow = low;
|
|
||||||
lastRun.lastLowProjected = lowProjected;
|
|
||||||
lastRun.lastGlucoseStatus = glucoseStatus;
|
|
||||||
lastRun.lastAPSResult = request;
|
|
||||||
lastRun.lastAPSRun = now;
|
|
||||||
updateGUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateGUI() {
|
|
||||||
Activity activity = getActivity();
|
|
||||||
if (activity != null)
|
|
||||||
activity.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (lastRun != null) {
|
|
||||||
glucoseStatusView.setText(lastRun.lastGlucoseStatus.toSpanned());
|
|
||||||
minBgView.setText(DecimalFormatter.to1Decimal(lastRun.lastMinBg) + " mgdl");
|
|
||||||
resultView.setText(Html.fromHtml("<b>" + getString(R.string.lowsuspend_low) + "</b>: " + lastRun.lastLow + "<br></b>" + getString(R.string.lowsuspend_lowprojected) + "</b>: " + lastRun.lastLowProjected));
|
|
||||||
requestView.setText(lastRun.lastAPSResult.toSpanned());
|
|
||||||
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("");
|
|
||||||
minBgView.setText("");
|
|
||||||
requestView.setText("");
|
|
||||||
lastRunView.setText("");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -20,35 +20,17 @@ import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
import info.nightscout.androidaps.db.TempBasal;
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
|
||||||
public class MM640gFragment extends Fragment implements PluginBase, PumpInterface, BgSourceInterface {
|
public class MM640gFragment extends Fragment implements FragmentBase {
|
||||||
|
|
||||||
|
private static MM640gPlugin mm640gPlugin = new MM640gPlugin();
|
||||||
|
|
||||||
boolean fragmentPumpEnabled = false;
|
public static MM640gPlugin getPlugin() {
|
||||||
boolean fragmentProfileEnabled = false;
|
return mm640gPlugin;
|
||||||
boolean fragmentBgSourceEnabled = false;
|
|
||||||
boolean fragmentPumpVisible = true;
|
|
||||||
|
|
||||||
|
|
||||||
public MM640gFragment() {
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MM640gFragment newInstance() {
|
|
||||||
MM640gFragment fragment = new MM640gFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void registerBus() {
|
|
||||||
try {
|
|
||||||
MainApp.bus().unregister(this);
|
|
||||||
} catch (RuntimeException x) {
|
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -58,154 +40,4 @@ public class MM640gFragment extends Fragment implements PluginBase, PumpInterfac
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin base interface
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.PUMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.mm640g);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
if (type == PluginBase.PROFILE) return fragmentProfileEnabled;
|
|
||||||
else if (type == PluginBase.BGSOURCE) return fragmentBgSourceEnabled;
|
|
||||||
else if (type == PluginBase.PUMP) return fragmentPumpEnabled;
|
|
||||||
else if (type == PluginBase.CONSTRAINTS) return fragmentPumpEnabled;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
if (type == PluginBase.PROFILE || type == PluginBase.CONSTRAINTS) return false;
|
|
||||||
else if (type == PluginBase.PUMP) return fragmentPumpVisible;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
if (type == PluginBase.PROFILE) this.fragmentProfileEnabled = fragmentEnabled;
|
|
||||||
if (type == PluginBase.BGSOURCE) this.fragmentBgSourceEnabled = fragmentEnabled;
|
|
||||||
else if (type == PluginBase.PUMP) this.fragmentPumpEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
if (type == PluginBase.PUMP)
|
|
||||||
this.fragmentPumpVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin communications
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void onStatusEvent(final EventPreferenceChange s) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pump Interface
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isTempBasalInProgress() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isExtendedBoluslInProgress() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setNewBasalProfile(NSProfile profile) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBaseBasalRate() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalAbsoluteRate() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalRemainingMinutes() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal(Date time) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getExtendedBolus() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
|
||||||
return new PumpEnactResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stopBolusDelivering() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
|
||||||
return new PumpEnactResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
|
||||||
return new PumpEnactResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
|
||||||
return new PumpEnactResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelTempBasal() {
|
|
||||||
return new PumpEnactResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelExtendedBolus() {
|
|
||||||
return new PumpEnactResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSONObject getJSONStatus() {
|
|
||||||
return new JSONObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deviceID() {
|
|
||||||
return "MM640G"; // TODO: probably serial goes here
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,187 @@
|
||||||
|
package info.nightscout.androidaps.plugins.MM640g;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
|
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
|
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class MM640gPlugin implements PluginBase, PumpInterface, BgSourceInterface {
|
||||||
|
|
||||||
|
boolean fragmentPumpEnabled = false;
|
||||||
|
boolean fragmentProfileEnabled = false;
|
||||||
|
boolean fragmentBgSourceEnabled = false;
|
||||||
|
boolean fragmentPumpVisible = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return MM640gFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin base interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.PUMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.mm640g);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
if (type == PluginBase.PROFILE) return fragmentProfileEnabled;
|
||||||
|
else if (type == PluginBase.BGSOURCE) return fragmentBgSourceEnabled;
|
||||||
|
else if (type == PluginBase.PUMP) return fragmentPumpEnabled;
|
||||||
|
else if (type == PluginBase.CONSTRAINTS) return fragmentPumpEnabled;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
if (type == PluginBase.PROFILE || type == PluginBase.CONSTRAINTS) return false;
|
||||||
|
else if (type == PluginBase.PUMP) return fragmentPumpVisible;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
if (type == PluginBase.PROFILE) this.fragmentProfileEnabled = fragmentEnabled;
|
||||||
|
if (type == PluginBase.BGSOURCE) this.fragmentBgSourceEnabled = fragmentEnabled;
|
||||||
|
else if (type == PluginBase.PUMP) this.fragmentPumpEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
if (type == PluginBase.PUMP)
|
||||||
|
this.fragmentPumpVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin communications
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventPreferenceChange s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pump Interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTempBasalInProgress() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExtendedBoluslInProgress() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNewBasalProfile(NSProfile profile) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getBaseBasalRate() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalAbsoluteRate() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalRemainingMinutes() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal(Date time) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getExtendedBolus() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
||||||
|
return new PumpEnactResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopBolusDelivering() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
||||||
|
return new PumpEnactResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
||||||
|
return new PumpEnactResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
||||||
|
return new PumpEnactResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelTempBasal() {
|
||||||
|
return new PumpEnactResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelExtendedBolus() {
|
||||||
|
return new PumpEnactResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject getJSONStatus() {
|
||||||
|
return new JSONObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String deviceID() {
|
||||||
|
return "MM640G"; // TODO: probably serial goes here
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,11 +1,7 @@
|
||||||
package info.nightscout.androidaps.plugins.NSProfileViewer;
|
package info.nightscout.androidaps.plugins.NSProfileViewer;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
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;
|
||||||
|
@ -14,23 +10,18 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
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.Services.Intents;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.events.EventNewBasalProfile;
|
import info.nightscout.androidaps.plugins.NSProfileViewer.events.EventNSProfileViewerUpdateGui;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
|
|
||||||
public class NSProfileViewerFragment extends Fragment implements PluginBase, ProfileInterface {
|
public class NSProfileViewerFragment extends Fragment implements FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(NSProfileViewerFragment.class);
|
private static NSProfileViewerPlugin nsProfileViewerPlugin = new NSProfileViewerPlugin();
|
||||||
|
|
||||||
|
public static NSProfileViewerPlugin getPlugin() {
|
||||||
|
return nsProfileViewerPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
private static TextView noProfile;
|
private static TextView noProfile;
|
||||||
private static TextView units;
|
private static TextView units;
|
||||||
|
@ -41,57 +32,6 @@ public class NSProfileViewerFragment extends Fragment implements PluginBase, Pro
|
||||||
private static TextView basal;
|
private static TextView basal;
|
||||||
private static TextView target;
|
private static TextView target;
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
|
|
||||||
NSProfile profile = null;
|
|
||||||
|
|
||||||
public NSProfileViewerFragment () {
|
|
||||||
super();
|
|
||||||
loadNSProfile();
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.profileviewer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.PROFILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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) {
|
||||||
|
@ -106,95 +46,48 @@ public class NSProfileViewerFragment extends Fragment implements PluginBase, Pro
|
||||||
basal = (TextView) layout.findViewById(R.id.profileview_basal);
|
basal = (TextView) layout.findViewById(R.id.profileview_basal);
|
||||||
target = (TextView) layout.findViewById(R.id.profileview_target);
|
target = (TextView) layout.findViewById(R.id.profileview_target);
|
||||||
|
|
||||||
setContent();
|
updateGUI();
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NSProfileViewerFragment newInstance() {
|
@Override
|
||||||
return new NSProfileViewerFragment();
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
MainApp.bus().unregister(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setContent() {
|
@Override
|
||||||
if (profile == null) {
|
public void onResume() {
|
||||||
noProfile.setVisibility(View.VISIBLE);
|
super.onResume();
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
noProfile.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
units.setText(profile.getUnits());
|
|
||||||
dia.setText(DecimalFormatter.to2Decimal(profile.getDia()) + " h");
|
|
||||||
activeProfile.setText(profile.getActiveProfile());
|
|
||||||
ic.setText(profile.getIcList());
|
|
||||||
isf.setText(profile.getIsfList());
|
|
||||||
basal.setText(profile.getBasalList());
|
|
||||||
target.setText(profile.getTargetList());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void registerBus() {
|
|
||||||
try {
|
|
||||||
MainApp.bus().unregister(this);
|
|
||||||
} catch (RuntimeException x) {
|
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
MainApp.bus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventNewBasalProfile ev) {
|
public void onStatusEvent(final EventNSProfileViewerUpdateGui ev) {
|
||||||
profile = new NSProfile(ev.newNSProfile.getData(), ev.newNSProfile.getActiveProfile());
|
|
||||||
storeNSProfile();
|
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity != null)
|
if (activity != null)
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
setContent();
|
updateGUI();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
else
|
|
||||||
log.debug("EventNewBG: Activity is null");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void storeNSProfile() {
|
private void updateGUI() {
|
||||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
if (nsProfileViewerPlugin.profile == null) {
|
||||||
SharedPreferences.Editor editor = settings.edit();
|
noProfile.setVisibility(View.VISIBLE);
|
||||||
editor.putString("profile", profile.getData().toString());
|
return;
|
||||||
editor.putString("activeProfile", profile.getActiveProfile());
|
|
||||||
editor.apply();
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Storing profile");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadNSProfile() {
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Loading stored profile");
|
|
||||||
SharedPreferences store = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
String activeProfile = store.getString("activeProfile", null);
|
|
||||||
String profileString = store.getString("profile", null);
|
|
||||||
if (profileString != null) {
|
|
||||||
if (Config.logPrefsChange) {
|
|
||||||
log.debug("Loaded profile: " + profileString);
|
|
||||||
log.debug("Loaded active profile: " + activeProfile);
|
|
||||||
try {
|
|
||||||
profile = new NSProfile(new JSONObject(profileString), activeProfile);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
profile = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (Config.logPrefsChange) {
|
noProfile.setVisibility(View.GONE);
|
||||||
log.debug("Stored profile not found");
|
|
||||||
// force restart of nsclient to fetch profile
|
|
||||||
Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
|
|
||||||
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
units.setText(nsProfileViewerPlugin.profile.getUnits());
|
||||||
|
dia.setText(DecimalFormatter.to2Decimal(nsProfileViewerPlugin.profile.getDia()) + " h");
|
||||||
|
activeProfile.setText(nsProfileViewerPlugin.profile.getActiveProfile());
|
||||||
|
ic.setText(nsProfileViewerPlugin.profile.getIcList());
|
||||||
|
isf.setText(nsProfileViewerPlugin.profile.getIsfList());
|
||||||
|
basal.setText(nsProfileViewerPlugin.profile.getBasalList());
|
||||||
|
target.setText(nsProfileViewerPlugin.profile.getTargetList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public NSProfile getProfile() {
|
|
||||||
return profile;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
package info.nightscout.androidaps.plugins.NSProfileViewer;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.Services.Intents;
|
||||||
|
import info.nightscout.androidaps.events.EventNewBasalProfile;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.NSProfileViewer.events.EventNSProfileViewerUpdateGui;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class NSProfileViewerPlugin implements PluginBase, ProfileInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(NSProfileViewerPlugin.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return NSProfileViewerFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean fragmentEnabled = true;
|
||||||
|
static boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
static NSProfile profile = null;
|
||||||
|
|
||||||
|
public NSProfileViewerPlugin() {
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
loadNSProfile();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.profileviewer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.PROFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventNewBasalProfile ev) {
|
||||||
|
profile = new NSProfile(ev.newNSProfile.getData(), ev.newNSProfile.getActiveProfile());
|
||||||
|
storeNSProfile();
|
||||||
|
MainApp.bus().post(new EventNSProfileViewerUpdateGui());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void storeNSProfile() {
|
||||||
|
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
SharedPreferences.Editor editor = settings.edit();
|
||||||
|
editor.putString("profile", profile.getData().toString());
|
||||||
|
editor.putString("activeProfile", profile.getActiveProfile());
|
||||||
|
editor.apply();
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Storing profile");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadNSProfile() {
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Loading stored profile");
|
||||||
|
SharedPreferences store = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
String activeProfile = store.getString("activeProfile", null);
|
||||||
|
String profileString = store.getString("profile", null);
|
||||||
|
if (profileString != null) {
|
||||||
|
if (Config.logPrefsChange) {
|
||||||
|
log.debug("Loaded profile: " + profileString);
|
||||||
|
log.debug("Loaded active profile: " + activeProfile);
|
||||||
|
try {
|
||||||
|
profile = new NSProfile(new JSONObject(profileString), activeProfile);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
profile = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (Config.logPrefsChange) {
|
||||||
|
log.debug("Stored profile not found");
|
||||||
|
// force restart of nsclient to fetch profile
|
||||||
|
Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
|
||||||
|
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public NSProfile getProfile() {
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.NSProfileViewer.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventNSProfileViewerUpdateGui {
|
||||||
|
}
|
|
@ -2,9 +2,7 @@ package info.nightscout.androidaps.plugins.Objectives;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v7.widget.CardView;
|
import android.support.v7.widget.CardView;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
@ -17,67 +15,29 @@ import android.widget.CheckBox;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
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;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
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.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
|
||||||
|
|
||||||
public class ObjectivesFragment extends Fragment implements View.OnClickListener, PluginBase, ConstraintsInterface {
|
public class ObjectivesFragment extends Fragment implements View.OnClickListener, FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class);
|
private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class);
|
||||||
|
|
||||||
|
private static ObjectivesPlugin objectivesPlugin = new ObjectivesPlugin();
|
||||||
|
|
||||||
|
public static ObjectivesPlugin getPlugin() {
|
||||||
|
return objectivesPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
LinearLayoutManager llm;
|
LinearLayoutManager llm;
|
||||||
CheckBox enableFake;
|
CheckBox enableFake;
|
||||||
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.CONSTRAINTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.objectives);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
LoopFragment loopFragment = (LoopFragment) MainApp.getSpecificPlugin(LoopFragment.class);
|
|
||||||
return fragmentVisible && loopFragment != null && loopFragment.isVisibleInTabs(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
int id = v.getId();
|
int id = v.getId();
|
||||||
|
@ -87,146 +47,11 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Objective {
|
|
||||||
Integer num;
|
|
||||||
String objective;
|
|
||||||
String gate;
|
|
||||||
Date started;
|
|
||||||
Integer durationInDays;
|
|
||||||
Date accomplished;
|
|
||||||
|
|
||||||
Objective(Integer num, String objective, String gate, Date started, Integer durationInDays, Date accomplished) {
|
|
||||||
this.num = num;
|
|
||||||
this.objective = objective;
|
|
||||||
this.gate = gate;
|
|
||||||
this.started = started;
|
|
||||||
this.durationInDays = durationInDays;
|
|
||||||
this.accomplished = accomplished;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Objective 0
|
|
||||||
public boolean bgIsAvailableInNS = false;
|
|
||||||
public boolean pumpStatusIsAvailableInNS = false;
|
|
||||||
// Objective 1
|
|
||||||
public Integer manualEnacts = 0;
|
|
||||||
public final Integer manualEnactsNeeded = 20;
|
|
||||||
|
|
||||||
class RequirementResult {
|
|
||||||
boolean done = false;
|
|
||||||
String comment = "";
|
|
||||||
|
|
||||||
public RequirementResult(boolean done, String comment) {
|
|
||||||
this.done = done;
|
|
||||||
this.comment = comment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String yesOrNo(boolean yes) {
|
|
||||||
if (yes) return "☺";
|
|
||||||
else return "---";
|
|
||||||
}
|
|
||||||
|
|
||||||
private RequirementResult requirementsMet(Integer objNum) {
|
|
||||||
switch (objNum) {
|
|
||||||
case 0:
|
|
||||||
return new RequirementResult(bgIsAvailableInNS && pumpStatusIsAvailableInNS,
|
|
||||||
getString(R.string.objectives_bgavailableinns) + ": " + yesOrNo(bgIsAvailableInNS)
|
|
||||||
+ " " + getString(R.string.objectives_pumpstatusavailableinns) + ": " + yesOrNo(pumpStatusIsAvailableInNS));
|
|
||||||
case 1:
|
|
||||||
return new RequirementResult(manualEnacts >= manualEnactsNeeded,
|
|
||||||
getString(R.string.objectives_manualenacts) + ": " + manualEnacts + "/" + manualEnactsNeeded);
|
|
||||||
case 2:
|
|
||||||
return new RequirementResult(true, "");
|
|
||||||
default:
|
|
||||||
return new RequirementResult(false, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private List<Objective> objectives;
|
|
||||||
|
|
||||||
private void initializeData() {
|
|
||||||
objectives = new ArrayList<>();
|
|
||||||
objectives.add(new Objective(0,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_0_objective),
|
|
||||||
MainApp.sResources.getString(R.string.objectives_0_gate),
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
1, // 1 day
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
objectives.add(new Objective(1,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_1_objective),
|
|
||||||
MainApp.sResources.getString(R.string.objectives_1_gate),
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
7, // 7 days
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
objectives.add(new Objective(2,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_2_objective),
|
|
||||||
MainApp.sResources.getString(R.string.objectives_2_gate),
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
0, // 0 days
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
objectives.add(new Objective(3,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_3_objective),
|
|
||||||
MainApp.sResources.getString(R.string.objectives_3_gate),
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
5, // 5 days
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
objectives.add(new Objective(4,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_4_objective),
|
|
||||||
MainApp.sResources.getString(R.string.objectives_4_gate),
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
1,
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
objectives.add(new Objective(5,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_5_objective),
|
|
||||||
MainApp.sResources.getString(R.string.objectives_5_gate),
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
7,
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
objectives.add(new Objective(6,
|
|
||||||
MainApp.sResources.getString(R.string.objectives_6_objective),
|
|
||||||
"",
|
|
||||||
new Date(0, 0, 0),
|
|
||||||
1,
|
|
||||||
new Date(0, 0, 0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveProgress() {
|
|
||||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
SharedPreferences.Editor editor = settings.edit();
|
|
||||||
for (int num = 0; num < objectives.size(); num++) {
|
|
||||||
Objective o = objectives.get(num);
|
|
||||||
editor.putLong("Objectives" + num + "started", o.started.getTime());
|
|
||||||
editor.putLong("Objectives" + num + "accomplished", o.accomplished.getTime());
|
|
||||||
}
|
|
||||||
editor.putBoolean("Objectives" + "bgIsAvailableInNS", bgIsAvailableInNS);
|
|
||||||
editor.putBoolean("Objectives" + "pumpStatusIsAvailableInNS", pumpStatusIsAvailableInNS);
|
|
||||||
editor.putInt("Objectives" + "manualEnacts", manualEnacts);
|
|
||||||
editor.apply();
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Objectives stored");
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadProgress() {
|
|
||||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
for (int num = 0; num < objectives.size(); num++) {
|
|
||||||
Objective o = objectives.get(num);
|
|
||||||
o.started = new Date(settings.getLong("Objectives" + num + "started", 0));
|
|
||||||
o.accomplished = new Date(settings.getLong("Objectives" + num + "accomplished", 0));
|
|
||||||
}
|
|
||||||
bgIsAvailableInNS = settings.getBoolean("Objectives" + "bgIsAvailableInNS", false);
|
|
||||||
pumpStatusIsAvailableInNS = settings.getBoolean("Objectives" + "pumpStatusIsAvailableInNS", false);
|
|
||||||
manualEnacts = settings.getInt("Objectives" + "manualEnacts", 0);
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Objectives loaded");
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ObjectiveViewHolder> {
|
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ObjectiveViewHolder> {
|
||||||
|
|
||||||
List<Objective> objectives;
|
List<ObjectivesPlugin.Objective> objectives;
|
||||||
|
|
||||||
RecyclerViewAdapter(List<Objective> objectives) {
|
RecyclerViewAdapter(List<ObjectivesPlugin.Objective> objectives) {
|
||||||
this.objectives = objectives;
|
this.objectives = objectives;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,8 +63,8 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(ObjectiveViewHolder holder, int position) {
|
public void onBindViewHolder(ObjectiveViewHolder holder, int position) {
|
||||||
Objective o = objectives.get(position);
|
ObjectivesPlugin.Objective o = objectives.get(position);
|
||||||
RequirementResult requirementsMet = requirementsMet(position);
|
ObjectivesPlugin.RequirementResult requirementsMet = objectivesPlugin.requirementsMet(position);
|
||||||
Context context = MainApp.instance().getApplicationContext();
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
holder.position.setText(String.valueOf(position + 1));
|
holder.position.setText(String.valueOf(position + 1));
|
||||||
holder.objective.setText(o.objective);
|
holder.objective.setText(o.objective);
|
||||||
|
@ -254,19 +79,19 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
||||||
|
|
||||||
holder.startButton.setOnClickListener(new View.OnClickListener() {
|
holder.startButton.setOnClickListener(new View.OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Objective o = (Objective) v.getTag();
|
ObjectivesPlugin.Objective o = (ObjectivesPlugin.Objective) v.getTag();
|
||||||
o.started = new Date();
|
o.started = new Date();
|
||||||
updateGUI();
|
updateGUI();
|
||||||
saveProgress();
|
objectivesPlugin.saveProgress();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
holder.verifyButton.setOnClickListener(new View.OnClickListener() {
|
holder.verifyButton.setOnClickListener(new View.OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Objective o = (Objective) v.getTag();
|
ObjectivesPlugin.Objective o = (ObjectivesPlugin.Objective) v.getTag();
|
||||||
if (requirementsMet(o.num).done || enableFake.isChecked()) {
|
if (objectivesPlugin.requirementsMet(o.num).done || enableFake.isChecked()) {
|
||||||
o.accomplished = new Date();
|
o.accomplished = new Date();
|
||||||
updateGUI();
|
updateGUI();
|
||||||
saveProgress();
|
objectivesPlugin.saveProgress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -350,22 +175,6 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObjectivesFragment() {
|
|
||||||
super();
|
|
||||||
initializeData();
|
|
||||||
loadProgress();
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ObjectivesFragment newInstance() {
|
|
||||||
return new ObjectivesFragment();
|
|
||||||
}
|
|
||||||
|
|
||||||
@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) {
|
||||||
|
@ -383,111 +192,46 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add correct translations to array after app is initialized
|
// Add correct translations to array after app is initialized
|
||||||
objectives.get(0).objective = MainApp.sResources.getString(R.string.objectives_0_objective);
|
objectivesPlugin.objectives.get(0).objective = MainApp.sResources.getString(R.string.objectives_0_objective);
|
||||||
objectives.get(1).objective = MainApp.sResources.getString(R.string.objectives_1_objective);
|
objectivesPlugin.objectives.get(1).objective = MainApp.sResources.getString(R.string.objectives_1_objective);
|
||||||
objectives.get(2).objective = MainApp.sResources.getString(R.string.objectives_2_objective);
|
objectivesPlugin.objectives.get(2).objective = MainApp.sResources.getString(R.string.objectives_2_objective);
|
||||||
objectives.get(3).objective = MainApp.sResources.getString(R.string.objectives_3_objective);
|
objectivesPlugin.objectives.get(3).objective = MainApp.sResources.getString(R.string.objectives_3_objective);
|
||||||
objectives.get(4).objective = MainApp.sResources.getString(R.string.objectives_4_objective);
|
objectivesPlugin.objectives.get(4).objective = MainApp.sResources.getString(R.string.objectives_4_objective);
|
||||||
objectives.get(5).objective = MainApp.sResources.getString(R.string.objectives_5_objective);
|
objectivesPlugin.objectives.get(5).objective = MainApp.sResources.getString(R.string.objectives_5_objective);
|
||||||
objectives.get(6).objective = MainApp.sResources.getString(R.string.objectives_6_objective);
|
objectivesPlugin.objectives.get(6).objective = MainApp.sResources.getString(R.string.objectives_6_objective);
|
||||||
objectives.get(0).gate = MainApp.sResources.getString(R.string.objectives_0_gate);
|
objectivesPlugin.objectives.get(0).gate = MainApp.sResources.getString(R.string.objectives_0_gate);
|
||||||
objectives.get(1).gate = MainApp.sResources.getString(R.string.objectives_1_gate);
|
objectivesPlugin.objectives.get(1).gate = MainApp.sResources.getString(R.string.objectives_1_gate);
|
||||||
objectives.get(2).gate = MainApp.sResources.getString(R.string.objectives_2_gate);
|
objectivesPlugin.objectives.get(2).gate = MainApp.sResources.getString(R.string.objectives_2_gate);
|
||||||
objectives.get(3).gate = MainApp.sResources.getString(R.string.objectives_3_gate);
|
objectivesPlugin.objectives.get(3).gate = MainApp.sResources.getString(R.string.objectives_3_gate);
|
||||||
objectives.get(4).gate = MainApp.sResources.getString(R.string.objectives_4_gate);
|
objectivesPlugin.objectives.get(4).gate = MainApp.sResources.getString(R.string.objectives_4_gate);
|
||||||
objectives.get(5).gate = MainApp.sResources.getString(R.string.objectives_5_gate);
|
objectivesPlugin.objectives.get(5).gate = MainApp.sResources.getString(R.string.objectives_5_gate);
|
||||||
updateGUI();
|
updateGUI();
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
|
||||||
try {
|
|
||||||
MainApp.bus().unregister(this);
|
|
||||||
} catch (RuntimeException x) {
|
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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");
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateGUI() {
|
void updateGUI() {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity != null)
|
if (activity != null)
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
RecyclerViewAdapter adapter = new RecyclerViewAdapter(objectives);
|
RecyclerViewAdapter adapter = new RecyclerViewAdapter(objectivesPlugin.objectives);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constraints interface
|
|
||||||
**/
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLoopEnabled() {
|
public void onPause() {
|
||||||
return objectives.get(1).started.getTime() > 0;
|
super.onPause();
|
||||||
|
MainApp.bus().unregister(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isClosedModeEnabled() {
|
public void onResume() {
|
||||||
return objectives.get(3).started.getTime() > 0;
|
super.onResume();
|
||||||
}
|
MainApp.bus().register(this);
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAutosensModeEnabled() {
|
|
||||||
return objectives.get(5).started.getTime() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAMAModeEnabled() {
|
|
||||||
return objectives.get(6).started.getTime() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyMaxIOBConstraints(Double maxIob) {
|
|
||||||
if (objectives.get(4).started.getTime() > 0)
|
|
||||||
return maxIob;
|
|
||||||
else {
|
|
||||||
if (Config.logConstraintsChanges)
|
|
||||||
log.debug("Limiting maxIOB " + maxIob + " to " + 0 + "U");
|
|
||||||
return 0d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyBasalConstraints(Double absoluteRate) {
|
|
||||||
return absoluteRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyBasalConstraints(Integer percentRate) {
|
|
||||||
return percentRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyBolusConstraints(Double insulin) {
|
|
||||||
return insulin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyCarbsConstraints(Integer carbs) {
|
|
||||||
return carbs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,264 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Objectives;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class ObjectivesPlugin implements PluginBase, ConstraintsInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(ObjectivesPlugin.class);
|
||||||
|
|
||||||
|
public List<Objective> objectives;
|
||||||
|
|
||||||
|
boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
public ObjectivesPlugin() {
|
||||||
|
initializeData();
|
||||||
|
loadProgress();
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return ObjectivesFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.CONSTRAINTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.objectives);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
LoopPlugin loopPlugin = (LoopPlugin) MainApp.getSpecificPlugin(LoopPlugin.class);
|
||||||
|
return fragmentVisible && loopPlugin != null && loopPlugin.isVisibleInTabs(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Objective {
|
||||||
|
Integer num;
|
||||||
|
String objective;
|
||||||
|
String gate;
|
||||||
|
Date started;
|
||||||
|
Integer durationInDays;
|
||||||
|
Date accomplished;
|
||||||
|
|
||||||
|
Objective(Integer num, String objective, String gate, Date started, Integer durationInDays, Date accomplished) {
|
||||||
|
this.num = num;
|
||||||
|
this.objective = objective;
|
||||||
|
this.gate = gate;
|
||||||
|
this.started = started;
|
||||||
|
this.durationInDays = durationInDays;
|
||||||
|
this.accomplished = accomplished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Objective 0
|
||||||
|
public boolean bgIsAvailableInNS = false;
|
||||||
|
public boolean pumpStatusIsAvailableInNS = false;
|
||||||
|
// Objective 1
|
||||||
|
public Integer manualEnacts = 0;
|
||||||
|
public final Integer manualEnactsNeeded = 20;
|
||||||
|
|
||||||
|
public class RequirementResult {
|
||||||
|
boolean done = false;
|
||||||
|
String comment = "";
|
||||||
|
|
||||||
|
public RequirementResult(boolean done, String comment) {
|
||||||
|
this.done = done;
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String yesOrNo(boolean yes) {
|
||||||
|
if (yes) return "☺";
|
||||||
|
else return "---";
|
||||||
|
}
|
||||||
|
|
||||||
|
public RequirementResult requirementsMet(Integer objNum) {
|
||||||
|
switch (objNum) {
|
||||||
|
case 0:
|
||||||
|
return new RequirementResult(bgIsAvailableInNS && pumpStatusIsAvailableInNS,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_bgavailableinns) + ": " + yesOrNo(bgIsAvailableInNS)
|
||||||
|
+ " " + MainApp.sResources.getString(R.string.objectives_pumpstatusavailableinns) + ": " + yesOrNo(pumpStatusIsAvailableInNS));
|
||||||
|
case 1:
|
||||||
|
return new RequirementResult(manualEnacts >= manualEnactsNeeded,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_manualenacts) + ": " + manualEnacts + "/" + manualEnactsNeeded);
|
||||||
|
case 2:
|
||||||
|
return new RequirementResult(true, "");
|
||||||
|
default:
|
||||||
|
return new RequirementResult(false, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void initializeData() {
|
||||||
|
objectives = new ArrayList<>();
|
||||||
|
objectives.add(new Objective(0,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_0_objective),
|
||||||
|
MainApp.sResources.getString(R.string.objectives_0_gate),
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
1, // 1 day
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
objectives.add(new Objective(1,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_1_objective),
|
||||||
|
MainApp.sResources.getString(R.string.objectives_1_gate),
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
7, // 7 days
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
objectives.add(new Objective(2,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_2_objective),
|
||||||
|
MainApp.sResources.getString(R.string.objectives_2_gate),
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
0, // 0 days
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
objectives.add(new Objective(3,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_3_objective),
|
||||||
|
MainApp.sResources.getString(R.string.objectives_3_gate),
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
5, // 5 days
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
objectives.add(new Objective(4,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_4_objective),
|
||||||
|
MainApp.sResources.getString(R.string.objectives_4_gate),
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
1,
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
objectives.add(new Objective(5,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_5_objective),
|
||||||
|
MainApp.sResources.getString(R.string.objectives_5_gate),
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
7,
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
objectives.add(new Objective(6,
|
||||||
|
MainApp.sResources.getString(R.string.objectives_6_objective),
|
||||||
|
"",
|
||||||
|
new Date(0, 0, 0),
|
||||||
|
1,
|
||||||
|
new Date(0, 0, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveProgress() {
|
||||||
|
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
SharedPreferences.Editor editor = settings.edit();
|
||||||
|
for (int num = 0; num < objectives.size(); num++) {
|
||||||
|
Objective o = objectives.get(num);
|
||||||
|
editor.putLong("Objectives" + num + "started", o.started.getTime());
|
||||||
|
editor.putLong("Objectives" + num + "accomplished", o.accomplished.getTime());
|
||||||
|
}
|
||||||
|
editor.putBoolean("Objectives" + "bgIsAvailableInNS", bgIsAvailableInNS);
|
||||||
|
editor.putBoolean("Objectives" + "pumpStatusIsAvailableInNS", pumpStatusIsAvailableInNS);
|
||||||
|
editor.putInt("Objectives" + "manualEnacts", manualEnacts);
|
||||||
|
editor.apply();
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Objectives stored");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadProgress() {
|
||||||
|
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
for (int num = 0; num < objectives.size(); num++) {
|
||||||
|
Objective o = objectives.get(num);
|
||||||
|
o.started = new Date(settings.getLong("Objectives" + num + "started", 0));
|
||||||
|
o.accomplished = new Date(settings.getLong("Objectives" + num + "accomplished", 0));
|
||||||
|
}
|
||||||
|
bgIsAvailableInNS = settings.getBoolean("Objectives" + "bgIsAvailableInNS", false);
|
||||||
|
pumpStatusIsAvailableInNS = settings.getBoolean("Objectives" + "pumpStatusIsAvailableInNS", false);
|
||||||
|
manualEnacts = settings.getInt("Objectives" + "manualEnacts", 0);
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Objectives loaded");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constraints interface
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public boolean isLoopEnabled() {
|
||||||
|
return objectives.get(1).started.getTime() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isClosedModeEnabled() {
|
||||||
|
return objectives.get(3).started.getTime() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAutosensModeEnabled() {
|
||||||
|
return objectives.get(5).started.getTime() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAMAModeEnabled() {
|
||||||
|
return objectives.get(6).started.getTime() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyMaxIOBConstraints(Double maxIob) {
|
||||||
|
if (objectives.get(4).started.getTime() > 0)
|
||||||
|
return maxIob;
|
||||||
|
else {
|
||||||
|
if (Config.logConstraintsChanges)
|
||||||
|
log.debug("Limiting maxIOB " + maxIob + " to " + 0 + "U");
|
||||||
|
return 0d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyBasalConstraints(Double absoluteRate) {
|
||||||
|
return absoluteRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyBasalConstraints(Integer percentRate) {
|
||||||
|
return percentRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyBolusConstraints(Double insulin) {
|
||||||
|
return insulin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyCarbsConstraints(Integer carbs) {
|
||||||
|
return carbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||||
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
|
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
|
||||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
|
||||||
public class DetermineBasalAdapterJS implements Parcelable {
|
public class DetermineBasalAdapterJS implements Parcelable {
|
||||||
|
@ -265,7 +266,7 @@ public class DetermineBasalAdapterJS implements Parcelable {
|
||||||
PumpInterface pump,
|
PumpInterface pump,
|
||||||
IobTotal iobData,
|
IobTotal iobData,
|
||||||
DatabaseHelper.GlucoseStatus glucoseStatus,
|
DatabaseHelper.GlucoseStatus glucoseStatus,
|
||||||
TreatmentsFragment.MealData mealData) {
|
TreatmentsPlugin.MealData mealData) {
|
||||||
|
|
||||||
String units = profile.getUnits();
|
String units = profile.getUnits();
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
package info.nightscout.androidaps.plugins.OpenAPSMA;
|
package info.nightscout.androidaps.plugins.OpenAPSMA;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
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;
|
||||||
|
@ -13,36 +9,27 @@ import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.json.JSONException;
|
import com.squareup.otto.Subscribe;
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
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.FragmentBase;
|
||||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSMAUpdateGui;
|
||||||
import info.nightscout.androidaps.interfaces.APSInterface;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSMAUpdateResultGui;
|
||||||
import info.nightscout.androidaps.interfaces.TempBasalsInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.APSResult;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
|
|
||||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.DateUtil;
|
|
||||||
import info.nightscout.utils.JSONFormatter;
|
import info.nightscout.utils.JSONFormatter;
|
||||||
import info.nightscout.utils.Round;
|
|
||||||
import info.nightscout.utils.SafeParse;
|
|
||||||
|
|
||||||
public class OpenAPSMAFragment extends Fragment implements View.OnClickListener, PluginBase, APSInterface {
|
public class OpenAPSMAFragment extends Fragment implements View.OnClickListener, FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(OpenAPSMAFragment.class);
|
private static Logger log = LoggerFactory.getLogger(OpenAPSMAFragment.class);
|
||||||
|
|
||||||
|
private static OpenAPSMAPlugin openAPSMAPlugin = new OpenAPSMAPlugin();
|
||||||
|
|
||||||
|
public static OpenAPSMAPlugin getPlugin() {
|
||||||
|
return openAPSMAPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
Button run;
|
Button run;
|
||||||
TextView lastRunView;
|
TextView lastRunView;
|
||||||
TextView glucoseStatusView;
|
TextView glucoseStatusView;
|
||||||
|
@ -53,107 +40,6 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
|
||||||
TextView resultView;
|
TextView resultView;
|
||||||
TextView requestView;
|
TextView requestView;
|
||||||
|
|
||||||
// last values
|
|
||||||
class LastRun implements Parcelable {
|
|
||||||
DetermineBasalAdapterJS lastDetermineBasalAdapterJS = null;
|
|
||||||
Date lastAPSRun = null;
|
|
||||||
DetermineBasalResult lastAPSResult = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
dest.writeParcelable(lastDetermineBasalAdapterJS, 0);
|
|
||||||
dest.writeParcelable(lastAPSResult, 0);
|
|
||||||
dest.writeLong(lastAPSRun.getTime());
|
|
||||||
dest.writeParcelable(lastAPSResult, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
lastDetermineBasalAdapterJS = in.readParcelable(DetermineBasalAdapterJS.class.getClassLoader());
|
|
||||||
lastAPSResult = in.readParcelable(DetermineBasalResult.class.getClassLoader());
|
|
||||||
lastAPSRun = new Date(in.readLong());
|
|
||||||
lastAPSResult = in.readParcelable(APSResult.class.getClassLoader());
|
|
||||||
}
|
|
||||||
|
|
||||||
public LastRun() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LastRun lastRun = null;
|
|
||||||
|
|
||||||
boolean fragmentEnabled = false;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
|
|
||||||
public OpenAPSMAFragment() {
|
|
||||||
super();
|
|
||||||
registerBus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.openapsma);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.APS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public APSResult getLastAPSResult() {
|
|
||||||
if (lastRun == null) return null;
|
|
||||||
return lastRun.lastAPSResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getLastAPSRun() {
|
|
||||||
return lastRun.lastAPSRun;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OpenAPSMAFragment newInstance() {
|
|
||||||
OpenAPSMAFragment fragment = new OpenAPSMAFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
@ -170,133 +56,40 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
|
||||||
resultView = (TextView) view.findViewById(R.id.openapsma_result);
|
resultView = (TextView) view.findViewById(R.id.openapsma_result);
|
||||||
requestView = (TextView) view.findViewById(R.id.openapsma_request);
|
requestView = (TextView) view.findViewById(R.id.openapsma_request);
|
||||||
|
|
||||||
// if (savedInstanceState != null) {
|
|
||||||
// lastRun = savedInstanceState.getParcelable("lastrun");
|
|
||||||
// }
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
return view;
|
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
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.openapsma_run:
|
case R.id.openapsma_run:
|
||||||
invoke();
|
openAPSMAPlugin.invoke();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invoke() {
|
public void onPause() {
|
||||||
DetermineBasalAdapterJS determineBasalAdapterJS = null;
|
super.onPause();
|
||||||
try {
|
MainApp.bus().unregister(this);
|
||||||
determineBasalAdapterJS = new DetermineBasalAdapterJS(new ScriptReader(MainApp.instance().getBaseContext()));
|
}
|
||||||
} catch (IOException e) {
|
|
||||||
log.error(e.getMessage(), e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseHelper.GlucoseStatus glucoseStatus = MainApp.getDbHelper().getGlucoseStatusData();
|
@Override
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
public void onResume() {
|
||||||
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
super.onResume();
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
if (!isEnabled(PluginBase.APS)) {
|
@Subscribe
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_disabled));
|
public void onStatusEvent(final EventOpenAPSMAUpdateGui ev) {
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_disabled));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glucoseStatus == null) {
|
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_noglucosedata));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (profile == null) {
|
|
||||||
updateResultGUI(MainApp.instance().getString(R.string.openapsma_noprofile));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_noprofile));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pump == null) {
|
|
||||||
updateResultGUI(getString(R.string.openapsma_nopump));
|
|
||||||
if (Config.logAPSResult)
|
|
||||||
log.debug(MainApp.instance().getString(R.string.openapsma_nopump));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
String units = profile.getUnits();
|
|
||||||
|
|
||||||
String maxBgDefault = "180";
|
|
||||||
String minBgDefault = "100";
|
|
||||||
if (!units.equals(Constants.MGDL)) {
|
|
||||||
maxBgDefault = "10";
|
|
||||||
minBgDefault = "5";
|
|
||||||
}
|
|
||||||
|
|
||||||
Date now = new Date();
|
|
||||||
|
|
||||||
double maxIob = SafeParse.stringToDouble(SP.getString("openapsma_max_iob", "1.5"));
|
|
||||||
double maxBasal = SafeParse.stringToDouble(SP.getString("openapsma_max_basal", "1"));
|
|
||||||
double minBg = NSProfile.toMgdl(SafeParse.stringToDouble(SP.getString("openapsma_min_bg", minBgDefault)), units);
|
|
||||||
double maxBg = NSProfile.toMgdl(SafeParse.stringToDouble(SP.getString("openapsma_max_bg", maxBgDefault)), units);
|
|
||||||
minBg = Round.roundTo(minBg, 0.1d);
|
|
||||||
maxBg = Round.roundTo(maxBg, 0.1d);
|
|
||||||
|
|
||||||
TreatmentsInterface treatments = MainApp.getConfigBuilder().getActiveTreatments();
|
|
||||||
TempBasalsInterface tempBasals = MainApp.getConfigBuilder().getActiveTempBasals();
|
|
||||||
treatments.updateTotalIOB();
|
|
||||||
tempBasals.updateTotalIOB();
|
|
||||||
IobTotal bolusIob = treatments.getLastCalculation();
|
|
||||||
IobTotal basalIob = tempBasals.getLastCalculation();
|
|
||||||
|
|
||||||
IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round();
|
|
||||||
|
|
||||||
TreatmentsFragment.MealData mealData = treatments.getMealData();
|
|
||||||
|
|
||||||
maxIob = MainApp.getConfigBuilder().applyMaxIOBConstraints(maxIob);
|
|
||||||
|
|
||||||
determineBasalAdapterJS.setData(profile, maxIob, maxBasal, minBg, maxBg, pump, iobTotal, glucoseStatus, mealData);
|
|
||||||
|
|
||||||
|
|
||||||
DetermineBasalResult determineBasalResult = determineBasalAdapterJS.invoke();
|
|
||||||
determineBasalResult.iob = iobTotal;
|
|
||||||
|
|
||||||
determineBasalAdapterJS.release();
|
|
||||||
|
|
||||||
try {
|
|
||||||
determineBasalResult.json.put("timestamp", DateUtil.toISOString(now));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
lastRun = new LastRun();
|
|
||||||
lastRun.lastDetermineBasalAdapterJS = determineBasalAdapterJS;
|
|
||||||
lastRun.lastAPSResult = determineBasalResult;
|
|
||||||
lastRun.lastAPSRun = now;
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
|
}
|
||||||
|
|
||||||
//deviceStatus.suggested = determineBasalResult.json;
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventOpenAPSMAUpdateResultGui ev) {
|
||||||
|
updateResultGUI(ev.text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateGUI() {
|
void updateGUI() {
|
||||||
|
@ -305,15 +98,15 @@ public class OpenAPSMAFragment extends Fragment implements View.OnClickListener,
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (lastRun != null) {
|
if (openAPSMAPlugin.lastAPSResult != null) {
|
||||||
glucoseStatusView.setText(JSONFormatter.format(lastRun.lastDetermineBasalAdapterJS.getGlucoseStatusParam()));
|
glucoseStatusView.setText(JSONFormatter.format(openAPSMAPlugin.lastDetermineBasalAdapterJS.getGlucoseStatusParam()));
|
||||||
currentTempView.setText(JSONFormatter.format(lastRun.lastDetermineBasalAdapterJS.getCurrentTempParam()));
|
currentTempView.setText(JSONFormatter.format(openAPSMAPlugin.lastDetermineBasalAdapterJS.getCurrentTempParam()));
|
||||||
iobDataView.setText(JSONFormatter.format(lastRun.lastDetermineBasalAdapterJS.getIobDataParam()));
|
iobDataView.setText(JSONFormatter.format(openAPSMAPlugin.lastDetermineBasalAdapterJS.getIobDataParam()));
|
||||||
profileView.setText(JSONFormatter.format(lastRun.lastDetermineBasalAdapterJS.getProfileParam()));
|
profileView.setText(JSONFormatter.format(openAPSMAPlugin.lastDetermineBasalAdapterJS.getProfileParam()));
|
||||||
mealDataView.setText(JSONFormatter.format(lastRun.lastDetermineBasalAdapterJS.getMealDataParam()));
|
mealDataView.setText(JSONFormatter.format(openAPSMAPlugin.lastDetermineBasalAdapterJS.getMealDataParam()));
|
||||||
resultView.setText(JSONFormatter.format(lastRun.lastAPSResult.json));
|
resultView.setText(JSONFormatter.format(openAPSMAPlugin.lastAPSResult.json));
|
||||||
requestView.setText(lastRun.lastAPSResult.toSpanned());
|
requestView.setText(openAPSMAPlugin.lastAPSResult.toSpanned());
|
||||||
lastRunView.setText(lastRun.lastAPSRun.toLocaleString());
|
lastRunView.setText(openAPSMAPlugin.lastAPSRun.toLocaleString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,193 @@
|
||||||
|
package info.nightscout.androidaps.plugins.OpenAPSMA;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.Constants;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||||
|
import info.nightscout.androidaps.interfaces.APSInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.TempBasalsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.APSResult;
|
||||||
|
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSMAUpdateGui;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSMAUpdateResultGui;
|
||||||
|
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
import info.nightscout.utils.DateUtil;
|
||||||
|
import info.nightscout.utils.Round;
|
||||||
|
import info.nightscout.utils.SafeParse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class OpenAPSMAPlugin implements PluginBase, APSInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(OpenAPSMAPlugin.class);
|
||||||
|
|
||||||
|
// last values
|
||||||
|
DetermineBasalAdapterJS lastDetermineBasalAdapterJS = null;
|
||||||
|
Date lastAPSRun = null;
|
||||||
|
DetermineBasalResult lastAPSResult = null;
|
||||||
|
|
||||||
|
boolean fragmentEnabled = false;
|
||||||
|
boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.openapsma);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.APS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return OpenAPSMAFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public APSResult getLastAPSResult() {
|
||||||
|
return lastAPSResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Date getLastAPSRun() {
|
||||||
|
return lastAPSRun;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke() {
|
||||||
|
DetermineBasalAdapterJS determineBasalAdapterJS = null;
|
||||||
|
try {
|
||||||
|
determineBasalAdapterJS = new DetermineBasalAdapterJS(new ScriptReader(MainApp.instance().getBaseContext()));
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseHelper.GlucoseStatus glucoseStatus = MainApp.getDbHelper().getGlucoseStatusData();
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
|
|
||||||
|
if (!isEnabled(PluginBase.APS)) {
|
||||||
|
MainApp.bus().post(new EventOpenAPSMAUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled)));
|
||||||
|
if (Config.logAPSResult)
|
||||||
|
log.debug(MainApp.instance().getString(R.string.openapsma_disabled));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glucoseStatus == null) {
|
||||||
|
MainApp.bus().post(new EventOpenAPSMAUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata)));
|
||||||
|
if (Config.logAPSResult)
|
||||||
|
log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (profile == null) {
|
||||||
|
MainApp.bus().post(new EventOpenAPSMAUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noprofile)));
|
||||||
|
if (Config.logAPSResult)
|
||||||
|
log.debug(MainApp.instance().getString(R.string.openapsma_noprofile));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pump == null) {
|
||||||
|
MainApp.bus().post(new EventOpenAPSMAUpdateResultGui(MainApp.instance().getString(R.string.openapsma_nopump)));
|
||||||
|
if (Config.logAPSResult)
|
||||||
|
log.debug(MainApp.instance().getString(R.string.openapsma_nopump));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
String units = profile.getUnits();
|
||||||
|
|
||||||
|
String maxBgDefault = "180";
|
||||||
|
String minBgDefault = "100";
|
||||||
|
if (!units.equals(Constants.MGDL)) {
|
||||||
|
maxBgDefault = "10";
|
||||||
|
minBgDefault = "5";
|
||||||
|
}
|
||||||
|
|
||||||
|
Date now = new Date();
|
||||||
|
|
||||||
|
double maxIob = SafeParse.stringToDouble(SP.getString("openapsma_max_iob", "1.5"));
|
||||||
|
double maxBasal = SafeParse.stringToDouble(SP.getString("openapsma_max_basal", "1"));
|
||||||
|
double minBg = NSProfile.toMgdl(SafeParse.stringToDouble(SP.getString("openapsma_min_bg", minBgDefault)), units);
|
||||||
|
double maxBg = NSProfile.toMgdl(SafeParse.stringToDouble(SP.getString("openapsma_max_bg", maxBgDefault)), units);
|
||||||
|
minBg = Round.roundTo(minBg, 0.1d);
|
||||||
|
maxBg = Round.roundTo(maxBg, 0.1d);
|
||||||
|
|
||||||
|
TreatmentsInterface treatments = MainApp.getConfigBuilder().getActiveTreatments();
|
||||||
|
TempBasalsInterface tempBasals = MainApp.getConfigBuilder().getActiveTempBasals();
|
||||||
|
treatments.updateTotalIOB();
|
||||||
|
tempBasals.updateTotalIOB();
|
||||||
|
IobTotal bolusIob = treatments.getLastCalculation();
|
||||||
|
IobTotal basalIob = tempBasals.getLastCalculation();
|
||||||
|
|
||||||
|
IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round();
|
||||||
|
|
||||||
|
TreatmentsPlugin.MealData mealData = treatments.getMealData();
|
||||||
|
|
||||||
|
maxIob = MainApp.getConfigBuilder().applyMaxIOBConstraints(maxIob);
|
||||||
|
|
||||||
|
determineBasalAdapterJS.setData(profile, maxIob, maxBasal, minBg, maxBg, pump, iobTotal, glucoseStatus, mealData);
|
||||||
|
|
||||||
|
|
||||||
|
DetermineBasalResult determineBasalResult = determineBasalAdapterJS.invoke();
|
||||||
|
determineBasalResult.iob = iobTotal;
|
||||||
|
|
||||||
|
determineBasalAdapterJS.release();
|
||||||
|
|
||||||
|
try {
|
||||||
|
determineBasalResult.json.put("timestamp", DateUtil.toISOString(now));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
lastDetermineBasalAdapterJS = determineBasalAdapterJS;
|
||||||
|
lastAPSResult = determineBasalResult;
|
||||||
|
lastAPSRun = now;
|
||||||
|
MainApp.bus().post(new EventOpenAPSMAUpdateGui());
|
||||||
|
|
||||||
|
//deviceStatus.suggested = determineBasalResult.json;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.OpenAPSMA.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventOpenAPSMAUpdateGui {
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package info.nightscout.androidaps.plugins.OpenAPSMA.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventOpenAPSMAUpdateResultGui {
|
||||||
|
public String text = null;
|
||||||
|
|
||||||
|
public EventOpenAPSMAUpdateResultGui(String text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,11 +19,9 @@ import org.slf4j.LoggerFactory;
|
||||||
import info.nightscout.androidaps.MainApp;
|
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.plugins.DanaR.DanaRFragment;
|
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRBolusProgress;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRBolusProgress;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRBolusStart;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRBolusStart;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
||||||
import info.nightscout.utils.ToastUtils;
|
|
||||||
|
|
||||||
public class BolusProgressDialog extends DialogFragment implements View.OnClickListener {
|
public class BolusProgressDialog extends DialogFragment implements View.OnClickListener {
|
||||||
private static Logger log = LoggerFactory.getLogger(BolusProgressDialog.class);
|
private static Logger log = LoggerFactory.getLogger(BolusProgressDialog.class);
|
||||||
|
@ -75,7 +73,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
|
||||||
case R.id.overview_bolusprogress_stop:
|
case R.id.overview_bolusprogress_stop:
|
||||||
log.debug("Stop bolus delivery button pressed");
|
log.debug("Stop bolus delivery button pressed");
|
||||||
stopPressedView.setVisibility(View.VISIBLE);
|
stopPressedView.setVisibility(View.VISIBLE);
|
||||||
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
pump.stopBolusDelivering();
|
pump.stopBolusDelivering();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import android.content.DialogInterface;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
@ -95,7 +94,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
|
||||||
builder.setMessage(confirmMessage);
|
builder.setMessage(confirmMessage);
|
||||||
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
final PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
@ -130,7 +130,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
|
||||||
builder.setMessage(confirmMessage);
|
builder.setMessage(confirmMessage);
|
||||||
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
final PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package info.nightscout.androidaps.plugins.Overview.Dialogs;
|
package info.nightscout.androidaps.plugins.Overview.Dialogs;
|
||||||
|
|
||||||
import android.app.ProgressDialog;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -8,8 +7,12 @@ import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.view.*;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.Window;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
@ -94,7 +97,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
|
||||||
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) {
|
if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) {
|
||||||
final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
final PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
@ -39,6 +39,7 @@ 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.ConfigBuilder.ConfigBuilderFragment;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
import info.nightscout.utils.DateUtil;
|
import info.nightscout.utils.DateUtil;
|
||||||
|
@ -192,7 +193,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener {
|
||||||
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) {
|
if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) {
|
||||||
final ConfigBuilderFragment pump = MainApp.getConfigBuilder();
|
final ConfigBuilderPlugin pump = MainApp.getConfigBuilder();
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -227,7 +228,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initDialog() {
|
private void initDialog() {
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile();
|
||||||
|
|
||||||
if (profile == null) {
|
if (profile == null) {
|
||||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile));
|
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile));
|
||||||
|
|
|
@ -38,7 +38,6 @@ import java.util.List;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.Constants;
|
import info.nightscout.androidaps.Constants;
|
||||||
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.PumpEnactResult;
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
@ -52,10 +51,9 @@ import info.nightscout.androidaps.events.EventRefreshGui;
|
||||||
import info.nightscout.androidaps.events.EventRefreshOpenLoop;
|
import info.nightscout.androidaps.events.EventRefreshOpenLoop;
|
||||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||||
import info.nightscout.androidaps.events.EventTreatmentChange;
|
import info.nightscout.androidaps.events.EventTreatmentChange;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
|
import info.nightscout.androidaps.plugins.Objectives.ObjectivesPlugin;
|
||||||
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTempBasalDialog;
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTempBasalDialog;
|
||||||
|
@ -67,9 +65,15 @@ import info.nightscout.utils.DecimalFormatter;
|
||||||
import info.nightscout.utils.Round;
|
import info.nightscout.utils.Round;
|
||||||
|
|
||||||
|
|
||||||
public class OverviewFragment extends Fragment implements PluginBase {
|
public class OverviewFragment extends Fragment {
|
||||||
private static Logger log = LoggerFactory.getLogger(OverviewFragment.class);
|
private static Logger log = LoggerFactory.getLogger(OverviewFragment.class);
|
||||||
|
|
||||||
|
private static OverviewPlugin overviewPlugin = new OverviewPlugin();
|
||||||
|
|
||||||
|
public static OverviewPlugin getPlugin() {
|
||||||
|
return overviewPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
TextView bgView;
|
TextView bgView;
|
||||||
TextView timeAgoView;
|
TextView timeAgoView;
|
||||||
TextView deltaView;
|
TextView deltaView;
|
||||||
|
@ -88,56 +92,22 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
Button setExtenedButton;
|
Button setExtenedButton;
|
||||||
Button acceptTempButton;
|
Button acceptTempButton;
|
||||||
|
|
||||||
Handler loopHandler = new Handler();
|
private static Handler sLoopHandler = new Handler();
|
||||||
Runnable refreshLoop = null;
|
private static Runnable sRefreshLoop = null;
|
||||||
|
|
||||||
Handler mHandler;
|
private static Handler sHandler;
|
||||||
public static HandlerThread mHandlerThread;
|
private static HandlerThread sHandlerThread;
|
||||||
|
|
||||||
public Double bgTargetLow = 80d;
|
public Double bgTargetLow = 80d;
|
||||||
public Double bgTargetHigh = 180d;
|
public Double bgTargetHigh = 180d;
|
||||||
|
|
||||||
public OverviewFragment() {
|
public OverviewFragment() {
|
||||||
super();
|
super();
|
||||||
mHandlerThread = new HandlerThread(OverviewFragment.class.getSimpleName());
|
if (sHandlerThread == null) {
|
||||||
mHandlerThread.start();
|
sHandlerThread = new HandlerThread(OverviewFragment.class.getSimpleName());
|
||||||
mHandler = new Handler(mHandlerThread.getLooper());
|
sHandlerThread.start();
|
||||||
registerBus();
|
sHandler = new Handler(sHandlerThread.getLooper());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.overview);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
// Always enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
// Always visible
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.GENERAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OverviewFragment newInstance() {
|
public static OverviewFragment newInstance() {
|
||||||
|
@ -147,15 +117,15 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
if (refreshLoop == null) {
|
if (sRefreshLoop == null) {
|
||||||
refreshLoop = new Runnable() {
|
sRefreshLoop = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
updateGUIIfVisible();
|
updateGUIIfVisible();
|
||||||
loopHandler.postDelayed(refreshLoop, 60 * 1000L);
|
sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
loopHandler.postDelayed(refreshLoop, 60 * 1000L);
|
sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,9 +172,9 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
cancelTempButton.setOnClickListener(new View.OnClickListener() {
|
cancelTempButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
final PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
if (pump.isTempBasalInProgress()) {
|
if (pump.isTempBasalInProgress()) {
|
||||||
mHandler.post(new Runnable() {
|
sHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
pump.cancelTempBasal();
|
pump.cancelTempBasal();
|
||||||
|
@ -237,14 +207,14 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
MainApp.getConfigBuilder().getActiveLoop().invoke(false);
|
MainApp.getConfigBuilder().getActiveLoop().invoke(false);
|
||||||
final LoopFragment.LastRun finalLastRun = LoopFragment.lastRun;
|
final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun;
|
||||||
if (finalLastRun != null && finalLastRun.lastAPSRun != null && finalLastRun.constraintsProcessed.changeRequested) {
|
if (finalLastRun != null && finalLastRun.lastAPSRun != null && finalLastRun.constraintsProcessed.changeRequested) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
||||||
builder.setTitle(getContext().getString(R.string.confirmation));
|
builder.setTitle(getContext().getString(R.string.confirmation));
|
||||||
builder.setMessage(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed);
|
builder.setMessage(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed);
|
||||||
builder.setPositiveButton(getContext().getString(R.string.ok), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getContext().getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
mHandler.post(new Runnable() {
|
sHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
PumpEnactResult applyResult = MainApp.getConfigBuilder().applyAPSRequest(finalLastRun.constraintsProcessed);
|
PumpEnactResult applyResult = MainApp.getConfigBuilder().applyAPSRequest(finalLastRun.constraintsProcessed);
|
||||||
|
@ -253,10 +223,10 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
finalLastRun.lastEnact = new Date();
|
finalLastRun.lastEnact = new Date();
|
||||||
finalLastRun.lastOpenModeAccept = new Date();
|
finalLastRun.lastOpenModeAccept = new Date();
|
||||||
MainApp.getConfigBuilder().uploadDeviceStatus();
|
MainApp.getConfigBuilder().uploadDeviceStatus();
|
||||||
ObjectivesFragment objectivesFragment = (ObjectivesFragment) MainApp.getSpecificPlugin(ObjectivesFragment.class);
|
ObjectivesPlugin objectivesPlugin = (ObjectivesPlugin) MainApp.getSpecificPlugin(ObjectivesPlugin.class);
|
||||||
if (objectivesFragment != null) {
|
if (objectivesPlugin != null) {
|
||||||
objectivesFragment.manualEnacts++;
|
objectivesPlugin.manualEnacts++;
|
||||||
objectivesFragment.saveProgress();
|
objectivesPlugin.saveProgress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateGUIIfVisible();
|
updateGUIIfVisible();
|
||||||
|
@ -275,12 +245,15 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
@Override
|
||||||
try {
|
public void onPause() {
|
||||||
MainApp.bus().unregister(this);
|
super.onPause();
|
||||||
} catch (RuntimeException x) {
|
MainApp.bus().unregister(this);
|
||||||
// Ignore
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
MainApp.bus().register(this);
|
MainApp.bus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,7 +310,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// open loop mode
|
// open loop mode
|
||||||
final LoopFragment.LastRun finalLastRun = LoopFragment.lastRun;
|
final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun;
|
||||||
if (Config.APS) {
|
if (Config.APS) {
|
||||||
apsModeView.setVisibility(View.VISIBLE);
|
apsModeView.setVisibility(View.VISIBLE);
|
||||||
if (MainApp.getConfigBuilder().isClosedModeEnabled())
|
if (MainApp.getConfigBuilder().isClosedModeEnabled())
|
||||||
|
@ -347,7 +320,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
apsModeView.setVisibility(View.GONE);
|
apsModeView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean showAcceptButton = !MainApp.getConfigBuilder().isClosedModeEnabled(); // Open mode needed
|
boolean showAcceptButton = !MainApp.getConfigBuilder().isClosedModeEnabled(); // Open mode needed
|
||||||
showAcceptButton = showAcceptButton && finalLastRun != null && finalLastRun.lastAPSRun != null; // aps result must exist
|
showAcceptButton = showAcceptButton && finalLastRun != null && finalLastRun.lastAPSRun != null; // aps result must exist
|
||||||
showAcceptButton = showAcceptButton && (finalLastRun.lastOpenModeAccept == null || finalLastRun.lastOpenModeAccept.getTime() < finalLastRun.lastAPSRun.getTime()); // never accepted or before last result
|
showAcceptButton = showAcceptButton && (finalLastRun.lastOpenModeAccept == null || finalLastRun.lastOpenModeAccept.getTime() < finalLastRun.lastAPSRun.getTime()); // never accepted or before last result
|
||||||
showAcceptButton = showAcceptButton && finalLastRun.constraintsProcessed.changeRequested; // change is requested
|
showAcceptButton = showAcceptButton && finalLastRun.constraintsProcessed.changeRequested; // change is requested
|
||||||
|
@ -361,7 +334,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
|
|
||||||
// **** Temp button ****
|
// **** Temp button ****
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
|
PumpInterface pump = MainApp.getConfigBuilder();
|
||||||
|
|
||||||
if (pump.isTempBasalInProgress()) {
|
if (pump.isTempBasalInProgress()) {
|
||||||
TempBasal activeTemp = pump.getTempBasal();
|
TempBasal activeTemp = pump.getTempBasal();
|
||||||
|
@ -483,7 +456,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
|
||||||
long now = new Date().getTime();
|
long now = new Date().getTime();
|
||||||
List<BarDataPoint> basalArray = new ArrayList<BarDataPoint>();
|
List<BarDataPoint> basalArray = new ArrayList<BarDataPoint>();
|
||||||
for (long time = fromTime; time < now; time += 5 * 60 * 1000L) {
|
for (long time = fromTime; time < now; time += 5 * 60 * 1000L) {
|
||||||
TempBasal tb = MainApp.getConfigBuilder().getActivePump().getTempBasal(new Date(time));
|
TempBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date(time));
|
||||||
if (tb != null)
|
if (tb != null)
|
||||||
basalArray.add(new BarDataPoint(time, tb.tempBasalConvertedToAbsolute(new Date(time)), true));
|
basalArray.add(new BarDataPoint(time, tb.tempBasalConvertedToAbsolute(new Date(time)), true));
|
||||||
else
|
else
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Overview;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class OverviewPlugin implements PluginBase {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return OverviewFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.overview);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
// Always enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
// Always visible
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,202 +1,19 @@
|
||||||
package info.nightscout.androidaps.plugins.SafetyFragment;
|
package info.nightscout.androidaps.plugins.SafetyFragment;
|
||||||
|
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.BuildConfig;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.Config;
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.plugins.Loop.APSResult;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.Round;
|
|
||||||
import info.nightscout.utils.SafeParse;
|
|
||||||
|
|
||||||
public class SafetyFragment extends Fragment implements PluginBase, ConstraintsInterface {
|
public class SafetyFragment extends Fragment implements FragmentBase{
|
||||||
private static Logger log = LoggerFactory.getLogger(SafetyFragment.class);
|
private static Logger log = LoggerFactory.getLogger(SafetyFragment.class);
|
||||||
|
|
||||||
|
private static SafetyPlugin safetyPlugin = new SafetyPlugin();
|
||||||
|
|
||||||
@Override
|
public static SafetyPlugin getPlugin() {
|
||||||
public int getType() {
|
return safetyPlugin;
|
||||||
return PluginBase.CONSTRAINTS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.safety);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int tyep, boolean fragmentEnabled) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SafetyFragment newInstance() {
|
|
||||||
SafetyFragment fragment = new SafetyFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isLoopEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constraints interface
|
|
||||||
**/
|
|
||||||
@Override
|
|
||||||
public boolean isClosedModeEnabled() {
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
String mode = SP.getString("aps_mode", "open");
|
|
||||||
return mode.equals("closed") && BuildConfig.CLOSEDLOOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAutosensModeEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAMAModeEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyBasalConstraints(Double absoluteRate) {
|
|
||||||
Double origAbsoluteRate = absoluteRate;
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
Double maxBasal = SafeParse.stringToDouble(SP.getString("openapsma_max_basal", "1"));
|
|
||||||
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
if (profile == null) return absoluteRate;
|
|
||||||
if (absoluteRate < 0) absoluteRate = 0d;
|
|
||||||
|
|
||||||
Integer maxBasalMult = 4;
|
|
||||||
Integer maxBasalFromDaily = 3;
|
|
||||||
// Check percentRate but absolute rate too, because we know real current basal in pump
|
|
||||||
Double origRate = absoluteRate;
|
|
||||||
if (absoluteRate > maxBasal) {
|
|
||||||
absoluteRate = maxBasal;
|
|
||||||
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
if (absoluteRate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
|
|
||||||
absoluteRate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
|
|
||||||
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
if (absoluteRate > profile.getMaxDailyBasal() * maxBasalFromDaily) {
|
|
||||||
absoluteRate = profile.getMaxDailyBasal() * maxBasalFromDaily;
|
|
||||||
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origRate + " by 3 * maxDailyBasal to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
return absoluteRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyBasalConstraints(Integer percentRate) {
|
|
||||||
Integer origPercentRate = percentRate;
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
Double maxBasal = SafeParse.stringToDouble(SP.getString("openapsma_max_basal", "1"));
|
|
||||||
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
if (profile == null) return percentRate;
|
|
||||||
Double currentBasal = profile.getBasal(profile.secondsFromMidnight());
|
|
||||||
|
|
||||||
Double absoluteRate = currentBasal * ((double) percentRate / 100);
|
|
||||||
|
|
||||||
if (Config.logConstraintsChanges)
|
|
||||||
log.debug("Percent rate " + percentRate + "% recalculated to " + absoluteRate + "U/h with current basal " + currentBasal + "U/h");
|
|
||||||
|
|
||||||
if (absoluteRate < 0) absoluteRate = 0d;
|
|
||||||
|
|
||||||
Integer maxBasalMult = 4;
|
|
||||||
Integer maxBasalFromDaily = 3;
|
|
||||||
// Check percentRate but absolute rate too, because we know real current basal in pump
|
|
||||||
Double origRate = absoluteRate;
|
|
||||||
if (absoluteRate > maxBasal) {
|
|
||||||
absoluteRate = maxBasal;
|
|
||||||
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
if (absoluteRate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
|
|
||||||
absoluteRate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
|
|
||||||
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
if (absoluteRate > profile.getMaxDailyBasal() * maxBasalFromDaily) {
|
|
||||||
absoluteRate = profile.getMaxDailyBasal() * maxBasalFromDaily;
|
|
||||||
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
|
||||||
log.debug("Limiting rate " + origRate + " by 3 * maxDailyBasal to " + absoluteRate + "U/h");
|
|
||||||
}
|
|
||||||
|
|
||||||
Integer percentRateAfterConst = new Double(absoluteRate / currentBasal * 100).intValue();
|
|
||||||
if (percentRateAfterConst < 100) percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, 10d).intValue();
|
|
||||||
else percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, 10d).intValue();
|
|
||||||
|
|
||||||
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
|
||||||
log.debug("Recalculated percent rate " + percentRate + "% to " + percentRateAfterConst + "%");
|
|
||||||
return percentRateAfterConst;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyBolusConstraints(Double insulin) {
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
try {
|
|
||||||
Double maxBolus = SafeParse.stringToDouble(SP.getString("treatmentssafety_maxbolus", "3"));
|
|
||||||
|
|
||||||
if (insulin < 0) insulin = 0d;
|
|
||||||
if (insulin > maxBolus) insulin = maxBolus;
|
|
||||||
} catch (Exception e) {
|
|
||||||
insulin = 0d;
|
|
||||||
}
|
|
||||||
return insulin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer applyCarbsConstraints(Integer carbs) {
|
|
||||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
try {
|
|
||||||
Integer maxCarbs = Integer.parseInt(SP.getString("treatmentssafety_maxcarbs", "48"));
|
|
||||||
|
|
||||||
if (carbs < 0) carbs = 0;
|
|
||||||
if (carbs > maxCarbs) carbs = maxCarbs;
|
|
||||||
} catch (Exception e) {
|
|
||||||
carbs = 0;
|
|
||||||
}
|
|
||||||
return carbs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double applyMaxIOBConstraints(Double maxIob) {
|
|
||||||
return maxIob;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
package info.nightscout.androidaps.plugins.SafetyFragment;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.BuildConfig;
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.Constants;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
import info.nightscout.utils.Round;
|
||||||
|
import info.nightscout.utils.SafeParse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(SafetyPlugin.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return SafetyFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.CONSTRAINTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.safety);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int tyep, boolean fragmentEnabled) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLoopEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constraints interface
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public boolean isClosedModeEnabled() {
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
String mode = SP.getString("aps_mode", "open");
|
||||||
|
return mode.equals("closed") && BuildConfig.CLOSEDLOOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAutosensModeEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAMAModeEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyBasalConstraints(Double absoluteRate) {
|
||||||
|
Double origAbsoluteRate = absoluteRate;
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
Double maxBasal = SafeParse.stringToDouble(SP.getString("openapsma_max_basal", "1"));
|
||||||
|
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
if (profile == null) return absoluteRate;
|
||||||
|
if (absoluteRate < 0) absoluteRate = 0d;
|
||||||
|
|
||||||
|
Integer maxBasalMult = 4;
|
||||||
|
Integer maxBasalFromDaily = 3;
|
||||||
|
// Check percentRate but absolute rate too, because we know real current basal in pump
|
||||||
|
Double origRate = absoluteRate;
|
||||||
|
if (absoluteRate > maxBasal) {
|
||||||
|
absoluteRate = maxBasal;
|
||||||
|
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
if (absoluteRate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
|
||||||
|
absoluteRate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
|
||||||
|
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
if (absoluteRate > profile.getMaxDailyBasal() * maxBasalFromDaily) {
|
||||||
|
absoluteRate = profile.getMaxDailyBasal() * maxBasalFromDaily;
|
||||||
|
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origRate + " by 3 * maxDailyBasal to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
return absoluteRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyBasalConstraints(Integer percentRate) {
|
||||||
|
Integer origPercentRate = percentRate;
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
Double maxBasal = SafeParse.stringToDouble(SP.getString("openapsma_max_basal", "1"));
|
||||||
|
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
if (profile == null) return percentRate;
|
||||||
|
Double currentBasal = profile.getBasal(profile.secondsFromMidnight());
|
||||||
|
|
||||||
|
Double absoluteRate = currentBasal * ((double) percentRate / 100);
|
||||||
|
|
||||||
|
if (Config.logConstraintsChanges)
|
||||||
|
log.debug("Percent rate " + percentRate + "% recalculated to " + absoluteRate + "U/h with current basal " + currentBasal + "U/h");
|
||||||
|
|
||||||
|
if (absoluteRate < 0) absoluteRate = 0d;
|
||||||
|
|
||||||
|
Integer maxBasalMult = 4;
|
||||||
|
Integer maxBasalFromDaily = 3;
|
||||||
|
// Check percentRate but absolute rate too, because we know real current basal in pump
|
||||||
|
Double origRate = absoluteRate;
|
||||||
|
if (absoluteRate > maxBasal) {
|
||||||
|
absoluteRate = maxBasal;
|
||||||
|
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
if (absoluteRate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
|
||||||
|
absoluteRate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
|
||||||
|
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
if (absoluteRate > profile.getMaxDailyBasal() * maxBasalFromDaily) {
|
||||||
|
absoluteRate = profile.getMaxDailyBasal() * maxBasalFromDaily;
|
||||||
|
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
||||||
|
log.debug("Limiting rate " + origRate + " by 3 * maxDailyBasal to " + absoluteRate + "U/h");
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer percentRateAfterConst = new Double(absoluteRate / currentBasal * 100).intValue();
|
||||||
|
if (percentRateAfterConst < 100)
|
||||||
|
percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, 10d).intValue();
|
||||||
|
else percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, 10d).intValue();
|
||||||
|
|
||||||
|
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
||||||
|
log.debug("Recalculated percent rate " + percentRate + "% to " + percentRateAfterConst + "%");
|
||||||
|
return percentRateAfterConst;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyBolusConstraints(Double insulin) {
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
try {
|
||||||
|
Double maxBolus = SafeParse.stringToDouble(SP.getString("treatmentssafety_maxbolus", "3"));
|
||||||
|
|
||||||
|
if (insulin < 0) insulin = 0d;
|
||||||
|
if (insulin > maxBolus) insulin = maxBolus;
|
||||||
|
} catch (Exception e) {
|
||||||
|
insulin = 0d;
|
||||||
|
}
|
||||||
|
return insulin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer applyCarbsConstraints(Integer carbs) {
|
||||||
|
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
try {
|
||||||
|
Integer maxCarbs = Integer.parseInt(SP.getString("treatmentssafety_maxcarbs", "48"));
|
||||||
|
|
||||||
|
if (carbs < 0) carbs = 0;
|
||||||
|
if (carbs > maxCarbs) carbs = maxCarbs;
|
||||||
|
} catch (Exception e) {
|
||||||
|
carbs = 0;
|
||||||
|
}
|
||||||
|
return carbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double applyMaxIOBConstraints(Double maxIob) {
|
||||||
|
return maxIob;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,11 +1,8 @@
|
||||||
package info.nightscout.androidaps.plugins.SimpleProfile;
|
package info.nightscout.androidaps.plugins.SimpleProfile;
|
||||||
|
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
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;
|
||||||
|
@ -13,30 +10,22 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
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.Constants;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
|
||||||
import info.nightscout.androidaps.R;
|
import info.nightscout.androidaps.R;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.SafeParse;
|
import info.nightscout.utils.SafeParse;
|
||||||
|
|
||||||
public class SimpleProfileFragment extends Fragment implements PluginBase, ProfileInterface {
|
public class SimpleProfileFragment extends Fragment implements FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(SimpleProfileFragment.class);
|
private static Logger log = LoggerFactory.getLogger(SimpleProfileFragment.class);
|
||||||
|
|
||||||
private static final String PREFS_NAME = "SimpleProfile";
|
private static SimpleProfilePlugin simpleProfilePlugin = new SimpleProfilePlugin();
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
public static SimpleProfilePlugin getPlugin() {
|
||||||
boolean fragmentVisible = true;
|
return simpleProfilePlugin;
|
||||||
|
}
|
||||||
|
|
||||||
EditText diaView;
|
EditText diaView;
|
||||||
RadioButton mgdlView;
|
RadioButton mgdlView;
|
||||||
|
@ -48,59 +37,6 @@ public class SimpleProfileFragment extends Fragment implements PluginBase, Profi
|
||||||
EditText targetlowView;
|
EditText targetlowView;
|
||||||
EditText targethighView;
|
EditText targethighView;
|
||||||
|
|
||||||
boolean mgdl;
|
|
||||||
boolean mmol;
|
|
||||||
Double dia;
|
|
||||||
Double ic;
|
|
||||||
Double isf;
|
|
||||||
Double car;
|
|
||||||
Double basal;
|
|
||||||
Double targetLow;
|
|
||||||
Double targetHigh;
|
|
||||||
|
|
||||||
NSProfile convertedProfile = null;
|
|
||||||
|
|
||||||
public SimpleProfileFragment() {
|
|
||||||
super();
|
|
||||||
registerBus();
|
|
||||||
loadSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.PROFILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.simpleprofile);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
@ -115,32 +51,32 @@ public class SimpleProfileFragment extends Fragment implements PluginBase, Profi
|
||||||
targetlowView = (EditText) layout.findViewById(R.id.simpleprofile_targetlow);
|
targetlowView = (EditText) layout.findViewById(R.id.simpleprofile_targetlow);
|
||||||
targethighView = (EditText) layout.findViewById(R.id.simpleprofile_targethigh);
|
targethighView = (EditText) layout.findViewById(R.id.simpleprofile_targethigh);
|
||||||
|
|
||||||
mgdlView.setChecked(mgdl);
|
mgdlView.setChecked(simpleProfilePlugin.mgdl);
|
||||||
mmolView.setChecked(mmol);
|
mmolView.setChecked(simpleProfilePlugin.mmol);
|
||||||
diaView.setText(dia.toString());
|
diaView.setText(simpleProfilePlugin.dia.toString());
|
||||||
icView.setText(ic.toString());
|
icView.setText(simpleProfilePlugin.ic.toString());
|
||||||
isfView.setText(isf.toString());
|
isfView.setText(simpleProfilePlugin.isf.toString());
|
||||||
carView.setText(car.toString());
|
carView.setText(simpleProfilePlugin.car.toString());
|
||||||
basalView.setText(basal.toString());
|
basalView.setText(simpleProfilePlugin.basal.toString());
|
||||||
targetlowView.setText(targetLow.toString());
|
targetlowView.setText(simpleProfilePlugin.targetLow.toString());
|
||||||
targethighView.setText(targetHigh.toString());
|
targethighView.setText(simpleProfilePlugin.targetHigh.toString());
|
||||||
|
|
||||||
mgdlView.setOnClickListener(new View.OnClickListener() {
|
mgdlView.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
mgdl = mgdlView.isChecked();
|
simpleProfilePlugin.mgdl = mgdlView.isChecked();
|
||||||
mmol = !mgdl;
|
simpleProfilePlugin.mmol = !simpleProfilePlugin.mgdl;
|
||||||
mmolView.setChecked(mmol);
|
mmolView.setChecked(simpleProfilePlugin.mmol);
|
||||||
storeSettings();
|
simpleProfilePlugin.storeSettings();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mmolView.setOnClickListener(new View.OnClickListener() {
|
mmolView.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
mmol = mmolView.isChecked();
|
simpleProfilePlugin.mmol = mmolView.isChecked();
|
||||||
mgdl = !mmol;
|
simpleProfilePlugin.mgdl = !simpleProfilePlugin.mmol;
|
||||||
mgdlView.setChecked(mgdl);
|
mgdlView.setChecked(simpleProfilePlugin.mgdl);
|
||||||
storeSettings();
|
simpleProfilePlugin.storeSettings();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -158,16 +94,17 @@ 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 = SafeParse.stringToDouble(diaView.getText().toString());
|
simpleProfilePlugin.dia = SafeParse.stringToDouble(diaView.getText().toString());
|
||||||
ic = SafeParse.stringToDouble(icView.getText().toString());
|
simpleProfilePlugin.ic = SafeParse.stringToDouble(icView.getText().toString());
|
||||||
isf = SafeParse.stringToDouble(isfView.getText().toString());
|
simpleProfilePlugin.isf = SafeParse.stringToDouble(isfView.getText().toString());
|
||||||
car = SafeParse.stringToDouble(carView.getText().toString());
|
simpleProfilePlugin.car = SafeParse.stringToDouble(carView.getText().toString());
|
||||||
basal = SafeParse.stringToDouble(basalView.getText().toString());
|
simpleProfilePlugin.basal = SafeParse.stringToDouble(basalView.getText().toString());
|
||||||
targetLow = SafeParse.stringToDouble(targetlowView.getText().toString());
|
simpleProfilePlugin.targetLow = SafeParse.stringToDouble(targetlowView.getText().toString());
|
||||||
targetHigh = SafeParse.stringToDouble(targethighView.getText().toString());
|
simpleProfilePlugin.targetHigh = SafeParse.stringToDouble(targethighView.getText().toString());
|
||||||
storeSettings();
|
simpleProfilePlugin.storeSettings();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
diaView.addTextChangedListener(textWatch);
|
diaView.addTextChangedListener(textWatch);
|
||||||
icView.addTextChangedListener(textWatch);
|
icView.addTextChangedListener(textWatch);
|
||||||
isfView.addTextChangedListener(textWatch);
|
isfView.addTextChangedListener(textWatch);
|
||||||
|
@ -178,121 +115,4 @@ public class SimpleProfileFragment extends Fragment implements PluginBase, Profi
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SimpleProfileFragment newInstance() {
|
|
||||||
SimpleProfileFragment fragment = new SimpleProfileFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void registerBus() {
|
|
||||||
try {
|
|
||||||
MainApp.bus().unregister(this);
|
|
||||||
} catch (RuntimeException x) {
|
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void storeSettings() {
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Storing settings");
|
|
||||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
SharedPreferences.Editor editor = settings.edit();
|
|
||||||
editor.putBoolean("SimpleProfile" + "mmol", mmol);
|
|
||||||
editor.putBoolean("SimpleProfile" + "mgdl", mgdl);
|
|
||||||
editor.putFloat("SimpleProfile" + "dia", new Float(dia));
|
|
||||||
editor.putFloat("SimpleProfile" + "ic", new Float(ic));
|
|
||||||
editor.putFloat("SimpleProfile" + "isf", new Float(isf));
|
|
||||||
editor.putFloat("SimpleProfile" + "car", new Float(car));
|
|
||||||
editor.putFloat("SimpleProfile" + "basal", new Float(basal));
|
|
||||||
editor.putFloat("SimpleProfile" + "targetlow", new Float(targetLow));
|
|
||||||
editor.putFloat("SimpleProfile" + "targethigh", new Float(targetHigh));
|
|
||||||
|
|
||||||
editor.commit();
|
|
||||||
createConvertedProfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadSettings() {
|
|
||||||
if (Config.logPrefsChange)
|
|
||||||
log.debug("Loading stored settings");
|
|
||||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
|
|
||||||
if (settings.contains("SimpleProfile" + "mgdl")) mgdl = settings.getBoolean("SimpleProfile" + "mgdl", true); else mgdl = true;
|
|
||||||
if (settings.contains("SimpleProfile" + "mmol")) mmol = settings.getBoolean("SimpleProfile" + "mmol", false); else mmol = false;
|
|
||||||
if (settings.contains("SimpleProfile" + "dia")) dia = (double) settings.getFloat("SimpleProfile" + "dia", 3); else dia = 3d;
|
|
||||||
if (settings.contains("SimpleProfile" + "ic")) ic = (double) settings.getFloat("SimpleProfile" + "ic", 20); else ic = 20d;
|
|
||||||
if (settings.contains("SimpleProfile" + "isf")) isf = (double) settings.getFloat("SimpleProfile" + "isf", 200); else isf = 200d;
|
|
||||||
if (settings.contains("SimpleProfile" + "car")) car = (double) settings.getFloat("SimpleProfile" + "car", 20); else car = 20d;
|
|
||||||
if (settings.contains("SimpleProfile" + "basal")) basal = (double) settings.getFloat("SimpleProfile" + "basal", 1); else basal = 1d;
|
|
||||||
if (settings.contains("SimpleProfile" + "targetlow")) targetLow = (double) settings.getFloat("SimpleProfile" + "targetlow", 80); else targetLow = 80d;
|
|
||||||
if (settings.contains("SimpleProfile" + "targethigh"))
|
|
||||||
targetHigh = (double) settings.getFloat("SimpleProfile" + "targethigh", 120); else targetHigh = 120d;
|
|
||||||
createConvertedProfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
{
|
|
||||||
"_id": "576264a12771b7500d7ad184",
|
|
||||||
"startDate": "2016-06-16T08:35:00.000Z",
|
|
||||||
"defaultProfile": "Default",
|
|
||||||
"store": {
|
|
||||||
"Default": {
|
|
||||||
"dia": "3",
|
|
||||||
"carbratio": [{
|
|
||||||
"time": "00:00",
|
|
||||||
"value": "30"
|
|
||||||
}],
|
|
||||||
"carbs_hr": "20",
|
|
||||||
"delay": "20",
|
|
||||||
"sens": [{
|
|
||||||
"time": "00:00",
|
|
||||||
"value": "100"
|
|
||||||
}],
|
|
||||||
"timezone": "UTC",
|
|
||||||
"basal": [{
|
|
||||||
"time": "00:00",
|
|
||||||
"value": "0.1"
|
|
||||||
}],
|
|
||||||
"target_low": [{
|
|
||||||
"time": "00:00",
|
|
||||||
"value": "0"
|
|
||||||
}],
|
|
||||||
"target_high": [{
|
|
||||||
"time": "00:00",
|
|
||||||
"value": "0"
|
|
||||||
}],
|
|
||||||
"startDate": "1970-01-01T00:00:00.000Z",
|
|
||||||
"units": "mmol"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"created_at": "2016-06-16T08:34:41.256Z"
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
void createConvertedProfile() {
|
|
||||||
JSONObject json = new JSONObject();
|
|
||||||
JSONObject store = new JSONObject();
|
|
||||||
JSONObject profile = new JSONObject();
|
|
||||||
|
|
||||||
try {
|
|
||||||
json.put("defaultProfile", "Profile");
|
|
||||||
json.put("store", store);
|
|
||||||
profile.put("dia", dia);
|
|
||||||
profile.put("carbratio", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", ic)));
|
|
||||||
profile.put("carbs_hr", car);
|
|
||||||
profile.put("sens", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", isf)));
|
|
||||||
profile.put("basal", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", basal)));
|
|
||||||
profile.put("target_low", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", targetLow)));
|
|
||||||
profile.put("target_high", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", targetHigh)));
|
|
||||||
profile.put("units", mgdl ? Constants.MGDL : Constants.MMOL);
|
|
||||||
store.put("Profile", profile);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
convertedProfile = new NSProfile(json, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NSProfile getProfile() {
|
|
||||||
return convertedProfile;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,205 @@
|
||||||
|
package info.nightscout.androidaps.plugins.SimpleProfile;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.Constants;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class SimpleProfilePlugin implements PluginBase, ProfileInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(SimpleProfilePlugin.class);
|
||||||
|
|
||||||
|
private static boolean fragmentEnabled = true;
|
||||||
|
private static boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
private static NSProfile convertedProfile = null;
|
||||||
|
|
||||||
|
boolean mgdl;
|
||||||
|
boolean mmol;
|
||||||
|
Double dia;
|
||||||
|
Double ic;
|
||||||
|
Double isf;
|
||||||
|
Double car;
|
||||||
|
Double basal;
|
||||||
|
Double targetLow;
|
||||||
|
Double targetHigh;
|
||||||
|
|
||||||
|
public SimpleProfilePlugin() {
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return SimpleProfilePlugin.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.PROFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.simpleprofile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void storeSettings() {
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Storing settings");
|
||||||
|
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
SharedPreferences.Editor editor = settings.edit();
|
||||||
|
editor.putBoolean("SimpleProfile" + "mmol", mmol);
|
||||||
|
editor.putBoolean("SimpleProfile" + "mgdl", mgdl);
|
||||||
|
editor.putFloat("SimpleProfile" + "dia", new Float(dia));
|
||||||
|
editor.putFloat("SimpleProfile" + "ic", new Float(ic));
|
||||||
|
editor.putFloat("SimpleProfile" + "isf", new Float(isf));
|
||||||
|
editor.putFloat("SimpleProfile" + "car", new Float(car));
|
||||||
|
editor.putFloat("SimpleProfile" + "basal", new Float(basal));
|
||||||
|
editor.putFloat("SimpleProfile" + "targetlow", new Float(targetLow));
|
||||||
|
editor.putFloat("SimpleProfile" + "targethigh", new Float(targetHigh));
|
||||||
|
|
||||||
|
editor.commit();
|
||||||
|
createConvertedProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadSettings() {
|
||||||
|
if (Config.logPrefsChange)
|
||||||
|
log.debug("Loading stored settings");
|
||||||
|
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
|
||||||
|
if (settings.contains("SimpleProfile" + "mgdl"))
|
||||||
|
mgdl = settings.getBoolean("SimpleProfile" + "mgdl", true);
|
||||||
|
else mgdl = true;
|
||||||
|
if (settings.contains("SimpleProfile" + "mmol"))
|
||||||
|
mmol = settings.getBoolean("SimpleProfile" + "mmol", false);
|
||||||
|
else mmol = false;
|
||||||
|
if (settings.contains("SimpleProfile" + "dia"))
|
||||||
|
dia = (double) settings.getFloat("SimpleProfile" + "dia", 3);
|
||||||
|
else dia = 3d;
|
||||||
|
if (settings.contains("SimpleProfile" + "ic"))
|
||||||
|
ic = (double) settings.getFloat("SimpleProfile" + "ic", 20);
|
||||||
|
else ic = 20d;
|
||||||
|
if (settings.contains("SimpleProfile" + "isf"))
|
||||||
|
isf = (double) settings.getFloat("SimpleProfile" + "isf", 200);
|
||||||
|
else isf = 200d;
|
||||||
|
if (settings.contains("SimpleProfile" + "car"))
|
||||||
|
car = (double) settings.getFloat("SimpleProfile" + "car", 20);
|
||||||
|
else car = 20d;
|
||||||
|
if (settings.contains("SimpleProfile" + "basal"))
|
||||||
|
basal = (double) settings.getFloat("SimpleProfile" + "basal", 1);
|
||||||
|
else basal = 1d;
|
||||||
|
if (settings.contains("SimpleProfile" + "targetlow"))
|
||||||
|
targetLow = (double) settings.getFloat("SimpleProfile" + "targetlow", 80);
|
||||||
|
else targetLow = 80d;
|
||||||
|
if (settings.contains("SimpleProfile" + "targethigh"))
|
||||||
|
targetHigh = (double) settings.getFloat("SimpleProfile" + "targethigh", 120);
|
||||||
|
else targetHigh = 120d;
|
||||||
|
createConvertedProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
"_id": "576264a12771b7500d7ad184",
|
||||||
|
"startDate": "2016-06-16T08:35:00.000Z",
|
||||||
|
"defaultProfile": "Default",
|
||||||
|
"store": {
|
||||||
|
"Default": {
|
||||||
|
"dia": "3",
|
||||||
|
"carbratio": [{
|
||||||
|
"time": "00:00",
|
||||||
|
"value": "30"
|
||||||
|
}],
|
||||||
|
"carbs_hr": "20",
|
||||||
|
"delay": "20",
|
||||||
|
"sens": [{
|
||||||
|
"time": "00:00",
|
||||||
|
"value": "100"
|
||||||
|
}],
|
||||||
|
"timezone": "UTC",
|
||||||
|
"basal": [{
|
||||||
|
"time": "00:00",
|
||||||
|
"value": "0.1"
|
||||||
|
}],
|
||||||
|
"target_low": [{
|
||||||
|
"time": "00:00",
|
||||||
|
"value": "0"
|
||||||
|
}],
|
||||||
|
"target_high": [{
|
||||||
|
"time": "00:00",
|
||||||
|
"value": "0"
|
||||||
|
}],
|
||||||
|
"startDate": "1970-01-01T00:00:00.000Z",
|
||||||
|
"units": "mmol"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"created_at": "2016-06-16T08:34:41.256Z"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
void createConvertedProfile() {
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
JSONObject store = new JSONObject();
|
||||||
|
JSONObject profile = new JSONObject();
|
||||||
|
|
||||||
|
try {
|
||||||
|
json.put("defaultProfile", "Profile");
|
||||||
|
json.put("store", store);
|
||||||
|
profile.put("dia", dia);
|
||||||
|
profile.put("carbratio", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", ic)));
|
||||||
|
profile.put("carbs_hr", car);
|
||||||
|
profile.put("sens", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", isf)));
|
||||||
|
profile.put("basal", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", basal)));
|
||||||
|
profile.put("target_low", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", targetLow)));
|
||||||
|
profile.put("target_high", new JSONArray().put(new JSONObject().put("timeAsSeconds", 0).put("value", targetHigh)));
|
||||||
|
profile.put("units", mgdl ? Constants.MGDL : Constants.MMOL);
|
||||||
|
store.put("Profile", profile);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
convertedProfile = new NSProfile(json, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NSProfile getProfile() {
|
||||||
|
return convertedProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package info.nightscout.androidaps.plugins.SmsCommunicator.Events;
|
package info.nightscout.androidaps.plugins.SmsCommunicator.events;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,8 @@ package info.nightscout.androidaps.plugins.SmsCommunicator;
|
||||||
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.pm.ResolveInfo;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.telephony.SmsManager;
|
|
||||||
import android.telephony.SmsMessage;
|
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -22,80 +16,31 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
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.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui;
|
||||||
import info.nightscout.androidaps.data.PumpEnactResult;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
|
||||||
import info.nightscout.androidaps.plugins.SmsCommunicator.Events.EventNewSMS;
|
|
||||||
import info.nightscout.utils.SafeParse;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple {@link Fragment} subclass.
|
* A simple {@link Fragment} subclass.
|
||||||
*/
|
*/
|
||||||
public class SmsCommunicatorFragment extends Fragment implements PluginBase {
|
public class SmsCommunicatorFragment extends Fragment {
|
||||||
private static Logger log = LoggerFactory.getLogger(SmsCommunicatorFragment.class);
|
private static Logger log = LoggerFactory.getLogger(SmsCommunicatorFragment.class);
|
||||||
|
|
||||||
|
private static SmsCommunicatorPlugin smsCommunicatorPlugin = new SmsCommunicatorPlugin();
|
||||||
|
|
||||||
|
public static SmsCommunicatorPlugin getPlugin() {
|
||||||
|
return smsCommunicatorPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
TextView logView;
|
TextView logView;
|
||||||
|
|
||||||
boolean fragmentEnabled = false;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
|
|
||||||
public SmsCommunicatorFragment() {
|
public SmsCommunicatorFragment() {
|
||||||
super();
|
super();
|
||||||
registerBus();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SmsCommunicatorFragment newInstance() {
|
|
||||||
SmsCommunicatorFragment fragment = new SmsCommunicatorFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Sms {
|
|
||||||
String phoneNumber;
|
|
||||||
String text;
|
|
||||||
Date date;
|
|
||||||
boolean received = false;
|
|
||||||
boolean sent = false;
|
|
||||||
boolean processed = false;
|
|
||||||
|
|
||||||
String confirmCode;
|
|
||||||
double bolusRequested = 0d;
|
|
||||||
|
|
||||||
public Sms(SmsMessage message) {
|
|
||||||
phoneNumber = message.getOriginatingAddress();
|
|
||||||
text = message.getMessageBody();
|
|
||||||
date = new Date(message.getTimestampMillis());
|
|
||||||
received = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Sms(String phoneNumber, String text, Date date) {
|
|
||||||
this.phoneNumber = phoneNumber;
|
|
||||||
this.text = text;
|
|
||||||
this.date = date;
|
|
||||||
sent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
return "SMS from " + phoneNumber + ": " + text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Sms bolusWaitingForConfirmation = null;
|
|
||||||
Date lastRemoteBolusTime = new Date(0);
|
|
||||||
|
|
||||||
ArrayList<Sms> messages = new ArrayList<Sms>();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
@ -107,162 +52,20 @@ public class SmsCommunicatorFragment extends Fragment implements PluginBase {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
@Override
|
||||||
try {
|
public void onPause() {
|
||||||
MainApp.bus().unregister(this);
|
super.onPause();
|
||||||
} catch (RuntimeException x) {
|
MainApp.bus().unregister(this);
|
||||||
// Ignore
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
MainApp.bus().register(this);
|
MainApp.bus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.GENERAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.sResources.getString(R.string.smscommunicator);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventNewSMS ev) {
|
public void onStatusEvent(final EventSmsCommunicatorUpdateGui ev) {
|
||||||
|
|
||||||
Object[] pdus = (Object[]) ev.bundle.get("pdus");
|
|
||||||
// For every SMS message received
|
|
||||||
for (int i = 0; i < pdus.length; i++) {
|
|
||||||
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
|
|
||||||
processSms(new Sms(message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processSms(Sms receivedSms) {
|
|
||||||
if (!isEnabled(PluginBase.GENERAL)) {
|
|
||||||
log.debug("Ignoring SMS. Plugin disabled.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
String allowedNumbers = sharedPreferences.getString("smscommunicator_allowednumbers", "");
|
|
||||||
|
|
||||||
if (allowedNumbers.indexOf(receivedSms.phoneNumber) < 0) {
|
|
||||||
log.debug("Ignoring SMS from: " + receivedSms.phoneNumber + ". Sender not allowed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String reply = "";
|
|
||||||
|
|
||||||
messages.add(receivedSms);
|
|
||||||
log.debug(receivedSms.toString());
|
|
||||||
|
|
||||||
String[] splited = receivedSms.text.split("\\s+");
|
|
||||||
double amount = 0d;
|
|
||||||
String passCode = "";
|
|
||||||
|
|
||||||
if (splited.length > 0) {
|
|
||||||
switch (splited[0].toUpperCase()) {
|
|
||||||
case "RT":
|
|
||||||
Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
|
|
||||||
MainApp.getDbHelper().resetTreatments();
|
|
||||||
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
|
|
||||||
List<ResolveInfo> q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0);
|
|
||||||
reply = "RT " + q.size() + " receivers";
|
|
||||||
receivedSms.processed = true;
|
|
||||||
break;
|
|
||||||
case "RNSC":
|
|
||||||
restartNSClient = new Intent(Intents.ACTION_RESTART);
|
|
||||||
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
|
|
||||||
q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0);
|
|
||||||
reply = "RNSC " + q.size() + " receivers";
|
|
||||||
receivedSms.processed = true;
|
|
||||||
break;
|
|
||||||
case "DANAR":
|
|
||||||
DanaRFragment danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
|
||||||
if (danaRFragment != null) reply = danaRFragment.shortStatus();
|
|
||||||
receivedSms.processed = true;
|
|
||||||
break;
|
|
||||||
case "BOLUS":
|
|
||||||
if (new Date().getTime() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) {
|
|
||||||
reply = MainApp.sResources.getString(R.string.remotebolusnotallowed);
|
|
||||||
} else if (splited.length > 1) {
|
|
||||||
amount = SafeParse.stringToDouble(splited[1]);
|
|
||||||
amount = MainApp.getConfigBuilder().applyBolusConstraints(amount);
|
|
||||||
boolean remoteBolusingAllowed = sharedPreferences.getBoolean("smscommunicator_remotebolusingallowed", false);
|
|
||||||
if (amount > 0d && remoteBolusingAllowed) {
|
|
||||||
int startChar1 = 'A'; // on iphone 1st char is uppercase :)
|
|
||||||
passCode = Character.toString((char) (startChar1 + Math.random() * ('z' - 'a' + 1)));
|
|
||||||
int startChar2 = Math.random() > 0.5 ? 'a' : 'A';
|
|
||||||
passCode += Character.toString((char) (startChar2 + Math.random() * ('z' - 'a' + 1)));
|
|
||||||
int startChar3 = Math.random() > 0.5 ? 'a' : 'A';
|
|
||||||
passCode += Character.toString((char) (startChar3 + Math.random() * ('z' - 'a' + 1)));
|
|
||||||
reply = String.format(MainApp.sResources.getString(R.string.replywithcode), amount, passCode);
|
|
||||||
receivedSms.processed = true;
|
|
||||||
} else {
|
|
||||||
reply = MainApp.sResources.getString(R.string.remotebolusnotallowed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: // expect passCode here
|
|
||||||
if (bolusWaitingForConfirmation != null && !bolusWaitingForConfirmation.processed &&
|
|
||||||
bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && new Date().getTime() - bolusWaitingForConfirmation.date.getTime() < 5 * 60 * 1000L) {
|
|
||||||
bolusWaitingForConfirmation.processed = true;
|
|
||||||
PumpInterface pumpInterface = MainApp.getConfigBuilder().getActivePump();
|
|
||||||
if (pumpInterface != null) {
|
|
||||||
danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
|
||||||
PumpEnactResult result = pumpInterface.deliverTreatment(bolusWaitingForConfirmation.bolusRequested, 0, null);
|
|
||||||
if (result.success) {
|
|
||||||
reply = String.format(MainApp.sResources.getString(R.string.bolusdelivered), bolusWaitingForConfirmation.bolusRequested);
|
|
||||||
if (danaRFragment != null) reply += "\n" + danaRFragment.shortStatus();
|
|
||||||
lastRemoteBolusTime = new Date();
|
|
||||||
} else {
|
|
||||||
reply = MainApp.sResources.getString(R.string.bolusfailed);
|
|
||||||
if (danaRFragment != null) reply += "\n" + danaRFragment.shortStatus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reply.equals("")) {
|
|
||||||
SmsManager smsManager = SmsManager.getDefault();
|
|
||||||
Sms newSms = new Sms(receivedSms.phoneNumber, reply, new Date());
|
|
||||||
if (amount > 0d) {
|
|
||||||
newSms.bolusRequested = amount;
|
|
||||||
newSms.confirmCode = passCode;
|
|
||||||
bolusWaitingForConfirmation = newSms;
|
|
||||||
} else {
|
|
||||||
bolusWaitingForConfirmation = null;
|
|
||||||
newSms.processed = true;
|
|
||||||
}
|
|
||||||
smsManager.sendTextMessage(newSms.phoneNumber, null, newSms.text, null, null);
|
|
||||||
messages.add(newSms);
|
|
||||||
}
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,20 +76,20 @@ public class SmsCommunicatorFragment extends Fragment implements PluginBase {
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
class CustomComparator implements Comparator<Sms> {
|
class CustomComparator implements Comparator<SmsCommunicatorPlugin.Sms> {
|
||||||
public int compare(Sms object1, Sms object2) {
|
public int compare(SmsCommunicatorPlugin.Sms object1, SmsCommunicatorPlugin.Sms object2) {
|
||||||
return (int) (object1.date.getTime() - object2.date.getTime());
|
return (int) (object1.date.getTime() - object2.date.getTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(messages, new CustomComparator());
|
Collections.sort(smsCommunicatorPlugin.messages, new CustomComparator());
|
||||||
int messagesToShow = 40;
|
int messagesToShow = 40;
|
||||||
|
|
||||||
int start = Math.max(0, messages.size() - messagesToShow);
|
int start = Math.max(0, smsCommunicatorPlugin.messages.size() - messagesToShow);
|
||||||
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT);
|
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT);
|
||||||
|
|
||||||
String logText = "";
|
String logText = "";
|
||||||
for (int x = start; x < messages.size(); x++) {
|
for (int x = start; x < smsCommunicatorPlugin.messages.size(); x++) {
|
||||||
Sms sms = messages.get(x);
|
SmsCommunicatorPlugin.Sms sms = smsCommunicatorPlugin.messages.get(x);
|
||||||
if (sms.received) {
|
if (sms.received) {
|
||||||
logText += df.format(sms.date) + " <<< " + (sms.processed ? "● " : "○ ") + sms.phoneNumber + " <b>" + sms.text + "</b><br>";
|
logText += df.format(sms.date) + " <<< " + (sms.processed ? "● " : "○ ") + sms.phoneNumber + " <b>" + sms.text + "</b><br>";
|
||||||
} else if (sms.sent) {
|
} else if (sms.sent) {
|
||||||
|
|
|
@ -0,0 +1,236 @@
|
||||||
|
package info.nightscout.androidaps.plugins.SmsCommunicator;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.telephony.SmsManager;
|
||||||
|
import android.telephony.SmsMessage;
|
||||||
|
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Constants;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.Services.Intents;
|
||||||
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
|
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS;
|
||||||
|
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui;
|
||||||
|
import info.nightscout.utils.SafeParse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class SmsCommunicatorPlugin implements PluginBase {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(SmsCommunicatorPlugin.class);
|
||||||
|
|
||||||
|
private static boolean fragmentEnabled = false;
|
||||||
|
private static boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
public class Sms {
|
||||||
|
String phoneNumber;
|
||||||
|
String text;
|
||||||
|
Date date;
|
||||||
|
boolean received = false;
|
||||||
|
boolean sent = false;
|
||||||
|
boolean processed = false;
|
||||||
|
|
||||||
|
String confirmCode;
|
||||||
|
double bolusRequested = 0d;
|
||||||
|
|
||||||
|
public Sms(SmsMessage message) {
|
||||||
|
phoneNumber = message.getOriginatingAddress();
|
||||||
|
text = message.getMessageBody();
|
||||||
|
date = new Date(message.getTimestampMillis());
|
||||||
|
received = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sms(String phoneNumber, String text, Date date) {
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
this.text = text;
|
||||||
|
this.date = date;
|
||||||
|
sent = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "SMS from " + phoneNumber + ": " + text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Sms bolusWaitingForConfirmation = null;
|
||||||
|
Date lastRemoteBolusTime = new Date(0);
|
||||||
|
|
||||||
|
ArrayList<Sms> messages = new ArrayList<>();
|
||||||
|
|
||||||
|
public SmsCommunicatorPlugin() {
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return SmsCommunicatorFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.sResources.getString(R.string.smscommunicator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
SmsCommunicatorPlugin.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
SmsCommunicatorPlugin.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventNewSMS ev) {
|
||||||
|
|
||||||
|
Object[] pdus = (Object[]) ev.bundle.get("pdus");
|
||||||
|
// For every SMS message received
|
||||||
|
for (int i = 0; i < pdus.length; i++) {
|
||||||
|
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
|
||||||
|
processSms(new Sms(message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processSms(Sms receivedSms) {
|
||||||
|
if (!isEnabled(PluginBase.GENERAL)) {
|
||||||
|
log.debug("Ignoring SMS. Plugin disabled.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
String allowedNumbers = sharedPreferences.getString("smscommunicator_allowednumbers", "");
|
||||||
|
|
||||||
|
if (!allowedNumbers.contains(receivedSms.phoneNumber)) {
|
||||||
|
log.debug("Ignoring SMS from: " + receivedSms.phoneNumber + ". Sender not allowed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String reply = "";
|
||||||
|
|
||||||
|
messages.add(receivedSms);
|
||||||
|
log.debug(receivedSms.toString());
|
||||||
|
|
||||||
|
String[] splited = receivedSms.text.split("\\s+");
|
||||||
|
double amount = 0d;
|
||||||
|
String passCode = "";
|
||||||
|
|
||||||
|
if (splited.length > 0) {
|
||||||
|
switch (splited[0].toUpperCase()) {
|
||||||
|
case "RT":
|
||||||
|
Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
|
||||||
|
MainApp.getDbHelper().resetTreatments();
|
||||||
|
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
|
||||||
|
List<ResolveInfo> q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0);
|
||||||
|
reply = "RT " + q.size() + " receivers";
|
||||||
|
receivedSms.processed = true;
|
||||||
|
break;
|
||||||
|
case "RNSC":
|
||||||
|
restartNSClient = new Intent(Intents.ACTION_RESTART);
|
||||||
|
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
|
||||||
|
q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0);
|
||||||
|
reply = "RNSC " + q.size() + " receivers";
|
||||||
|
receivedSms.processed = true;
|
||||||
|
break;
|
||||||
|
case "DANAR":
|
||||||
|
DanaRPlugin danaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||||
|
if (danaRPlugin != null) reply = danaRPlugin.shortStatus();
|
||||||
|
receivedSms.processed = true;
|
||||||
|
break;
|
||||||
|
case "BOLUS":
|
||||||
|
if (new Date().getTime() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) {
|
||||||
|
reply = MainApp.sResources.getString(R.string.remotebolusnotallowed);
|
||||||
|
} else if (splited.length > 1) {
|
||||||
|
amount = SafeParse.stringToDouble(splited[1]);
|
||||||
|
amount = MainApp.getConfigBuilder().applyBolusConstraints(amount);
|
||||||
|
boolean remoteBolusingAllowed = sharedPreferences.getBoolean("smscommunicator_remotebolusingallowed", false);
|
||||||
|
if (amount > 0d && remoteBolusingAllowed) {
|
||||||
|
int startChar1 = 'A'; // on iphone 1st char is uppercase :)
|
||||||
|
passCode = Character.toString((char) (startChar1 + Math.random() * ('z' - 'a' + 1)));
|
||||||
|
int startChar2 = Math.random() > 0.5 ? 'a' : 'A';
|
||||||
|
passCode += Character.toString((char) (startChar2 + Math.random() * ('z' - 'a' + 1)));
|
||||||
|
int startChar3 = Math.random() > 0.5 ? 'a' : 'A';
|
||||||
|
passCode += Character.toString((char) (startChar3 + Math.random() * ('z' - 'a' + 1)));
|
||||||
|
reply = String.format(MainApp.sResources.getString(R.string.replywithcode), amount, passCode);
|
||||||
|
receivedSms.processed = true;
|
||||||
|
} else {
|
||||||
|
reply = MainApp.sResources.getString(R.string.remotebolusnotallowed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: // expect passCode here
|
||||||
|
if (bolusWaitingForConfirmation != null && !bolusWaitingForConfirmation.processed &&
|
||||||
|
bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && new Date().getTime() - bolusWaitingForConfirmation.date.getTime() < 5 * 60 * 1000L) {
|
||||||
|
bolusWaitingForConfirmation.processed = true;
|
||||||
|
PumpInterface pumpInterface = MainApp.getConfigBuilder();
|
||||||
|
if (pumpInterface != null) {
|
||||||
|
danaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRFragment.class);
|
||||||
|
PumpEnactResult result = pumpInterface.deliverTreatment(bolusWaitingForConfirmation.bolusRequested, 0, null);
|
||||||
|
if (result.success) {
|
||||||
|
reply = String.format(MainApp.sResources.getString(R.string.bolusdelivered), bolusWaitingForConfirmation.bolusRequested);
|
||||||
|
if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus();
|
||||||
|
lastRemoteBolusTime = new Date();
|
||||||
|
} else {
|
||||||
|
reply = MainApp.sResources.getString(R.string.bolusfailed);
|
||||||
|
if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!reply.equals("")) {
|
||||||
|
SmsManager smsManager = SmsManager.getDefault();
|
||||||
|
Sms newSms = new Sms(receivedSms.phoneNumber, reply, new Date());
|
||||||
|
if (amount > 0d) {
|
||||||
|
newSms.bolusRequested = amount;
|
||||||
|
newSms.confirmCode = passCode;
|
||||||
|
bolusWaitingForConfirmation = newSms;
|
||||||
|
} else {
|
||||||
|
bolusWaitingForConfirmation = null;
|
||||||
|
newSms.processed = true;
|
||||||
|
}
|
||||||
|
smsManager.sendTextMessage(newSms.phoneNumber, null, newSms.text, null, null);
|
||||||
|
messages.add(newSms);
|
||||||
|
}
|
||||||
|
MainApp.bus().post(new EventSmsCommunicatorUpdateGui());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.SmsCommunicator.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventSmsCommunicatorUpdateGui {
|
||||||
|
}
|
|
@ -1,63 +1,16 @@
|
||||||
package info.nightscout.androidaps.plugins.SourceNSClient;
|
package info.nightscout.androidaps.plugins.SourceNSClient;
|
||||||
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
|
|
||||||
public class SourceNSClientFragment extends Fragment implements PluginBase, BgSourceInterface {
|
public class SourceNSClientFragment extends Fragment implements FragmentBase {
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
private static SourceNSClientPlugin sourceNSClientPlugin = new SourceNSClientPlugin();
|
||||||
|
|
||||||
public SourceNSClientFragment() {
|
public static SourceNSClientPlugin getPlugin() {
|
||||||
}
|
return sourceNSClientPlugin;
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.BGSOURCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.nsclient);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SourceNSClientFragment newInstance() {
|
|
||||||
SourceNSClientFragment fragment = new SourceNSClientFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package info.nightscout.androidaps.plugins.SourceNSClient;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class SourceNSClientPlugin implements PluginBase, BgSourceInterface {
|
||||||
|
boolean fragmentEnabled = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return SourceNSClientFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.BGSOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.nsclient);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,62 +1,15 @@
|
||||||
package info.nightscout.androidaps.plugins.SourceXdrip;
|
package info.nightscout.androidaps.plugins.SourceXdrip;
|
||||||
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
|
|
||||||
public class SourceXdripFragment extends Fragment implements PluginBase, BgSourceInterface {
|
public class SourceXdripFragment extends Fragment implements FragmentBase {
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
private static SourceXdripPlugin sourceXdripPlugin = new SourceXdripPlugin();
|
||||||
|
|
||||||
public SourceXdripFragment() {
|
public static SourceXdripPlugin getPlugin() {
|
||||||
}
|
return sourceXdripPlugin;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.BGSOURCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.xdrip);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SourceXdripFragment newInstance() {
|
|
||||||
SourceXdripFragment fragment = new SourceXdripFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
package info.nightscout.androidaps.plugins.SourceXdrip;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class SourceXdripPlugin implements PluginBase, BgSourceInterface {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return SourceNSClientFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean fragmentEnabled = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.BGSOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.xdrip);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
SourceXdripPlugin.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,10 +1,7 @@
|
||||||
package info.nightscout.androidaps.plugins.TempBasals;
|
package info.nightscout.androidaps.plugins.TempBasals;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v7.widget.CardView;
|
import android.support.v7.widget.CardView;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
@ -15,233 +12,38 @@ import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.j256.ormlite.dao.Dao;
|
|
||||||
import com.j256.ormlite.stmt.PreparedQuery;
|
|
||||||
import com.j256.ormlite.stmt.QueryBuilder;
|
|
||||||
import com.j256.ormlite.stmt.Where;
|
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
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.db.TempBasal;
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.TempBasalsInterface;
|
|
||||||
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
|
import info.nightscout.androidaps.plugins.TempBasals.events.EventTempBasalsUpdateGui;
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
|
|
||||||
|
|
||||||
public class TempBasalsFragment extends Fragment implements PluginBase, TempBasalsInterface {
|
public class TempBasalsFragment extends Fragment implements FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(TempBasalsFragment.class);
|
private static Logger log = LoggerFactory.getLogger(TempBasalsFragment.class);
|
||||||
|
|
||||||
|
private static TempBasalsPlugin tempBasalsPlugin = new TempBasalsPlugin();
|
||||||
|
|
||||||
|
public static TempBasalsPlugin getPlugin() {
|
||||||
|
return tempBasalsPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
LinearLayoutManager llm;
|
LinearLayoutManager llm;
|
||||||
|
|
||||||
TextView tempBasalTotalView;
|
TextView tempBasalTotalView;
|
||||||
|
|
||||||
public long lastCalculationTimestamp = 0;
|
|
||||||
public IobTotal lastCalculation;
|
|
||||||
|
|
||||||
private List<TempBasal> tempBasals;
|
|
||||||
private List<TempBasal> extendedBoluses;
|
|
||||||
|
|
||||||
private boolean useExtendedBoluses = false;
|
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
boolean visibleNow = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.tempbasals);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.TEMPBASAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeData() {
|
|
||||||
try {
|
|
||||||
Dao<TempBasal, Long> dao = MainApp.getDbHelper().getDaoTempBasals();
|
|
||||||
/*
|
|
||||||
// **************** TESTING CREATE FAKE RECORD *****************
|
|
||||||
TempBasal fake = new TempBasal();
|
|
||||||
fake.timeStart = new Date(new Date().getTime() - 45 * 40 * 1000);
|
|
||||||
fake.timeEnd = new Date(new Date().getTime() - new Double(Math.random() * 45d * 40 * 1000).longValue());
|
|
||||||
fake.duration = 30;
|
|
||||||
fake.percent = 150;
|
|
||||||
fake.isAbsolute = false;
|
|
||||||
fake.isExtended = false;
|
|
||||||
dao.createOrUpdate(fake);
|
|
||||||
// **************** TESTING CREATE FAKE RECORD *****************
|
|
||||||
*/
|
|
||||||
QueryBuilder<TempBasal, Long> queryBuilder = dao.queryBuilder();
|
|
||||||
queryBuilder.orderBy("timeIndex", false);
|
|
||||||
Where where = queryBuilder.where();
|
|
||||||
where.eq("isExtended", false);
|
|
||||||
queryBuilder.limit(30L);
|
|
||||||
PreparedQuery<TempBasal> preparedQuery = queryBuilder.prepare();
|
|
||||||
tempBasals = dao.query(preparedQuery);
|
|
||||||
|
|
||||||
QueryBuilder<TempBasal, Long> queryBuilderExt = dao.queryBuilder();
|
|
||||||
queryBuilderExt.orderBy("timeIndex", false);
|
|
||||||
Where whereExt = queryBuilderExt.where();
|
|
||||||
whereExt.eq("isExtended", true);
|
|
||||||
queryBuilderExt.limit(5L);
|
|
||||||
PreparedQuery<TempBasal> preparedQueryExt = queryBuilderExt.prepare();
|
|
||||||
extendedBoluses = dao.query(preparedQueryExt);
|
|
||||||
|
|
||||||
// Update ended
|
|
||||||
checkForExpiredExtended();
|
|
||||||
checkForExpiredTemps();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
log.debug(e.getMessage(), e);
|
|
||||||
tempBasals = new ArrayList<TempBasal>();
|
|
||||||
extendedBoluses = new ArrayList<TempBasal>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkForExpiredTemps() {
|
|
||||||
checkForExpired(tempBasals);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkForExpiredExtended() {
|
|
||||||
checkForExpired(extendedBoluses);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkForExpired(List<TempBasal> list) {
|
|
||||||
long now = new Date().getTime();
|
|
||||||
for (int position = list.size() - 1; position >= 0; position--) {
|
|
||||||
TempBasal t = list.get(position);
|
|
||||||
boolean update = false;
|
|
||||||
if (t.timeEnd == null && t.getPlannedTimeEnd().getTime() < now) {
|
|
||||||
t.timeEnd = new Date(t.getPlannedTimeEnd().getTime());
|
|
||||||
if (Config.logTempBasalsCut)
|
|
||||||
log.debug("Add timeEnd to old record");
|
|
||||||
update = true;
|
|
||||||
}
|
|
||||||
if (position > 0) {
|
|
||||||
Date startofnewer = list.get(position - 1).timeStart;
|
|
||||||
if (t.timeEnd == null) {
|
|
||||||
t.timeEnd = new Date(Math.min(startofnewer.getTime(), t.getPlannedTimeEnd().getTime()));
|
|
||||||
if (Config.logTempBasalsCut)
|
|
||||||
log.debug("Add timeEnd to old record");
|
|
||||||
update = true;
|
|
||||||
} else if (t.timeEnd.getTime() > startofnewer.getTime()) {
|
|
||||||
t.timeEnd = startofnewer;
|
|
||||||
update = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (update) {
|
|
||||||
try {
|
|
||||||
Dao<TempBasal, Long> dao = MainApp.getDbHelper().getDaoTempBasals();
|
|
||||||
dao.update(t);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
if (Config.logTempBasalsCut) {
|
|
||||||
log.debug("Fixing unfinished temp end: " + t.log());
|
|
||||||
if (position > 0)
|
|
||||||
log.debug("Previous: " + list.get(position - 1).log());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Recalculate IOB if value is older than 1 minute
|
|
||||||
*/
|
|
||||||
public void updateTotalIOBIfNeeded() {
|
|
||||||
if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
|
|
||||||
return;
|
|
||||||
updateTotalIOB();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IobTotal getLastCalculation() {
|
|
||||||
return lastCalculation;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTotalIOB() {
|
|
||||||
checkForExpired(tempBasals);
|
|
||||||
checkForExpired(extendedBoluses);
|
|
||||||
Date now = new Date();
|
|
||||||
IobTotal total = new IobTotal();
|
|
||||||
for (Integer pos = 0; pos < tempBasals.size(); pos++) {
|
|
||||||
TempBasal t = tempBasals.get(pos);
|
|
||||||
IobTotal calc = t.iobCalc(now);
|
|
||||||
total.plus(calc);
|
|
||||||
}
|
|
||||||
if (useExtendedBoluses) {
|
|
||||||
for (Integer pos = 0; pos < extendedBoluses.size(); pos++) {
|
|
||||||
TempBasal t = extendedBoluses.get(pos);
|
|
||||||
IobTotal calc = t.iobCalc(now);
|
|
||||||
total.plus(calc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastCalculationTimestamp = new Date().getTime();
|
|
||||||
lastCalculation = total;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal(Date time) {
|
|
||||||
checkForExpired(tempBasals);
|
|
||||||
for (TempBasal t : tempBasals) {
|
|
||||||
if (t.isInProgress(time)) return t;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getExtendedBolus(Date time) {
|
|
||||||
checkForExpired(extendedBoluses);
|
|
||||||
for (TempBasal t : extendedBoluses) {
|
|
||||||
if (t.isInProgress(time)) return t;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.TempBasalsViewHolder> {
|
public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.TempBasalsViewHolder> {
|
||||||
|
|
||||||
List<TempBasal> tempBasalList;
|
List<TempBasal> tempBasalList;
|
||||||
|
@ -331,25 +133,6 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TempBasalsFragment() {
|
|
||||||
super();
|
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
|
||||||
registerBus();
|
|
||||||
initializeData();
|
|
||||||
updateGUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TempBasalsFragment newInstance() {
|
|
||||||
TempBasalsFragment fragment = new TempBasalsFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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) {
|
||||||
|
@ -360,7 +143,7 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
|
||||||
llm = new LinearLayoutManager(view.getContext());
|
llm = new LinearLayoutManager(view.getContext());
|
||||||
recyclerView.setLayoutManager(llm);
|
recyclerView.setLayoutManager(llm);
|
||||||
|
|
||||||
RecyclerViewAdapter adapter = new RecyclerViewAdapter(getMergedList());
|
RecyclerViewAdapter adapter = new RecyclerViewAdapter(tempBasalsPlugin.getMergedList());
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
tempBasalTotalView = (TextView) view.findViewById(R.id.tempbasals_totaltempiob);
|
tempBasalTotalView = (TextView) view.findViewById(R.id.tempbasals_totaltempiob);
|
||||||
|
@ -368,70 +151,37 @@ public class TempBasalsFragment extends Fragment implements PluginBase, TempBasa
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
@Override
|
||||||
try {
|
public void onPause() {
|
||||||
MainApp.bus().unregister(this);
|
super.onPause();
|
||||||
} catch (RuntimeException x) {
|
MainApp.bus().unregister(this);
|
||||||
// Ignore
|
|
||||||
}
|
|
||||||
MainApp.bus().register(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TempBasal> getMergedList() {
|
@Override
|
||||||
if (useExtendedBoluses) {
|
public void onResume() {
|
||||||
List<TempBasal> merged = new ArrayList<TempBasal>();
|
super.onResume();
|
||||||
merged.addAll(tempBasals);
|
MainApp.bus().register(this);
|
||||||
merged.addAll(extendedBoluses);
|
|
||||||
|
|
||||||
class CustomComparator implements Comparator<TempBasal> {
|
|
||||||
public int compare(TempBasal object1, TempBasal object2) {
|
|
||||||
return (int) (object2.timeIndex - object1.timeIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Collections.sort(merged, new CustomComparator());
|
|
||||||
return merged;
|
|
||||||
} else {
|
|
||||||
return tempBasals;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventTempBasalChange ev) {
|
public void onStatusEvent(final EventTempBasalsUpdateGui s) {
|
||||||
initializeData();
|
updateGUI();
|
||||||
}
|
|
||||||
|
|
||||||
public void onStatusEvent(final EventPreferenceChange s) {
|
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
|
||||||
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
|
||||||
initializeData();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateGUI() {
|
public void updateGUI() {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (visibleNow && activity != null && recyclerView != null)
|
if (activity != null && recyclerView != null)
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
recyclerView.swapAdapter(new RecyclerViewAdapter(getMergedList()), false);
|
recyclerView.swapAdapter(new RecyclerViewAdapter(tempBasalsPlugin.getMergedList()), false);
|
||||||
if (lastCalculation != null) {
|
if (tempBasalsPlugin.lastCalculation != null) {
|
||||||
String totalText = DecimalFormatter.to2Decimal(lastCalculation.basaliob) + " U";
|
String totalText = DecimalFormatter.to2Decimal(tempBasalsPlugin.lastCalculation.basaliob) + " U";
|
||||||
tempBasalTotalView.setText(totalText);
|
tempBasalTotalView.setText(totalText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
|
||||||
super.setUserVisibleHint(isVisibleToUser);
|
|
||||||
|
|
||||||
if (isVisibleToUser) {
|
|
||||||
visibleNow = true;
|
|
||||||
updateTotalIOBIfNeeded();
|
|
||||||
updateGUI();
|
|
||||||
} else
|
|
||||||
visibleNow = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,271 @@
|
||||||
|
package info.nightscout.androidaps.plugins.TempBasals;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.j256.ormlite.dao.Dao;
|
||||||
|
import com.j256.ormlite.stmt.PreparedQuery;
|
||||||
|
import com.j256.ormlite.stmt.QueryBuilder;
|
||||||
|
import com.j256.ormlite.stmt.Where;
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
|
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
|
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.TempBasalsInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
|
import info.nightscout.androidaps.plugins.TempBasals.events.EventTempBasalsUpdateGui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class TempBasalsPlugin implements PluginBase, TempBasalsInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(TempBasalsPlugin.class);
|
||||||
|
|
||||||
|
public static long lastCalculationTimestamp = 0;
|
||||||
|
public static IobTotal lastCalculation;
|
||||||
|
|
||||||
|
private static List<TempBasal> tempBasals;
|
||||||
|
private static List<TempBasal> extendedBoluses;
|
||||||
|
|
||||||
|
private static boolean useExtendedBoluses = false;
|
||||||
|
|
||||||
|
private static boolean fragmentEnabled = true;
|
||||||
|
private static boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
public TempBasalsPlugin() {
|
||||||
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
||||||
|
initializeData();
|
||||||
|
MainApp.bus().post(new EventTempBasalsUpdateGui());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return TempBasalsFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.tempbasals);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.TEMPBASAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeData() {
|
||||||
|
try {
|
||||||
|
Dao<TempBasal, Long> dao = MainApp.getDbHelper().getDaoTempBasals();
|
||||||
|
/*
|
||||||
|
// **************** TESTING CREATE FAKE RECORD *****************
|
||||||
|
TempBasal fake = new TempBasal();
|
||||||
|
fake.timeStart = new Date(new Date().getTime() - 45 * 40 * 1000);
|
||||||
|
fake.timeEnd = new Date(new Date().getTime() - new Double(Math.random() * 45d * 40 * 1000).longValue());
|
||||||
|
fake.duration = 30;
|
||||||
|
fake.percent = 150;
|
||||||
|
fake.isAbsolute = false;
|
||||||
|
fake.isExtended = false;
|
||||||
|
dao.createOrUpdate(fake);
|
||||||
|
// **************** TESTING CREATE FAKE RECORD *****************
|
||||||
|
*/
|
||||||
|
QueryBuilder<TempBasal, Long> queryBuilder = dao.queryBuilder();
|
||||||
|
queryBuilder.orderBy("timeIndex", false);
|
||||||
|
Where where = queryBuilder.where();
|
||||||
|
where.eq("isExtended", false);
|
||||||
|
queryBuilder.limit(30L);
|
||||||
|
PreparedQuery<TempBasal> preparedQuery = queryBuilder.prepare();
|
||||||
|
tempBasals = dao.query(preparedQuery);
|
||||||
|
|
||||||
|
QueryBuilder<TempBasal, Long> queryBuilderExt = dao.queryBuilder();
|
||||||
|
queryBuilderExt.orderBy("timeIndex", false);
|
||||||
|
Where whereExt = queryBuilderExt.where();
|
||||||
|
whereExt.eq("isExtended", true);
|
||||||
|
queryBuilderExt.limit(5L);
|
||||||
|
PreparedQuery<TempBasal> preparedQueryExt = queryBuilderExt.prepare();
|
||||||
|
extendedBoluses = dao.query(preparedQueryExt);
|
||||||
|
|
||||||
|
// Update ended
|
||||||
|
checkForExpiredExtended();
|
||||||
|
checkForExpiredTemps();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
log.debug(e.getMessage(), e);
|
||||||
|
tempBasals = new ArrayList<TempBasal>();
|
||||||
|
extendedBoluses = new ArrayList<TempBasal>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkForExpiredTemps() {
|
||||||
|
checkForExpired(tempBasals);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkForExpiredExtended() {
|
||||||
|
checkForExpired(extendedBoluses);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkForExpired(List<TempBasal> list) {
|
||||||
|
long now = new Date().getTime();
|
||||||
|
for (int position = list.size() - 1; position >= 0; position--) {
|
||||||
|
TempBasal t = list.get(position);
|
||||||
|
boolean update = false;
|
||||||
|
if (t.timeEnd == null && t.getPlannedTimeEnd().getTime() < now) {
|
||||||
|
t.timeEnd = new Date(t.getPlannedTimeEnd().getTime());
|
||||||
|
if (Config.logTempBasalsCut)
|
||||||
|
log.debug("Add timeEnd to old record");
|
||||||
|
update = true;
|
||||||
|
}
|
||||||
|
if (position > 0) {
|
||||||
|
Date startofnewer = list.get(position - 1).timeStart;
|
||||||
|
if (t.timeEnd == null) {
|
||||||
|
t.timeEnd = new Date(Math.min(startofnewer.getTime(), t.getPlannedTimeEnd().getTime()));
|
||||||
|
if (Config.logTempBasalsCut)
|
||||||
|
log.debug("Add timeEnd to old record");
|
||||||
|
update = true;
|
||||||
|
} else if (t.timeEnd.getTime() > startofnewer.getTime()) {
|
||||||
|
t.timeEnd = startofnewer;
|
||||||
|
update = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (update) {
|
||||||
|
try {
|
||||||
|
Dao<TempBasal, Long> dao = MainApp.getDbHelper().getDaoTempBasals();
|
||||||
|
dao.update(t);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (Config.logTempBasalsCut) {
|
||||||
|
log.debug("Fixing unfinished temp end: " + t.log());
|
||||||
|
if (position > 0)
|
||||||
|
log.debug("Previous: " + list.get(position - 1).log());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Recalculate IOB if value is older than 1 minute
|
||||||
|
*/
|
||||||
|
public void updateTotalIOBIfNeeded() {
|
||||||
|
if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
|
||||||
|
return;
|
||||||
|
updateTotalIOB();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IobTotal getLastCalculation() {
|
||||||
|
return lastCalculation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTotalIOB() {
|
||||||
|
checkForExpired(tempBasals);
|
||||||
|
checkForExpired(extendedBoluses);
|
||||||
|
Date now = new Date();
|
||||||
|
IobTotal total = new IobTotal();
|
||||||
|
for (Integer pos = 0; pos < tempBasals.size(); pos++) {
|
||||||
|
TempBasal t = tempBasals.get(pos);
|
||||||
|
IobTotal calc = t.iobCalc(now);
|
||||||
|
total.plus(calc);
|
||||||
|
}
|
||||||
|
if (useExtendedBoluses) {
|
||||||
|
for (Integer pos = 0; pos < extendedBoluses.size(); pos++) {
|
||||||
|
TempBasal t = extendedBoluses.get(pos);
|
||||||
|
IobTotal calc = t.iobCalc(now);
|
||||||
|
total.plus(calc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastCalculationTimestamp = new Date().getTime();
|
||||||
|
lastCalculation = total;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal(Date time) {
|
||||||
|
checkForExpired(tempBasals);
|
||||||
|
for (TempBasal t : tempBasals) {
|
||||||
|
if (t.isInProgress(time)) return t;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getExtendedBolus(Date time) {
|
||||||
|
checkForExpired(extendedBoluses);
|
||||||
|
for (TempBasal t : extendedBoluses) {
|
||||||
|
if (t.isInProgress(time)) return t;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<TempBasal> getMergedList() {
|
||||||
|
if (useExtendedBoluses) {
|
||||||
|
List<TempBasal> merged = new ArrayList<TempBasal>();
|
||||||
|
merged.addAll(tempBasals);
|
||||||
|
merged.addAll(extendedBoluses);
|
||||||
|
|
||||||
|
class CustomComparator implements Comparator<TempBasal> {
|
||||||
|
public int compare(TempBasal object1, TempBasal object2) {
|
||||||
|
return (int) (object2.timeIndex - object1.timeIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.sort(merged, new CustomComparator());
|
||||||
|
return merged;
|
||||||
|
} else {
|
||||||
|
return tempBasals;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventTempBasalChange ev) {
|
||||||
|
initializeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStatusEvent(final EventPreferenceChange s) {
|
||||||
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
|
||||||
|
useExtendedBoluses = sharedPreferences.getBoolean("danar_useextended", false);
|
||||||
|
initializeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.TempBasals.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventTempBasalsUpdateGui {
|
||||||
|
}
|
|
@ -36,15 +36,25 @@ import info.nightscout.androidaps.Services.Intents;
|
||||||
import info.nightscout.androidaps.data.Iob;
|
import info.nightscout.androidaps.data.Iob;
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
import info.nightscout.androidaps.events.EventTreatmentChange;
|
import info.nightscout.androidaps.events.EventTreatmentChange;
|
||||||
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRNewStatus;
|
||||||
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
|
import info.nightscout.androidaps.plugins.Treatments.events.EventTreatmentsUpdateGui;
|
||||||
import info.nightscout.client.data.NSProfile;
|
import info.nightscout.client.data.NSProfile;
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
|
|
||||||
public class TreatmentsFragment extends Fragment implements View.OnClickListener, PluginBase, TreatmentsInterface {
|
public class TreatmentsFragment extends Fragment implements View.OnClickListener, FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class);
|
private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class);
|
||||||
|
|
||||||
|
private static TreatmentsPlugin treatmentsPlugin = new TreatmentsPlugin();
|
||||||
|
|
||||||
|
public static TreatmentsPlugin getPlugin() {
|
||||||
|
return treatmentsPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
LinearLayoutManager llm;
|
LinearLayoutManager llm;
|
||||||
|
|
||||||
|
@ -52,140 +62,6 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
|
||||||
TextView activityTotal;
|
TextView activityTotal;
|
||||||
Button refreshFromNS;
|
Button refreshFromNS;
|
||||||
|
|
||||||
private long lastCalculationTimestamp = 0;
|
|
||||||
private IobTotal lastCalculation;
|
|
||||||
|
|
||||||
private List<Treatment> treatments;
|
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
boolean visibleNow = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.treatments);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.TREATMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeData() {
|
|
||||||
try {
|
|
||||||
Dao<Treatment, Long> dao = MainApp.getDbHelper().getDaoTreatments();
|
|
||||||
QueryBuilder<Treatment, Long> queryBuilder = dao.queryBuilder();
|
|
||||||
queryBuilder.orderBy("timeIndex", false);
|
|
||||||
queryBuilder.limit(30l);
|
|
||||||
PreparedQuery<Treatment> preparedQuery = queryBuilder.prepare();
|
|
||||||
treatments = dao.query(preparedQuery);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
log.debug(e.getMessage(), e);
|
|
||||||
treatments = new ArrayList<Treatment>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Recalculate IOB if value is older than 1 minute
|
|
||||||
*/
|
|
||||||
public void updateTotalIOBIfNeeded() {
|
|
||||||
if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
|
|
||||||
return;
|
|
||||||
updateTotalIOB();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IobTotal getLastCalculation() {
|
|
||||||
return lastCalculation;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTotalIOB() {
|
|
||||||
IobTotal total = new IobTotal();
|
|
||||||
|
|
||||||
if (MainApp.getConfigBuilder() == null || MainApp.getConfigBuilder().getActiveProfile() == null) // app not initialized yet
|
|
||||||
return;
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
if (profile == null) {
|
|
||||||
lastCalculation = total;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Double dia = profile.getDia();
|
|
||||||
|
|
||||||
Date now = new Date();
|
|
||||||
for (Integer pos = 0; pos < treatments.size(); pos++) {
|
|
||||||
Treatment t = treatments.get(pos);
|
|
||||||
Iob tIOB = t.iobCalc(now, dia);
|
|
||||||
total.iob += tIOB.iobContrib;
|
|
||||||
total.activity += tIOB.activityContrib;
|
|
||||||
Iob bIOB = t.iobCalc(now, dia / 2);
|
|
||||||
total.bolussnooze += bIOB.iobContrib;
|
|
||||||
}
|
|
||||||
|
|
||||||
lastCalculationTimestamp = new Date().getTime();
|
|
||||||
lastCalculation = total;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MealData {
|
|
||||||
public double boluses = 0d;
|
|
||||||
public double carbs = 0d;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MealData getMealData() {
|
|
||||||
MealData result = new MealData();
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
if (profile == null)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
for (Treatment treatment : treatments) {
|
|
||||||
long now = new Date().getTime();
|
|
||||||
long dia_ago = now - (new Double(profile.getDia() * 60 * 60 * 1000l)).longValue();
|
|
||||||
long t = treatment.created_at.getTime();
|
|
||||||
if (t > dia_ago && t <= now) {
|
|
||||||
if (treatment.carbs >= 1) {
|
|
||||||
result.carbs += treatment.carbs;
|
|
||||||
}
|
|
||||||
if (treatment.insulin >= 0.1) {
|
|
||||||
result.boluses += treatment.insulin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Treatment> getTreatments() {
|
|
||||||
return treatments;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.TreatmentsViewHolder> {
|
public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.TreatmentsViewHolder> {
|
||||||
|
|
||||||
List<Treatment> treatments;
|
List<Treatment> treatments;
|
||||||
|
@ -253,23 +129,6 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TreatmentsFragment() {
|
|
||||||
super();
|
|
||||||
registerBus();
|
|
||||||
initializeData();
|
|
||||||
updateGUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TreatmentsFragment newInstance() {
|
|
||||||
TreatmentsFragment fragment = new TreatmentsFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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) {
|
||||||
|
@ -280,7 +139,7 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
|
||||||
llm = new LinearLayoutManager(view.getContext());
|
llm = new LinearLayoutManager(view.getContext());
|
||||||
recyclerView.setLayoutManager(llm);
|
recyclerView.setLayoutManager(llm);
|
||||||
|
|
||||||
RecyclerViewAdapter adapter = new RecyclerViewAdapter(treatments);
|
RecyclerViewAdapter adapter = new RecyclerViewAdapter(TreatmentsPlugin.treatments);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
iobTotal = (TextView) view.findViewById(R.id.treatments_iobtotal);
|
iobTotal = (TextView) view.findViewById(R.id.treatments_iobtotal);
|
||||||
|
@ -303,7 +162,7 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
|
||||||
builder.setPositiveButton(this.getContext().getString(R.string.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();
|
treatmentsPlugin.initializeData();
|
||||||
updateGUI();
|
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);
|
||||||
|
@ -316,45 +175,41 @@ public class TreatmentsFragment extends Fragment implements View.OnClickListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBus() {
|
@Override
|
||||||
try {
|
public void onPause() {
|
||||||
MainApp.bus().unregister(this);
|
super.onPause();
|
||||||
} catch (RuntimeException x) {
|
MainApp.bus().unregister(this);
|
||||||
// Ignore
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
MainApp.bus().register(this);
|
MainApp.bus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onStatusEvent(final EventTreatmentsUpdateGui ev) {
|
||||||
|
updateGUI();
|
||||||
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onStatusEvent(final EventTreatmentChange ev) {
|
public void onStatusEvent(final EventTreatmentChange ev) {
|
||||||
initializeData();
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateGUI() {
|
public void updateGUI() {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (visibleNow && activity != null && recyclerView != null)
|
if (activity != null && recyclerView != null)
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
recyclerView.swapAdapter(new RecyclerViewAdapter(treatments), false);
|
recyclerView.swapAdapter(new RecyclerViewAdapter(TreatmentsPlugin.treatments), false);
|
||||||
if (lastCalculation != null)
|
if (TreatmentsPlugin.lastCalculation != null)
|
||||||
iobTotal.setText(DecimalFormatter.to2Decimal(lastCalculation.iob) + " U");
|
iobTotal.setText(DecimalFormatter.to2Decimal(TreatmentsPlugin.lastCalculation.iob) + " U");
|
||||||
if (lastCalculation != null)
|
if (TreatmentsPlugin.lastCalculation != null)
|
||||||
activityTotal.setText(DecimalFormatter.to3Decimal(lastCalculation.activity) + " U");
|
activityTotal.setText(DecimalFormatter.to3Decimal(TreatmentsPlugin.lastCalculation.activity) + " U");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
|
||||||
super.setUserVisibleHint(isVisibleToUser);
|
|
||||||
|
|
||||||
if (isVisibleToUser) {
|
|
||||||
visibleNow = true;
|
|
||||||
updateTotalIOBIfNeeded();
|
|
||||||
updateGUI();
|
|
||||||
} else
|
|
||||||
visibleNow = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,175 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Treatments;
|
||||||
|
|
||||||
|
import com.j256.ormlite.dao.Dao;
|
||||||
|
import com.j256.ormlite.stmt.PreparedQuery;
|
||||||
|
import com.j256.ormlite.stmt.QueryBuilder;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.data.Iob;
|
||||||
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
|
||||||
|
import info.nightscout.androidaps.plugins.Treatments.events.EventTreatmentsUpdateGui;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class TreatmentsPlugin implements PluginBase, TreatmentsInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(TreatmentsPlugin.class);
|
||||||
|
|
||||||
|
public static long lastCalculationTimestamp = 0;
|
||||||
|
public static IobTotal lastCalculation;
|
||||||
|
|
||||||
|
public static List<Treatment> treatments;
|
||||||
|
|
||||||
|
private static boolean fragmentEnabled = true;
|
||||||
|
private static boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return TreatmentsFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.treatments);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.TREATMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TreatmentsPlugin() {
|
||||||
|
MainApp.bus().register(this);
|
||||||
|
initializeData();
|
||||||
|
MainApp.bus().post(new EventTreatmentsUpdateGui());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeData() {
|
||||||
|
try {
|
||||||
|
Dao<Treatment, Long> dao = MainApp.getDbHelper().getDaoTreatments();
|
||||||
|
QueryBuilder<Treatment, Long> queryBuilder = dao.queryBuilder();
|
||||||
|
queryBuilder.orderBy("timeIndex", false);
|
||||||
|
queryBuilder.limit(30l);
|
||||||
|
PreparedQuery<Treatment> preparedQuery = queryBuilder.prepare();
|
||||||
|
treatments = dao.query(preparedQuery);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
log.debug(e.getMessage(), e);
|
||||||
|
treatments = new ArrayList<Treatment>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Recalculate IOB if value is older than 1 minute
|
||||||
|
*/
|
||||||
|
public void updateTotalIOBIfNeeded() {
|
||||||
|
if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
|
||||||
|
return;
|
||||||
|
updateTotalIOB();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IobTotal getLastCalculation() {
|
||||||
|
return lastCalculation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTotalIOB() {
|
||||||
|
IobTotal total = new IobTotal();
|
||||||
|
|
||||||
|
if (MainApp.getConfigBuilder() == null || MainApp.getConfigBuilder().getActiveProfile() == null) // app not initialized yet
|
||||||
|
return;
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
if (profile == null) {
|
||||||
|
lastCalculation = total;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Double dia = profile.getDia();
|
||||||
|
|
||||||
|
Date now = new Date();
|
||||||
|
for (Integer pos = 0; pos < treatments.size(); pos++) {
|
||||||
|
Treatment t = treatments.get(pos);
|
||||||
|
Iob tIOB = t.iobCalc(now, dia);
|
||||||
|
total.iob += tIOB.iobContrib;
|
||||||
|
total.activity += tIOB.activityContrib;
|
||||||
|
Iob bIOB = t.iobCalc(now, dia / 2);
|
||||||
|
total.bolussnooze += bIOB.iobContrib;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastCalculationTimestamp = new Date().getTime();
|
||||||
|
lastCalculation = total;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MealData {
|
||||||
|
public double boluses = 0d;
|
||||||
|
public double carbs = 0d;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MealData getMealData() {
|
||||||
|
MealData result = new MealData();
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
if (profile == null)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
for (Treatment treatment : treatments) {
|
||||||
|
long now = new Date().getTime();
|
||||||
|
long dia_ago = now - (new Double(profile.getDia() * 60 * 60 * 1000l)).longValue();
|
||||||
|
long t = treatment.created_at.getTime();
|
||||||
|
if (t > dia_ago && t <= now) {
|
||||||
|
if (treatment.carbs >= 1) {
|
||||||
|
result.carbs += treatment.carbs;
|
||||||
|
}
|
||||||
|
if (treatment.insulin >= 0.1) {
|
||||||
|
result.boluses += treatment.insulin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Treatment> getTreatments() {
|
||||||
|
return treatments;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Treatments.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventTreatmentsUpdateGui {
|
||||||
|
}
|
|
@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.VirtualPump;
|
||||||
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
@ -12,31 +11,24 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.json.JSONException;
|
import com.squareup.otto.Subscribe;
|
||||||
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.Date;
|
|
||||||
|
|
||||||
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.data.PumpEnactResult;
|
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.plugins.VirtualPump.events.EventVirtualPumpUpdateGui;
|
||||||
import info.nightscout.androidaps.db.TempBasal;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.client.data.NSProfile;
|
|
||||||
import info.nightscout.utils.DateUtil;
|
|
||||||
|
|
||||||
public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInterface {
|
public class VirtualPumpFragment extends Fragment implements FragmentBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(VirtualPumpFragment.class);
|
private static Logger log = LoggerFactory.getLogger(VirtualPumpFragment.class);
|
||||||
|
|
||||||
Double defaultBasalValue = 0.2d;
|
private static VirtualPumpPlugin virtualPumpPlugin = new VirtualPumpPlugin();
|
||||||
|
|
||||||
Integer batteryPercent = 50;
|
public static VirtualPumpPlugin getPlugin() {
|
||||||
Integer reservoirInUnits = 50;
|
return virtualPumpPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
TextView basaBasalRateView;
|
TextView basaBasalRateView;
|
||||||
TextView tempBasalView;
|
TextView tempBasalView;
|
||||||
|
@ -44,65 +36,21 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
|
||||||
TextView batteryView;
|
TextView batteryView;
|
||||||
TextView reservoirView;
|
TextView reservoirView;
|
||||||
|
|
||||||
Handler loopHandler = new Handler();
|
private static Handler sLoopHandler = new Handler();
|
||||||
Runnable refreshLoop = null;
|
private static Runnable sRefreshLoop = null;
|
||||||
|
|
||||||
boolean fragmentEnabled = true;
|
|
||||||
boolean fragmentVisible = true;
|
|
||||||
boolean visibleNow = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return MainApp.instance().getString(R.string.virtualpump);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int type) {
|
|
||||||
return fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisibleInTabs(int type) {
|
|
||||||
return fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canBeHidden(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
|
||||||
this.fragmentEnabled = fragmentEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
|
||||||
this.fragmentVisible = fragmentVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getType() {
|
|
||||||
return PluginBase.PUMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VirtualPumpFragment newInstance() {
|
|
||||||
VirtualPumpFragment fragment = new VirtualPumpFragment();
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
if (refreshLoop == null) {
|
if (sRefreshLoop == null) {
|
||||||
refreshLoop = new Runnable() {
|
sRefreshLoop = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
updateGUI();
|
updateGUI();
|
||||||
loopHandler.postDelayed(refreshLoop, 60 * 1000l);
|
sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
loopHandler.postDelayed(refreshLoop, 60 * 1000l);
|
sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,289 +69,42 @@ public class VirtualPumpFragment extends Fragment implements PluginBase, PumpInt
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isTempBasalInProgress() {
|
public void onPause() {
|
||||||
return getTempBasal() != null;
|
super.onPause();
|
||||||
|
MainApp.bus().unregister(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isExtendedBoluslInProgress() {
|
public void onResume() {
|
||||||
return getExtendedBolus() != null;
|
super.onResume();
|
||||||
|
MainApp.bus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Subscribe
|
||||||
public void setNewBasalProfile(NSProfile profile) {
|
public void onStatusEvent(final EventVirtualPumpUpdateGui ev) {
|
||||||
// Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBaseBasalRate() {
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
if (profile == null)
|
|
||||||
return defaultBasalValue;
|
|
||||||
return profile.getBasal(profile.secondsFromMidnight());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalAbsoluteRate() {
|
|
||||||
if (!isTempBasalInProgress())
|
|
||||||
return 0;
|
|
||||||
if (getTempBasal().isAbsolute) {
|
|
||||||
return getTempBasal().absolute;
|
|
||||||
} else {
|
|
||||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
|
||||||
if (profile == null)
|
|
||||||
return defaultBasalValue;
|
|
||||||
Double baseRate = profile.getBasal(profile.secondsFromMidnight());
|
|
||||||
Double tempRate = baseRate * (getTempBasal().percent / 100d);
|
|
||||||
return baseRate + tempRate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal() {
|
|
||||||
return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getExtendedBolus() {
|
|
||||||
return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTempBasalRemainingMinutes() {
|
|
||||||
if (!isTempBasalInProgress())
|
|
||||||
return 0;
|
|
||||||
return getTempBasal().getPlannedRemainingMinutes();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TempBasal getTempBasal(Date time) {
|
|
||||||
return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
result.success = true;
|
|
||||||
result.bolusDelivered = insulin;
|
|
||||||
result.carbsDelivered = carbs;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
|
|
||||||
if (Config.logPumpComm)
|
|
||||||
log.debug("Delivering treatment insulin: " + insulin + "U carbs: " + carbs + "g " + result);
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stopBolusDelivering() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
|
||||||
PumpEnactResult result = cancelTempBasal();
|
|
||||||
if (!result.success)
|
|
||||||
return result;
|
|
||||||
TempBasal tempBasal = new TempBasal();
|
|
||||||
tempBasal.timeStart = new Date();
|
|
||||||
tempBasal.isAbsolute = true;
|
|
||||||
tempBasal.absolute = absoluteRate;
|
|
||||||
tempBasal.duration = durationInMinutes;
|
|
||||||
result.success = true;
|
|
||||||
result.enacted = true;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.absolute = absoluteRate;
|
|
||||||
result.duration = durationInMinutes;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
try {
|
|
||||||
MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
|
||||||
}
|
|
||||||
if (Config.logPumpComm)
|
|
||||||
log.debug("Setting temp basal absolute: " + result);
|
|
||||||
updateGUI();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
if (isTempBasalInProgress()) {
|
|
||||||
result = cancelTempBasal();
|
|
||||||
if (!result.success)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
TempBasal tempBasal = new TempBasal();
|
|
||||||
tempBasal.timeStart = new Date();
|
|
||||||
tempBasal.isAbsolute = false;
|
|
||||||
tempBasal.percent = percent;
|
|
||||||
tempBasal.duration = durationInMinutes;
|
|
||||||
result.success = true;
|
|
||||||
result.enacted = true;
|
|
||||||
result.percent = percent;
|
|
||||||
result.isPercent = true;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.duration = durationInMinutes;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
try {
|
|
||||||
MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
|
||||||
}
|
|
||||||
if (Config.logPumpComm)
|
|
||||||
log.debug("Settings temp basal percent: " + result);
|
|
||||||
updateGUI();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
|
||||||
PumpEnactResult result = cancelExtendedBolus();
|
|
||||||
if (!result.success)
|
|
||||||
return result;
|
|
||||||
TempBasal extendedBolus = new TempBasal();
|
|
||||||
extendedBolus.timeStart = new Date();
|
|
||||||
extendedBolus.isExtended = true;
|
|
||||||
extendedBolus.absolute = insulin * 60d / durationInMinutes;
|
|
||||||
extendedBolus.duration = durationInMinutes;
|
|
||||||
extendedBolus.isAbsolute = true;
|
|
||||||
result.success = true;
|
|
||||||
result.enacted = true;
|
|
||||||
result.bolusDelivered = insulin;
|
|
||||||
result.isTempCancel = false;
|
|
||||||
result.duration = durationInMinutes;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
try {
|
|
||||||
MainApp.instance().getDbHelper().getDaoTempBasals().create(extendedBolus);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
result.success = false;
|
|
||||||
result.enacted = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
|
||||||
}
|
|
||||||
if (Config.logPumpComm)
|
|
||||||
log.debug("Setting extended bolus: " + result);
|
|
||||||
updateGUI();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelTempBasal() {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
result.success = true;
|
|
||||||
result.isTempCancel = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
if (isTempBasalInProgress()) {
|
|
||||||
result.enacted = true;
|
|
||||||
TempBasal tb = getTempBasal();
|
|
||||||
tb.timeEnd = new Date();
|
|
||||||
try {
|
|
||||||
MainApp.instance().getDbHelper().getDaoTempBasals().update(tb);
|
|
||||||
//tempBasal = null;
|
|
||||||
if (Config.logPumpComm)
|
|
||||||
log.debug("Canceling temp basal: " + result);
|
|
||||||
updateGUI();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
result.success = false;
|
|
||||||
result.enacted = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PumpEnactResult cancelExtendedBolus() {
|
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
|
||||||
if (isExtendedBoluslInProgress()) {
|
|
||||||
TempBasal extendedBolus = getExtendedBolus();
|
|
||||||
extendedBolus.timeEnd = new Date();
|
|
||||||
try {
|
|
||||||
MainApp.instance().getDbHelper().getDaoTempBasals().update(extendedBolus);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
result.success = false;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.success = true;
|
|
||||||
result.enacted = true;
|
|
||||||
result.isTempCancel = true;
|
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
|
||||||
if (Config.logPumpComm)
|
|
||||||
log.debug("Canceling extended basal: " + result);
|
|
||||||
updateGUI();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSONObject getJSONStatus() {
|
|
||||||
JSONObject pump = new JSONObject();
|
|
||||||
JSONObject battery = new JSONObject();
|
|
||||||
JSONObject status = new JSONObject();
|
|
||||||
try {
|
|
||||||
battery.put("percent", batteryPercent);
|
|
||||||
status.put("status", "normal");
|
|
||||||
if (isTempBasalInProgress()) {
|
|
||||||
status.put("tempbasalpct", getTempBasal().percent);
|
|
||||||
status.put("tempbasalstart", DateUtil.toISOString(getTempBasal().timeStart));
|
|
||||||
status.put("tempbasalremainmin", getTempBasal().getPlannedRemainingMinutes());
|
|
||||||
}
|
|
||||||
status.put("timestamp", DateUtil.toISOString(new Date()));
|
|
||||||
|
|
||||||
pump.put("battery", battery);
|
|
||||||
pump.put("status", status);
|
|
||||||
pump.put("reservoir", reservoirInUnits);
|
|
||||||
pump.put("clock", DateUtil.toISOString(new Date()));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
return pump;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deviceID() {
|
|
||||||
return "VirtualPump";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
|
||||||
super.setUserVisibleHint(isVisibleToUser);
|
|
||||||
|
|
||||||
if (isVisibleToUser) {
|
|
||||||
visibleNow = true;
|
|
||||||
updateGUI();
|
|
||||||
} else
|
|
||||||
visibleNow = false;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateGUI() {
|
public void updateGUI() {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity != null && visibleNow && basaBasalRateView != null)
|
if (activity != null && basaBasalRateView != null)
|
||||||
activity.runOnUiThread(new Runnable() {
|
activity.runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
basaBasalRateView.setText(getBaseBasalRate() + "U");
|
basaBasalRateView.setText(virtualPumpPlugin.getBaseBasalRate() + "U");
|
||||||
if (isTempBasalInProgress()) {
|
if (virtualPumpPlugin.isTempBasalInProgress()) {
|
||||||
tempBasalView.setText(getTempBasal().toString());
|
tempBasalView.setText(virtualPumpPlugin.getTempBasal().toString());
|
||||||
} else {
|
} else {
|
||||||
tempBasalView.setText("");
|
tempBasalView.setText("");
|
||||||
}
|
}
|
||||||
if (isExtendedBoluslInProgress()) {
|
if (virtualPumpPlugin.isExtendedBoluslInProgress()) {
|
||||||
extendedBolusView.setText(getExtendedBolus().toString());
|
extendedBolusView.setText(virtualPumpPlugin.getExtendedBolus().toString());
|
||||||
} else {
|
} else {
|
||||||
extendedBolusView.setText("");
|
extendedBolusView.setText("");
|
||||||
}
|
}
|
||||||
batteryView.setText(batteryPercent + "%");
|
batteryView.setText(VirtualPumpPlugin.batteryPercent + "%");
|
||||||
reservoirView.setText(reservoirInUnits + "U");
|
reservoirView.setText(VirtualPumpPlugin.reservoirInUnits + "U");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,330 @@
|
||||||
|
package info.nightscout.androidaps.plugins.VirtualPump;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
|
import info.nightscout.androidaps.db.TempBasal;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.VirtualPump.events.EventVirtualPumpUpdateGui;
|
||||||
|
import info.nightscout.client.data.NSProfile;
|
||||||
|
import info.nightscout.utils.DateUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class VirtualPumpPlugin implements PluginBase, PumpInterface {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(VirtualPumpPlugin.class);
|
||||||
|
|
||||||
|
public static Double defaultBasalValue = 0.2d;
|
||||||
|
|
||||||
|
public static Integer batteryPercent = 50;
|
||||||
|
public static Integer reservoirInUnits = 50;
|
||||||
|
|
||||||
|
boolean fragmentEnabled = true;
|
||||||
|
boolean fragmentVisible = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return VirtualPumpFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.virtualpump);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.PUMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTempBasalInProgress() {
|
||||||
|
return getTempBasal() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExtendedBoluslInProgress() {
|
||||||
|
return getExtendedBolus() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNewBasalProfile(NSProfile profile) {
|
||||||
|
// Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getBaseBasalRate() {
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
if (profile == null)
|
||||||
|
return defaultBasalValue;
|
||||||
|
return profile.getBasal(profile.secondsFromMidnight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalAbsoluteRate() {
|
||||||
|
if (!isTempBasalInProgress())
|
||||||
|
return 0;
|
||||||
|
if (getTempBasal().isAbsolute) {
|
||||||
|
return getTempBasal().absolute;
|
||||||
|
} else {
|
||||||
|
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||||
|
if (profile == null)
|
||||||
|
return defaultBasalValue;
|
||||||
|
Double baseRate = profile.getBasal(profile.secondsFromMidnight());
|
||||||
|
Double tempRate = baseRate * (getTempBasal().percent / 100d);
|
||||||
|
return baseRate + tempRate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal() {
|
||||||
|
return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getExtendedBolus() {
|
||||||
|
return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTempBasalRemainingMinutes() {
|
||||||
|
if (!isTempBasalInProgress())
|
||||||
|
return 0;
|
||||||
|
return getTempBasal().getPlannedRemainingMinutes();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TempBasal getTempBasal(Date time) {
|
||||||
|
return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context) {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
result.success = true;
|
||||||
|
result.bolusDelivered = insulin;
|
||||||
|
result.carbsDelivered = carbs;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
|
||||||
|
if (Config.logPumpComm)
|
||||||
|
log.debug("Delivering treatment insulin: " + insulin + "U carbs: " + carbs + "g " + result);
|
||||||
|
MainApp.bus().post(new EventVirtualPumpUpdateGui());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopBolusDelivering() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) {
|
||||||
|
PumpEnactResult result = cancelTempBasal();
|
||||||
|
if (!result.success)
|
||||||
|
return result;
|
||||||
|
TempBasal tempBasal = new TempBasal();
|
||||||
|
tempBasal.timeStart = new Date();
|
||||||
|
tempBasal.isAbsolute = true;
|
||||||
|
tempBasal.absolute = absoluteRate;
|
||||||
|
tempBasal.duration = durationInMinutes;
|
||||||
|
result.success = true;
|
||||||
|
result.enacted = true;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.absolute = absoluteRate;
|
||||||
|
result.duration = durationInMinutes;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
try {
|
||||||
|
MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
||||||
|
}
|
||||||
|
if (Config.logPumpComm)
|
||||||
|
log.debug("Setting temp basal absolute: " + result);
|
||||||
|
MainApp.bus().post(new EventVirtualPumpUpdateGui());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
if (isTempBasalInProgress()) {
|
||||||
|
result = cancelTempBasal();
|
||||||
|
if (!result.success)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
TempBasal tempBasal = new TempBasal();
|
||||||
|
tempBasal.timeStart = new Date();
|
||||||
|
tempBasal.isAbsolute = false;
|
||||||
|
tempBasal.percent = percent;
|
||||||
|
tempBasal.duration = durationInMinutes;
|
||||||
|
result.success = true;
|
||||||
|
result.enacted = true;
|
||||||
|
result.percent = percent;
|
||||||
|
result.isPercent = true;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.duration = durationInMinutes;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
try {
|
||||||
|
MainApp.instance().getDbHelper().getDaoTempBasals().create(tempBasal);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
||||||
|
}
|
||||||
|
if (Config.logPumpComm)
|
||||||
|
log.debug("Settings temp basal percent: " + result);
|
||||||
|
MainApp.bus().post(new EventVirtualPumpUpdateGui());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
|
||||||
|
PumpEnactResult result = cancelExtendedBolus();
|
||||||
|
if (!result.success)
|
||||||
|
return result;
|
||||||
|
TempBasal extendedBolus = new TempBasal();
|
||||||
|
extendedBolus.timeStart = new Date();
|
||||||
|
extendedBolus.isExtended = true;
|
||||||
|
extendedBolus.absolute = insulin * 60d / durationInMinutes;
|
||||||
|
extendedBolus.duration = durationInMinutes;
|
||||||
|
extendedBolus.isAbsolute = true;
|
||||||
|
result.success = true;
|
||||||
|
result.enacted = true;
|
||||||
|
result.bolusDelivered = insulin;
|
||||||
|
result.isTempCancel = false;
|
||||||
|
result.duration = durationInMinutes;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
try {
|
||||||
|
MainApp.instance().getDbHelper().getDaoTempBasals().create(extendedBolus);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result.success = false;
|
||||||
|
result.enacted = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
||||||
|
}
|
||||||
|
if (Config.logPumpComm)
|
||||||
|
log.debug("Setting extended bolus: " + result);
|
||||||
|
MainApp.bus().post(new EventVirtualPumpUpdateGui());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelTempBasal() {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
result.success = true;
|
||||||
|
result.isTempCancel = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
if (isTempBasalInProgress()) {
|
||||||
|
result.enacted = true;
|
||||||
|
TempBasal tb = getTempBasal();
|
||||||
|
tb.timeEnd = new Date();
|
||||||
|
try {
|
||||||
|
MainApp.instance().getDbHelper().getDaoTempBasals().update(tb);
|
||||||
|
//tempBasal = null;
|
||||||
|
if (Config.logPumpComm)
|
||||||
|
log.debug("Canceling temp basal: " + result);
|
||||||
|
MainApp.bus().post(new EventVirtualPumpUpdateGui());
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result.success = false;
|
||||||
|
result.enacted = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PumpEnactResult cancelExtendedBolus() {
|
||||||
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
if (isExtendedBoluslInProgress()) {
|
||||||
|
TempBasal extendedBolus = getExtendedBolus();
|
||||||
|
extendedBolus.timeEnd = new Date();
|
||||||
|
try {
|
||||||
|
MainApp.instance().getDbHelper().getDaoTempBasals().update(extendedBolus);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result.success = false;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.success = true;
|
||||||
|
result.enacted = true;
|
||||||
|
result.isTempCancel = true;
|
||||||
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
|
if (Config.logPumpComm)
|
||||||
|
log.debug("Canceling extended basal: " + result);
|
||||||
|
MainApp.bus().post(new EventVirtualPumpUpdateGui());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject getJSONStatus() {
|
||||||
|
JSONObject pump = new JSONObject();
|
||||||
|
JSONObject battery = new JSONObject();
|
||||||
|
JSONObject status = new JSONObject();
|
||||||
|
try {
|
||||||
|
battery.put("percent", batteryPercent);
|
||||||
|
status.put("status", "normal");
|
||||||
|
if (isTempBasalInProgress()) {
|
||||||
|
status.put("tempbasalpct", getTempBasal().percent);
|
||||||
|
status.put("tempbasalstart", DateUtil.toISOString(getTempBasal().timeStart));
|
||||||
|
status.put("tempbasalremainmin", getTempBasal().getPlannedRemainingMinutes());
|
||||||
|
}
|
||||||
|
status.put("timestamp", DateUtil.toISOString(new Date()));
|
||||||
|
|
||||||
|
pump.put("battery", battery);
|
||||||
|
pump.put("status", status);
|
||||||
|
pump.put("reservoir", reservoirInUnits);
|
||||||
|
pump.put("clock", DateUtil.toISOString(new Date()));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
}
|
||||||
|
return pump;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String deviceID() {
|
||||||
|
return "VirtualPump";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.VirtualPump.events;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class EventVirtualPumpUpdateGui {
|
||||||
|
}
|
|
@ -25,6 +25,7 @@ import info.nightscout.androidaps.MainActivity;
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||||
|
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
||||||
import info.nightscout.utils.ToastUtils;
|
import info.nightscout.utils.ToastUtils;
|
||||||
|
|
||||||
|
@ -38,13 +39,13 @@ public class KeepAliveReceiver extends BroadcastReceiver {
|
||||||
wl.acquire();
|
wl.acquire();
|
||||||
|
|
||||||
log.debug("KeepAlive received");
|
log.debug("KeepAlive received");
|
||||||
final DanaRFragment danaRFragment = (DanaRFragment) MainApp.getSpecificPlugin(DanaRFragment.class);
|
final DanaRPlugin danaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||||
if (Config.DANAR && danaRFragment.isEnabled(PluginBase.PUMP)) {
|
if (Config.DANAR && danaRPlugin.isEnabled(PluginBase.PUMP)) {
|
||||||
if (danaRFragment.getDanaRPump().lastConnection.getTime() + 30 * 60 * 1000L < new Date().getTime() && !danaRFragment.isConnected() && !danaRFragment.isConnecting()) {
|
if (danaRPlugin.getDanaRPump().lastConnection.getTime() + 30 * 60 * 1000L < new Date().getTime() && !danaRPlugin.isConnected() && !danaRPlugin.isConnecting()) {
|
||||||
Thread t = new Thread(new Runnable() {
|
Thread t = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
danaRFragment.doConnect("KeepAlive");
|
danaRPlugin.doConnect("KeepAlive");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
t.start();
|
t.start();
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package info.nightscout.androidaps.tabs;
|
package info.nightscout.androidaps.tabs;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.app.FragmentStatePagerAdapter;
|
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
|
||||||
|
@ -15,21 +15,23 @@ import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
*/
|
*/
|
||||||
public class TabPageAdapter extends FragmentStatePagerAdapter {
|
public class TabPageAdapter extends FragmentStatePagerAdapter {
|
||||||
|
|
||||||
ArrayList<PluginBase> fragmentList = new ArrayList<PluginBase>();
|
ArrayList<PluginBase> fragmentList = new ArrayList<>();
|
||||||
ArrayList<PluginBase> visibleFragmentList = new ArrayList<PluginBase>();
|
ArrayList<PluginBase> visibleFragmentList = new ArrayList<>();
|
||||||
|
|
||||||
FragmentManager fm;
|
FragmentManager fm;
|
||||||
|
Context context;
|
||||||
|
|
||||||
public TabPageAdapter(FragmentManager fm) {
|
public TabPageAdapter(FragmentManager fm, Context context) {
|
||||||
super(fm);
|
super(fm);
|
||||||
this.fm = fm;
|
this.fm = fm;
|
||||||
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public Fragment getItem(int position) {
|
public Fragment getItem(int position) {
|
||||||
Fragment fragment = (Fragment) visibleFragmentList.get(position);
|
//Fragment fragment = (Fragment) visibleFragmentList.get(position);
|
||||||
return fragment;
|
return Fragment.instantiate(context, visibleFragmentList.get(position).getFragmentClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -42,8 +44,7 @@ public class TabPageAdapter extends FragmentStatePagerAdapter {
|
||||||
return visibleFragmentList.size();
|
return visibleFragmentList.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerNewFragment(Fragment fragment) {
|
public void registerNewFragment(PluginBase plugin) {
|
||||||
PluginBase plugin = (PluginBase) fragment;
|
|
||||||
fragmentList.add(plugin);
|
fragmentList.add(plugin);
|
||||||
if (plugin.isVisibleInTabs(plugin.getType())) {
|
if (plugin.isVisibleInTabs(plugin.getType())) {
|
||||||
visibleFragmentList.add(plugin);
|
visibleFragmentList.add(plugin);
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
<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.LowSuspend.LowSuspendFragment">
|
|
||||||
|
|
||||||
<ScrollView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/lowsuspend_run"
|
|
||||||
style="?android:attr/buttonStyle"
|
|
||||||
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/lowsuspend_lastrun"
|
|
||||||
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_margin="10dp"
|
|
||||||
android:background="@color/linearBlockBackground"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/openapsma_inputparameters_label"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/openapsma_glucosestatus_label"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
|
||||||
android:layout_marginLeft="5dp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/lowsuspend_glucosestatus"
|
|
||||||
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_minbg_label"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
|
||||||
android:layout_marginLeft="5dp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/lowsuspend_minbg"
|
|
||||||
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/openapsma_result_label"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/lowsuspend_result"
|
|
||||||
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/openapsma_request_label"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/lowsuspend_request"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="10dp"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceSmall" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
</FrameLayout>
|
|
|
@ -249,7 +249,6 @@
|
||||||
<string name="smscommunicator_remotebolusingallowed">Fernboli via SMS zulassen</string>
|
<string name="smscommunicator_remotebolusingallowed">Fernboli via SMS zulassen</string>
|
||||||
<string name="syncprofiletopump_title">Nightscout Profil zur Pumpe synchronisieren</string>
|
<string name="syncprofiletopump_title">Nightscout Profil zur Pumpe synchronisieren</string>
|
||||||
<string name="waitingforpumpresult">auf Pumpenergebnis warten</string>
|
<string name="waitingforpumpresult">auf Pumpenergebnis warten</string>
|
||||||
<string name="bolusdelivered">Bolus abgegeben</string>
|
|
||||||
<string name="nobtadapter">Kein Bluetoothadapter gefunden</string>
|
<string name="nobtadapter">Kein Bluetoothadapter gefunden</string>
|
||||||
<string name="remotebolusnotallowed">Remote Bolus nicht erlaubt</string>
|
<string name="remotebolusnotallowed">Remote Bolus nicht erlaubt</string>
|
||||||
<string formatted="false" name="replywithcode">Um Bolus %.2fU bitte mit %s antworten</string>
|
<string formatted="false" name="replywithcode">Um Bolus %.2fU bitte mit %s antworten</string>
|
||||||
|
|
|
@ -68,11 +68,6 @@
|
||||||
<string name="nochangerequested">No change requested</string>
|
<string name="nochangerequested">No change requested</string>
|
||||||
<string name="openapsma_request_label">Request</string>
|
<string name="openapsma_request_label">Request</string>
|
||||||
<string name="openapsma_minbg_label">Low target</string>
|
<string name="openapsma_minbg_label">Low target</string>
|
||||||
<string name="lowsuspend_lowmessage">LOW: Temp basal 0%</string>
|
|
||||||
<string name="lowsuspend_lowprojectedmessage">LOW PROJECTED: Temp basal 0%</string>
|
|
||||||
<string name="lowsuspend_cancelmessage">LowSuspend: Cancel low temp</string>
|
|
||||||
<string name="lowsuspend_low">Low</string>
|
|
||||||
<string name="lowsuspend_lowprojected">Low projected</string>
|
|
||||||
<string name="rate">Rate</string>
|
<string name="rate">Rate</string>
|
||||||
<string name="duration">Duration</string>
|
<string name="duration">Duration</string>
|
||||||
<string name="reason">Reason</string>
|
<string name="reason">Reason</string>
|
||||||
|
@ -82,7 +77,6 @@
|
||||||
<string name="minago">m ago</string>
|
<string name="minago">m ago</string>
|
||||||
|
|
||||||
<string name="configbuilder">Config Builder</string>
|
<string name="configbuilder">Config Builder</string>
|
||||||
<string name="lowsuspend">Low Suspend</string>
|
|
||||||
<string name="objectives">Objectives</string>
|
<string name="objectives">Objectives</string>
|
||||||
<string name="openapsma">OpenAPS MA</string>
|
<string name="openapsma">OpenAPS MA</string>
|
||||||
<string name="overview">Overview</string>
|
<string name="overview">Overview</string>
|
||||||
|
@ -115,7 +109,6 @@
|
||||||
<string name="cancel">Cancel</string>
|
<string name="cancel">Cancel</string>
|
||||||
<string name="noapsselected">NO APS SELECTED OR PROVIDED RESULT</string>
|
<string name="noapsselected">NO APS SELECTED OR PROVIDED RESULT</string>
|
||||||
<string name="safety">Safety</string>
|
<string name="safety">Safety</string>
|
||||||
<string name="lowsuspend_low_title">Low BG threshold</string>
|
|
||||||
<string name="openapsma_disabled">Plugin is disabled</string>
|
<string name="openapsma_disabled">Plugin is disabled</string>
|
||||||
<string name="constraints_violation">Constraints violation</string>
|
<string name="constraints_violation">Constraints violation</string>
|
||||||
<string name="treatmentdeliveryerror">Bolus delivery error</string>
|
<string name="treatmentdeliveryerror">Bolus delivery error</string>
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?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>
|
|
Loading…
Reference in a new issue