Medtronic-0.11.2-SNAPSHOT
- #122 - TBRs processing - #139 - Set Time in Pump - #126 - Calculate Battery - #140 - Be aware of Time/TZ changes
This commit is contained in:
parent
654b8ab0f6
commit
5878a33ac7
24 changed files with 387 additions and 160 deletions
|
@ -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() + '"'
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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<TDD, String> queryBuilder = getDaoTDD().queryBuilder();
|
||||
queryBuilder.orderBy("date", false);
|
||||
Where<TDD, String> where = queryBuilder.where();
|
||||
where.ge("date", d.getTime());
|
||||
where.ge("date", gc.getTimeInMillis());
|
||||
PreparedQuery<TDD> preparedQuery = queryBuilder.prepare();
|
||||
tddList = getDaoTDD().query(preparedQuery);
|
||||
} catch (SQLException e) {
|
||||
|
|
|
@ -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 +
|
||||
']';
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
|
|
@ -1396,4 +1396,10 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeDateOrTimeZoneChanged() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -493,7 +493,10 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeDateOrTimeZoneChanged() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -832,4 +832,9 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeDateOrTimeZoneChanged() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1583,4 +1583,10 @@ public class LocalInsightPlugin extends PluginBase implements PumpInterface, Con
|
|||
public boolean canHandleDST() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeDateOrTimeZoneChanged() {
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -265,4 +265,10 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeDateOrTimeZoneChanged() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Long> 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<MedtronicStatusRefreshType> refreshTypesNeededToReschedule = new HashSet<>();
|
||||
|
||||
Set<MedtronicStatusRefreshType> refreshTypesNeededToReschedule = new HashSet<>();
|
||||
for (Map.Entry<MedtronicStatusRefreshType, Long> refreshType : statusRefresh.entrySet()) {
|
||||
|
||||
for (Map.Entry<MedtronicStatusRefreshType, Long> 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<MedtronicStatusRefreshType, Long> workWithStatusRefresh(StatusRefreshAction action,
|
||||
MedtronicStatusRefreshType statusRefreshType, Long time) {
|
||||
private synchronized Map<MedtronicStatusRefreshType, Long> 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());
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -52,7 +52,7 @@ public class MedtronicConverter {
|
|||
return decodeModel(rawContent);
|
||||
}
|
||||
|
||||
case RealTimeClock: {
|
||||
case GetRealTimeClock: {
|
||||
return decodeTime(rawContent);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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<PumpHistoryEntry> 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<PumpHistoryEntry> entryList, ProcessHistoryRecord processHistoryRecord) {
|
||||
private void processBolusEntries(List<PumpHistoryEntry> entryList) {
|
||||
|
||||
int dateDifference = getOldestDateDifference(entryList);
|
||||
|
||||
List<? extends DbObjectBase> entriesFromHistory = getDatabaseEntries(dateDifference, processHistoryRecord);
|
||||
List<? extends DbObjectBase> 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<PumpHistoryEntry> entryList, ProcessHistoryRecord processHistoryRecord) {
|
||||
|
||||
int dateDifference = getOldestDateDifference(entryList);
|
||||
|
||||
List<? extends DbObjectBase> entriesFromHistory = getDatabaseEntries(dateDifference, processHistoryRecord);
|
||||
|
||||
// LOG.debug(processHistoryRecord.getDescription() + " List (before filter): {}, FromDb={}", gsonPretty.toJson(entryList),
|
||||
// gsonPretty.toJson(entriesFromHistory));
|
||||
private void processTBREntries(List<PumpHistoryEntry> 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<? extends DbObjectBase> 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<TempBasalProcessDTO> 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<? extends DbObjectBase> getDatabaseEntries(int dateDifference, ProcessHistoryRecord processHistoryRecord) {
|
||||
if (processHistoryRecord == ProcessHistoryRecord.Bolus) {
|
||||
return TreatmentsPlugin.getPlugin().getTreatmentsFromHistoryXMinutesAgo(
|
||||
|
@ -794,7 +815,7 @@ public class MedtronicHistoryData {
|
|||
}
|
||||
|
||||
|
||||
public void processSuspends(List<TempBasalProcessDTO> tempBasalProcessList) {
|
||||
private void processSuspends(List<TempBasalProcessDTO> 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<PumpHistoryEntry> 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<PumpHistoryEntry> filteredItems = getFilteredItems(this.allHistory, PumpHistoryEntryType.Suspend);
|
||||
private PumpHistoryEntry getOneMoreEntryFromHistory(PumpHistoryEntryType entryType) {
|
||||
List<PumpHistoryEntry> filteredItems = getFilteredItems(this.allHistory, entryType);
|
||||
|
||||
return filteredItems.size() == 0 ? null : filteredItems.get(0);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<String,BatteryType> mapByDescription;
|
||||
static Map<String, BatteryType> 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;
|
||||
|
|
|
@ -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), //
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -481,4 +481,11 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
|
|||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void timeDateOrTimeZoneChanged() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in a new issue