diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java index e34bb5c46d..def268bd35 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java @@ -497,8 +497,6 @@ public class DataService extends IntentService { trJson.getString("eventType").equals(CareportalEvent.OPENAPSOFFLINE) || trJson.getString("eventType").equals(CareportalEvent.PUMPBATTERYCHANGE) )) { - if (Config.logIncommingData) - log.debug("Processing CareportalEvent record: " + trJson.toString()); MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(trJson); } @@ -514,8 +512,6 @@ public class DataService extends IntentService { public void handleAddChangeProfileSwitchRecord(JSONObject trJson) throws JSONException { if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.PROFILESWITCH)) { - if (Config.logIncommingData) - log.debug("Processing ProfileSwitch record: " + trJson.toString()); MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(trJson); } } diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index 9f53c3a42b..cd216ef8e0 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -1491,14 +1491,58 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return new ArrayList(); } - public void createOrUpdate(ProfileSwitch profileSwitch) { - profileSwitch.date = profileSwitch.date - profileSwitch.date % 1000; + public boolean createOrUpdate(ProfileSwitch profileSwitch) { try { - getDaoProfileSwitch().createOrUpdate(profileSwitch); - scheduleProfileSwitchChange(); + ProfileSwitch old; + profileSwitch.date = roundDateToSec(profileSwitch.date); + + if (profileSwitch.source == Source.NIGHTSCOUT) { + old = getDaoProfileSwitch().queryForId(profileSwitch.date); + if (old != null) { + if (!old.isEqual(profileSwitch)) { + getDaoProfileSwitch().delete(old); // need to delete/create because date may change too + old.copyFrom(profileSwitch); + getDaoProfileSwitch().create(old); + log.debug("PROFILESWITCH: Updating record by date from: " + Source.getString(profileSwitch.source) + " " + old.toString()); + scheduleTemporaryTargetChange(); + return true; + } + return false; + } + // find by NS _id + if (profileSwitch._id != null) { + QueryBuilder queryBuilder = getDaoProfileSwitch().queryBuilder(); + Where where = queryBuilder.where(); + where.eq("_id", profileSwitch._id); + PreparedQuery preparedQuery = queryBuilder.prepare(); + List trList = getDaoProfileSwitch().query(preparedQuery); + if (trList.size() > 0) { + old = trList.get(0); + if (!old.isEqual(profileSwitch)) { + getDaoProfileSwitch().delete(old); // need to delete/create because date may change too + old.copyFrom(profileSwitch); + getDaoProfileSwitch().create(old); + log.debug("PROFILESWITCH: Updating record by _id from: " + Source.getString(profileSwitch.source) + " " + old.toString()); + scheduleTemporaryTargetChange(); + return true; + } + } + } + getDaoProfileSwitch().create(profileSwitch); + log.debug("PROFILESWITCH: New record from: " + Source.getString(profileSwitch.source) + " " + profileSwitch.toString()); + scheduleTemporaryTargetChange(); + return true; + } + if (profileSwitch.source == Source.USER) { + getDaoProfileSwitch().create(profileSwitch); + log.debug("PROFILESWITCH: New record from: " + Source.getString(profileSwitch.source) + " " + profileSwitch.toString()); + scheduleTemporaryTargetChange(); + return true; + } } catch (SQLException e) { e.printStackTrace(); } + return false; } public void delete(ProfileSwitch profileSwitch) { @@ -1542,32 +1586,14 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void createProfileSwitchFromJsonIfNotExists(JSONObject trJson) { try { - QueryBuilder queryBuilder = null; - queryBuilder = getDaoProfileSwitch().queryBuilder(); - Where where = queryBuilder.where(); - where.eq("_id", trJson.getString("_id")).or().eq("date", trJson.getLong("mills")); - PreparedQuery preparedQuery = queryBuilder.prepare(); - List list = getDaoProfileSwitch().query(preparedQuery); - ProfileSwitch profileSwitch; - if (list.size() == 0) { - profileSwitch = new ProfileSwitch(); - if (Config.logIncommingData) - log.debug("Adding ProfileSwitch record to database: " + trJson.toString()); - // Record does not exists. add - } else if (list.size() == 1) { - profileSwitch = list.get(0); - if (Config.logIncommingData) - log.debug("Updating ProfileSwitch record in database: " + trJson.toString()); - } else { - log.error("Something went wrong"); - return; - } + ProfileSwitch profileSwitch = new ProfileSwitch(); profileSwitch.date = trJson.getLong("mills"); if (trJson.has("duration")) profileSwitch.durationInMinutes = trJson.getInt("duration"); profileSwitch._id = trJson.getString("_id"); profileSwitch.profileName = trJson.getString("profile"); profileSwitch.isCPP = trJson.has("CircadianPercentageProfile"); + profileSwitch.source = Source.NIGHTSCOUT; if (trJson.has("timeshift")) profileSwitch.timeshift = trJson.getInt("timeshift"); if (trJson.has("percentage")) @@ -1577,12 +1603,21 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { if (trJson.has("profilePlugin")) profileSwitch.profilePlugin = trJson.getString("profilePlugin"); createOrUpdate(profileSwitch); - } catch (SQLException | JSONException e) { + } catch (JSONException e) { e.printStackTrace(); } } public void deleteProfileSwitchById(String _id) { + ProfileSwitch stored = findProfileSwitchById(_id); + if (stored != null) { + log.debug("PROFILESWITCH: Removing ProfileSwitch record from database: " + stored.toString()); + delete(stored); + scheduleTemporaryTargetChange(); + } + } + + public ProfileSwitch findProfileSwitchById(String _id) { try { QueryBuilder queryBuilder = getDaoProfileSwitch().queryBuilder(); Where where = queryBuilder.where(); @@ -1591,17 +1626,14 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { List list = getDaoProfileSwitch().query(preparedQuery); if (list.size() == 1) { - ProfileSwitch record = list.get(0); - if (Config.logIncommingData) - log.debug("Removing ProfileSwitch record from database: " + record.log()); - delete(record); + return list.get(0); } else { - if (Config.logIncommingData) - log.debug("ProfileSwitch not found database: " + _id); + return null; } } catch (SQLException e) { e.printStackTrace(); } + return null; } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java index 7806cd298f..448f6cdd51 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java @@ -9,6 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; +import java.util.Objects; import info.nightscout.androidaps.interfaces.Interval; import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface; @@ -49,6 +50,41 @@ public class ProfileSwitch implements Interval, DataPointWithLabelInterface { @DatabaseField public int durationInMinutes = 0; + 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; + } + // -------- Interval interface --------- Long cuttedEnd = null; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index b32465cb73..57e3607504 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -401,26 +401,28 @@ public class DanaRv2ExecutionService extends Service { mSerialIOThread.sendMessage(msg); MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(DanaRPump.CARBS, carbtime, carbs, 0); mSerialIOThread.sendMessage(msgSetHistoryEntry_v2); - lastHistoryFetched = carbtime - 1000; + lastHistoryFetched = carbtime - 60000; } - MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables - MainApp.bus().post(new EventDanaRBolusStart()); + if (amount > 0) { + MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables + MainApp.bus().post(new EventDanaRBolusStart()); - if (!stop.stopped) { - mSerialIOThread.sendMessage(start); - } else { - t.insulin = 0d; - return false; - } - while (!stop.stopped && !start.failed) { - waitMsec(100); - if ((new Date().getTime() - progress.lastReceive) > 5 * 1000L) { // if i didn't receive status for more than 5 sec expecting broken comm - stop.stopped = true; - stop.forced = true; - log.debug("Communication stopped"); + if (!stop.stopped) { + mSerialIOThread.sendMessage(start); + } else { + t.insulin = 0d; + return false; + } + while (!stop.stopped && !start.failed) { + waitMsec(100); + if ((new Date().getTime() - progress.lastReceive) > 5 * 1000L) { // if i didn't receive status for more than 5 sec expecting broken comm + stop.stopped = true; + stop.forced = true; + log.debug("Communication stopped"); + } } } - waitMsec(1000); + waitMsec(3000); bolusingTreatment = null; loadEvents(); return true;