CommandQueue
This commit is contained in:
parent
3a773feeeb
commit
8bae1a18e4
|
@ -36,7 +36,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
|
||||
|
|
|
@ -0,0 +1,347 @@
|
|||
package info.nightscout.androidaps.plugins.PumpDanaRS;
|
||||
|
||||
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.utils.DecimalFormatter;
|
||||
|
||||
/**
|
||||
* Created by mike on 08.11.2017.
|
||||
*/
|
||||
|
||||
public class CommandQueue {
|
||||
private static Logger log = LoggerFactory.getLogger(CommandQueue.class);
|
||||
|
||||
enum CommandType {
|
||||
BOLUS,
|
||||
TEMPBASALPERCENT,
|
||||
TEMPBASALABSOLUTE,
|
||||
CANCELTEMPBASAL,
|
||||
EXTENDEDBOLUS,
|
||||
CANCELEXTENDEDBOLUS,
|
||||
SETBASALPROFILE
|
||||
}
|
||||
|
||||
public class Command {
|
||||
CommandType commandType;
|
||||
Callback callback;
|
||||
|
||||
int durationInMinutes;
|
||||
|
||||
// Bolus
|
||||
DetailedBolusInfo detailedBolusInfo;
|
||||
// Temp basal percent
|
||||
int percent;
|
||||
// Temp basal absolute
|
||||
double absoluteRate;
|
||||
boolean enforceNew;
|
||||
// Extended bolus
|
||||
double insulin;
|
||||
// Basal profile
|
||||
Profile profile;
|
||||
|
||||
public String status() {
|
||||
switch (commandType) {
|
||||
case BOLUS:
|
||||
return "BOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U";
|
||||
case TEMPBASALPERCENT:
|
||||
return "TEMPBASAL " + percent + "% " + durationInMinutes + " min";
|
||||
case TEMPBASALABSOLUTE:
|
||||
return "TEMPBASAL " + absoluteRate + " U/h " + durationInMinutes + " min";
|
||||
case CANCELTEMPBASAL:
|
||||
return "CANCEL TEMPBASAL";
|
||||
case EXTENDEDBOLUS:
|
||||
return "EXTENDEDBOLUS " + insulin + " U " + durationInMinutes + " min";
|
||||
case CANCELEXTENDEDBOLUS:
|
||||
return "CANCEL EXTENDEDBOLUS";
|
||||
case SETBASALPROFILE:
|
||||
return "SETPROFILE";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Callback {
|
||||
public PumpEnactResult result;
|
||||
Runnable runnable;
|
||||
|
||||
public Callback(Runnable runnable) {
|
||||
this.runnable = runnable;
|
||||
}
|
||||
|
||||
public Callback result(PumpEnactResult result) {
|
||||
this.result = result;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
runnable.run();
|
||||
}
|
||||
}
|
||||
|
||||
private LinkedList<Command> queue = new LinkedList<>();
|
||||
private Command performing;
|
||||
|
||||
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 isRunningTempBasal() {
|
||||
if (performing != null)
|
||||
if (performing.commandType == CommandType.TEMPBASALABSOLUTE || performing.commandType == CommandType.TEMPBASALPERCENT || performing.commandType == CommandType.CANCELTEMPBASAL)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isRunningBolus() {
|
||||
if (performing != null)
|
||||
if (performing.commandType == CommandType.BOLUS)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isRunningExtendedBolus() {
|
||||
if (performing != null)
|
||||
if (performing.commandType == CommandType.EXTENDEDBOLUS || performing.commandType == CommandType.CANCELEXTENDEDBOLUS)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isRunningProfile() {
|
||||
if (performing != null)
|
||||
if (performing.commandType == CommandType.SETBASALPROFILE)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private synchronized void removeAll(CommandType type) {
|
||||
for (int i = 0; i < queue.size(); i++) {
|
||||
Command c = queue.get(i);
|
||||
switch (type) {
|
||||
case TEMPBASALABSOLUTE:
|
||||
case TEMPBASALPERCENT:
|
||||
case CANCELTEMPBASAL:
|
||||
if (c.commandType == CommandType.TEMPBASALABSOLUTE || c.commandType == CommandType.TEMPBASALPERCENT || c.commandType == CommandType.CANCELTEMPBASAL) {
|
||||
queue.remove(i);
|
||||
}
|
||||
break;
|
||||
case BOLUS:
|
||||
if (c.commandType == CommandType.BOLUS) {
|
||||
queue.remove(i);
|
||||
}
|
||||
break;
|
||||
case EXTENDEDBOLUS:
|
||||
case CANCELEXTENDEDBOLUS:
|
||||
if (c.commandType == CommandType.EXTENDEDBOLUS || c.commandType == CommandType.CANCELEXTENDEDBOLUS) {
|
||||
queue.remove(i);
|
||||
}
|
||||
break;
|
||||
case SETBASALPROFILE:
|
||||
if (c.commandType == CommandType.SETBASALPROFILE) {
|
||||
queue.remove(i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void add(Command command) {
|
||||
queue.add(command);
|
||||
}
|
||||
|
||||
private synchronized void pickup() {
|
||||
performing = queue.poll();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
queue.clear();
|
||||
}
|
||||
|
||||
private void notifyAboutNewCommand() {
|
||||
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean bolus(DetailedBolusInfo detailedBolusInfo, Callback callback) {
|
||||
if (isRunningBolus()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.BOLUS);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.BOLUS;
|
||||
command.detailedBolusInfo = detailedBolusInfo;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean tempBasalAbsolute(double absoluteRate, int durationInMinutes, boolean enforceNew, Callback callback) {
|
||||
if (isRunningTempBasal()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.TEMPBASALABSOLUTE);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.TEMPBASALABSOLUTE;
|
||||
command.absoluteRate = absoluteRate;
|
||||
command.durationInMinutes = durationInMinutes;
|
||||
command.enforceNew = enforceNew;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean tempBasalPercent(int percent, int durationInMinutes, Callback callback) {
|
||||
if (isRunningTempBasal()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.TEMPBASALPERCENT);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.TEMPBASALPERCENT;
|
||||
command.percent = percent;
|
||||
command.durationInMinutes = durationInMinutes;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean extendedBolus(double insulin, int durationInMinutes, Callback callback) {
|
||||
if (isRunningExtendedBolus()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.EXTENDEDBOLUS);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.EXTENDEDBOLUS;
|
||||
command.insulin = insulin;
|
||||
command.durationInMinutes = durationInMinutes;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean cancelTempBasal(boolean enforceNew, Callback callback) {
|
||||
if (isRunningTempBasal()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.CANCELTEMPBASAL);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.CANCELTEMPBASAL;
|
||||
command.enforceNew = enforceNew;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean cancelExtended(Callback callback) {
|
||||
if (isRunningExtendedBolus()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.CANCELEXTENDEDBOLUS);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.CANCELEXTENDEDBOLUS;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true if command is queued
|
||||
public boolean setProfile(Profile profile, Callback callback) {
|
||||
if (isRunningProfile()) {
|
||||
callback.result(executingNowError()).run();
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove all unfinished boluese
|
||||
removeAll(CommandType.SETBASALPROFILE);
|
||||
|
||||
// add new command to queue
|
||||
Command command = new Command();
|
||||
command.commandType = CommandType.SETBASALPROFILE;
|
||||
command.profile = profile;
|
||||
command.callback = callback;
|
||||
add(command);
|
||||
|
||||
notifyAboutNewCommand();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Spanned spannedStatus() {
|
||||
String s = "";
|
||||
if (performing != null) {
|
||||
s += "<b>" + performing.status() + "</b><br>";
|
||||
}
|
||||
for (int i = 0; i < queue.size(); i++) {
|
||||
s += queue.get(i).status() + "<br>";
|
||||
}
|
||||
return Html.fromHtml(s);
|
||||
}
|
||||
|
||||
}
|
|
@ -750,5 +750,6 @@
|
|||
<string name="waitingforestimatedbolusend" formatted="false">Waiting for bolus end. Remaining %d sec.</string>
|
||||
<string name="processinghistory">Processing event</string>
|
||||
<string name="startingbolus">Starting bolus delivery</string>
|
||||
<string name="executingrightnow">Command is executed right now</string>
|
||||
</resources>
|
||||
|
||||
|
|
Loading…
Reference in a new issue