diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
index 4d0685a00f..79653ebfc0 100644
--- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
+++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
@@ -12,8 +12,6 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -25,7 +23,7 @@ import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
import info.nightscout.androidaps.data.ProfileStore;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSStatus;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.androidaps.plugins.Overview.Notification;
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
@@ -38,6 +36,7 @@ import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gPlugin;
import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientPlugin;
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
import info.nightscout.androidaps.receivers.DataReceiver;
+import info.nightscout.utils.NSDeviceStatus;
import info.nightscout.utils.SP;
@@ -259,11 +258,11 @@ public class DataService extends IntentService {
if (bundles.containsKey("status")) {
try {
JSONObject statusJson = new JSONObject(bundles.getString("status"));
- NSStatus.getInstance().setData(statusJson);
+ NSSettingsStatus.getInstance().setData(statusJson);
if (Config.logIncommingData)
log.debug("Received status: " + statusJson.toString());
- Double targetHigh = NSStatus.getInstance().getThreshold("bgTargetTop");
- Double targetlow = NSStatus.getInstance().getThreshold("bgTargetBottom");
+ Double targetHigh = NSSettingsStatus.getInstance().getThreshold("bgTargetTop");
+ Double targetlow = NSSettingsStatus.getInstance().getThreshold("bgTargetBottom");
if (targetHigh != null)
OverviewPlugin.bgTargetHigh = targetHigh;
if (targetlow != null)
@@ -276,8 +275,8 @@ public class DataService extends IntentService {
if (intent.getAction().equals(Intents.ACTION_NEW_DEVICESTATUS)) {
try {
if (bundles.containsKey("devicestatus")) {
- String devicestatusesstring = bundles.getString("devicestatus");
JSONObject devicestatusJson = new JSONObject(bundles.getString("devicestatus"));
+ NSDeviceStatus.getInstance().setData(devicestatusJson);
if (devicestatusJson.has("pump")) {
// Objectives 0
ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
@@ -287,8 +286,9 @@ public class DataService extends IntentService {
if (bundles.containsKey("devicestatuses")) {
String devicestatusesstring = bundles.getString("devicestatuses");
JSONArray jsonArray = new JSONArray(devicestatusesstring);
- if (jsonArray.length() > 0) {
- JSONObject devicestatusJson = jsonArray.getJSONObject(0);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject devicestatusJson = jsonArray.getJSONObject(i);
+ NSDeviceStatus.getInstance().setData(devicestatusJson);
if (devicestatusJson.has("pump")) {
// Objectives 0
ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java
index b3bd3cfac2..20055aa108 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java
@@ -13,7 +13,7 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.Services.Intents;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSStatus;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
/**
@@ -22,7 +22,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientServ
public class BroadcastStatus {
private static Logger log = LoggerFactory.getLogger(BroadcastStatus.class);
- public static void handleNewStatus(NSStatus status, Context context, boolean isDelta) {
+ public static void handleNewStatus(NSSettingsStatus status, Context context, boolean isDelta) {
Bundle bundle = new Bundle();
try {
bundle.putString("nsclientversionname", MainApp.instance().getPackageManager().getPackageInfo(MainApp.instance().getPackageName(), 0).versionName);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java
similarity index 63%
rename from app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSStatus.java
rename to app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java
index e89dee8db5..3201d62f6e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java
@@ -97,21 +97,21 @@ import java.util.Date;
"activeProfile": "2016 +30%"
}
*/
-public class NSStatus {
- private static NSStatus instance = null;
+public class NSSettingsStatus {
+ private static NSSettingsStatus instance = null;
- public static NSStatus getInstance() {
+ public static NSSettingsStatus getInstance() {
if (instance == null)
- instance = new NSStatus();
+ instance = new NSSettingsStatus();
return instance;
}
private JSONObject data = null;
- public NSStatus() {
+ public NSSettingsStatus() {
}
- public NSStatus setData(JSONObject obj) {
+ public NSSettingsStatus setData(JSONObject obj) {
this.data = obj;
return this;
}
@@ -152,8 +152,17 @@ public class NSStatus {
return getStringOrNull("settings");
}
- public String getExtendedSettings() {
- return getStringOrNull("extendedSettings");
+ public JSONObject getExtendedSettings() {
+ try {
+ String extended = getStringOrNull("extendedSettings");
+ if (extended != null)
+ return new JSONObject(extended);
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return null;
+
}
public String getActiveProfile() {
@@ -254,10 +263,89 @@ public class NSStatus {
return ret;
}
- ;
+ // ***** PUMP STATUS ******
public JSONObject getData() {
return data;
}
+ /*
+ , warnClock: sbx.extendedSettings.warnClock || 30
+ , urgentClock: sbx.extendedSettings.urgentClock || 60
+ , warnRes: sbx.extendedSettings.warnRes || 10
+ , urgentRes: sbx.extendedSettings.urgentRes || 5
+ , warnBattV: sbx.extendedSettings.warnBattV || 1.35
+ , urgentBattV: sbx.extendedSettings.urgentBattV || 1.3
+ , warnBattP: sbx.extendedSettings.warnBattP || 30
+ , urgentBattP: sbx.extendedSettings.urgentBattP || 20
+ , enableAlerts: sbx.extendedSettings.enableAlerts || false
+
+ */
+
+ public double extendedPumpSettings(String setting) {
+ try {
+ JSONObject pump = extentendedPumpSettings();
+ switch (setting) {
+ case "warnClock":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "urgentClock":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "warnRes":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "urgentRes":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "warnBattV":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "urgentBattV":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "warnBattP":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ case "urgentBattP":
+ return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30;
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return 0d;
+ }
+
+ @Nullable
+ public JSONObject extentendedPumpSettings() {
+ try {
+ JSONObject extended = getExtendedSettings();
+ if (extended.has("pump")) {
+ JSONObject pump = extended.getJSONObject("pump");
+ return pump;
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public boolean pumpExtentendedSettingsEnabledAlerts() {
+ try {
+ JSONObject pump = extentendedPumpSettings();
+ if (pump != null && pump.has("enableAlerts")) {
+ return pump.getBoolean("enableAlerts");
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ public String pumpExtentendedSettingsFields() {
+ try {
+ JSONObject pump = extentendedPumpSettings();
+ if (pump != null && pump.has("fields")) {
+ return pump.getString("fields");
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
index ed308e2ff0..21f863fe10 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
@@ -51,7 +51,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastT
import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastUrgentAlarm;
import info.nightscout.androidaps.plugins.NSClientInternal.data.AlarmAck;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSStatus;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSTreatment;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientNewLog;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientRestart;
@@ -432,17 +432,17 @@ public class NSClientService extends Service {
if (data.has("status")) {
JSONObject status = data.getJSONObject("status");
- NSStatus nsStatus = NSStatus.getInstance().setData(status);
+ NSSettingsStatus nsSettingsStatus = NSSettingsStatus.getInstance().setData(status);
if (!status.has("versionNum")) {
if (status.getInt("versionNum") < Config.SUPPORTEDNSVERSION) {
MainApp.bus().post(new EventNSClientNewLog("ERROR", "Unsupported Nightscout version !!!!"));
}
} else {
- nightscoutVersionName = nsStatus.getVersion();
- nightscoutVersionCode = nsStatus.getVersionNum();
+ nightscoutVersionName = nsSettingsStatus.getVersion();
+ nightscoutVersionCode = nsSettingsStatus.getVersionNum();
}
- BroadcastStatus.handleNewStatus(nsStatus, MainApp.instance().getApplicationContext(), isDelta);
+ BroadcastStatus.handleNewStatus(nsSettingsStatus, MainApp.instance().getApplicationContext(), isDelta);
/* Other received data to 2016/02/10
{
@@ -516,8 +516,7 @@ public class NSClientService extends Service {
// remove from upload queue if Ack is failing
UploadQueue.removeID(jsonStatus);
}
- // send only last record
- BroadcastDeviceStatus.handleNewDeviceStatus(devicestatuses.getJSONObject(devicestatuses.length() - 1), MainApp.instance().getApplicationContext(), isDelta);
+ BroadcastDeviceStatus.handleNewDeviceStatus(devicestatuses, MainApp.instance().getApplicationContext(), isDelta);
}
}
if (data.has("mbgs")) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java
index bfa1f6e3f5..6b15a9e17d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java
@@ -6,7 +6,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSAlarm;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSStatus;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.utils.SP;
/**
@@ -122,7 +122,7 @@ public class Notification {
BgReading bgReading = MainApp.getDbHelper().lastBg();
if (bgReading == null)
return false;
- Double threshold = NSStatus.getInstance().getThreshold("bgTargetTop");
+ Double threshold = NSSettingsStatus.getInstance().getThreshold("bgTargetTop");
if (threshold == null)
return false;
if (bgReading.value <= threshold)
@@ -134,7 +134,7 @@ public class Notification {
BgReading bgReading = MainApp.getDbHelper().lastBg();
if (bgReading == null)
return false;
- Double threshold = NSStatus.getInstance().getThreshold("bgTargetBottom");
+ Double threshold = NSSettingsStatus.getInstance().getThreshold("bgTargetBottom");
if (threshold == null)
return false;
if (bgReading.value >= threshold)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
index 51b8b67c42..b432cf38d7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
@@ -117,7 +117,9 @@ import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
import info.nightscout.utils.BolusWizard;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.NSDeviceStatus;
import info.nightscout.utils.NSUpload;
+import info.nightscout.utils.OKDialog;
import info.nightscout.utils.Profiler;
import info.nightscout.utils.Round;
import info.nightscout.utils.SP;
@@ -147,6 +149,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
TextView apsModeView;
TextView tempTargetView;
TextView pumpStatusView;
+ TextView pumpDeviceStatusView;
+ TextView openapsDeviceStatusView;
LinearLayout loopStatusLayout;
LinearLayout pumpStatusLayout;
GraphView bgGraph;
@@ -236,6 +240,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
extendedBolusView = (TextView) view.findViewById(R.id.overview_extendedbolus);
activeProfileView = (TextView) view.findViewById(R.id.overview_activeprofile);
pumpStatusView = (TextView) view.findViewById(R.id.overview_pumpstatus);
+ pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump);
+ openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps);
loopStatusLayout = (LinearLayout) view.findViewById(R.id.overview_looplayout);
pumpStatusLayout = (LinearLayout) view.findViewById(R.id.overview_pumpstatuslayout);
@@ -1156,6 +1162,17 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
getActivity().findViewById(R.id.overview_showprediction_label).setVisibility(View.GONE);
}
+ // pump status from ns
+ if (pumpDeviceStatusView != null) {
+ pumpDeviceStatusView.setText(NSDeviceStatus.getInstance().getPumpStatus());
+ pumpStatusView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.pump), NSDeviceStatus.getInstance().getExtendedPumpStatus(), null);
+ }
+ });
+ }
+
// ****** GRAPH *******
//log.debug("updateGUI checkpoint 1");
diff --git a/app/src/main/java/info/nightscout/utils/DateUtil.java b/app/src/main/java/info/nightscout/utils/DateUtil.java
index c4efa45f93..a4ee25eb22 100644
--- a/app/src/main/java/info/nightscout/utils/DateUtil.java
+++ b/app/src/main/java/info/nightscout/utils/DateUtil.java
@@ -12,6 +12,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
/**
* The Class DateUtil. A simple wrapper around SimpleDateFormat to ease the handling of iso date string <-> date obj
@@ -111,4 +112,10 @@ public class DateUtil {
public static String dateAndTimeString(long mills) {
return dateString(mills) + " " + timeString(mills);
}
+
+ public static String minAgo(long time) {
+ int mins = (int) ((System.currentTimeMillis() - time) / 1000 / 60);
+ return String.format(MainApp.sResources.getString(R.string.minago), mins);
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/utils/NSDeviceStatus.java b/app/src/main/java/info/nightscout/utils/NSDeviceStatus.java
new file mode 100644
index 0000000000..bbbd2fac37
--- /dev/null
+++ b/app/src/main/java/info/nightscout/utils/NSDeviceStatus.java
@@ -0,0 +1,238 @@
+package info.nightscout.utils;
+
+import android.text.Html;
+import android.text.Spannable;
+import android.text.Spanned;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Iterator;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
+
+import static android.R.attr.value;
+
+/**
+ * Created by mike on 25.06.2017.
+ */
+
+/*
+{
+ "_id": "594fdcec327b83c81b6b8c0f",
+ "device": "openaps://Sony D5803",
+ "pump": {
+ "battery": {
+ "percent": 100
+ },
+ "status": {
+ "status": "normal",
+ "timestamp": "2017-06-25T15:50:14Z"
+ },
+ "extended": {
+ "Version": "1.5-ac98852-2017.06.25",
+ "PumpIOB": 1.13,
+ "LastBolus": "25. 6. 2017 17:25:00",
+ "LastBolusAmount": 0.3,
+ "BaseBasalRate": 0.4,
+ "ActiveProfile": "2016 +30%"
+ },
+ "reservoir": 109,
+ "clock": "2017-06-25T15:55:10Z"
+ },
+ "openaps": {
+ "suggested": {
+ "temp": "absolute",
+ "bg": 115.9,
+ "tick": "+5",
+ "eventualBG": 105,
+ "snoozeBG": 105,
+ "predBGs": {
+ "IOB": [116, 114, 112, 110, 109, 107, 106, 105, 105, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 107]
+ },
+ "COB": 0,
+ "IOB": -0.035,
+ "reason": "COB: 0, Dev: -18, BGI: 0.43, ISF: 216, Target: 99; Eventual BG 105 > 99 but Min. Delta -2.60 < Exp. Delta 0.1; setting current basal of 0.4 as temp. Suggested rate is same as profile rate, no temp basal is active, doing nothing",
+ "timestamp": "2017-06-25T15:55:10Z"
+ },
+ "iob": {
+ "iob": -0.035,
+ "basaliob": -0.035,
+ "activity": -0.0004,
+ "time": "2017-06-25T15:55:10Z"
+ }
+ },
+ "uploaderBattery": 93,
+ "created_at": "2017-06-25T15:55:10Z",
+ "NSCLIENT_ID": 1498406118857
+}
+ */
+public class NSDeviceStatus {
+
+ private static NSDeviceStatus instance = null;
+
+ public static NSDeviceStatus getInstance() {
+ if (instance == null)
+ instance = new NSDeviceStatus();
+ return instance;
+ }
+
+ private JSONObject data = null;
+
+ public NSDeviceStatus() {
+ }
+
+ public NSDeviceStatus setData(JSONObject obj) {
+ this.data = obj;
+ updatePumpData(obj);
+ return this;
+ }
+
+ public String getDevice() {
+ try {
+ if (data.has("device")) {
+ return data.getString("device");
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static class Levels {
+ static int URGENT = 2;
+ static int WARN = 1;
+ static int INFO = 0;
+ int LOW = -1;
+ int LOWEST = -2;
+ static int NONE = -3;
+ }
+
+ // ***** PUMP DATA ******
+
+ static DeviceStatusPumpData deviceStatusPumpData = null;
+
+ public Spanned getExtendedPumpStatus() {
+ if (deviceStatusPumpData.extended != null)
+ return deviceStatusPumpData.extended;
+ return Html.fromHtml("");
+ }
+
+ public Spanned getPumpStatus() {
+ //String[] ALL_STATUS_FIELDS = {"reservoir", "battery", "clock", "status", "device"};
+
+ if (deviceStatusPumpData == null)
+ return Html.fromHtml("");
+
+ StringBuilder string = new StringBuilder();
+ // test wanring level
+ int level = Levels.INFO;
+ long now = System.currentTimeMillis();
+ if (deviceStatusPumpData.clock + NSSettingsStatus.getInstance().extendedPumpSettings("urgentClock") < now)
+ level = Levels.URGENT;
+ else if (deviceStatusPumpData.reservoir < NSSettingsStatus.getInstance().extendedPumpSettings("urgentRes"))
+ level = Levels.URGENT;
+ else if (deviceStatusPumpData.isPercent && deviceStatusPumpData.percent < NSSettingsStatus.getInstance().extendedPumpSettings("urgentBattP"))
+ level = Levels.URGENT;
+ else if (!deviceStatusPumpData.isPercent && deviceStatusPumpData.voltage < NSSettingsStatus.getInstance().extendedPumpSettings("urgentBattV"))
+ level = Levels.URGENT;
+ else if (deviceStatusPumpData.clock + NSSettingsStatus.getInstance().extendedPumpSettings("warnClock") < now)
+ level = Levels.WARN;
+ else if (deviceStatusPumpData.reservoir < NSSettingsStatus.getInstance().extendedPumpSettings("warnRes"))
+ level = Levels.WARN;
+ else if (deviceStatusPumpData.isPercent && deviceStatusPumpData.percent < NSSettingsStatus.getInstance().extendedPumpSettings("warnBattP"))
+ level = Levels.WARN;
+ else if (!deviceStatusPumpData.isPercent && deviceStatusPumpData.voltage < NSSettingsStatus.getInstance().extendedPumpSettings("warnBattV"))
+ level = Levels.WARN;
+
+ string.append("");
+ if (level == Levels.WARN) string.append("yellow\">");
+ if (level == Levels.URGENT) string.append("red\">");
+
+ String fields = NSSettingsStatus.getInstance().pumpExtentendedSettingsFields();
+
+ if (fields.contains("reservoir")) {
+ string.append((int) deviceStatusPumpData.reservoir).append("U ");
+ }
+
+ if (fields.contains("battery") && deviceStatusPumpData.isPercent) {
+ string.append(deviceStatusPumpData.percent).append("% ");
+ }
+ if (fields.contains("battery") && !deviceStatusPumpData.isPercent) {
+ string.append(Round.roundTo(deviceStatusPumpData.voltage, 0.001d)).append(" ");
+ }
+
+ if (fields.contains("clock")) {
+ string.append(DateUtil.minAgo(deviceStatusPumpData.clock)).append(" ");
+ }
+
+ if (fields.contains("status")) {
+ string.append(deviceStatusPumpData.status).append(" ");
+ }
+
+ if (fields.contains("device")) {
+ string.append(getDevice()).append(" ");
+ }
+
+
+ string.append(""); // color
+
+ return Html.fromHtml(string.toString());
+ }
+
+ static class DeviceStatusPumpData {
+ long clock = 0L;
+ boolean isPercent = false;
+ int percent = 0;
+ double voltage = 0;
+
+ String status = "N/A";
+ double reservoir = 0d;
+
+ Spanned extended = null;
+ }
+
+ public void updatePumpData(JSONObject object) {
+ try {
+ JSONObject pump = data != null && data.has("pump") ? data.getJSONObject("pump") : new JSONObject();
+
+ long clock = 0L;
+ if (pump.has("clock"))
+ clock = DateUtil.fromISODateString(pump.getString("clock")).getTime();
+ // check if this is new data
+ if (clock == 0 || deviceStatusPumpData != null && clock < deviceStatusPumpData.clock)
+ return;
+ // create new status and process data
+ deviceStatusPumpData = new DeviceStatusPumpData();
+ deviceStatusPumpData.clock = clock;
+ if (pump.has("status") && pump.getJSONObject("status").has("status"))
+ deviceStatusPumpData.status = pump.getJSONObject("status").getString("status");
+ if (pump.has("reservoir"))
+ deviceStatusPumpData.reservoir = pump.getDouble("reservoir");
+ if (pump.has("battery") && pump.getJSONObject("battery").has("percent")) {
+ deviceStatusPumpData.isPercent = true;
+ deviceStatusPumpData.percent = pump.getJSONObject("battery").getInt("percent");
+ } else if (pump.has("battery") && pump.getJSONObject("battery").has("voltage")) {
+ deviceStatusPumpData.isPercent = false;
+ deviceStatusPumpData.voltage = pump.getJSONObject("battery").getDouble("voltage");
+ }
+ if (pump.has("extended")) {
+ JSONObject extendedJson = pump.getJSONObject("extended");
+ StringBuilder exteneded = new StringBuilder();
+ Iterator> keys = extendedJson.keys();
+ while (keys.hasNext()) {
+ String key = (String) keys.next();
+ String value = extendedJson.getString(key);
+ exteneded.append("").append(key).append(": ").append(value).append("
");
+ }
+ deviceStatusPumpData.extended = Html.fromHtml(exteneded.toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/utils/OKDialog.java b/app/src/main/java/info/nightscout/utils/OKDialog.java
index 19fbe7c62a..72e0ddd8d2 100644
--- a/app/src/main/java/info/nightscout/utils/OKDialog.java
+++ b/app/src/main/java/info/nightscout/utils/OKDialog.java
@@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.view.ContextThemeWrapper;
+import android.text.Spanned;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,4 +42,28 @@ public class OKDialog {
log.debug("show_dialog exception: " + e);
}
}
+
+ public static void show(final Activity activity, String title, Spanned message, final Runnable runnable) {
+ try {
+ AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme));
+ builder.setTitle(title);
+ builder.setMessage(message);
+ builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ if (runnable != null) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ activity.runOnUiThread(runnable);
+ }
+ }
+ });
+
+ builder.create().show();
+ } catch (Exception e) {
+ log.debug("show_dialog exception: " + e);
+ }
+ }
}
diff --git a/app/src/main/res/layout/overview_fragment_tablet.xml b/app/src/main/res/layout/overview_fragment_tablet.xml
index 6f71242ce5..933371b337 100644
--- a/app/src/main/res/layout/overview_fragment_tablet.xml
+++ b/app/src/main/res/layout/overview_fragment_tablet.xml
@@ -400,6 +400,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Urgent stale data
Stale data threshold [min]
Urgent stale data threshold [min]
+ Pump
+ OpenAPS
+ Device