fix merge conflict
This commit is contained in:
commit
fe0376206e
50 changed files with 1603 additions and 624 deletions
|
@ -31,6 +31,7 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
|
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
|
||||||
import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin;
|
import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin;
|
||||||
|
import info.nightscout.androidaps.plugins.Food.FoodPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Insulin.InsulinFastactingPlugin;
|
import info.nightscout.androidaps.plugins.Insulin.InsulinFastactingPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Insulin.InsulinFastactingProlongedPlugin;
|
import info.nightscout.androidaps.plugins.Insulin.InsulinFastactingProlongedPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Insulin.InsulinOrefFreePeakPlugin;
|
import info.nightscout.androidaps.plugins.Insulin.InsulinOrefFreePeakPlugin;
|
||||||
|
@ -151,6 +152,7 @@ public class MainApp extends Application {
|
||||||
if (!Config.NSCLIENT)
|
if (!Config.NSCLIENT)
|
||||||
pluginsList.add(SourceGlimpPlugin.getPlugin());
|
pluginsList.add(SourceGlimpPlugin.getPlugin());
|
||||||
if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorPlugin.getPlugin());
|
if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorPlugin.getPlugin());
|
||||||
|
pluginsList.add(FoodPlugin.getPlugin());
|
||||||
|
|
||||||
pluginsList.add(WearFragment.getPlugin(this));
|
pluginsList.add(WearFragment.getPlugin(this));
|
||||||
pluginsList.add(StatuslinePlugin.getPlugin(this));
|
pluginsList.add(StatuslinePlugin.getPlugin(this));
|
||||||
|
@ -188,6 +190,9 @@ public class MainApp extends Application {
|
||||||
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_TREATMENT));
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_TREATMENT));
|
||||||
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_CHANGED_TREATMENT));
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_CHANGED_TREATMENT));
|
||||||
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_REMOVED_TREATMENT));
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_REMOVED_TREATMENT));
|
||||||
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_FOOD));
|
||||||
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_CHANGED_FOOD));
|
||||||
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_REMOVED_FOOD));
|
||||||
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_SGV));
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_SGV));
|
||||||
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_PROFILE));
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_PROFILE));
|
||||||
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_STATUS));
|
lbm.registerReceiver(dataReceiver, new IntentFilter(Intents.ACTION_NEW_STATUS));
|
||||||
|
|
|
@ -116,6 +116,9 @@ public class DataService extends IntentService {
|
||||||
Intents.ACTION_REMOVED_TREATMENT.equals(action) ||
|
Intents.ACTION_REMOVED_TREATMENT.equals(action) ||
|
||||||
Intents.ACTION_NEW_STATUS.equals(action) ||
|
Intents.ACTION_NEW_STATUS.equals(action) ||
|
||||||
Intents.ACTION_NEW_DEVICESTATUS.equals(action) ||
|
Intents.ACTION_NEW_DEVICESTATUS.equals(action) ||
|
||||||
|
Intents.ACTION_NEW_FOOD.equals(action) ||
|
||||||
|
Intents.ACTION_CHANGED_FOOD.equals(action) ||
|
||||||
|
Intents.ACTION_REMOVED_FOOD.equals(action) ||
|
||||||
Intents.ACTION_NEW_CAL.equals(action) ||
|
Intents.ACTION_NEW_CAL.equals(action) ||
|
||||||
Intents.ACTION_NEW_MBG.equals(action))
|
Intents.ACTION_NEW_MBG.equals(action))
|
||||||
) {
|
) {
|
||||||
|
@ -413,6 +416,56 @@ public class DataService extends IntentService {
|
||||||
log.error("Unhandled exception", e);
|
log.error("Unhandled exception", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (intent.getAction().equals(Intents.ACTION_NEW_FOOD) || intent.getAction().equals(Intents.ACTION_CHANGED_FOOD)) {
|
||||||
|
try {
|
||||||
|
if (bundles.containsKey("food")) {
|
||||||
|
String trstring = bundles.getString("food");
|
||||||
|
handleAddChangeFoodRecord(new JSONObject(trstring));
|
||||||
|
}
|
||||||
|
if (bundles.containsKey("foods")) {
|
||||||
|
String trstring = bundles.getString("foods");
|
||||||
|
JSONArray jsonArray = new JSONArray(trstring);
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject trJson = jsonArray.getJSONObject(i);
|
||||||
|
handleAddChangeFoodRecord(trJson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Unhandled exception", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intent.getAction().equals(Intents.ACTION_REMOVED_FOOD)) {
|
||||||
|
try {
|
||||||
|
if (bundles.containsKey("food")) {
|
||||||
|
String trstring = bundles.getString("food");
|
||||||
|
JSONObject trJson = new JSONObject(trstring);
|
||||||
|
String _id = trJson.getString("_id");
|
||||||
|
handleRemovedFoodRecord(_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bundles.containsKey("foods")) {
|
||||||
|
String trstring = bundles.getString("foods");
|
||||||
|
JSONArray jsonArray = new JSONArray(trstring);
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject trJson = jsonArray.getJSONObject(i);
|
||||||
|
String _id = trJson.getString("_id");
|
||||||
|
handleRemovedFoodRecord(_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Unhandled exception", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleRemovedFoodRecord(String _id) {
|
||||||
|
MainApp.getDbHelper().foodHelper.deleteFoodById(_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleAddChangeFoodRecord(JSONObject trJson) throws JSONException {
|
||||||
|
MainApp.getDbHelper().foodHelper.createFoodFromJsonIfNotExists(trJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleRemovedRecordFromNS(String _id) {
|
private void handleRemovedRecordFromNS(String _id) {
|
||||||
|
|
|
@ -29,4 +29,14 @@ public class DetailedBolusInfo {
|
||||||
public Context context = null; // context for progress dialog
|
public Context context = null; // context for progress dialog
|
||||||
public long pumpId = 0; // id of record if comming from pump history (not a newly created treatment)
|
public long pumpId = 0; // id of record if comming from pump history (not a newly created treatment)
|
||||||
public boolean isSMB = false; // is a Super-MicroBolus
|
public boolean isSMB = false; // is a Super-MicroBolus
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return new Date(date).toLocaleString() +
|
||||||
|
" insulin: " + insulin +
|
||||||
|
" carbs: " + carbs +
|
||||||
|
" isValid: " + isValid +
|
||||||
|
" carbTime: " + carbTime +
|
||||||
|
" isSMB: " + isSMB;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,8 @@ public class FoodHelper {
|
||||||
log.debug("FOOD: Updating record by _id: " + old.toString());
|
log.debug("FOOD: Updating record by _id: " + old.toString());
|
||||||
scheduleFoodChange();
|
scheduleFoodChange();
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ public class DetailedBolusInfoStorage {
|
||||||
private static List<DetailedBolusInfo> store = new ArrayList<>();
|
private static List<DetailedBolusInfo> store = new ArrayList<>();
|
||||||
|
|
||||||
public static void add(DetailedBolusInfo detailedBolusInfo) {
|
public static void add(DetailedBolusInfo detailedBolusInfo) {
|
||||||
log.debug("Bolus info stored: " + new Date(detailedBolusInfo.date).toLocaleString());
|
log.debug("Stored bolus info: " + detailedBolusInfo);
|
||||||
store.add(detailedBolusInfo);
|
store.add(detailedBolusInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ public class DetailedBolusInfoStorage {
|
||||||
DetailedBolusInfo found = null;
|
DetailedBolusInfo found = null;
|
||||||
for (int i = 0; i < store.size(); i++) {
|
for (int i = 0; i < store.size(); i++) {
|
||||||
long infoTime = store.get(i).date;
|
long infoTime = store.get(i).date;
|
||||||
log.debug("Existing info: " + new Date(infoTime).toLocaleString());
|
log.debug("Existing bolus info: " + store.get(i));
|
||||||
if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
|
if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
|
||||||
found = store.get(i);
|
found = store.get(i);
|
||||||
break;
|
break;
|
||||||
|
@ -42,7 +42,7 @@ public class DetailedBolusInfoStorage {
|
||||||
for (int i = 0; i < store.size(); i++) {
|
for (int i = 0; i < store.size(); i++) {
|
||||||
long infoTime = store.get(i).date;
|
long infoTime = store.get(i).date;
|
||||||
if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
|
if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
|
||||||
log.debug("Removing info: " + new Date(infoTime).toLocaleString());
|
log.debug("Removing bolus info: " + store.get(i));
|
||||||
store.remove(i);
|
store.remove(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,315 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Food;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.crashlytics.android.Crashlytics;
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.db.Food;
|
||||||
|
import info.nightscout.androidaps.events.EventFoodDatabaseChanged;
|
||||||
|
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
|
||||||
|
import info.nightscout.utils.NSUpload;
|
||||||
|
import info.nightscout.utils.SpinnerHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 16.10.2017.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FoodFragment extends SubscriberFragment {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(FoodFragment.class);
|
||||||
|
|
||||||
|
EditText filter;
|
||||||
|
ImageView clearFilter;
|
||||||
|
SpinnerHelper category;
|
||||||
|
SpinnerHelper subcategory;
|
||||||
|
RecyclerView recyclerView;
|
||||||
|
|
||||||
|
List<Food> unfiltered;
|
||||||
|
List<Food> filtered;
|
||||||
|
ArrayList<CharSequence> categories;
|
||||||
|
ArrayList<CharSequence> subcategories;
|
||||||
|
|
||||||
|
final String EMPTY = MainApp.sResources.getString(R.string.none);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
try {
|
||||||
|
View view = inflater.inflate(R.layout.food_fragment, container, false);
|
||||||
|
|
||||||
|
filter = (EditText) view.findViewById(R.id.food_filter);
|
||||||
|
clearFilter = (ImageView) view.findViewById(R.id.food_clearfilter);
|
||||||
|
category = new SpinnerHelper(view.findViewById(R.id.food_category));
|
||||||
|
subcategory = new SpinnerHelper(view.findViewById(R.id.food_subcategory));
|
||||||
|
recyclerView = (RecyclerView) view.findViewById(R.id.food_recyclerview);
|
||||||
|
recyclerView.setHasFixedSize(true);
|
||||||
|
LinearLayoutManager llm = new LinearLayoutManager(view.getContext());
|
||||||
|
recyclerView.setLayoutManager(llm);
|
||||||
|
|
||||||
|
clearFilter.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
filter.setText("");
|
||||||
|
category.setSelection(0);
|
||||||
|
subcategory.setSelection(0);
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
category.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||||
|
@Override
|
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
fillSubcategories();
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNothingSelected(AdapterView<?> parent) {
|
||||||
|
fillSubcategories();
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
subcategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||||
|
@Override
|
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNothingSelected(AdapterView<?> parent) {
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
filter.addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainApp.getDbHelper().foodHelper.getFoodData());
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadData();
|
||||||
|
fillCategories();
|
||||||
|
fillSubcategories();
|
||||||
|
filterData();
|
||||||
|
return view;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Crashlytics.logException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public void onStatusEvent(final EventFoodDatabaseChanged ev) {
|
||||||
|
loadData();
|
||||||
|
filterData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadData() {
|
||||||
|
unfiltered = MainApp.getDbHelper().foodHelper.getFoodData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillCategories() {
|
||||||
|
categories = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Food f : unfiltered) {
|
||||||
|
if (f.category != null && !f.category.equals(""))
|
||||||
|
categories.add(f.category);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make it unique
|
||||||
|
categories = new ArrayList<>(new HashSet<>(categories));
|
||||||
|
|
||||||
|
categories.add(0, MainApp.sResources.getString(R.string.none));
|
||||||
|
|
||||||
|
ArrayAdapter<CharSequence> adapterCategories = new ArrayAdapter<>(getContext(),
|
||||||
|
R.layout.spinner_centered, categories);
|
||||||
|
category.setAdapter(adapterCategories);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillSubcategories() {
|
||||||
|
String categoryFilter = category.getSelectedItem().toString();
|
||||||
|
subcategories = new ArrayList<>();
|
||||||
|
|
||||||
|
if (!categoryFilter.equals(EMPTY)) {
|
||||||
|
for (Food f : unfiltered) {
|
||||||
|
if (f.category != null && f.category.equals(categoryFilter))
|
||||||
|
if (f.subcategory != null && !f.subcategory.equals(""))
|
||||||
|
subcategories.add(f.subcategory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make it unique
|
||||||
|
subcategories = new ArrayList<>(new HashSet<>(subcategories));
|
||||||
|
|
||||||
|
subcategories.add(0, MainApp.sResources.getString(R.string.none));
|
||||||
|
|
||||||
|
ArrayAdapter<CharSequence> adapterSubcategories = new ArrayAdapter<>(getContext(),
|
||||||
|
R.layout.spinner_centered, subcategories);
|
||||||
|
subcategory.setAdapter(adapterSubcategories);
|
||||||
|
}
|
||||||
|
|
||||||
|
void filterData() {
|
||||||
|
String textFilter = filter.getText().toString();
|
||||||
|
String categoryFilter = category.getSelectedItem().toString();
|
||||||
|
String subcategoryFilter = subcategory.getSelectedItem().toString();
|
||||||
|
|
||||||
|
filtered = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Food f : unfiltered) {
|
||||||
|
if (f.name == null || f.category == null || f.subcategory == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!subcategoryFilter.equals(EMPTY) && !f.subcategory.equals(subcategoryFilter))
|
||||||
|
continue;
|
||||||
|
if (!categoryFilter.equals(EMPTY) && !f.category.equals(categoryFilter))
|
||||||
|
continue;
|
||||||
|
if (!textFilter.equals("") && !f.name.toLowerCase().contains(textFilter.toLowerCase()))
|
||||||
|
continue;
|
||||||
|
filtered.add(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateGUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateGUI() {
|
||||||
|
Activity activity = getActivity();
|
||||||
|
if (activity != null)
|
||||||
|
activity.runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
recyclerView.swapAdapter(new FoodFragment.RecyclerViewAdapter(filtered), true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.FoodsViewHolder> {
|
||||||
|
|
||||||
|
List<Food> foodList;
|
||||||
|
|
||||||
|
RecyclerViewAdapter(List<Food> foodList) {
|
||||||
|
this.foodList = foodList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FoodsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
||||||
|
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.food_item, viewGroup, false);
|
||||||
|
return new FoodsViewHolder(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(FoodsViewHolder holder, int position) {
|
||||||
|
Food food = foodList.get(position);
|
||||||
|
holder.ns.setVisibility(food._id != null ? View.VISIBLE : View.GONE);
|
||||||
|
holder.name.setText(food.name);
|
||||||
|
holder.portion.setText(food.portion + food.units);
|
||||||
|
holder.carbs.setText(food.carbs + MainApp.sResources.getString(R.string.shortgramm));
|
||||||
|
holder.fat.setText(MainApp.sResources.getString(R.string.shortfat) + ": " + food.fat + MainApp.sResources.getString(R.string.shortgramm));
|
||||||
|
if (food.fat == 0)
|
||||||
|
holder.fat.setVisibility(View.INVISIBLE);
|
||||||
|
holder.protein.setText(MainApp.sResources.getString(R.string.shortprotein) + ": " + food.protein + MainApp.sResources.getString(R.string.shortgramm));
|
||||||
|
if (food.protein == 0)
|
||||||
|
holder.protein.setVisibility(View.INVISIBLE);
|
||||||
|
holder.energy.setText(MainApp.sResources.getString(R.string.shortenergy) + ": " + food.energy + MainApp.sResources.getString(R.string.shortkilojoul));
|
||||||
|
if (food.energy == 0)
|
||||||
|
holder.energy.setVisibility(View.INVISIBLE);
|
||||||
|
holder.remove.setTag(food);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return foodList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class FoodsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
||||||
|
TextView name;
|
||||||
|
TextView portion;
|
||||||
|
TextView carbs;
|
||||||
|
TextView fat;
|
||||||
|
TextView protein;
|
||||||
|
TextView energy;
|
||||||
|
TextView ns;
|
||||||
|
TextView remove;
|
||||||
|
|
||||||
|
FoodsViewHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
name = (TextView) itemView.findViewById(R.id.food_name);
|
||||||
|
portion = (TextView) itemView.findViewById(R.id.food_portion);
|
||||||
|
carbs = (TextView) itemView.findViewById(R.id.food_carbs);
|
||||||
|
fat = (TextView) itemView.findViewById(R.id.food_fat);
|
||||||
|
protein = (TextView) itemView.findViewById(R.id.food_protein);
|
||||||
|
energy = (TextView) itemView.findViewById(R.id.food_energy);
|
||||||
|
ns = (TextView) itemView.findViewById(R.id.ns_sign);
|
||||||
|
remove = (TextView) itemView.findViewById(R.id.food_remove);
|
||||||
|
remove.setOnClickListener(this);
|
||||||
|
remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
final Food food = (Food) v.getTag();
|
||||||
|
switch (v.getId()) {
|
||||||
|
|
||||||
|
case R.id.food_remove:
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
||||||
|
builder.setTitle(MainApp.sResources.getString(R.string.confirmation));
|
||||||
|
builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + food.name);
|
||||||
|
builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
final String _id = food._id;
|
||||||
|
if (_id != null && !_id.equals("")) {
|
||||||
|
NSUpload.removeFoodFromNS(_id);
|
||||||
|
}
|
||||||
|
MainApp.getDbHelper().foodHelper.delete(food);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null);
|
||||||
|
builder.show();
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Food;
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 05.08.2016.
|
||||||
|
*/
|
||||||
|
public class FoodPlugin implements PluginBase {
|
||||||
|
private boolean fragmentEnabled = true;
|
||||||
|
private boolean fragmentVisible = false;
|
||||||
|
|
||||||
|
private static FoodPlugin plugin = null;
|
||||||
|
|
||||||
|
public static FoodPlugin getPlugin() {
|
||||||
|
if (plugin == null)
|
||||||
|
plugin = new FoodPlugin();
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFragmentClass() {
|
||||||
|
return FoodFragment.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return PluginBase.GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return MainApp.instance().getString(R.string.food);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNameShort() {
|
||||||
|
// use long name as fallback (not visible in tabs)
|
||||||
|
return getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(int type) {
|
||||||
|
return type == GENERAL && fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisibleInTabs(int type) {
|
||||||
|
return type == GENERAL && fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBeHidden(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasFragment() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean showInList(int type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||||
|
if (type == GENERAL) this.fragmentEnabled = fragmentEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||||
|
if (type == GENERAL) this.fragmentVisible = fragmentVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -367,6 +367,9 @@ public class IobCobCalculatorPlugin implements PluginBase {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (profile.getIsf(bgTime) == null)
|
||||||
|
return; // profile not set yet
|
||||||
|
|
||||||
double sens = Profile.toMgdl(profile.getIsf(bgTime), profile.getUnits());
|
double sens = Profile.toMgdl(profile.getIsf(bgTime), profile.getUnits());
|
||||||
|
|
||||||
AutosensData autosensData = new AutosensData();
|
AutosensData autosensData = new AutosensData();
|
||||||
|
|
|
@ -183,7 +183,7 @@ public class BroadcastTreatment {
|
||||||
ret.add(newarr);
|
ret.add(newarr);
|
||||||
}
|
}
|
||||||
newarr = new JSONArray();
|
newarr = new JSONArray();
|
||||||
count = 50;
|
count = 20;
|
||||||
}
|
}
|
||||||
newarr.put(array.get(i));
|
newarr.put(array.get(i));
|
||||||
--count;
|
--count;
|
||||||
|
|
|
@ -37,9 +37,7 @@ import com.crashlytics.android.Crashlytics;
|
||||||
import com.crashlytics.android.answers.Answers;
|
import com.crashlytics.android.answers.Answers;
|
||||||
import com.crashlytics.android.answers.CustomEvent;
|
import com.crashlytics.android.answers.CustomEvent;
|
||||||
import com.jjoe64.graphview.GraphView;
|
import com.jjoe64.graphview.GraphView;
|
||||||
import com.jjoe64.graphview.LabelFormatter;
|
|
||||||
import com.jjoe64.graphview.ValueDependentColor;
|
import com.jjoe64.graphview.ValueDependentColor;
|
||||||
import com.jjoe64.graphview.Viewport;
|
|
||||||
import com.jjoe64.graphview.series.BarGraphSeries;
|
import com.jjoe64.graphview.series.BarGraphSeries;
|
||||||
import com.jjoe64.graphview.series.DataPoint;
|
import com.jjoe64.graphview.series.DataPoint;
|
||||||
import com.jjoe64.graphview.series.LineGraphSeries;
|
import com.jjoe64.graphview.series.LineGraphSeries;
|
||||||
|
@ -55,7 +53,6 @@ import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
@ -77,11 +74,9 @@ import info.nightscout.androidaps.db.BgReading;
|
||||||
import info.nightscout.androidaps.db.CareportalEvent;
|
import info.nightscout.androidaps.db.CareportalEvent;
|
||||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch;
|
|
||||||
import info.nightscout.androidaps.db.Source;
|
import info.nightscout.androidaps.db.Source;
|
||||||
import info.nightscout.androidaps.db.TempTarget;
|
import info.nightscout.androidaps.db.TempTarget;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
|
||||||
import info.nightscout.androidaps.events.EventCareportalEventChange;
|
import info.nightscout.androidaps.events.EventCareportalEventChange;
|
||||||
import info.nightscout.androidaps.events.EventExtendedBolusChange;
|
import info.nightscout.androidaps.events.EventExtendedBolusChange;
|
||||||
import info.nightscout.androidaps.events.EventInitializationChanged;
|
import info.nightscout.androidaps.events.EventInitializationChanged;
|
||||||
|
@ -100,23 +95,20 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
|
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
|
||||||
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
|
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
|
||||||
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
|
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
|
||||||
import info.nightscout.androidaps.plugins.IobCobCalculator.events.BasalData;
|
|
||||||
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
|
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
|
||||||
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
|
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
|
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
|
||||||
import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastAckAlarm;
|
import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastAckAlarm;
|
||||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
|
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSAMA.DetermineBasalResultAMA;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog;
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialog;
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialog;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialog;
|
import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialog;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock;
|
import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock;
|
||||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.AreaGraphSeries;
|
import info.nightscout.androidaps.plugins.Overview.graphData.GraphData;
|
||||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
|
||||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DoubleDataPoint;
|
|
||||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.FixedLineGraphSeries;
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.FixedLineGraphSeries;
|
||||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
|
||||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.TimeAsXAxisLabelFormatter;
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.TimeAsXAxisLabelFormatter;
|
||||||
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
|
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
|
||||||
import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileViewerDialog;
|
import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileViewerDialog;
|
||||||
|
@ -126,7 +118,6 @@ import info.nightscout.utils.DecimalFormatter;
|
||||||
import info.nightscout.utils.NSUpload;
|
import info.nightscout.utils.NSUpload;
|
||||||
import info.nightscout.utils.OKDialog;
|
import info.nightscout.utils.OKDialog;
|
||||||
import info.nightscout.utils.Profiler;
|
import info.nightscout.utils.Profiler;
|
||||||
import info.nightscout.utils.Round;
|
|
||||||
import info.nightscout.utils.SP;
|
import info.nightscout.utils.SP;
|
||||||
import info.nightscout.utils.ToastUtils;
|
import info.nightscout.utils.ToastUtils;
|
||||||
|
|
||||||
|
@ -937,8 +928,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Double lowLine = SP.getDouble("low_mark", 0d);
|
double lowLine = SP.getDouble("low_mark", 0d);
|
||||||
Double highLine = SP.getDouble("high_mark", 0d);
|
double highLine = SP.getDouble("high_mark", 0d);
|
||||||
|
|
||||||
//Start with updating the BG as it is unaffected by loop.
|
//Start with updating the BG as it is unaffected by loop.
|
||||||
// **** BG value ****
|
// **** BG value ****
|
||||||
|
@ -1249,7 +1240,6 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****** GRAPH *******
|
// ****** GRAPH *******
|
||||||
//log.debug("updateGUI checkpoint 1");
|
|
||||||
|
|
||||||
// allign to hours
|
// allign to hours
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
@ -1278,466 +1268,83 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
||||||
endTime = toTime;
|
endTime = toTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
LineGraphSeries<DataPoint> basalsLineSeries = null;
|
|
||||||
LineGraphSeries<DataPoint> absoluteBasalsLineSeries = null;
|
|
||||||
LineGraphSeries<DataPoint> baseBasalsSeries = null;
|
|
||||||
LineGraphSeries<DataPoint> tempBasalsSeries = null;
|
|
||||||
AreaGraphSeries<DoubleDataPoint> areaSeries;
|
|
||||||
LineGraphSeries<DataPoint> seriesNow, seriesNow2;
|
|
||||||
|
|
||||||
// **** TEMP BASALS graph ****
|
|
||||||
Double maxBasalValueFound = 0d;
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
if (pump.getPumpDescription().isTempBasalCapable && showBasalsView.isChecked()) {
|
|
||||||
List<DataPoint> baseBasalArray = new ArrayList<>();
|
|
||||||
List<DataPoint> tempBasalArray = new ArrayList<>();
|
|
||||||
List<DataPoint> basalLineArray = new ArrayList<>();
|
|
||||||
List<DataPoint> absoluteBasalLineArray = new ArrayList<>();
|
|
||||||
double lastLineBasal = 0;
|
|
||||||
double lastAbsoluteLineBasal = 0;
|
|
||||||
double lastBaseBasal = 0;
|
|
||||||
double lastTempBasal = 0;
|
|
||||||
for (long time = fromTime; time < now; time += 60 * 1000L) {
|
|
||||||
BasalData basalData = IobCobCalculatorPlugin.getBasalData(time);
|
|
||||||
double baseBasalValue = basalData.basal;
|
|
||||||
double absoluteLineValue = baseBasalValue;
|
|
||||||
double tempBasalValue = 0;
|
|
||||||
double basal = 0d;
|
|
||||||
if (basalData.isTempBasalRunning) {
|
|
||||||
absoluteLineValue = tempBasalValue = basalData.tempBasalAbsolute;
|
|
||||||
if (tempBasalValue != lastTempBasal) {
|
|
||||||
tempBasalArray.add(new DataPoint(time, lastTempBasal));
|
|
||||||
tempBasalArray.add(new DataPoint(time, basal = tempBasalValue));
|
|
||||||
}
|
|
||||||
if (lastBaseBasal != 0d) {
|
|
||||||
baseBasalArray.add(new DataPoint(time, lastBaseBasal));
|
|
||||||
baseBasalArray.add(new DataPoint(time, 0d));
|
|
||||||
lastBaseBasal = 0d;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (baseBasalValue != lastBaseBasal) {
|
|
||||||
baseBasalArray.add(new DataPoint(time, lastBaseBasal));
|
|
||||||
baseBasalArray.add(new DataPoint(time, basal = baseBasalValue));
|
|
||||||
lastBaseBasal = baseBasalValue;
|
|
||||||
}
|
|
||||||
if (lastTempBasal != 0) {
|
|
||||||
tempBasalArray.add(new DataPoint(time, lastTempBasal));
|
|
||||||
tempBasalArray.add(new DataPoint(time, 0d));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (baseBasalValue != lastLineBasal) {
|
|
||||||
basalLineArray.add(new DataPoint(time, lastLineBasal));
|
|
||||||
basalLineArray.add(new DataPoint(time, baseBasalValue));
|
|
||||||
}
|
|
||||||
if (absoluteLineValue != lastAbsoluteLineBasal) {
|
|
||||||
absoluteBasalLineArray.add(new DataPoint(time, lastAbsoluteLineBasal));
|
|
||||||
absoluteBasalLineArray.add(new DataPoint(time, basal));
|
|
||||||
}
|
|
||||||
|
|
||||||
lastAbsoluteLineBasal = absoluteLineValue;
|
|
||||||
lastLineBasal = baseBasalValue;
|
|
||||||
lastTempBasal = tempBasalValue;
|
|
||||||
maxBasalValueFound = Math.max(maxBasalValueFound, basal);
|
|
||||||
}
|
|
||||||
basalLineArray.add(new DataPoint(now, lastLineBasal));
|
|
||||||
baseBasalArray.add(new DataPoint(now, lastBaseBasal));
|
|
||||||
tempBasalArray.add(new DataPoint(now, lastTempBasal));
|
|
||||||
absoluteBasalLineArray.add(new DataPoint(now, lastAbsoluteLineBasal));
|
|
||||||
|
|
||||||
DataPoint[] baseBasal = new DataPoint[baseBasalArray.size()];
|
|
||||||
baseBasal = baseBasalArray.toArray(baseBasal);
|
|
||||||
baseBasalsSeries = new LineGraphSeries<>(baseBasal);
|
|
||||||
baseBasalsSeries.setDrawBackground(true);
|
|
||||||
baseBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.basebasal));
|
|
||||||
baseBasalsSeries.setThickness(0);
|
|
||||||
|
|
||||||
DataPoint[] tempBasal = new DataPoint[tempBasalArray.size()];
|
|
||||||
tempBasal = tempBasalArray.toArray(tempBasal);
|
|
||||||
tempBasalsSeries = new LineGraphSeries<>(tempBasal);
|
|
||||||
tempBasalsSeries.setDrawBackground(true);
|
|
||||||
tempBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.tempbasal));
|
|
||||||
tempBasalsSeries.setThickness(0);
|
|
||||||
|
|
||||||
DataPoint[] basalLine = new DataPoint[basalLineArray.size()];
|
|
||||||
basalLine = basalLineArray.toArray(basalLine);
|
|
||||||
basalsLineSeries = new LineGraphSeries<>(basalLine);
|
|
||||||
Paint paint = new Paint();
|
|
||||||
paint.setStyle(Paint.Style.STROKE);
|
|
||||||
paint.setStrokeWidth(2);
|
|
||||||
paint.setPathEffect(new DashPathEffect(new float[]{2, 4}, 0));
|
|
||||||
paint.setColor(MainApp.sResources.getColor(R.color.basal));
|
|
||||||
basalsLineSeries.setCustomPaint(paint);
|
|
||||||
|
|
||||||
DataPoint[] absoluteBasalLine = new DataPoint[absoluteBasalLineArray.size()];
|
|
||||||
absoluteBasalLine = absoluteBasalLineArray.toArray(absoluteBasalLine);
|
|
||||||
absoluteBasalsLineSeries = new LineGraphSeries<>(absoluteBasalLine);
|
|
||||||
Paint absolutePaint = new Paint();
|
|
||||||
absolutePaint.setStyle(Paint.Style.STROKE);
|
|
||||||
absolutePaint.setStrokeWidth(4);
|
|
||||||
absolutePaint.setColor(MainApp.sResources.getColor(R.color.basal));
|
|
||||||
absoluteBasalsLineSeries.setCustomPaint(absolutePaint);
|
|
||||||
}
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 2");
|
|
||||||
|
|
||||||
// **** IOB COB DEV graph ****
|
|
||||||
class DeviationDataPoint extends DataPoint {
|
|
||||||
public int color;
|
|
||||||
|
|
||||||
public DeviationDataPoint(double x, double y, int color) {
|
|
||||||
super(x, y);
|
|
||||||
this.color = color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FixedLineGraphSeries<DataPoint> iobSeries;
|
|
||||||
FixedLineGraphSeries<DataPoint> cobSeries;
|
|
||||||
BarGraphSeries<DeviationDataPoint> devSeries;
|
|
||||||
LineGraphSeries<DataPoint> ratioSeries;
|
|
||||||
Double maxIobValueFound = 0d;
|
|
||||||
Double maxCobValueFound = 0d;
|
|
||||||
Double maxDevValueFound = 0d;
|
|
||||||
Double maxRatioValueFound = 0d;
|
|
||||||
|
|
||||||
if (showIobView.isChecked() || showCobView.isChecked() || showDeviationsView.isChecked() || showRatiosView.isChecked()) {
|
|
||||||
//Date start = new Date();
|
|
||||||
List<DataPoint> iobArray = new ArrayList<>();
|
|
||||||
List<DataPoint> cobArray = new ArrayList<>();
|
|
||||||
List<DeviationDataPoint> devArray = new ArrayList<>();
|
|
||||||
List<DataPoint> ratioArray = new ArrayList<>();
|
|
||||||
double lastIob = 0;
|
|
||||||
int lastCob = 0;
|
|
||||||
for (long time = fromTime; time <= now; time += 5 * 60 * 1000L) {
|
|
||||||
if (showIobView.isChecked()) {
|
|
||||||
double iob = IobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time).iob;
|
|
||||||
if (Math.abs(lastIob - iob) > 0.02) {
|
|
||||||
if (Math.abs(lastIob - iob) > 0.2)
|
|
||||||
iobArray.add(new DataPoint(time, lastIob));
|
|
||||||
iobArray.add(new DataPoint(time, iob));
|
|
||||||
maxIobValueFound = Math.max(maxIobValueFound, Math.abs(iob));
|
|
||||||
lastIob = iob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (showCobView.isChecked() || showDeviationsView.isChecked() || showRatiosView.isChecked()) {
|
|
||||||
AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
|
|
||||||
if (autosensData != null && showCobView.isChecked()) {
|
|
||||||
int cob = (int) autosensData.cob;
|
|
||||||
if (cob != lastCob) {
|
|
||||||
if (autosensData.carbsFromBolus > 0)
|
|
||||||
cobArray.add(new DataPoint(time, lastCob));
|
|
||||||
cobArray.add(new DataPoint(time, cob));
|
|
||||||
maxCobValueFound = Math.max(maxCobValueFound, cob);
|
|
||||||
lastCob = cob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (autosensData != null && showDeviationsView.isChecked()) {
|
|
||||||
int color = Color.BLACK; // "="
|
|
||||||
if (autosensData.pastSensitivity.equals("C")) color = Color.GRAY;
|
|
||||||
if (autosensData.pastSensitivity.equals("+")) color = Color.GREEN;
|
|
||||||
if (autosensData.pastSensitivity.equals("-")) color = Color.RED;
|
|
||||||
devArray.add(new DeviationDataPoint(time, autosensData.deviation, color));
|
|
||||||
maxDevValueFound = Math.max(maxDevValueFound, Math.abs(autosensData.deviation));
|
|
||||||
}
|
|
||||||
if (autosensData != null && showRatiosView.isChecked()) {
|
|
||||||
ratioArray.add(new DataPoint(time, autosensData.autosensRatio));
|
|
||||||
maxRatioValueFound = Math.max(maxRatioValueFound, Math.abs(autosensData.autosensRatio));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Profiler.log(log, "IOB processed", start);
|
|
||||||
DataPoint[] iobData = new DataPoint[iobArray.size()];
|
|
||||||
iobData = iobArray.toArray(iobData);
|
|
||||||
iobSeries = new FixedLineGraphSeries<>(iobData);
|
|
||||||
iobSeries.setDrawBackground(true);
|
|
||||||
iobSeries.setBackgroundColor(0x80FFFFFF & MainApp.sResources.getColor(R.color.iob)); //50%
|
|
||||||
iobSeries.setColor(MainApp.sResources.getColor(R.color.iob));
|
|
||||||
iobSeries.setThickness(3);
|
|
||||||
|
|
||||||
|
|
||||||
Double maxByScale = null;
|
|
||||||
int graphsToShow = 0;
|
|
||||||
if (showIobView.isChecked()) {
|
|
||||||
if (maxByScale == null) maxByScale = maxIobValueFound;
|
|
||||||
graphsToShow++;
|
|
||||||
}
|
|
||||||
if (showCobView.isChecked()) {
|
|
||||||
if (maxByScale == null) maxByScale = maxCobValueFound;
|
|
||||||
graphsToShow++;
|
|
||||||
}
|
|
||||||
if (showDeviationsView.isChecked()) {
|
|
||||||
if (maxByScale == null) maxByScale = maxDevValueFound;
|
|
||||||
graphsToShow++;
|
|
||||||
}
|
|
||||||
if (showRatiosView.isChecked()) {
|
|
||||||
if (maxByScale == null) maxByScale = maxRatioValueFound;
|
|
||||||
graphsToShow++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (graphsToShow > 1) {
|
|
||||||
if (!maxByScale.equals(maxCobValueFound)) {
|
|
||||||
List<DataPoint> cobArrayRescaled = new ArrayList<>();
|
|
||||||
for (int ci = 0; ci < cobArray.size(); ci++) {
|
|
||||||
cobArrayRescaled.add(new DataPoint(cobArray.get(ci).getX(), cobArray.get(ci).getY() * maxByScale / maxCobValueFound / 2));
|
|
||||||
}
|
|
||||||
cobArray = cobArrayRescaled;
|
|
||||||
}
|
|
||||||
if (!maxByScale.equals(maxDevValueFound)) {
|
|
||||||
List<DeviationDataPoint> devArrayRescaled = new ArrayList<>();
|
|
||||||
for (int ci = 0; ci < devArray.size(); ci++) {
|
|
||||||
devArrayRescaled.add(new DeviationDataPoint(devArray.get(ci).getX(), devArray.get(ci).getY() * maxByScale / maxDevValueFound, devArray.get(ci).color));
|
|
||||||
}
|
|
||||||
devArray = devArrayRescaled;
|
|
||||||
}
|
|
||||||
if (!maxByScale.equals(maxRatioValueFound)) {
|
|
||||||
List<DataPoint> ratioArrayRescaled = new ArrayList<>();
|
|
||||||
for (int ci = 0; ci < ratioArray.size(); ci++) {
|
|
||||||
ratioArrayRescaled.add(new DataPoint(ratioArray.get(ci).getX(), (ratioArray.get(ci).getY() - 1) * maxByScale / maxRatioValueFound));
|
|
||||||
}
|
|
||||||
ratioArray = ratioArrayRescaled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// COB
|
|
||||||
DataPoint[] cobData = new DataPoint[cobArray.size()];
|
|
||||||
cobData = cobArray.toArray(cobData);
|
|
||||||
cobSeries = new FixedLineGraphSeries<>(cobData);
|
|
||||||
cobSeries.setDrawBackground(true);
|
|
||||||
cobSeries.setBackgroundColor(0xB0FFFFFF & MainApp.sResources.getColor(R.color.cob)); //50%
|
|
||||||
cobSeries.setColor(MainApp.sResources.getColor(R.color.cob));
|
|
||||||
cobSeries.setThickness(3);
|
|
||||||
|
|
||||||
// DEVIATIONS
|
|
||||||
DeviationDataPoint[] devData = new DeviationDataPoint[devArray.size()];
|
|
||||||
devData = devArray.toArray(devData);
|
|
||||||
devSeries = new BarGraphSeries<>(devData);
|
|
||||||
devSeries.setValueDependentColor(new ValueDependentColor<DeviationDataPoint>() {
|
|
||||||
@Override
|
|
||||||
public int get(DeviationDataPoint data) {
|
|
||||||
return data.color;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// RATIOS
|
|
||||||
DataPoint[] ratioData = new DataPoint[ratioArray.size()];
|
|
||||||
ratioData = ratioArray.toArray(ratioData);
|
|
||||||
ratioSeries = new LineGraphSeries<>(ratioData);
|
|
||||||
ratioSeries.setColor(MainApp.sResources.getColor(R.color.ratio));
|
|
||||||
ratioSeries.setThickness(3);
|
|
||||||
|
|
||||||
|
// 2nd graph
|
||||||
|
// remove old data
|
||||||
iobGraph.getSeries().clear();
|
iobGraph.getSeries().clear();
|
||||||
|
|
||||||
if (showIobView.isChecked() && iobData.length > 0) {
|
GraphData secondGraphData = new GraphData();
|
||||||
addSeriesWithoutInvalidate(iobSeries, iobGraph);
|
|
||||||
}
|
boolean useIobForScale = false;
|
||||||
if (showCobView.isChecked() && cobData.length > 0) {
|
boolean useCobForScale = false;
|
||||||
addSeriesWithoutInvalidate(cobSeries, iobGraph);
|
boolean useDevForScale = false;
|
||||||
}
|
boolean useRatioForScale = false;
|
||||||
if (showDeviationsView.isChecked() && devData.length > 0) {
|
|
||||||
addSeriesWithoutInvalidate(devSeries, iobGraph);
|
if (showIobView.isChecked()) {
|
||||||
}
|
useIobForScale = true;
|
||||||
if (showRatiosView.isChecked() && ratioData.length > 0) {
|
} else if (showCobView.isChecked()) {
|
||||||
addSeriesWithoutInvalidate(ratioSeries, iobGraph);
|
useCobForScale = true;
|
||||||
|
} else if (showDeviationsView.isChecked()) {
|
||||||
|
useDevForScale = true;
|
||||||
|
} else if (showRatiosView.isChecked()) {
|
||||||
|
useRatioForScale = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (showIobView.isChecked())
|
||||||
|
secondGraphData.addIob(iobGraph, fromTime, now, useIobForScale, 1d);
|
||||||
|
if (showCobView.isChecked())
|
||||||
|
secondGraphData.addCob(iobGraph, fromTime, now, useCobForScale, useCobForScale ? 1d : 0.5d);
|
||||||
|
if (showDeviationsView.isChecked())
|
||||||
|
secondGraphData.addDeviations(iobGraph, fromTime, now, useDevForScale, 1d);
|
||||||
|
if (showRatiosView.isChecked())
|
||||||
|
secondGraphData.addRatio(iobGraph, fromTime, now, useRatioForScale, 1d);
|
||||||
|
|
||||||
|
if (showIobView.isChecked() || showCobView.isChecked() || showDeviationsView.isChecked() || showRatiosView.isChecked()) {
|
||||||
iobGraph.setVisibility(View.VISIBLE);
|
iobGraph.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
iobGraph.setVisibility(View.GONE);
|
iobGraph.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
//log.debug("updateGUI checkpoint 3");
|
|
||||||
|
|
||||||
// remove old data from graph
|
// remove old data from graph
|
||||||
bgGraph.getSecondScale().getSeries().clear();
|
|
||||||
bgGraph.getSeries().clear();
|
bgGraph.getSeries().clear();
|
||||||
//log.debug("updateGUI checkpoint 4");
|
|
||||||
|
|
||||||
// **** Area ****
|
GraphData graphData = new GraphData();
|
||||||
DoubleDataPoint[] areaDataPoints = new DoubleDataPoint[]{
|
|
||||||
new DoubleDataPoint(fromTime, lowLine, highLine),
|
|
||||||
new DoubleDataPoint(endTime, lowLine, highLine)
|
// **** In range Area ****
|
||||||
};
|
graphData.addInRangeArea(bgGraph, fromTime, endTime, lowLine, highLine);
|
||||||
areaSeries = new AreaGraphSeries<>(areaDataPoints);
|
|
||||||
addSeriesWithoutInvalidate(areaSeries, bgGraph);
|
// **** BG ****
|
||||||
areaSeries.setColor(0);
|
if (showPrediction)
|
||||||
areaSeries.setDrawBackground(true);
|
graphData.addBgReadings(bgGraph, fromTime, toTime, lowLine, highLine, (DetermineBasalResultAMA) finalLastRun.constraintsProcessed);
|
||||||
areaSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.inrangebackground));
|
else
|
||||||
|
graphData.addBgReadings(bgGraph, fromTime, toTime, lowLine, highLine, null);
|
||||||
|
|
||||||
// set manual x bounds to have nice steps
|
// set manual x bounds to have nice steps
|
||||||
bgGraph.getViewport().setMaxX(endTime);
|
graphData.formatAxis(bgGraph, fromTime, endTime);
|
||||||
bgGraph.getViewport().setMinX(fromTime);
|
secondGraphData.formatAxis(iobGraph, fromTime, endTime);
|
||||||
bgGraph.getViewport().setXAxisBoundsManual(true);
|
|
||||||
bgGraph.getGridLabelRenderer().setLabelFormatter(new TimeAsXAxisLabelFormatter(getActivity(), "HH"));
|
|
||||||
bgGraph.getGridLabelRenderer().setNumHorizontalLabels(7); // only 7 because of the space
|
|
||||||
iobGraph.getViewport().setMaxX(endTime);
|
|
||||||
iobGraph.getViewport().setMinX(fromTime);
|
|
||||||
iobGraph.getViewport().setXAxisBoundsManual(true);
|
|
||||||
iobGraph.getGridLabelRenderer().setLabelFormatter(new TimeAsXAxisLabelFormatter(getActivity(), "HH"));
|
|
||||||
iobGraph.getGridLabelRenderer().setNumHorizontalLabels(7); // only 7 because of the space
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 5");
|
|
||||||
// **** BG graph ****
|
|
||||||
List<BgReading> bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true);
|
|
||||||
List<DataPointWithLabelInterface> bgListArray = new ArrayList<>();
|
|
||||||
|
|
||||||
if (bgReadingsArray.size() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Iterator<BgReading> it = bgReadingsArray.iterator();
|
|
||||||
Double maxBgValue = 0d;
|
|
||||||
while (it.hasNext()) {
|
|
||||||
BgReading bg = it.next();
|
|
||||||
if (bg.value > maxBgValue) maxBgValue = bg.value;
|
|
||||||
bgListArray.add(bg);
|
|
||||||
}
|
|
||||||
if (showPrediction) {
|
|
||||||
List<BgReading> predArray = finalLastRun.constraintsProcessed.getPredictions();
|
|
||||||
bgListArray.addAll(predArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
maxBgValue = Profile.fromMgdlToUnits(maxBgValue, units);
|
|
||||||
maxBgValue = units.equals(Constants.MGDL) ? Round.roundTo(maxBgValue, 40d) + 80 : Round.roundTo(maxBgValue, 2d) + 4;
|
|
||||||
if (highLine > maxBgValue) maxBgValue = highLine;
|
|
||||||
Integer numOfVertLines = units.equals(Constants.MGDL) ? (int) (maxBgValue / 40 + 1) : (int) (maxBgValue / 2 + 1);
|
|
||||||
|
|
||||||
DataPointWithLabelInterface[] bg = new DataPointWithLabelInterface[bgListArray.size()];
|
|
||||||
bg = bgListArray.toArray(bg);
|
|
||||||
|
|
||||||
if (bg.length > 0) {
|
|
||||||
addSeriesWithoutInvalidate(new PointsWithLabelGraphSeries<>(bg), bgGraph);
|
|
||||||
}
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 6");
|
|
||||||
// Treatments
|
// Treatments
|
||||||
List<DataPointWithLabelInterface> filteredTreatments = new ArrayList<>();
|
graphData.addTreatments(bgGraph, fromTime, endTime);
|
||||||
|
|
||||||
List<Treatment> treatments = MainApp.getConfigBuilder().getTreatmentsFromHistory();
|
// add basal data
|
||||||
|
|
||||||
for (int tx = 0; tx < treatments.size(); tx++) {
|
|
||||||
Treatment t = treatments.get(tx);
|
|
||||||
if (t.getX() < fromTime || t.getX() > endTime) continue;
|
|
||||||
if (t.isSMB)
|
|
||||||
t.setY(lowLine);
|
|
||||||
else
|
|
||||||
t.setY(getNearestBg((long) t.getX(), bgReadingsArray));
|
|
||||||
filteredTreatments.add(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 7");
|
|
||||||
// ProfileSwitch
|
|
||||||
List<ProfileSwitch> profileSwitches = MainApp.getConfigBuilder().getProfileSwitchesFromHistory().getList();
|
|
||||||
|
|
||||||
for (int tx = 0; tx < profileSwitches.size(); tx++) {
|
|
||||||
DataPointWithLabelInterface t = profileSwitches.get(tx);
|
|
||||||
if (t.getX() < fromTime || t.getX() > endTime) continue;
|
|
||||||
filteredTreatments.add(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 8");
|
|
||||||
// Extended bolus
|
|
||||||
if (!pump.isFakingTempsByExtendedBoluses()) {
|
|
||||||
List<ExtendedBolus> extendedBoluses = MainApp.getConfigBuilder().getExtendedBolusesFromHistory().getList();
|
|
||||||
|
|
||||||
for (int tx = 0; tx < extendedBoluses.size(); tx++) {
|
|
||||||
DataPointWithLabelInterface t = extendedBoluses.get(tx);
|
|
||||||
if (t.getX() + t.getDuration() < fromTime || t.getX() > endTime) continue;
|
|
||||||
if (t.getDuration() == 0) continue;
|
|
||||||
t.setY(getNearestBg((long) t.getX(), bgReadingsArray));
|
|
||||||
filteredTreatments.add(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 9");
|
|
||||||
// Careportal
|
|
||||||
List<CareportalEvent> careportalEvents = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, true);
|
|
||||||
|
|
||||||
for (int tx = 0; tx < careportalEvents.size(); tx++) {
|
|
||||||
DataPointWithLabelInterface t = careportalEvents.get(tx);
|
|
||||||
if (t.getX() + t.getDuration() < fromTime || t.getX() > endTime) continue;
|
|
||||||
t.setY(getNearestBg((long) t.getX(), bgReadingsArray));
|
|
||||||
filteredTreatments.add(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
DataPointWithLabelInterface[] treatmentsArray = new DataPointWithLabelInterface[filteredTreatments.size()];
|
|
||||||
treatmentsArray = filteredTreatments.toArray(treatmentsArray);
|
|
||||||
if (treatmentsArray.length > 0) {
|
|
||||||
addSeriesWithoutInvalidate(new PointsWithLabelGraphSeries<>(treatmentsArray), bgGraph);
|
|
||||||
}
|
|
||||||
//log.debug("updateGUI checkpoint 10");
|
|
||||||
|
|
||||||
// set manual y bounds to have nice steps
|
|
||||||
bgGraph.getViewport().setMaxY(maxBgValue);
|
|
||||||
bgGraph.getViewport().setMinY(0);
|
|
||||||
bgGraph.getViewport().setYAxisBoundsManual(true);
|
|
||||||
bgGraph.getGridLabelRenderer().setNumVerticalLabels(numOfVertLines);
|
|
||||||
|
|
||||||
// set second scale
|
|
||||||
if (pump.getPumpDescription().isTempBasalCapable && showBasalsView.isChecked()) {
|
if (pump.getPumpDescription().isTempBasalCapable && showBasalsView.isChecked()) {
|
||||||
bgGraph.getSecondScale().setMinY(0);
|
graphData.addBasals(bgGraph, fromTime, now, lowLine / graphData.maxY / 1.2d);
|
||||||
bgGraph.getSecondScale().setMaxY(maxBgValue / lowLine * maxBasalValueFound * 1.2d);
|
|
||||||
bgGraph.getSecondScale().addSeries(baseBasalsSeries);
|
|
||||||
bgGraph.getSecondScale().addSeries(tempBasalsSeries);
|
|
||||||
bgGraph.getSecondScale().addSeries(basalsLineSeries);
|
|
||||||
bgGraph.getSecondScale().addSeries(absoluteBasalsLineSeries);
|
|
||||||
}
|
|
||||||
bgGraph.getSecondScale().setLabelFormatter(new LabelFormatter() {
|
|
||||||
@Override
|
|
||||||
public String formatLabel(double value, boolean isValueX) {
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setViewport(Viewport viewport) {
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//log.debug("updateGUI checkpoint 11");
|
|
||||||
// **** NOW line ****
|
// **** NOW line ****
|
||||||
DataPoint[] nowPoints = new DataPoint[]{
|
graphData.addNowLine(bgGraph, now);
|
||||||
new DataPoint(now, 0),
|
secondGraphData.addNowLine(iobGraph, now);
|
||||||
new DataPoint(now, maxBgValue)
|
|
||||||
};
|
// finaly enforce drawing of graphs
|
||||||
addSeriesWithoutInvalidate(seriesNow = new LineGraphSeries<>(nowPoints), bgGraph);
|
|
||||||
seriesNow.setDrawDataPoints(false);
|
|
||||||
DataPoint[] nowPoints2 = new DataPoint[]{
|
|
||||||
new DataPoint(now, 0),
|
|
||||||
new DataPoint(now, maxIobValueFound)
|
|
||||||
};
|
|
||||||
addSeriesWithoutInvalidate(seriesNow2 = new LineGraphSeries<>(nowPoints2), iobGraph);
|
|
||||||
seriesNow2.setDrawDataPoints(false);
|
|
||||||
//seriesNow.setThickness(1);
|
|
||||||
// custom paint to make a dotted line
|
|
||||||
Paint paint = new Paint();
|
|
||||||
paint.setStyle(Paint.Style.STROKE);
|
|
||||||
paint.setStrokeWidth(2);
|
|
||||||
paint.setPathEffect(new DashPathEffect(new float[]{10, 20}, 0));
|
|
||||||
paint.setColor(Color.WHITE);
|
|
||||||
seriesNow.setCustomPaint(paint);
|
|
||||||
seriesNow2.setCustomPaint(paint);
|
|
||||||
bgGraph.onDataChanged(false, false);
|
bgGraph.onDataChanged(false, false);
|
||||||
iobGraph.onDataChanged(false, false);
|
iobGraph.onDataChanged(false, false);
|
||||||
|
|
||||||
Profiler.log(log, from, updateGUIStart);
|
Profiler.log(log, from, updateGUIStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getNearestBg(long date, List<BgReading> bgReadingsArray) {
|
|
||||||
double bg = 0;
|
|
||||||
String units = MainApp.getConfigBuilder().getProfileUnits();
|
|
||||||
for (int r = bgReadingsArray.size() - 1; r >= 0; r--) {
|
|
||||||
BgReading reading = bgReadingsArray.get(r);
|
|
||||||
if (reading.date > date) continue;
|
|
||||||
bg = Profile.fromMgdlToUnits(reading.value, units);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addSeriesWithoutInvalidate(Series s, GraphView graph) {
|
|
||||||
s.onGraphViewAttached(graph);
|
|
||||||
graph.getSeries().add(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Notifications
|
//Notifications
|
||||||
static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.NotificationsViewHolder> {
|
static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.NotificationsViewHolder> {
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,467 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Overview.graphData;
|
||||||
|
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.DashPathEffect;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
|
||||||
|
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 java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
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.db.BgReading;
|
||||||
|
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.IobCobCalculator.AutosensData;
|
||||||
|
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
|
||||||
|
import info.nightscout.androidaps.plugins.IobCobCalculator.events.BasalData;
|
||||||
|
import info.nightscout.androidaps.plugins.OpenAPSAMA.DetermineBasalResultAMA;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.AreaGraphSeries;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DoubleDataPoint;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.FixedLineGraphSeries;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.Scale;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.ScaledDataPoint;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.graphExtensions.TimeAsXAxisLabelFormatter;
|
||||||
|
import info.nightscout.utils.Round;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 18.10.2017.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class GraphData {
|
||||||
|
|
||||||
|
public GraphData() {
|
||||||
|
units = MainApp.getConfigBuilder().getProfileUnits();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double maxY = 0;
|
||||||
|
private List<BgReading> bgReadingsArray;
|
||||||
|
private String units;
|
||||||
|
|
||||||
|
public void addBgReadings(GraphView bgGraph, long fromTime, long toTime, double lowLine, double highLine, DetermineBasalResultAMA amaResult) {
|
||||||
|
double maxBgValue = 0d;
|
||||||
|
bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true);
|
||||||
|
List<DataPointWithLabelInterface> bgListArray = new ArrayList<>();
|
||||||
|
|
||||||
|
if (bgReadingsArray.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<BgReading> it = bgReadingsArray.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
BgReading bg = it.next();
|
||||||
|
if (bg.value > maxBgValue) maxBgValue = bg.value;
|
||||||
|
bgListArray.add(bg);
|
||||||
|
}
|
||||||
|
if (amaResult != null) {
|
||||||
|
List<BgReading> predArray = amaResult.getPredictions();
|
||||||
|
bgListArray.addAll(predArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
maxBgValue = Profile.fromMgdlToUnits(maxBgValue, units);
|
||||||
|
maxBgValue = units.equals(Constants.MGDL) ? Round.roundTo(maxBgValue, 40d) + 80 : Round.roundTo(maxBgValue, 2d) + 4;
|
||||||
|
if (highLine > maxBgValue) maxBgValue = highLine;
|
||||||
|
int numOfVertLines = units.equals(Constants.MGDL) ? (int) (maxBgValue / 40 + 1) : (int) (maxBgValue / 2 + 1);
|
||||||
|
|
||||||
|
DataPointWithLabelInterface[] bg = new DataPointWithLabelInterface[bgListArray.size()];
|
||||||
|
bg = bgListArray.toArray(bg);
|
||||||
|
|
||||||
|
if (bg.length > 0) {
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, new PointsWithLabelGraphSeries<>(bg));
|
||||||
|
}
|
||||||
|
|
||||||
|
maxY = maxBgValue;
|
||||||
|
// set manual y bounds to have nice steps
|
||||||
|
bgGraph.getViewport().setMaxY(maxY);
|
||||||
|
bgGraph.getViewport().setMinY(0);
|
||||||
|
bgGraph.getViewport().setYAxisBoundsManual(true);
|
||||||
|
bgGraph.getGridLabelRenderer().setNumVerticalLabels(numOfVertLines);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addInRangeArea(GraphView bgGraph, long fromTime, long toTime, double lowLine, double highLine) {
|
||||||
|
AreaGraphSeries<DoubleDataPoint> inRangeAreaSeries;
|
||||||
|
|
||||||
|
DoubleDataPoint[] inRangeAreaDataPoints = new DoubleDataPoint[]{
|
||||||
|
new DoubleDataPoint(fromTime, lowLine, highLine),
|
||||||
|
new DoubleDataPoint(toTime, lowLine, highLine)
|
||||||
|
};
|
||||||
|
inRangeAreaSeries = new AreaGraphSeries<>(inRangeAreaDataPoints);
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, inRangeAreaSeries);
|
||||||
|
inRangeAreaSeries.setColor(0);
|
||||||
|
inRangeAreaSeries.setDrawBackground(true);
|
||||||
|
inRangeAreaSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.inrangebackground));
|
||||||
|
}
|
||||||
|
|
||||||
|
// scale in % of vertical size (like 0.3)
|
||||||
|
public void addBasals(GraphView bgGraph, long fromTime, long toTime, double scale) {
|
||||||
|
LineGraphSeries<ScaledDataPoint> basalsLineSeries;
|
||||||
|
LineGraphSeries<ScaledDataPoint> absoluteBasalsLineSeries;
|
||||||
|
LineGraphSeries<ScaledDataPoint> baseBasalsSeries;
|
||||||
|
LineGraphSeries<ScaledDataPoint> tempBasalsSeries;
|
||||||
|
|
||||||
|
double maxBasalValueFound = 0d;
|
||||||
|
Scale basalScale = new Scale();
|
||||||
|
|
||||||
|
List<ScaledDataPoint> baseBasalArray = new ArrayList<>();
|
||||||
|
List<ScaledDataPoint> tempBasalArray = new ArrayList<>();
|
||||||
|
List<ScaledDataPoint> basalLineArray = new ArrayList<>();
|
||||||
|
List<ScaledDataPoint> absoluteBasalLineArray = new ArrayList<>();
|
||||||
|
double lastLineBasal = 0;
|
||||||
|
double lastAbsoluteLineBasal = 0;
|
||||||
|
double lastBaseBasal = 0;
|
||||||
|
double lastTempBasal = 0;
|
||||||
|
for (long time = fromTime; time < toTime; time += 60 * 1000L) {
|
||||||
|
BasalData basalData = IobCobCalculatorPlugin.getBasalData(time);
|
||||||
|
double baseBasalValue = basalData.basal;
|
||||||
|
double absoluteLineValue = baseBasalValue;
|
||||||
|
double tempBasalValue = 0;
|
||||||
|
double basal = 0d;
|
||||||
|
if (basalData.isTempBasalRunning) {
|
||||||
|
absoluteLineValue = tempBasalValue = basalData.tempBasalAbsolute;
|
||||||
|
if (tempBasalValue != lastTempBasal) {
|
||||||
|
tempBasalArray.add(new ScaledDataPoint(time, lastTempBasal, basalScale));
|
||||||
|
tempBasalArray.add(new ScaledDataPoint(time, basal = tempBasalValue, basalScale));
|
||||||
|
}
|
||||||
|
if (lastBaseBasal != 0d) {
|
||||||
|
baseBasalArray.add(new ScaledDataPoint(time, lastBaseBasal, basalScale));
|
||||||
|
baseBasalArray.add(new ScaledDataPoint(time, 0d, basalScale));
|
||||||
|
lastBaseBasal = 0d;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (baseBasalValue != lastBaseBasal) {
|
||||||
|
baseBasalArray.add(new ScaledDataPoint(time, lastBaseBasal, basalScale));
|
||||||
|
baseBasalArray.add(new ScaledDataPoint(time, basal = baseBasalValue, basalScale));
|
||||||
|
lastBaseBasal = baseBasalValue;
|
||||||
|
}
|
||||||
|
if (lastTempBasal != 0) {
|
||||||
|
tempBasalArray.add(new ScaledDataPoint(time, lastTempBasal, basalScale));
|
||||||
|
tempBasalArray.add(new ScaledDataPoint(time, 0d, basalScale));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseBasalValue != lastLineBasal) {
|
||||||
|
basalLineArray.add(new ScaledDataPoint(time, lastLineBasal, basalScale));
|
||||||
|
basalLineArray.add(new ScaledDataPoint(time, baseBasalValue, basalScale));
|
||||||
|
}
|
||||||
|
if (absoluteLineValue != lastAbsoluteLineBasal) {
|
||||||
|
absoluteBasalLineArray.add(new ScaledDataPoint(time, lastAbsoluteLineBasal, basalScale));
|
||||||
|
absoluteBasalLineArray.add(new ScaledDataPoint(time, basal, basalScale));
|
||||||
|
}
|
||||||
|
|
||||||
|
lastAbsoluteLineBasal = absoluteLineValue;
|
||||||
|
lastLineBasal = baseBasalValue;
|
||||||
|
lastTempBasal = tempBasalValue;
|
||||||
|
maxBasalValueFound = Math.max(maxBasalValueFound, basal);
|
||||||
|
}
|
||||||
|
|
||||||
|
basalLineArray.add(new ScaledDataPoint(toTime, lastLineBasal, basalScale));
|
||||||
|
baseBasalArray.add(new ScaledDataPoint(toTime, lastBaseBasal, basalScale));
|
||||||
|
tempBasalArray.add(new ScaledDataPoint(toTime, lastTempBasal, basalScale));
|
||||||
|
absoluteBasalLineArray.add(new ScaledDataPoint(toTime, lastAbsoluteLineBasal, basalScale));
|
||||||
|
|
||||||
|
ScaledDataPoint[] baseBasal = new ScaledDataPoint[baseBasalArray.size()];
|
||||||
|
baseBasal = baseBasalArray.toArray(baseBasal);
|
||||||
|
baseBasalsSeries = new LineGraphSeries<>(baseBasal);
|
||||||
|
baseBasalsSeries.setDrawBackground(true);
|
||||||
|
baseBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.basebasal));
|
||||||
|
baseBasalsSeries.setThickness(0);
|
||||||
|
|
||||||
|
ScaledDataPoint[] tempBasal = new ScaledDataPoint[tempBasalArray.size()];
|
||||||
|
tempBasal = tempBasalArray.toArray(tempBasal);
|
||||||
|
tempBasalsSeries = new LineGraphSeries<>(tempBasal);
|
||||||
|
tempBasalsSeries.setDrawBackground(true);
|
||||||
|
tempBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.tempbasal));
|
||||||
|
tempBasalsSeries.setThickness(0);
|
||||||
|
|
||||||
|
ScaledDataPoint[] basalLine = new ScaledDataPoint[basalLineArray.size()];
|
||||||
|
basalLine = basalLineArray.toArray(basalLine);
|
||||||
|
basalsLineSeries = new LineGraphSeries<>(basalLine);
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setStyle(Paint.Style.STROKE);
|
||||||
|
paint.setStrokeWidth(2);
|
||||||
|
paint.setPathEffect(new DashPathEffect(new float[]{2, 4}, 0));
|
||||||
|
paint.setColor(MainApp.sResources.getColor(R.color.basal));
|
||||||
|
basalsLineSeries.setCustomPaint(paint);
|
||||||
|
|
||||||
|
ScaledDataPoint[] absoluteBasalLine = new ScaledDataPoint[absoluteBasalLineArray.size()];
|
||||||
|
absoluteBasalLine = absoluteBasalLineArray.toArray(absoluteBasalLine);
|
||||||
|
absoluteBasalsLineSeries = new LineGraphSeries<>(absoluteBasalLine);
|
||||||
|
Paint absolutePaint = new Paint();
|
||||||
|
absolutePaint.setStyle(Paint.Style.STROKE);
|
||||||
|
absolutePaint.setStrokeWidth(4);
|
||||||
|
absolutePaint.setColor(MainApp.sResources.getColor(R.color.basal));
|
||||||
|
absoluteBasalsLineSeries.setCustomPaint(absolutePaint);
|
||||||
|
|
||||||
|
basalScale.setMultiplier(maxY * scale / maxBasalValueFound);
|
||||||
|
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, baseBasalsSeries);
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, tempBasalsSeries);
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, basalsLineSeries);
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, absoluteBasalsLineSeries);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addTreatments(GraphView bgGraph, long fromTime, long endTime) {
|
||||||
|
List<DataPointWithLabelInterface> filteredTreatments = new ArrayList<>();
|
||||||
|
|
||||||
|
List<Treatment> treatments = MainApp.getConfigBuilder().getTreatmentsFromHistory();
|
||||||
|
|
||||||
|
for (int tx = 0; tx < treatments.size(); tx++) {
|
||||||
|
Treatment t = treatments.get(tx);
|
||||||
|
if (t.getX() < fromTime || t.getX() > endTime) continue;
|
||||||
|
t.setY(getNearestBg((long) t.getX()));
|
||||||
|
filteredTreatments.add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProfileSwitch
|
||||||
|
List<ProfileSwitch> profileSwitches = MainApp.getConfigBuilder().getProfileSwitchesFromHistory().getList();
|
||||||
|
|
||||||
|
for (int tx = 0; tx < profileSwitches.size(); tx++) {
|
||||||
|
DataPointWithLabelInterface t = profileSwitches.get(tx);
|
||||||
|
if (t.getX() < fromTime || t.getX() > endTime) continue;
|
||||||
|
filteredTreatments.add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extended bolus
|
||||||
|
if (!MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses()) {
|
||||||
|
List<ExtendedBolus> extendedBoluses = MainApp.getConfigBuilder().getExtendedBolusesFromHistory().getList();
|
||||||
|
|
||||||
|
for (int tx = 0; tx < extendedBoluses.size(); tx++) {
|
||||||
|
DataPointWithLabelInterface t = extendedBoluses.get(tx);
|
||||||
|
if (t.getX() + t.getDuration() < fromTime || t.getX() > endTime) continue;
|
||||||
|
if (t.getDuration() == 0) continue;
|
||||||
|
t.setY(getNearestBg((long) t.getX()));
|
||||||
|
filteredTreatments.add(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Careportal
|
||||||
|
List<CareportalEvent> careportalEvents = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, true);
|
||||||
|
|
||||||
|
for (int tx = 0; tx < careportalEvents.size(); tx++) {
|
||||||
|
DataPointWithLabelInterface t = careportalEvents.get(tx);
|
||||||
|
if (t.getX() + t.getDuration() < fromTime || t.getX() > endTime) continue;
|
||||||
|
t.setY(getNearestBg((long) t.getX()));
|
||||||
|
filteredTreatments.add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataPointWithLabelInterface[] treatmentsArray = new DataPointWithLabelInterface[filteredTreatments.size()];
|
||||||
|
treatmentsArray = filteredTreatments.toArray(treatmentsArray);
|
||||||
|
if (treatmentsArray.length > 0) {
|
||||||
|
addSeriesWithoutInvalidate(bgGraph, new PointsWithLabelGraphSeries<>(treatmentsArray));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double getNearestBg(long date) {
|
||||||
|
double bg = 0;
|
||||||
|
for (int r = bgReadingsArray.size() - 1; r >= 0; r--) {
|
||||||
|
BgReading reading = bgReadingsArray.get(r);
|
||||||
|
if (reading.date > date) continue;
|
||||||
|
bg = Profile.fromMgdlToUnits(reading.value, units);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// scale in % of vertical size (like 0.3)
|
||||||
|
public void addIob(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) {
|
||||||
|
FixedLineGraphSeries<ScaledDataPoint> iobSeries;
|
||||||
|
List<ScaledDataPoint> iobArray = new ArrayList<>();
|
||||||
|
Double maxIobValueFound = 0d;
|
||||||
|
double lastIob = 0;
|
||||||
|
Scale iobScale = new Scale();
|
||||||
|
|
||||||
|
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
|
||||||
|
double iob = IobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time).iob;
|
||||||
|
if (Math.abs(lastIob - iob) > 0.02) {
|
||||||
|
if (Math.abs(lastIob - iob) > 0.2)
|
||||||
|
iobArray.add(new ScaledDataPoint(time, lastIob, iobScale));
|
||||||
|
iobArray.add(new ScaledDataPoint(time, iob, iobScale));
|
||||||
|
maxIobValueFound = Math.max(maxIobValueFound, Math.abs(iob));
|
||||||
|
lastIob = iob;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScaledDataPoint[] iobData = new ScaledDataPoint[iobArray.size()];
|
||||||
|
iobData = iobArray.toArray(iobData);
|
||||||
|
iobSeries = new FixedLineGraphSeries<>(iobData);
|
||||||
|
iobSeries.setDrawBackground(true);
|
||||||
|
iobSeries.setBackgroundColor(0x80FFFFFF & MainApp.sResources.getColor(R.color.iob)); //50%
|
||||||
|
iobSeries.setColor(MainApp.sResources.getColor(R.color.iob));
|
||||||
|
iobSeries.setThickness(3);
|
||||||
|
|
||||||
|
if (useForScale)
|
||||||
|
maxY = maxIobValueFound;
|
||||||
|
|
||||||
|
iobScale.setMultiplier(maxY * scale / maxIobValueFound);
|
||||||
|
|
||||||
|
addSeriesWithoutInvalidate(graph, iobSeries);
|
||||||
|
}
|
||||||
|
|
||||||
|
// scale in % of vertical size (like 0.3)
|
||||||
|
public void addCob(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) {
|
||||||
|
FixedLineGraphSeries<ScaledDataPoint> cobSeries;
|
||||||
|
List<ScaledDataPoint> cobArray = new ArrayList<>();
|
||||||
|
Double maxCobValueFound = 0d;
|
||||||
|
int lastCob = 0;
|
||||||
|
Scale cobScale = new Scale();
|
||||||
|
|
||||||
|
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
|
||||||
|
AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
|
||||||
|
if (autosensData != null) {
|
||||||
|
int cob = (int) autosensData.cob;
|
||||||
|
if (cob != lastCob) {
|
||||||
|
if (autosensData.carbsFromBolus > 0)
|
||||||
|
cobArray.add(new ScaledDataPoint(time, lastCob, cobScale));
|
||||||
|
cobArray.add(new ScaledDataPoint(time, cob, cobScale));
|
||||||
|
maxCobValueFound = Math.max(maxCobValueFound, cob);
|
||||||
|
lastCob = cob;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// COB
|
||||||
|
ScaledDataPoint[] cobData = new ScaledDataPoint[cobArray.size()];
|
||||||
|
cobData = cobArray.toArray(cobData);
|
||||||
|
cobSeries = new FixedLineGraphSeries<>(cobData);
|
||||||
|
cobSeries.setDrawBackground(true);
|
||||||
|
cobSeries.setBackgroundColor(0xB0FFFFFF & MainApp.sResources.getColor(R.color.cob)); //50%
|
||||||
|
cobSeries.setColor(MainApp.sResources.getColor(R.color.cob));
|
||||||
|
cobSeries.setThickness(3);
|
||||||
|
|
||||||
|
if (useForScale)
|
||||||
|
maxY = maxCobValueFound;
|
||||||
|
|
||||||
|
cobScale.setMultiplier(maxY * scale / maxCobValueFound);
|
||||||
|
|
||||||
|
addSeriesWithoutInvalidate(graph, cobSeries);
|
||||||
|
}
|
||||||
|
|
||||||
|
// scale in % of vertical size (like 0.3)
|
||||||
|
public void addDeviations(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) {
|
||||||
|
class DeviationDataPoint extends ScaledDataPoint {
|
||||||
|
public int color;
|
||||||
|
|
||||||
|
public DeviationDataPoint(double x, double y, int color, Scale scale) {
|
||||||
|
super(x, y, scale);
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BarGraphSeries<DeviationDataPoint> devSeries;
|
||||||
|
List<DeviationDataPoint> devArray = new ArrayList<>();
|
||||||
|
Double maxDevValueFound = 0d;
|
||||||
|
Scale devScale = new Scale();
|
||||||
|
|
||||||
|
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
|
||||||
|
AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
|
||||||
|
if (autosensData != null) {
|
||||||
|
int color = Color.BLACK; // "="
|
||||||
|
if (autosensData.pastSensitivity.equals("C")) color = Color.GRAY;
|
||||||
|
if (autosensData.pastSensitivity.equals("+")) color = Color.GREEN;
|
||||||
|
if (autosensData.pastSensitivity.equals("-")) color = Color.RED;
|
||||||
|
devArray.add(new DeviationDataPoint(time, autosensData.deviation, color, devScale));
|
||||||
|
maxDevValueFound = Math.max(maxDevValueFound, Math.abs(autosensData.deviation));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEVIATIONS
|
||||||
|
DeviationDataPoint[] devData = new DeviationDataPoint[devArray.size()];
|
||||||
|
devData = devArray.toArray(devData);
|
||||||
|
devSeries = new BarGraphSeries<>(devData);
|
||||||
|
devSeries.setValueDependentColor(new ValueDependentColor<DeviationDataPoint>() {
|
||||||
|
@Override
|
||||||
|
public int get(DeviationDataPoint data) {
|
||||||
|
return data.color;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (useForScale)
|
||||||
|
maxY = maxDevValueFound;
|
||||||
|
|
||||||
|
devScale.setMultiplier(maxY * scale / maxDevValueFound);
|
||||||
|
|
||||||
|
addSeriesWithoutInvalidate(graph, devSeries);
|
||||||
|
}
|
||||||
|
|
||||||
|
// scale in % of vertical size (like 0.3)
|
||||||
|
public void addRatio(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) {
|
||||||
|
LineGraphSeries<DataPoint> ratioSeries;
|
||||||
|
List<DataPoint> ratioArray = new ArrayList<>();
|
||||||
|
Double maxRatioValueFound = 0d;
|
||||||
|
Scale ratioScale = new Scale(-1d);
|
||||||
|
|
||||||
|
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
|
||||||
|
AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
|
||||||
|
if (autosensData != null) {
|
||||||
|
ratioArray.add(new DataPoint(time, autosensData.autosensRatio));
|
||||||
|
maxRatioValueFound = Math.max(maxRatioValueFound, Math.abs(autosensData.autosensRatio));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RATIOS
|
||||||
|
DataPoint[] ratioData = new DataPoint[ratioArray.size()];
|
||||||
|
ratioData = ratioArray.toArray(ratioData);
|
||||||
|
ratioSeries = new LineGraphSeries<>(ratioData);
|
||||||
|
ratioSeries.setColor(MainApp.sResources.getColor(R.color.ratio));
|
||||||
|
ratioSeries.setThickness(3);
|
||||||
|
|
||||||
|
if (useForScale)
|
||||||
|
maxY = maxRatioValueFound;
|
||||||
|
|
||||||
|
ratioScale.setMultiplier(maxY * scale / maxRatioValueFound);
|
||||||
|
|
||||||
|
addSeriesWithoutInvalidate(graph, ratioSeries);
|
||||||
|
}
|
||||||
|
|
||||||
|
// scale in % of vertical size (like 0.3)
|
||||||
|
public void addNowLine(GraphView graph, long now) {
|
||||||
|
LineGraphSeries<DataPoint> seriesNow;
|
||||||
|
DataPoint[] nowPoints = new DataPoint[]{
|
||||||
|
new DataPoint(now, 0),
|
||||||
|
new DataPoint(now, maxY)
|
||||||
|
};
|
||||||
|
|
||||||
|
seriesNow = new LineGraphSeries<>(nowPoints);
|
||||||
|
seriesNow.setDrawDataPoints(false);
|
||||||
|
// custom paint to make a dotted line
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setStyle(Paint.Style.STROKE);
|
||||||
|
paint.setStrokeWidth(2);
|
||||||
|
paint.setPathEffect(new DashPathEffect(new float[]{10, 20}, 0));
|
||||||
|
paint.setColor(Color.WHITE);
|
||||||
|
seriesNow.setCustomPaint(paint);
|
||||||
|
|
||||||
|
addSeriesWithoutInvalidate(graph, seriesNow);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void formatAxis(GraphView graph, long fromTime, long endTime) {
|
||||||
|
graph.getViewport().setMaxX(endTime);
|
||||||
|
graph.getViewport().setMinX(fromTime);
|
||||||
|
graph.getViewport().setXAxisBoundsManual(true);
|
||||||
|
graph.getGridLabelRenderer().setLabelFormatter(new TimeAsXAxisLabelFormatter("HH"));
|
||||||
|
graph.getGridLabelRenderer().setNumHorizontalLabels(7); // only 7 because of the space
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addSeriesWithoutInvalidate(GraphView bgGraph, Series s) {
|
||||||
|
if (!s.isEmpty()) {
|
||||||
|
s.onGraphViewAttached(bgGraph);
|
||||||
|
bgGraph.getSeries().add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Overview.graphExtensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 18.10.2017.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Scale {
|
||||||
|
private double multiplier;
|
||||||
|
private double shift;
|
||||||
|
|
||||||
|
public Scale() {
|
||||||
|
shift = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scale(double shift) {
|
||||||
|
this.shift = shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMultiplier(double value) {
|
||||||
|
this.multiplier = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double transform(double original) {
|
||||||
|
return original * multiplier + shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getShift() {
|
||||||
|
return shift;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package info.nightscout.androidaps.plugins.Overview.graphExtensions;
|
||||||
|
|
||||||
|
import com.jjoe64.graphview.series.DataPointInterface;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mike on 18.10.2017.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ScaledDataPoint implements DataPointInterface, Serializable {
|
||||||
|
private static final long serialVersionUID=1428263342645L;
|
||||||
|
|
||||||
|
private double x;
|
||||||
|
private double y;
|
||||||
|
|
||||||
|
private Scale scale;
|
||||||
|
|
||||||
|
public ScaledDataPoint(double x, double y, Scale scale) {
|
||||||
|
this.x=x;
|
||||||
|
this.y=y;
|
||||||
|
this.scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScaledDataPoint(Date x, double y, Scale scale) {
|
||||||
|
this.x = x.getTime();
|
||||||
|
this.y = y;
|
||||||
|
this.scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getY() {
|
||||||
|
return scale.transform(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "["+x+"/"+y+"]";
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,7 +15,7 @@ public class TimeAsXAxisLabelFormatter extends DefaultLabelFormatter {
|
||||||
|
|
||||||
protected final String mFormat;
|
protected final String mFormat;
|
||||||
|
|
||||||
public TimeAsXAxisLabelFormatter(Context context, String format) {
|
public TimeAsXAxisLabelFormatter(String format) {
|
||||||
mFormat = format;
|
mFormat = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -187,12 +187,12 @@ public class SerialIOThread extends Thread {
|
||||||
scheduledDisconnection = null;
|
scheduledDisconnection = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// prepare task for execution in 5 sec
|
// prepare task for execution in 10 sec
|
||||||
// cancel waiting task to prevent sending multiple disconnections
|
// cancel waiting task to prevent sending multiple disconnections
|
||||||
if (scheduledDisconnection != null)
|
if (scheduledDisconnection != null)
|
||||||
scheduledDisconnection.cancel(false);
|
scheduledDisconnection.cancel(false);
|
||||||
Runnable task = new DisconnectRunnable();
|
Runnable task = new DisconnectRunnable();
|
||||||
final int sec = 5;
|
final int sec = 10;
|
||||||
scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS);
|
scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||||
import info.nightscout.androidaps.events.EventPumpStatusChanged;
|
import info.nightscout.androidaps.events.EventPumpStatusChanged;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.SerialIOThread;
|
import info.nightscout.androidaps.plugins.PumpDanaR.SerialIOThread;
|
||||||
|
@ -410,12 +411,12 @@ public class DanaRExecutionService extends Service {
|
||||||
|
|
||||||
public boolean bolus(double amount, int carbs, Treatment t) {
|
public boolean bolus(double amount, int carbs, Treatment t) {
|
||||||
bolusingTreatment = t;
|
bolusingTreatment = t;
|
||||||
int speed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
||||||
MessageBase start;
|
MessageBase start;
|
||||||
if (speed == 0)
|
if (preferencesSpeed == 0)
|
||||||
start = new MsgBolusStart(amount);
|
start = new MsgBolusStart(amount);
|
||||||
else
|
else
|
||||||
start = new MsgBolusStartWithSpeed(amount, speed);
|
start = new MsgBolusStartWithSpeed(amount, preferencesSpeed);
|
||||||
MsgBolusStop stop = new MsgBolusStop(amount, t);
|
MsgBolusStop stop = new MsgBolusStop(amount, t);
|
||||||
|
|
||||||
connect("bolus");
|
connect("bolus");
|
||||||
|
@ -426,7 +427,7 @@ public class DanaRExecutionService extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables
|
MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables
|
||||||
long startTime = System.currentTimeMillis();
|
long bolusStart = System.currentTimeMillis();
|
||||||
|
|
||||||
if (!stop.stopped) {
|
if (!stop.stopped) {
|
||||||
mSerialIOThread.sendMessage(start);
|
mSerialIOThread.sendMessage(start);
|
||||||
|
@ -436,23 +437,47 @@ public class DanaRExecutionService extends Service {
|
||||||
}
|
}
|
||||||
while (!stop.stopped && !start.failed) {
|
while (!stop.stopped && !start.failed) {
|
||||||
waitMsec(100);
|
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 5 sec expecting broken comm
|
||||||
stop.stopped = true;
|
stop.stopped = true;
|
||||||
stop.forced = true;
|
stop.forced = true;
|
||||||
log.debug("Communication stopped");
|
log.debug("Communication stopped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
waitMsec(300);
|
waitMsec(300);
|
||||||
|
|
||||||
|
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
|
||||||
|
bolusingEvent.t = t;
|
||||||
|
bolusingEvent.percent = 99;
|
||||||
|
|
||||||
bolusingTreatment = null;
|
bolusingTreatment = null;
|
||||||
|
|
||||||
|
int speed = 12;
|
||||||
|
switch (preferencesSpeed) {
|
||||||
|
case 0:
|
||||||
|
speed = 12;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
speed = 30;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
speed = 60;
|
||||||
|
break;
|
||||||
|
}
|
||||||
// try to find real amount if bolusing was interrupted or comm failed
|
// try to find real amount if bolusing was interrupted or comm failed
|
||||||
if (t.insulin != amount) {
|
if (t.insulin != amount) {
|
||||||
disconnect("bolusingInterrupted");
|
disconnect("bolusingInterrupted");
|
||||||
long now = System.currentTimeMillis();
|
long bolusDurationInMSec = (long) (amount * speed * 1000);
|
||||||
long estimatedBolusEnd = (long) (startTime + amount / 5d * 60 * 1000); // std delivery rate 5 U/min
|
long expectedEnd = bolusStart + bolusDurationInMSec + 3000;
|
||||||
waitMsec(Math.max(5000, estimatedBolusEnd - now + 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);
|
||||||
|
}
|
||||||
connect("bolusingInterrupted");
|
connect("bolusingInterrupted");
|
||||||
getPumpStatus();
|
getPumpStatus();
|
||||||
if (danaRPump.lastBolusTime.getTime() > now - 60 * 1000L) { // last bolus max 1 min old
|
if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old
|
||||||
t.insulin = danaRPump.lastBolusAmount;
|
t.insulin = danaRPump.lastBolusAmount;
|
||||||
log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount);
|
log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -265,7 +265,9 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
@Override
|
@Override
|
||||||
public boolean loadHistory(byte type) {
|
public boolean loadHistory(byte type) {
|
||||||
connectIfNotConnected("loadHistory");
|
connectIfNotConnected("loadHistory");
|
||||||
return danaRSService.loadHistory(type);
|
danaRSService.loadHistory(type);
|
||||||
|
disconnect("LoadHistory");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constraints interface
|
// Constraints interface
|
||||||
|
@ -393,10 +395,12 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
if (!danaRSService.updateBasalsInPump(profile)) {
|
if (!danaRSService.updateBasalsInPump(profile)) {
|
||||||
Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT);
|
Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT);
|
||||||
MainApp.bus().post(new EventNewNotification(notification));
|
MainApp.bus().post(new EventNewNotification(notification));
|
||||||
|
disconnect("SetNewBasalProfile");
|
||||||
return FAILED;
|
return FAILED;
|
||||||
} else {
|
} else {
|
||||||
MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED));
|
MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED));
|
||||||
MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE));
|
MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE));
|
||||||
|
disconnect("SetNewBasalProfile");
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -431,6 +435,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
log.debug("Refreshing data from pump");
|
log.debug("Refreshing data from pump");
|
||||||
if (!isConnected() && !isConnecting()) {
|
if (!isConnected() && !isConnecting()) {
|
||||||
connect(reason);
|
connect(reason);
|
||||||
|
disconnect("RefreshDataFromPump");
|
||||||
} else
|
} else
|
||||||
log.debug("Already connecting ...");
|
log.debug("Already connecting ...");
|
||||||
}
|
}
|
||||||
|
@ -445,7 +450,6 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
detailedBolusInfo.insulin = configBuilderPlugin.applyBolusConstraints(detailedBolusInfo.insulin);
|
detailedBolusInfo.insulin = configBuilderPlugin.applyBolusConstraints(detailedBolusInfo.insulin);
|
||||||
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) {
|
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) {
|
||||||
DetailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
|
|
||||||
int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
||||||
int speed = 12;
|
int speed = 12;
|
||||||
switch (preferencesSpeed) {
|
switch (preferencesSpeed) {
|
||||||
|
@ -460,8 +464,8 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// v2 stores end time for bolus, we need to adjust time
|
// v2 stores end time for bolus, we need to adjust time
|
||||||
// default delivery speed is 12 U/min
|
// default delivery speed is 12 sec/U
|
||||||
detailedBolusInfo.date += detailedBolusInfo.insulin / speed * 60d * 1000;
|
detailedBolusInfo.date += detailedBolusInfo.insulin * speed * 1000;
|
||||||
// clean carbs to prevent counting them as twice because they will picked up as another record
|
// clean carbs to prevent counting them as twice because they will picked up as another record
|
||||||
// I don't think it's necessary to copy DetailedBolusInfo right now for carbs records
|
// I don't think it's necessary to copy DetailedBolusInfo right now for carbs records
|
||||||
double carbs = detailedBolusInfo.carbs;
|
double carbs = detailedBolusInfo.carbs;
|
||||||
|
@ -469,6 +473,8 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
int carbTime = detailedBolusInfo.carbTime;
|
int carbTime = detailedBolusInfo.carbTime;
|
||||||
detailedBolusInfo.carbTime = 0;
|
detailedBolusInfo.carbTime = 0;
|
||||||
|
|
||||||
|
DetailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
|
||||||
|
|
||||||
Treatment t = new Treatment();
|
Treatment t = new Treatment();
|
||||||
boolean connectionOK = false;
|
boolean connectionOK = false;
|
||||||
connectIfNotConnected("bolus");
|
connectIfNotConnected("bolus");
|
||||||
|
@ -481,7 +487,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
|
||||||
if (Config.logPumpActions)
|
if (Config.logPumpActions)
|
||||||
log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered);
|
log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered);
|
||||||
// remove carbs because it's get from history seprately
|
disconnect("DeliverTreatment");
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
PumpEnactResult result = new PumpEnactResult();
|
PumpEnactResult result = new PumpEnactResult();
|
||||||
|
@ -624,6 +630,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
result.isPercent = true;
|
result.isPercent = true;
|
||||||
if (Config.logPumpActions)
|
if (Config.logPumpActions)
|
||||||
log.debug("setTempBasalPercent: OK");
|
log.debug("setTempBasalPercent: OK");
|
||||||
|
disconnect("setTempBasalPercent");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
result.enacted = false;
|
result.enacted = false;
|
||||||
|
@ -647,6 +654,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
result.isPercent = true;
|
result.isPercent = true;
|
||||||
if (Config.logPumpActions)
|
if (Config.logPumpActions)
|
||||||
log.debug("setHighTempBasalPercent: OK");
|
log.debug("setHighTempBasalPercent: OK");
|
||||||
|
disconnect("setHighTempBasalPercent");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
result.enacted = false;
|
result.enacted = false;
|
||||||
|
@ -690,6 +698,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
result.isPercent = false;
|
result.isPercent = false;
|
||||||
if (Config.logPumpActions)
|
if (Config.logPumpActions)
|
||||||
log.debug("setExtendedBolus: OK");
|
log.debug("setExtendedBolus: OK");
|
||||||
|
disconnect("setExtendedBolus");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
result.enacted = false;
|
result.enacted = false;
|
||||||
|
@ -708,6 +717,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
danaRSService.tempBasalStop();
|
danaRSService.tempBasalStop();
|
||||||
result.enacted = true;
|
result.enacted = true;
|
||||||
result.isTempCancel = true;
|
result.isTempCancel = true;
|
||||||
|
disconnect("cancelTempBasal");
|
||||||
}
|
}
|
||||||
if (!pump.isTempBasalInProgress) {
|
if (!pump.isTempBasalInProgress) {
|
||||||
result.success = true;
|
result.success = true;
|
||||||
|
@ -734,6 +744,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
danaRSService.extendedBolusStop();
|
danaRSService.extendedBolusStop();
|
||||||
result.enacted = true;
|
result.enacted = true;
|
||||||
result.isTempCancel = true;
|
result.isTempCancel = true;
|
||||||
|
disconnect("extendedBolusStop");
|
||||||
}
|
}
|
||||||
if (!pump.isExtendedInProgress) {
|
if (!pump.isExtendedInProgress) {
|
||||||
result.success = true;
|
result.success = true;
|
||||||
|
|
|
@ -10,15 +10,14 @@ import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||||
import info.nightscout.androidaps.db.DanaRHistoryRecord;
|
|
||||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.Source;
|
import info.nightscout.androidaps.db.Source;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
|
import info.nightscout.androidaps.events.EventPumpStatusChanged;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
|
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus;
|
|
||||||
import info.nightscout.utils.DateUtil;
|
import info.nightscout.utils.DateUtil;
|
||||||
|
|
||||||
public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
|
public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
|
||||||
|
@ -32,11 +31,11 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
|
||||||
private int sec = 0;
|
private int sec = 0;
|
||||||
|
|
||||||
public boolean done;
|
public boolean done;
|
||||||
public int totalCount;
|
private int totalCount;
|
||||||
|
|
||||||
public static long lastEventTimeLoaded = 0;
|
public static long lastEventTimeLoaded = 0;
|
||||||
|
|
||||||
public DanaRS_Packet_APS_History_Events() {
|
DanaRS_Packet_APS_History_Events() {
|
||||||
super();
|
super();
|
||||||
opCode = BleCommandUtil.DANAR_PACKET__OPCODE__APS_HISTORY_EVENTS;
|
opCode = BleCommandUtil.DANAR_PACKET__OPCODE__APS_HISTORY_EVENTS;
|
||||||
done = false;
|
done = false;
|
||||||
|
@ -97,70 +96,87 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
|
||||||
|
|
||||||
DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime.getTime());
|
DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime.getTime());
|
||||||
if (detailedBolusInfo == null) {
|
if (detailedBolusInfo == null) {
|
||||||
log.debug("DetailedBolusInfo not found for " + datetime.toLocaleString());
|
log.debug("Detailed bolus info not found for " + datetime.toLocaleString());
|
||||||
detailedBolusInfo = new DetailedBolusInfo();
|
detailedBolusInfo = new DetailedBolusInfo();
|
||||||
|
} else {
|
||||||
|
log.debug("Detailed bolus info found: " + detailedBolusInfo);
|
||||||
}
|
}
|
||||||
detailedBolusInfo.date = datetime.getTime();
|
detailedBolusInfo.date = datetime.getTime();
|
||||||
detailedBolusInfo.source = Source.PUMP;
|
detailedBolusInfo.source = Source.PUMP;
|
||||||
detailedBolusInfo.pumpId = datetime.getTime();
|
detailedBolusInfo.pumpId = datetime.getTime();
|
||||||
|
|
||||||
|
String status;
|
||||||
|
|
||||||
switch (recordCode) {
|
switch (recordCode) {
|
||||||
case DanaRPump.TEMPSTART:
|
case DanaRPump.TEMPSTART:
|
||||||
log.debug("EVENT TEMPSTART (" + recordCode + ") " + datetime.toLocaleString() + " Ratio: " + param1 + "% Duration: " + param2 + "min");
|
log.debug("EVENT TEMPSTART (" + recordCode + ") " + datetime.toLocaleString() + " Ratio: " + param1 + "% Duration: " + param2 + "min");
|
||||||
temporaryBasal.percentRate = param1;
|
temporaryBasal.percentRate = param1;
|
||||||
temporaryBasal.durationInMinutes = param2;
|
temporaryBasal.durationInMinutes = param2;
|
||||||
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
||||||
|
status = "TEMPSTART " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.TEMPSTOP:
|
case DanaRPump.TEMPSTOP:
|
||||||
log.debug("EVENT TEMPSTOP (" + recordCode + ") " + datetime.toLocaleString());
|
log.debug("EVENT TEMPSTOP (" + recordCode + ") " + datetime.toLocaleString());
|
||||||
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
||||||
|
status = "TEMPSTOP " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.EXTENDEDSTART:
|
case DanaRPump.EXTENDEDSTART:
|
||||||
log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
extendedBolus.insulin = param1 / 100d;
|
extendedBolus.insulin = param1 / 100d;
|
||||||
extendedBolus.durationInMinutes = param2;
|
extendedBolus.durationInMinutes = param2;
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "EXTENDEDSTART " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.EXTENDEDSTOP:
|
case DanaRPump.EXTENDEDSTOP:
|
||||||
log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "EXTENDEDSTOP " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.BOLUS:
|
case DanaRPump.BOLUS:
|
||||||
detailedBolusInfo.insulin = param1 / 100d;
|
detailedBolusInfo.insulin = param1 / 100d;
|
||||||
boolean newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
boolean newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
||||||
log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
||||||
|
status = "BOLUS " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.DUALBOLUS:
|
case DanaRPump.DUALBOLUS:
|
||||||
detailedBolusInfo.insulin = param1 / 100d;
|
detailedBolusInfo.insulin = param1 / 100d;
|
||||||
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
||||||
log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
||||||
|
status = "DUALBOLUS " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.DUALEXTENDEDSTART:
|
case DanaRPump.DUALEXTENDEDSTART:
|
||||||
log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
extendedBolus.insulin = param1 / 100d;
|
extendedBolus.insulin = param1 / 100d;
|
||||||
extendedBolus.durationInMinutes = param2;
|
extendedBolus.durationInMinutes = param2;
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "DUALEXTENDEDSTART " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.DUALEXTENDEDSTOP:
|
case DanaRPump.DUALEXTENDEDSTOP:
|
||||||
log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "DUALEXTENDEDSTOP " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.SUSPENDON:
|
case DanaRPump.SUSPENDON:
|
||||||
log.debug("EVENT SUSPENDON (" + recordCode + ") " + datetime.toLocaleString());
|
log.debug("EVENT SUSPENDON (" + recordCode + ") " + datetime.toLocaleString());
|
||||||
|
status = "SUSPENDON " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.SUSPENDOFF:
|
case DanaRPump.SUSPENDOFF:
|
||||||
log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + datetime.toLocaleString());
|
log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + datetime.toLocaleString());
|
||||||
|
status = "SUSPENDOFF " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.REFILL:
|
case DanaRPump.REFILL:
|
||||||
log.debug("EVENT REFILL (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
log.debug("EVENT REFILL (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
||||||
|
status = "REFILL " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.PRIME:
|
case DanaRPump.PRIME:
|
||||||
log.debug("EVENT PRIME (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
log.debug("EVENT PRIME (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
||||||
|
status = "PRIME " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.PROFILECHANGE:
|
case DanaRPump.PROFILECHANGE:
|
||||||
log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
|
log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
|
||||||
|
status = "PROFILECHANGE " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.CARBS:
|
case DanaRPump.CARBS:
|
||||||
DetailedBolusInfo emptyCarbsInfo = new DetailedBolusInfo();
|
DetailedBolusInfo emptyCarbsInfo = new DetailedBolusInfo();
|
||||||
|
@ -170,17 +186,22 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
|
||||||
emptyCarbsInfo.pumpId = datetime.getTime();
|
emptyCarbsInfo.pumpId = datetime.getTime();
|
||||||
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(emptyCarbsInfo);
|
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(emptyCarbsInfo);
|
||||||
log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
|
log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
|
||||||
|
status = "CARBS " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.PRIMECANNULA:
|
case DanaRPump.PRIMECANNULA:
|
||||||
log.debug("EVENT PRIMECANNULA(" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
log.debug("EVENT PRIMECANNULA(" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
||||||
|
status = "PRIMECANNULA " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);
|
log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);
|
||||||
|
status = "UNKNOWN " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datetime.getTime() > lastEventTimeLoaded)
|
if (datetime.getTime() > lastEventTimeLoaded)
|
||||||
lastEventTimeLoaded = datetime.getTime();
|
lastEventTimeLoaded = datetime.getTime();
|
||||||
|
|
||||||
|
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.processinghistory) + ": " + status));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -4,13 +4,13 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
|
|
||||||
import com.cozmo.danar.util.BleCommandUtil;
|
import com.cozmo.danar.util.BleCommandUtil;
|
||||||
|
|
||||||
public class DanaRS_Packet_Basal_Set_Basal_Rate extends DanaRS_Packet {
|
public class DanaRS_Packet_Basal_Set_Basal_Rate extends DanaRS_Packet {
|
||||||
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Basal_Rate.class);
|
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Basal_Rate.class);
|
||||||
|
|
||||||
private double[] profileBasalRate;
|
private double[] profileBasalRate;
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Basal_Rate() {
|
public DanaRS_Packet_Basal_Set_Basal_Rate() {
|
||||||
super();
|
super();
|
||||||
|
@ -38,11 +38,12 @@ public class DanaRS_Packet_Basal_Set_Basal_Rate extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,6 @@ import com.cozmo.danar.util.BleCommandUtil;
|
||||||
public class DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal extends DanaRS_Packet {
|
public class DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal extends DanaRS_Packet {
|
||||||
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.class);
|
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.class);
|
||||||
|
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal() {
|
public DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal() {
|
||||||
super();
|
super();
|
||||||
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__CANCEL_TEMPORARY_BASAL;
|
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__CANCEL_TEMPORARY_BASAL;
|
||||||
|
@ -22,9 +20,12 @@ public class DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal extends DanaRS_Packe
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
error = byteArrayToInt(getBytes(data, DATA_START, 1));
|
int result = intFromBuff(data, 0, 1);
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ public class DanaRS_Packet_Basal_Set_Profile_Basal_Rate extends DanaRS_Packet {
|
||||||
|
|
||||||
private int profileNumber; // 0 - 4
|
private int profileNumber; // 0 - 4
|
||||||
private double[] profileBasalRate;
|
private double[] profileBasalRate;
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Profile_Basal_Rate() {
|
public DanaRS_Packet_Basal_Set_Profile_Basal_Rate() {
|
||||||
super();
|
super();
|
||||||
|
@ -41,11 +40,12 @@ public class DanaRS_Packet_Basal_Set_Profile_Basal_Rate extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ import com.cozmo.danar.util.BleCommandUtil;
|
||||||
public class DanaRS_Packet_Basal_Set_Profile_Number extends DanaRS_Packet {
|
public class DanaRS_Packet_Basal_Set_Profile_Number extends DanaRS_Packet {
|
||||||
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Profile_Number.class);
|
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Profile_Number.class);
|
||||||
private int profileNumber;
|
private int profileNumber;
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Profile_Number() {
|
public DanaRS_Packet_Basal_Set_Profile_Number() {
|
||||||
super();
|
super();
|
||||||
|
@ -33,11 +32,12 @@ public class DanaRS_Packet_Basal_Set_Profile_Number extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ import com.cozmo.danar.util.BleCommandUtil;
|
||||||
|
|
||||||
public class DanaRS_Packet_Basal_Set_Suspend_Off extends DanaRS_Packet {
|
public class DanaRS_Packet_Basal_Set_Suspend_Off extends DanaRS_Packet {
|
||||||
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Suspend_Off.class);
|
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Suspend_Off.class);
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Suspend_Off() {
|
public DanaRS_Packet_Basal_Set_Suspend_Off() {
|
||||||
super();
|
super();
|
||||||
|
@ -20,11 +19,12 @@ public class DanaRS_Packet_Basal_Set_Suspend_Off extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ import com.cozmo.danar.util.BleCommandUtil;
|
||||||
|
|
||||||
public class DanaRS_Packet_Basal_Set_Suspend_On extends DanaRS_Packet {
|
public class DanaRS_Packet_Basal_Set_Suspend_On extends DanaRS_Packet {
|
||||||
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Suspend_On.class);
|
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Suspend_On.class);
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Suspend_On() {
|
public DanaRS_Packet_Basal_Set_Suspend_On() {
|
||||||
super();
|
super();
|
||||||
|
@ -20,11 +19,12 @@ public class DanaRS_Packet_Basal_Set_Suspend_On extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ public class DanaRS_Packet_Basal_Set_Temporary_Basal extends DanaRS_Packet {
|
||||||
|
|
||||||
private int temporaryBasalRatio;
|
private int temporaryBasalRatio;
|
||||||
private int temporaryBasalDuration;
|
private int temporaryBasalDuration;
|
||||||
public int error;
|
|
||||||
|
|
||||||
public DanaRS_Packet_Basal_Set_Temporary_Basal() {
|
public DanaRS_Packet_Basal_Set_Temporary_Basal() {
|
||||||
super();
|
super();
|
||||||
|
@ -37,11 +36,12 @@ public class DanaRS_Packet_Basal_Set_Temporary_Basal extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,12 +111,12 @@ public class DanaRS_Packet_Bolus_Set_Bolus_Option extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,12 +83,12 @@ public class DanaRS_Packet_Bolus_Set_CIR_CF_Array extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,12 +44,12 @@ public class DanaRS_Packet_Bolus_Set_Dual_Bolus extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,12 +40,12 @@ public class DanaRS_Packet_Bolus_Set_Extended_Bolus extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,12 +19,12 @@ public class DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel extends DanaRS_Packet
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,12 +44,12 @@ public class DanaRS_Packet_Bolus_Set_Initial_Bolus extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,14 +48,12 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet {
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
failed = status != 0x00;
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,13 +35,14 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Stop extends DanaRS_Packet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
|
|
||||||
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
|
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
|
||||||
stopped = true;
|
stopped = true;
|
||||||
if (!forced) {
|
if (!forced) {
|
||||||
|
|
|
@ -31,12 +31,12 @@ public class DanaRS_Packet_General_Set_History_Upload_Mode extends DanaRS_Packet
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,12 +17,12 @@ public class DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear extends DanaR
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(byte[] data) {
|
public void handleMessage(byte[] data) {
|
||||||
int dataIndex = DATA_START;
|
int result = intFromBuff(data, 0, 1);
|
||||||
int dataSize = 1;
|
|
||||||
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
|
||||||
|
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + status);
|
if (result == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,10 @@ public class DanaRS_Packet_Option_Set_Pump_Time extends DanaRS_Packet {
|
||||||
int dataSize = 1;
|
int dataSize = 1;
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (error == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,10 @@ public class DanaRS_Packet_Option_Set_User_Option extends DanaRS_Packet {
|
||||||
int dataSize = 1;
|
int dataSize = 1;
|
||||||
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
|
||||||
if (Config.logDanaMessageDetail) {
|
if (Config.logDanaMessageDetail) {
|
||||||
log.debug("Result: " + error);
|
if (error == 0)
|
||||||
|
log.debug("Result OK");
|
||||||
|
else
|
||||||
|
log.error("Result Error: " + error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,19 +165,6 @@ public class BLEComm {
|
||||||
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING));
|
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING));
|
||||||
isConnecting = true;
|
isConnecting = true;
|
||||||
|
|
||||||
// Following should be removed later because we close Gatt on disconnect and this should never happen
|
|
||||||
if ((mBluetoothDeviceAddress != null) && (address.equals(mBluetoothDeviceAddress)) && (mBluetoothGatt != null)) {
|
|
||||||
log.debug("Trying to use an existing mBluetoothGatt for connection.");
|
|
||||||
sHandler.post(updateProgress);
|
|
||||||
if (mBluetoothGatt.connect()) {
|
|
||||||
setCharacteristicNotification(getUARTReadBTGattChar(), true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
sHandler.removeCallbacks(updateProgress);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// end
|
|
||||||
|
|
||||||
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
|
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
log.debug("Device not found. Unable to connect.");
|
log.debug("Device not found. Unable to connect.");
|
||||||
|
@ -201,12 +188,19 @@ public class BLEComm {
|
||||||
|
|
||||||
public void disconnect(String from) {
|
public void disconnect(String from) {
|
||||||
log.debug("disconnect from: " + from);
|
log.debug("disconnect from: " + from);
|
||||||
|
|
||||||
|
// cancel previous scheduled disconnection to prevent closing upcomming connection
|
||||||
|
if (scheduledDisconnection != null)
|
||||||
|
scheduledDisconnection.cancel(false);
|
||||||
|
scheduledDisconnection = null;
|
||||||
|
|
||||||
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
|
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setCharacteristicNotification(getUARTReadBTGattChar(), false);
|
setCharacteristicNotification(getUARTReadBTGattChar(), false);
|
||||||
mBluetoothGatt.disconnect();
|
mBluetoothGatt.disconnect();
|
||||||
isConnected = false;
|
isConnected = false;
|
||||||
|
SystemClock.sleep(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
|
@ -214,6 +208,7 @@ public class BLEComm {
|
||||||
if (mBluetoothGatt == null) {
|
if (mBluetoothGatt == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mBluetoothGatt.close();
|
mBluetoothGatt.close();
|
||||||
mBluetoothGatt = null;
|
mBluetoothGatt = null;
|
||||||
}
|
}
|
||||||
|
@ -687,18 +682,19 @@ public class BLEComm {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scheduleDisconnection() {
|
public void scheduleDisconnection() {
|
||||||
|
|
||||||
class DisconnectRunnable implements Runnable {
|
class DisconnectRunnable implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
disconnect("scheduleDisconnection");
|
disconnect("scheduleDisconnection");
|
||||||
scheduledDisconnection = null;
|
scheduledDisconnection = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// prepare task for execution in 5 sec
|
// prepare task for execution in 30 sec
|
||||||
// cancel waiting task to prevent sending multiple disconnections
|
// cancel waiting task to prevent sending multiple disconnections
|
||||||
if (scheduledDisconnection != null)
|
if (scheduledDisconnection != null)
|
||||||
scheduledDisconnection.cancel(false);
|
scheduledDisconnection.cancel(false);
|
||||||
Runnable task = new DisconnectRunnable();
|
Runnable task = new DisconnectRunnable();
|
||||||
final int sec = 5;
|
final int sec = 30;
|
||||||
scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS);
|
scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS);
|
||||||
log.debug("Disconnection scheduled");
|
log.debug("Disconnection scheduled");
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import info.nightscout.androidaps.events.EventInitializationChanged;
|
||||||
import info.nightscout.androidaps.events.EventPumpStatusChanged;
|
import info.nightscout.androidaps.events.EventPumpStatusChanged;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Notification;
|
import info.nightscout.androidaps.plugins.Overview.Notification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
|
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
|
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
|
||||||
|
@ -188,16 +189,16 @@ public class DanaRSService extends Service {
|
||||||
while (!msg.done && bleComm.isConnected()) {
|
while (!msg.done && bleComm.isConnected()) {
|
||||||
SystemClock.sleep(100);
|
SystemClock.sleep(100);
|
||||||
}
|
}
|
||||||
SystemClock.sleep(200);
|
|
||||||
lastHistoryFetched = DanaRS_Packet_APS_History_Events.lastEventTimeLoaded;
|
lastHistoryFetched = DanaRS_Packet_APS_History_Events.lastEventTimeLoaded;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean bolus(double insulin, int carbs, long carbtime, Treatment t) {
|
public boolean bolus(final double insulin, int carbs, long carbtime, Treatment t) {
|
||||||
|
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus)));
|
||||||
bolusingTreatment = t;
|
bolusingTreatment = t;
|
||||||
int speed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
||||||
DanaRS_Packet_Bolus_Set_Step_Bolus_Start start = new DanaRS_Packet_Bolus_Set_Step_Bolus_Start(insulin, speed);
|
DanaRS_Packet_Bolus_Set_Step_Bolus_Start start = new DanaRS_Packet_Bolus_Set_Step_Bolus_Start(insulin, preferencesSpeed);
|
||||||
DanaRS_Packet_Bolus_Set_Step_Bolus_Stop stop = new DanaRS_Packet_Bolus_Set_Step_Bolus_Stop(insulin, t); // initialize static variables
|
DanaRS_Packet_Bolus_Set_Step_Bolus_Stop stop = new DanaRS_Packet_Bolus_Set_Step_Bolus_Stop(insulin, t); // initialize static variables
|
||||||
DanaRS_Packet_Notify_Delivery_Complete complete = new DanaRS_Packet_Notify_Delivery_Complete(insulin, t); // initialize static variables
|
DanaRS_Packet_Notify_Delivery_Complete complete = new DanaRS_Packet_Notify_Delivery_Complete(insulin, t); // initialize static variables
|
||||||
|
|
||||||
|
@ -210,28 +211,57 @@ public class DanaRSService extends Service {
|
||||||
bleComm.sendMessage(msgSetHistoryEntry_v2);
|
bleComm.sendMessage(msgSetHistoryEntry_v2);
|
||||||
lastHistoryFetched = carbtime - 60000;
|
lastHistoryFetched = carbtime - 60000;
|
||||||
}
|
}
|
||||||
if (insulin > 0) {
|
|
||||||
DanaRS_Packet_Notify_Delivery_Rate_Display progress = new DanaRS_Packet_Notify_Delivery_Rate_Display(insulin, t); // initialize static variables
|
|
||||||
|
|
||||||
|
final long bolusStart = System.currentTimeMillis();
|
||||||
|
if (insulin > 0) {
|
||||||
if (!stop.stopped) {
|
if (!stop.stopped) {
|
||||||
bleComm.sendMessage(start);
|
bleComm.sendMessage(start);
|
||||||
} else {
|
} else {
|
||||||
t.insulin = 0d;
|
t.insulin = 0d;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
DanaRS_Packet_Notify_Delivery_Rate_Display progress = new DanaRS_Packet_Notify_Delivery_Rate_Display(insulin, t); // initialize static variables
|
||||||
|
|
||||||
while (!stop.stopped && !start.failed && !complete.done) {
|
while (!stop.stopped && !start.failed && !complete.done) {
|
||||||
SystemClock.sleep(100);
|
SystemClock.sleep(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 20 sec expecting broken comm
|
||||||
stop.stopped = true;
|
stop.stopped = true;
|
||||||
stop.forced = true;
|
stop.forced = true;
|
||||||
log.debug("Communication stopped");
|
log.debug("Communication stopped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SystemClock.sleep(3000);
|
|
||||||
|
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
|
||||||
|
bolusingEvent.t = t;
|
||||||
|
bolusingEvent.percent = 99;
|
||||||
|
|
||||||
bolusingTreatment = null;
|
bolusingTreatment = null;
|
||||||
DanaRSPlugin.connectIfNotConnected("ReadHistoryAfterBolus");
|
int speed = 12;
|
||||||
|
switch (preferencesSpeed) {
|
||||||
|
case 0:
|
||||||
|
speed = 12;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
speed = 30;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
speed = 60;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
long bolusDurationInMSec = (long) (insulin * speed * 1000);
|
||||||
|
long expectedEnd = bolusStart + bolusDurationInMSec + 2000;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
if (!(isConnected()))
|
||||||
|
DanaRSPlugin.getPlugin().connect("loadEvents");
|
||||||
loadEvents();
|
loadEvents();
|
||||||
|
bolusingEvent.percent = 100;
|
||||||
|
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -293,9 +293,8 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
ConfigBuilderPlugin configBuilderPlugin = MainApp.getConfigBuilder();
|
||||||
detailedBolusInfo.insulin = configBuilderPlugin.applyBolusConstraints(detailedBolusInfo.insulin);
|
detailedBolusInfo.insulin = configBuilderPlugin.applyBolusConstraints(detailedBolusInfo.insulin);
|
||||||
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) {
|
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) {
|
||||||
DetailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
|
|
||||||
// v2 stores end time for bolus, we need to adjust time
|
// v2 stores end time for bolus, we need to adjust time
|
||||||
// default delivery speed is 12 U/min
|
// default delivery speed is 12 sec/U
|
||||||
int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
||||||
int speed = 12;
|
int speed = 12;
|
||||||
switch (preferencesSpeed) {
|
switch (preferencesSpeed) {
|
||||||
|
@ -309,7 +308,7 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
speed = 60;
|
speed = 60;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
detailedBolusInfo.date += detailedBolusInfo.insulin / speed * 60d * 1000;
|
detailedBolusInfo.date += speed * detailedBolusInfo.insulin * 1000;
|
||||||
// clean carbs to prevent counting them as twice because they will picked up as another record
|
// clean carbs to prevent counting them as twice because they will picked up as another record
|
||||||
// I don't think it's necessary to copy DetailedBolusInfo right now for carbs records
|
// I don't think it's necessary to copy DetailedBolusInfo right now for carbs records
|
||||||
double carbs = detailedBolusInfo.carbs;
|
double carbs = detailedBolusInfo.carbs;
|
||||||
|
@ -317,6 +316,8 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
int carbTime = detailedBolusInfo.carbTime;
|
int carbTime = detailedBolusInfo.carbTime;
|
||||||
detailedBolusInfo.carbTime = 0;
|
detailedBolusInfo.carbTime = 0;
|
||||||
|
|
||||||
|
DetailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
|
||||||
|
|
||||||
Treatment t = new Treatment();
|
Treatment t = new Treatment();
|
||||||
boolean connectionOK = false;
|
boolean connectionOK = false;
|
||||||
if (detailedBolusInfo.insulin > 0 || carbs > 0)
|
if (detailedBolusInfo.insulin > 0 || carbs > 0)
|
||||||
|
|
|
@ -188,12 +188,12 @@ public class SerialIOThread extends Thread {
|
||||||
scheduledDisconnection = null;
|
scheduledDisconnection = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// prepare task for execution in 5 sec
|
// prepare task for execution in 10 sec
|
||||||
// cancel waiting task to prevent sending multiple disconnections
|
// cancel waiting task to prevent sending multiple disconnections
|
||||||
if (scheduledDisconnection != null)
|
if (scheduledDisconnection != null)
|
||||||
scheduledDisconnection.cancel(false);
|
scheduledDisconnection.cancel(false);
|
||||||
Runnable task = new DisconnectRunnable();
|
Runnable task = new DisconnectRunnable();
|
||||||
final int sec = 5;
|
final int sec = 10;
|
||||||
scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS);
|
scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,16 @@ import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
|
import info.nightscout.androidaps.R;
|
||||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.Source;
|
import info.nightscout.androidaps.db.Source;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
|
import info.nightscout.androidaps.events.EventPumpStatusChanged;
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
|
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
|
||||||
|
import info.nightscout.utils.DateUtil;
|
||||||
|
|
||||||
public class MsgHistoryEvents_v2 extends MessageBase {
|
public class MsgHistoryEvents_v2 extends MessageBase {
|
||||||
private static Logger log = LoggerFactory.getLogger(MsgHistoryEvents_v2.class);
|
private static Logger log = LoggerFactory.getLogger(MsgHistoryEvents_v2.class);
|
||||||
|
@ -65,70 +68,87 @@ public class MsgHistoryEvents_v2 extends MessageBase {
|
||||||
|
|
||||||
DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime.getTime());
|
DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime.getTime());
|
||||||
if (detailedBolusInfo == null) {
|
if (detailedBolusInfo == null) {
|
||||||
log.debug("DetailedBolusInfo not found for " + datetime.toLocaleString());
|
log.debug("Detailed bolus info not found for " + datetime.toLocaleString());
|
||||||
detailedBolusInfo = new DetailedBolusInfo();
|
detailedBolusInfo = new DetailedBolusInfo();
|
||||||
|
} else {
|
||||||
|
log.debug("Detailed bolus info found: " + detailedBolusInfo);
|
||||||
}
|
}
|
||||||
detailedBolusInfo.date = datetime.getTime();
|
detailedBolusInfo.date = datetime.getTime();
|
||||||
detailedBolusInfo.source = Source.PUMP;
|
detailedBolusInfo.source = Source.PUMP;
|
||||||
detailedBolusInfo.pumpId = datetime.getTime();
|
detailedBolusInfo.pumpId = datetime.getTime();
|
||||||
|
|
||||||
|
String status = "";
|
||||||
|
|
||||||
switch (recordCode) {
|
switch (recordCode) {
|
||||||
case DanaRPump.TEMPSTART:
|
case DanaRPump.TEMPSTART:
|
||||||
log.debug("EVENT TEMPSTART (" + recordCode + ") " + datetime.toLocaleString() + " Ratio: " + param1 + "% Duration: " + param2 + "min");
|
log.debug("EVENT TEMPSTART (" + recordCode + ") " + datetime.toLocaleString() + " Ratio: " + param1 + "% Duration: " + param2 + "min");
|
||||||
temporaryBasal.percentRate = param1;
|
temporaryBasal.percentRate = param1;
|
||||||
temporaryBasal.durationInMinutes = param2;
|
temporaryBasal.durationInMinutes = param2;
|
||||||
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
||||||
|
status = "TEMPSTART " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.TEMPSTOP:
|
case DanaRPump.TEMPSTOP:
|
||||||
log.debug("EVENT TEMPSTOP (" + recordCode + ") " + datetime.toLocaleString());
|
log.debug("EVENT TEMPSTOP (" + recordCode + ") " + datetime.toLocaleString());
|
||||||
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
MainApp.getConfigBuilder().addToHistoryTempBasal(temporaryBasal);
|
||||||
|
status = "TEMPSTOP " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.EXTENDEDSTART:
|
case DanaRPump.EXTENDEDSTART:
|
||||||
log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
extendedBolus.insulin = param1 / 100d;
|
extendedBolus.insulin = param1 / 100d;
|
||||||
extendedBolus.durationInMinutes = param2;
|
extendedBolus.durationInMinutes = param2;
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "EXTENDEDSTART " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.EXTENDEDSTOP:
|
case DanaRPump.EXTENDEDSTOP:
|
||||||
log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "EXTENDEDSTOP " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.BOLUS:
|
case DanaRPump.BOLUS:
|
||||||
detailedBolusInfo.insulin = param1 / 100d;
|
detailedBolusInfo.insulin = param1 / 100d;
|
||||||
boolean newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
boolean newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
||||||
log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
||||||
|
status = "BOLUS " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.DUALBOLUS:
|
case DanaRPump.DUALBOLUS:
|
||||||
detailedBolusInfo.insulin = param1 / 100d;
|
detailedBolusInfo.insulin = param1 / 100d;
|
||||||
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
|
||||||
log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
|
||||||
|
status = "DUALBOLUS " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.DUALEXTENDEDSTART:
|
case DanaRPump.DUALEXTENDEDSTART:
|
||||||
log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
|
||||||
extendedBolus.insulin = param1 / 100d;
|
extendedBolus.insulin = param1 / 100d;
|
||||||
extendedBolus.durationInMinutes = param2;
|
extendedBolus.durationInMinutes = param2;
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "DUALEXTENDEDSTART " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.DUALEXTENDEDSTOP:
|
case DanaRPump.DUALEXTENDEDSTOP:
|
||||||
log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
|
||||||
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
MainApp.getConfigBuilder().addToHistoryExtendedBolus(extendedBolus);
|
||||||
|
status = "DUALEXTENDEDSTOP " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.SUSPENDON:
|
case DanaRPump.SUSPENDON:
|
||||||
log.debug("EVENT SUSPENDON (" + recordCode + ") " + datetime.toLocaleString());
|
log.debug("EVENT SUSPENDON (" + recordCode + ") " + datetime.toLocaleString());
|
||||||
|
status = "SUSPENDON " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.SUSPENDOFF:
|
case DanaRPump.SUSPENDOFF:
|
||||||
log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + datetime.toLocaleString());
|
log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + datetime.toLocaleString());
|
||||||
|
status = "SUSPENDOFF " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.REFILL:
|
case DanaRPump.REFILL:
|
||||||
log.debug("EVENT REFILL (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
log.debug("EVENT REFILL (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
||||||
|
status = "REFILL " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.PRIME:
|
case DanaRPump.PRIME:
|
||||||
log.debug("EVENT PRIME (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
log.debug("EVENT PRIME (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
|
||||||
|
status = "PRIME " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.PROFILECHANGE:
|
case DanaRPump.PROFILECHANGE:
|
||||||
log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
|
log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
|
||||||
|
status = "PROFILECHANGE " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
case DanaRPump.CARBS:
|
case DanaRPump.CARBS:
|
||||||
DetailedBolusInfo emptyCarbsInfo = new DetailedBolusInfo();
|
DetailedBolusInfo emptyCarbsInfo = new DetailedBolusInfo();
|
||||||
|
@ -138,14 +158,17 @@ public class MsgHistoryEvents_v2 extends MessageBase {
|
||||||
emptyCarbsInfo.pumpId = datetime.getTime();
|
emptyCarbsInfo.pumpId = datetime.getTime();
|
||||||
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(emptyCarbsInfo);
|
newRecord = MainApp.getConfigBuilder().addToHistoryTreatment(emptyCarbsInfo);
|
||||||
log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
|
log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
|
||||||
|
status = "CARBS " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);
|
log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);
|
||||||
|
status = "UNKNOWN " + DateUtil.timeString(datetime);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datetime.getTime() > lastEventTimeLoaded)
|
if (datetime.getTime() > lastEventTimeLoaded)
|
||||||
lastEventTimeLoaded = datetime.getTime();
|
lastEventTimeLoaded = datetime.getTime();
|
||||||
|
|
||||||
|
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.processinghistory) + ": " + status));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
import info.nightscout.androidaps.plugins.Overview.Notification;
|
import info.nightscout.androidaps.plugins.Overview.Notification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||||
|
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.comm.*;
|
import info.nightscout.androidaps.plugins.PumpDanaR.comm.*;
|
||||||
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
|
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
|
||||||
|
@ -400,14 +401,15 @@ public class DanaRv2ExecutionService extends Service {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean bolus(double amount, int carbs, long carbtime, Treatment t) {
|
public boolean bolus(final double amount, int carbs, long carbtime, Treatment t) {
|
||||||
|
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus)));
|
||||||
bolusingTreatment = t;
|
bolusingTreatment = t;
|
||||||
int speed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0);
|
||||||
MessageBase start;
|
MessageBase start;
|
||||||
if (speed == 0)
|
if (preferencesSpeed == 0)
|
||||||
start = new MsgBolusStart(amount);
|
start = new MsgBolusStart(amount);
|
||||||
else
|
else
|
||||||
start = new MsgBolusStartWithSpeed(amount, speed);
|
start = new MsgBolusStartWithSpeed(amount, preferencesSpeed);
|
||||||
MsgBolusStop stop = new MsgBolusStop(amount, t);
|
MsgBolusStop stop = new MsgBolusStop(amount, t);
|
||||||
|
|
||||||
connect("bolus");
|
connect("bolus");
|
||||||
|
@ -420,6 +422,8 @@ public class DanaRv2ExecutionService extends Service {
|
||||||
mSerialIOThread.sendMessage(msgSetHistoryEntry_v2);
|
mSerialIOThread.sendMessage(msgSetHistoryEntry_v2);
|
||||||
lastHistoryFetched = carbtime - 60000;
|
lastHistoryFetched = carbtime - 60000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final long bolusStart = System.currentTimeMillis();
|
||||||
if (amount > 0) {
|
if (amount > 0) {
|
||||||
MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables
|
MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables
|
||||||
|
|
||||||
|
@ -431,24 +435,44 @@ public class DanaRv2ExecutionService extends Service {
|
||||||
}
|
}
|
||||||
while (!stop.stopped && !start.failed) {
|
while (!stop.stopped && !start.failed) {
|
||||||
waitMsec(100);
|
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 5 sec expecting broken comm
|
||||||
stop.stopped = true;
|
stop.stopped = true;
|
||||||
stop.forced = true;
|
stop.forced = true;
|
||||||
log.debug("Communication stopped");
|
log.debug("Communication stopped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
|
||||||
|
bolusingEvent.t = t;
|
||||||
|
bolusingEvent.percent = 99;
|
||||||
|
|
||||||
bolusingTreatment = null;
|
bolusingTreatment = null;
|
||||||
// run loading history in separate thread and allow bolus dialog to be closed
|
int speed = 12;
|
||||||
new Thread(new Runnable() {
|
switch (preferencesSpeed) {
|
||||||
@Override
|
case 0:
|
||||||
public void run() {
|
speed = 12;
|
||||||
waitMsec(4000);
|
break;
|
||||||
|
case 1:
|
||||||
|
speed = 30;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
speed = 60;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
long bolusDurationInMSec = (long) (amount * speed * 1000);
|
||||||
|
long expectedEnd = bolusStart + bolusDurationInMSec + 2000;
|
||||||
|
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);
|
||||||
|
}
|
||||||
if (!(isConnected()))
|
if (!(isConnected()))
|
||||||
connect("loadEvents");
|
connect("loadEvents");
|
||||||
loadEvents();
|
loadEvents();
|
||||||
}
|
bolusingEvent.percent = 100;
|
||||||
}).start();
|
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,9 @@ import android.support.v4.util.LongSparseArray;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.R;
|
import info.nightscout.androidaps.R;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
|
@ -32,7 +30,7 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
|
||||||
private boolean fragmentEnabled = true;
|
private boolean fragmentEnabled = true;
|
||||||
private boolean fragmentVisible = false;
|
private boolean fragmentVisible = false;
|
||||||
|
|
||||||
static SensitivityWeightedAveragePlugin plugin = null;
|
private static SensitivityWeightedAveragePlugin plugin = null;
|
||||||
|
|
||||||
public static SensitivityWeightedAveragePlugin getPlugin() {
|
public static SensitivityWeightedAveragePlugin getPlugin() {
|
||||||
if (plugin == null)
|
if (plugin == null)
|
||||||
|
@ -108,12 +106,14 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
|
||||||
int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours);
|
int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours);
|
||||||
|
|
||||||
if (autosensDataTable == null || autosensDataTable.size() < 4) {
|
if (autosensDataTable == null || autosensDataTable.size() < 4) {
|
||||||
|
if (Config.logAutosensData)
|
||||||
log.debug("No autosens data available");
|
log.debug("No autosens data available");
|
||||||
return new AutosensResult();
|
return new AutosensResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
AutosensData current = IobCobCalculatorPlugin.getAutosensData(toTime);
|
AutosensData current = IobCobCalculatorPlugin.getAutosensData(toTime);
|
||||||
if (current == null) {
|
if (current == null) {
|
||||||
|
if (Config.logAutosensData)
|
||||||
log.debug("No autosens data available");
|
log.debug("No autosens data available");
|
||||||
return new AutosensResult();
|
return new AutosensResult();
|
||||||
}
|
}
|
||||||
|
@ -181,8 +181,9 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
|
||||||
double sens = profile.getIsf();
|
double sens = profile.getIsf();
|
||||||
|
|
||||||
String ratioLimit = "";
|
String ratioLimit = "";
|
||||||
String sensResult = "";
|
String sensResult;
|
||||||
|
|
||||||
|
if (Config.logAutosensData)
|
||||||
log.debug("Records: " + index + " " + pastSensitivity);
|
log.debug("Records: " + index + " " + pastSensitivity);
|
||||||
|
|
||||||
double average = weightedsum / weights;
|
double average = weightedsum / weights;
|
||||||
|
@ -197,6 +198,7 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
|
||||||
sensResult = "Sensitivity normal";
|
sensResult = "Sensitivity normal";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Config.logAutosensData)
|
||||||
log.debug(sensResult);
|
log.debug(sensResult);
|
||||||
|
|
||||||
double rawRatio = ratio;
|
double rawRatio = ratio;
|
||||||
|
@ -205,9 +207,11 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
|
||||||
|
|
||||||
if (ratio != rawRatio) {
|
if (ratio != rawRatio) {
|
||||||
ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio;
|
ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio;
|
||||||
|
if (Config.logAutosensData)
|
||||||
log.debug(ratioLimit);
|
log.debug(ratioLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Config.logAutosensData)
|
||||||
log.debug("Sensitivity to: " + new Date(toTime).toLocaleString() + " weightedaverage: " + average + " ratio: " + ratio);
|
log.debug("Sensitivity to: " + new Date(toTime).toLocaleString() + " weightedaverage: " + average + " ratio: " + ratio);
|
||||||
|
|
||||||
AutosensResult output = new AutosensResult();
|
AutosensResult output = new AutosensResult();
|
||||||
|
|
|
@ -395,4 +395,23 @@ public class NSUpload {
|
||||||
DbLogger.dbAdd(intent, data.toString());
|
DbLogger.dbAdd(intent, data.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void removeFoodFromNS(String _id) {
|
||||||
|
try {
|
||||||
|
Context context = MainApp.instance().getApplicationContext();
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putString("action", "dbRemove");
|
||||||
|
bundle.putString("collection", "food");
|
||||||
|
bundle.putString("_id", _id);
|
||||||
|
Intent intent = new Intent(Intents.ACTION_DATABASE);
|
||||||
|
intent.putExtras(bundle);
|
||||||
|
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
|
||||||
|
context.sendBroadcast(intent);
|
||||||
|
DbLogger.dbRemove(intent, _id);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Unhandled exception", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
90
app/src/main/res/layout/food_fragment.xml
Normal file
90
app/src/main/res/layout/food_fragment.xml
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsExtendedBolusesFragment">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/foodSearchImage"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
app:srcCompat="@android:drawable/ic_menu_search"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/food_filter"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:ems="10"
|
||||||
|
android:inputType="text"
|
||||||
|
android:text="" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/food_clearfilter"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
app:srcCompat="@android:drawable/ic_menu_close_clear_cancel" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Category" />
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/food_category"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="right"
|
||||||
|
android:minWidth="100dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Subcategory" />
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/food_subcategory"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="right"
|
||||||
|
android:minWidth="100dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
|
android:id="@+id/food_recyclerview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
</android.support.v7.widget.RecyclerView>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</FrameLayout>
|
100
app/src/main/res/layout/food_item.xml
Normal file
100
app/src/main/res/layout/food_item.xml
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/food_cardview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
card_view:cardBackgroundColor="@color/cardColorBackground"
|
||||||
|
card_view:cardCornerRadius="6dp"
|
||||||
|
card_view:cardUseCompatPadding="true"
|
||||||
|
card_view:contentPadding="6dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:inputType="textMultiLine|textNoSuggestions"
|
||||||
|
android:text="Name"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_portion"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="end"
|
||||||
|
android:text="Portion" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_carbs"
|
||||||
|
android:layout_width="50dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="end"
|
||||||
|
android:text="Carbs" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="end"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_fat"
|
||||||
|
android:layout_width="70dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="end"
|
||||||
|
android:text="Fat" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_protein"
|
||||||
|
android:layout_width="70dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="end"
|
||||||
|
android:text="Protein" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_energy"
|
||||||
|
android:layout_width="70dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="end"
|
||||||
|
android:text="Energy" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/ns_sign"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:width="30dp"
|
||||||
|
android:text="NS"
|
||||||
|
android:textAlignment="viewEnd"
|
||||||
|
android:textColor="@color/colorSetTempButton" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/food_remove"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingEnd="5dp"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:text="@string/overview_quickwizard_item_remove_button"
|
||||||
|
android:textAlignment="viewEnd"
|
||||||
|
android:textColor="@android:color/holo_orange_light" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</android.support.v7.widget.CardView>
|
|
@ -650,7 +650,7 @@
|
||||||
<string name="activity_duration">време за физ. активност</string>
|
<string name="activity_duration">време за физ. активност</string>
|
||||||
<string name="activity_target">Целева КЗ при физ. активност</string>
|
<string name="activity_target">Целева КЗ при физ. активност</string>
|
||||||
<string name="bolusspeed">Скорост на болус</string>
|
<string name="bolusspeed">Скорост на болус</string>
|
||||||
<string name="careportal_newnstreatment_percentage_label">% на изменение</string>
|
<string name="careportal_newnstreatment_percentage_label">% от профила</string>
|
||||||
<string name="careportal_newnstreatment_timeshift_label">Време на отместване</string>
|
<string name="careportal_newnstreatment_timeshift_label">Време на отместване</string>
|
||||||
<string name="danars_nodeviceavailable">Все още устройството не е намерено</string>
|
<string name="danars_nodeviceavailable">Все още устройството не е намерено</string>
|
||||||
<string name="danarspump">DanaRS</string>
|
<string name="danarspump">DanaRS</string>
|
||||||
|
@ -668,7 +668,7 @@
|
||||||
<string name="pairingok">Сдвоени</string>
|
<string name="pairingok">Сдвоени</string>
|
||||||
<string name="pairingtimedout">Времето за сдвояване изтече</string>
|
<string name="pairingtimedout">Времето за сдвояване изтече</string>
|
||||||
<string name="pairpump">Сдвояване с нова помпа</string>
|
<string name="pairpump">Сдвояване с нова помпа</string>
|
||||||
<string name="reuse">опитва отново</string>
|
<string name="reuse">отново</string>
|
||||||
<string name="selectedpump">Избрана помпа</string>
|
<string name="selectedpump">Избрана помпа</string>
|
||||||
<string name="serialnumber">Сериен номер</string>
|
<string name="serialnumber">Сериен номер</string>
|
||||||
<string name="treatments_wizard_tt_label">ЛЕЧ</string>
|
<string name="treatments_wizard_tt_label">ЛЕЧ</string>
|
||||||
|
|
|
@ -49,9 +49,9 @@
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="danaSpeedArray">
|
<string-array name="danaSpeedArray">
|
||||||
<item>12s 1U</item>
|
<item>12 s/U</item>
|
||||||
<item>30s 1U</item>
|
<item>30 s/U</item>
|
||||||
<item>60s 1U</item>
|
<item>60 s/U</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="danaSpeedValues">
|
<string-array name="danaSpeedValues">
|
||||||
<item>0</item>
|
<item>0</item>
|
||||||
|
|
|
@ -754,6 +754,16 @@
|
||||||
<string name="wearcontrol_title">Controls from Watch</string>
|
<string name="wearcontrol_title">Controls from Watch</string>
|
||||||
<string name="wearcontrol_summary">Set Temp-Targets and enter Treatments from the watch.</string>
|
<string name="wearcontrol_summary">Set Temp-Targets and enter Treatments from the watch.</string>
|
||||||
<string name="connectiontimedout">Connection timed out</string>
|
<string name="connectiontimedout">Connection timed out</string>
|
||||||
|
<string name="food">Food</string>
|
||||||
|
<string name="shortgramm">g</string>
|
||||||
|
<string name="none"><![CDATA[<none>]]></string>
|
||||||
|
<string name="shortkilojoul">kJ</string>
|
||||||
|
<string name="shortenergy">En</string>
|
||||||
|
<string name="shortprotein">Pr</string>
|
||||||
|
<string name="shortfat">Fat</string>
|
||||||
<string name="active"><![CDATA[<Active>]]></string>
|
<string name="active"><![CDATA[<Active>]]></string>
|
||||||
|
<string name="waitingforestimatedbolusend" formatted="false">Waiting for estimated bolus end. Remaining %d sec.</string>
|
||||||
|
<string name="processinghistory">Processing event</string>
|
||||||
|
<string name="startingbolus">Starting bolus delivery</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue