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

302 lines
8.4 KiB
Java
Raw Normal View History

2017-06-02 10:25:49 +02:00
package info.nightscout.androidaps.db;
2017-06-05 00:50:31 +02:00
import android.graphics.Color;
2018-01-21 13:37:38 +01:00
import android.support.annotation.Nullable;
2017-06-05 00:50:31 +02:00
2017-06-02 10:25:49 +02:00
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
2017-06-13 19:37:31 +02:00
import org.json.JSONException;
import org.json.JSONObject;
2017-06-02 10:25:49 +02:00
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
2017-06-08 20:52:33 +02:00
import java.util.Objects;
2017-06-02 10:25:49 +02:00
2018-01-21 13:37:38 +01:00
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
2017-06-13 19:37:31 +02:00
import info.nightscout.androidaps.data.Profile;
2017-06-02 10:25:49 +02:00
import info.nightscout.androidaps.interfaces.Interval;
2018-07-30 15:46:20 +02:00
import info.nightscout.androidaps.logging.L;
2018-01-21 13:37:38 +01:00
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
2017-06-02 12:27:21 +02:00
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
2017-06-05 00:50:31 +02:00
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
2018-01-21 13:37:38 +01:00
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
2017-10-16 12:54:17 +02:00
import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfilePlugin;
2017-06-02 10:25:49 +02:00
import info.nightscout.utils.DateUtil;
2017-10-16 12:54:17 +02:00
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.T;
2017-06-02 10:25:49 +02:00
@DatabaseTable(tableName = DatabaseHelper.DATABASE_PROFILESWITCHES)
2017-06-02 12:27:21 +02:00
public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
2018-07-30 15:46:20 +02:00
private static Logger log = LoggerFactory.getLogger(L.DATABASE);
2017-06-02 10:25:49 +02:00
@DatabaseField(id = true)
public long date;
@DatabaseField
public boolean isValid = true;
@DatabaseField
public int source = Source.NONE;
@DatabaseField
public String _id = null; // NS _id
@DatabaseField
public boolean isCPP = false; // CPP NS="CircadianPercentageProfile"
@DatabaseField
public int timeshift = 0; // CPP NS="timeshift"
@DatabaseField
public int percentage = 100; // CPP NS="percentage"
@DatabaseField
public String profileName = null;
@DatabaseField
public String profileJson = null;
@DatabaseField
public String profilePlugin = null; // NSProfilePlugin.class.getName();
@DatabaseField
public int durationInMinutes = 0;
2017-06-13 19:37:31 +02:00
private Profile profile = null;
public ProfileSwitch date(long date) {
this.date = date;
return this;
}
public ProfileSwitch profileName(String profileName) {
this.profileName = profileName;
return this;
}
public ProfileSwitch profile(Profile profile) {
this.profile = profile;
return this;
}
public ProfileSwitch source(int source) {
this.source = source;
return this;
}
public ProfileSwitch duration(int duration) {
this.durationInMinutes = duration;
return this;
}
2018-01-21 13:37:38 +01:00
@Nullable
2017-06-13 19:37:31 +02:00
public Profile getProfileObject() {
if (profile == null)
try {
2017-09-23 23:12:08 +02:00
profile = new Profile(new JSONObject(profileJson), percentage, timeshift);
2018-01-21 13:37:38 +01:00
} catch (Exception e) {
log.error("Unhandled exception", e);
2018-01-21 13:37:38 +01:00
log.error("Unhandled exception", profileJson);
2017-06-13 19:37:31 +02:00
}
return profile;
}
2017-09-24 10:39:54 +02:00
public String getCustomizedName() {
String name = profileName;
2017-10-16 12:54:17 +02:00
if(LocalProfilePlugin.LOCAL_PROFILE.equals(name)){
name = DecimalFormatter.to2Decimal(getProfileObject().percentageBasalSum()) + "U ";
}
if (isCPP) {
name += "(" + percentage + "%";
if (timeshift != 0)
name += "," + timeshift + "h";
name += ")";
2017-09-24 10:39:54 +02:00
}
return name;
}
2017-06-08 20:52:33 +02:00
public boolean isEqual(ProfileSwitch other) {
if (date != other.date) {
return false;
}
if (durationInMinutes != other.durationInMinutes)
return false;
if (percentage != other.percentage)
return false;
if (timeshift != other.timeshift)
return false;
if (isCPP != other.isCPP)
return false;
if (!Objects.equals(_id, other._id))
return false;
if (!Objects.equals(profilePlugin, other.profilePlugin))
return false;
if (!Objects.equals(profileJson, other.profileJson))
return false;
if (!Objects.equals(profileName, other.profileName))
return false;
return true;
}
public void copyFrom(ProfileSwitch t) {
date = t.date;
_id = t._id;
durationInMinutes = t.durationInMinutes;
percentage = t.percentage;
timeshift = t.timeshift;
isCPP = t.isCPP;
profilePlugin = t.profilePlugin;
profileJson = t.profileJson;
profileName = t.profileName;
}
2017-06-02 10:25:49 +02:00
// -------- Interval interface ---------
Long cuttedEnd = null;
public long durationInMsec() {
return durationInMinutes * 60 * 1000L;
}
public long start() {
return date;
}
// planned end time at time of creation
public long originalEnd() {
return date + durationInMinutes * 60 * 1000L;
}
// end time after cut
public long end() {
if (cuttedEnd != null)
return cuttedEnd;
return originalEnd();
}
public void cutEndTo(long end) {
cuttedEnd = end;
}
public boolean match(long time) {
if (start() <= time && end() >= time)
return true;
return false;
}
public boolean before(long time) {
if (end() < time)
return true;
return false;
}
public boolean after(long time) {
if (start() > time)
return true;
return false;
}
@Override
public boolean isInProgress() {
2017-06-15 23:12:12 +02:00
return match(System.currentTimeMillis());
2017-06-02 10:25:49 +02:00
}
@Override
public boolean isEndingEvent() {
return durationInMinutes == 0;
}
2018-01-21 13:37:38 +01:00
@Override
public boolean isValid() {
boolean isValid = getProfileObject() != null && getProfileObject().isValid(DateUtil.dateAndTimeString(date));
if (!isValid)
createNotificationInvalidProfile(DateUtil.dateAndTimeString(date));
return isValid;
}
public void createNotificationInvalidProfile(String detail) {
Notification notification = new Notification(Notification.ZERO_VALUE_IN_PROFILE, String.format(MainApp.gs(R.string.zerovalueinprofile), detail), Notification.LOW, 5);
MainApp.bus().post(new EventNewNotification(notification));
}
public static boolean isEvent5minBack(List<ProfileSwitch> list, long time, boolean zeroDurationOnly) {
for (int i = 0; i < list.size(); i++) {
ProfileSwitch event = list.get(i);
if (event.date <= time && event.date > (time - T.mins(5).msecs())) {
if (zeroDurationOnly) {
if (event.durationInMinutes == 0) {
if (L.isEnabled(L.DATABASE))
log.debug("Found ProfileSwitch event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
return true;
}
} else {
if (L.isEnabled(L.DATABASE))
log.debug("Found ProfileSwitch event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
return true;
}
}
}
return false;
}
2017-06-02 10:25:49 +02:00
// -------- Interval interface end ---------
2017-06-02 12:27:21 +02:00
// ----------------- DataPointInterface --------------------
@Override
public double getX() {
return date;
}
// default when no sgv around available
private double yValue = 0;
@Override
public double getY() {
return yValue;
}
2017-06-05 00:50:31 +02:00
@Override
public void setY(double y) {
yValue = y;
}
2017-06-02 12:27:21 +02:00
@Override
public String getLabel() {
2017-10-11 02:32:17 +02:00
return getCustomizedName();
2017-06-02 12:27:21 +02:00
}
2017-06-05 00:50:31 +02:00
@Override
public long getDuration() {
return 0;
}
@Override
public PointsWithLabelGraphSeries.Shape getShape() {
return PointsWithLabelGraphSeries.Shape.PROFILE;
}
@Override
public float getSize() {
return 10;
}
@Override
public int getColor() {
return Color.CYAN;
}
2017-06-12 13:11:16 +02:00
public String toString() {
2017-06-02 10:25:49 +02:00
return "ProfileSwitch{" +
"date=" + date +
"date=" + DateUtil.dateAndTimeString(date) +
", isValid=" + isValid +
", duration=" + durationInMinutes +
", profileName=" + profileName +
", percentage=" + percentage +
", timeshift=" + timeshift +
'}';
}
}