From 4b389c2cadd955eb878f11fd1d69ceff9a9c349a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 3 Dec 2016 17:42:08 +0100 Subject: [PATCH] dana drivers switching working --- app/src/main/AndroidManifest.xml | 4 + .../nightscout/androidaps/MainActivity.java | 17 +- .../androidaps/PreferencesActivity.java | 4 +- .../androidaps/plugins/DanaR/DanaRPlugin.java | 4 + .../androidaps/plugins/DanaR/DanaRPump.java | 15 ++ .../DanaR/Services/ExecutionService.java | 7 +- .../plugins/DanaR/comm/MsgCheckValue.java | 26 +- .../DanaR/comm/MsgInitConnStatusBasic.java | 66 ++++-- .../DanaR/comm/MsgInitConnStatusBolus.java | 31 ++- .../DanaR/comm/MsgInitConnStatusOption.java | 18 +- .../DanaR/comm/MsgInitConnStatusTime.java | 28 ++- .../DanaR/comm/MsgSettingShippingInfo.java | 20 +- .../plugins/DanaR/comm/MsgStatusBasic.java | 55 ++--- .../DanaRKorean/DanaRKoreanFragment.java | 14 +- .../DanaRKorean/DanaRKoreanPlugin.java | 14 +- .../plugins/DanaRKorean/DanaRKoreanPump.java | 19 +- .../History/DanaRHistoryActivity.java | 2 +- .../plugins/DanaRKorean/SerialIOThread.java | 224 ++++++++++++++++++ .../Services/ExecutionService.java | 26 +- .../comm/MessageOriginalNames.java | 163 ------------- .../DanaRKorean/comm/MsgCheckValue.java | 26 +- .../DanaRKorean/comm/MsgHistoryAll.java | 1 + .../comm/MsgInitConnStatusBasic.java | 37 ++- .../comm/MsgInitConnStatusBolus.java | 32 ++- .../comm/MsgInitConnStatusTime.java | 34 ++- .../DanaRKorean/comm/MsgSetCarbsEntry.java | 1 + .../DanaRKorean/comm/MsgSettingBasal.java | 2 +- .../comm/MsgSettingBasalProfileAll.java | 4 +- .../comm/MsgSettingShippingInfo.java | 20 +- .../plugins/DanaRKorean/comm/MsgStatus.java | 12 +- .../DanaRKorean/comm/MsgStatusBasic.java | 28 +-- .../comm/MsgStatusBolusExtended.java | 2 + .../plugins/DanaRKorean/comm/RecordTypes.java | 19 -- .../receivers/KeepAliveReceiver.java | 13 + app/src/main/res/values/strings.xml | 1 + wear/wear.iml | 46 ++-- 36 files changed, 636 insertions(+), 399 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/SerialIOThread.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MessageOriginalNames.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/RecordTypes.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b186abbbed..d54fefbd79 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -80,6 +80,10 @@ android:name=".plugins.DanaR.Services.ExecutionService" android:enabled="true" android:exported="false" /> + diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index faf0c259fe..eaef4449db 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -90,12 +90,17 @@ public class MainActivity extends AppCompatActivity { SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); String lang = SP.getString("language", "en"); LocaleHelper.setLocale(getApplicationContext(), lang); - recreate(); - try { // activity may be destroyed - setUpTabs(ev.isSwitchToLast()); - } catch (IllegalStateException e) { - e.printStackTrace(); - } + runOnUiThread(new Runnable() { + @Override + public void run() { + recreate(); + try { // activity may be destroyed + setUpTabs(ev.isSwitchToLast()); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + }); } private void setUpTabs(boolean switchToLast) { diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index 0934e68ec3..8865bba6a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -17,6 +17,7 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.plugins.DanaR.BluetoothDevicePreference; import info.nightscout.androidaps.plugins.DanaR.DanaRFragment; import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; import info.nightscout.utils.LocaleHelper; public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -89,7 +90,8 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre addPreferencesFromResource(R.xml.pref_nightscout); if (Config.DANAR) { DanaRPlugin danaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class); - if (danaRPlugin.isEnabled(PluginBase.PUMP)) { + DanaRKoreanPlugin danaRKoreanPlugin = (DanaRKoreanPlugin) MainApp.getSpecificPlugin(DanaRKoreanPlugin.class); + if (danaRPlugin.isEnabled(PluginBase.PUMP) || danaRKoreanPlugin.isEnabled(PluginBase.PUMP)) { addPreferencesFromResource(R.xml.pref_danar); addPreferencesFromResource(R.xml.pref_danarprofile); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java index 5501319e99..2b94e764b7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java @@ -585,6 +585,10 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf return sExecutionService != null && sExecutionService.isConnecting(); } + public static void doDisconnect(String from) { + if (sExecutionService != null) sExecutionService.disconnect(from); + } + @Override public JSONObject getJSONStatus() { if (getDanaRPump().lastConnection.getTime() + 5 * 60 * 1000L < new Date().getTime()) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPump.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPump.java index 6c9bf14e77..918d533e5e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPump.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPump.java @@ -22,6 +22,11 @@ public class DanaRPump { public static final int UNITS_MGDL = 0; public static final int UNITS_MMOL = 1; + public static final int DELIVERY_PRIME = 0x01; + public static final int DELIVERY_STEP_BOLUS = 0x02; + public static final int DELIVERY_BASAL = 0x04; + public static final int DELIVERY_EXT_BOLUS = 0x08; + public static final String PROFILE_PREFIX = "DanaR-"; public Date lastConnection = new Date(0); @@ -35,12 +40,21 @@ public class DanaRPump { public int password = -1; public Date pumpTime = new Date(0); + public static final int DOMESTIC_MODEL = 0x01; + public static final int EXPORT_MODEL = 0x03; + public int model; + public int protocol; + public int productCode; + + // Status public boolean pumpSuspended; public boolean calculatorEnabled; public double dailyTotalUnits; public int maxDailyTotalUnits; + public double bolusStep; + public double iob; public double reservoirRemainingUnits; @@ -58,6 +72,7 @@ public class DanaRPump { public int tempBasalTotalSec; public Date tempBasalStart; + public boolean isDualBolusInProgress; public boolean isExtendedInProgress; public int extendedBolusMinutes; public double extendedBolusAmount; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/Services/ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/Services/ExecutionService.java index e9151a53c3..c79bb5b23e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/Services/ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/Services/ExecutionService.java @@ -174,6 +174,11 @@ public class ExecutionService extends Service { return connectionInProgress; } + public void disconnect(String from) { + if (mSerialIOThread != null) + mSerialIOThread.disconnect(from); + } + public void connect(String from) { if (danaRPump.password != -1 && danaRPump.password != SafeParse.stringToInt(SP.getString("danar_password", "-1"))) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); @@ -270,11 +275,11 @@ public class ExecutionService extends Service { MsgStatusBolusExtended exStatusMsg = new MsgStatusBolusExtended(); + mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); // TODO: show it somewhere mSerialIOThread.sendMessage(tempStatusMsg); // do this before statusBasic because here is temp duration mSerialIOThread.sendMessage(exStatusMsg); mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); // TODO: show it somewhere if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(new MsgCheckValue()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgCheckValue.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgCheckValue.java index 954342a8a7..775de6eb29 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgCheckValue.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgCheckValue.java @@ -4,6 +4,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaR.DanaRPump; +import info.nightscout.utils.ToastUtils; /** * Created by mike on 30.06.2016. @@ -17,15 +22,22 @@ public class MsgCheckValue extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a = intFromBuff(bytes, 0, 1); - int b = intFromBuff(bytes, 1, 1); - if (a != 3 || b <= 0) { - // another message will follow - } else { + DanaRPump pump = DanaRPlugin.getDanaRPump(); + pump.model = intFromBuff(bytes, 0, 1); + pump.protocol = intFromBuff(bytes, 1, 1); + pump.productCode = intFromBuff(bytes, 2, 1); + if (pump.model != DanaRPump.EXPORT_MODEL) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumpdriverselected), R.raw.error); + ((DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class)).doDisconnect("Wrong Model"); + log.debug("Wrong model selected"); + } + + if (Config.logDanaMessageDetail) { + log.debug("Model: " + String.format("%02X ", pump.model)); + log.debug("Protocol: " + String.format("%02X ", pump.protocol)); + log.debug("Product Code: " + String.format("%02X ", pump.productCode)); } - if (Config.logDanaMessageDetail) - log.debug("Response: " + String.format("%02X ", a) + String.format("%02X ", b)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBasic.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBasic.java index 33a95554f7..6303391d4a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBasic.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBasic.java @@ -3,6 +3,10 @@ package info.nightscout.androidaps.plugins.DanaR.comm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaR.DanaRPump; + public class MsgInitConnStatusBasic extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusBasic.class); @@ -12,25 +16,51 @@ public class MsgInitConnStatusBasic extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a = intFromBuff(bytes, 0, 1); - int b = intFromBuff(bytes, 1, 1); - int c = intFromBuff(bytes, 2, 1); - int d = intFromBuff(bytes, 3, 1); - int e = intFromBuff(bytes, 4, 1); - int f = intFromBuff(bytes, 5, 1); - int g = intFromBuff(bytes, 6, 1); - int h = intFromBuff(bytes, 7, 1); - int i = intFromBuff(bytes, 8, 1); - int j = intFromBuff(bytes, 9, 1); - int k = intFromBuff(bytes, 10, 1); - int l = intFromBuff(bytes, 11, 1); - int m = intFromBuff(bytes, 12, 1); - int n = intFromBuff(bytes, 13, 1); - int o; + if (bytes.length - 10 < 21) { + return; + } + DanaRPump pump = DanaRPlugin.getDanaRPump(); + pump.pumpSuspended = intFromBuff(bytes, 0, 1) == 1; + pump.calculatorEnabled = intFromBuff(bytes, 1, 1) == 1; + pump.dailyTotalUnits = intFromBuff(bytes, 2, 3) / 750d; + pump.maxDailyTotalUnits = intFromBuff(bytes, 5, 2) / 100; + pump.reservoirRemainingUnits = intFromBuff(bytes, 7, 3) / 750d; + pump.bolusBlocked = intFromBuff(bytes, 10, 1) == 1; + pump.currentBasal = intFromBuff(bytes, 11, 2) / 100d; + pump.tempBasalPercent = intFromBuff(bytes, 13, 1); + pump.isExtendedInProgress = intFromBuff(bytes, 14, 1) == 1; + pump.isTempBasalInProgress = intFromBuff(bytes, 15, 1) == 1; + int statusBasalUDOption = intFromBuff(bytes, 16, 1); + pump.isDualBolusInProgress = intFromBuff(bytes, 17, 1) == 1; + double extendedBolusRate = intFromBuff(bytes, 18, 2) / 100d; + pump.batteryRemaining = intFromBuff(bytes, 20, 1); try { - o = intFromBuff(bytes, 21, 1); - } catch (Exception ex) { - o = 0; + int bolusConfig = intFromBuff(bytes, 21, 1); + boolean deliveryPrime = (bolusConfig & DanaRPump.DELIVERY_PRIME) != 0; + boolean deliveryStepBolus = (bolusConfig & DanaRPump.DELIVERY_STEP_BOLUS) != 0; + boolean deliveryBasal = (bolusConfig & DanaRPump.DELIVERY_BASAL) != 0; + boolean deliveryExtBolus = (bolusConfig & DanaRPump.DELIVERY_EXT_BOLUS) != 0; + log.debug("Delivery prime: " + deliveryPrime); + log.debug("Delivery step bolus: " + deliveryStepBolus); + log.debug("Delivery basal: " + deliveryBasal); + log.debug("Delivery ext bolus: " + deliveryExtBolus); + } catch (Exception e) { + } + + if (Config.logDanaMessageDetail) { + log.debug("Pump suspended: " + pump.pumpSuspended); + log.debug("Calculator enabled: " + pump.calculatorEnabled); + log.debug("Daily total units: " + pump.dailyTotalUnits); + log.debug("Max daily total units: " + pump.maxDailyTotalUnits); + log.debug("Reservoir remaining units: " + pump.reservoirRemainingUnits); + log.debug("Bolus blocked: " + pump.bolusBlocked); + log.debug("Current basal: " + pump.currentBasal); + log.debug("Current temp basal percent: " + pump.tempBasalPercent); + log.debug("Is extended bolus running: " + pump.isExtendedInProgress); + log.debug("statusBasalUDOption: " + statusBasalUDOption); + log.debug("Is dual bolus running: " + pump.isDualBolusInProgress); + log.debug("Extended bolus rate: " + extendedBolusRate); + log.debug("Battery remaining: " + pump.batteryRemaining); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBolus.java index 3a3ce99349..abc9607fba 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusBolus.java @@ -3,6 +3,10 @@ package info.nightscout.androidaps.plugins.DanaR.comm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaR.DanaRPump; + /** * Created by mike on 28.05.2016. */ @@ -15,10 +19,27 @@ public class MsgInitConnStatusBolus extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a1 = intFromBuff(bytes, 0, 1); - int a2 = intFromBuff(bytes, 1, 1); - int c = intFromBuff(bytes, 8, 2); - int d = c / 100; - int e = intFromBuff(bytes, 10, 2); + if (bytes.length - 10 > 12) { + return; + } + DanaRPump pump = DanaRPlugin.getDanaRPump(); + int bolusConfig = intFromBuff(bytes, 0, 1); + boolean deliveryPrime = (bolusConfig & DanaRPump.DELIVERY_PRIME) != 0; + boolean deliveryStepBolus = (bolusConfig & DanaRPump.DELIVERY_STEP_BOLUS) != 0; + boolean deliveryBasal = (bolusConfig & DanaRPump.DELIVERY_BASAL) != 0; + boolean deliveryExtBolus = (bolusConfig & DanaRPump.DELIVERY_EXT_BOLUS) != 0; + + pump.bolusStep = intFromBuff(bytes, 1, 1) / 100d; + pump.maxBolus = intFromBuff(bytes, 2, 2) / 100d; + //int bolusRate = intFromBuff(bytes, 4, 8); + + if (Config.logDanaMessageDetail) { + log.debug("Delivery prime: " + deliveryPrime); + log.debug("Delivery step bolus: " + deliveryStepBolus); + log.debug("Delivery basal: " + deliveryBasal); + log.debug("Delivery ext bolus: " + deliveryExtBolus); + log.debug("Bolus increment: " + pump.bolusStep); + log.debug("Bolus max: " + pump.maxBolus); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusOption.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusOption.java index b8049c23ee..2b424a949b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusOption.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusOption.java @@ -18,15 +18,15 @@ public class MsgInitConnStatusOption extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a = intFromBuff(bytes, 0, 1); - int b = intFromBuff(bytes, 1, 1); - int c = intFromBuff(bytes, 2, 1); - int d = intFromBuff(bytes, 3, 1); - int e = intFromBuff(bytes, 4, 1); - int f = intFromBuff(bytes, 5, 1); - int g = intFromBuff(bytes, 6, 1); - int h = intFromBuff(bytes, 7, 1); - int i = intFromBuff(bytes, 8, 1); + int status1224Clock = intFromBuff(bytes, 0, 1); + int isStatusButtonScroll = intFromBuff(bytes, 1, 1); + int soundVibration = intFromBuff(bytes, 2, 1); + int glucoseUnit = intFromBuff(bytes, 3, 1); + int lcdTimeout = intFromBuff(bytes, 4, 1); + int backlightgTimeout = intFromBuff(bytes, 5, 1); + int languageOption = intFromBuff(bytes, 6, 1); + int lowReservoirAlarmBoundary = intFromBuff(bytes, 7, 1); + //int none = intFromBuff(bytes, 8, 1); if (bytes.length >= 21) { DanaRPlugin.getDanaRPump().password = intFromBuff(bytes, 9, 2) ^ 0x3463; if (Config.logDanaMessageDetail) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusTime.java index 7e6b1a7652..8f5ef43c41 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgInitConnStatusTime.java @@ -6,6 +6,14 @@ import org.slf4j.LoggerFactory; import java.util.Date; import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventRefreshGui; +import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaR.DanaRPump; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; +import info.nightscout.utils.ToastUtils; public class MsgInitConnStatusTime extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusTime.class); @@ -16,9 +24,25 @@ public class MsgInitConnStatusTime extends MessageBase { @Override public void handleMessage(byte[] bytes) { - Date time = dateTimeSecFromBuff(bytes, 0); + if (bytes.length - 10 > 7) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.wrongpumpdriverselected), R.raw.error); + ((DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class)).doDisconnect("Wrong Model"); + log.debug("Wrong model selected. Switching to Korean DanaR"); + ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setFragmentEnabled(PluginBase.PUMP, true); + ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setFragmentVisible(PluginBase.PUMP, true); + ((DanaRPlugin)MainApp.getSpecificPlugin(DanaRPlugin.class)).setFragmentEnabled(PluginBase.PUMP, false); + ((DanaRPlugin)MainApp.getSpecificPlugin(DanaRPlugin.class)).setFragmentVisible(PluginBase.PUMP, false); + MainApp.getConfigBuilder().storeSettings(); + MainApp.bus().post(new EventRefreshGui(false)); + return; + } - if (Config.logDanaMessageDetail) + Date time = dateTimeSecFromBuff(bytes, 0); + int versionCode = intFromBuff(bytes, 6, 1); + + if (Config.logDanaMessageDetail) { log.debug("Pump time: " + time); + log.debug("Version code: " + versionCode); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgSettingShippingInfo.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgSettingShippingInfo.java index 81b1a11eb6..9b71f0060b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgSettingShippingInfo.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgSettingShippingInfo.java @@ -7,6 +7,7 @@ import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaR.DanaRPump; /** * Created by mike on 05.07.2016. @@ -19,17 +20,18 @@ public class MsgSettingShippingInfo extends MessageBase { } public void handleMessage(byte[] bytes) { - DanaRPlugin.getDanaRPump().serialNumber = stringFromBuff(bytes, 0, 10); - DanaRPlugin.getDanaRPump().shippingDate = dateFromBuff(bytes, 10); - DanaRPlugin.getDanaRPump().shippingCountry = asciiStringFromBuff(bytes, 13, 3); - if (DanaRPlugin.getDanaRPump().shippingDate.getTime() > new Date(116, 4, 1).getTime()) { - DanaRPlugin.getDanaRPump().isNewPump = true; + DanaRPump pump = DanaRPlugin.getDanaRPump(); + pump.serialNumber = stringFromBuff(bytes, 0, 10); + pump.shippingDate = dateFromBuff(bytes, 10); + pump.shippingCountry = asciiStringFromBuff(bytes, 13, 3); + if (pump.shippingDate.getTime() > new Date(116, 4, 1).getTime()) { + pump.isNewPump = true; } else - DanaRPlugin.getDanaRPump().isNewPump = false; + pump.isNewPump = false; if (Config.logDanaMessageDetail) { - log.debug("Serial number: " + DanaRPlugin.getDanaRPump().serialNumber); - log.debug("Shipping date: " + DanaRPlugin.getDanaRPump().shippingDate); - log.debug("Shipping country: " + DanaRPlugin.getDanaRPump().shippingCountry); + log.debug("Serial number: " + pump.serialNumber); + log.debug("Shipping date: " + pump.shippingDate); + log.debug("Shipping country: " + pump.shippingCountry); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgStatusBasic.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgStatusBasic.java index 5422c4318b..d79dd6aea8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgStatusBasic.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/comm/MsgStatusBasic.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.DanaR.DanaRPump; public class MsgStatusBasic extends MessageBase { @@ -15,41 +16,31 @@ public class MsgStatusBasic extends MessageBase { } public void handleMessage(byte[] bytes) { - boolean pumpSuspended = intFromBuff(bytes, 0, 1) == 1; - boolean calculatorEnabled = intFromBuff(bytes, 1, 1) == 1; - double dailyTotalUnits = intFromBuff(bytes, 2, 3) / 750d; - int maxDailyTotalUnits = intFromBuff(bytes, 5, 2) / 100; - double reservoirRemainingUnits = intFromBuff(bytes, 7, 3) / 750d; - boolean bolusBlocked = intFromBuff(bytes, 10, 1) == 1; - double currentBasal = intFromBuff(bytes, 11, 2) / 100d; - int tempBasalPercent = intFromBuff(bytes, 13, 1); - boolean isExtendedInProgress = intFromBuff(bytes, 14, 1) == 1; - boolean isTempBasalInProgress = intFromBuff(bytes, 15, 1) == 1; - int batteryRemaining = intFromBuff(bytes, 20, 1); + DanaRPump pump = DanaRPlugin.getDanaRPump(); - DanaRPlugin.getDanaRPump().pumpSuspended = pumpSuspended; - DanaRPlugin.getDanaRPump().calculatorEnabled = calculatorEnabled; - DanaRPlugin.getDanaRPump().dailyTotalUnits = dailyTotalUnits; - DanaRPlugin.getDanaRPump().maxDailyTotalUnits = maxDailyTotalUnits; - DanaRPlugin.getDanaRPump().reservoirRemainingUnits = reservoirRemainingUnits; - DanaRPlugin.getDanaRPump().bolusBlocked = bolusBlocked; - DanaRPlugin.getDanaRPump().currentBasal = currentBasal; - DanaRPlugin.getDanaRPump().tempBasalPercent = tempBasalPercent; - DanaRPlugin.getDanaRPump().isExtendedInProgress = isExtendedInProgress; - DanaRPlugin.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress; - DanaRPlugin.getDanaRPump().batteryRemaining = batteryRemaining; + pump.pumpSuspended = intFromBuff(bytes, 0, 1) == 1; + pump.calculatorEnabled = intFromBuff(bytes, 1, 1) == 1; + pump.dailyTotalUnits = intFromBuff(bytes, 2, 3) / 750d; + pump.maxDailyTotalUnits = intFromBuff(bytes, 5, 2) / 100; + pump.reservoirRemainingUnits = intFromBuff(bytes, 7, 3) / 750d; + pump.bolusBlocked = intFromBuff(bytes, 10, 1) == 1; + pump.currentBasal = intFromBuff(bytes, 11, 2) / 100d; + pump.tempBasalPercent = intFromBuff(bytes, 13, 1); + pump.isExtendedInProgress = intFromBuff(bytes, 14, 1) == 1; + pump.isTempBasalInProgress = intFromBuff(bytes, 15, 1) == 1; + pump.batteryRemaining = intFromBuff(bytes, 20, 1); if (Config.logDanaMessageDetail) { - log.debug("Pump suspended: " + pumpSuspended); - log.debug("Calculator enabled: " + calculatorEnabled); - log.debug("Daily total units: " + dailyTotalUnits); - log.debug("Max daily total units: " + maxDailyTotalUnits); - log.debug("Reservoir remaining units: " + reservoirRemainingUnits); - log.debug("Bolus blocked: " + bolusBlocked); - log.debug("Current basal: " + currentBasal); - log.debug("Current temp basal percent: " + tempBasalPercent); - log.debug("Is extended bolus running: " + isExtendedInProgress); - log.debug("Is temp basal running: " + isTempBasalInProgress); + log.debug("Pump suspended: " + pump.pumpSuspended); + log.debug("Calculator enabled: " + pump.calculatorEnabled); + log.debug("Daily total units: " + pump.dailyTotalUnits); + log.debug("Max daily total units: " + pump.maxDailyTotalUnits); + log.debug("Reservoir remaining units: " + pump.reservoirRemainingUnits); + log.debug("Bolus blocked: " + pump.bolusBlocked); + log.debug("Current basal: " + pump.currentBasal); + log.debug("Current temp basal percent: " + pump.tempBasalPercent); + log.debug("Is extended bolus running: " + pump.isExtendedInProgress); + log.debug("Is temp basal running: " + pump.isTempBasalInProgress); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java index 26473eb58c..77e320c3a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java @@ -200,13 +200,13 @@ public class DanaRKoreanFragment extends Fragment implements FragmentBase { lastConnectionView.setText(formatTime.format(DanaRKoreanPlugin.getDanaRPump().lastConnection) + " (" + agoMin + " " + MainApp.sResources.getString(R.string.minago) + ")"); SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d); } - if (DanaRKoreanPlugin.getDanaRPump().lastBolusTime.getTime() != 0) { - Long agoMsec = new Date().getTime() - DanaRKoreanPlugin.getDanaRPump().lastBolusTime.getTime(); - double agoHours = agoMsec / 60d / 60d / 1000d; - if (agoHours < 6) // max 6h back - lastBolusView.setText(formatTime.format(DanaRKoreanPlugin.getDanaRPump().lastBolusTime) + " (" + DecimalFormatter.to1Decimal(agoHours) + " " + getString(R.string.hoursago) + ") " + DecimalFormatter.to2Decimal(danaRKoreanPlugin.getDanaRPump().lastBolusAmount) + " U"); - else lastBolusView.setText(""); - } +// if (DanaRKoreanPlugin.getDanaRPump().lastBolusTime.getTime() != 0) { +// Long agoMsec = new Date().getTime() - DanaRKoreanPlugin.getDanaRPump().lastBolusTime.getTime(); +// double agoHours = agoMsec / 60d / 60d / 1000d; +// if (agoHours < 6) // max 6h back +// lastBolusView.setText(formatTime.format(DanaRKoreanPlugin.getDanaRPump().lastBolusTime) + " (" + DecimalFormatter.to1Decimal(agoHours) + " " + getString(R.string.hoursago) + ") " + DecimalFormatter.to2Decimal(danaRKoreanPlugin.getDanaRPump().lastBolusAmount) + " U"); +// else lastBolusView.setText(""); +// } dailyUnitsView.setText(DecimalFormatter.to0Decimal(DanaRKoreanPlugin.getDanaRPump().dailyTotalUnits) + " / " + DanaRKoreanPlugin.getDanaRPump().maxDailyTotalUnits + " U"); SetWarnColor.setColor(dailyUnitsView, DanaRKoreanPlugin.getDanaRPump().dailyTotalUnits, DanaRKoreanPlugin.getDanaRPump().maxDailyTotalUnits * 0.75d, DanaRKoreanPlugin.getDanaRPump().maxDailyTotalUnits * 0.9d); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java index cbfcd0b4f9..fca8507114 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java @@ -584,6 +584,10 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints return sExecutionService != null && sExecutionService.isConnecting(); } + public static void doDisconnect(String from) { + if (sExecutionService != null) sExecutionService.disconnect(from); + } + @Override public JSONObject getJSONStatus() { if (getDanaRPump().lastConnection.getTime() + 5 * 60 * 1000L < new Date().getTime()) { @@ -599,8 +603,8 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints status.put("timestamp", DateUtil.toISOString(getDanaRPump().lastConnection)); extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION); extended.put("PumpIOB", getDanaRPump().iob); - extended.put("LastBolus", getDanaRPump().lastBolusTime.toLocaleString()); - extended.put("LastBolusAmount", getDanaRPump().lastBolusAmount); +// extended.put("LastBolus", getDanaRPump().lastBolusTime.toLocaleString()); +// extended.put("LastBolusAmount", getDanaRPump().lastBolusAmount); if (isTempBasalInProgress()) { extended.put("TempBasalAbsoluteRate", getTempBasalAbsoluteRate()); extended.put("TempBasalStart", getTempBasal().timeStart.toLocaleString()); @@ -718,9 +722,9 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints int agoMin = (int) (agoMsec / 60d / 1000d); ret += "LastConn: " + agoMin + " minago\n"; } - if (getDanaRPump().lastBolusTime.getTime() != 0) { - ret += "LastBolus: " + DecimalFormatter.to2Decimal(getDanaRPump().lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", getDanaRPump().lastBolusTime) + "\n"; - } +// if (getDanaRPump().lastBolusTime.getTime() != 0) { +// ret += "LastBolus: " + DecimalFormatter.to2Decimal(getDanaRPump().lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", getDanaRPump().lastBolusTime) + "\n"; +// } if (isRealTempBasalInProgress()) { ret += "Temp: " + getRealTempBasal().toString() + "\n"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java index 9f0f20e070..c7247035ac 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java @@ -22,6 +22,11 @@ public class DanaRKoreanPump { public static final int UNITS_MGDL = 0; public static final int UNITS_MMOL = 1; + public static final int DELIVERY_PRIME = 0x01; + public static final int DELIVERY_STEP_BOLUS = 0x02; + public static final int DELIVERY_BASAL = 0x04; + public static final int DELIVERY_EXT_BOLUS = 0x08; + public static final String PROFILE_PREFIX = "DanaR-"; public Date lastConnection = new Date(0); @@ -35,21 +40,23 @@ public class DanaRKoreanPump { public int password = -1; public Date pumpTime = new Date(0); + public static final int DOMESTIC_MODEL = 0x01; + public static final int EXPORT_MODEL = 0x03; + public int model; + public int protocol; + public int productCode; + // Status - public boolean pumpSuspended; - public boolean calculatorEnabled; public double dailyTotalUnits; public int maxDailyTotalUnits; + public double bolusStep; + public double iob; public double reservoirRemainingUnits; public int batteryRemaining; - public boolean bolusBlocked; - public Date lastBolusTime = new Date(0); - public double lastBolusAmount; - public double currentBasal; public boolean isTempBasalInProgress; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRHistoryActivity.java index 3c49df5229..3346dd94e8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRHistoryActivity.java @@ -42,10 +42,10 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.DanaR.History.DanaRNSHistorySync; +import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRSyncStatus; import info.nightscout.androidaps.plugins.DanaRKorean.Services.ExecutionService; -import info.nightscout.androidaps.plugins.DanaRKorean.comm.RecordTypes; import info.nightscout.client.data.NSProfile; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.ToastUtils; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/SerialIOThread.java new file mode 100644 index 0000000000..ed53de2815 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/SerialIOThread.java @@ -0,0 +1,224 @@ +package info.nightscout.androidaps.plugins.DanaRKorean; + +import android.bluetooth.BluetoothSocket; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaRKorean.comm.MessageHashTable; +import info.nightscout.utils.CRC; + +/** + * Created by mike on 17.07.2016. + */ +public class SerialIOThread extends Thread { + private static Logger log = LoggerFactory.getLogger(SerialIOThread.class); + + private InputStream mInputStream = null; + private OutputStream mOutputStream = null; + private BluetoothSocket mRfCommSocket; + + private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); + private static ScheduledFuture scheduledDisconnection = null; + + private boolean mKeepRunning = true; + private byte[] mReadBuff = new byte[0]; + + MessageBase processedMessage; + + public SerialIOThread(BluetoothSocket rfcommSocket) { + super(SerialIOThread.class.toString()); + + mRfCommSocket = rfcommSocket; + try { + mOutputStream = mRfCommSocket.getOutputStream(); + mInputStream = mRfCommSocket.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + this.start(); + } + + @Override + public final void run() { + try { + while (mKeepRunning) { + int availableBytes = mInputStream.available(); + // Ask for 1024 byte (or more if available) + byte[] newData = new byte[Math.max(1024, availableBytes)]; + int gotBytes = mInputStream.read(newData); + // When we are here there is some new data available + appendToBuffer(newData, gotBytes); + + // process all messages we already got + while (mReadBuff.length > 3) { // 3rd byte is packet size. continue only if we an determine packet size + byte[] extractedBuff = cutMessageFromBuffer(); + if (extractedBuff == null) break; // message is not complete in buffer (wrong packet calls disconnection) + + int command = (extractedBuff[5] & 0xFF) | ((extractedBuff[4] << 8) & 0xFF00); + + MessageBase message; + if (processedMessage != null && processedMessage.getCommand() == command) { + message = processedMessage; + } else { + // get it from hash table + message = MessageHashTable.findMessage(command); + } + + if (Config.logDanaMessageDetail) + log.debug("<<<<< " + message.getMessageName() + " " + message.toHexString(extractedBuff)); + + // process the message content + message.received = true; + message.handleMessage(extractedBuff); + synchronized (message) { + message.notify(); + } + scheduleDisconnection(); + } + } + } catch (Exception e) { + if (Config.logDanaSerialEngine && e.getMessage().indexOf("bt socket closed") < 0) + log.error("Thread exception: ", e); + mKeepRunning = false; + } + disconnect("EndOfLoop"); + } + + void appendToBuffer(byte[] newData, int gotBytes) { + // add newData to mReadBuff + byte[] newReadBuff = new byte[mReadBuff.length + gotBytes]; + System.arraycopy(mReadBuff, 0, newReadBuff, 0, mReadBuff.length); + System.arraycopy(newData, 0, newReadBuff, mReadBuff.length, gotBytes); + mReadBuff = newReadBuff; + } + + byte[] cutMessageFromBuffer() { + if (mReadBuff[0] == (byte) 0x7E && mReadBuff[1] == (byte) 0x7E) { + int length = (mReadBuff[2] & 0xFF) + 7; + // Check if we have enough data + if (mReadBuff.length < length) { + return null; + } + if (mReadBuff[length - 2] != (byte) 0x2E || mReadBuff[length - 1] != (byte) 0x2E) { + log.error("wrong packet lenght=" + length + " data " + MessageBase.toHexString(mReadBuff)); + disconnect("wrong packet"); + return null; + } + + short crc = CRC.getCrc16(mReadBuff, 3, length - 7); + byte crcByte0 = (byte) (crc >> 8 & 0xFF); + byte crcByte1 = (byte) (crc & 0xFF); + + byte crcByte0received = mReadBuff[length - 4]; + byte crcByte1received = mReadBuff[length - 3]; + + if (crcByte0 != crcByte0received || crcByte1 != crcByte1received) { + log.error("CRC Error" + String.format("%02x ", crcByte0) + String.format("%02x ", crcByte1) + String.format("%02x ", crcByte0received) + String.format("%02x ", crcByte1received)); + disconnect("crc error"); + return null; + } + // Packet is verified here. extract data + byte[] extractedBuff = new byte[length]; + System.arraycopy(mReadBuff, 0, extractedBuff, 0, length); + // remove extracted data from read buffer + byte[] unprocessedData = new byte[mReadBuff.length - length]; + System.arraycopy(mReadBuff, length, unprocessedData, 0, unprocessedData.length); + mReadBuff = unprocessedData; + return extractedBuff; + } else { + log.error("Wrong beginning of packet len=" + mReadBuff.length + " " + MessageBase.toHexString(mReadBuff)); + disconnect("Wrong beginning of packet"); + return null; + } + } + + public synchronized void sendMessage(MessageBase message) { + if (!mRfCommSocket.isConnected()) { + log.error("Socket not connected on sendMessage"); + return; + } + processedMessage = message; + + byte[] messageBytes = message.getRawMessageBytes(); + if (Config.logDanaSerialEngine) + log.debug(">>>>> " + message.getMessageName() + " " + message.toHexString(messageBytes)); + + try { + mOutputStream.write(messageBytes); + } catch (Exception e) { + log.error("sendMessage write exception: ", e); + e.printStackTrace(); + } + + synchronized (message) { + try { + message.wait(5000); + } catch (InterruptedException e) { + log.error("sendMessage InterruptedException", e); + e.printStackTrace(); + } + } + + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + if (!message.received) { + log.warn("Reply not received " + message.getMessageName()); + } + scheduleDisconnection(); + } + + public void scheduleDisconnection() { + class DisconnectRunnable implements Runnable { + public void run() { + disconnect("scheduleDisconnection"); + scheduledDisconnection = null; + } + } + // prepare task for execution in 5 sec + // cancel waiting task to prevent sending multiple disconnections + if (scheduledDisconnection != null) + scheduledDisconnection.cancel(false); + Runnable task = new DisconnectRunnable(); + final int sec = 5; + scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS); + } + + public void disconnect(String reason) { + mKeepRunning = false; + try { + mInputStream.close(); + } catch (Exception e) { + if (Config.logDanaSerialEngine) log.debug(e.getMessage()); + } + try { + mOutputStream.close(); + } catch (Exception e) { + if (Config.logDanaSerialEngine) log.debug(e.getMessage()); + } + try { + mRfCommSocket.close(); + } catch (Exception e) { + if (Config.logDanaSerialEngine) log.debug(e.getMessage()); + } + try { + System.runFinalization(); + } catch (Exception e) { + if (Config.logDanaSerialEngine) log.debug(e.getMessage()); + } + if (Config.logDanaSerialEngine) log.debug("Disconnected: " + reason); + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/Services/ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/Services/ExecutionService.java index 40e7808271..96ef699c21 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/Services/ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/Services/ExecutionService.java @@ -31,13 +31,14 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.plugins.DanaR.SerialIOThread; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRBolusStart; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRNewStatus; import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump; +import info.nightscout.androidaps.plugins.DanaRKorean.SerialIOThread; import info.nightscout.androidaps.plugins.DanaRKorean.comm.*; import info.nightscout.client.data.NSProfile; import info.nightscout.utils.SafeParse; @@ -139,6 +140,11 @@ public class ExecutionService extends Service { return connectionInProgress; } + public void disconnect(String from) { + if (mSerialIOThread != null) + mSerialIOThread.disconnect(from); + } + public void connect(String from) { if (danaRKoreanPump.password != -1 && danaRKoreanPump.password != SafeParse.stringToInt(SP.getString("danar_password", "-1"))) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); @@ -229,25 +235,23 @@ public class ExecutionService extends Service { private boolean getPumpStatus() { try { - MsgStatus statusMsg = new MsgStatus(); + //MsgStatus statusMsg = new MsgStatus(); MsgStatusBasic statusBasicMsg = new MsgStatusBasic(); MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(); MsgStatusBolusExtended exStatusMsg = new MsgStatusBolusExtended(); + mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); // TODO: show it somewhere mSerialIOThread.sendMessage(tempStatusMsg); // do this before statusBasic because here is temp duration mSerialIOThread.sendMessage(exStatusMsg); - mSerialIOThread.sendMessage(statusMsg); + //mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); // TODO: show it somewhere - if (danaRKoreanPump.isNewPump) { - mSerialIOThread.sendMessage(new MsgCheckValue()); - } + mSerialIOThread.sendMessage(new MsgCheckValue()); - if (!statusMsg.received) { - mSerialIOThread.sendMessage(statusMsg); - } +// if (!statusMsg.received) { +// mSerialIOThread.sendMessage(statusMsg); +// } if (!statusBasicMsg.received) { mSerialIOThread.sendMessage(statusBasicMsg); } @@ -261,7 +265,7 @@ public class ExecutionService extends Service { } // Check we have really current status of pump - if (!statusMsg.received || !statusBasicMsg.received || !tempStatusMsg.received || !exStatusMsg.received) { + if (/*!statusMsg.received || */!statusBasicMsg.received || !tempStatusMsg.received || !exStatusMsg.received) { waitMsec(10 * 1000); log.debug("getPumpStatus failed"); return false; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MessageOriginalNames.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MessageOriginalNames.java deleted file mode 100644 index 513e7dfcb9..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MessageOriginalNames.java +++ /dev/null @@ -1,163 +0,0 @@ -package info.nightscout.androidaps.plugins.DanaRKorean.comm; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; - -/** - * Created by mike on 28.05.2016. - */ -public class MessageOriginalNames { - private static Logger log = LoggerFactory.getLogger(MessageOriginalNames.class); - - public static HashMap messageNames; - - static { - messageNames = new HashMap(); - - messageNames.put(0x3001, "CMD_CONNECT"); - messageNames.put(0x3002, "CMD_DISCONNECT"); - - messageNames.put(0x3101, "CMD_HISTORY_MEAL_INS"); - messageNames.put(0x3102, "CMD_HISTORY_DAY_INS"); - messageNames.put(0x3103, "CMD_HISTORY_AIR_SUB"); - messageNames.put(0x3104, "CMD_HISTORY_GLUCOSE"); - messageNames.put(0x3105, "CMD_HISTORY_ALARM"); - messageNames.put(0x3106, "CMD_HISTORY_ERROR"); - messageNames.put(0x3107, "CMD_HISTORY_CARBOHY"); - messageNames.put(0x3108, "CMD_HISTORY_REFILL"); - messageNames.put(0x3109, "CMD_HISTORY_SUSPEND"); - messageNames.put(0x310a, "CMD_HISTORY_BASAL_HOUR"); - messageNames.put(0x310b, "CMD_HISTORY_TB"); - messageNames.put(0x31f1, "CMD_HISTORY_STOP"); - messageNames.put(0x31f2, "CMD_HISTORY_LAST_T_R"); - messageNames.put(0x31f3, "CMD_HISTORY_LAST_T_S"); - - messageNames.put(0x0501, "CMD_HISPAGE_MEAL_INS"); - messageNames.put(0x0502, "CMD_HISPAGE_DAY_INS"); - messageNames.put(0x0503, "CMD_HISPAGE_AIR_SUB"); - messageNames.put(0x0504, "CMD_HISPAGE_GLUCOSE"); - messageNames.put(0x0505, "CMD_HISPAGE_ALARM"); - messageNames.put(0x0506, "CMD_HISPAGE_ERROR"); - messageNames.put(0x0507, "CMD_HISPAGE_CARBOHY"); - messageNames.put(0x0508, "CMD_HISPAGE_REFILL"); - messageNames.put(0x050a, "CMD_HISPAGE_DAILTY_PRE_DATA"); - messageNames.put(0x050b, "CMD_HISPAGE_BOLUS_AVG"); - messageNames.put(0x050c, "CMD_HISPAGE_BASAL_RECORD"); - messageNames.put(0x050d, "CMD_HISPAGE_TB"); - - messageNames.put(0x3201, "CMD_SETTING_V_MEAL_INS_I"); - messageNames.put(0x3202, "CMD_SETTING_V_BASAL_INS_I"); - messageNames.put(0x3203, "CMD_SETTING_V_MEAL_SETTING_I"); - messageNames.put(0x3204, "CMD_SETTING_V_CCC_I"); - messageNames.put(0x3205, "CMD_SETTING_V_MAX_VALUE_I"); - messageNames.put(0x3206, "CMD_SETTING_V_BASAL_PROFILE_ALL"); - messageNames.put(0x3207, "CMD_SETTING_V_SHIPPING_I"); - messageNames.put(0x3208, "CMD_SETTING_V_CLOGGIN_SENS_I"); - messageNames.put(0x3209, "CMD_SETTING_V_GLUCOSEandEASY"); - messageNames.put(0x320a, "CMD_SETTING_V_TIME_I"); - messageNames.put(0x320b, "CMD_SETTING_V_USER_OPTIONS"); - messageNames.put(0x320c, "CMD_SETTING_V_PROFILE_NUMBER"); - messageNames.put(0x320d, "CMD_SETTING_V_CIR_CF_VALUE"); - - messageNames.put(0x3301, "CMD_SETTING_MEAL_INS_S"); - messageNames.put(0x3302, "CMD_SETTING_Based_INS_S"); - messageNames.put(0x3303, "CMD_SETTING_MEAL_SETTING_S"); - messageNames.put(0x3304, "CMD_SETTING_CCC_S"); - messageNames.put(0x3305, "CMD_SETTING_MAX_VALUE_S"); - messageNames.put(0x3306, "CMD_SETTING_BASAL_PROFILE_S"); - messageNames.put(0x3307, "CMD_SETTING_SHIPPING_S"); - messageNames.put(0x3308, "CMD_SETTING_CLOGGIN_SENS_S"); - messageNames.put(0x3309, "CMD_SETTING_GLUCOSEandEASY_S"); - messageNames.put(0x330a, "CMD_SETTING_TIME_S"); - messageNames.put(0x330b, "CMD_SETTING_USER_OPTIONS_S"); - messageNames.put(0x330c, "CMD_SETTING_PROFILE_NUMBER_S"); - messageNames.put(0x330d, "CMD_SETTING_CIR_CF_VALUE_S"); - - messageNames.put(0x0101, "CMD_MEALINS_STOP"); - messageNames.put(0x0102, "CMD_MEALINS_START_DATA"); - messageNames.put(0x0103, "CMD_MEALINS_START_NODATA"); - messageNames.put(0x0104, "CMD_MEALINS_START_DATA_SPEED"); - messageNames.put(0x0105, "CMD_MEALINS_START_NODATA_SPEED"); - - messageNames.put(0x0201, "CMD_PUMP_ACT_INS_VALUE"); - messageNames.put(0x0202, "CMD_PUMP_THIS_REMAINDER_MEAL_INS"); - messageNames.put(0x0203, "CMD_PUMP_BASE_SET"); - messageNames.put(0x0204, "CMD_PUMP_CALCULATION_SETTING"); - messageNames.put(0x0205, "CMD_PUMP_EXERCISE_MODE"); - messageNames.put(0x0206, "CMD_PUMP_MEAL_INS_I"); - - messageNames.put(0x0207, "CMD_PUMP_EXPANS_INS_I"); - messageNames.put(0x0208, "CMD_PUMP_EXPANS_INS_RQ"); - - messageNames.put(0x0209, "CMD_PUMP_DUAL_INS_RQ"); - messageNames.put(0x020a, "CMD_PUMP_INITVIEW_I"); - messageNames.put(0x020b, "CMD_PUMP_STATUS"); - messageNames.put(0x020c, "CMD_PUMP_CAR_N_CIR"); - - messageNames.put(0x0301, "CMD_PUMPINIT_TIME_INFO"); - messageNames.put(0x0302, "CMD_PUMPINIT_BOLUS_INFO"); - messageNames.put(0x0303, "CMD_PUMPINIT_INIT_INFO"); - messageNames.put(0x0304, "CMD_PUMPINIT_OPTION"); - - messageNames.put(0x0401, "CMD_PUMPSET_EXERCISE_S"); - messageNames.put(0x0402, "CMD_PUMPSET_HIS_S"); - messageNames.put(0x0403, "CMD_PUMPSET_EXERCISE_STOP"); - - messageNames.put(0x0404, "CMD_PUMPSET_PAUSE"); - messageNames.put(0x0405, "CMD_PUMPSET_PAUSE_STOP"); - - messageNames.put(0x0406, "CMD_PUMPSET_EXPANS_INS_STOP"); - messageNames.put(0x0407, "CMD_PUMPSET_EXPANS_INS_S"); - - messageNames.put(0x0408, "CMD_PUMPSET_DUAL_S"); - messageNames.put(0x0409, "CMD_PUMPSET_EASY_OFF"); - - - messageNames.put(0x0601, "CMD_PUMPOWAY_SYSTEM_STATUS"); - messageNames.put(0x0602, "CMD_PUMPOWAY_GLUCOSE_ALARM"); - messageNames.put(0x0603, "CMD_PUMPOWAY_LOW_INSULIN_ALARM"); - messageNames.put(0x0610, "CMD_PUMP_ALARM_TIEOUT"); - - messageNames.put(0x0701, "CMD_MSGRECEP_TAKE_SUGAR"); - messageNames.put(0x0702, "CMD_MSGRECEP_GO_TO_DOCTOR"); - messageNames.put(0x0703, "CMD_MSGRECEP_CALL_TO_CAREGIVER"); - messageNames.put(0x0704, "CMD_MSGRECEP_CHECK_GLUCOSE_AGAIN"); - messageNames.put(0x0705, "CMD_MSGRECEP_CALL_TO_HOME"); - messageNames.put(0x0706, "CMD_MSGRECEP_DO_DELIVER"); - - messageNames.put(0x0801, "CMD_MSGSEND_YES_I_DO"); - messageNames.put(0x0802, "CMD_MSGSEND_NO_I_CANNOT"); - messageNames.put(0x0803, "CMD_MSGSEND_CALL_TO_ME_MOM"); - messageNames.put(0x0804, "CMD_MSGSEND_DO_NOT_INFUSE"); - - messageNames.put(0x0901, "CMD_FILL_REFILL_COUNT"); - messageNames.put(0x0902, "CMD_FILL_PRIME_CHECK"); - messageNames.put(0x0903, "CMD_FILL_PRIME_END"); - messageNames.put(0x0904, "CMD_FILL_PRIME_STOP"); - messageNames.put(0x0905, "CMD_FILL_PRIME_PAUSE"); - messageNames.put(0x0906, "CMD_FILL_PRIME_RATE"); - - messageNames.put(0x41f2, "CMD_HISTORY_ALL"); - messageNames.put(0x42f2, "CMD_HISTORY_NEW"); - - messageNames.put(0x41f1, "CMD_HISTORY_ALL_DONE"); - messageNames.put(0x42f1, "CMD_HISTORY_NEW_DONE"); - - messageNames.put(0xF0F1, "CMD_PUMP_CHECK_VALUE"); - messageNames.put(0xF0F2, "CMD_PUMP_TIMECHANGE_CHECK"); - messageNames.put(0xF0F3, "CMD_PUMP_TIMECHANGE_CLEAR"); - messageNames.put(0x43F2, "CMD_HISTORY_DATEOVER_ALL"); - messageNames.put(0x4300, "CMD_HISTORY_DATEOVER_DONE"); - } - - public static String getName(Integer command) { - if (messageNames.containsKey(command)) - return messageNames.get(command); - else { - log.debug("Unknown command: " + String.format("%04X", command)); - return "UNKNOWN_COMMAND"; - } - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgCheckValue.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgCheckValue.java index e0fadbf148..0a9ea6f2aa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgCheckValue.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgCheckValue.java @@ -4,7 +4,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump; +import info.nightscout.utils.ToastUtils; /** * Created by mike on 30.06.2016. @@ -18,15 +23,22 @@ public class MsgCheckValue extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a = intFromBuff(bytes, 0, 1); - int b = intFromBuff(bytes, 1, 1); - if (a != 3 || b <= 0) { - // another message will follow - } else { + DanaRKoreanPump pump = DanaRKoreanPlugin.getDanaRPump(); + pump.model = intFromBuff(bytes, 0, 1); + pump.protocol = intFromBuff(bytes, 1, 1); + pump.productCode = intFromBuff(bytes, 2, 1); + if (pump.model != DanaRKoreanPump.DOMESTIC_MODEL) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.wrongpumpdriverselected), R.raw.error); + ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).doDisconnect("Wrong Model"); + log.debug("Wrong model selected"); + } + + if (Config.logDanaMessageDetail) { + log.debug("Model: " + String.format("%02X ", pump.model)); + log.debug("Protocol: " + String.format("%02X ", pump.protocol)); + log.debug("Product Code: " + String.format("%02X ", pump.productCode)); } - if (Config.logDanaMessageDetail) - log.debug("Response: " + String.format("%02X ", a) + String.format("%02X ", b)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgHistoryAll.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgHistoryAll.java index 88aff8ff9b..4b642c5bc9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgHistoryAll.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgHistoryAll.java @@ -12,6 +12,7 @@ import java.util.Date; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRSyncStatus; public class MsgHistoryAll extends MessageBase { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java index 699bdff968..379a558bea 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java @@ -3,7 +3,10 @@ package info.nightscout.androidaps.plugins.DanaRKorean.comm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump; public class MsgInitConnStatusBasic extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusBasic.class); @@ -14,25 +17,21 @@ public class MsgInitConnStatusBasic extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a = intFromBuff(bytes, 0, 1); - int b = intFromBuff(bytes, 1, 1); - int c = intFromBuff(bytes, 2, 1); - int d = intFromBuff(bytes, 3, 1); - int e = intFromBuff(bytes, 4, 1); - int f = intFromBuff(bytes, 5, 1); - int g = intFromBuff(bytes, 6, 1); - int h = intFromBuff(bytes, 7, 1); - int i = intFromBuff(bytes, 8, 1); - int j = intFromBuff(bytes, 9, 1); - int k = intFromBuff(bytes, 10, 1); - int l = intFromBuff(bytes, 11, 1); - int m = intFromBuff(bytes, 12, 1); - int n = intFromBuff(bytes, 13, 1); - int o; - try { - o = intFromBuff(bytes, 21, 1); - } catch (Exception ex) { - o = 0; + if (bytes.length - 10 > 6) { + return; + } + DanaRKoreanPump pump = DanaRKoreanPlugin.getDanaRPump(); + int isStatusSuspendOn = intFromBuff(bytes, 0, 1); + int isUtilityEnable = intFromBuff(bytes, 1, 1); + int isEasyUIEnable = intFromBuff(bytes, 2, 1); + int easyUIMode = intFromBuff(bytes, 3, 1); + pump.password = intFromBuff(bytes, 4, 2) ^ 0x3463; + if (Config.logDanaMessageDetail) { + log.debug("isStatusSuspendOn: " + isStatusSuspendOn); + log.debug("isUtilityEnable: " + isUtilityEnable); + log.debug("isEasyUIEnable: " + isEasyUIEnable); + log.debug("easyUIMode: " + easyUIMode); + log.debug("Pump password: " + pump.password); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBolus.java index 5b0e10f577..1af0e1f224 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBolus.java @@ -3,7 +3,10 @@ package info.nightscout.androidaps.plugins.DanaRKorean.comm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump; /** * Created by mike on 28.05.2016. @@ -17,10 +20,29 @@ public class MsgInitConnStatusBolus extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int a1 = intFromBuff(bytes, 0, 1); - int a2 = intFromBuff(bytes, 1, 1); - int c = intFromBuff(bytes, 8, 2); - int d = c / 100; - int e = intFromBuff(bytes, 10, 2); + if (bytes.length - 10 < 13) { + return; + } + DanaRKoreanPump pump = DanaRKoreanPlugin.getDanaRPump(); + int bolusConfig = intFromBuff(bytes, 0, 1); + boolean deliveryPrime = (bolusConfig & DanaRKoreanPump.DELIVERY_PRIME) != 0; + boolean deliveryStepBolus = (bolusConfig & DanaRKoreanPump.DELIVERY_STEP_BOLUS) != 0; + boolean deliveryBasal = (bolusConfig & DanaRKoreanPump.DELIVERY_BASAL) != 0; + boolean deliveryExtBolus = (bolusConfig & DanaRKoreanPump.DELIVERY_EXT_BOLUS) != 0; + + pump.bolusStep = intFromBuff(bytes, 1, 1) / 100d; + pump.maxBolus = intFromBuff(bytes, 2, 2) / 100d; + //int bolusRate = intFromBuff(bytes, 4, 8); + int deliveryStatus = intFromBuff(bytes, 12, 1); + + if (Config.logDanaMessageDetail) { + log.debug("Delivery prime: " + deliveryPrime); + log.debug("Delivery step bolus: " + deliveryStepBolus); + log.debug("Delivery basal: " + deliveryBasal); + log.debug("Delivery ext bolus: " + deliveryExtBolus); + log.debug("Bolus increment: " + pump.bolusStep); + log.debug("Bolus max: " + pump.maxBolus); + log.debug("Delivery status: " + deliveryStatus); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusTime.java index be835bbaa8..ee12e1688e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusTime.java @@ -6,7 +6,14 @@ import org.slf4j.LoggerFactory; import java.util.Date; import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventRefreshGui; +import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; +import info.nightscout.utils.ToastUtils; public class MsgInitConnStatusTime extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusTime.class); @@ -17,9 +24,32 @@ public class MsgInitConnStatusTime extends MessageBase { @Override public void handleMessage(byte[] bytes) { - Date time = dateTimeSecFromBuff(bytes, 0); - if (Config.logDanaMessageDetail) + if (bytes.length - 10 < 10) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.wrongpumpdriverselected), R.raw.error); + ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).doDisconnect("Wrong Model"); + log.debug("Wrong model selected. Switching to export DanaR"); + ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setFragmentEnabled(PluginBase.PUMP, false); + ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setFragmentVisible(PluginBase.PUMP, false); + ((DanaRPlugin)MainApp.getSpecificPlugin(DanaRPlugin.class)).setFragmentEnabled(PluginBase.PUMP, true); + ((DanaRPlugin)MainApp.getSpecificPlugin(DanaRPlugin.class)).setFragmentVisible(PluginBase.PUMP, true); + MainApp.getConfigBuilder().storeSettings(); + MainApp.bus().post(new EventRefreshGui(false)); + return; + } + + Date time = dateTimeSecFromBuff(bytes, 0); + int versionCode1 = intFromBuff(bytes, 6, 1); + int versionCode2 = intFromBuff(bytes, 7, 1); + int versionCode3 = intFromBuff(bytes, 8, 1); + int versionCode4 = intFromBuff(bytes, 9, 1); + + if (Config.logDanaMessageDetail) { log.debug("Pump time: " + time); + log.debug("Version code1: " + versionCode1); + log.debug("Version code2: " + versionCode2); + log.debug("Version code3: " + versionCode3); + log.debug("Version code4: " + versionCode4); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSetCarbsEntry.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSetCarbsEntry.java index 2adfab7ca6..2b6ad9adf4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSetCarbsEntry.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSetCarbsEntry.java @@ -7,6 +7,7 @@ import java.util.Calendar; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; +import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes; public class MsgSetCarbsEntry extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgSetCarbsEntry.class); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasal.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasal.java index e6ac4b9003..c2ae8a7732 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasal.java @@ -25,7 +25,7 @@ public class MsgSettingBasal extends MessageBase { for (int index = 0; index < 24; index++) { int basal = intFromBuff(bytes, 2 * index, 2); if (basal < 10) basal = 0; - pump.pumpProfiles[pump.activeProfile][index] = basal / 100d; + pump.pumpProfiles[pump.activeProfile][index] = basal / 100 / 24d; // in units/day } if (Config.logDanaMessageDetail) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasalProfileAll.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasalProfileAll.java index 2856b8dea9..9397ed86c6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasalProfileAll.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingBasalProfileAll.java @@ -32,7 +32,7 @@ public class MsgSettingBasalProfileAll extends MessageBase { for (int index = 0; index < 48; index++) { int basal = intFromBuff(bytes, 107 * profile + 2 * index + 1, 2); if (basal < 10) basal = 0; - pump.pumpProfiles[position][index] = basal / 100d; + pump.pumpProfiles[position][index] = basal / 100 / 24d; // in units/day } } } else { @@ -45,7 +45,7 @@ public class MsgSettingBasalProfileAll extends MessageBase { int basal = intFromBuff(bytes, 59 * profile + 2 * index + 1, 2); if (basal < 10) basal = 0; log.debug("position " + position + " index " + index); - pump.pumpProfiles[position][index] = basal / 100d; + pump.pumpProfiles[position][index] = basal / 100 / 24d; // in units/day } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingShippingInfo.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingShippingInfo.java index 53184cd85f..4d10aef389 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingShippingInfo.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgSettingShippingInfo.java @@ -8,6 +8,7 @@ import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase; import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump; /** * Created by mike on 05.07.2016. @@ -20,17 +21,18 @@ public class MsgSettingShippingInfo extends MessageBase { } public void handleMessage(byte[] bytes) { - DanaRKoreanPlugin.getDanaRPump().serialNumber = stringFromBuff(bytes, 0, 10); - DanaRKoreanPlugin.getDanaRPump().shippingDate = dateFromBuff(bytes, 10); - DanaRKoreanPlugin.getDanaRPump().shippingCountry = asciiStringFromBuff(bytes, 13, 3); - if (DanaRKoreanPlugin.getDanaRPump().shippingDate.getTime() > new Date(116, 4, 1).getTime()) { - DanaRKoreanPlugin.getDanaRPump().isNewPump = true; + DanaRKoreanPump pump = DanaRKoreanPlugin.getDanaRPump(); + pump.serialNumber = stringFromBuff(bytes, 0, 10); + pump.shippingDate = dateFromBuff(bytes, 10); + pump.shippingCountry = asciiStringFromBuff(bytes, 13, 3); + if (pump.shippingDate.getTime() > new Date(116, 4, 1).getTime()) { + pump.isNewPump = true; } else - DanaRKoreanPlugin.getDanaRPump().isNewPump = false; + pump.isNewPump = false; if (Config.logDanaMessageDetail) { - log.debug("Serial number: " + DanaRKoreanPlugin.getDanaRPump().serialNumber); - log.debug("Shipping date: " + DanaRKoreanPlugin.getDanaRPump().shippingDate); - log.debug("Shipping country: " + DanaRKoreanPlugin.getDanaRPump().shippingCountry); + log.debug("Serial number: " + pump.serialNumber); + log.debug("Shipping date: " + pump.shippingDate); + log.debug("Shipping country: " + pump.shippingCountry); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatus.java index 3dcd6a71bd..bb4adaa58e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatus.java @@ -20,10 +20,10 @@ public class MsgStatus extends MessageBase { DanaRKoreanPlugin.getDanaRPump().extendedBolusMinutes = intFromBuff(bytes, 4, 2); DanaRKoreanPlugin.getDanaRPump().extendedBolusAmount = intFromBuff(bytes, 6, 2) / 100d; Double lastBolusAmount = intFromBuff(bytes, 13, 2) / 100d; - if (lastBolusAmount != 0d) { - DanaRKoreanPlugin.getDanaRPump().lastBolusTime = dateTimeFromBuff(bytes, 8); - DanaRKoreanPlugin.getDanaRPump().lastBolusAmount = lastBolusAmount; - } +// if (lastBolusAmount != 0d) { +// DanaRKoreanPlugin.getDanaRPump().lastBolusTime = dateTimeFromBuff(bytes, 8); +// DanaRKoreanPlugin.getDanaRPump().lastBolusAmount = lastBolusAmount; +// } DanaRKoreanPlugin.getDanaRPump().iob = intFromBuff(bytes, 15, 2) / 100d; if (Config.logDanaMessageDetail) { @@ -31,8 +31,8 @@ public class MsgStatus extends MessageBase { log.debug("Is extended bolus running: " + DanaRKoreanPlugin.getDanaRPump().isExtendedInProgress); log.debug("Extended bolus min: " + DanaRKoreanPlugin.getDanaRPump().extendedBolusMinutes); log.debug("Extended bolus amount: " + DanaRKoreanPlugin.getDanaRPump().extendedBolusAmount); - log.debug("Last bolus time: " + DanaRKoreanPlugin.getDanaRPump().lastBolusTime); - log.debug("Last bolus amount: " + DanaRKoreanPlugin.getDanaRPump().lastBolusAmount); +// log.debug("Last bolus time: " + DanaRKoreanPlugin.getDanaRPump().lastBolusTime); +// log.debug("Last bolus amount: " + DanaRKoreanPlugin.getDanaRPump().lastBolusAmount); log.debug("IOB: " + DanaRKoreanPlugin.getDanaRPump().iob); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBasic.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBasic.java index 7f4745dd18..2d45754ce3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBasic.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBasic.java @@ -16,41 +16,23 @@ public class MsgStatusBasic extends MessageBase { } public void handleMessage(byte[] bytes) { - boolean pumpSuspended = intFromBuff(bytes, 0, 1) == 1; - boolean calculatorEnabled = intFromBuff(bytes, 1, 1) == 1; - double dailyTotalUnits = intFromBuff(bytes, 2, 3) / 750d; - int maxDailyTotalUnits = intFromBuff(bytes, 5, 2) / 100; - double reservoirRemainingUnits = intFromBuff(bytes, 7, 3) / 750d; - boolean bolusBlocked = intFromBuff(bytes, 10, 1) == 1; - double currentBasal = intFromBuff(bytes, 11, 2) / 100d; - int tempBasalPercent = intFromBuff(bytes, 13, 1); - boolean isExtendedInProgress = intFromBuff(bytes, 14, 1) == 1; - boolean isTempBasalInProgress = intFromBuff(bytes, 15, 1) == 1; - int batteryRemaining = intFromBuff(bytes, 20, 1); + double currentBasal = intFromBuff(bytes, 0, 2) / 100 / 24d; // in units/day + int batteryRemaining = intFromBuff(bytes, 2, 1); + double reservoirRemainingUnits = intFromBuff(bytes, 3, 3) / 750d; + double dailyTotalUnits = intFromBuff(bytes, 6, 3) / 750d; + int maxDailyTotalUnits = intFromBuff(bytes, 9, 2) / 100; - DanaRKoreanPlugin.getDanaRPump().pumpSuspended = pumpSuspended; - DanaRKoreanPlugin.getDanaRPump().calculatorEnabled = calculatorEnabled; DanaRKoreanPlugin.getDanaRPump().dailyTotalUnits = dailyTotalUnits; DanaRKoreanPlugin.getDanaRPump().maxDailyTotalUnits = maxDailyTotalUnits; DanaRKoreanPlugin.getDanaRPump().reservoirRemainingUnits = reservoirRemainingUnits; - DanaRKoreanPlugin.getDanaRPump().bolusBlocked = bolusBlocked; DanaRKoreanPlugin.getDanaRPump().currentBasal = currentBasal; - DanaRKoreanPlugin.getDanaRPump().tempBasalPercent = tempBasalPercent; - DanaRKoreanPlugin.getDanaRPump().isExtendedInProgress = isExtendedInProgress; - DanaRKoreanPlugin.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress; DanaRKoreanPlugin.getDanaRPump().batteryRemaining = batteryRemaining; if (Config.logDanaMessageDetail) { - log.debug("Pump suspended: " + pumpSuspended); - log.debug("Calculator enabled: " + calculatorEnabled); log.debug("Daily total units: " + dailyTotalUnits); log.debug("Max daily total units: " + maxDailyTotalUnits); log.debug("Reservoir remaining units: " + reservoirRemainingUnits); - log.debug("Bolus blocked: " + bolusBlocked); log.debug("Current basal: " + currentBasal); - log.debug("Current temp basal percent: " + tempBasalPercent); - log.debug("Is extended bolus running: " + isExtendedInProgress); - log.debug("Is temp basal running: " + isTempBasalInProgress); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBolusExtended.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBolusExtended.java index 8f14f67457..1c740fd960 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBolusExtended.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgStatusBolusExtended.java @@ -30,6 +30,8 @@ public class MsgStatusBolusExtended extends MessageBase { double extendedBolusAmount = intFromBuff(bytes, 2, 2) / 100d; int extendedBolusSoFarInSecs = intFromBuff(bytes, 4, 3); + int extendedBolusDeliveryPulse = intFromBuff(bytes, 7, 2); + int isEasyUIUserSleep = intFromBuff(bytes, 9, 1); int extendedBolusSoFarInMinutes = extendedBolusSoFarInSecs / 60; double extendedBolusAbsoluteRate = isExtendedInProgress ? extendedBolusAmount / extendedBolusMinutes * 60 : 0d; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/RecordTypes.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/RecordTypes.java deleted file mode 100644 index e2574b53cc..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/RecordTypes.java +++ /dev/null @@ -1,19 +0,0 @@ -package info.nightscout.androidaps.plugins.DanaRKorean.comm; - -/** - * Created by mike on 28.05.2016. - */ -public class RecordTypes { - public static final byte RECORD_TYPE_BOLUS = (byte) 0x01; - public static final byte RECORD_TYPE_DAILY = (byte) 0x02; - public static final byte RECORD_TYPE_PRIME = (byte) 0x03; - public static final byte RECORD_TYPE_ERROR = (byte) 0x04; - public static final byte RECORD_TYPE_ALARM = (byte) 0x05; - public static final byte RECORD_TYPE_GLUCOSE = (byte) 0x06; - public static final byte RECORD_TYPE_CARBO = (byte) 0x08; - public static final byte RECORD_TYPE_REFILL = (byte) 0x09; - public static final byte RECORD_TYPE_SUSPEND = (byte) 0x0B; - public static final byte RECORD_TYPE_BASALHOUR = (byte) 0x0C; - public static final byte RECORD_TYPE_TB = (byte) 0x0D; - public static final byte RECORD_TYPE_TEMP_BASAL = (byte) 0x14; -} diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java index 1ab627fd33..0431c0e5d6 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java @@ -27,6 +27,7 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.plugins.DanaR.DanaRFragment; import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService; +import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin; import info.nightscout.utils.ToastUtils; public class KeepAliveReceiver extends BroadcastReceiver { @@ -51,6 +52,18 @@ public class KeepAliveReceiver extends BroadcastReceiver { t.start(); } } + final DanaRKoreanPlugin danaRKoreanPlugin = (DanaRKoreanPlugin) MainApp.getSpecificPlugin(DanaRKoreanPlugin.class); + if (danaRKoreanPlugin != null && Config.DANAR && danaRKoreanPlugin.isEnabled(PluginBase.PUMP)) { + if (danaRKoreanPlugin.getDanaRPump().lastConnection.getTime() + 30 * 60 * 1000L < new Date().getTime() && !danaRKoreanPlugin.isConnected() && !danaRKoreanPlugin.isConnecting()) { + Thread t = new Thread(new Runnable() { + @Override + public void run() { + danaRKoreanPlugin.doConnect("KeepAlive"); + } + }); + t.start(); + } + } wl.release(); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 02dda92323..21e6a2b13e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -376,4 +376,5 @@ Pump Shutdown Pump Battery Discharged DanaR Korean + Wrong pump driver selected diff --git a/wear/wear.iml b/wear/wear.iml index 8a3092b3f4..40a96e0eab 100644 --- a/wear/wear.iml +++ b/wear/wear.iml @@ -43,13 +43,6 @@ - - - - - - - @@ -58,6 +51,13 @@ + + + + + + + @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + @@ -106,14 +106,6 @@ - - - - - - - - @@ -122,6 +114,14 @@ + + + + + + + +