AndroidAPS/app/src/main/java/info/nightscout/androidaps/db/Treatment.java

186 lines
6 KiB
Java
Raw Normal View History

2016-06-05 01:40:35 +02:00
package info.nightscout.androidaps.db;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.List;
2016-06-05 14:53:03 +02:00
import info.nightscout.androidaps.data.Iob;
2016-06-05 01:40:35 +02:00
import info.nightscout.client.broadcasts.Intents;
import info.nightscout.androidaps.MainApp;
2016-06-05 14:53:03 +02:00
import info.nightscout.client.data.NSProfile;
2016-06-05 01:40:35 +02:00
import info.nightscout.utils.DateUtil;
@DatabaseTable(tableName = "Treatments")
public class Treatment {
private static Logger log = LoggerFactory.getLogger(Treatment.class);
public long getTimeIndex() {
return (long) Math.ceil(created_at.getTime() / 60000d);
}
public void setTimeIndex(long timeIndex) {
this.timeIndex = timeIndex;
}
@DatabaseField(id = true, useGetSet = true)
public long timeIndex;
@DatabaseField
public String _id;
@DatabaseField
public Date created_at;
@DatabaseField
public Double insulin;
@DatabaseField
public Double carbs;
public void copyFrom(Treatment t) {
this._id = t._id;
this.created_at = t.created_at;
this.insulin = t.insulin;
this.carbs = t.carbs;
}
2016-06-05 14:53:03 +02:00
public Iob iobCalc(Date time) {
2016-06-06 10:42:46 +02:00
Iob resultNow = doIobCalc(time);
Iob resultIn5min = doIobCalc(new Date(time.getTime() + 5 * 60 * 1000));
resultNow.activityContrib = resultNow.iobContrib - resultIn5min.iobContrib;
return resultNow;
}
public Iob doIobCalc(Date time) {
2016-06-05 14:53:03 +02:00
Iob result = new Iob();
NSProfile profile = MainApp.getNSProfile();
if (profile == null) {
return result;
}
Double dia = profile.getDia();
Double sens = profile.getIsf(profile.secondsFromMidnight(time));
Double scaleFactor = 3.0 / dia;
2016-06-05 01:40:35 +02:00
Double peak = 75d;
Double end = 180d;
2016-06-05 14:53:03 +02:00
if (this.insulin != 0d) {
Long bolusTime = this.created_at.getTime();
Double minAgo = scaleFactor * (time.getTime() - bolusTime) / 1000d / 60d;
2016-06-05 01:40:35 +02:00
if (minAgo < peak) {
2016-06-06 10:42:46 +02:00
Double x1 = minAgo / 5d + 1;
2016-06-05 14:53:03 +02:00
result.iobContrib = this.insulin * (1 - 0.001852 * x1 * x1 + 0.001852 * x1);
// units: BG (mg/dL) = (BG/U) * U insulin * scalar
2016-06-06 11:24:17 +02:00
result.activityContrib = this.insulin * (2 / dia / 60 / peak) * minAgo;
2016-06-05 14:53:03 +02:00
2016-06-05 01:40:35 +02:00
} else if (minAgo < end) {
2016-06-05 14:53:03 +02:00
Double x2 = (minAgo - 75) / 5;
result.iobContrib = this.insulin * (0.001323 * x2 * x2 - 0.054233 * x2 + 0.55556);
2016-06-06 11:24:17 +02:00
result.activityContrib = this.insulin * (2 / dia / 60 - (minAgo - peak) * 2 / dia / 60 / (60 * dia - peak));
2016-06-05 01:40:35 +02:00
}
}
2016-06-05 14:53:03 +02:00
return result;
2016-06-05 01:40:35 +02:00
}
2016-06-05 14:53:03 +02:00
/*
2016-06-05 01:40:35 +02:00
public Iob calcIobOpenAPS() {
IobCalc calc = new IobCalc(created_at,insulin,new Date());
calc.setBolusDiaTimesTwo();
Iob iob = calc.invoke();
return iob;
}
public Iob calcIob() {
IobCalc calc = new IobCalc(created_at,insulin,new Date());
Iob iob = calc.invoke();
return iob;
}
*/
public long getMillisecondsFromStart() {
return new Date().getTime() - created_at.getTime();
}
public String log() {
return "Treatment{" +
"timeIndex: " + timeIndex +
", _id: " + _id +
", insulin: " + insulin +
", carbs: " + carbs +
", created_at: " +
"}";
}
public void sendToNSClient() {
Context context = MainApp.instance().getApplicationContext();
Bundle bundle = new Bundle();
bundle.putString("action", "dbAdd");
bundle.putString("collection", "treatments");
JSONObject data = new JSONObject();
try {
data.put("eventType", "Meal Bolus");
if (insulin != 0d) data.put("insulin", insulin);
if (carbs != 0d) data.put("carbs", carbs.intValue());
data.put("created_at", DateUtil.toISOString(created_at));
data.put("timeIndex", timeIndex);
} catch (JSONException e) {
e.printStackTrace();
}
bundle.putString("data", data.toString());
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(intent);
List<ResolveInfo> q = context.getPackageManager().queryBroadcastReceivers(intent, 0);
if (q.size() < 1) {
log.error("DBADD No receivers");
} else log.debug("DBADD dbAdd " + q.size() + " receivers " + data.toString());
}
public void updateToNSClient() {
Context context = MainApp.instance().getApplicationContext();
Bundle bundle = new Bundle();
bundle.putString("action", "dbUpdate");
bundle.putString("collection", "treatments");
JSONObject data = new JSONObject();
try {
data.put("eventType", "Meal Bolus");
data.put("insulin", insulin);
data.put("carbs", carbs.intValue());
data.put("created_at", DateUtil.toISOString(created_at));
data.put("timeIndex", timeIndex);
} catch (JSONException e) {
e.printStackTrace();
}
bundle.putString("data", data.toString());
bundle.putString("_id", _id);
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(intent);
List<ResolveInfo> q = context.getPackageManager().queryBroadcastReceivers(intent, 0);
if (q.size() < 1) {
log.error("DBUPDATE No receivers");
} else log.debug("DBUPDATE dbUpdate " + q.size() + " receivers " + _id + " " + data.toString());
}
}