diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index be3c0e5d80..f2338f044e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,9 @@ + diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java index e37a5b4b9f..46e8bc33a2 100644 --- a/app/src/main/java/info/nightscout/androidaps/Constants.java +++ b/app/src/main/java/info/nightscout/androidaps/Constants.java @@ -58,4 +58,7 @@ public class Constants { //Autosens public static final double DEVIATION_TO_BE_EQUAL = 2.0; + + // Pump + public static final int PUMP_MAX_CONNECTION_TIME_IN_SECONDS = 60 - 1; } diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 5e36fffa62..f8b4bcf0f7 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -169,17 +169,14 @@ public class MainApp extends Application { else Answers.getInstance().logCustom(new CustomEvent("AppStart")); - Thread t = new Thread(new Runnable() { + new Thread(new Runnable() { @Override public void run() { SystemClock.sleep(5000); - PumpInterface pump = MainApp.getConfigBuilder(); - if (pump != null) - pump.refreshDataFromPump("Initialization"); + ConfigBuilderPlugin.getCommandQueue().readStatus("Initialization", null); startKeepAliveService(); } - }, "pump-initialization"); - t.start(); + }).start(); } diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/DanaRInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/DanaRInterface.java index abd1d8e304..1c5ee83834 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/DanaRInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/DanaRInterface.java @@ -1,9 +1,12 @@ package info.nightscout.androidaps.interfaces; +import info.nightscout.androidaps.data.PumpEnactResult; + /** * Created by mike on 12.06.2017. */ public interface DanaRInterface { - boolean loadHistory(byte type); + PumpEnactResult loadHistory(byte type); // for history browser + PumpEnactResult loadEvents(); // events history to build treatments from } diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 9da9cb0dd0..a3ada67538 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -16,16 +16,20 @@ public interface PumpInterface { boolean isInitialized(); boolean isSuspended(); boolean isBusy(); + boolean isConnected(); + boolean isConnecting(); + + void connect(String reason); + void disconnect(String reason); + void stopConnecting(); + + void getPumpStatus(); // Upload to pump new basal profile - int SUCCESS = 0; - int FAILED = 1; - int NOT_NEEDED = 2; - int setNewBasalProfile(Profile profile); + PumpEnactResult setNewBasalProfile(Profile profile); boolean isThisProfileSet(Profile profile); Date lastDataTime(); - void refreshDataFromPump(String reason); double getBaseBasalRate(); // base basal rate, not temp basal @@ -36,7 +40,7 @@ public interface PumpInterface { PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes); //some pumps might set a very short temp close to 100% as cancelling a temp can be noisy //when the cancel request is requested by the user (forced), the pump should always do a real cancel - PumpEnactResult cancelTempBasal(boolean force); + PumpEnactResult cancelTempBasal(boolean enforceNew); PumpEnactResult cancelExtendedBolus(); // Status to be passed to NS diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java index 393dc8c64c..18f092966e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java @@ -3,8 +3,6 @@ package info.nightscout.androidaps.plugins.Actions; import android.app.Activity; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; @@ -34,6 +32,7 @@ import info.nightscout.androidaps.plugins.Careportal.CareportalFragment; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; /** * A simple {@link Fragment} subclass. @@ -54,16 +53,8 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL Button tempBasalCancel; Button fill; - private static Handler sHandler; - private static HandlerThread sHandlerThread; - public ActionsFragment() { super(); - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(ActionsFragment.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } } @@ -135,14 +126,15 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL fill.setVisibility(View.GONE); return; } + final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); boolean allowProfileSwitch = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile().getProfileList().size() > 1; - if (!MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || !allowProfileSwitch) + if (!pump.getPumpDescription().isSetBasalProfileCapable || !pump.isInitialized() || pump.isSuspended() || !allowProfileSwitch) profileSwitch.setVisibility(View.GONE); else profileSwitch.setVisibility(View.VISIBLE); - if (!MainApp.getConfigBuilder().getPumpDescription().isExtendedBolusCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) { + if (!pump.getPumpDescription().isExtendedBolusCapable || !pump.isInitialized() || pump.isSuspended() || pump.isFakingTempsByExtendedBoluses()) { extendedBolus.setVisibility(View.GONE); extendedBolusCancel.setVisibility(View.GONE); } else { @@ -158,7 +150,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL } - if (!MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) { + if (!pump.getPumpDescription().isTempBasalCapable || !pump.isInitialized() || pump.isSuspended()) { tempBasal.setVisibility(View.GONE); tempBasalCancel.setVisibility(View.GONE); } else { @@ -173,7 +165,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL } } - if (!MainApp.getConfigBuilder().getPumpDescription().isRefillingCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) + if (!pump.getPumpDescription().isRefillingCapable || !pump.isInitialized() || pump.isSuspended()) fill.setVisibility(View.GONE); else fill.setVisibility(View.VISIBLE); @@ -190,7 +182,6 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL @Override public void onClick(View view) { FragmentManager manager = getFragmentManager(); - final PumpInterface pump = MainApp.getConfigBuilder(); switch (view.getId()) { case R.id.actions_profileswitch: NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog(); @@ -212,24 +203,14 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL break; case R.id.actions_extendedbolus_cancel: if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) { - sHandler.post(new Runnable() { - @Override - public void run() { - pump.cancelExtendedBolus(); - Answers.getInstance().logCustom(new CustomEvent("CancelExtended")); - } - }); + ConfigBuilderPlugin.getCommandQueue().cancelExtended(null); + Answers.getInstance().logCustom(new CustomEvent("CancelExtended")); } break; case R.id.actions_canceltempbasal: if (MainApp.getConfigBuilder().isTempBasalInProgress()) { - sHandler.post(new Runnable() { - @Override - public void run() { - pump.cancelTempBasal(true); - Answers.getInstance().logCustom(new CustomEvent("CancelTemp")); - } - }); + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, null); + Answers.getInstance().logCustom(new CustomEvent("CancelTemp")); } break; case R.id.actions_settempbasal: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java index f6c9d4c3d6..8391f93492 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java @@ -2,9 +2,8 @@ package info.nightscout.androidaps.plugins.Actions.dialogs; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; @@ -27,11 +26,10 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; -import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.Overview.Notification; -import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SP; @@ -48,13 +46,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { NumberPicker editInsulin; - Handler mHandler; - public static HandlerThread mHandlerThread; - public FillDialog() { - mHandlerThread = new HandlerThread(FillDialog.class.getSimpleName()); - mHandlerThread.start(); - this.mHandler = new Handler(mHandlerThread.getLooper()); } @Override @@ -69,7 +61,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); Double maxInsulin = MainApp.getConfigBuilder().applyBolusConstraints(Constants.bolusOnlyForCheckLimit); - double bolusstep = MainApp.getConfigBuilder().getPumpDescription().bolusStep; + double bolusstep = ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep; editInsulin = (NumberPicker) view.findViewById(R.id.treatments_newtreatment_insulinamount); editInsulin.setParams(0d, 0d, maxInsulin, bolusstep, new DecimalFormat("0.00"), false); @@ -158,28 +150,21 @@ public class FillDialog extends DialogFragment implements OnClickListener { builder.setPositiveButton(getString(R.string.primefill), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (finalInsulinAfterConstraints > 0) { - final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.insulin = finalInsulinAfterConstraints; + detailedBolusInfo.context = context; + detailedBolusInfo.source = Source.USER; + detailedBolusInfo.isValid = false; // do not count it in IOB (for pump history) + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { @Override public void run() { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.insulin = finalInsulinAfterConstraints; - detailedBolusInfo.context = context; - detailedBolusInfo.source = Source.USER; - detailedBolusInfo.isValid = false; // do not count it in IOB (for pump history) - PumpEnactResult result = pump.deliverTreatment(detailedBolusInfo); if (!result.success) { - try { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - } catch (WindowManager.BadTokenException | NullPointerException e) { - // window has been destroyed - Notification notification = new Notification(Notification.BOLUS_DELIVERY_ERROR, MainApp.sResources.getString(R.string.treatmentdeliveryerror), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notification)); - } + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } } }); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 0b7445e9e7..d9017fd6a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -2,15 +2,13 @@ package info.nightscout.androidaps.plugins.Actions.dialogs; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.WindowManager; import com.crashlytics.android.answers.Answers; import com.crashlytics.android.answers.CustomEvent; @@ -23,10 +21,9 @@ import java.text.DecimalFormat; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.plugins.Overview.Notification; -import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SafeParse; @@ -36,13 +33,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli NumberPicker editInsulin; NumberPicker editDuration; - Handler mHandler; - public static HandlerThread mHandlerThread; - public NewExtendedBolusDialog() { - mHandlerThread = new HandlerThread(NewExtendedBolusDialog.class.getSimpleName()); - mHandlerThread.start(); - this.mHandler = new Handler(mHandlerThread.getLooper()); } @Override @@ -56,8 +47,8 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli editInsulin = (NumberPicker) view.findViewById(R.id.overview_newextendedbolus_insulin); editInsulin.setParams(0d, 0d, maxInsulin, 0.1d, new DecimalFormat("0.00"), false); - double extendedDurationStep = MainApp.getConfigBuilder().getPumpDescription().extendedBolusDurationStep; - double extendedMaxDuration = MainApp.getConfigBuilder().getPumpDescription().extendedBolusMaxDuration; + double extendedDurationStep = ConfigBuilderPlugin.getActivePump().getPumpDescription().extendedBolusDurationStep; + double extendedMaxDuration = ConfigBuilderPlugin.getActivePump().getPumpDescription().extendedBolusMaxDuration; editDuration = (NumberPicker) view.findViewById(R.id.overview_newextendedbolus_duration); editDuration.setParams(extendedDurationStep, extendedDurationStep, extendedMaxDuration, extendedDurationStep, new DecimalFormat("0"), false); @@ -99,24 +90,15 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli builder.setMessage(confirmMessage); builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - final PumpInterface pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().extendedBolus(finalInsulin, finalDurationInMinutes, new Callback() { @Override public void run() { - PumpEnactResult result = pump.setExtendedBolus(finalInsulin, finalDurationInMinutes); - if (!result.success) { - try { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(context.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(context.getString(R.string.ok), null); - builder.show(); - } catch (WindowManager.BadTokenException | NullPointerException e) { - // window has been destroyed - Notification notification = new Notification(Notification.BOLUS_DELIVERY_ERROR, MainApp.sResources.getString(R.string.treatmentdeliveryerror), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notification)); - } - } + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } }); Answers.getInstance().logCustom(new CustomEvent("ExtendedBolus")); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index 68652b0a8b..e734cd4f96 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -1,11 +1,9 @@ package info.nightscout.androidaps.plugins.Actions.dialogs; -import android.app.Activity; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; @@ -26,9 +24,10 @@ import java.text.DecimalFormat; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.interfaces.PumpDescription; -import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SafeParse; @@ -47,13 +46,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi NumberPicker basalAbsolute; NumberPicker duration; - Handler mHandler; - public static HandlerThread mHandlerThread; - public NewTempBasalDialog() { - mHandlerThread = new HandlerThread(NewTempBasalDialog.class.getSimpleName()); - mHandlerThread.start(); - this.mHandler = new Handler(mHandlerThread.getLooper()); } @Override @@ -70,7 +63,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi absoluteRadio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_absolute_radio); typeSelectorLayout = (LinearLayout) view.findViewById(R.id.overview_newtempbasal_typeselector_layout); - PumpDescription pumpDescription = MainApp.getConfigBuilder().getPumpDescription(); + PumpDescription pumpDescription = ConfigBuilderPlugin.getActivePump().getPumpDescription(); basalPercent = (NumberPicker) view.findViewById(R.id.overview_newtempbasal_basalpercentinput); double maxTempPercent = pumpDescription.maxTempPercent; @@ -143,37 +136,29 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi final Double finalBasal = absolute; final int finalDurationInMinutes = durationInMinutes; - final Context context = getContext(); - AlertDialog.Builder builder = new AlertDialog.Builder(context); + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(this.getContext().getString(R.string.confirmation)); builder.setMessage(confirmMessage); builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - final PumpInterface pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { + Callback callback = new Callback() { @Override public void run() { - PumpEnactResult result; - if (setAsPercent) { - result = pump.setTempBasalPercent(finalBasalPercent, finalDurationInMinutes); - } else { - result = pump.setTempBasalAbsolute(finalBasal, finalDurationInMinutes, true); - } if (!result.success) { - if (context instanceof Activity) { - Activity activity = (Activity) context; - if (activity.isFinishing()) { - return; - } - } - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } } - }); + }; + if (setAsPercent) { + ConfigBuilderPlugin.getCommandQueue().tempBasalPercent(finalBasalPercent, finalDurationInMinutes, callback); + } else { + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(finalBasal, finalDurationInMinutes, true, callback); + } Answers.getInstance().logCustom(new CustomEvent("TempBasal")); } }); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java index 16cfd89404..b284acff91 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java @@ -3,9 +3,8 @@ package info.nightscout.androidaps.plugins.Careportal.Dialogs; import android.app.Activity; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -51,9 +50,10 @@ import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.events.EventNewBasalProfile; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.NumberPicker; @@ -105,10 +105,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick Date eventTime; - private static Handler sHandler; - private static HandlerThread sHandlerThread; - - public void setOptions(OptionsToShow options, int event) { this.options = options; this.event = MainApp.sResources.getString(event); @@ -116,11 +112,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick public NewNSTreatmentDialog() { super(); - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(NewNSTreatmentDialog.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } } @Override @@ -138,7 +129,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - if (options==null) return null; + if (options == null) return null; getDialog().setTitle(getString(options.eventName)); setStyle(DialogFragment.STYLE_NORMAL, getTheme()); View view = inflater.inflate(R.layout.careportal_newnstreatment_dialog, container, false); @@ -203,27 +194,30 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick public void onItemSelected(AdapterView parent, View view, int position, long id) { double defaultDuration = 0; double defaultTarget = 0; - if(profile!=null){ + if (profile != null) { defaultTarget = bg.doubleValue(); } boolean erase = false; - if(MainApp.sResources.getString(R.string.eatingsoon).equals(reasonList.get(position))){ + if (MainApp.sResources.getString(R.string.eatingsoon).equals(reasonList.get(position))) { defaultDuration = SP.getDouble(R.string.key_eatingsoon_duration, 0d); - defaultTarget = SP.getDouble(R.string.key_eatingsoon_target, 0d);; - } else if (MainApp.sResources.getString(R.string.activity).equals(reasonList.get(position))){ - defaultDuration = SP.getDouble(R.string.key_activity_duration, 0d);; - defaultTarget = SP.getDouble(R.string.key_activity_target, 0d);; + defaultTarget = SP.getDouble(R.string.key_eatingsoon_target, 0d); + ; + } else if (MainApp.sResources.getString(R.string.activity).equals(reasonList.get(position))) { + defaultDuration = SP.getDouble(R.string.key_activity_duration, 0d); + ; + defaultTarget = SP.getDouble(R.string.key_activity_target, 0d); + ; } else { defaultDuration = 0; erase = true; } - if(defaultTarget != 0 || erase){ + if (defaultTarget != 0 || erase) { editTemptarget.setValue(defaultTarget); } - if(defaultDuration != 0){ + if (defaultDuration != 0) { editDuration.setValue(defaultDuration); - } else if (erase){ + } else if (erase) { editDuration.setValue(0d); } } @@ -237,7 +231,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick // bg bgUnitsView.setText(units); - TextWatcher bgTextWatcher = new TextWatcher() { + TextWatcher bgTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { } @@ -337,15 +331,15 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick editTimeshift.setParams(0d, (double) Constants.CPP_MIN_TIMESHIFT, (double) Constants.CPP_MAX_TIMESHIFT, 1d, new DecimalFormat("0"), false); ProfileSwitch ps = MainApp.getConfigBuilder().getProfileSwitchFromHistory(System.currentTimeMillis()); - if(ps!=null && ps.isCPP){ + if (ps != null && ps.isCPP) { final int percentage = ps.percentage; final int timeshift = ps.timeshift; - reuseButton.setText(reuseButton.getText() + " " + percentage + "% " + timeshift +"h"); + reuseButton.setText(reuseButton.getText() + " " + percentage + "% " + timeshift + "h"); reuseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - editPercentage.setValue((double)percentage); - editTimeshift.setValue((double)timeshift); + editPercentage.setValue((double) percentage); + editTimeshift.setValue((double) timeshift); } }); } @@ -363,7 +357,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick showOrHide((ViewGroup) view.findViewById(R.id.careportal_newnstreatment_profile_layout), options.profile); showOrHide((ViewGroup) view.findViewById(R.id.careportal_newnstreatment_percentage_layout), options.profile); showOrHide((ViewGroup) view.findViewById(R.id.careportal_newnstreatment_timeshift_layout), options.profile); - showOrHide((ViewGroup) view.findViewById(R.id.careportal_newnstreatment_reuse_layout), options.profile && ps!=null && ps.isCPP); + showOrHide((ViewGroup) view.findViewById(R.id.careportal_newnstreatment_reuse_layout), options.profile && ps != null && ps.isCPP); showOrHide((ViewGroup) view.findViewById(R.id.careportal_newnstreatment_temptarget_layout), options.tempTarget); return view; @@ -674,31 +668,22 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick } else if (options.executeTempTarget) { try { if ((data.has("targetBottom") && data.has("targetTop")) || (data.has("duration") && data.getInt("duration") == 0)) { - sHandler.post(new Runnable() { - @Override - public void run() { - try { - TempTarget tempTarget = new TempTarget(); - tempTarget.date = eventTime.getTime(); - tempTarget.durationInMinutes = data.getInt("duration"); - tempTarget.reason = data.getString("reason"); - tempTarget.source = Source.USER; - if (tempTarget.durationInMinutes != 0) { - tempTarget.low = Profile.toMgdl(data.getDouble("targetBottom"), profile.getUnits()); - tempTarget.high = Profile.toMgdl(data.getDouble("targetTop"), profile.getUnits()); - } else { - tempTarget.low = 0; - tempTarget.high = 0; - } - log.debug("Creating new TempTarget db record: " + tempTarget.toString()); - MainApp.getDbHelper().createOrUpdate(tempTarget); - NSUpload.uploadCareportalEntryToNS(data); - Answers.getInstance().logCustom(new CustomEvent("TempTarget")); - } catch (JSONException e) { - log.error("Unhandled exception", e); - } - } - }); + TempTarget tempTarget = new TempTarget(); + tempTarget.date = eventTime.getTime(); + tempTarget.durationInMinutes = data.getInt("duration"); + tempTarget.reason = data.getString("reason"); + tempTarget.source = Source.USER; + if (tempTarget.durationInMinutes != 0) { + tempTarget.low = Profile.toMgdl(data.getDouble("targetBottom"), profile.getUnits()); + tempTarget.high = Profile.toMgdl(data.getDouble("targetTop"), profile.getUnits()); + } else { + tempTarget.low = 0; + tempTarget.high = 0; + } + log.debug("Creating new TempTarget db record: " + tempTarget.toString()); + MainApp.getDbHelper().createOrUpdate(tempTarget); + NSUpload.uploadCareportalEntryToNS(data); + Answers.getInstance().logCustom(new CustomEvent("TempTarget")); } } catch (JSONException e) { log.error("Unhandled exception", e); @@ -714,64 +699,68 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick } public static void doProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift) { - sHandler.post(new Runnable() { + ProfileSwitch profileSwitch = new ProfileSwitch(); + profileSwitch.date = System.currentTimeMillis(); + profileSwitch.source = Source.USER; + profileSwitch.profileName = profileName; + profileSwitch.profileJson = profileStore.getSpecificProfile(profileName).getData().toString(); + profileSwitch.profilePlugin = ConfigBuilderPlugin.getActiveProfileInterface().getClass().getName(); + profileSwitch.durationInMinutes = duration; + profileSwitch.isCPP = percentage != 100 || timeshift != 0; + profileSwitch.timeshift = timeshift; + profileSwitch.percentage = percentage; + MainApp.getConfigBuilder().addToHistoryProfileSwitch(profileSwitch); + + ConfigBuilderPlugin.getCommandQueue().setProfile(profileSwitch.getProfileObject(), new Callback() { @Override public void run() { - ProfileSwitch profileSwitch = new ProfileSwitch(); - profileSwitch.date = System.currentTimeMillis(); - profileSwitch.source = Source.USER; - profileSwitch.profileName = profileName; - profileSwitch.profileJson = profileStore.getSpecificProfile(profileName).getData().toString(); - profileSwitch.profilePlugin = ConfigBuilderPlugin.getActiveProfileInterface().getClass().getName(); - profileSwitch.durationInMinutes = duration; - profileSwitch.isCPP = percentage != 100 || timeshift != 0; - profileSwitch.timeshift = timeshift; - profileSwitch.percentage = percentage; - MainApp.getConfigBuilder().addToHistoryProfileSwitch(profileSwitch); - - PumpInterface pump = MainApp.getConfigBuilder(); - if (pump != null) { - pump.setNewBasalProfile(profileSwitch.getProfileObject()); - MainApp.bus().post(new EventNewBasalProfile()); - } else { - log.error("No active pump selected"); + if (!result.success) { + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.failedupdatebasalprofile)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } - Answers.getInstance().logCustom(new CustomEvent("ProfileSwitch")); + MainApp.bus().post(new EventNewBasalProfile()); } }); + Answers.getInstance().logCustom(new CustomEvent("ProfileSwitch")); } public static void doProfileSwitch(final int duration, final int percentage, final int timeshift) { - sHandler.post(new Runnable() { - @Override - public void run() { - ProfileSwitch profileSwitch = MainApp.getConfigBuilder().getProfileSwitchFromHistory(System.currentTimeMillis()); - if (profileSwitch != null) { - profileSwitch = new ProfileSwitch(); - profileSwitch.date = System.currentTimeMillis(); - profileSwitch.source = Source.USER; - profileSwitch.profileName = MainApp.getConfigBuilder().getProfileName(System.currentTimeMillis(), false); - profileSwitch.profileJson = MainApp.getConfigBuilder().getProfile().getData().toString(); - profileSwitch.profilePlugin = ConfigBuilderPlugin.getActiveProfileInterface().getClass().getName(); - profileSwitch.durationInMinutes = duration; - profileSwitch.isCPP = percentage != 100 || timeshift != 0; - profileSwitch.timeshift = timeshift; - profileSwitch.percentage = percentage; - MainApp.getConfigBuilder().addToHistoryProfileSwitch(profileSwitch); + ProfileSwitch profileSwitch = MainApp.getConfigBuilder().getProfileSwitchFromHistory(System.currentTimeMillis()); + if (profileSwitch != null) { + profileSwitch = new ProfileSwitch(); + profileSwitch.date = System.currentTimeMillis(); + profileSwitch.source = Source.USER; + profileSwitch.profileName = MainApp.getConfigBuilder().getProfileName(System.currentTimeMillis(), false); + profileSwitch.profileJson = MainApp.getConfigBuilder().getProfile().getData().toString(); + profileSwitch.profilePlugin = ConfigBuilderPlugin.getActiveProfileInterface().getClass().getName(); + profileSwitch.durationInMinutes = duration; + profileSwitch.isCPP = percentage != 100 || timeshift != 0; + profileSwitch.timeshift = timeshift; + profileSwitch.percentage = percentage; + MainApp.getConfigBuilder().addToHistoryProfileSwitch(profileSwitch); - PumpInterface pump = MainApp.getConfigBuilder(); - if (pump != null) { - pump.setNewBasalProfile(profileSwitch.getProfileObject()); - MainApp.bus().post(new EventNewBasalProfile()); - } else { - log.error("No active pump selected"); + ConfigBuilderPlugin.getCommandQueue().setProfile(profileSwitch.getProfileObject(), new Callback() { + @Override + public void run() { + if (!result.success) { + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.failedupdatebasalprofile)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } - Answers.getInstance().logCustom(new CustomEvent("ProfileSwitch")); - } else { - log.error("No profile switch existing"); + MainApp.bus().post(new EventNewBasalProfile()); } - } - }); + }); + Answers.getInstance().logCustom(new CustomEvent("ProfileSwitch")); + } else { + log.error("No profile switch existing"); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java index 66c3774859..d503e9b0ba 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java @@ -52,13 +52,15 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogr import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin; +import info.nightscout.androidaps.queue.Callback; +import info.nightscout.androidaps.queue.CommandQueue; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; /** * Created by mike on 05.08.2016. */ -public class ConfigBuilderPlugin implements PluginBase, PumpInterface, ConstraintsInterface, TreatmentsInterface { +public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, TreatmentsInterface { private static Logger log = LoggerFactory.getLogger(ConfigBuilderPlugin.class); private static BgSourceInterface activeBgSource; @@ -77,12 +79,10 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain private static ArrayList pluginList; - private PowerManager.WakeLock mWakeLock; + private static CommandQueue commandQueue = new CommandQueue(); public ConfigBuilderPlugin() { MainApp.bus().register(this); - PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "ConfigBuilderPlugin"); } @Override @@ -197,6 +197,10 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain verifySelectionInCategories(); } + public static CommandQueue getCommandQueue() { + return commandQueue; + } + public static BgSourceInterface getActiveBgSource() { return activeBgSource; } @@ -358,266 +362,77 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } /* - * Pump interface + * Ex Pump interface * * Config builder return itself as a pump and check constraints before it passes command to pump driver */ - @Override - public boolean isInitialized() { - if (activePump != null) - return activePump.isInitialized(); - else return true; - } - @Override - public boolean isSuspended() { - if (activePump != null) - return activePump.isSuspended(); - else return false; - } - - @Override - public boolean isBusy() { - if (activePump != null) - return activePump.isBusy(); - else return false; - } - - @Override - public int setNewBasalProfile(Profile profile) { - // Compare with pump limits - Profile.BasalValue[] basalValues = profile.getBasalValues(); - - for (int index = 0; index < basalValues.length; index++) { - if (basalValues[index].value < getPumpDescription().basalMinimumRate) { - Notification notification = new Notification(Notification.BASAL_VALUE_BELOW_MINIMUM, MainApp.sResources.getString(R.string.basalvaluebelowminimum), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; - } - } - - MainApp.bus().post(new EventDismissNotification(Notification.BASAL_VALUE_BELOW_MINIMUM)); - - if (isThisProfileSet(profile)) { - log.debug("Correct profile already set"); - return NOT_NEEDED; - } else if (activePump != null) { - return activePump.setNewBasalProfile(profile); - } else - return SUCCESS; - } - - @Override - public boolean isThisProfileSet(Profile profile) { - if (activePump != null) { - boolean result = activePump.isThisProfileSet(profile); - if (result == false) { - log.debug("Current profile: " + getProfile().getData().toString()); - log.debug("New profile: " + profile.getData().toString()); - } - return result; - } else return true; - } - - @Override - public Date lastDataTime() { - if (activePump != null) - return activePump.lastDataTime(); - else return new Date(); - } - - @Override - public void refreshDataFromPump(String reason) { - if (activePump != null) - activePump.refreshDataFromPump(reason); - } - - @Override - public double getBaseBasalRate() { - if (activePump != null) - return activePump.getBaseBasalRate(); - else - return 0d; - } - - @Override - public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { - mWakeLock.acquire(); - PumpEnactResult result; - detailedBolusInfo.insulin = applyBolusConstraints(detailedBolusInfo.insulin); - detailedBolusInfo.carbs = applyCarbsConstraints((int) detailedBolusInfo.carbs); - - BolusProgressDialog bolusProgressDialog = null; - if (detailedBolusInfo.context != null) { - bolusProgressDialog = new BolusProgressDialog(); - bolusProgressDialog.setInsulin(detailedBolusInfo.insulin); - bolusProgressDialog.show(((AppCompatActivity) detailedBolusInfo.context).getSupportFragmentManager(), "BolusProgress"); - } else { - Intent i = new Intent(); - i.putExtra("insulin", detailedBolusInfo.insulin); - i.setClass(MainApp.instance(), BolusProgressHelperActivity.class); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - MainApp.instance().startActivity(i); - } - - - MainApp.bus().post(new EventBolusRequested(detailedBolusInfo.insulin)); - - result = activePump.deliverTreatment(detailedBolusInfo); - - BolusProgressDialog.bolusEnded = true; - MainApp.bus().post(new EventDismissBolusprogressIfRunning(result)); - - mWakeLock.release(); - return result; - } - - @Override - public void stopBolusDelivering() { - activePump.stopBolusDelivering(); - } - - /** - * apply constraints, set temp based on absolute valus and expecting absolute result - * - * @param absoluteRate - * @param durationInMinutes - * @return - */ - @Override - public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, boolean force) { - Double rateAfterConstraints = applyBasalConstraints(absoluteRate); - PumpEnactResult result = activePump.setTempBasalAbsolute(rateAfterConstraints, durationInMinutes, force); - if (Config.logCongigBuilderActions) - log.debug("setTempBasalAbsolute rate: " + rateAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted); - return result; - } - - public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) { - return setTempBasalAbsolute(absoluteRate, durationInMinutes, false); - } - - /** - * apply constraints, set temp based on percent and expecting result in percent - * - * @param percent 0 ... 100 ... - * @param durationInMinutes - * @return result - */ - @Override - public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) { - Integer percentAfterConstraints = applyBasalConstraints(percent); - PumpEnactResult result = activePump.setTempBasalPercent(percentAfterConstraints, durationInMinutes); - if (Config.logCongigBuilderActions) - log.debug("setTempBasalPercent percent: " + percentAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted); - return result; - } - - @Override - public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) { - Double rateAfterConstraints = applyBolusConstraints(insulin); - PumpEnactResult result = activePump.setExtendedBolus(rateAfterConstraints, durationInMinutes); - if (Config.logCongigBuilderActions) - log.debug("setExtendedBolus rate: " + rateAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted); - return result; - } - - @Override - public PumpEnactResult cancelTempBasal(boolean force) { - PumpEnactResult result = activePump.cancelTempBasal(force); - if (Config.logCongigBuilderActions) - log.debug("cancelTempBasal success: " + result.success + " enacted: " + result.enacted); - return result; - } - - @Override - public PumpEnactResult cancelExtendedBolus() { - PumpEnactResult result = activePump.cancelExtendedBolus(); - if (Config.logCongigBuilderActions) - log.debug("cancelExtendedBolus success: " + result.success + " enacted: " + result.enacted); - return result; - } /** * expect absolute request and allow both absolute and percent response based on pump capabilities * * @param request * @return + * true if command is going to be executed + * false if error */ - public PumpEnactResult applyAPSRequest(APSResult request) { + public boolean applyAPSRequest(APSResult request, Callback callback) { + PumpInterface pump = getActivePump(); request.rate = applyBasalConstraints(request.rate); PumpEnactResult result; - if (!isInitialized()) { - result = new PumpEnactResult(); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitialized); - result.enacted = false; - result.success = false; + if (!pump.isInitialized()) { log.debug("applyAPSRequest: " + MainApp.sResources.getString(R.string.pumpNotInitialized)); - return result; + if (callback != null) { + callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); + } + return false; } - if (isSuspended()) { - result = new PumpEnactResult(); - result.comment = MainApp.sResources.getString(R.string.pumpsuspended); - result.enacted = false; - result.success = false; + if (pump.isSuspended()) { log.debug("applyAPSRequest: " + MainApp.sResources.getString(R.string.pumpsuspended)); - return result; + if (callback != null) { + callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpsuspended)).enacted(false).success(false)).run(); + } + return false; } if (Config.logCongigBuilderActions) log.debug("applyAPSRequest: " + request.toString()); - if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - getBaseBasalRate()) < getPumpDescription().basalStep) { + if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - pump.getBaseBasalRate()) < pump.getPumpDescription().basalStep) { if (isTempBasalInProgress()) { if (Config.logCongigBuilderActions) log.debug("applyAPSRequest: cancelTempBasal()"); - result = cancelTempBasal(false); + getCommandQueue().cancelTempBasal(false, callback); + return true; } else { - result = new PumpEnactResult(); - result.absolute = request.rate; - result.duration = 0; - result.enacted = false; - result.comment = "Basal set correctly"; - result.success = true; if (Config.logCongigBuilderActions) log.debug("applyAPSRequest: Basal set correctly"); + if (callback != null) { + callback.result(new PumpEnactResult().absolute(request.rate).duration(0).enacted(false).success(true).comment("Basal set correctly")).run(); + } + return false; } } else if (isTempBasalInProgress() && getTempBasalRemainingMinutesFromHistory() > 5 - && Math.abs(request.rate - getTempBasalAbsoluteRateHistory()) < getPumpDescription().basalStep) { - result = new PumpEnactResult(); - result.absolute = getTempBasalAbsoluteRateHistory(); - result.duration = getTempBasalFromHistory(System.currentTimeMillis()).getPlannedRemainingMinutes(); - result.enacted = false; - result.comment = "Temp basal set correctly"; - result.success = true; + && Math.abs(request.rate - getTempBasalAbsoluteRateHistory()) < pump.getPumpDescription().basalStep) { if (Config.logCongigBuilderActions) log.debug("applyAPSRequest: Temp basal set correctly"); + if (callback != null) { + callback.result(new PumpEnactResult().absolute(getTempBasalAbsoluteRateHistory()).duration(getTempBasalFromHistory(System.currentTimeMillis()).getPlannedRemainingMinutes()).enacted(false).success(true).comment("Temp basal set correctly")).run(); + } + return false; } else { if (Config.logCongigBuilderActions) log.debug("applyAPSRequest: setTempBasalAbsolute()"); - result = setTempBasalAbsolute(request.rate, request.duration); + getCommandQueue().tempBasalAbsolute(request.rate, request.duration, false, callback); + return true; } - return result; } - @Nullable - @Override - public JSONObject getJSONStatus() { - if (activePump != null) - return activePump.getJSONStatus(); - else return null; - } - - @Override - public String deviceID() { - if (activePump != null) - return activePump.deviceID(); - else return "No Pump active!"; - } +/* @Override public PumpDescription getPumpDescription() { if (activePump != null) @@ -632,20 +447,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain return emptyDescription; } } - - @Override - public String shortStatus(boolean veryShort) { - if (activePump != null) { - return activePump.shortStatus(veryShort); - } else { - return "No Pump active!"; - } - } - - @Override - public boolean isFakingTempsByExtendedBoluses() { - return activePump.isFakingTempsByExtendedBoluses(); - } +*/ /** * Constraints interface diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java index 04edeb43a1..9f91080710 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java @@ -16,7 +16,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.interfaces.ConstraintsInterface; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.SP; /** @@ -62,7 +62,7 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { @Override public String getNameShort() { String name = MainApp.sResources.getString(R.string.objectives_shortname); - if (!name.trim().isEmpty()){ + if (!name.trim().isEmpty()) { //only if translation exists return name; } @@ -72,7 +72,7 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { @Override public boolean isEnabled(int type) { - return type == CONSTRAINTS && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + return type == CONSTRAINTS && ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java index a64241a4b9..ecb7aad47d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java @@ -10,9 +10,10 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.interfaces.ConstraintsInterface; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.HardLimits; import info.nightscout.utils.Round; import info.nightscout.utils.SP; @@ -93,7 +94,7 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface { @Override public boolean isLoopEnabled() { - return MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + return ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; } /** diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java index a1a3d9c904..f8ca0ab8c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.DecimalFormatter; @@ -25,15 +26,16 @@ public class APSResult { public double rate; public int duration; public boolean changeRequested = false; + @Override public String toString() { - final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder(); + final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (changeRequested) { if (rate == 0 && duration == 0) return MainApp.sResources.getString(R.string.canceltemp); else return MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + - "(" + DecimalFormatter.to2Decimal(rate/configBuilder.getBaseBasalRate() *100) + "%)\n" + + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%)\n" + MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to0Decimal(duration) + " min\n" + MainApp.sResources.getString(R.string.reason) + ": " + reason; } else @@ -41,13 +43,13 @@ public class APSResult { } public Spanned toSpanned() { - final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder(); + final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (changeRequested) { String ret = ""; if (rate == 0 && duration == 0) ret = MainApp.sResources.getString(R.string.canceltemp); else ret = "" + MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + - "(" + DecimalFormatter.to2Decimal(rate/configBuilder.getBaseBasalRate() *100) + "%)
" + + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%)
" + "" + MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min
" + "" + MainApp.sResources.getString(R.string.reason) + ": " + reason.replace("<", "<").replace(">", ">"); return Html.fromHtml(ret); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index 1b6d05664e..d3ddf33b39 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -6,15 +6,12 @@ import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v7.app.NotificationCompat; import com.crashlytics.android.answers.Answers; import com.crashlytics.android.answers.CustomEvent; import com.squareup.otto.Subscribe; -import org.json.JSONException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,14 +28,14 @@ import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.ConstraintsInterface; import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui; import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui; import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification; -import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; -import info.nightscout.utils.SafeParse; /** * Created by mike on 05.08.2016. @@ -55,9 +52,6 @@ public class LoopPlugin implements PluginBase { return loopPlugin; } - private static Handler sHandler; - private static HandlerThread sHandlerThread; - private boolean fragmentEnabled = false; private boolean fragmentVisible = false; @@ -77,11 +71,6 @@ public class LoopPlugin implements PluginBase { static public LastRun lastRun = null; public LoopPlugin() { - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(LoopPlugin.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } MainApp.bus().register(this); loopSuspendedTill = SP.getLong("loopSuspendedTill", 0L); isSuperBolus = SP.getBoolean("isSuperBolus", false); @@ -105,7 +94,7 @@ public class LoopPlugin implements PluginBase { @Override public String getNameShort() { String name = MainApp.sResources.getString(R.string.loop_shortname); - if (!name.trim().isEmpty()){ + if (!name.trim().isEmpty()) { //only if translation exists return name; } @@ -115,12 +104,14 @@ public class LoopPlugin implements PluginBase { @Override public boolean isEnabled(int type) { - return type == LOOP && fragmentEnabled && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + boolean pumpCapable = ConfigBuilderPlugin.getActivePump() == null || ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; + return type == LOOP && fragmentEnabled && pumpCapable; } @Override public boolean isVisibleInTabs(int type) { - return type == LOOP && fragmentVisible && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + boolean pumpCapable = ConfigBuilderPlugin.getActivePump() == null || ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; + return type == LOOP && fragmentVisible && pumpCapable; } @Override @@ -208,7 +199,7 @@ public class LoopPlugin implements PluginBase { return true; } - public boolean isSuperBolus() { + public boolean isSuperBolus() { if (loopSuspendedTill == 0) return false; @@ -232,10 +223,10 @@ public class LoopPlugin implements PluginBase { MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopdisabled))); return; } - final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder(); + final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); APSResult result = null; - if (configBuilder == null || !isEnabled(PluginBase.LOOP)) + if (!isEnabled(PluginBase.LOOP)) return; if (isSuspended()) { @@ -244,22 +235,22 @@ public class LoopPlugin implements PluginBase { return; } - if (configBuilder.isSuspended()) { + if (pump.isSuspended()) { log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); return; } - if (configBuilder.getProfile() == null) { + if (MainApp.getConfigBuilder().getProfile() == null) { log.debug(MainApp.sResources.getString(R.string.noprofileselected)); MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noprofileselected))); return; } // Check if pump info is loaded - if (configBuilder.getBaseBasalRate() < 0.01d) return; + if (pump.getBaseBasalRate() < 0.01d) return; - APSInterface usedAPS = configBuilder.getActiveAPS(); + APSInterface usedAPS = MainApp.getConfigBuilder().getActiveAPS(); if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginBase.APS)) { usedAPS.invoke(initiator); result = usedAPS.getLastAPSResult(); @@ -282,20 +273,19 @@ public class LoopPlugin implements PluginBase { lastRun.source = ((PluginBase) usedAPS).getName(); lastRun.setByPump = null; - if (constraintsInterface.isClosedModeEnabled()) { + if (constraintsInterface.isClosedModeEnabled()) { if (result.changeRequested) { final PumpEnactResult waiting = new PumpEnactResult(); final PumpEnactResult previousResult = lastRun.setByPump; waiting.queued = true; lastRun.setByPump = waiting; MainApp.bus().post(new EventLoopUpdateGui()); - sHandler.post(new Runnable() { + MainApp.getConfigBuilder().applyAPSRequest(resultAfterConstraints, new Callback() { @Override public void run() { - final PumpEnactResult applyResult = configBuilder.applyAPSRequest(resultAfterConstraints); Answers.getInstance().logCustom(new CustomEvent("APSRequest")); - if (applyResult.enacted || applyResult.success) { - lastRun.setByPump = applyResult; + if (result.enacted || result.success) { + lastRun.setByPump = result; lastRun.lastEnact = lastRun.lastAPSRun; } else { lastRun.setByPump = previousResult; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index 3102ac95d6..466026e986 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -17,7 +17,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; @@ -25,11 +24,10 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.ScriptReader; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.OpenAPSMA.LoggerCallback; import info.nightscout.utils.SP; @@ -186,7 +184,7 @@ public class DetermineBasalAdapterAMAJS { double minBg, double maxBg, double targetBg, - PumpInterface pump, + double basalrate, IobTotal[] iobArray, GlucoseStatus glucoseStatus, MealData mealData, @@ -210,7 +208,7 @@ public class DetermineBasalAdapterAMAJS { mProfile.put("max_daily_safety_multiplier", SP.getInt("openapsama_max_daily_safety_multiplier", 3)); mProfile.put("current_basal_safety_multiplier", SP.getInt("openapsama_current_basal_safety_multiplier", 4)); mProfile.put("skip_neutral_temps", true); - mProfile.put("current_basal", pump.getBaseBasalRate()); + mProfile.put("current_basal", basalrate); mProfile.put("temptargetSet", tempTargetSet); mProfile.put("autosens_adjust_targets", SP.getBoolean("openapsama_autosens_adjusttargets", true)); mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", 3d)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java index b64d4b6b08..4dcb174209 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java @@ -14,15 +14,15 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.ScriptReader; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui; import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui; import info.nightscout.utils.DateUtil; @@ -75,12 +75,14 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { @Override public boolean isEnabled(int type) { - return type == APS && fragmentEnabled && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + boolean pumpCapable = ConfigBuilderPlugin.getActivePump() == null || ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; + return type == APS && fragmentEnabled && pumpCapable; } @Override public boolean isVisibleInTabs(int type) { - return type == APS && fragmentVisible && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + boolean pumpCapable = ConfigBuilderPlugin.getActivePump() == null || ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; + return type == APS && fragmentVisible && pumpCapable; } @Override @@ -137,7 +139,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { public void invoke(String initiator) { log.debug("invoke from " + initiator); lastAPSResult = null; - DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS = null; + DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS; try { determineBasalAdapterAMAJS = new DetermineBasalAdapterAMAJS(new ScriptReader(MainApp.instance().getBaseContext())); } catch (IOException e) { @@ -147,7 +149,6 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); Profile profile = MainApp.getConfigBuilder().getProfile(); - PumpInterface pump = MainApp.getConfigBuilder(); if (profile == null) { MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); @@ -215,7 +216,8 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", 2, 900)) return; if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, 10)) return; - if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, 5)) return; + if (!checkOnlyHardLimits(ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), "current_basal", 0.01, 5)) + return; startPart = new Date(); if (MainApp.getConfigBuilder().isAMAModeEnabled()) { @@ -229,7 +231,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { start = new Date(); try { - determineBasalAdapterAMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, pump, iobArray, glucoseStatus, mealData, + determineBasalAdapterAMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), iobArray, glucoseStatus, mealData, lastAutosensResult.ratio, //autosensDataRatio isTempTarget, SafeParse.stringToDouble(SP.getString("openapsama_min_5m_carbimpact", "3.0"))//min_5m_carbimpact @@ -248,7 +250,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { if (!MainApp.getConfigBuilder().isClosedModeEnabled()) { if (MainApp.getConfigBuilder().isTempBasalInProgress() && Math.abs(determineBasalResultAMA.rate - MainApp.getConfigBuilder().getTempBasalAbsoluteRateHistory()) < 0.1) determineBasalResultAMA.changeRequested = false; - if (!MainApp.getConfigBuilder().isTempBasalInProgress() && Math.abs(determineBasalResultAMA.rate - MainApp.getConfigBuilder().getBaseBasalRate()) < 0.1) + if (!MainApp.getConfigBuilder().isTempBasalInProgress() && Math.abs(determineBasalResultAMA.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1) determineBasalResultAMA.changeRequested = false; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java index a7e1d5da58..723b224f90 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java @@ -22,9 +22,8 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.plugins.Loop.ScriptReader; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.Loop.ScriptReader; import info.nightscout.utils.SP; public class DetermineBasalAdapterMAJS { @@ -155,7 +154,7 @@ public class DetermineBasalAdapterMAJS { double minBg, double maxBg, double targetBg, - PumpInterface pump, + double basalRate, IobTotal iobData, GlucoseStatus glucoseStatus, MealData mealData) throws JSONException { @@ -174,7 +173,7 @@ public class DetermineBasalAdapterMAJS { mProfile.put("carb_ratio", profile.getIc()); mProfile.put("sens", Profile.toMgdl(profile.getIsf().doubleValue(), units)); - mProfile.put("current_basal", pump.getBaseBasalRate()); + mProfile.put("current_basal", basalRate); if (units.equals(Constants.MMOL)) { mProfile.put("out_units", "mmol/L"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java index a0d5cddd88..ac360d4ec8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java @@ -14,13 +14,13 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.ScriptReader; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui; import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui; import info.nightscout.utils.DateUtil; @@ -63,7 +63,7 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface { @Override public String getNameShort() { String name = MainApp.sResources.getString(R.string.oaps_shortname); - if (!name.trim().isEmpty()){ + if (!name.trim().isEmpty()) { //only if translation exists return name; } @@ -73,12 +73,14 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface { @Override public boolean isEnabled(int type) { - return type == APS && fragmentEnabled && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + boolean pumpCapable = ConfigBuilderPlugin.getActivePump() == null || ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; + return type == APS && fragmentEnabled && pumpCapable; } @Override public boolean isVisibleInTabs(int type) { - return type == APS && fragmentVisible && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; + boolean pumpCapable = ConfigBuilderPlugin.getActivePump() == null || ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable; + return type == APS && fragmentVisible && pumpCapable; } @Override @@ -145,7 +147,6 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface { GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); Profile profile = MainApp.getConfigBuilder().getProfile(); - PumpInterface pump = MainApp.getConfigBuilder(); if (profile == null) { MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); @@ -213,11 +214,12 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface { if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", 2, 900)) return; if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, 10)) return; - if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, 5)) return; + if (!checkOnlyHardLimits(ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), "current_basal", 0.01, 5)) + return; start = new Date(); try { - determineBasalAdapterMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, pump, iobTotal, glucoseStatus, mealData); + determineBasalAdapterMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), iobTotal, glucoseStatus, mealData); } catch (JSONException e) { log.error("Unhandled exception", e); } @@ -232,7 +234,7 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface { if (!MainApp.getConfigBuilder().isClosedModeEnabled()) { if (MainApp.getConfigBuilder().isTempBasalInProgress() && Math.abs(determineBasalResultMA.rate - MainApp.getConfigBuilder().getTempBasalAbsoluteRateHistory()) < 0.1) determineBasalResultMA.changeRequested = false; - if (!MainApp.getConfigBuilder().isTempBasalInProgress() && Math.abs(determineBasalResultMA.rate - MainApp.getConfigBuilder().getBaseBasalRate()) < 0.1) + if (!MainApp.getConfigBuilder().isTempBasalInProgress() && Math.abs(determineBasalResultMA.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1) determineBasalResultMA.changeRequested = false; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index 1471c23969..2567c49868 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventPumpStatusChanged; -import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; @@ -97,8 +97,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL log.debug("Stop bolus delivery button pressed"); stopPressedView.setVisibility(View.VISIBLE); stopButton.setVisibility(View.INVISIBLE); - PumpInterface pump = MainApp.getConfigBuilder(); - pump.stopBolusDelivering(); + ConfigBuilderPlugin.getActivePump().stopBolusDelivering(); break; } } @@ -124,7 +123,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Subscribe public void onStatusEvent(final EventDismissBolusprogressIfRunning ev) { - if(BolusProgressDialog.running){ + if (BolusProgressDialog.running) { dismiss(); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java new file mode 100644 index 0000000000..f11283c029 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java @@ -0,0 +1,94 @@ +package info.nightscout.androidaps.plugins.Overview.Dialogs; + + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.Services.AlarmSoundService; + +public class ErrorDialog extends DialogFragment implements View.OnClickListener { + private static Logger log = LoggerFactory.getLogger(ErrorDialog.class); + Button okButton; + TextView statusView; + ErrorHelperActivity helperActivity; + + static String status; + static String title; + static int soundId; + + public ErrorDialog() { + super(); + } + + public void setStatus(String status) { + this.status = status; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setSound(int soundId) { + this.soundId = soundId; + } + + public void setHelperActivity(ErrorHelperActivity activity) { + this.helperActivity = activity; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + getDialog().setTitle(title); + View view = inflater.inflate(R.layout.overview_error_dialog, container, false); + okButton = (Button) view.findViewById(R.id.overview_error_ok); + statusView = (TextView) view.findViewById(R.id.overview_error_status); + okButton.setOnClickListener(this); + setCancelable(false); + + Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class); + alarm.putExtra("soundid", soundId); + MainApp.instance().startService(alarm); + return view; + } + + @Override + public void onResume() { + super.onResume(); + if (getDialog() != null) + getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + statusView.setText(status); + } + + @Override + public void dismiss() { + super.dismiss(); + if (helperActivity != null) { + helperActivity.finish(); + } + Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class); + MainApp.instance().stopService(alarm); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.overview_error_ok: + log.debug("Error dialog ok button pressed"); + dismiss(); + break; + } + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java new file mode 100644 index 0000000000..259c9c76eb --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java @@ -0,0 +1,21 @@ +package info.nightscout.androidaps.plugins.Overview.Dialogs; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +public class ErrorHelperActivity extends AppCompatActivity { + public ErrorHelperActivity() { + super(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ErrorDialog errorDialog = new ErrorDialog(); + errorDialog.setHelperActivity(this); + errorDialog.setStatus(getIntent().getStringExtra("status")); + errorDialog.setSound(getIntent().getIntExtra("soundid", 0)); + errorDialog.setTitle(getIntent().getStringExtra("title")); + errorDialog.show(this.getSupportFragmentManager(), "Error"); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java index dec763beff..183e4822d0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java @@ -2,9 +2,8 @@ package info.nightscout.androidaps.plugins.Overview.Dialogs; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -30,12 +29,11 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; -import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.plugins.Overview.Notification; -import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SafeParse; import info.nightscout.utils.ToastUtils; @@ -49,12 +47,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene private Integer maxCarbs; private Double maxInsulin; - private Handler mHandler; - public NewTreatmentDialog() { - HandlerThread mHandlerThread = new HandlerThread(NewTreatmentDialog.class.getSimpleName()); - mHandlerThread.start(); - this.mHandler = new Handler(mHandlerThread.getLooper()); } final private TextWatcher textWatcher = new TextWatcher() { @@ -103,7 +96,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene editInsulin = (NumberPicker) view.findViewById(R.id.treatments_newtreatment_insulinamount); editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, textWatcher); - editInsulin.setParams(0d, 0d, maxInsulin, MainApp.getConfigBuilder().getPumpDescription().bolusStep, new DecimalFormat("0.00"), false, textWatcher); + editInsulin.setParams(0d, 0d, maxInsulin,ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep, new DecimalFormat("0.00"), false, textWatcher); return view; } @@ -139,32 +132,25 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { - final PumpInterface pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + if (finalInsulinAfterConstraints == 0) + detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION; + if (finalCarbsAfterConstraints == 0) + detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS; + detailedBolusInfo.insulin = finalInsulinAfterConstraints; + detailedBolusInfo.carbs = finalCarbsAfterConstraints; + detailedBolusInfo.context = context; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { @Override public void run() { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - if (finalInsulinAfterConstraints == 0) - detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION; - if (finalCarbsAfterConstraints == 0) - detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS; - detailedBolusInfo.insulin = finalInsulinAfterConstraints; - detailedBolusInfo.carbs = finalCarbsAfterConstraints; - detailedBolusInfo.context = context; - detailedBolusInfo.source = Source.USER; - PumpEnactResult result = pump.deliverTreatment(detailedBolusInfo); if (!result.success) { - try { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - } catch (WindowManager.BadTokenException | NullPointerException e) { - // window has been destroyed - Notification notification = new Notification(Notification.BOLUS_DELIVERY_ERROR, MainApp.sResources.getString(R.string.treatmentdeliveryerror), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notification)); - } + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } } }); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index dbe16c0a9b..66eddb5cc8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -3,9 +3,8 @@ package info.nightscout.androidaps.plugins.Overview.Dialogs; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -32,7 +31,6 @@ import com.squareup.otto.Subscribe; import org.json.JSONException; import org.json.JSONObject; -import org.mozilla.javascript.tools.debugger.Main; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,7 +45,6 @@ import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileStore; -import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.DatabaseHelper; @@ -59,13 +56,11 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui; -import info.nightscout.androidaps.plugins.Overview.Notification; -import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.BolusWizard; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NumberPicker; -import info.nightscout.utils.OKDialog; import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; import info.nightscout.utils.ToastUtils; @@ -109,16 +104,10 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com JSONObject boluscalcJSON; boolean cobAvailable = false; - Handler mHandler; - public static HandlerThread mHandlerThread; - Context context; public WizardDialog() { super(); - mHandlerThread = new HandlerThread(WizardDialog.class.getSimpleName()); - mHandlerThread.start(); - mHandler = new Handler(mHandlerThread.getLooper()); } @Override @@ -253,7 +242,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com editBg.setParams(0d, 0d, 500d, 0.1d, new DecimalFormat("0.0"), false, textWatcher); editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, textWatcher); - double bolusstep = MainApp.getConfigBuilder().getPumpDescription().bolusStep; + double bolusstep = ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep; editCorr.setParams(0d, -maxCorrection, maxCorrection, bolusstep, new DecimalFormat("0.00"), false, textWatcher); editCarbTime.setParams(0d, -60d, 60d, 5d, new DecimalFormat("0"), false); initDialog(); @@ -333,46 +322,46 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { - final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { - @Override - public void run() { - PumpEnactResult result; - if (useSuperBolus) { - final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); - if (activeloop != null) { - activeloop.superBolusTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000); - MainApp.bus().post(new EventRefreshOverview("WizardDialog")); - } - pump.cancelTempBasal(true); - result = pump.setTempBasalAbsolute(0d, 120, true); + if (useSuperBolus) { + final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); + if (activeloop != null) { + activeloop.superBolusTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000); + MainApp.bus().post(new EventRefreshOverview("WizardDialog")); + } + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(0d, 120, true, new Callback() { + @Override + public void run() { if (!result.success) { - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror), result.comment, null); + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } } - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD; - detailedBolusInfo.insulin = finalInsulinAfterConstraints; - detailedBolusInfo.carbs = finalCarbsAfterConstraints; - detailedBolusInfo.context = context; - detailedBolusInfo.glucose = bg; - detailedBolusInfo.glucoseType = "Manual"; - detailedBolusInfo.carbTime = carbTime; - detailedBolusInfo.boluscalc = boluscalcJSON; - detailedBolusInfo.source = Source.USER; - result = pump.deliverTreatment(detailedBolusInfo); + }); + } + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD; + detailedBolusInfo.insulin = finalInsulinAfterConstraints; + detailedBolusInfo.carbs = finalCarbsAfterConstraints; + detailedBolusInfo.context = context; + detailedBolusInfo.glucose = bg; + detailedBolusInfo.glucoseType = "Manual"; + detailedBolusInfo.carbTime = carbTime; + detailedBolusInfo.boluscalc = boluscalcJSON; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { + @Override + public void run() { if (!result.success) { - try { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - } catch (WindowManager.BadTokenException | NullPointerException e) { - // window has been destroyed - Notification notification = new Notification(Notification.BOLUS_DELIVERY_ERROR, MainApp.sResources.getString(R.string.treatmentdeliveryerror), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notification)); - } + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } } }); @@ -393,7 +382,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com private void initDialog() { Profile profile = MainApp.getConfigBuilder().getProfile(); - ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); + ProfileStore profileStore = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); if (profile == null) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile)); @@ -403,7 +392,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com ArrayList profileList; profileList = profileStore.getProfileList(); profileList.add(0, MainApp.sResources.getString(R.string.active)); - ArrayAdapter adapter = new ArrayAdapter(getContext(), + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, profileList); profileSpinner.setAdapter(adapter); @@ -444,7 +433,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com } private void calculateInsulin() { - ProfileStore profile = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); + ProfileStore profile = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); if (profileSpinner == null || profileSpinner.getSelectedItem() == null) return; // not initialized yet String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java index a857153c73..403c80332f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Notification.java @@ -51,6 +51,7 @@ public class Notification { public static final int TOAST_ALARM = 22; public static final int WRONGBASALSTEP = 23; public static final int BOLUS_DELIVERY_ERROR = 24; + public static final int WRONG_DRIVER = 24; public int id; public Date date; @@ -61,9 +62,6 @@ public class Notification { public NSAlarm nsAlarm = null; public Integer soundId = null; - public Notification() { - } - public Notification(int id, Date date, String text, int level, Date validTo) { this.id = id; this.date = date; @@ -88,6 +86,27 @@ public class Notification { this.validTo = new Date(0); } + public Notification(int id) { + this.id = id; + this.date = new Date(); + this.validTo = new Date(0); + } + + public Notification text(String text) { + this.text = text; + return this; + } + + public Notification level(int level) { + this.level = level; + return this; + } + + public Notification sound(int soundId) { + this.soundId = soundId; + return this; + } + public Notification(NSAlarm nsAlarm) { this.date = new Date(); this.validTo = new Date(0); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 8b08d76dd2..87689e8b45 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -5,12 +5,11 @@ import android.app.Activity; import android.app.NotificationManager; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.graphics.Color; -import android.graphics.DashPathEffect; import android.graphics.Paint; import android.os.Bundle; import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; @@ -26,7 +25,6 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.WindowManager; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; @@ -37,11 +35,6 @@ import com.crashlytics.android.Crashlytics; import com.crashlytics.android.answers.Answers; import com.crashlytics.android.answers.CustomEvent; import com.jjoe64.graphview.GraphView; -import com.jjoe64.graphview.ValueDependentColor; -import com.jjoe64.graphview.series.BarGraphSeries; -import com.jjoe64.graphview.series.DataPoint; -import com.jjoe64.graphview.series.LineGraphSeries; -import com.jjoe64.graphview.series.Series; import com.squareup.otto.Subscribe; import org.json.JSONException; @@ -50,7 +43,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DecimalFormat; -import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -69,7 +61,6 @@ import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.DatabaseHelper; @@ -103,16 +94,15 @@ import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.OpenAPSAMA.DetermineBasalResultAMA; import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialog; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; -import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock; import info.nightscout.androidaps.plugins.Overview.graphData.GraphData; -import info.nightscout.androidaps.plugins.Overview.graphExtensions.FixedLineGraphSeries; -import info.nightscout.androidaps.plugins.Overview.graphExtensions.TimeAsXAxisLabelFormatter; import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin; import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileViewerDialog; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.BolusWizard; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; @@ -181,19 +171,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, Handler sLoopHandler = new Handler(); Runnable sRefreshLoop = null; - private static Handler sHandler; - private static HandlerThread sHandlerThread; - private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledUpdate = null; public OverviewFragment() { super(); - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(OverviewFragment.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } } @Override @@ -408,10 +390,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, activeloop.setFragmentVisible(PluginBase.LOOP, false); MainApp.getConfigBuilder().storeSettings(); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -429,10 +410,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.resume))) { activeloop.suspendTo(0L); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -443,10 +423,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor1h))) { activeloop.suspendTo(System.currentTimeMillis() + 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -457,10 +436,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor2h))) { activeloop.suspendTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -471,10 +449,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor3h))) { activeloop.suspendTo(System.currentTimeMillis() + 3 * 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -485,10 +462,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor10h))) { activeloop.suspendTo(System.currentTimeMillis() + 10 * 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -499,10 +475,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor30m))) { activeloop.suspendTo(System.currentTimeMillis() + 30L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(0d, 30, true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 30, true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -513,10 +488,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor1h))) { activeloop.suspendTo(System.currentTimeMillis() + 1 * 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(0d, 60, true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 60, true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -527,10 +501,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor2h))) { activeloop.suspendTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(0d, 2 * 60, true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 2 * 60, true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -541,10 +514,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor3h))) { activeloop.suspendTo(System.currentTimeMillis() + 3 * 60L * 60 * 1000); updateGUI("suspendmenu"); - sHandler.post(new Runnable() { + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(0d, 3 * 60, true, new Callback() { @Override public void run() { - PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 3 * 60, true); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } @@ -590,13 +562,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, treatmentDialogFragment.show(manager, "TreatmentDialog"); break; case R.id.overview_pumpstatus: - if (MainApp.getConfigBuilder().isSuspended() || !MainApp.getConfigBuilder().isInitialized()) - sHandler.post(new Runnable() { - @Override - public void run() { - MainApp.getConfigBuilder().refreshDataFromPump("RefreshClicked"); - } - }); + if (ConfigBuilderPlugin.getActivePump().isSuspended() || !ConfigBuilderPlugin.getActivePump().isInitialized()) + ConfigBuilderPlugin.getCommandQueue().readStatus("RefreshClicked", null); break; } @@ -612,14 +579,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, builder.setMessage(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); builder.setPositiveButton(getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - sHandler.post(new Runnable() { + hideTempRecommendation(); + clearNotification(); + MainApp.getConfigBuilder().applyAPSRequest(finalLastRun.constraintsProcessed, new Callback() { @Override public void run() { - hideTempRecommendation(); - clearNotification(); - PumpEnactResult applyResult = MainApp.getConfigBuilder().applyAPSRequest(finalLastRun.constraintsProcessed); - if (applyResult.enacted) { - finalLastRun.setByPump = applyResult; + if (result.enacted) { + finalLastRun.setByPump = result; finalLastRun.lastEnact = new Date(); finalLastRun.lastOpenModeAccept = new Date(); NSUpload.uploadDeviceStatus(); @@ -702,30 +668,23 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { - final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); - sHandler.post(new Runnable() { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD; + detailedBolusInfo.insulin = finalInsulinAfterConstraints; + detailedBolusInfo.carbs = finalCarbsAfterConstraints; + detailedBolusInfo.context = context; + detailedBolusInfo.boluscalc = boluscalcJSON; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { @Override public void run() { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD; - detailedBolusInfo.insulin = finalInsulinAfterConstraints; - detailedBolusInfo.carbs = finalCarbsAfterConstraints; - detailedBolusInfo.context = context; - detailedBolusInfo.boluscalc = boluscalcJSON; - detailedBolusInfo.source = Source.USER; - PumpEnactResult result = pump.deliverTreatment(detailedBolusInfo); if (!result.success) { - try { - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - } catch (WindowManager.BadTokenException | NullPointerException e) { - // window has been destroyed - Notification notification = new Notification(Notification.BOLUS_DELIVERY_ERROR, MainApp.sResources.getString(R.string.treatmentdeliveryerror), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notification)); - } + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); } } }); @@ -917,7 +876,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, BgReading actualBG = DatabaseHelper.actualBg(); BgReading lastBG = DatabaseHelper.lastBg(); - PumpInterface pump = MainApp.getConfigBuilder(); + PumpInterface pump = ConfigBuilderPlugin.getActivePump(); Profile profile = MainApp.getConfigBuilder().getProfile(); String units = profile.getUnits(); @@ -959,7 +918,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // open loop mode final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun; - if (Config.APS && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable) { + if (Config.APS && pump.getPumpDescription().isTempBasalCapable) { apsModeView.setVisibility(View.VISIBLE); apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.loopenabled)); apsModeView.setTextColor(Color.BLACK); @@ -1072,15 +1031,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final ExtendedBolus extendedBolus = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()); String extendedBolusText = ""; - if (extendedBolus != null && !pump.isFakingTempsByExtendedBoluses()) { - extendedBolusText = extendedBolus.toString(); - } if (extendedBolusView != null) { // must not exists in all layouts if (shorttextmode) { if (extendedBolus != null && !pump.isFakingTempsByExtendedBoluses()) { extendedBolusText = DecimalFormatter.to2Decimal(extendedBolus.absoluteRate()) + "U/h"; - } else { - extendedBolusText = ""; } extendedBolusView.setText(extendedBolusText); extendedBolusView.setOnClickListener(new View.OnClickListener() { @@ -1091,8 +1045,15 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, }); } else { + if (extendedBolus != null && !pump.isFakingTempsByExtendedBoluses()) { + extendedBolusText = extendedBolus.toString(); + } extendedBolusView.setText(extendedBolusText); } + if (extendedBolusText.equals("")) + extendedBolusView.setVisibility(View.GONE); + else + extendedBolusView.setVisibility(View.VISIBLE); } activeProfileView.setText(MainApp.getConfigBuilder().getProfileName()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index f4be1fd351..9171cd81e7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -24,6 +24,7 @@ import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.BasalData; @@ -237,7 +238,7 @@ public class GraphData { } // Extended bolus - if (!MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) { + if (!ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) { List extendedBoluses = MainApp.getConfigBuilder().getExtendedBolusesFromHistory().getList(); for (int tx = 0; tx < extendedBoluses.size(); tx++) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 49ac49ad9b..dc67a1449d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -29,7 +29,7 @@ import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.DecimalFormatter; /** @@ -139,8 +139,6 @@ public class PersistentNotificationPlugin implements PluginBase { } } - PumpInterface pump = MainApp.getConfigBuilder(); - if (MainApp.getConfigBuilder().isTempBasalInProgress()) { TemporaryBasal activeTemp = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()); line1 += " " + activeTemp.toStringShort(); @@ -157,7 +155,7 @@ public class PersistentNotificationPlugin implements PluginBase { + ctx.getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; - String line3 = DecimalFormatter.to2Decimal(pump.getBaseBasalRate()) + " U/h"; + String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h"; line3 += " - " + MainApp.getConfigBuilder().getProfileName(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java index 53ceed17a8..74b400e1af 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java @@ -35,11 +35,11 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventProfileSwitchChange; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Careportal.CareportalFragment; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SafeParse; @@ -151,8 +151,7 @@ public class CircadianPercentageProfileFragment extends SubscriberFragment { iceditIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_icedit); isfeditIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_isfedit); - PumpInterface pump = MainApp.getConfigBuilder(); - if (!pump.getPumpDescription().isTempBasalCapable) { + if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) { layout.findViewById(R.id.circadianpercentageprofile_baseprofilebasal_layout).setVisibility(View.GONE); } @@ -334,7 +333,8 @@ public class CircadianPercentageProfileFragment extends SubscriberFragment { adb.setPositiveButton("MIGRATE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { CircadianPercentageProfilePlugin.migrateToLP(); - } }); + } + }); adb.setNegativeButton("Cancel", null); adb.show(); } @@ -366,7 +366,7 @@ public class CircadianPercentageProfileFragment extends SubscriberFragment { } private void customSnackbar(View view, final String Msg, Object snackbarCaller) { - if(mSnackBar!= null) mSnackBar.dismiss(); + if (mSnackBar != null) mSnackBar.dismiss(); this.snackbarCaller = snackbarCaller; if (timeshiftViewHint || percentageViewHint) { @@ -522,7 +522,7 @@ public class CircadianPercentageProfileFragment extends SubscriberFragment { activity.runOnUiThread(new Runnable() { @Override public void run() { - if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) { + if (!ConfigBuilderPlugin.getActivePump().isInitialized() || ConfigBuilderPlugin.getActivePump().isSuspended()) { profileswitchButton.setVisibility(View.GONE); } else { profileswitchButton.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java index ea4f32e794..949e7d1cf3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java @@ -16,12 +16,10 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.ProfileInterface; -import info.nightscout.androidaps.data.ProfileStore; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfilePlugin; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NSUpload; @@ -173,34 +171,33 @@ public class CircadianPercentageProfilePlugin implements PluginBase, ProfileInte String msg = ""; - if (!fragmentEnabled){ - msg+= "NO CPP!" + "\n"; + if (!fragmentEnabled) { + msg += "NO CPP!" + "\n"; } //check for validity if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) { - msg+= String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage") + "\n"; + msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage") + "\n"; } if (timeshift < 0 || timeshift > 23) { - msg+= String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Timeshift") + "\n"; + msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Timeshift") + "\n"; } - if(!SP.getBoolean("syncprofiletopump", false)){ - msg+= MainApp.sResources.getString(R.string.syncprofiletopump_title) + " " + MainApp.sResources.getString(R.string.cpp_sync_setting_missing) + "\n"; + if (!SP.getBoolean("syncprofiletopump", false)) { + msg += MainApp.sResources.getString(R.string.syncprofiletopump_title) + " " + MainApp.sResources.getString(R.string.cpp_sync_setting_missing) + "\n"; } - final PumpInterface pump = MainApp.getConfigBuilder(); final Profile profile = MainApp.getConfigBuilder().getProfile(); - if (pump == null || profile == null || profile.getBasal() == null){ - msg+= MainApp.sResources.getString(R.string.cpp_notloadedplugins) + "\n"; + if (profile == null || profile.getBasal() == null) { + msg += MainApp.sResources.getString(R.string.cpp_notloadedplugins) + "\n"; } - if(!"".equals(msg)) { + if (!"".equals(msg)) { msg += MainApp.sResources.getString(R.string.cpp_valuesnotstored); return msg; } //store profile - this.timeshift= timeshift; - this.percentage = percentage; + this.timeshift = timeshift; + this.percentage = percentage; storeSettings(); @@ -218,7 +215,7 @@ public class CircadianPercentageProfilePlugin implements PluginBase, ProfileInte return msg; } - public static void migrateToLP(){ + public static void migrateToLP() { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("LocalProfile" + "mmol", SP.getBoolean(SETTINGS_PREFIX + "mmol", false)); @@ -232,7 +229,7 @@ public class CircadianPercentageProfilePlugin implements PluginBase, ProfileInte JSONArray targetHigh = new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", SP.getDouble(SETTINGS_PREFIX + "targethigh", 120d))); editor.putString("LocalProfile" + "targetlow", targetLow.toString()); editor.putString("LocalProfile" + "targethigh", targetHigh.toString()); - } catch (JSONException e) { + } catch (JSONException e) { e.printStackTrace(); } editor.commit(); @@ -247,19 +244,19 @@ public class CircadianPercentageProfilePlugin implements PluginBase, ProfileInte } - public static String getLPisf(){ + public static String getLPisf() { return getLPConversion("baseisf", 35d); } - public static String getLPic(){ + public static String getLPic() { return getLPConversion("baseic", 4); } - public static String getLPbasal(){ + public static String getLPbasal() { return getLPConversion("basebasal", 1); } - public static String getLPConversion(String type, double defaultValue){ + public static String getLPConversion(String type, double defaultValue) { try { JSONArray jsonArray = new JSONArray(); double last = -1d; @@ -269,10 +266,10 @@ public class CircadianPercentageProfilePlugin implements PluginBase, ProfileInte String time; DecimalFormat df = new DecimalFormat("00"); time = df.format(i) + ":00"; - if(last != value) { + if (last != value) { jsonArray.put(new JSONObject().put("time", time).put("timeAsSeconds", i * 60 * 60).put("value", value)); } - last = value; + last = value; } return jsonArray.toString(); } catch (JSONException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java index 24965861df..8637b863fb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java @@ -23,11 +23,11 @@ import java.text.DecimalFormat; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventInitializationChanged; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Careportal.CareportalFragment; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SafeParse; @@ -59,8 +59,8 @@ public class LocalProfileFragment extends SubscriberFragment { @Override public void run() { localProfilePlugin.storeSettings(); - if(basalView!=null){ - basalView.updateLabel(MainApp.sResources.getString(R.string.nsprofileview_basal_label)+ ": "+ getSumLabel()); + if (basalView != null) { + basalView.updateLabel(MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel()); } } }; @@ -91,12 +91,11 @@ public class LocalProfileFragment extends SubscriberFragment { mmolView = (RadioButton) layout.findViewById(R.id.localprofile_mmol); icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.sResources.getString(R.string.nsprofileview_ic_label) + ":", getPlugin().ic, null, 0.1d, new DecimalFormat("0.0"), save); isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.sResources.getString(R.string.nsprofileview_isf_label) + ":", getPlugin().isf, null, 0.1d, new DecimalFormat("0.0"), save); - basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.sResources.getString(R.string.nsprofileview_basal_label)+ ": " + getSumLabel(), getPlugin().basal, null, 0.01d, new DecimalFormat("0.00"), save); - targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.sResources.getString(R.string.nsprofileview_target_label)+ ":", getPlugin().targetLow, getPlugin().targetHigh, 0.1d, new DecimalFormat("0.0"), save); + basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), getPlugin().basal, null, 0.01d, new DecimalFormat("0.00"), save); + targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.sResources.getString(R.string.nsprofileview_target_label) + ":", getPlugin().targetLow, getPlugin().targetHigh, 0.1d, new DecimalFormat("0.0"), save); profileswitchButton = (Button) layout.findViewById(R.id.localprofile_profileswitch); - PumpInterface pump = MainApp.getConfigBuilder(); - if (!pump.getPumpDescription().isTempBasalCapable) { + if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) { layout.findViewById(R.id.localprofile_basal).setVisibility(View.GONE); } @@ -148,7 +147,7 @@ public class LocalProfileFragment extends SubscriberFragment { @NonNull public String getSumLabel() { - return " ∑" + DecimalFormatter.to2Decimal(localProfilePlugin.getProfile().getDefaultProfile().baseBasalSum()) +"U"; + return " ∑" + DecimalFormatter.to2Decimal(localProfilePlugin.getProfile().getDefaultProfile().baseBasalSum()) + "U"; } @Subscribe @@ -163,7 +162,7 @@ public class LocalProfileFragment extends SubscriberFragment { activity.runOnUiThread(new Runnable() { @Override public void run() { - if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) { + if (!ConfigBuilderPlugin.getActivePump().isInitialized() || ConfigBuilderPlugin.getActivePump().isSuspended()) { profileswitchButton.setVisibility(View.GONE); } else { profileswitchButton.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java index e4fdabecf9..9efa4250bc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java @@ -18,9 +18,10 @@ import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.ProfileInterface; -import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ProfileNS.events.EventNSProfileUpdateGUI; import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorPlugin; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.SP; /** @@ -76,7 +77,7 @@ public class NSProfilePlugin implements PluginBase, ProfileInterface { @Override public boolean isVisibleInTabs(int type) { - return type == PROFILE && (Config.NSCLIENT ||fragmentVisible); + return type == PROFILE && (Config.NSCLIENT || fragmentVisible); } @Override @@ -119,16 +120,19 @@ public class NSProfilePlugin implements PluginBase, ProfileInterface { profile = new ProfileStore(newProfile.getData()); storeNSProfile(); MainApp.bus().post(new EventNSProfileUpdateGUI()); - PumpInterface pump = MainApp.getConfigBuilder(); if (SP.getBoolean("syncprofiletopump", false)) { - if (pump.setNewBasalProfile(MainApp.getConfigBuilder().getProfile()) == PumpInterface.SUCCESS) { - SmsCommunicatorPlugin smsCommunicatorPlugin = MainApp.getSpecificPlugin(SmsCommunicatorPlugin.class); - if (smsCommunicatorPlugin != null && smsCommunicatorPlugin.isEnabled(PluginBase.GENERAL)) { - smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.sResources.getString(R.string.profile_set_ok)); + ConfigBuilderPlugin.getCommandQueue().setProfile(MainApp.getConfigBuilder().getProfile(), new Callback() { + @Override + public void run() { + if (result.enacted) { + SmsCommunicatorPlugin smsCommunicatorPlugin = MainApp.getSpecificPlugin(SmsCommunicatorPlugin.class); + if (smsCommunicatorPlugin != null && smsCommunicatorPlugin.isEnabled(PluginBase.GENERAL)) { + smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.sResources.getString(R.string.profile_set_ok)); + } + } } - } + }); } - } private static void storeNSProfile() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java index 88057a68c1..47080e26db 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java @@ -18,14 +18,13 @@ import com.squareup.otto.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventInitializationChanged; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Careportal.CareportalFragment; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.utils.SafeParse; public class SimpleProfileFragment extends SubscriberFragment { @@ -56,8 +55,7 @@ public class SimpleProfileFragment extends SubscriberFragment { targethighView = (EditText) layout.findViewById(R.id.simpleprofile_targethigh); profileswitchButton = (Button) layout.findViewById(R.id.simpleprofile_profileswitch); - PumpInterface pump = MainApp.getConfigBuilder(); - if (!pump.getPumpDescription().isTempBasalCapable) { + if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) { layout.findViewById(R.id.simpleprofile_basalrate).setVisibility(View.GONE); layout.findViewById(R.id.simpleprofile_basalrate_label).setVisibility(View.GONE); } @@ -156,7 +154,7 @@ public class SimpleProfileFragment extends SubscriberFragment { activity.runOnUiThread(new Runnable() { @Override public void run() { - if (!MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended()) { + if (!ConfigBuilderPlugin.getActivePump().isInitialized() || ConfigBuilderPlugin.getActivePump().isSuspended()) { profileswitchButton.setVisibility(View.GONE); } else { profileswitchButton.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java index 0c4a5beded..8ac6bb306b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java @@ -6,8 +6,8 @@ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; -import android.os.HandlerThread; import android.support.v4.app.FragmentManager; +import android.text.Spanned; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,10 +27,12 @@ import info.nightscout.androidaps.events.EventExtendedBolusChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.Dialogs.ProfileViewDialog; import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRHistoryActivity; import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRStatsActivity; import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus; +import info.nightscout.androidaps.queue.events.EventQueueChanged; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SetWarnColor; @@ -38,11 +40,14 @@ import info.nightscout.utils.SetWarnColor; public class DanaRFragment extends SubscriberFragment { private static Logger log = LoggerFactory.getLogger(DanaRFragment.class); - private static Handler sHandler; - private static HandlerThread sHandlerThread; - private Handler loopHandler = new Handler(); - private Runnable refreshLoop = null; + private Runnable refreshLoop = new Runnable() { + @Override + public void run() { + updateGUI(); + loopHandler.postDelayed(refreshLoop, 60 * 1000L); + } + }; TextView lastConnectionView; TextView btConnectionView; @@ -58,6 +63,7 @@ public class DanaRFragment extends SubscriberFragment { TextView basalStepView; TextView bolusStepView; TextView serialNumberView; + TextView queueView; Button viewProfileButton; Button historyButton; Button statsButton; @@ -65,35 +71,19 @@ public class DanaRFragment extends SubscriberFragment { LinearLayout pumpStatusLayout; TextView pumpStatusView; - static Runnable connectRunnable = new Runnable() { - @Override - public void run() { - MainApp.getConfigBuilder().refreshDataFromPump("Connect request from GUI"); - } - }; - - public DanaRFragment() { - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(DanaRFragment.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (refreshLoop == null) { - refreshLoop = new Runnable() { - @Override - public void run() { - updateGUI(); - loopHandler.postDelayed(refreshLoop, 60 * 1000L); - } - }; - loopHandler.postDelayed(refreshLoop, 60 * 1000L); - } + loopHandler.postDelayed(refreshLoop, 60 * 1000L); + } + + @Override + public void onDestroy() { + super.onDestroy(); + loopHandler.removeCallbacks(refreshLoop); } @Override @@ -118,6 +108,7 @@ public class DanaRFragment extends SubscriberFragment { basalStepView = (TextView) view.findViewById(R.id.danar_basalstep); bolusStepView = (TextView) view.findViewById(R.id.danar_bolusstep); serialNumberView = (TextView) view.findViewById(R.id.danar_serialnumber); + queueView = (TextView) view.findViewById(R.id.danar_queue); pumpStatusView = (TextView) view.findViewById(R.id.overview_pumpstatus); pumpStatusView.setBackgroundColor(MainApp.sResources.getColor(R.color.colorInitializingBorder)); @@ -150,7 +141,7 @@ public class DanaRFragment extends SubscriberFragment { @Override public void onClick(View v) { log.debug("Clicked connect to pump"); - sHandler.post(connectRunnable); + ConfigBuilderPlugin.getCommandQueue().readStatus("Clicked connect to pump", null); } }); @@ -206,6 +197,11 @@ public class DanaRFragment extends SubscriberFragment { updateGUI(); } + @Subscribe + public void onStatusEvent(final EventQueueChanged s) { + updateGUI(); + } + // GUI functions @Override protected void updateGUI() { @@ -226,15 +222,15 @@ public class DanaRFragment extends SubscriberFragment { Long agoMsec = System.currentTimeMillis() - pump.lastBolusTime.getTime(); double agoHours = agoMsec / 60d / 60d / 1000d; if (agoHours < 6) // max 6h back - lastBolusView.setText(DateUtil.timeString(pump.lastBolusTime) + " " + DateUtil.sinceString(pump.lastBolusTime.getTime()) + " " + DecimalFormatter.to2Decimal(DanaRPump.getInstance().lastBolusAmount) + " U"); + lastBolusView.setText(DateUtil.timeString(pump.lastBolusTime) + " " + DateUtil.sinceString(pump.lastBolusTime.getTime()) + " " + DecimalFormatter.to2Decimal(DanaRPump.getInstance().lastBolusAmount) + " U"); else lastBolusView.setText(""); } dailyUnitsView.setText(DecimalFormatter.to0Decimal(pump.dailyTotalUnits) + " / " + pump.maxDailyTotalUnits + " U"); SetWarnColor.setColor(dailyUnitsView, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75d, pump.maxDailyTotalUnits * 0.9d); - basaBasalRateView.setText("( " + (pump.activeProfile + 1) + " ) " + DecimalFormatter.to2Decimal(MainApp.getConfigBuilder().getBaseBasalRate()) + " U/h"); + basaBasalRateView.setText("( " + (pump.activeProfile + 1) + " ) " + DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h"); // DanaRPlugin, DanaRKoreanPlugin - if (MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) { + if (ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) { if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) { tempBasalView.setText(MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis()).toStringFull()); } else { @@ -266,10 +262,17 @@ public class DanaRFragment extends SubscriberFragment { basalStepView.setText("" + pump.basalStep); bolusStepView.setText("" + pump.bolusStep); serialNumberView.setText("" + pump.serialNumber); - + if (queueView != null) { + Spanned status = ConfigBuilderPlugin.getCommandQueue().spannedStatus(); + if (status.toString().equals("")) { + queueView.setVisibility(View.GONE); + } else { + queueView.setVisibility(View.VISIBLE); + queueView.setText(status); + } + } } }); - } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index f7e1c6b92f..335d655913 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -245,27 +245,35 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C // Pump interface @Override - public int setNewBasalProfile(Profile profile) { + public PumpEnactResult setNewBasalProfile(Profile profile) { + PumpEnactResult result = new PumpEnactResult(); + if (sExecutionService == null) { log.error("setNewBasalProfile sExecutionService is null"); - return FAILED; + result.comment = "setNewBasalProfile sExecutionService is null"; + return result; } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!sExecutionService.updateBasalsInPump(profile)) { Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - return SUCCESS; + result.success = true; + result.enacted = true; + result.comment = "OK"; + return result; } } @@ -294,13 +302,6 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C return pump.lastConnection; } - @Override - public void refreshDataFromPump(String reason) { - if (!isConnected() && !isConnecting()) { - doConnect(reason); - } - } - @Override public double getBaseBasalRate() { return pump.currentBasal; @@ -349,9 +350,10 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, boolean enforceNew) { // Recheck pump status if older than 30 min - if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { - doConnect("setTempBasalAbsolute old data"); - } + //This should not be needed while using queue because connection should be done before calling this + //if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { + // connect("setTempBasalAbsolute old data"); + //} PumpEnactResult result = new PumpEnactResult(); @@ -414,7 +416,7 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C log.debug("setTempBasalAbsolute: currently running: " + running.toString()); if (running.percentRate == percentRate) { if (enforceNew) { - cancelTempBasal(true); + cancelTempBasal(true); } else { result.success = true; result.percent = percentRate; @@ -542,7 +544,7 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.instance().getString(R.string.tempbasaldeliveryerror); log.error("setTempBasalPercent: Failed to set temp basal"); return result; } @@ -653,7 +655,8 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C } } - public static void doConnect(String from) { + @Override + public void connect(String from) { if (sExecutionService != null) { sExecutionService.connect(from); pumpDescription.basalStep = pump.basalStep; @@ -661,18 +664,31 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C } } - public static boolean isConnected() { + @Override + public boolean isConnected() { return sExecutionService != null && sExecutionService.isConnected(); } - public static boolean isConnecting() { + @Override + public boolean isConnecting() { return sExecutionService != null && sExecutionService.isConnecting(); } - public static void doDisconnect(String from) { + @Override + public void disconnect(String from) { if (sExecutionService != null) sExecutionService.disconnect(from); } + @Override + public void stopConnecting() { + if (sExecutionService != null) sExecutionService.stopConnecting(); + } + + @Override + public void getPumpStatus() { + if (sExecutionService != null) sExecutionService.getPumpStatus(); + } + @Override public JSONObject getJSONStatus() { if (pump.lastConnection.getTime() + 5 * 60 * 1000L < System.currentTimeMillis()) { @@ -736,10 +752,15 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C */ @Override - public boolean loadHistory(byte type) { + public PumpEnactResult loadHistory(byte type) { return sExecutionService.loadHistory(type); } + @Override + public PumpEnactResult loadEvents() { + return null; // no history, not needed + } + /** * Constraint interface */ diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java index fc7a9a2411..5ae732c66a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java @@ -21,6 +21,7 @@ import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.interfaces.ProfileInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; @@ -44,14 +45,7 @@ public class ProfileViewDialog extends DialogFragment { private Button refreshButton; - Handler mHandler; - static HandlerThread mHandlerThread; - public ProfileViewDialog() { - mHandlerThread = new HandlerThread(ProfileViewDialog.class.getSimpleName()); - mHandlerThread.start(); - - mHandler = new Handler(mHandlerThread.getLooper()); } @Override @@ -72,18 +66,7 @@ public class ProfileViewDialog extends DialogFragment { refreshButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mHandler.post(new Runnable() { - @Override - public void run() { - DanaRPump.getInstance().lastSettingsRead = new Date(0); - if (MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginBase.PUMP)) - DanaRPlugin.doConnect("ProfileViewDialog"); - if (MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isEnabled(PluginBase.PUMP)) - DanaRKoreanPlugin.doConnect("ProfileViewDialog"); - if (MainApp.getSpecificPlugin(DanaRv2Plugin.class).isEnabled(PluginBase.PUMP)) - DanaRv2Plugin.doConnect("ProfileViewDialog"); - } - }); + ConfigBuilderPlugin.getCommandQueue().readStatus("ProfileViewDialog", null); dismiss(); } }); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java index 0612b9e1c3..62052486a8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java @@ -38,11 +38,13 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.interfaces.DanaRInterface; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.services.DanaRExecutionService; import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.ToastUtils; @@ -150,25 +152,19 @@ public class DanaRHistoryActivity extends Activity { reloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); - if (pump.isBusy()) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.pumpbusy)); - return; - } - mHandler.post(new Runnable() { + final TypeList selected = (TypeList) historyTypeSpinner.getSelectedItem(); + runOnUiThread(new Runnable() { + @Override + public void run() { + reloadButton.setVisibility(View.GONE); + syncButton.setVisibility(View.GONE); + statusView.setVisibility(View.VISIBLE); + } + }); + clearCardView(); + ConfigBuilderPlugin.getCommandQueue().loadHistory(selected.type, new Callback() { @Override public void run() { - TypeList selected = (TypeList) historyTypeSpinner.getSelectedItem(); - runOnUiThread(new Runnable() { - @Override - public void run() { - reloadButton.setVisibility(View.GONE); - syncButton.setVisibility(View.GONE); - statusView.setVisibility(View.VISIBLE); - } - }); - clearCardView(); - ((DanaRInterface)pump).loadHistory(selected.type); loadDataFromDB(selected.type); runOnUiThread(new Runnable() { @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRStatsActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRStatsActivity.java index 5240005dc0..5facf015d8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRStatsActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRStatsActivity.java @@ -40,24 +40,17 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.events.EventPumpStatusChanged; -import info.nightscout.androidaps.interfaces.DanaRInterface; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; -import info.nightscout.utils.ToastUtils; public class DanaRStatsActivity extends Activity { private static Logger log = LoggerFactory.getLogger(DanaRStatsActivity.class); - private boolean mBounded; - - private Handler mHandler; - private static HandlerThread mHandlerThread; - TextView statusView, statsMessage, totalBaseBasal2; EditText totalBaseBasal; Button reloadButton; @@ -72,9 +65,6 @@ public class DanaRStatsActivity extends Activity { public DanaRStatsActivity() { super(); - mHandlerThread = new HandlerThread(DanaRStatsActivity.class.getSimpleName()); - mHandlerThread.start(); - this.mHandler = new Handler(mHandlerThread.getLooper()); } @Override @@ -233,24 +223,18 @@ public class DanaRStatsActivity extends Activity { reloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); - if (pump.isBusy()) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.pumpbusy)); - return; - } - mHandler.post(new Runnable() { + runOnUiThread(new Runnable() { + @Override + public void run() { + reloadButton.setVisibility(View.GONE); + statusView.setVisibility(View.VISIBLE); + statsMessage.setVisibility(View.VISIBLE); + statsMessage.setText(getString(R.string.danar_stats_warning_Message)); + } + }); + ConfigBuilderPlugin.getCommandQueue().loadHistory(RecordTypes.RECORD_TYPE_DAILY, new Callback() { @Override public void run() { - runOnUiThread(new Runnable() { - @Override - public void run() { - reloadButton.setVisibility(View.GONE); - statusView.setVisibility(View.VISIBLE); - statsMessage.setVisibility(View.VISIBLE); - statsMessage.setText(getString(R.string.danar_stats_warning_Message)); - } - }); - ((DanaRInterface) pump).loadHistory(RecordTypes.RECORD_TYPE_DAILY); loadDataFromDB(RecordTypes.RECORD_TYPE_DAILY); runOnUiThread(new Runnable() { @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java index c05029caff..3f0c306940 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java @@ -31,8 +31,7 @@ public class MsgCheckValue extends MessageBase { 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"); + MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); log.debug("Wrong model selected"); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java index dfd5788ec9..787051f6d4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java @@ -8,8 +8,12 @@ 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.events.EventRefreshOverview; import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Notification; +import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; @@ -25,8 +29,9 @@ public class MsgInitConnStatusTime extends MessageBase { @Override public void handleMessage(byte[] bytes) { 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"); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + MainApp.bus().post(new EventNewNotification(notification)); + MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to Korean DanaR"); MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentEnabled(PluginBase.PUMP, true); MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentVisible(PluginBase.PUMP, true); @@ -41,7 +46,8 @@ public class MsgInitConnStatusTime extends MessageBase { } MainApp.getConfigBuilder().storeSettings(); - MainApp.bus().post(new EventRefreshOverview("MsgInitConnStatusTime")); + MainApp.bus().post(new EventRefreshGui()); + ConfigBuilderPlugin.getCommandQueue().readStatus("PumpDriverChange", null); // force new connection return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java index 1ef5349f25..94aa4e3a5a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java @@ -27,6 +27,7 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; @@ -34,6 +35,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -81,6 +83,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus; import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; import info.nightscout.utils.ToastUtils; @@ -94,14 +97,12 @@ public class DanaRExecutionService extends Service { private BluetoothSocket mRfcommSocket; private BluetoothDevice mBTDevice; - private PowerManager.WakeLock mWakeLock; private IBinder mBinder = new LocalBinder(); private DanaRPump danaRPump = DanaRPump.getInstance(); private Treatment bolusingTreatment = null; private static Boolean connectionInProgress = false; - private static final Object connectionLock = new Object(); private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); @@ -125,9 +126,6 @@ public class DanaRExecutionService extends Service { public DanaRExecutionService() { registerBus(); MainApp.instance().getApplicationContext().registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)); - - PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DanaRExecutionService"); } public class LocalBinder extends Binder { @@ -189,35 +187,28 @@ public class DanaRExecutionService extends Service { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); return; } - while (isConnected() || isConnecting()) { - if (Config.logDanaBTComm) - log.debug("already connected/connecting from: " + from); - waitMsec(3000); - } - final long maxConnectionTime = 5 * 60 * 1000L; // 5 min - synchronized (connectionLock) { - //log.debug("entering connection while loop"); - connectionInProgress = true; - mWakeLock.acquire(); - getBTSocketForSelectedPump(); - if (mRfcommSocket == null || mBTDevice == null) - return; // Device not found - long startTime = System.currentTimeMillis(); - while (!isConnected() && startTime + maxConnectionTime >= System.currentTimeMillis()) { - long secondsElapsed = (System.currentTimeMillis() - startTime) / 1000L; - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed)); - if (Config.logDanaBTComm) - log.debug("connect waiting " + secondsElapsed + "sec from: " + from); + + if (connectionInProgress) + return; + + new Thread(new Runnable() { + @Override + public void run() { + connectionInProgress = true; + getBTSocketForSelectedPump(); + if (mRfcommSocket == null || mBTDevice == null) { + connectionInProgress = false; + return; // Device not found + } + try { mRfcommSocket.connect(); } catch (IOException e) { //log.error("Unhandled exception", e); if (e.getMessage().contains("socket closed")) { log.error("Unhandled exception", e); - break; } } - waitMsec(1000); if (isConnected()) { if (mSerialIOThread != null) { @@ -225,23 +216,16 @@ public class DanaRExecutionService extends Service { } mSerialIOThread = new SerialIOThread(mRfcommSocket); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED, 0)); - if (!getPumpStatus()) { - mSerialIOThread.disconnect("getPumpStatus failed"); - waitMsec(3000); - if (!MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginBase.PUMP)) - return; - getBTSocketForSelectedPump(); - startTime = System.currentTimeMillis(); - } } + + connectionInProgress = false; } - if (!isConnected()) { - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED)); - log.error("Pump connection timed out"); - } - connectionInProgress = false; - mWakeLock.release(); - } + }).start(); + } + + public void stopConnecting() { + if (mSerialIOThread != null) + mSerialIOThread.disconnect("stopConnecting"); } private void getBTSocketForSelectedPump() { @@ -276,7 +260,7 @@ public class DanaRExecutionService extends Service { mSerialIOThread.disconnect("EventPreferenceChange"); } - private boolean getPumpStatus() { + public void getPumpStatus() { try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); @@ -288,7 +272,7 @@ public class DanaRExecutionService extends Service { if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(checkValue); if (!checkValue.received) { - return false; + return; } } @@ -300,28 +284,6 @@ public class DanaRExecutionService extends Service { mSerialIOThread.sendMessage(exStatusMsg); MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); - if (!statusMsg.received) { - mSerialIOThread.sendMessage(statusMsg); - } - if (!statusBasicMsg.received) { - mSerialIOThread.sendMessage(statusBasicMsg); - } - if (!tempStatusMsg.received) { - // Load of status of current basal rate failed, give one more try - mSerialIOThread.sendMessage(tempStatusMsg); - } - if (!exStatusMsg.received) { - // Load of status of current extended bolus failed, give one more try - mSerialIOThread.sendMessage(exStatusMsg); - } - - // Check we have really current status of pump - if (!statusMsg.received || !statusBasicMsg.received || !tempStatusMsg.received || !exStatusMsg.received) { - waitMsec(10 * 1000); - log.debug("getPumpStatus failed"); - return false; - } - Date now = new Date(); if (danaRPump.lastSettingsRead.getTime() + 60 * 60 * 1000L < now.getTime() || !MainApp.getSpecificPlugin(DanaRPlugin.class).isInitialized()) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); @@ -352,7 +314,7 @@ public class DanaRExecutionService extends Service { MainApp.bus().post(new EventDanaRNewStatus()); MainApp.bus().post(new EventInitializationChanged()); NSUpload.uploadDeviceStatus(); - if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning ) { + if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); @@ -361,11 +323,9 @@ public class DanaRExecutionService extends Service { } catch (Exception e) { log.error("Unhandled exception", e); } - return true; } public boolean tempBasal(int percent, int durationInHours) { - connect("tempBasal"); if (!isConnected()) return false; if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); @@ -380,7 +340,6 @@ public class DanaRExecutionService extends Service { } public boolean tempBasalStop() { - connect("tempBasalStop"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); @@ -390,7 +349,6 @@ public class DanaRExecutionService extends Service { } public boolean extendedBolus(double insulin, int durationInHalfHours) { - connect("extendedBolus"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); @@ -400,7 +358,6 @@ public class DanaRExecutionService extends Service { } public boolean extendedBolusStop() { - connect("extendedBolusStop"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); @@ -409,7 +366,7 @@ public class DanaRExecutionService extends Service { return true; } - public boolean bolus(double amount, int carbs, Treatment t) { + public boolean bolus(double amount, int carbs, final Treatment t) { bolusingTreatment = t; int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); MessageBase start; @@ -419,7 +376,6 @@ public class DanaRExecutionService extends Service { start = new MsgBolusStartWithSpeed(amount, preferencesSpeed); MsgBolusStop stop = new MsgBolusStop(amount, t); - connect("bolus"); if (!isConnected()) return false; if (carbs > 0) { @@ -437,7 +393,7 @@ public class DanaRExecutionService extends Service { } while (!stop.stopped && !start.failed) { waitMsec(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 5 sec expecting broken comm + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm stop.stopped = true; stop.forced = true; log.debug("Communication stopped"); @@ -475,16 +431,27 @@ public class DanaRExecutionService extends Service { MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } - connect("bolusingInterrupted"); - getPumpStatus(); - if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old - t.insulin = danaRPump.lastBolusAmount; - log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); - } else { - log.debug("Bolus amount in history too old: " + danaRPump.lastBolusTime.toLocaleString()); + + final Object o = new Object(); + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusingInterrupted", new Callback() { + @Override + public void run() { + if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old + t.insulin = danaRPump.lastBolusAmount; + log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); + } else { + log.debug("Bolus amount in history too old: " + danaRPump.lastBolusTime.toLocaleString()); + } + o.notify(); + } + }); + try { + o.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); } } else { - getPumpStatus(); + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); } return true; } @@ -506,16 +473,15 @@ public class DanaRExecutionService extends Service { } public boolean carbsEntry(int amount) { - connect("carbsEntry"); if (!isConnected()) return false; MsgSetCarbsEntry msg = new MsgSetCarbsEntry(System.currentTimeMillis(), amount); mSerialIOThread.sendMessage(msg); return true; } - public boolean loadHistory(byte type) { - connect("loadHistory"); - if (!isConnected()) return false; + public PumpEnactResult loadHistory(byte type) { + PumpEnactResult result = new PumpEnactResult(); + if (!isConnected()) return result; MessageBase msg = null; switch (type) { case RecordTypes.RECORD_TYPE_ALARM: @@ -555,11 +521,12 @@ public class DanaRExecutionService extends Service { } waitMsec(200); mSerialIOThread.sendMessage(new MsgPCCommStop()); - return true; + result.success = true; + result.comment = "OK"; + return result; } public boolean updateBasalsInPump(final Profile profile) { - connect("updateBasalsInPump"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index cda438aded..2070444f96 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -61,9 +61,9 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf return DanaRFragment.class.getName(); } - private boolean fragmentPumpEnabled = false; - private boolean fragmentProfileEnabled = false; - private boolean fragmentPumpVisible = true; + private static boolean fragmentPumpEnabled = false; + private static boolean fragmentProfileEnabled = false; + private static boolean fragmentPumpVisible = true; private static DanaRKoreanExecutionService sExecutionService; @@ -201,11 +201,11 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf @Override public void setFragmentEnabled(int type, boolean fragmentEnabled) { if (type == PluginBase.PROFILE) - this.fragmentProfileEnabled = fragmentEnabled; + fragmentProfileEnabled = fragmentEnabled; else if (type == PluginBase.PUMP) - this.fragmentPumpEnabled = fragmentEnabled; + fragmentPumpEnabled = fragmentEnabled; // if pump profile was enabled need to switch to another too - if (type == PluginBase.PUMP && !fragmentEnabled && this.fragmentProfileEnabled) { + if (type == PluginBase.PUMP && !fragmentEnabled && fragmentProfileEnabled) { setFragmentEnabled(PluginBase.PROFILE, false); setFragmentVisible(PluginBase.PROFILE, false); NSProfilePlugin.getPlugin().setFragmentEnabled(PluginBase.PROFILE, true); @@ -216,7 +216,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf @Override public void setFragmentVisible(int type, boolean fragmentVisible) { if (type == PluginBase.PUMP) - this.fragmentPumpVisible = fragmentVisible; + fragmentPumpVisible = fragmentVisible; } @Override @@ -247,27 +247,35 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf // Pump interface @Override - public int setNewBasalProfile(Profile profile) { + public PumpEnactResult setNewBasalProfile(Profile profile) { + PumpEnactResult result = new PumpEnactResult(); + if (sExecutionService == null) { log.error("setNewBasalProfile sExecutionService is null"); - return FAILED; + result.comment = "setNewBasalProfile sExecutionService is null"; + return result; } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!sExecutionService.updateBasalsInPump(profile)) { Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - return SUCCESS; + result.success = true; + result.enacted = true; + result.comment = "OK"; + return result; } } @@ -296,13 +304,6 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf return pump.lastConnection; } - @Override - public void refreshDataFromPump(String reason) { - if (!isConnected() && !isConnecting()) { - doConnect(reason); - } - } - @Override public double getBaseBasalRate() { return pump.currentBasal; @@ -315,8 +316,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) { Treatment t = new Treatment(); boolean connectionOK = false; - if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) - connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, t); + if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, t); PumpEnactResult result = new PumpEnactResult(); result.success = connectionOK; result.bolusDelivered = t.insulin; @@ -352,9 +352,10 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, boolean enforceNew) { // Recheck pump status if older than 30 min - if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { - doConnect("setTempBasalAbsolute old data"); - } + //This should not be needed while using queue because connection should be done before calling this + //if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { + // connect("setTempBasalAbsolute old data"); + //} PumpEnactResult result = new PumpEnactResult(); @@ -393,9 +394,12 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf Integer percentRate = Double.valueOf(absoluteRate / getBaseBasalRate() * 100).intValue(); if (percentRate < 100) percentRate = Round.ceilTo((double) percentRate, 10d).intValue(); else percentRate = Round.floorTo((double) percentRate, 10d).intValue(); - if (percentRate > 200) { - percentRate = 200; + if (percentRate > getPumpDescription().maxTempPercent) { + percentRate = getPumpDescription().maxTempPercent; } + if (Config.logPumpActions) + log.debug("setTempBasalAbsolute: Calculated percent rate: " + percentRate); + // If extended in progress if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress() && useExtendedBoluses) { if (Config.logPumpActions) @@ -409,7 +413,10 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf // Check if some temp is already in progress if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) { // Correct basal already set ? - if (MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis()).percentRate == percentRate) { + TemporaryBasal running = MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis()); + if (Config.logPumpActions) + log.debug("setTempBasalAbsolute: currently running: " + running.toString()); + if (running.percentRate == percentRate) { if (enforceNew) { cancelTempBasal(true); } else { @@ -450,7 +457,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf Double extendedRateToSet = absoluteRate - getBaseBasalRate(); extendedRateToSet = configBuilderPlugin.applyBasalConstraints(extendedRateToSet); // needs to be rounded to 0.1 - extendedRateToSet = Round.roundTo(extendedRateToSet, pumpDescription.extendedBolusStep * 2); // *2 because of 30 min + extendedRateToSet = Round.roundTo(extendedRateToSet, pumpDescription.extendedBolusStep * 2); // *2 because of halfhours // What is current rate of extended bolusing in u/h? if (Config.logPumpActions) { @@ -650,7 +657,8 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf } } - public static void doConnect(String from) { + @Override + public void connect(String from) { if (sExecutionService != null) { sExecutionService.connect(from); pumpDescription.basalStep = pump.basalStep; @@ -658,18 +666,31 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf } } - public static boolean isConnected() { + @Override + public boolean isConnected() { return sExecutionService != null && sExecutionService.isConnected(); } - public static boolean isConnecting() { + @Override + public boolean isConnecting() { return sExecutionService != null && sExecutionService.isConnecting(); } - public static void doDisconnect(String from) { + @Override + public void disconnect(String from) { if (sExecutionService != null) sExecutionService.disconnect(from); } + @Override + public void stopConnecting() { + if (sExecutionService != null) sExecutionService.stopConnecting(); + } + + @Override + public void getPumpStatus() { + if (sExecutionService != null) sExecutionService.getPumpStatus(); + } + @Override public JSONObject getJSONStatus() { if (pump.lastConnection.getTime() + 5 * 60 * 1000L < System.currentTimeMillis()) { @@ -733,10 +754,15 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf */ @Override - public boolean loadHistory(byte type) { + public PumpEnactResult loadHistory(byte type) { return sExecutionService.loadHistory(type); } + @Override + public PumpEnactResult loadEvents() { + return null; // no history, not needed + } + /** * Constraint interface */ diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java index 7536bd278c..684fa30997 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java @@ -32,8 +32,7 @@ public class MsgCheckValue_k extends MessageBase { pump.protocol = intFromBuff(bytes, 1, 1); pump.productCode = intFromBuff(bytes, 2, 1); if (pump.model != DanaRPump.DOMESTIC_MODEL) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.wrongpumpdriverselected), R.raw.error); - ((DanaRKoreanPlugin)MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).doDisconnect("Wrong Model"); + DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected"); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java index f54b8edb30..3bfd08c64d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java @@ -8,8 +8,11 @@ import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.events.EventRefreshOverview; +import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Notification; +import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase; @@ -27,8 +30,9 @@ public class MsgInitConnStatusTime_k extends MessageBase { public void handleMessage(byte[] bytes) { 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"); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + MainApp.bus().post(new EventNewNotification(notification)); + DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to export DanaR"); MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentEnabled(PluginBase.PUMP, false); MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentVisible(PluginBase.PUMP, false); @@ -37,13 +41,14 @@ public class MsgInitConnStatusTime_k extends MessageBase { DanaRPump.getInstance().lastConnection = new Date(0); // mark not initialized //If profile coming from pump, switch it as well - if(MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isEnabled(PluginBase.PROFILE)){ + if (MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isEnabled(PluginBase.PROFILE)) { (MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setFragmentEnabled(PluginBase.PROFILE, false); (MainApp.getSpecificPlugin(DanaRPlugin.class)).setFragmentEnabled(PluginBase.PROFILE, true); } MainApp.getConfigBuilder().storeSettings(); - MainApp.bus().post(new EventRefreshOverview("MsgInitConnStatusTime_k")); + MainApp.bus().post(new EventRefreshGui()); + ConfigBuilderPlugin.getCommandQueue().readStatus("PumpDriverChange", null); // force new connection return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java index f77c03e337..20ed22d4f8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java @@ -27,6 +27,7 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; @@ -34,6 +35,8 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusProgress; @@ -75,6 +78,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgCheckValue_k; import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgSettingBasal_k; import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgStatusBasic_k; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; import info.nightscout.utils.ToastUtils; @@ -88,14 +92,12 @@ public class DanaRKoreanExecutionService extends Service { private BluetoothSocket mRfcommSocket; private BluetoothDevice mBTDevice; - private PowerManager.WakeLock mWakeLock; private IBinder mBinder = new LocalBinder(); private DanaRPump danaRPump = DanaRPump.getInstance(); private Treatment bolusingTreatment = null; private static Boolean connectionInProgress = false; - private static final Object connectionLock = new Object(); private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); @@ -119,9 +121,6 @@ public class DanaRKoreanExecutionService extends Service { public DanaRKoreanExecutionService() { registerBus(); MainApp.instance().getApplicationContext().registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)); - - PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DanaRKoreanExecutionService"); } public class LocalBinder extends Binder { @@ -183,35 +182,28 @@ public class DanaRKoreanExecutionService extends Service { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); return; } - while (isConnected() || isConnecting()) { - if (Config.logDanaBTComm) - log.debug("already connected/connecting from: " + from); - waitMsec(3000); - } - final long maxConnectionTime = 5 * 60 * 1000L; // 5 min - synchronized (connectionLock) { - //log.debug("entering connection while loop"); - connectionInProgress = true; - mWakeLock.acquire(); - getBTSocketForSelectedPump(); - if (mRfcommSocket == null || mBTDevice == null) - return; // Device not found - long startTime = System.currentTimeMillis(); - while (!isConnected() && startTime + maxConnectionTime >= System.currentTimeMillis()) { - long secondsElapsed = (System.currentTimeMillis() - startTime) / 1000L; - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed)); - if (Config.logDanaBTComm) - log.debug("connect waiting " + secondsElapsed + "sec from: " + from); + + if (connectionInProgress) + return; + + new Thread(new Runnable() { + @Override + public void run() { + connectionInProgress = true; + getBTSocketForSelectedPump(); + if (mRfcommSocket == null || mBTDevice == null) { + connectionInProgress = false; + return; // Device not found + } + try { mRfcommSocket.connect(); } catch (IOException e) { //log.error("Unhandled exception", e); if (e.getMessage().contains("socket closed")) { log.error("Unhandled exception", e); - break; } } - waitMsec(1000); if (isConnected()) { if (mSerialIOThread != null) { @@ -219,23 +211,16 @@ public class DanaRKoreanExecutionService extends Service { } mSerialIOThread = new SerialIOThread(mRfcommSocket); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED, 0)); - if (!getPumpStatus()) { - mSerialIOThread.disconnect("getPumpStatus failed"); - waitMsec(3000); - if (!MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isEnabled(PluginBase.PUMP)) - return; - getBTSocketForSelectedPump(); - startTime = System.currentTimeMillis(); - } } + + connectionInProgress = false; } - if (!isConnected()) { - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED)); - log.error("Pump connection timed out"); - } - connectionInProgress = false; - mWakeLock.release(); - } + }).start(); + } + + public void stopConnecting() { + if (mSerialIOThread != null) + mSerialIOThread.disconnect("stopConnecting"); } private void getBTSocketForSelectedPump() { @@ -270,7 +255,7 @@ public class DanaRKoreanExecutionService extends Service { mSerialIOThread.disconnect("EventPreferenceChange"); } - private boolean getPumpStatus() { + public void getPumpStatus() { try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); //MsgStatus_k statusMsg = new MsgStatus_k(); @@ -282,7 +267,7 @@ public class DanaRKoreanExecutionService extends Service { if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(checkValue); if (!checkValue.received) { - return false; + return; } } @@ -294,28 +279,6 @@ public class DanaRKoreanExecutionService extends Service { mSerialIOThread.sendMessage(exStatusMsg); MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); -// if (!statusMsg.received) { -// mSerialIOThread.sendMessage(statusMsg); -// } - if (!statusBasicMsg.received) { - mSerialIOThread.sendMessage(statusBasicMsg); - } - if (!tempStatusMsg.received) { - // Load of status of current basal rate failed, give one more try - mSerialIOThread.sendMessage(tempStatusMsg); - } - if (!exStatusMsg.received) { - // Load of status of current extended bolus failed, give one more try - mSerialIOThread.sendMessage(exStatusMsg); - } - - // Check we have really current status of pump - if (/*!statusMsg.received || */!statusBasicMsg.received || !tempStatusMsg.received || !exStatusMsg.received) { - waitMsec(10 * 1000); - log.debug("getPumpStatus failed"); - return false; - } - Date now = new Date(); if (danaRPump.lastSettingsRead.getTime() + 60 * 60 * 1000L < now.getTime() || !MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isInitialized()) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); @@ -343,7 +306,7 @@ public class DanaRKoreanExecutionService extends Service { MainApp.bus().post(new EventDanaRNewStatus()); MainApp.bus().post(new EventInitializationChanged()); NSUpload.uploadDeviceStatus(); - if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning ) { + if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); @@ -352,11 +315,10 @@ public class DanaRKoreanExecutionService extends Service { } catch (Exception e) { log.error("Unhandled exception", e); } - return true; + return; } public boolean tempBasal(int percent, int durationInHours) { - connect("tempBasal"); if (!isConnected()) return false; if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); @@ -371,7 +333,6 @@ public class DanaRKoreanExecutionService extends Service { } public boolean tempBasalStop() { - connect("tempBasalStop"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); @@ -381,7 +342,6 @@ public class DanaRKoreanExecutionService extends Service { } public boolean extendedBolus(double insulin, int durationInHalfHours) { - connect("extendedBolus"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); @@ -391,7 +351,6 @@ public class DanaRKoreanExecutionService extends Service { } public boolean extendedBolusStop() { - connect("extendedBolusStop"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); @@ -400,12 +359,11 @@ public class DanaRKoreanExecutionService extends Service { return true; } - public boolean bolus(double amount, int carbs, Treatment t) { + public boolean bolus(double amount, int carbs, final Treatment t) { bolusingTreatment = t; MsgBolusStart start = new MsgBolusStart(amount); MsgBolusStop stop = new MsgBolusStop(amount, t); - connect("bolus"); if (!isConnected()) return false; if (carbs > 0) { @@ -413,6 +371,7 @@ public class DanaRKoreanExecutionService extends Service { } MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables + long bolusStart = System.currentTimeMillis(); if (!stop.stopped) { mSerialIOThread.sendMessage(start); @@ -422,15 +381,56 @@ public class DanaRKoreanExecutionService extends Service { } while (!stop.stopped && !start.failed) { waitMsec(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 5 * 1000L) { // if i didn't receive status for more than 5 sec expecting broken comm + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm stop.stopped = true; stop.forced = true; log.debug("Communication stopped"); } } waitMsec(300); + + EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); + bolusingEvent.t = t; + bolusingEvent.percent = 99; + bolusingTreatment = null; - getPumpStatus(); + + int speed = 12; + + // try to find real amount if bolusing was interrupted or comm failed + if (t.insulin != amount) { + disconnect("bolusingInterrupted"); + long bolusDurationInMSec = (long) (amount * speed * 1000); + long expectedEnd = bolusStart + bolusDurationInMSec + 3000; + + while (System.currentTimeMillis() < expectedEnd) { + long waitTime = expectedEnd - System.currentTimeMillis(); + bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + MainApp.bus().post(bolusingEvent); + SystemClock.sleep(1000); + } + + final Object o = new Object(); + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusingInterrupted", new Callback() { + @Override + public void run() { + if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old + t.insulin = danaRPump.lastBolusAmount; + log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); + } else { + log.debug("Bolus amount in history too old: " + danaRPump.lastBolusTime.toLocaleString()); + } + o.notify(); + } + }); + try { + o.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + } return true; } @@ -451,16 +451,15 @@ public class DanaRKoreanExecutionService extends Service { } public boolean carbsEntry(int amount) { - connect("carbsEntry"); if (!isConnected()) return false; MsgSetCarbsEntry msg = new MsgSetCarbsEntry(System.currentTimeMillis(), amount); mSerialIOThread.sendMessage(msg); return true; } - public boolean loadHistory(byte type) { - connect("loadHistory"); - if (!isConnected()) return false; + public PumpEnactResult loadHistory(byte type) { + PumpEnactResult result = new PumpEnactResult(); + if (!isConnected()) return result; MessageBase msg = null; switch (type) { case RecordTypes.RECORD_TYPE_ALARM: @@ -500,11 +499,12 @@ public class DanaRKoreanExecutionService extends Service { } waitMsec(200); mSerialIOThread.sendMessage(new MsgPCCommStop()); - return true; + result.success = true; + result.comment = "OK"; + return result; } public boolean updateBasalsInPump(final Profile profile) { - connect("updateBasalsInPump"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index 916213c270..c9c23650dd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -20,6 +20,8 @@ import java.util.Objects; import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileStore; @@ -27,7 +29,7 @@ import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; -import info.nightscout.androidaps.events.EventPumpStatusChanged; +import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.ConstraintsInterface; import info.nightscout.androidaps.interfaces.DanaRInterface; import info.nightscout.androidaps.interfaces.PluginBase; @@ -42,10 +44,6 @@ import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRFragment; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; -import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.plugins.PumpDanaRS.events.EventDanaRSDeviceChange; import info.nightscout.androidaps.plugins.PumpDanaRS.services.DanaRSService; import info.nightscout.utils.DateUtil; @@ -219,60 +217,54 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, mDeviceName = SP.getString(R.string.key_danars_name, ""); } - public static void connectIfNotConnected(String from) { - if (!isConnected()) - connect(from); - } - - public static void connect(String from) { + @Override + public void connect(String from) { log.debug("RS connect from: " + from); if (danaRSService != null && !mDeviceAddress.equals("") && !mDeviceName.equals("")) { final Object o = new Object(); danaRSService.connect(from, mDeviceAddress, o); - synchronized (o) { - try { - o.wait(20000); - } catch (InterruptedException e) { - log.error("InterruptedException " + e); - } - } pumpDescription.basalStep = pump.basalStep; pumpDescription.bolusStep = pump.bolusStep; - if (isConnected()) - log.debug("RS connected: " + from); - else { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.connectiontimedout))); - danaRSService.stopConnecting(); - log.debug("RS connect failed from: " + from); - } } } - public static boolean isConnected() { + @Override + public boolean isConnected() { return danaRSService != null && danaRSService.isConnected(); } - public static boolean isConnecting() { + @Override + public boolean isConnecting() { return danaRSService != null && danaRSService.isConnecting(); } - public static void disconnect(String from) { + @Override + public void disconnect(String from) { if (danaRSService != null) danaRSService.disconnect(from); } - public static void sendMessage(DanaRS_Packet message) { - if (danaRSService != null) danaRSService.sendMessage(message); + @Override + public void stopConnecting() { + if (danaRSService != null) danaRSService.stopConnecting(); + } + + @Override + public void getPumpStatus() { + if (danaRSService != null) + danaRSService.getPumpStatus(); } // DanaR interface @Override - public boolean loadHistory(byte type) { - connectIfNotConnected("loadHistory"); - danaRSService.loadHistory(type); - disconnect("LoadHistory"); - return true; + public PumpEnactResult loadHistory(byte type) { + return danaRSService.loadHistory(type); + } + + @Override + public PumpEnactResult loadEvents() { + return danaRSService.loadEvents(); } // Constraints interface @@ -383,30 +375,35 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, } @Override - public synchronized int setNewBasalProfile(Profile profile) { + public PumpEnactResult setNewBasalProfile(Profile profile) { + PumpEnactResult result = new PumpEnactResult(); + if (danaRSService == null) { log.error("setNewBasalProfile sExecutionService is null"); - return FAILED; + result.comment = "setNewBasalProfile sExecutionService is null"; + return result; } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } - connectIfNotConnected("updateBasalsInPump"); if (!danaRSService.updateBasalsInPump(profile)) { Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - disconnect("SetNewBasalProfile"); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - disconnect("SetNewBasalProfile"); - return SUCCESS; + result.success = true; + result.enacted = true; + result.comment = "OK"; + return result; } } @@ -435,16 +432,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, return pump.lastConnection; } - @Override - public synchronized void refreshDataFromPump(String reason) { - log.debug("Refreshing data from pump"); - if (!isConnected() && !isConnecting()) { - connect(reason); - disconnect("RefreshDataFromPump"); - } else - log.debug("Already connecting ..."); - } - @Override public double getBaseBasalRate() { return pump.currentBasal; @@ -482,7 +469,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, Treatment t = new Treatment(); boolean connectionOK = false; - connectIfNotConnected("bolus"); if (detailedBolusInfo.insulin > 0 || carbs > 0) connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000 + 1000, t); // +1000 to make the record different PumpEnactResult result = new PumpEnactResult(); @@ -492,7 +478,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); - disconnect("DeliverTreatment"); return result; } else { PumpEnactResult result = new PumpEnactResult(); @@ -518,9 +503,11 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, @Override public synchronized PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, boolean enforceNew) { // Recheck pump status if older than 30 min - if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { - connect("setTempBasalAbsolute old data"); - } + + //This should not be needed while using queue because connection should be done before calling this + //if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { + // connect("setTempBasalAbsolute old data"); + //} PumpEnactResult result = new PumpEnactResult(); @@ -607,7 +594,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, } if (percent > getPumpDescription().maxTempPercent) percent = getPumpDescription().maxTempPercent; - TemporaryBasal runningTB = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()); + TemporaryBasal runningTB = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()); if (runningTB != null && runningTB.percentRate == percent) { result.enacted = false; result.success = true; @@ -622,7 +609,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, return result; } int durationInHours = Math.max(durationInMinutes / 60, 1); - connectIfNotConnected("tempbasal"); boolean connectionOK = danaRSService.tempBasal(percent, durationInHours); if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; @@ -635,7 +621,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, result.isPercent = true; if (Config.logPumpActions) log.debug("setTempBasalPercent: OK"); - disconnect("setTempBasalPercent"); return result; } result.enacted = false; @@ -647,7 +632,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, public synchronized PumpEnactResult setHighTempBasalPercent(Integer percent) { PumpEnactResult result = new PumpEnactResult(); - connectIfNotConnected("hightempbasal"); boolean connectionOK = danaRSService.highTempBasal(percent); if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; @@ -659,7 +643,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, result.isPercent = true; if (Config.logPumpActions) log.debug("setHighTempBasalPercent: OK"); - disconnect("setHighTempBasalPercent"); return result; } result.enacted = false; @@ -690,7 +673,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, log.debug("setExtendedBolus: Correct extended bolus already set. Current: " + pump.extendedBolusAmount + " Asked: " + insulin); return result; } - connectIfNotConnected("extendedBolus"); boolean connectionOK = danaRSService.extendedBolus(insulin, durationInHalfHours); if (connectionOK && pump.isExtendedInProgress && Math.abs(pump.extendedBolusAmount - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = true; @@ -703,7 +685,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, result.isPercent = false; if (Config.logPumpActions) log.debug("setExtendedBolus: OK"); - disconnect("setExtendedBolus"); return result; } result.enacted = false; @@ -716,13 +697,11 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, @Override public synchronized PumpEnactResult cancelTempBasal(boolean force) { PumpEnactResult result = new PumpEnactResult(); - TemporaryBasal runningTB = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()); + TemporaryBasal runningTB = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()); if (runningTB != null) { - connectIfNotConnected("tempBasalStop"); danaRSService.tempBasalStop(); result.enacted = true; result.isTempCancel = true; - disconnect("cancelTempBasal"); } if (!pump.isTempBasalInProgress) { result.success = true; @@ -745,11 +724,9 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, PumpEnactResult result = new PumpEnactResult(); ExtendedBolus runningEB = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()); if (runningEB != null) { - connectIfNotConnected("extendedBolusStop"); danaRSService.extendedBolusStop(); result.enacted = true; result.isTempCancel = true; - disconnect("extendedBolusStop"); } if (!pump.isExtendedInProgress) { result.success = true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java index 8e58dc2cb5..c11b75764c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java @@ -30,8 +30,8 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet { private int min = 0; private int sec = 0; - public boolean done; - private int totalCount; + public static boolean done; + private static int totalCount; public static long lastEventTimeLoaded = 0; @@ -77,6 +77,7 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet { // Last record if (recordCode == (byte) 0xFF) { done = true; + log.debug("Last record received"); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java index 46fc6fdf39..887a9d852a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java @@ -42,7 +42,7 @@ public class DanaRS_Packet_Bolus_Set_Extended_Bolus extends DanaRS_Packet { public void handleMessage(byte[] data) { int result = intFromBuff(data, 0, 1); if (Config.logDanaMessageDetail) { - if (result != 0) + if (result == 0) log.debug("Result OK"); else log.error("Result Error: " + result); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java index 42f077887d..f8d18a4d22 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java @@ -10,8 +10,6 @@ import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; -import android.os.Handler; -import android.os.HandlerThread; import android.os.SystemClock; import com.cozmo.danar.util.BleCommandUtil; @@ -25,7 +23,6 @@ import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -33,7 +30,6 @@ import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin; import info.nightscout.androidaps.plugins.PumpDanaRS.activities.PairingHelperActivity; -import info.nightscout.androidaps.plugins.PumpDanaRS.activities.PairingProgressDialog; import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRSMessageHashTable; import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet; import info.nightscout.androidaps.plugins.PumpDanaRS.events.EventDanaRSPacket; @@ -62,27 +58,12 @@ public class BLEComm { return instance; } - private Object mConfirmConnect = null; - private final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); private ScheduledFuture scheduledDisconnection = null; private DanaRS_Packet processsedMessage = null; private ArrayList mSendQueue = new ArrayList<>(); - // Variables for connection progress (elapsed time) - private Handler sHandler; - private HandlerThread sHandlerThread; - private long connectionStartTime = 0; - private final Runnable updateProgress = new Runnable() { - @Override - public void run() { - long secondsElapsed = (System.currentTimeMillis() - connectionStartTime) / 1000; - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed)); - sHandler.postDelayed(updateProgress, 1000); - } - }; - private BluetoothManager mBluetoothManager = null; private BluetoothAdapter mBluetoothAdapter = null; private BluetoothDevice mBluetoothDevice = null; @@ -101,12 +82,6 @@ public class BLEComm { BLEComm(DanaRSService service) { this.service = service; initialize(); - - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(PairingProgressDialog.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } } private boolean initialize() { @@ -138,7 +113,6 @@ public class BLEComm { } public boolean connect(String from, String address, Object confirmConnect) { - mConfirmConnect = confirmConnect; BluetoothManager tBluetoothManager = ((BluetoothManager) MainApp.instance().getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE)); if (tBluetoothManager == null) { return false; @@ -160,9 +134,6 @@ public class BLEComm { return false; } - connectionStartTime = System.currentTimeMillis(); - - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING)); isConnecting = true; BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); @@ -171,10 +142,9 @@ public class BLEComm { return false; } - sHandler.post(updateProgress); + log.debug("Trying to create a new connection."); mBluetoothGatt = device.connectGatt(service.getApplicationContext(), false, mGattCallback); setCharacteristicNotification(getUARTReadBTGattChar(), true); - log.debug("Trying to create a new connection."); mBluetoothDevice = device; mBluetoothDeviceAddress = address; mBluetoothDeviceName = device.getName(); @@ -183,7 +153,6 @@ public class BLEComm { public void stopConnecting() { isConnecting = false; - sHandler.removeCallbacks(updateProgress); // just to be sure } public void disconnect(String from) { @@ -234,7 +203,7 @@ public class BLEComm { } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { close(); isConnected = false; - sHandler.removeCallbacks(updateProgress); // just to be sure + isConnecting = false; MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED)); log.debug("Device was disconnected " + gatt.getDevice().getName());//Device was disconnected } @@ -242,14 +211,9 @@ public class BLEComm { public void onServicesDiscovered(BluetoothGatt gatt, int status) { log.debug("onServicesDiscovered"); - - isConnecting = false; - if (status == BluetoothGatt.GATT_SUCCESS) { findCharacteristic(); } - // stop sending connection progress - sHandler.removeCallbacks(updateProgress); SendPumpCheck(); // 1st message sent to pump after connect } @@ -516,18 +480,11 @@ public class BLEComm { pass = pass ^ 3463; DanaRPump.getInstance().rs_password = Integer.toHexString(pass); log.debug("Pump user password: " + Integer.toHexString(pass)); - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED)); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED)); isConnected = true; isConnecting = false; - service.getPumpStatus(); - scheduleDisconnection(); - if (mConfirmConnect != null) { - synchronized (mConfirmConnect) { - mConfirmConnect.notify(); - mConfirmConnect = null; - } - } + log.debug("RS connected and status read"); break; } break; @@ -557,7 +514,6 @@ public class BLEComm { } else { log.error("Unknown message received " + DanaRS_Packet.toHexString(inputBuffer)); } - scheduleDisconnection(); break; } } catch (Exception e) { @@ -652,7 +608,6 @@ public class BLEComm { if (!message.isReceived()) { log.warn("Reply not received " + message.getFriendlyName()); } - scheduleDisconnection(); } private void SendPairingRequest() { @@ -681,22 +636,4 @@ public class BLEComm { writeCharacteristic_NO_RESPONSE(getUARTWriteBTGattChar(), bytes); } - public void scheduleDisconnection() { - - class DisconnectRunnable implements Runnable { - public void run() { - disconnect("scheduleDisconnection"); - scheduledDisconnection = null; - } - } - // prepare task for execution in 30 sec - // cancel waiting task to prevent sending multiple disconnections - if (scheduledDisconnection != null) - scheduledDisconnection.cancel(false); - Runnable task = new DisconnectRunnable(); - final int sec = 30; - scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS); - log.debug("Disconnection scheduled"); - } - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java index f7c9b00efa..c59d43e7f9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java @@ -20,10 +20,12 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventPumpStatusChanged; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; @@ -69,6 +71,7 @@ import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Notify_D import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Notify_Delivery_Rate_Display; import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Option_Get_Pump_Time; import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Option_Set_Pump_Time; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; @@ -77,7 +80,6 @@ public class DanaRSService extends Service { private BLEComm bleComm = BLEComm.getInstance(this); - private PowerManager.WakeLock mWakeLock; private IBinder mBinder = new LocalBinder(); private DanaRPump danaRPump = DanaRPump.getInstance(); @@ -92,10 +94,6 @@ public class DanaRSService extends Service { // Ignore } MainApp.bus().register(this); - - PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, DanaRSService.class.getSimpleName()); - } public boolean isConnected() { @@ -122,7 +120,7 @@ public class DanaRSService extends Service { bleComm.sendMessage(message); } - protected boolean getPumpStatus() { + public void getPumpStatus() { try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); @@ -172,10 +170,10 @@ public class DanaRSService extends Service { } catch (Exception e) { log.error("Unhandled exception", e); } - return true; + log.debug("Pump status loaded"); } - public boolean loadEvents() { + public PumpEnactResult loadEvents() { DanaRS_Packet_APS_History_Events msg; if (lastHistoryFetched == 0) { msg = new DanaRS_Packet_APS_History_Events(0); @@ -189,7 +187,8 @@ public class DanaRSService extends Service { SystemClock.sleep(100); } lastHistoryFetched = DanaRS_Packet_APS_History_Events.lastEventTimeLoaded; - return true; + log.debug("Events loaded"); + return new PumpEnactResult().success(true); } @@ -231,7 +230,7 @@ public class DanaRSService extends Service { } } - EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); + final EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); bolusingEvent.t = t; bolusingEvent.percent = 99; @@ -256,14 +255,16 @@ public class DanaRSService extends Service { MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } - if (!(isConnected())) - DanaRSPlugin.getPlugin().connect("loadEvents"); - loadEvents(); - // reread bolus status - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); - bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Step_Bolus_Information()); // last bolus - bolusingEvent.percent = 100; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + ConfigBuilderPlugin.getCommandQueue().loadEvents(new Callback() { + @Override + public void run() { + // reread bolus status + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Step_Bolus_Information()); // last bolus + bolusingEvent.percent = 100; + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + } + }); return true; } @@ -358,8 +359,9 @@ public class DanaRSService extends Service { return true; } - public boolean loadHistory(byte type) { - if (!isConnected()) return false; + public PumpEnactResult loadHistory(byte type) { + PumpEnactResult result = new PumpEnactResult(); + if (!isConnected()) return result; DanaRS_Packet_History_ msg = null; switch (type) { case RecordTypes.RECORD_TYPE_ALARM: @@ -400,7 +402,9 @@ public class DanaRSService extends Service { SystemClock.sleep(200); bleComm.sendMessage(new DanaRS_Packet_General_Set_History_Upload_Mode(0)); } - return true; + result.success = true; + result.comment = "OK"; + return result; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index f2ad2fd659..c01d49a12c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -61,9 +61,9 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, return DanaRFragment.class.getName(); } - private boolean fragmentPumpEnabled = false; - private boolean fragmentProfileEnabled = false; - private boolean fragmentPumpVisible = false; + private static boolean fragmentPumpEnabled = false; + private static boolean fragmentProfileEnabled = false; + private static boolean fragmentPumpVisible = true; private static DanaRv2ExecutionService sExecutionService; @@ -186,11 +186,11 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, @Override public void setFragmentEnabled(int type, boolean fragmentEnabled) { if (type == PluginBase.PROFILE) - this.fragmentProfileEnabled = fragmentEnabled; + fragmentProfileEnabled = fragmentEnabled; else if (type == PluginBase.PUMP) - this.fragmentPumpEnabled = fragmentEnabled; + fragmentPumpEnabled = fragmentEnabled; // if pump profile was enabled need to switch to another too - if (type == PluginBase.PUMP && !fragmentEnabled && this.fragmentProfileEnabled) { + if (type == PluginBase.PUMP && !fragmentEnabled && fragmentProfileEnabled) { setFragmentEnabled(PluginBase.PROFILE, false); setFragmentVisible(PluginBase.PROFILE, false); NSProfilePlugin.getPlugin().setFragmentEnabled(PluginBase.PROFILE, true); @@ -201,7 +201,7 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, @Override public void setFragmentVisible(int type, boolean fragmentVisible) { if (type == PluginBase.PUMP) - this.fragmentPumpVisible = fragmentVisible; + fragmentPumpVisible = fragmentVisible; } @Override @@ -232,27 +232,35 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, // Pump interface @Override - public int setNewBasalProfile(Profile profile) { + public PumpEnactResult setNewBasalProfile(Profile profile) { + PumpEnactResult result = new PumpEnactResult(); + if (sExecutionService == null) { log.error("setNewBasalProfile sExecutionService is null"); - return FAILED; + result.comment = "setNewBasalProfile sExecutionService is null"; + return result; } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!sExecutionService.updateBasalsInPump(profile)) { Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - return FAILED; + result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - return SUCCESS; + result.success = true; + result.enacted = true; + result.comment = "OK"; + return result; } } @@ -281,13 +289,6 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, return pump.lastConnection; } - @Override - public void refreshDataFromPump(String reason) { - if (!isConnected() && !isConnecting()) { - doConnect(reason); - } - } - @Override public double getBaseBasalRate() { return pump.currentBasal; @@ -360,9 +361,10 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, boolean enforceNew) { // Recheck pump status if older than 30 min - if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { - doConnect("setTempBasalAbsolute old data"); - } + //This should not be needed while using queue because connection should be done before calling this + //if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) { + // connect("setTempBasalAbsolute old data"); + //} PumpEnactResult result = new PumpEnactResult(); @@ -397,7 +399,7 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, if (percentRate > 500) // Special high temp 500/15min percentRate = 500; // Check if some temp is already in progress - if (MainApp.getConfigBuilder().isTempBasalInProgress()) { + if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) { // Correct basal already set ? if (MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()).percentRate == percentRate) { if (!enforceNew) { @@ -514,6 +516,7 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, // needs to be rounded int durationInHalfHours = Math.max(durationInMinutes / 30, 1); insulin = Round.roundTo(insulin, getPumpDescription().extendedBolusStep); + PumpEnactResult result = new PumpEnactResult(); ExtendedBolus runningEB = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()); if (runningEB != null && Math.abs(runningEB.insulin - insulin) < getPumpDescription().extendedBolusStep) { @@ -597,7 +600,8 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, } } - public static void doConnect(String from) { + @Override + public void connect(String from) { if (sExecutionService != null) { sExecutionService.connect(from); pumpDescription.basalStep = pump.basalStep; @@ -605,18 +609,31 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, } } - public static boolean isConnected() { + @Override + public boolean isConnected() { return sExecutionService != null && sExecutionService.isConnected(); } - public static boolean isConnecting() { + @Override + public boolean isConnecting() { return sExecutionService != null && sExecutionService.isConnecting(); } - public static void doDisconnect(String from) { + @Override + public void disconnect(String from) { if (sExecutionService != null) sExecutionService.disconnect(from); } + @Override + public void stopConnecting() { + if (sExecutionService != null) sExecutionService.stopConnecting(); + } + + @Override + public void getPumpStatus() { + if (sExecutionService != null) sExecutionService.getPumpStatus(); + } + @Override public JSONObject getJSONStatus() { if (pump.lastConnection.getTime() + 5 * 60 * 1000L < System.currentTimeMillis()) { @@ -680,10 +697,15 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, */ @Override - public boolean loadHistory(byte type) { + public PumpEnactResult loadHistory(byte type) { return sExecutionService.loadHistory(type); } + @Override + public PumpEnactResult loadEvents() { + return sExecutionService.loadEvents(); + } + /** * Constraint interface */ @@ -787,7 +809,7 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, if (pump.lastBolusTime.getTime() != 0) { ret += "LastBolus: " + DecimalFormatter.to2Decimal(pump.lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", pump.lastBolusTime) + "\n"; } - if (MainApp.getConfigBuilder().isTempBasalInProgress()) { + if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) { ret += "Temp: " + MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()).toStringFull() + "\n"; } if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) { @@ -801,7 +823,6 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, ret += "Batt: " + pump.batteryRemaining + "\n"; return ret; } - // TODO: daily total constraint } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java index d7b37a4b0f..6106780618 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java @@ -3,11 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaRv2.comm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Date; + import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Notification; +import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase; @@ -36,14 +42,32 @@ public class MsgCheckValue_v2 extends MessageBase { 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); - DanaRv2Plugin.doDisconnect("Wrong Model"); - log.debug("Wrong model selected"); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + MainApp.bus().post(new EventNewNotification(notification)); + MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); + log.debug("Wrong model selected. Switching to Korean DanaR"); + MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentEnabled(PluginBase.PUMP, true); + MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentVisible(PluginBase.PUMP, true); + MainApp.getSpecificPlugin(DanaRPlugin.class).setFragmentEnabled(PluginBase.PUMP, false); + MainApp.getSpecificPlugin(DanaRPlugin.class).setFragmentVisible(PluginBase.PUMP, false); + DanaRPump.getInstance().lastConnection = new Date(0); // mark not initialized + + //If profile coming from pump, switch it as well + if(MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginBase.PROFILE)){ + (MainApp.getSpecificPlugin(DanaRPlugin.class)).setFragmentEnabled(PluginBase.PROFILE, false); + (MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setFragmentEnabled(PluginBase.PROFILE, true); + } + + MainApp.getConfigBuilder().storeSettings(); + MainApp.bus().post(new EventRefreshGui()); + ConfigBuilderPlugin.getCommandQueue().readStatus("PumpDriverChange", null); // force new connection + return; } if (pump.protocol != 2) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.wrongpumpdriverselected), R.raw.error); - DanaRKoreanPlugin.doDisconnect("Wrong Model"); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + MainApp.bus().post(new EventNewNotification(notification)); + DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to non APS DanaR"); (MainApp.getSpecificPlugin(DanaRv2Plugin.class)).setFragmentEnabled(PluginBase.PUMP, false); (MainApp.getSpecificPlugin(DanaRv2Plugin.class)).setFragmentVisible(PluginBase.PUMP, false); @@ -57,7 +81,8 @@ public class MsgCheckValue_v2 extends MessageBase { } MainApp.getConfigBuilder().storeSettings(); - MainApp.bus().post(new EventRefreshOverview("MsgCheckValue_v2")); + MainApp.bus().post(new EventRefreshGui()); + ConfigBuilderPlugin.getCommandQueue().readStatus("PumpDriverChange", null); // force new connection return; } if (Config.logDanaMessageDetail) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 6eabb668fb..b6a5732014 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -27,6 +27,7 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; @@ -34,6 +35,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; @@ -48,6 +50,7 @@ import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgSetHistoryEntry_v2 import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgCheckValue_v2; import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusBolusExtended_v2; import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusTempBasal_v2; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; import info.nightscout.utils.ToastUtils; @@ -61,14 +64,12 @@ public class DanaRv2ExecutionService extends Service { private BluetoothSocket mRfcommSocket; private BluetoothDevice mBTDevice; - private PowerManager.WakeLock mWakeLock; private IBinder mBinder = new LocalBinder(); private DanaRPump danaRPump; private Treatment bolusingTreatment = null; private static Boolean connectionInProgress = false; - private static final Object connectionLock = new Object(); private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); @@ -95,9 +96,6 @@ public class DanaRv2ExecutionService extends Service { registerBus(); MainApp.instance().getApplicationContext().registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)); danaRPump = DanaRPump.getInstance(); - - PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DanaRv2ExecutionService"); } public class LocalBinder extends Binder { @@ -159,35 +157,28 @@ public class DanaRv2ExecutionService extends Service { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); return; } - while (isConnected() || isConnecting()) { - if (Config.logDanaBTComm) - log.debug("already connected/connecting from: " + from); - waitMsec(3000); - } - final long maxConnectionTime = 5 * 60 * 1000L; // 5 min - synchronized (connectionLock) { - //log.debug("entering connection while loop"); - connectionInProgress = true; - mWakeLock.acquire(); - getBTSocketForSelectedPump(); - if (mRfcommSocket == null || mBTDevice == null) - return; // Device not found - long startTime = System.currentTimeMillis(); - while (!isConnected() && startTime + maxConnectionTime >= System.currentTimeMillis()) { - long secondsElapsed = (System.currentTimeMillis() - startTime) / 1000L; - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed)); - if (Config.logDanaBTComm) - log.debug("connect waiting " + secondsElapsed + "sec from: " + from); + + if (connectionInProgress) + return; + + new Thread(new Runnable() { + @Override + public void run() { + connectionInProgress = true; + getBTSocketForSelectedPump(); + if (mRfcommSocket == null || mBTDevice == null) { + connectionInProgress = false; + return; // Device not found + } + try { mRfcommSocket.connect(); } catch (IOException e) { //log.error("Unhandled exception", e); if (e.getMessage().contains("socket closed")) { log.error("Unhandled exception", e); - break; } } - waitMsec(1000); if (isConnected()) { if (mSerialIOThread != null) { @@ -195,23 +186,16 @@ public class DanaRv2ExecutionService extends Service { } mSerialIOThread = new SerialIOThread(mRfcommSocket); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED, 0)); - if (!getPumpStatus()) { - mSerialIOThread.disconnect("getPumpStatus failed"); - waitMsec(3000); - if (!MainApp.getSpecificPlugin(DanaRv2Plugin.class).isEnabled(PluginBase.PUMP)) - return; - getBTSocketForSelectedPump(); - startTime = System.currentTimeMillis(); - } } + + connectionInProgress = false; } - if (!isConnected()) { - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED)); - log.error("Pump connection timed out"); - } - connectionInProgress = false; - mWakeLock.release(); - } + }).start(); + } + + public void stopConnecting() { + if (mSerialIOThread != null) + mSerialIOThread.disconnect("stopConnecting"); } private void getBTSocketForSelectedPump() { @@ -246,7 +230,7 @@ public class DanaRv2ExecutionService extends Service { mSerialIOThread.disconnect("EventPreferenceChange"); } - private boolean getPumpStatus() { + public void getPumpStatus() { try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); @@ -258,7 +242,7 @@ public class DanaRv2ExecutionService extends Service { if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(checkValue); if (!checkValue.received) { - return false; + return; } } @@ -270,28 +254,6 @@ public class DanaRv2ExecutionService extends Service { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); - if (!statusMsg.received) { - mSerialIOThread.sendMessage(statusMsg); - } - if (!statusBasicMsg.received) { - mSerialIOThread.sendMessage(statusBasicMsg); - } - if (!tempStatusMsg.received) { - // Load of status of current basal rate failed, give one more try - mSerialIOThread.sendMessage(tempStatusMsg); - } - if (!exStatusMsg.received) { - // Load of status of current extended bolus failed, give one more try - mSerialIOThread.sendMessage(exStatusMsg); - } - - // Check we have really current status of pump - if (!statusMsg.received || !statusBasicMsg.received || !tempStatusMsg.received || !exStatusMsg.received) { - waitMsec(10 * 1000); - log.debug("getPumpStatus failed"); - return false; - } - Date now = new Date(); if (danaRPump.lastSettingsRead.getTime() + 60 * 60 * 1000L < now.getTime() || !MainApp.getSpecificPlugin(DanaRv2Plugin.class).isInitialized()) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); @@ -333,11 +295,10 @@ public class DanaRv2ExecutionService extends Service { } catch (Exception e) { log.error("Unhandled exception", e); } - return true; + return; } public boolean tempBasal(int percent, int durationInHours) { - connect("tempBasal"); if (!isConnected()) return false; if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); @@ -353,7 +314,6 @@ public class DanaRv2ExecutionService extends Service { } public boolean highTempBasal(int percent) { - connect("highTempBasal"); if (!isConnected()) return false; if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); @@ -369,7 +329,6 @@ public class DanaRv2ExecutionService extends Service { } public boolean tempBasalStop() { - connect("tempBasalStop"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); @@ -380,7 +339,6 @@ public class DanaRv2ExecutionService extends Service { } public boolean extendedBolus(double insulin, int durationInHalfHours) { - connect("extendedBolus"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); @@ -391,7 +349,6 @@ public class DanaRv2ExecutionService extends Service { } public boolean extendedBolusStop() { - connect("extendedBolusStop"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); @@ -401,7 +358,7 @@ public class DanaRv2ExecutionService extends Service { return true; } - public boolean bolus(final double amount, int carbs, long carbtime, Treatment t) { + public boolean bolus(final double amount, int carbs, long carbtime, final Treatment t) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); bolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); @@ -412,7 +369,6 @@ public class DanaRv2ExecutionService extends Service { start = new MsgBolusStartWithSpeed(amount, preferencesSpeed); MsgBolusStop stop = new MsgBolusStop(amount, t); - connect("bolus"); if (!isConnected()) return false; if (carbs > 0) { @@ -435,7 +391,7 @@ public class DanaRv2ExecutionService extends Service { } while (!stop.stopped && !start.failed) { waitMsec(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 5 sec expecting broken comm + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm stop.stopped = true; stop.forced = true; log.debug("Communication stopped"); @@ -443,7 +399,7 @@ public class DanaRv2ExecutionService extends Service { } } - EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); + final EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); bolusingEvent.t = t; bolusingEvent.percent = 99; @@ -468,16 +424,18 @@ public class DanaRv2ExecutionService extends Service { MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } - if (!(isConnected())) - connect("loadEvents"); - loadEvents(); - // load last bolus status - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); - mSerialIOThread.sendMessage(new MsgStatus()); - bolusingEvent.percent = 100; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + ConfigBuilderPlugin.getCommandQueue().loadEvents(new Callback() { + @Override + public void run() { + // load last bolus status + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + mSerialIOThread.sendMessage(new MsgStatus()); + bolusingEvent.percent = 100; + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + } + }); return true; -} + } public void bolusStop() { if (Config.logDanaBTComm) @@ -496,7 +454,6 @@ public class DanaRv2ExecutionService extends Service { } public boolean carbsEntry(int amount, long time) { - connect("carbsEntry"); if (!isConnected()) return false; MsgSetCarbsEntry msg = new MsgSetCarbsEntry(time, amount); mSerialIOThread.sendMessage(msg); @@ -506,9 +463,9 @@ public class DanaRv2ExecutionService extends Service { return true; } - public boolean loadHistory(byte type) { - connect("loadHistory"); - if (!isConnected()) return false; + public PumpEnactResult loadHistory(byte type) { + PumpEnactResult result = new PumpEnactResult(); + if (!isConnected()) return result; MessageBase msg = null; switch (type) { case RecordTypes.RECORD_TYPE_ALARM: @@ -548,11 +505,14 @@ public class DanaRv2ExecutionService extends Service { } waitMsec(200); mSerialIOThread.sendMessage(new MsgPCCommStop()); - return true; + result.success = true; + result.comment = "OK"; + return result; } - public boolean loadEvents() { - if (!isConnected()) return false; + public PumpEnactResult loadEvents() { + if (!isConnected()) + return new PumpEnactResult().success(false); waitMsec(300); MsgHistoryEvents_v2 msg; if (lastHistoryFetched == 0) { @@ -568,11 +528,10 @@ public class DanaRv2ExecutionService extends Service { } waitMsec(200); lastHistoryFetched = MsgHistoryEvents_v2.lastEventTimeLoaded; - return true; + return new PumpEnactResult().success(true); } public boolean updateBasalsInPump(final Profile profile) { - connect("updateBasalsInPump"); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index da4ea8157d..fd5d2bd270 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -130,9 +130,37 @@ public class MDIPlugin implements PluginBase, PumpInterface { } @Override - public int setNewBasalProfile(Profile profile) { + public boolean isConnected() { + return true; + } + + @Override + public boolean isConnecting() { + return false; + } + + @Override + public void connect(String reason) { + } + + @Override + public void disconnect(String reason) { + } + + @Override + public void stopConnecting() { + } + + @Override + public void getPumpStatus() { + } + + @Override + public PumpEnactResult setNewBasalProfile(Profile profile) { // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); - return SUCCESS; + PumpEnactResult result = new PumpEnactResult(); + result.success = true; + return result; } @Override @@ -145,11 +173,6 @@ public class MDIPlugin implements PluginBase, PumpInterface { return new Date(); } - @Override - public void refreshDataFromPump(String reason) { - // do nothing - } - @Override public double getBaseBasalRate() { return 0d; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java index 2e3be7ab95..4853847e5b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java @@ -185,10 +185,41 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { } @Override - public int setNewBasalProfile(Profile profile) { - // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); + public boolean isConnected() { + return true; + } + + @Override + public boolean isConnecting() { + return false; + } + + @Override + public void connect(String reason) { + if (!BuildConfig.NSCLIENTOLNY) + NSUpload.uploadDeviceStatus(); lastDataTime = new Date(); - return SUCCESS; + } + + @Override + public void disconnect(String reason) { + } + + @Override + public void stopConnecting() { + } + + @Override + public void getPumpStatus() { + } + + @Override + public PumpEnactResult setNewBasalProfile(Profile profile) { + lastDataTime = new Date(); + // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); + PumpEnactResult result = new PumpEnactResult(); + result.success = true; + return result; } @Override @@ -201,13 +232,6 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { return lastDataTime; } - @Override - public void refreshDataFromPump(String reason) { - if (!BuildConfig.NSCLIENTOLNY) - NSUpload.uploadDeviceStatus(); - lastDataTime = new Date(); - } - @Override public double getBaseBasalRate() { Profile profile = MainApp.getConfigBuilder().getProfile(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java index 9fdb0152d0..66b1b6880d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java @@ -35,12 +35,14 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS; import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; @@ -225,7 +227,7 @@ public class SmsCommunicatorPlugin implements PluginBase { } } - private void processSms(Sms receivedSms) { + private void processSms(final Sms receivedSms) { if (!isEnabled(PluginBase.GENERAL)) { log.debug("Ignoring SMS. Plugin disabled."); return; @@ -287,11 +289,15 @@ public class SmsCommunicatorPlugin implements PluginBase { LoopPlugin loopPlugin = MainApp.getSpecificPlugin(LoopPlugin.class); if (loopPlugin != null && loopPlugin.isEnabled(PluginBase.LOOP)) { loopPlugin.setFragmentEnabled(PluginBase.LOOP, false); - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); - MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_STOP")); - reply = MainApp.sResources.getString(R.string.smscommunicator_loophasbeendisabled) + " " + - MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { + @Override + public void run() { + MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_STOP")); + String reply = MainApp.sResources.getString(R.string.smscommunicator_loophasbeendisabled) + " " + + MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } + }); } receivedSms.processed = true; Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Stop")); @@ -435,7 +441,7 @@ public class SmsCommunicatorPlugin implements PluginBase { if (System.currentTimeMillis() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) { reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); - } else if (MainApp.getConfigBuilder().isSuspended()) { + } else if (ConfigBuilderPlugin.getActivePump().isSuspended()) { reply = MainApp.sResources.getString(R.string.pumpsuspended); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (splited.length > 1) { @@ -476,64 +482,61 @@ public class SmsCommunicatorPlugin implements PluginBase { if (bolusWaitingForConfirmation != null && !bolusWaitingForConfirmation.processed && bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - bolusWaitingForConfirmation.date.getTime() < CONFIRM_TIMEOUT) { bolusWaitingForConfirmation.processed = true; - PumpInterface pumpInterface = MainApp.getConfigBuilder(); - if (pumpInterface != null) { - danaRPlugin = MainApp.getSpecificPlugin(DanaRPlugin.class); - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.insulin = bolusWaitingForConfirmation.bolusRequested; - detailedBolusInfo.source = Source.USER; - PumpEnactResult result = pumpInterface.deliverTreatment(detailedBolusInfo); - if (result.success) { - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); - if (danaRPlugin != null) - reply += "\n" + danaRPlugin.shortStatus(true); - lastRemoteBolusTime = new Date(); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); - } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_bolusfailed); - if (danaRPlugin != null) - reply += "\n" + danaRPlugin.shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.insulin = bolusWaitingForConfirmation.bolusRequested; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { + @Override + public void run() { + DanaRPlugin danaRPlugin = MainApp.getSpecificPlugin(DanaRPlugin.class); + if (result.success) { + String reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); + lastRemoteBolusTime = new Date(); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); + } else { + String reply = MainApp.sResources.getString(R.string.smscommunicator_bolusfailed); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } } - } + }); } else if (tempBasalWaitingForConfirmation != null && !tempBasalWaitingForConfirmation.processed && tempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - tempBasalWaitingForConfirmation.date.getTime() < CONFIRM_TIMEOUT) { tempBasalWaitingForConfirmation.processed = true; - PumpInterface pumpInterface = MainApp.getConfigBuilder(); - if (pumpInterface != null) { - danaRPlugin = MainApp.getSpecificPlugin(DanaRPlugin.class); - PumpEnactResult result = pumpInterface.setTempBasalAbsolute(tempBasalWaitingForConfirmation.tempBasal, 30, true); - if (result.success) { - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); - if (danaRPlugin != null) - reply += "\n" + danaRPlugin.shortStatus(true); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); - } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalfailed); - if (danaRPlugin != null) - reply += "\n" + danaRPlugin.shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(tempBasalWaitingForConfirmation.tempBasal, 30, true, new Callback() { + @Override + public void run() { + if (result.success) { + String reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); + reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); + } else { + String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalfailed); + reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } } - } + }); } else if (cancelTempBasalWaitingForConfirmation != null && !cancelTempBasalWaitingForConfirmation.processed && cancelTempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - cancelTempBasalWaitingForConfirmation.date.getTime() < CONFIRM_TIMEOUT) { cancelTempBasalWaitingForConfirmation.processed = true; - PumpInterface pumpInterface = MainApp.getConfigBuilder(); - if (pumpInterface != null) { - danaRPlugin = MainApp.getSpecificPlugin(DanaRPlugin.class); - PumpEnactResult result = pumpInterface.cancelTempBasal(true); - if (result.success) { - reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcanceled); - if (danaRPlugin != null) - reply += "\n" + danaRPlugin.shortStatus(true); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); - } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); - if (danaRPlugin != null) - reply += "\n" + danaRPlugin.shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { + @Override + public void run() { + if (result.success) { + String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcanceled); + reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); + } else { + String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); + reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } } - } + }); } else if (calibrationWaitingForConfirmation != null && !calibrationWaitingForConfirmation.processed && calibrationWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - calibrationWaitingForConfirmation.date.getTime() < CONFIRM_TIMEOUT) { calibrationWaitingForConfirmation.processed = true; @@ -548,14 +551,24 @@ public class SmsCommunicatorPlugin implements PluginBase { } else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed && suspendWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - suspendWaitingForConfirmation.date.getTime() < CONFIRM_TIMEOUT) { suspendWaitingForConfirmation.processed = true; - final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); - activeloop.suspendTo(System.currentTimeMillis() + suspendWaitingForConfirmation.duration * 60L * 1000); - PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(true); - NSUpload.uploadOpenAPSOffline(suspendWaitingForConfirmation.duration * 60); - MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED")); - reply = MainApp.sResources.getString(R.string.smscommunicator_loopsuspended) + " " + - MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { + @Override + public void run() { + if (result.success) { + final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); + activeloop.suspendTo(System.currentTimeMillis() + suspendWaitingForConfirmation.duration * 60L * 1000); + NSUpload.uploadOpenAPSOffline(suspendWaitingForConfirmation.duration * 60); + MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED")); + String reply = MainApp.sResources.getString(R.string.smscommunicator_loopsuspended) + " " + + MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); + } else { + String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); + reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } + } + }); } else { sendSMS(new Sms(receivedSms.phoneNumber, MainApp.sResources.getString(R.string.smscommunicator_unknowncommand), new Date())); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java index d7c9d1eafe..6466591a87 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java @@ -15,10 +15,10 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.NonOverlappingIntervals; import info.nightscout.androidaps.data.OverlappingIntervals; import info.nightscout.androidaps.data.Profile; @@ -33,8 +33,8 @@ import info.nightscout.androidaps.events.EventReloadTempBasalData; import info.nightscout.androidaps.events.EventReloadTreatmentData; import info.nightscout.androidaps.events.EventTempTargetChange; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.utils.SP; @@ -200,8 +200,8 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { if (!t.isSMB) { // instead of dividing the DIA that only worked on the bilinear curves, // multiply the time the treatment is seen active. - long timeSinceTreatment = time - t.date; - long snoozeTime = t.date + (long)(timeSinceTreatment * SP.getDouble("openapsama_bolussnooze_dia_divisor", 2.0)); + long timeSinceTreatment = time - t.date; + long snoozeTime = t.date + (long) (timeSinceTreatment * SP.getDouble("openapsama_bolussnooze_dia_divisor", 2.0)); Iob bIOB = t.iobCalc(snoozeTime, dia); total.bolussnooze += bIOB.iobContrib; } else { @@ -210,7 +210,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { } } - if (!MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) + if (!ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) synchronized (extendedBoluses) { for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { ExtendedBolus e = extendedBoluses.get(pos); @@ -329,7 +329,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { total.plus(calc); } } - if (MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) { + if (ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) { IobTotal totalExt = new IobTotal(time); synchronized (extendedBoluses) { for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { @@ -361,7 +361,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { if (tb != null) return tb; ExtendedBolus eb = getExtendedBolusFromHistory(time); - if (eb != null && MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) + if (eb != null && ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) return new TemporaryBasal(eb); return null; } @@ -384,18 +384,16 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { @Override public double getTempBasalAbsoluteRateHistory() { - PumpInterface pump = MainApp.getConfigBuilder(); - TemporaryBasal tb = getTempBasalFromHistory(System.currentTimeMillis()); if (tb != null) { - if (tb.isFakeExtended){ - double baseRate = pump.getBaseBasalRate(); + if (tb.isFakeExtended) { + double baseRate = ConfigBuilderPlugin.getActivePump().getBaseBasalRate(); double tempRate = baseRate + tb.netExtendedRate; return tempRate; } else if (tb.isAbsolute) { return tb.absoluteRate; } else { - double baseRate = pump.getBaseBasalRate(); + double baseRate = ConfigBuilderPlugin.getActivePump().getBaseBasalRate(); double tempRate = baseRate * (tb.percentRate / 100d); return tempRate; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index a7b90775f1..6511cedbdf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -13,13 +13,12 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; -import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; -import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.db.DatabaseHelper; @@ -33,15 +32,16 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin; +import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.BolusWizard; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; @@ -173,8 +173,8 @@ public class ActionStringHandler { } else if ("loop".equals(act[1])) { rTitle += " LOOP"; rMessage = "TARGETS:\n" + getTargetsStatus(); - rMessage += "\n\n" + getLoopStatus(); - rMessage += "\n\nOAPS RESULT:\n" + getOAPSResultStatus(); + rMessage += "\n\n" + getLoopStatus(); + rMessage += "\n\nOAPS RESULT:\n" + getOAPSResultStatus(); } } else if ("wizard".equals(act[0])) { @@ -236,15 +236,15 @@ public class ActionStringHandler { rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U"; if (useBasalIOB) rMessage += "\nBasal IOB: " + format.format(bolusWizard.insulingFromBasalsIOB) + "U"; - if(percentage != 100){ - rMessage += "\nPercentage: " +format.format(bolusWizard.totalBeforePercentageAdjustment) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.calculatedTotalInsulin) + "U"; + if (percentage != 100) { + rMessage += "\nPercentage: " + format.format(bolusWizard.totalBeforePercentageAdjustment) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.calculatedTotalInsulin) + "U"; } lastBolusWizard = bolusWizard; - } else if("opencpp".equals(act[0])){ + } else if ("opencpp".equals(act[0])) { ProfileSwitch activeProfileSwitch = MainApp.getConfigBuilder().getProfileSwitchFromHistory(System.currentTimeMillis()); - if(activeProfileSwitch==null){ + if (activeProfileSwitch == null) { sendError("No active profile switch!"); return; } else { @@ -254,30 +254,30 @@ public class ActionStringHandler { rAction = "opencpp" + " " + activeProfileSwitch.percentage + " " + activeProfileSwitch.timeshift; } - } else if("cppset".equals(act[0])){ + } else if ("cppset".equals(act[0])) { ProfileSwitch activeProfileSwitch = MainApp.getConfigBuilder().getProfileSwitchFromHistory(System.currentTimeMillis()); - if(activeProfileSwitch==null){ + if (activeProfileSwitch == null) { sendError("No active profile switch!"); return; } else { // read CPP values - rMessage = "CPP:" + "\n\n"+ - "Timeshift: " + act[1] + "\n" + - "Percentage: " + act[2] + "%"; + rMessage = "CPP:" + "\n\n" + + "Timeshift: " + act[1] + "\n" + + "Percentage: " + act[2] + "%"; rAction = actionstring; } - } else if("tddstats".equals(act[0])){ + } else if ("tddstats".equals(act[0])) { Object activePump = MainApp.getConfigBuilder().getActivePump(); PumpInterface dana = MainApp.getSpecificPlugin(DanaRPlugin.class); PumpInterface danaV2 = MainApp.getSpecificPlugin(DanaRv2Plugin.class); PumpInterface danaKorean = MainApp.getSpecificPlugin(DanaRKoreanPlugin.class); - if((dana == null || dana != activePump) && + if ((dana == null || dana != activePump) && (danaV2 == null || danaV2 != activePump) && (danaKorean == null || danaKorean != activePump) - ){ + ) { sendError("Pump does not support TDDs!"); return; } else { @@ -285,7 +285,7 @@ public class ActionStringHandler { List dummies = new LinkedList(); List historyList = getTDDList(dummies); - if(isOldData(historyList)){ + if (isOldData(historyList)) { rTitle = "TDD"; rAction = "statusmessage"; rMessage = "OLD DATA - "; @@ -300,10 +300,10 @@ public class ActionStringHandler { handler.post(new Runnable() { @Override public void run() { - ((DanaRInterface)pump).loadHistory(RecordTypes.RECORD_TYPE_DAILY); + ((DanaRInterface) pump).loadHistory(RecordTypes.RECORD_TYPE_DAILY); List dummies = new LinkedList(); List historyList = getTDDList(dummies); - if(isOldData(historyList)){ + if (isOldData(historyList)) { sendStatusmessage("TDD", "TDD: Still old data! Cannot load from pump."); } else { sendStatusmessage("TDD", generateTDDMessage(historyList, dummies)); @@ -319,8 +319,7 @@ public class ActionStringHandler { } } - } - else return; + } else return; // send result @@ -333,14 +332,14 @@ public class ActionStringHandler { ProfileInterface activeProfile = MainApp.getConfigBuilder().getActiveProfileInterface(); - if(activeProfile == null){ + if (activeProfile == null) { return "No profile loaded :("; } DateFormat df = new SimpleDateFormat("dd.MM."); String message = ""; - double refTDD = activeProfile.getProfile().getDefaultProfile().baseBasalSum()*2; + double refTDD = activeProfile.getProfile().getDefaultProfile().baseBasalSum() * 2; int i = 0; double sum = 0d; @@ -364,15 +363,15 @@ public class ActionStringHandler { i++; } message += "weighted:\n"; - message += "0.3: " + DecimalFormatter.to2Decimal(weighted03) + "U " + (DecimalFormatter.to0Decimal(100*weighted03/refTDD) + "%") + "\n"; - message += "0.5: " + DecimalFormatter.to2Decimal(weighted05) + "U " + (DecimalFormatter.to0Decimal(100*weighted05/refTDD) + "%") + "\n"; - message += "0.7: " + DecimalFormatter.to2Decimal(weighted07) + "U " + (DecimalFormatter.to0Decimal(100*weighted07/refTDD) + "%") + "\n"; + message += "0.3: " + DecimalFormatter.to2Decimal(weighted03) + "U " + (DecimalFormatter.to0Decimal(100 * weighted03 / refTDD) + "%") + "\n"; + message += "0.5: " + DecimalFormatter.to2Decimal(weighted05) + "U " + (DecimalFormatter.to0Decimal(100 * weighted05 / refTDD) + "%") + "\n"; + message += "0.7: " + DecimalFormatter.to2Decimal(weighted07) + "U " + (DecimalFormatter.to0Decimal(100 * weighted07 / refTDD) + "%") + "\n"; message += "\n"; PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); if (pump != null && pump instanceof DanaRPlugin) { double tdd = DanaRPump.getInstance().dailyTotalUnits; - message += "Today: " + DecimalFormatter.to2Decimal(tdd) + "U " + (DecimalFormatter.to0Decimal(100*tdd/refTDD) + "%") + "\n"; + message += "Today: " + DecimalFormatter.to2Decimal(tdd) + "U " + (DecimalFormatter.to0Decimal(100 * tdd / refTDD) + "%") + "\n"; message += "\n"; } @@ -380,7 +379,7 @@ public class ActionStringHandler { Collections.reverse(historyList); for (DanaRHistoryRecord record : historyList) { double tdd = record.recordDailyBolus + record.recordDailyBasal; - message += df.format(new Date(record.recordDate)) + " " + DecimalFormatter.to2Decimal(tdd) +"U " + (DecimalFormatter.to0Decimal(100*tdd/refTDD) + "%") + (dummies.contains(record)?"x":"") +"\n"; + message += df.format(new Date(record.recordDate)) + " " + DecimalFormatter.to2Decimal(tdd) + "U " + (DecimalFormatter.to0Decimal(100 * tdd / refTDD) + "%") + (dummies.contains(record) ? "x" : "") + "\n"; } return message; } @@ -398,17 +397,17 @@ public class ActionStringHandler { historyList = historyList.subList(0, Math.min(10, historyList.size())); //fill single gaps - List dummies = (returnDummies!=null)?returnDummies:(new LinkedList()); + List dummies = (returnDummies != null) ? returnDummies : (new LinkedList()); DateFormat df = new SimpleDateFormat("dd.MM."); - for(int i = 0; i < historyList.size()-1; i++){ + for (int i = 0; i < historyList.size() - 1; i++) { DanaRHistoryRecord elem1 = historyList.get(i); - DanaRHistoryRecord elem2 = historyList.get(i+1); + DanaRHistoryRecord elem2 = historyList.get(i + 1); - if (!df.format(new Date(elem1.recordDate)).equals(df.format(new Date(elem2.recordDate + 25*60*60*1000)))){ + if (!df.format(new Date(elem1.recordDate)).equals(df.format(new Date(elem2.recordDate + 25 * 60 * 60 * 1000)))) { DanaRHistoryRecord dummy = new DanaRHistoryRecord(); - dummy.recordDate = elem1.recordDate - 24*60*60*1000; - dummy.recordDailyBasal = elem1.recordDailyBasal/2; - dummy.recordDailyBolus = elem1.recordDailyBolus/2; + dummy.recordDate = elem1.recordDate - 24 * 60 * 60 * 1000; + dummy.recordDailyBasal = elem1.recordDailyBasal / 2; + dummy.recordDailyBolus = elem1.recordDailyBolus / 2; dummies.add(dummy); elem1.recordDailyBasal /= 2; elem1.recordDailyBolus /= 2; @@ -418,7 +417,7 @@ public class ActionStringHandler { Collections.sort(historyList, new Comparator() { @Override public int compare(DanaRHistoryRecord lhs, DanaRHistoryRecord rhs) { - return (int) (rhs.recordDate-lhs.recordDate); + return (int) (rhs.recordDate - lhs.recordDate); } }); return historyList; @@ -426,7 +425,7 @@ public class ActionStringHandler { @NonNull private static String getPumpStatus() { - return MainApp.getConfigBuilder().shortStatus(false); + return ConfigBuilderPlugin.getActivePump().shortStatus(false); } @NonNull @@ -505,12 +504,12 @@ public class ActionStringHandler { } if (!result.changeRequested) { - ret += MainApp.sResources.getString(R.string.nochangerequested) + "\n"; + ret += MainApp.sResources.getString(R.string.nochangerequested) + "\n"; } else if (result.rate == 0 && result.duration == 0) { - ret += MainApp.sResources.getString(R.string.canceltemp)+ "\n"; + ret += MainApp.sResources.getString(R.string.canceltemp) + "\n"; } else { ret += MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(result.rate) + " U/h " + - "(" + DecimalFormatter.to2Decimal(result.rate / MainApp.getConfigBuilder().getBaseBasalRate() * 100) + "%)\n" + + "(" + DecimalFormatter.to2Decimal(result.rate / ConfigBuilderPlugin.getActivePump().getBaseBasalRate() * 100) + "%)\n" + MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to0Decimal(result.duration) + " min\n"; } ret += "\n" + MainApp.sResources.getString(R.string.reason) + ": " + result.reason; @@ -565,7 +564,7 @@ public class ActionStringHandler { int timeshift = SafeParse.stringToInt(act[1]); int percentage = SafeParse.stringToInt(act[2]); setCPP(timeshift, percentage); - } else if ("dismissoverviewnotification".equals(act[0])){ + } else if ("dismissoverviewnotification".equals(act[0])) { MainApp.bus().post(new EventDismissNotification(SafeParse.stringToInt(act[1]))); } lastBolusWizard = null; @@ -578,21 +577,20 @@ public class ActionStringHandler { //check for validity if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) { - msg+= String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage") + "\n"; + msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage") + "\n"; } if (timeshift < 0 || timeshift > 23) { - msg+= String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Timeshift") + "\n"; + msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Timeshift") + "\n"; } - if(!SP.getBoolean("syncprofiletopump", false)){ - msg+= MainApp.sResources.getString(R.string.syncprofiletopump_title) + " " + MainApp.sResources.getString(R.string.cpp_sync_setting_missing) + "\n"; + if (!SP.getBoolean("syncprofiletopump", false)) { + msg += MainApp.sResources.getString(R.string.syncprofiletopump_title) + " " + MainApp.sResources.getString(R.string.cpp_sync_setting_missing) + "\n"; } - final PumpInterface pump = MainApp.getConfigBuilder(); final Profile profile = MainApp.getConfigBuilder().getProfile(); - if (pump == null || profile == null || profile.getBasal() == null){ - msg+= MainApp.sResources.getString(R.string.cpp_notloadedplugins) + "\n"; + if (profile == null || profile.getBasal() == null) { + msg += MainApp.sResources.getString(R.string.cpp_notloadedplugins) + "\n"; } - if(!"".equals(msg)) { + if (!"".equals(msg)) { msg += MainApp.sResources.getString(R.string.cpp_valuesnotstored); String rTitle = "STATUS"; String rAction = "statusmessage"; @@ -627,16 +625,13 @@ public class ActionStringHandler { } private static void doFillBolus(final Double amount) { - //if(1==1)return; - Handler handler = new Handler(handlerThread.getLooper()); - handler.post(new Runnable() { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.insulin = amount; + detailedBolusInfo.isValid = false; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { @Override public void run() { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.insulin = amount; - detailedBolusInfo.isValid = false; - detailedBolusInfo.source = Source.USER; - PumpEnactResult result = MainApp.getConfigBuilder().deliverTreatment(detailedBolusInfo); if (!result.success) { sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) + "\n" + @@ -647,16 +642,13 @@ public class ActionStringHandler { } private static void doBolus(final Double amount, final Integer carbs) { - //if(1==1)return; - Handler handler = new Handler(handlerThread.getLooper()); - handler.post(new Runnable() { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.insulin = amount; + detailedBolusInfo.carbs = carbs; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { @Override public void run() { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.insulin = amount; - detailedBolusInfo.carbs = carbs; - detailedBolusInfo.source = Source.USER; - PumpEnactResult result = MainApp.getConfigBuilder().deliverTreatment(detailedBolusInfo); if (!result.success) { sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) + "\n" + diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 89189e7e12..46e2608542 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -35,8 +35,8 @@ import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; import info.nightscout.androidaps.plugins.Wear.ActionStringHandler; @@ -189,8 +189,7 @@ public class WatchUpdaterService extends WearableListenerService implements } private void cancelBolus() { - PumpInterface pump = MainApp.getConfigBuilder(); - pump.stopBolusDelivering(); + ConfigBuilderPlugin.getActivePump().stopBolusDelivering(); } private void sendData() { @@ -533,7 +532,7 @@ public class WatchUpdaterService extends WearableListenerService implements private void sendPreferences() { if (googleApiClient.isConnected()) { - boolean wearcontrol = SP.getBoolean("wearcontrol",false); + boolean wearcontrol = SP.getBoolean("wearcontrol", false); PutDataMapRequest dataMapRequest = PutDataMapRequest.create(NEW_PREFERENCES_PATH); //unique content diff --git a/app/src/main/java/info/nightscout/androidaps/queue/Callback.java b/app/src/main/java/info/nightscout/androidaps/queue/Callback.java new file mode 100644 index 0000000000..8ea5132290 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/Callback.java @@ -0,0 +1,15 @@ +package info.nightscout.androidaps.queue; + +import info.nightscout.androidaps.data.PumpEnactResult; + +/** + * Created by mike on 09.11.2017. + */ +public abstract class Callback implements Runnable { + public PumpEnactResult result; + + public Callback result(PumpEnactResult result) { + this.result = result; + return this; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java new file mode 100644 index 0000000000..b1f6d35e78 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -0,0 +1,409 @@ +package info.nightscout.androidaps.queue; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.text.Html; +import android.text.Spanned; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.LinkedList; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.events.EventBolusRequested; +import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressHelperActivity; +import info.nightscout.androidaps.plugins.Overview.Notification; +import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; +import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.queue.commands.Command; +import info.nightscout.androidaps.queue.commands.CommandBolus; +import info.nightscout.androidaps.queue.commands.CommandCancelExtendedBolus; +import info.nightscout.androidaps.queue.commands.CommandCancelTempBasal; +import info.nightscout.androidaps.queue.commands.CommandExtendedBolus; +import info.nightscout.androidaps.queue.commands.CommandLoadEvents; +import info.nightscout.androidaps.queue.commands.CommandLoadHistory; +import info.nightscout.androidaps.queue.commands.CommandReadStatus; +import info.nightscout.androidaps.queue.commands.CommandSetProfile; +import info.nightscout.androidaps.queue.commands.CommandTempBasalAbsolute; +import info.nightscout.androidaps.queue.commands.CommandTempBasalPercent; + +/** + * Created by mike on 08.11.2017. + * + * DATA FLOW: + * --------- + * + * (request) - > ConfigBuilder.getCommandQueue().bolus(...) + * + * app no longer waits for result but passes Callback + * + * request is added to queue, if another request of the same type already exists in queue, it's removed prior adding + * but if request of the same type is currently executed (probably important only for bolus which is running long time), new request is declined + * new QueueThread is created and started if current if finished + * CommandReadStatus is added automatically before command if queue is empty + * + * biggest change is we don't need exec pump commands in Handler because it's finished immediately + * command queueing if not realized by stacking in different Handlers and threads anymore but by internal queue with better control + * + * QueueThread calls ConfigBuilder#connect which is passed to getActivePump().connect + * connect should be executed on background and return immediately. afterwards isConnecting() is expected to be true + * + * while isConnecting() == true GUI is updated by posting connection progress + * + * if connect is successful: isConnected() becomes true, isConnecting() becomes false + * CommandQueue starts calling execute() of commands. execute() is expected to be blocking (return after finish). + * callback with result is called after finish automatically + * if connect failed: isConnected() becomes false, isConnecting() becomes false + * connect() is called again + * + * when queue is empty, disconnect is called + * + */ + +public class CommandQueue { + private static Logger log = LoggerFactory.getLogger(CommandQueue.class); + + private LinkedList queue = new LinkedList<>(); + private Command performing; + + private QueueThread thread = null; + + private PumpEnactResult executingNowError() { + PumpEnactResult result = new PumpEnactResult(); + result.success = false; + result.enacted = false; + result.comment = MainApp.sResources.getString(R.string.executingrightnow); + return result; + } + + public boolean isRunning(Command.CommandType type) { + if (performing != null && performing.commandType == type) + return true; + return false; + } + + private synchronized void removeAll(Command.CommandType type) { + for (int i = 0; i < queue.size(); i++) { + if (queue.get(i).commandType == type) { + queue.remove(i); + } + } + } + + private synchronized void add(Command command) { + // inject reading of status when adding first command to the queue + if (queue.size() == 0 && command.commandType != Command.CommandType.READSTATUS) + queue.add(new CommandReadStatus("Queue", null)); + queue.add(command); + } + + synchronized void pickup() { + performing = queue.poll(); + } + + synchronized void clear() { + performing = null; + for (int i = 0; i < queue.size(); i++) { + queue.get(i).cancel(); + } + + queue.clear(); + } + + public int size() { + return queue.size(); + } + + public Command performing() { + return performing; + } + + public void resetPerforming() { + performing = null; + } + + // After new command added to the queue + // start thread again if not already running + private void notifyAboutNewCommand() { + if (thread == null || thread.getState() == Thread.State.TERMINATED) { + thread = new QueueThread(this); + thread.start(); + } + } + + // returns true if command is queued + public boolean bolus(DetailedBolusInfo detailedBolusInfo, Callback callback) { + if (isRunning(Command.CommandType.BOLUS)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished boluses + removeAll(Command.CommandType.BOLUS); + + // add new command to queue + add(new CommandBolus(detailedBolusInfo, callback)); + + notifyAboutNewCommand(); + + // Notify Wear about upcoming bolus + MainApp.bus().post(new EventBolusRequested(detailedBolusInfo.insulin)); + + // Bring up bolus progress dialog + detailedBolusInfo.insulin = MainApp.getConfigBuilder().applyBolusConstraints(detailedBolusInfo.insulin); + detailedBolusInfo.carbs = MainApp.getConfigBuilder().applyCarbsConstraints((int) detailedBolusInfo.carbs); + + BolusProgressDialog bolusProgressDialog = null; + if (detailedBolusInfo.context != null) { + bolusProgressDialog = new BolusProgressDialog(); + bolusProgressDialog.setInsulin(detailedBolusInfo.insulin); + bolusProgressDialog.show(((AppCompatActivity) detailedBolusInfo.context).getSupportFragmentManager(), "BolusProgress"); + } else { + Intent i = new Intent(); + i.putExtra("insulin", detailedBolusInfo.insulin); + i.setClass(MainApp.instance(), BolusProgressHelperActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); + } + + return true; + } + + // returns true if command is queued + public boolean tempBasalAbsolute(double absoluteRate, int durationInMinutes, boolean enforceNew, Callback callback) { + if (isRunning(Command.CommandType.TEMPBASAL)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.TEMPBASAL); + + Double rateAfterConstraints = MainApp.getConfigBuilder().applyBasalConstraints(absoluteRate); + + // add new command to queue + add(new CommandTempBasalAbsolute(rateAfterConstraints, durationInMinutes, enforceNew, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean tempBasalPercent(int percent, int durationInMinutes, Callback callback) { + if (isRunning(Command.CommandType.TEMPBASAL)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.TEMPBASAL); + + Integer percentAfterConstraints = MainApp.getConfigBuilder().applyBasalConstraints(percent); + + // add new command to queue + add(new CommandTempBasalPercent(percentAfterConstraints, durationInMinutes, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean extendedBolus(double insulin, int durationInMinutes, Callback callback) { + if (isRunning(Command.CommandType.EXTENDEDBOLUS)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + Double rateAfterConstraints = MainApp.getConfigBuilder().applyBolusConstraints(insulin); + + // remove all unfinished + removeAll(Command.CommandType.EXTENDEDBOLUS); + + // add new command to queue + add(new CommandExtendedBolus(rateAfterConstraints, durationInMinutes, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean cancelTempBasal(boolean enforceNew, Callback callback) { + if (isRunning(Command.CommandType.TEMPBASAL)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.TEMPBASAL); + + // add new command to queue + add(new CommandCancelTempBasal(enforceNew, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean cancelExtended(Callback callback) { + if (isRunning(Command.CommandType.EXTENDEDBOLUS)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.EXTENDEDBOLUS); + + // add new command to queue + add(new CommandCancelExtendedBolus(callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean setProfile(Profile profile, Callback callback) { + if (isRunning(Command.CommandType.BASALPROFILE)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // Compare with pump limits + Profile.BasalValue[] basalValues = profile.getBasalValues(); + PumpInterface pump = ConfigBuilderPlugin.getActivePump(); + + for (int index = 0; index < basalValues.length; index++) { + if (basalValues[index].value < pump.getPumpDescription().basalMinimumRate) { + Notification notification = new Notification(Notification.BASAL_VALUE_BELOW_MINIMUM, MainApp.sResources.getString(R.string.basalvaluebelowminimum), Notification.URGENT); + MainApp.bus().post(new EventNewNotification(notification)); + if (callback != null) + callback.result(new PumpEnactResult().success(false).comment(MainApp.sResources.getString(R.string.basalvaluebelowminimum))).run(); + return false; + } + } + + MainApp.bus().post(new EventDismissNotification(Notification.BASAL_VALUE_BELOW_MINIMUM)); + + if (isThisProfileSet(profile)) { + log.debug("Correct profile already set"); + if (callback != null) + callback.result(new PumpEnactResult().success(true).enacted(false)).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.BASALPROFILE); + + // add new command to queue + add(new CommandSetProfile(profile, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean readStatus(String reason, Callback callback) { + if (isRunning(Command.CommandType.READSTATUS)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.READSTATUS); + + // add new command to queue + add(new CommandReadStatus(reason, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean loadHistory(byte type, Callback callback) { + if (isRunning(Command.CommandType.LOADHISTORY)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.LOADHISTORY); + + // add new command to queue + add(new CommandLoadHistory(type, callback)); + + notifyAboutNewCommand(); + + return true; + } + + // returns true if command is queued + public boolean loadEvents(Callback callback) { + if (isRunning(Command.CommandType.LOADEVENTS)) { + if (callback != null) + callback.result(executingNowError()).run(); + return false; + } + + // remove all unfinished + removeAll(Command.CommandType.LOADEVENTS); + + // add new command to queue + add(new CommandLoadEvents(callback)); + + notifyAboutNewCommand(); + + return true; + } + + public Spanned spannedStatus() { + String s = ""; + int line = 0; + if (performing != null) { + s += "" + performing.status() + ""; + line++; + } + for (int i = 0; i < queue.size(); i++) { + if (line != 0) + s += "
"; + s += queue.get(i).status(); + line++; + } + return Html.fromHtml(s); + } + + public boolean isThisProfileSet(Profile profile) { + PumpInterface activePump = ConfigBuilderPlugin.getActivePump(); + if (activePump != null) { + boolean result = activePump.isThisProfileSet(profile); + if (!result) { + log.debug("Current profile: " + MainApp.getConfigBuilder().getProfile().getData().toString()); + log.debug("New profile: " + profile.getData().toString()); + } + return result; + } else return true; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java new file mode 100644 index 0000000000..36b43d2181 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java @@ -0,0 +1,104 @@ +package info.nightscout.androidaps.queue; + +import android.content.Context; +import android.os.PowerManager; +import android.os.SystemClock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.Constants; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.events.EventPumpStatusChanged; +import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning; +import info.nightscout.androidaps.queue.events.EventQueueChanged; + +/** + * Created by mike on 09.11.2017. + */ + +public class QueueThread extends Thread { + private static Logger log = LoggerFactory.getLogger(QueueThread.class); + + CommandQueue queue; + + private long connectionStartTime = 0; + + private PowerManager.WakeLock mWakeLock; + + public QueueThread(CommandQueue queue) { + super(QueueThread.class.toString()); + + this.queue = queue; + PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE); + mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "QueueThread"); + } + + @Override + public final void run() { + mWakeLock.acquire(); + MainApp.bus().post(new EventQueueChanged()); + connectionStartTime = System.currentTimeMillis(); + + try { + while (true) { + PumpInterface pump = ConfigBuilderPlugin.getActivePump(); + log.debug("Looping ..."); + long secondsElapsed = (System.currentTimeMillis() - connectionStartTime) / 1000; + if (pump.isConnecting()) { + log.debug("State: connecting"); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed)); + SystemClock.sleep(1000); + continue; + } + + if (!pump.isConnected() && secondsElapsed > Constants.PUMP_MAX_CONNECTION_TIME_IN_SECONDS) { + log.debug("State: timed out"); + MainApp.bus().post(new EventDismissBolusprogressIfRunning(new PumpEnactResult())); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.connectiontimedout))); + pump.stopConnecting(); + queue.clear(); + return; + } + + if (!pump.isConnected()) { + log.debug("State: connect"); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed)); + pump.connect("Connection needed"); + SystemClock.sleep(1000); + continue; + } + + if (queue.performing() == null) { + // Pickup 1st command and set performing variable + if (queue.size() > 0) { + log.debug("State: performing"); + queue.pickup(); + MainApp.bus().post(new EventQueueChanged()); + queue.performing().execute(); + queue.resetPerforming(); + MainApp.bus().post(new EventQueueChanged()); + SystemClock.sleep(100); + continue; + } + } + + if (queue.size() == 0 && queue.performing() == null) { + log.debug("State: queue empty. disconnect"); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); + pump.disconnect("Queue empty"); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED)); + return; + } + } + } finally { + mWakeLock.release(); + } + } + + +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java new file mode 100644 index 0000000000..4624e2385f --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java @@ -0,0 +1,36 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ +public abstract class Command { + public enum CommandType { + BOLUS, + TEMPBASAL, + EXTENDEDBOLUS, + BASALPROFILE, + READSTATUS, + LOADHISTORY, // so far only Dana specific + LOADEVENTS // so far only Dana specific + } + + public CommandType commandType; + protected Callback callback; + + public abstract void execute(); + + public abstract String status(); + + public void cancel() { + PumpEnactResult result = new PumpEnactResult(); + result.success = false; + result.comment = MainApp.sResources.getString(R.string.connectiontimedout); + if (callback != null) + callback.result(result).run(); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java new file mode 100644 index 0000000000..278fd7681b --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java @@ -0,0 +1,39 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; +import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning; +import info.nightscout.androidaps.queue.Callback; +import info.nightscout.utils.DecimalFormatter; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandBolus extends Command { + DetailedBolusInfo detailedBolusInfo; + + public CommandBolus(DetailedBolusInfo detailedBolusInfo, Callback callback) { + commandType = CommandType.BOLUS; + this.detailedBolusInfo = detailedBolusInfo; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().deliverTreatment(detailedBolusInfo); + + BolusProgressDialog.bolusEnded = true; + MainApp.bus().post(new EventDismissBolusprogressIfRunning(r)); + + if (callback != null) + callback.result(r).run(); + } + + public String status() { + return "BOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java new file mode 100644 index 0000000000..536c2d876c --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java @@ -0,0 +1,37 @@ +package info.nightscout.androidaps.queue.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandCancelExtendedBolus extends Command { + private static Logger log = LoggerFactory.getLogger(CommandCancelExtendedBolus.class); + + public CommandCancelExtendedBolus(Callback callback) { + commandType = CommandType.EXTENDEDBOLUS; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().cancelExtendedBolus(); + if (Config.logCongigBuilderActions) + log.debug("cancelExtendedBolus success: " + r.success + " enacted: " + r.enacted); + if (callback != null) + callback.result(r).run(); + } + + @Override + public String status() { + return "CANCEL EXTENDEDBOLUS"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java new file mode 100644 index 0000000000..d2496c871a --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java @@ -0,0 +1,32 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandCancelTempBasal extends Command { + boolean enforceNew; + + public CommandCancelTempBasal(boolean enforceNew, Callback callback) { + commandType = CommandType.TEMPBASAL; + this.enforceNew = enforceNew; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().cancelTempBasal(enforceNew); + if (callback != null) + callback.result(r).run(); + } + + @Override + public String status() { + return "CANCEL TEMPBASAL"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java new file mode 100644 index 0000000000..0641d9139d --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java @@ -0,0 +1,42 @@ +package info.nightscout.androidaps.queue.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandExtendedBolus extends Command { + private static Logger log = LoggerFactory.getLogger(CommandExtendedBolus.class); + + private double insulin; + private int durationInMinutes; + + public CommandExtendedBolus(double insulin, int durationInMinutes, Callback callback) { + commandType = CommandType.EXTENDEDBOLUS; + this.insulin = insulin; + this.durationInMinutes = durationInMinutes; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setExtendedBolus(insulin, durationInMinutes); + if (Config.logCongigBuilderActions) + log.debug("setExtendedBolus rate: " + insulin + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted); + if (callback != null) + callback.result(r).run(); + } + + @Override + public String status() { + return "EXTENDEDBOLUS " + insulin + " U " + durationInMinutes + " min"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java new file mode 100644 index 0000000000..2d6bc5b5fc --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java @@ -0,0 +1,34 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.interfaces.DanaRInterface; +import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 10.11.2017. + */ + +public class CommandLoadEvents extends Command { + public CommandLoadEvents(Callback callback) { + commandType = CommandType.LOADEVENTS; + this.callback = callback; + } + + @Override + public void execute() { + PumpInterface pump = ConfigBuilderPlugin.getActivePump(); + if (pump instanceof DanaRInterface) { + DanaRInterface danaPump = (DanaRInterface) pump; + PumpEnactResult r = danaPump.loadEvents(); + if (callback != null) + callback.result(r).run(); + } + } + + @Override + public String status() { + return "LOADEVENTS"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java new file mode 100644 index 0000000000..16e9a18048 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java @@ -0,0 +1,38 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.interfaces.DanaRInterface; +import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; +import info.nightscout.androidaps.queue.commands.Command; + +/** + * Created by mike on 10.11.2017. + */ + +public class CommandLoadHistory extends Command { + byte type; + + public CommandLoadHistory(byte type, Callback callback) { + commandType = CommandType.LOADHISTORY; + this.type = type; + this.callback = callback; + } + + @Override + public void execute() { + PumpInterface pump = ConfigBuilderPlugin.getActivePump(); + if (pump instanceof DanaRInterface) { + DanaRInterface danaPump = (DanaRInterface) pump; + PumpEnactResult r = danaPump.loadHistory(type); + if (callback != null) + callback.result(r).run(); + } + } + + @Override + public String status() { + return "LOADHISTORY " + type; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java new file mode 100644 index 0000000000..d573cc44be --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java @@ -0,0 +1,31 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandReadStatus extends Command { + String reason; + + public CommandReadStatus(String reason, Callback callback) { + commandType = CommandType.READSTATUS; + this.reason = reason; + this.callback = callback; + } + + @Override + public void execute() { + ConfigBuilderPlugin.getActivePump().getPumpStatus(); + if (callback != null) + callback.result(null).run(); + } + + @Override + public String status() { + return "READSTATUS"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java new file mode 100644 index 0000000000..fe236fa55f --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java @@ -0,0 +1,33 @@ +package info.nightscout.androidaps.queue.commands; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandSetProfile extends Command { + Profile profile; + + public CommandSetProfile(Profile profile, Callback callback) { + commandType = CommandType.BASALPROFILE; + this.profile = profile; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setNewBasalProfile(profile); + if (callback != null) + callback.result(r).run(); + } + + @Override + public String status() { + return "SETPROFILE"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java new file mode 100644 index 0000000000..28dc728174 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java @@ -0,0 +1,44 @@ +package info.nightscout.androidaps.queue.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandTempBasalAbsolute extends Command { + private static Logger log = LoggerFactory.getLogger(CommandTempBasalAbsolute.class); + + int durationInMinutes; + double absoluteRate; + boolean enforceNew; + + public CommandTempBasalAbsolute(double absoluteRate, int durationInMinutes, boolean enforceNew, Callback callback) { + commandType = CommandType.TEMPBASAL; + this.absoluteRate = absoluteRate; + this.durationInMinutes = durationInMinutes; + this.enforceNew = enforceNew; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setTempBasalAbsolute(absoluteRate, durationInMinutes, enforceNew); + if (Config.logCongigBuilderActions) + log.debug("setTempBasalAbsolute rate: " + absoluteRate + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted); + if (callback != null) + callback.result(r).run(); + } + + @Override + public String status() { + return "TEMPBASAL " + absoluteRate + " U/h " + durationInMinutes + " min"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java new file mode 100644 index 0000000000..663a20380d --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java @@ -0,0 +1,42 @@ +package info.nightscout.androidaps.queue.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.Config; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.Callback; + +/** + * Created by mike on 09.11.2017. + */ + +public class CommandTempBasalPercent extends Command { + private static Logger log = LoggerFactory.getLogger(CommandTempBasalPercent.class); + + int durationInMinutes; + int percent; + + public CommandTempBasalPercent(int percent, int durationInMinutes, Callback callback) { + commandType = CommandType.TEMPBASAL; + this.percent = percent; + this.durationInMinutes = durationInMinutes; + this.callback = callback; + } + + @Override + public void execute() { + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setTempBasalPercent(percent, durationInMinutes); + if (Config.logCongigBuilderActions) + log.debug("setTempBasalPercent percent: " + percent + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted); + if (callback != null) + callback.result(r).run(); + } + + @Override + public String status() { + return "TEMPBASAL " + percent + "% " + durationInMinutes + " min"; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/queue/events/EventQueueChanged.java b/app/src/main/java/info/nightscout/androidaps/queue/events/EventQueueChanged.java new file mode 100644 index 0000000000..b0a53afd13 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/queue/events/EventQueueChanged.java @@ -0,0 +1,8 @@ +package info.nightscout.androidaps.queue.events; + +/** + * Created by mike on 11.11.2017. + */ + +public class EventQueueChanged { +} 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 e3c77d0122..2284860082 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java @@ -22,6 +22,7 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; public class KeepAliveReceiver extends BroadcastReceiver { private static Logger log = LoggerFactory.getLogger(KeepAliveReceiver.class); @@ -33,7 +34,7 @@ public class KeepAliveReceiver extends BroadcastReceiver { wl.acquire(); - final PumpInterface pump = MainApp.getConfigBuilder(); + final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); final Profile profile = MainApp.getConfigBuilder().getProfile(); if (pump != null && profile != null && profile.getBasal() != null) { boolean isBasalOutdated = false; @@ -47,29 +48,11 @@ public class KeepAliveReceiver extends BroadcastReceiver { SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); if (SP.getBoolean("syncprofiletopump", false) && !pump.isThisProfileSet(profile)) { - Thread t = new Thread(new Runnable() { - @Override - public void run() { - pump.setNewBasalProfile(profile); - } - }); - t.start(); + MainApp.getConfigBuilder().getCommandQueue().setProfile(profile, null); } else if (isStatusOutdated && !pump.isBusy()) { - Thread t = new Thread(new Runnable() { - @Override - public void run() { - pump.refreshDataFromPump("KeepAlive. Status outdated."); - } - }); - t.start(); + MainApp.getConfigBuilder().getCommandQueue().readStatus("KeepAlive. Status outdated.", null); } else if (isBasalOutdated && !pump.isBusy()) { - Thread t = new Thread(new Runnable() { - @Override - public void run() { - pump.refreshDataFromPump("KeepAlive. Basal outdated."); - } - }); - t.start(); + MainApp.getConfigBuilder().getCommandQueue().readStatus("KeepAlive. Basal outdated.", null); } } diff --git a/app/src/main/java/info/nightscout/utils/BolusWizard.java b/app/src/main/java/info/nightscout/utils/BolusWizard.java index ec5c0ec02b..a97ed233ff 100644 --- a/app/src/main/java/info/nightscout/utils/BolusWizard.java +++ b/app/src/main/java/info/nightscout/utils/BolusWizard.java @@ -6,6 +6,7 @@ import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.TreatmentsInterface; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; /** * Created by mike on 11.10.2016. @@ -124,7 +125,7 @@ public class BolusWizard { calculatedTotalInsulin = 0d; } - double bolusStep = MainApp.getConfigBuilder().getPumpDescription().bolusStep; + double bolusStep = ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep; calculatedTotalInsulin = Round.roundTo(calculatedTotalInsulin, bolusStep); return calculatedTotalInsulin; diff --git a/app/src/main/java/info/nightscout/utils/NSUpload.java b/app/src/main/java/info/nightscout/utils/NSUpload.java index e11102198f..215bd732e7 100644 --- a/app/src/main/java/info/nightscout/utils/NSUpload.java +++ b/app/src/main/java/info/nightscout/utils/NSUpload.java @@ -23,6 +23,7 @@ import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.DeviceStatus; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; @@ -220,7 +221,7 @@ public class NSUpload { log.debug("OpenAPS data too old to upload"); } deviceStatus.device = "openaps://" + Build.MANUFACTURER + " " + Build.MODEL; - JSONObject pumpstatus = MainApp.getConfigBuilder().getJSONStatus(); + JSONObject pumpstatus = ConfigBuilderPlugin.getActivePump().getJSONStatus(); if (pumpstatus != null) { deviceStatus.pump = pumpstatus; } diff --git a/app/src/main/res/layout/danar_fragment.xml b/app/src/main/res/layout/danar_fragment.xml index 29c9398a04..ac48032690 100644 --- a/app/src/main/res/layout/danar_fragment.xml +++ b/app/src/main/res/layout/danar_fragment.xml @@ -124,6 +124,13 @@ + + + + + +