diff --git a/app/build.gradle b/app/build.gradle index e8dbcc0b6a..d9fedfeaa1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -105,7 +105,7 @@ android { multiDexEnabled true versionCode 1500 // dev_version: 2.3.1-dev - version "medtronic-0.11.1-SNAPSHOT" + version "medtronic-0.11.2-SNAPSHOT" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"' diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 9d0dd1eb41..50b597b988 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -282,25 +282,40 @@ public class MainApp extends Application { public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); - if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { - final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); - switch (state) { - case BluetoothAdapter.STATE_OFF: - case BluetoothAdapter.STATE_TURNING_OFF: - case BluetoothAdapter.STATE_TURNING_ON: - break; + PumpInterface activePump = ConfigBuilderPlugin.getPlugin().getActivePump(); - case BluetoothAdapter.STATE_ON: - Log.v("MainApp", "Bluetooth on"); - RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.BluetoothReconnected); + if (action != null) { + if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { + final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); + switch (state) { + case BluetoothAdapter.STATE_OFF: + case BluetoothAdapter.STATE_TURNING_OFF: + case BluetoothAdapter.STATE_TURNING_ON: + break; + + case BluetoothAdapter.STATE_ON: { + if (activePump != null && "Medtronic".equals(activePump.deviceID())) { + Log.v("MainApp", "Bluetooth on"); + RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.BluetoothReconnected); + } + } break; + } + } else { + if (activePump != null) { + activePump.timeDateOrTimeZoneChanged(); + } } } } }; // Register for broadcasts on BluetoothAdapter state change - IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_DATE_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(btReceiver, filter); } diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index 076818d0a1..b3e1e310e0 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -542,13 +542,11 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { GregorianCalendar gc = new GregorianCalendar(); gc.add(Calendar.DAY_OF_YEAR, (-1) * days); - Date d = new Date((gc.get(Calendar.YEAR)-1900), gc.get(Calendar.MONTH), gc.get(Calendar.DAY_OF_MONTH), 0, 0, 0); - try { QueryBuilder queryBuilder = getDaoTDD().queryBuilder(); queryBuilder.orderBy("date", false); Where where = queryBuilder.where(); - where.ge("date", d.getTime()); + where.ge("date", gc.getTimeInMillis()); PreparedQuery preparedQuery = queryBuilder.prepare(); tddList = getDaoTDD().query(preparedQuery); } catch (SQLException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/db/TDD.java b/app/src/main/java/info/nightscout/androidaps/db/TDD.java index 39c3b7b9ca..244bd7c078 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TDD.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TDD.java @@ -6,9 +6,8 @@ import com.j256.ormlite.table.DatabaseTable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Objects; - import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil; /** * Created by mike on 20.09.2017. @@ -39,10 +38,22 @@ public class TDD { public TDD() { } - public TDD(long date, double bolus, double basal, double total){ + public TDD(long date, double bolus, double basal, double total) { this.date = date; this.bolus = bolus; this.basal = basal; this.total = total; } + + + @Override + public String toString() { + return "TDD [" + + "date=" + date + + "date(str)=" + DateTimeUtil.toStringFromTimeInMillis(date) + + ", bolus=" + bolus + + ", basal=" + basal + + ", total=" + total + + ']'; + } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 3690312cf8..65a2f8af84 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -71,4 +71,10 @@ public interface PumpInterface { void executeCustomAction(CustomActionType customActionType); + /** + * This method will be called when time or Timezone changes, and pump driver can then do a specific action (for + * example update clock on pump). + */ + void timeDateOrTimeZoneChanged(); + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java index 557ba42168..5ae6d5b01d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java @@ -1396,4 +1396,10 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return false; } + @Override + public void timeDateOrTimeZoneChanged() { + + } + + } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java index 7a391443d9..fc5fb62288 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/DateTimeUtil.java @@ -158,6 +158,23 @@ public class DateTimeUtil { } + public static String toString(GregorianCalendar gc) { + + return getZeroPrefixed(gc.get(Calendar.DAY_OF_MONTH)) + "." + getZeroPrefixed(gc.get(Calendar.MONTH) + 1) + "." + + gc.get(Calendar.YEAR) + " " + + // + getZeroPrefixed(gc.get(Calendar.HOUR_OF_DAY)) + ":" + getZeroPrefixed(gc.get(Calendar.MINUTE)) + ":" + + getZeroPrefixed(gc.get(Calendar.SECOND)); + } + + public static String toStringFromTimeInMillis(long timeInMillis) { + + GregorianCalendar gc = new GregorianCalendar(); + gc.setTimeInMillis(timeInMillis); + + return toString(gc); + } + private static String getZeroPrefixed(int number) { return (number < 10) ? "0" + number : "" + number; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java index 749307e1a7..4dd3316248 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java @@ -493,7 +493,10 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte return false; } + @Override + public void timeDateOrTimeZoneChanged() { + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/DanaRSPlugin.java index ddbb8547ae..730baa1166 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/DanaRSPlugin.java @@ -832,4 +832,9 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte return false; } + @Override + public void timeDateOrTimeZoneChanged() { + + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java index d673a0b8ce..42125690c0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java @@ -1583,4 +1583,10 @@ public class LocalInsightPlugin extends PluginBase implements PumpInterface, Con public boolean canHandleDST() { return true; } + + @Override + public void timeDateOrTimeZoneChanged() { + + } + } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/mdi/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/mdi/MDIPlugin.java index 89d1184581..ca5441eb3d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/mdi/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/mdi/MDIPlugin.java @@ -265,4 +265,10 @@ public class MDIPlugin extends PluginBase implements PumpInterface { return true; } + @Override + public void timeDateOrTimeZoneChanged() { + + } + + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java index aae561f255..ba3a77b89f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java @@ -40,6 +40,8 @@ import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction; import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.general.overview.dialogs.MessageHelperActivity; +import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.general.overview.notifications.Notification; import info.nightscout.androidaps.plugins.pump.common.PumpPluginAbstract; import info.nightscout.androidaps.plugins.pump.common.defs.PumpDriverState; import info.nightscout.androidaps.plugins.pump.common.defs.PumpType; @@ -57,6 +59,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUITask import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData; import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfile; import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfileEntry; +import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.ClockDTO; import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.TempBasalPair; import info.nightscout.androidaps.plugins.pump.medtronic.defs.BasalProfileStatus; import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType; @@ -99,6 +102,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter public static boolean isBusy = false; private List busyTimestamps = new ArrayList<>(); private boolean sentIdToFirebase = false; + private boolean hasTimeDateOrTimeZoneChanged = false; private MedtronicPumpPlugin() { @@ -413,42 +417,61 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable); + + if (hasTimeDateOrTimeZoneChanged) { + + checkTimeAndOptionallySetTime(); + + // read time if changed, set new time + hasTimeDateOrTimeZoneChanged = false; + + workWithStatusRefresh(StatusRefreshAction.Add, MedtronicStatusRefreshType.PumpTime, 30L); + + if (statusRefresh.containsKey(MedtronicStatusRefreshType.PumpTime)) { + statusRefresh.remove(MedtronicStatusRefreshType.PumpTime); + } + } + + // execute - if (statusRefresh != null) { + Set refreshTypesNeededToReschedule = new HashSet<>(); - Set refreshTypesNeededToReschedule = new HashSet<>(); + for (Map.Entry refreshType : statusRefresh.entrySet()) { - for (Map.Entry refreshType : statusRefresh.entrySet()) { + if (refreshType.getValue() > 0 && System.currentTimeMillis() > refreshType.getValue()) { - if (refreshType.getValue() > 0 && System.currentTimeMillis() > refreshType.getValue()) { - - switch (refreshType.getKey()) { - case PumpHistory: { - readPumpHistory(); - } - break; - - case PumpTime: - case BatteryStatus: - case RemainingInsulin: { - medtronicUIComm.executeCommand(refreshType.getKey().getCommandType()); - refreshTypesNeededToReschedule.add(refreshType.getKey()); - resetTime = true; - } - break; - - case Configuration: { - medtronicUIComm.executeCommand(refreshType.getKey().getCommandType()); - resetTime = true; - } - break; + switch (refreshType.getKey()) { + case PumpHistory: { + readPumpHistory(); } + break; + + case PumpTime: { + checkTimeAndOptionallySetTime(); + refreshTypesNeededToReschedule.add(refreshType.getKey()); + resetTime = true; + } + break; + + case BatteryStatus: + case RemainingInsulin: { + medtronicUIComm.executeCommand(refreshType.getKey().getCommandType()); + refreshTypesNeededToReschedule.add(refreshType.getKey()); + resetTime = true; + } + break; + + case Configuration: { + medtronicUIComm.executeCommand(refreshType.getKey().getCommandType()); + resetTime = true; + } + break; } } // reschedule - for (MedtronicStatusRefreshType refreshType : refreshTypesNeededToReschedule) { - scheduleNextRefresh(refreshType); + for (MedtronicStatusRefreshType refreshType2 : refreshTypesNeededToReschedule) { + scheduleNextRefresh(refreshType2); } } @@ -468,7 +491,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter } } - return false; + return hasTimeDateOrTimeZoneChanged; } @@ -519,7 +542,8 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter this.pumpState = PumpDriverState.Connected; // time (1h) - medtronicUIComm.executeCommand(MedtronicCommandType.RealTimeClock); + checkTimeAndOptionallySetTime(); + //medtronicUIComm.executeCommand(MedtronicCommandType.GetRealTimeClock); scheduleNextRefresh(MedtronicStatusRefreshType.PumpTime, 30); readPumpHistory(); @@ -563,7 +587,6 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter sentIdToFirebase = true; } - isInitialized = true; // this.pumpState = PumpDriverState.Initialized; @@ -680,6 +703,47 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter } + private void checkTimeAndOptionallySetTime() { + + if (isLoggingEnabled()) + LOG.info("MedtronicPumpPlugin::checkTimeAndOptionallySetTime - Start"); + + setRefreshButtonEnabled(false); + + if (isPumpNotReachable()) { + LOG.debug("MedtronicPumpPlugin::checkTimeAndOptionallySetTime - Pump Unreachable."); + setRefreshButtonEnabled(true); + return; + } + + MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable); + + medtronicUIComm.executeCommand(MedtronicCommandType.GetRealTimeClock); + + ClockDTO clock = MedtronicUtil.getPumpTime(); + + int timeDiff = Math.abs(clock.timeDifference); + + if (timeDiff > 20) { + + if (isLoggingEnabled()) + LOG.info("MedtronicPumpPlugin::checkTimeAndOptionallySetTime - Time difference is {} s. Set time on pump.", timeDiff); + + medtronicUIComm.executeCommand(MedtronicCommandType.SetRealTimeClock); + + if (clock.timeDifference == 0) { + Notification notification = new Notification(Notification.INSIGHT_DATE_TIME_UPDATED, MainApp.gs(R.string.pump_time_updated), Notification.INFO, 60); + MainApp.bus().post(new EventNewNotification(notification)); + } + + } else { + if (isLoggingEnabled()) + LOG.info("MedtronicPumpPlugin::checkTimeAndOptionallySetTime - Time difference is {} s. Do nothing.", timeDiff); + } + + } + + @NonNull protected PumpEnactResult deliverBolus(final DetailedBolusInfo detailedBolusInfo) { @@ -779,9 +843,8 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter } } finally { - MainApp.bus().post(new EventRefreshOverview("Bolus")); + finishAction("Bolus"); this.bolusDeliveryType = BolusDeliveryType.Idle; - triggerUIChange(); } } @@ -1145,8 +1208,9 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter } - private synchronized Map workWithStatusRefresh(StatusRefreshAction action, - MedtronicStatusRefreshType statusRefreshType, Long time) { + private synchronized Map workWithStatusRefresh(StatusRefreshAction action, // + MedtronicStatusRefreshType statusRefreshType, // + Long time) { switch (action) { @@ -1422,6 +1486,14 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter } + @Override + public void timeDateOrTimeZoneChanged() { + + if (isLoggingEnabled()) + LOG.warn(getLogPrefix() + "Time, Date and/or TimeZone changed. "); + + this.hasTimeDateOrTimeZoneChanged = true; + } private void refreshCustomActionsList() { MainApp.bus().post(new EventCustomActionsChanged()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java index 3192de323f..2f37b338a2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java @@ -7,6 +7,8 @@ import org.joda.time.LocalDateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Calendar; +import java.util.GregorianCalendar; import java.util.List; import java.util.Map; @@ -811,7 +813,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager ClockDTO clockDTO = new ClockDTO(); clockDTO.localDeviceTime = new LocalDateTime(); - Object responseObject = sendAndGetResponseWithCheck(MedtronicCommandType.RealTimeClock); + Object responseObject = sendAndGetResponseWithCheck(MedtronicCommandType.GetRealTimeClock); if (responseObject != null) { clockDTO.pumpTime = (LocalDateTime) responseObject; @@ -858,6 +860,36 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager } + public Boolean setPumpTime() { + + GregorianCalendar gc = new GregorianCalendar(); + gc.add(Calendar.SECOND, 5); + + if (isLogEnabled()) + LOG.info("setPumpTime: " + DateTimeUtil.toString(gc)); + + int i = 1; + byte[] data = new byte[8]; + data[0] = 7; + data[i] = (byte) gc.get(Calendar.HOUR_OF_DAY); + data[i + 1] = (byte) gc.get(Calendar.MINUTE); + data[i + 2] = (byte) gc.get(Calendar.SECOND); + + byte[] yearByte = MedtronicUtil.getByteArrayFromUnsignedShort(gc.get(Calendar.YEAR), true); + + data[i + 3] = yearByte[0]; + data[i + 4] = yearByte[1]; + + data[i + 5] = (byte) (gc.get(Calendar.MONTH) + 1); + data[i + 6] = (byte) gc.get(Calendar.DAY_OF_MONTH); + + //LOG.info("setPumpTime: Body: " + ByteUtil.getHex(data)); + + return setCommand(MedtronicCommandType.SetRealTimeClock, data); + + } + + private boolean setCommand(MedtronicCommandType commandType, byte[] body) { for (int retries = 0; retries <= MAX_COMMAND_TRIES; retries++) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicConverter.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicConverter.java index f3d3f78aaf..ddd44b8e6c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicConverter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicConverter.java @@ -52,7 +52,7 @@ public class MedtronicConverter { return decodeModel(rawContent); } - case RealTimeClock: { + case GetRealTimeClock: { return decodeTime(rawContent); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java index 7463b3e00e..5a7017659f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java @@ -1,7 +1,5 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.message; -import android.util.Log; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java index f7c848c1dd..84298d1994 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java @@ -87,11 +87,24 @@ public class MedtronicUIPostprocessor { } break; - case RealTimeClock: { + case GetRealTimeClock: { processTime(uiTask); } break; + case SetRealTimeClock: { + boolean response = (Boolean) uiTask.returnData; + + if (isLogEnabled()) + LOG.debug("New time was {} set.", response ? "" : "NOT"); + + if (response) { + MedtronicUtil.getPumpTime().timeDifference = 0; + } + } + break; + + case GetBatteryStatus: { BatteryStatusDTO batteryStatusDTO = (BatteryStatusDTO) uiTask.returnData; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUITask.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUITask.java index ed6bc9af9e..791e3aa2fa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUITask.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUITask.java @@ -66,11 +66,16 @@ public class MedtronicUITask { } break; - case RealTimeClock: { + case GetRealTimeClock: { returnData = communicationManager.getPumpTime(); } break; + case SetRealTimeClock: { + returnData = communicationManager.setPumpTime(); + } + break; + case GetBatteryStatus: { returnData = communicationManager.getRemainingBattery(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java index 25e6eeaebe..cd64a4d9f8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java @@ -10,7 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.GregorianCalendar; @@ -31,7 +30,6 @@ import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.configBuilder.DetailedBolusInfoStorage; import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil; import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil; -import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.MedtronicPumpHistoryDecoder; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntryType; @@ -50,7 +48,6 @@ import info.nightscout.androidaps.plugins.treatments.Treatment; import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.utils.SP; -//import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin; /** * Created by andy on 10/12/18. @@ -67,7 +64,6 @@ public class MedtronicHistoryData { private boolean isInit = false; private Gson gson; - //private List fakeTBRs; private DatabaseHelper databaseHelper = MainApp.getDbHelper(); private ClockDTO pumpTime; @@ -387,7 +383,7 @@ public class MedtronicHistoryData { LOG.debug("ProcessHistoryData: Bolus [count={}, items={}]", treatments.size(), gson.toJson(treatments)); if (treatments.size() > 0) { - processEntries(treatments, ProcessHistoryRecord.Bolus); + processBolusEntries(treatments); } // TBR @@ -396,7 +392,7 @@ public class MedtronicHistoryData { LOG.debug("ProcessHistoryData: TBRs NOT Processed [count={}, items={}]", tbrs.size(), gson.toJson(tbrs)); if (tbrs.size() > 0) { - //processEntries(tbrs, ProcessHistoryRecord.TBR); + processTBREntries(tbrs); } // 'Delivery Suspend' @@ -470,11 +466,11 @@ public class MedtronicHistoryData { } - private void processEntries(List entryList, ProcessHistoryRecord processHistoryRecord) { + private void processBolusEntries(List entryList) { int dateDifference = getOldestDateDifference(entryList); - List entriesFromHistory = getDatabaseEntries(dateDifference, processHistoryRecord); + List entriesFromHistory = getDatabaseEntries(dateDifference, ProcessHistoryRecord.Bolus); // LOG.debug(processHistoryRecord.getDescription() + " List (before filter): {}, FromDb={}", gsonPretty.toJson(entryList), // gsonPretty.toJson(entriesFromHistory)); @@ -490,80 +486,117 @@ public class MedtronicHistoryData { if (isCollectionEmpty(entriesFromHistory)) { for (PumpHistoryEntry treatment : entryList) { if (isLogEnabled()) - LOG.debug("Add " + processHistoryRecord.getDescription() + " (no db entries): " + treatment); - addEntry(treatment, null, processHistoryRecord); + LOG.debug("Add Bolus (no db entries): " + treatment); + + addBolus(treatment, null); } } else { for (PumpHistoryEntry treatment : entryList) { DbObjectBase treatmentDb = findDbEntry(treatment, entriesFromHistory); if (isLogEnabled()) - LOG.debug("Add " + processHistoryRecord.getDescription() + " {} - (entryFromDb={}) ", treatment, treatmentDb); + LOG.debug("Add Bolus {} - (entryFromDb={}) ", treatment, treatmentDb); - addEntry(treatment, treatmentDb, processHistoryRecord); + addBolus(treatment, (Treatment) treatmentDb); } } } - private void processTBREntries(List entryList, ProcessHistoryRecord processHistoryRecord) { - - int dateDifference = getOldestDateDifference(entryList); - - List entriesFromHistory = getDatabaseEntries(dateDifference, processHistoryRecord); - -// LOG.debug(processHistoryRecord.getDescription() + " List (before filter): {}, FromDb={}", gsonPretty.toJson(entryList), -// gsonPretty.toJson(entriesFromHistory)); + private void processTBREntries(List entryList) { Collections.reverse(entryList); - filterOutAlreadyAddedEntries(entryList, entriesFromHistory); + TempBasalPair tbr = (TempBasalPair) entryList.get(0).getDecodedDataEntry("Object"); + + boolean readOldItem = false; + + if (tbr.isCancelTBR()) { + PumpHistoryEntry oneMoreEntryFromHistory = getOneMoreEntryFromHistory(PumpHistoryEntryType.TempBasalCombined); + + if (oneMoreEntryFromHistory != null) { + entryList.add(0, oneMoreEntryFromHistory); + readOldItem = true; + } else { + entryList.remove(0); + } + } + + int dateDifference = getOldestDateDifference(entryList); + + List entriesFromHistory = getDatabaseEntries(dateDifference, ProcessHistoryRecord.TBR); + + LOG.debug(ProcessHistoryRecord.TBR.getDescription() + " List (before filter): {}, FromDb={}", gson.toJson(entryList), + gson.toJson(entriesFromHistory)); + + //filterOutAlreadyAddedEntries(entryList, entriesFromHistory); if (entryList.isEmpty()) return; -// LOG.debug(processHistoryRecord.getDescription() + " List (after filter): {}, FromDb={}", gsonPretty.toJson(entryList), -// gsonPretty.toJson(entriesFromHistory)); - PumpHistoryEntry startRecord = null; +// LOG.debug(processHistoryRecord.getDescription() + " List (after filter): {}, FromDb={}", gson.toJson(entryList), +// gson.toJson(entriesFromHistory)); + + //PumpHistoryEntry startRecord = null; + + TempBasalProcessDTO processDTO = null; + List processList = new ArrayList<>(); for (PumpHistoryEntry treatment : entryList) { - TempBasalPair tbr = (TempBasalPair) treatment.getDecodedDataEntry("Object"); + TempBasalPair tbr2 = (TempBasalPair) treatment.getDecodedDataEntry("Object"); - if (!tbr.isCancelTBR()) { - - } else { - - } - - boolean isPossibleCancel = false; - - if (tbr.getInsulinRate() > 0.0d) { - startRecord = treatment; - } else { - isPossibleCancel = true; - - if (startRecord == null) { + if (tbr2.isCancelTBR()) { + processDTO.itemTwo = treatment; + if (readOldItem) { + processDTO.processOperation = TempBasalProcessDTO.Operation.Edit; + readOldItem = false; + } else { + processDTO.processOperation = TempBasalProcessDTO.Operation.Add; + } + } else { + if (processDTO != null) { + processList.add(processDTO); } - } - - if (isLogEnabled()) - LOG.debug("Add " + processHistoryRecord.getDescription() + " (no db entries): " + treatment); - addEntry(treatment, null, processHistoryRecord); - } - - - if (isCollectionEmpty(entriesFromHistory)) { - } else { - for (PumpHistoryEntry treatment : entryList) { - DbObjectBase treatmentDb = findDbEntry(treatment, entriesFromHistory); - if (isLogEnabled()) - LOG.debug("Add " + processHistoryRecord.getDescription() + " {} - (entryFromDb={}) ", treatment, treatmentDb); - - addEntry(treatment, treatmentDb, processHistoryRecord); + processDTO = new TempBasalProcessDTO(); + processDTO.itemOne = treatment; } } + + if (!isCollectionEmpty(processList)) { + + for (TempBasalProcessDTO tempBasalProcessDTO : processList) { + + if (tempBasalProcessDTO.processOperation == TempBasalProcessDTO.Operation.Edit) { + // edit + TemporaryBasal tempBasal = databaseHelper.findTempBasalByPumpId(tempBasalProcessDTO.itemOne.getPumpId()); + + tempBasal.durationInMinutes = tempBasalProcessDTO.getDuration(); + + databaseHelper.createOrUpdate(tempBasal); + + if (isLogEnabled()) + LOG.debug("Edit " + ProcessHistoryRecord.TBR.getDescription() + " - (entryFromDb={}) ", tempBasal); + + } else { + // add + + PumpHistoryEntry treatment = tempBasalProcessDTO.itemOne; + + TempBasalPair tbr2 = (TempBasalPair) treatment.getDecodedData().get("Object"); + tbr2.setDurationMinutes(tempBasalProcessDTO.getDuration()); + + DbObjectBase treatmentDb = findDbEntry(treatment, entriesFromHistory); + + if (isLogEnabled()) + LOG.debug("Add " + ProcessHistoryRecord.TBR.getDescription() + " {} - (entryFromDb={}) ", treatment, treatmentDb); + + addTBR(treatment, (TemporaryBasal) treatmentDb); + } // if + } // for + + } // collection } @@ -576,8 +609,8 @@ public class MedtronicHistoryData { if (entriesFromHistory.size() == 0) { return null; } else if (entriesFromHistory.size() == 1) { - DbObjectBase treatment1 = entriesFromHistory.get(0); - LocalDateTime ldt = new LocalDateTime(treatment1.getDate()); + //DbObjectBase treatment1 = entriesFromHistory.get(0); + //LocalDateTime ldt = new LocalDateTime(treatment1.getDate()); return entriesFromHistory.get(0); } @@ -614,18 +647,6 @@ public class MedtronicHistoryData { } - private void addEntry(PumpHistoryEntry treatment, DbObjectBase treatmentDb, ProcessHistoryRecord processHistoryRecord) { - - if (processHistoryRecord == ProcessHistoryRecord.Bolus) { - addBolus(treatment, (Treatment) treatmentDb); - } else if (processHistoryRecord == ProcessHistoryRecord.TBR) { - addTBR(treatment, (TemporaryBasal) treatmentDb); - } else { - addTBR(treatment, (TemporaryBasal) treatmentDb); - } - } - - private List getDatabaseEntries(int dateDifference, ProcessHistoryRecord processHistoryRecord) { if (processHistoryRecord == ProcessHistoryRecord.Bolus) { return TreatmentsPlugin.getPlugin().getTreatmentsFromHistoryXMinutesAgo( @@ -794,7 +815,7 @@ public class MedtronicHistoryData { } - public void processSuspends(List tempBasalProcessList) { + private void processSuspends(List tempBasalProcessList) { for (TempBasalProcessDTO tempBasalProcess : tempBasalProcessList) { @@ -816,10 +837,7 @@ public class MedtronicHistoryData { databaseHelper.createOrUpdate(tempBasal); - } else { - continue; } - } } @@ -855,9 +873,9 @@ public class MedtronicHistoryData { // not full suspends, need to retrive one more record and discard first one (R S R S) -> ([S] R S R [xS]) filteredItems.remove(0); - PumpHistoryEntry oneMoreEntryFromHistory = getOneMoreEntryFromHistory(); + PumpHistoryEntry oneMoreEntryFromHistory = getOneMoreEntryFromHistory(PumpHistoryEntryType.Suspend); if (oneMoreEntryFromHistory != null) { - filteredItems.add(getOneMoreEntryFromHistory()); + filteredItems.add(oneMoreEntryFromHistory); } else { filteredItems.remove(filteredItems.size() - 1); // remove last (unpaired R) } @@ -867,7 +885,7 @@ public class MedtronicHistoryData { if (filteredItems.get(0).getEntryType() == PumpHistoryEntryType.Resume) { // get one more from history (R S R) -> ([S] R S R) - PumpHistoryEntry oneMoreEntryFromHistory = getOneMoreEntryFromHistory(); + PumpHistoryEntry oneMoreEntryFromHistory = getOneMoreEntryFromHistory(PumpHistoryEntryType.Suspend); if (oneMoreEntryFromHistory != null) { filteredItems.add(oneMoreEntryFromHistory); } else { @@ -936,9 +954,7 @@ public class MedtronicHistoryData { break; } - if (!finishedItems) { - tempData.add(filteredItem); - } + tempData.add(filteredItem); } } @@ -960,9 +976,7 @@ public class MedtronicHistoryData { break; } - if (!finishedItems) { - tempData.add(filteredItem); - } + tempData.add(filteredItem); } } @@ -972,7 +986,6 @@ public class MedtronicHistoryData { return outList; } - showLogs("NoDeliveryRewindPrimeRecords: Records to evaluate: ", gson.toJson(tempData)); List items = getFilteredItems(tempData, // @@ -993,7 +1006,8 @@ public class MedtronicHistoryData { processDTO.itemOne = items.get(items.size() - 1); processDTO.processOperation = TempBasalProcessDTO.Operation.Add; - return Arrays.asList(processDTO); + outList.add(processDTO); + return outList; } @@ -1006,15 +1020,16 @@ public class MedtronicHistoryData { processDTO.itemOne = items.get(0); processDTO.processOperation = TempBasalProcessDTO.Operation.Add; - return Arrays.asList(processDTO); + outList.add(processDTO); + return outList; } return outList; } - private PumpHistoryEntry getOneMoreEntryFromHistory() { - List filteredItems = getFilteredItems(this.allHistory, PumpHistoryEntryType.Suspend); + private PumpHistoryEntry getOneMoreEntryFromHistory(PumpHistoryEntryType entryType) { + List filteredItems = getFilteredItems(this.allHistory, entryType); return filteredItems.size() == 0 ? null : filteredItems.get(0); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/BatteryStatusDTO.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/BatteryStatusDTO.java index 0e8b3e093c..d12260bb75 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/BatteryStatusDTO.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/BatteryStatusDTO.java @@ -19,25 +19,29 @@ public class BatteryStatusDTO { public int getCalculatedPercent(BatteryType batteryType) { - if (voltage==null || batteryType==BatteryType.None) { - return (batteryStatusType==BatteryStatusType.Low || batteryStatusType==BatteryStatusType.Unknown) ? 18 : 70; + if (voltage == null || batteryType == BatteryType.None) { + return (batteryStatusType == BatteryStatusType.Low || batteryStatusType == BatteryStatusType.Unknown) ? 18 : 70; } double percent = (voltage - batteryType.lowVoltage) / (batteryType.highVoltage - batteryType.lowVoltage); - return (int)(percent * 100.0d); + int percentInt = (int) (percent * 100.0d); + + if (percentInt > 100) + percentInt = 100; + + return percentInt; } public String toString() { return String.format("BatteryStatusDTO [voltage=%.2f, alkaline=%d, lithium=%d]", - voltage==null? 0.0f : voltage, + voltage == null ? 0.0f : voltage, getCalculatedPercent(BatteryType.Alkaline), getCalculatedPercent(BatteryType.Lithium)); } - public enum BatteryStatusType { Normal, Low, diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.java index 375170e0f9..076765748b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalProcessDTO.java @@ -11,8 +11,13 @@ public class TempBasalProcessDTO { public Operation processOperation = Operation.None; public int getDuration() { - int difference = DateTimeUtil.getATechDateDiferenceAsMinutes(itemOne.atechDateTime, itemTwo.atechDateTime); - return difference; + if (itemTwo == null) { + TempBasalPair tbr = (TempBasalPair) itemOne.getDecodedDataEntry("Object"); + return tbr.getDurationMinutes(); + } else { + int difference = DateTimeUtil.getATechDateDiferenceAsMinutes(itemOne.atechDateTime, itemTwo.atechDateTime); + return difference; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/BatteryType.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/BatteryType.java index 339f7311d5..7d5e6b1165 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/BatteryType.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/BatteryType.java @@ -13,14 +13,14 @@ import info.nightscout.androidaps.R; public enum BatteryType { None(R.string.medtronic_pump_battery_no, 0, 0), - Alkaline(R.string.medtronic_pump_battery_alkaline,1.20f, 1.47f), // - Lithium(R.string.medtronic_pump_battery_lithium,1.32f, 1.58f); + Alkaline(R.string.medtronic_pump_battery_alkaline, 1.20d, 1.47d), // + Lithium(R.string.medtronic_pump_battery_lithium, 1.25d, 1.64d); private final String description; - public float lowVoltage; - public float highVoltage; + public double lowVoltage; + public double highVoltage; - static Map mapByDescription; + static Map mapByDescription; static { mapByDescription = new HashMap<>(); @@ -30,7 +30,7 @@ public enum BatteryType { } } - BatteryType(int resId, float lowVoltage, float highVoltage) { + BatteryType(int resId, double lowVoltage, double highVoltage) { this.description = MainApp.gs(resId); this.lowVoltage = lowVoltage; this.highVoltage = highVoltage; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicCommandType.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicCommandType.java index 9e089befdd..9ac939eabd 100755 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicCommandType.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicCommandType.java @@ -67,7 +67,10 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType // PumpId(113, "Pump Id", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.All, // MinimedCommandParameterType.NoParameters), // init - RealTimeClock(112, "Real Time Clock", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, // + SetRealTimeClock(0x40, "Set Pump Time", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, // + 0), // + + GetRealTimeClock(112, "Get Pump Time", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, // 7, R.string.medtronic_cmd_desc_get_time), // 0x70 GetBatteryStatus(0x72, "Get Battery Status", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), // diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java index 8db905b5c8..55dc9b1a49 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java @@ -12,7 +12,7 @@ public enum MedtronicStatusRefreshType { Configuration(0, null), // RemainingInsulin(-1, MedtronicCommandType.GetRemainingInsulin), // BatteryStatus(55, MedtronicCommandType.GetBatteryStatus), // - PumpTime(60, MedtronicCommandType.RealTimeClock) // + PumpTime(60, MedtronicCommandType.GetRealTimeClock) // ; private int refreshTime; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.java index 8caea44d51..bb71f45d6f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.java @@ -481,4 +481,11 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { } + + @Override + public void timeDateOrTimeZoneChanged() { + + } + + } \ No newline at end of file