Merge pull request #2555 from Tornado-Tim/refractor-algo
Refactor Algorithms (MA removal)
This commit is contained in:
commit
4c0601bf46
23 changed files with 23 additions and 1007 deletions
|
@ -1,316 +0,0 @@
|
||||||
/*
|
|
||||||
Determine Basal
|
|
||||||
|
|
||||||
Released under MIT license. See the accompanying LICENSE.txt file for
|
|
||||||
full terms and conditions
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
var determine_basal = function determine_basal(glucose_status, currenttemp, iob_data, profile, offline, meal_data, setTempBasal) {
|
|
||||||
var rT = { //short for requestedTemp
|
|
||||||
};
|
|
||||||
|
|
||||||
if (typeof profile === 'undefined' || typeof profile.current_basal === 'undefined') {
|
|
||||||
rT.error ='Error: could not get current basal rate';
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bg = glucose_status.glucose;
|
|
||||||
if (bg < 38) { //Dexcom is in ??? mode or calibrating, do nothing. Asked @benwest for raw data in iter_glucose
|
|
||||||
rT.error = "CGM is calibrating or in ??? state";
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
var max_iob = profile.max_iob; // maximum amount of non-bolus IOB OpenAPS will ever deliver
|
|
||||||
|
|
||||||
// if target_bg is set, great. otherwise, if min and max are set, then set target to their average
|
|
||||||
var target_bg;
|
|
||||||
if (typeof profile.target_bg !== 'undefined') {
|
|
||||||
target_bg = profile.target_bg;
|
|
||||||
} else {
|
|
||||||
if (typeof profile.min_bg !== 'undefined' && typeof profile.max_bg !== 'undefined') {
|
|
||||||
target_bg = (profile.min_bg + profile.max_bg) / 2;
|
|
||||||
} else {
|
|
||||||
rT.error ='Error: could not determine target_bg';
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (typeof iob_data === 'undefined' ) {
|
|
||||||
rT.error ='Error: iob_data undefined';
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof iob_data.activity === 'undefined' || typeof iob_data.iob === 'undefined' || typeof iob_data.activity === 'undefined') {
|
|
||||||
rT.error ='Error: iob_data missing some property';
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
var tick;
|
|
||||||
|
|
||||||
if (glucose_status.delta >= 0) {
|
|
||||||
tick = "+" + glucose_status.delta;
|
|
||||||
} else {
|
|
||||||
tick = glucose_status.delta;
|
|
||||||
}
|
|
||||||
var minDelta = Math.min(glucose_status.delta, glucose_status.avgdelta);
|
|
||||||
//var maxDelta = Math.max(glucose_status.delta, glucose_status.avgdelta);
|
|
||||||
|
|
||||||
|
|
||||||
//calculate BG impact: the amount BG "should" be rising or falling based on insulin activity alone
|
|
||||||
var bgi = Math.round(( -iob_data.activity * profile.sens * 5 )*100)/100;
|
|
||||||
// project positive deviations for 15 minutes
|
|
||||||
var deviation = Math.round( 15 / 5 * ( glucose_status.avgdelta - bgi ) );
|
|
||||||
// project negative deviations for 30 minutes
|
|
||||||
if (deviation < 0) {
|
|
||||||
deviation = Math.round( 30 / 5 * ( glucose_status.avgdelta - bgi ) );
|
|
||||||
}
|
|
||||||
//console.log("Avg.Delta: " + glucose_status.avgdelta.toFixed(1) + ", BGI: " + bgi.toFixed(1) + " 15m activity projection: " + deviation.toFixed(0));
|
|
||||||
|
|
||||||
// calculate the naive (bolus calculator math) eventual BG based on net IOB and sensitivity
|
|
||||||
var naive_eventualBG = Math.round( bg - (iob_data.iob * profile.sens) );
|
|
||||||
// and adjust it for the deviation above
|
|
||||||
var eventualBG = naive_eventualBG + deviation;
|
|
||||||
// calculate what portion of that is due to bolussnooze
|
|
||||||
var bolusContrib = iob_data.bolussnooze * profile.sens;
|
|
||||||
// and add it back in to get snoozeBG, plus another 50% to avoid low-temping at mealtime
|
|
||||||
var naive_snoozeBG = Math.round( naive_eventualBG + 1.5 * bolusContrib );
|
|
||||||
// adjust that for deviation like we did eventualBG
|
|
||||||
var snoozeBG = naive_snoozeBG + deviation;
|
|
||||||
|
|
||||||
//console.log("BG: " + bg +"(" + tick + ","+glucose_status.avgdelta.toFixed(1)+")"+ " -> " + eventualBG + "-" + snoozeBG + " (Unadjusted: " + naive_eventualBG + "-" + naive_snoozeBG + "), BGI: " + bgi);
|
|
||||||
|
|
||||||
var expectedDelta = Math.round(( bgi + ( target_bg - eventualBG ) / ( profile.dia * 60 / 5 ) )*10)/10;
|
|
||||||
//console.log("expectedDelta: " + expectedDelta);
|
|
||||||
|
|
||||||
if (typeof eventualBG === 'undefined' || isNaN(eventualBG)) {
|
|
||||||
rT.error ='Error: could not calculate eventualBG';
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// min_bg of 90 -> threshold of 70, 110 -> 80, and 130 -> 90
|
|
||||||
var threshold = profile.min_bg - 0.5*(profile.min_bg-50);
|
|
||||||
|
|
||||||
rT = {
|
|
||||||
'temp': 'absolute'
|
|
||||||
, 'bg': bg
|
|
||||||
, 'tick': tick
|
|
||||||
, 'eventualBG': eventualBG
|
|
||||||
, 'snoozeBG': snoozeBG
|
|
||||||
};
|
|
||||||
|
|
||||||
var basaliob;
|
|
||||||
if (iob_data.basaliob) { basaliob = iob_data.basaliob; }
|
|
||||||
else { basaliob = iob_data.iob - iob_data.bolussnooze; }
|
|
||||||
// allow meal assist to run when carbs are just barely covered
|
|
||||||
if (minDelta > Math.max(3, bgi) && ( (meal_data.carbs > 0 && (1.1 * meal_data.carbs/profile.carb_ratio > meal_data.boluses + basaliob)) || ( deviation > 25 && minDelta > 7 ) ) ) {
|
|
||||||
// ignore all covered IOB, and just set eventualBG to the current bg
|
|
||||||
eventualBG = Math.max(bg,eventualBG) + deviation;
|
|
||||||
rT.eventualBG = eventualBG;
|
|
||||||
profile.min_bg = 80;
|
|
||||||
target_bg = (profile.min_bg + profile.max_bg) / 2;
|
|
||||||
expectedDelta = Math.round(( bgi + ( target_bg - eventualBG ) / ( profile.dia * 60 / 5 ) )*10)/10;
|
|
||||||
rT.mealAssist = "On: Carbs: " + meal_data.carbs + " Boluses: " + meal_data.boluses + " Target: " + target_bg + " Deviation: " + deviation + " BGI: " + bgi;
|
|
||||||
} else {
|
|
||||||
rT.mealAssist = "Off: Carbs: " + meal_data.carbs + " Boluses: " + meal_data.boluses + " Target: " + target_bg + " Deviation: " + deviation + " BGI: " + bgi;
|
|
||||||
}
|
|
||||||
if (bg < threshold) { // low glucose suspend mode: BG is < ~80
|
|
||||||
rT.reason = "BG " + bg + "<" + threshold;
|
|
||||||
if ((glucose_status.delta <= 0 && glucose_status.avgdelta <= 0) || (glucose_status.delta < expectedDelta && glucose_status.avgdelta < expectedDelta)) {
|
|
||||||
// BG is still falling / rising slower than predicted
|
|
||||||
return setTempBasal(0, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
if (glucose_status.delta > glucose_status.avgdelta) {
|
|
||||||
rT.reason += ", delta " + glucose_status.delta + ">0";
|
|
||||||
} else {
|
|
||||||
rT.reason += ", avg delta " + glucose_status.avgdelta.toFixed(2) + ">0";
|
|
||||||
}
|
|
||||||
if (currenttemp.rate > profile.current_basal) { // if a high-temp is running
|
|
||||||
rT.reason += ", cancel high temp";
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel high temp
|
|
||||||
} else if (currenttemp.duration && eventualBG > profile.max_bg) { // if low-temped and predicted to go high from negative IOB
|
|
||||||
rT.reason += ", cancel low temp";
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel low temp
|
|
||||||
}
|
|
||||||
rT.reason += "; no high-temp to cancel";
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
if (eventualBG < profile.min_bg) { // if eventual BG is below target:
|
|
||||||
if (rT.mealAssist.indexOf("On") == 0) {
|
|
||||||
rT.reason = "Meal assist: " + meal_data.carbs + "g, " + meal_data.boluses + "U";
|
|
||||||
} else {
|
|
||||||
rT.reason = "Eventual BG " + eventualBG + "<" + profile.min_bg;
|
|
||||||
// if 5m or 15m avg BG is rising faster than expected delta
|
|
||||||
if (minDelta > expectedDelta && minDelta > 0) {
|
|
||||||
if (glucose_status.delta > glucose_status.avgdelta) {
|
|
||||||
rT.reason += ", but Delta " + tick + " > Exp. Delta " + expectedDelta;
|
|
||||||
} else {
|
|
||||||
rT.reason += ", but Avg. Delta " + glucose_status.avgdelta.toFixed(2) + " > Exp. Delta " + expectedDelta;
|
|
||||||
}
|
|
||||||
if (currenttemp.duration > 0) { // if there is currently any temp basal running
|
|
||||||
rT.reason = rT.reason += "; cancel";
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel temp
|
|
||||||
} else {
|
|
||||||
rT.reason = rT.reason += "; no temp to cancel";
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eventualBG < profile.min_bg) {
|
|
||||||
// if this is just due to boluses, we can snooze until the bolus IOB decays (at double speed)
|
|
||||||
if (snoozeBG > profile.min_bg) { // if adding back in the bolus contribution BG would be above min
|
|
||||||
// if BG is falling and high-temped, or rising and low-temped, cancel
|
|
||||||
// compare against zero here, not BGI, because BGI will be highly negative from boluses and no carbs
|
|
||||||
if (glucose_status.delta < 0 && currenttemp.duration > 0 && currenttemp.rate > profile.current_basal) {
|
|
||||||
rT.reason += tick + ", and temp " + currenttemp.rate + " > basal " + profile.current_basal;
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel temp
|
|
||||||
} else if (glucose_status.delta > 0 && currenttemp.duration > 0 && currenttemp.rate < profile.current_basal) {
|
|
||||||
rT.reason += tick + ", and temp " + currenttemp.rate + " < basal " + profile.current_basal;
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel temp
|
|
||||||
}
|
|
||||||
|
|
||||||
rT.reason += ", bolus snooze: eventual BG range " + eventualBG + "-" + snoozeBG;
|
|
||||||
return rT;
|
|
||||||
} else {
|
|
||||||
// calculate 30m low-temp required to get projected BG up to target
|
|
||||||
// use snoozeBG to more gradually ramp in any counteraction of the user's boluses
|
|
||||||
// multiply by 2 to low-temp faster for increased hypo safety
|
|
||||||
var insulinReq = 2 * Math.min(0, (snoozeBG - target_bg) / profile.sens);
|
|
||||||
if (minDelta < 0 && minDelta > expectedDelta) {
|
|
||||||
// if we're barely falling, newinsulinReq should be barely negative
|
|
||||||
rT.reason += ", Snooze BG " + snoozeBG;
|
|
||||||
var newinsulinReq = Math.round(( insulinReq * (minDelta / expectedDelta) ) * 100)/100;
|
|
||||||
//console.log("Increasing insulinReq from " + insulinReq + " to " + newinsulinReq);
|
|
||||||
insulinReq = newinsulinReq;
|
|
||||||
}
|
|
||||||
// rate required to deliver insulinReq less insulin over 30m:
|
|
||||||
var rate = profile.current_basal + (2 * insulinReq);
|
|
||||||
rate = Math.round( rate * 1000 ) / 1000;
|
|
||||||
// if required temp < existing temp basal
|
|
||||||
var insulinScheduled = currenttemp.duration * (currenttemp.rate - profile.current_basal) / 60;
|
|
||||||
if (insulinScheduled < insulinReq - 0.2) { // if current temp would deliver >0.2U less than the required insulin, raise the rate
|
|
||||||
rT.reason = currenttemp.duration + "m@" + (currenttemp.rate - profile.current_basal).toFixed(3) + " = " + insulinScheduled.toFixed(3) + " < req " + insulinReq + "-0.2U";
|
|
||||||
return setTempBasal(rate, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate > currenttemp.rate - 0.1)) {
|
|
||||||
rT.reason += ", temp " + currenttemp.rate + " ~< req " + rate + "U/hr";
|
|
||||||
return rT;
|
|
||||||
} else {
|
|
||||||
rT.reason += ", setting " + rate + "U/hr";
|
|
||||||
return setTempBasal(rate, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if eventual BG is above min but BG is falling faster than expected Delta
|
|
||||||
if (minDelta < expectedDelta) {
|
|
||||||
if (glucose_status.delta < glucose_status.avgdelta) {
|
|
||||||
rT.reason = "Eventual BG " + eventualBG + ">" + profile.min_bg + " but Delta " + tick + " < Exp. Delta " + expectedDelta;
|
|
||||||
} else {
|
|
||||||
rT.reason = "Eventual BG " + eventualBG + ">" + profile.min_bg + " but Avg. Delta " + glucose_status.avgdelta.toFixed(2) + " < Exp. Delta " + expectedDelta;
|
|
||||||
}
|
|
||||||
if (currenttemp.duration > 0) { // if there is currently any temp basal running
|
|
||||||
rT.reason = rT.reason += "; cancel";
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel temp
|
|
||||||
} else {
|
|
||||||
rT.reason = rT.reason += "; no temp to cancel";
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eventualBG < profile.max_bg) {
|
|
||||||
rT.reason = eventualBG + " is in range. No temp required";
|
|
||||||
if (currenttemp.duration > 0) { // if there is currently any temp basal running
|
|
||||||
rT.reason = rT.reason += "; cancel";
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel temp
|
|
||||||
}
|
|
||||||
if (offline == 'Offline') {
|
|
||||||
// if no temp is running or required, set the current basal as a temp, so you can see on the pump that the loop is working
|
|
||||||
if ((!currenttemp.duration || (currenttemp.rate == profile.current_basal)) && !rT.duration) {
|
|
||||||
rT.reason = rT.reason + "; setting current basal of " + profile.current_basal + " as temp";
|
|
||||||
return setTempBasal(profile.current_basal, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (snoozeBG < profile.max_bg) {
|
|
||||||
rT.reason = snoozeBG + " < " + profile.max_bg;
|
|
||||||
if (currenttemp.duration > 0) { // if there is currently any temp basal running
|
|
||||||
rT.reason = rT.reason += "; cancel";
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline); // cancel temp
|
|
||||||
} else {
|
|
||||||
rT.reason = rT.reason += "; no temp to cancel";
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// eventual BG is at/above target:
|
|
||||||
// if iob is over max, just cancel any temps
|
|
||||||
var basaliob;
|
|
||||||
if (iob_data.basaliob) { basaliob = iob_data.basaliob; }
|
|
||||||
else { basaliob = iob_data.iob - iob_data.bolussnooze; }
|
|
||||||
rT.reason = "Eventual BG " + eventualBG + ">=" + profile.max_bg + ", ";
|
|
||||||
if (basaliob > max_iob) {
|
|
||||||
rT.reason = "basaliob " + basaliob + " > max_iob " + max_iob;
|
|
||||||
return setTempBasal(0, 0, profile, rT, offline);
|
|
||||||
} else { // otherwise, calculate 30m high-temp required to get projected BG down to target
|
|
||||||
|
|
||||||
// insulinReq is the additional insulin required to get down to max bg:
|
|
||||||
// if in meal assist mode, check if snoozeBG is lower, as eventualBG is not dependent on IOB
|
|
||||||
var insulinReq = (Math.min(snoozeBG,eventualBG) - target_bg) / profile.sens;
|
|
||||||
if (minDelta < 0 && minDelta > expectedDelta) {
|
|
||||||
var newinsulinReq = Math.round(( insulinReq * (1 - (minDelta / expectedDelta)) ) * 100)/100;
|
|
||||||
//console.log("Reducing insulinReq from " + insulinReq + " to " + newinsulinReq);
|
|
||||||
insulinReq = newinsulinReq;
|
|
||||||
}
|
|
||||||
// if that would put us over max_iob, then reduce accordingly
|
|
||||||
if (insulinReq > max_iob-basaliob) {
|
|
||||||
rT.reason = "max_iob " + max_iob + ", ";
|
|
||||||
insulinReq = max_iob-basaliob;
|
|
||||||
}
|
|
||||||
|
|
||||||
// rate required to deliver insulinReq more insulin over 30m:
|
|
||||||
var rate = profile.current_basal + (2 * insulinReq);
|
|
||||||
rate = Math.round( rate * 1000 ) / 1000;
|
|
||||||
|
|
||||||
var maxSafeBasal = Math.min(profile.max_basal, 3 * profile.max_daily_basal, 4 * profile.current_basal);
|
|
||||||
if (rate > maxSafeBasal) {
|
|
||||||
rT.reason += "adj. req. rate:"+rate.toFixed(1) +" to maxSafeBasal:"+maxSafeBasal.toFixed(1)+", ";
|
|
||||||
rate = maxSafeBasal;
|
|
||||||
}
|
|
||||||
|
|
||||||
var insulinScheduled = currenttemp.duration * (currenttemp.rate - profile.current_basal) / 60;
|
|
||||||
if (insulinScheduled > insulinReq + 0.2) { // if current temp would deliver >0.2U more than the required insulin, lower the rate
|
|
||||||
rT.reason = currenttemp.duration + "m@" + (currenttemp.rate - profile.current_basal).toFixed(3) + " = " + insulinScheduled.toFixed(3) + " > req " + insulinReq + "+0.2U";
|
|
||||||
return setTempBasal(rate, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof currenttemp.duration == 'undefined' || currenttemp.duration == 0) { // no temp is set
|
|
||||||
rT.reason += "no temp, setting " + rate + "U/hr";
|
|
||||||
return setTempBasal(rate, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currenttemp.duration > 5 && rate < currenttemp.rate + 0.1) { // if required temp <~ existing temp basal
|
|
||||||
rT.reason += "temp " + currenttemp.rate + " >~ req " + rate + "U/hr";
|
|
||||||
return rT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// required temp > existing temp basal
|
|
||||||
rT.reason += "temp " + currenttemp.rate + "<" + rate + "U/hr";
|
|
||||||
return setTempBasal(rate, 30, profile, rT, offline);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = determine_basal;
|
|
|
@ -19,7 +19,6 @@ import info.nightscout.androidaps.events.EventRebuildTabs
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase
|
import info.nightscout.androidaps.interfaces.PluginBase
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.PluginStore
|
import info.nightscout.androidaps.plugins.configBuilder.PluginStore
|
||||||
|
@ -80,7 +79,6 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
|
||||||
@Inject lateinit var medtronicPumpPlugin: MedtronicPumpPlugin
|
@Inject lateinit var medtronicPumpPlugin: MedtronicPumpPlugin
|
||||||
@Inject lateinit var nsClientPlugin: NSClientPlugin
|
@Inject lateinit var nsClientPlugin: NSClientPlugin
|
||||||
@Inject lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
|
@Inject lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
|
||||||
@Inject lateinit var openAPSMAPlugin: OpenAPSMAPlugin
|
|
||||||
@Inject lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
|
@Inject lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
|
||||||
@Inject lateinit var safetyPlugin: SafetyPlugin
|
@Inject lateinit var safetyPlugin: SafetyPlugin
|
||||||
@Inject lateinit var sensitivityAAPSPlugin: SensitivityAAPSPlugin
|
@Inject lateinit var sensitivityAAPSPlugin: SensitivityAAPSPlugin
|
||||||
|
@ -162,7 +160,6 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
|
||||||
addPreferencesFromResourceIfEnabled(glimpPlugin, rootKey)
|
addPreferencesFromResourceIfEnabled(glimpPlugin, rootKey)
|
||||||
addPreferencesFromResourceIfEnabled(careportalPlugin, rootKey)
|
addPreferencesFromResourceIfEnabled(careportalPlugin, rootKey)
|
||||||
addPreferencesFromResourceIfEnabled(loopPlugin, rootKey, Config.APS)
|
addPreferencesFromResourceIfEnabled(loopPlugin, rootKey, Config.APS)
|
||||||
addPreferencesFromResourceIfEnabled(openAPSMAPlugin, rootKey, Config.APS)
|
|
||||||
addPreferencesFromResourceIfEnabled(openAPSAMAPlugin, rootKey, Config.APS)
|
addPreferencesFromResourceIfEnabled(openAPSAMAPlugin, rootKey, Config.APS)
|
||||||
addPreferencesFromResourceIfEnabled(openAPSSMBPlugin, rootKey, Config.APS)
|
addPreferencesFromResourceIfEnabled(openAPSSMBPlugin, rootKey, Config.APS)
|
||||||
addPreferencesFromResourceIfEnabled(sensitivityAAPSPlugin, rootKey)
|
addPreferencesFromResourceIfEnabled(sensitivityAAPSPlugin, rootKey)
|
||||||
|
|
|
@ -12,8 +12,7 @@ import info.nightscout.androidaps.db.BgReading
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch
|
import info.nightscout.androidaps.db.ProfileSwitch
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.APSResult
|
import info.nightscout.androidaps.plugins.aps.loop.APSResult
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.DetermineBasalResultAMA
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.DetermineBasalResultAMA
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.DetermineBasalResultMA
|
import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.LoggerCallback
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalAdapterSMBJS
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalAdapterSMBJS
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalResultSMB
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalResultSMB
|
||||||
import info.nightscout.androidaps.plugins.constraints.objectives.objectives.*
|
import info.nightscout.androidaps.plugins.constraints.objectives.objectives.*
|
||||||
|
@ -55,7 +54,6 @@ interface AppComponent : AndroidInjector<MainApp> {
|
||||||
fun injectPumpEnactResult(pumpEnactResult: PumpEnactResult)
|
fun injectPumpEnactResult(pumpEnactResult: PumpEnactResult)
|
||||||
fun injectAPSResult(apsResult: APSResult)
|
fun injectAPSResult(apsResult: APSResult)
|
||||||
fun injectDetermineBasalResultSMB(determineBasalResultSMB: DetermineBasalResultSMB)
|
fun injectDetermineBasalResultSMB(determineBasalResultSMB: DetermineBasalResultSMB)
|
||||||
fun injectDetermineBasalResultMA(determineBasalResultMA: DetermineBasalResultMA)
|
|
||||||
fun injectDetermineBasalResultAMA(determineBasalResultAMA: DetermineBasalResultAMA)
|
fun injectDetermineBasalResultAMA(determineBasalResultAMA: DetermineBasalResultAMA)
|
||||||
fun injectDetermineBasalAdapterSMBJS(determineBasalAdapterSMBJS: DetermineBasalAdapterSMBJS)
|
fun injectDetermineBasalAdapterSMBJS(determineBasalAdapterSMBJS: DetermineBasalAdapterSMBJS)
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,7 @@ import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.AAPSLoggerProduction
|
import info.nightscout.androidaps.logging.AAPSLoggerProduction
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.APSResult
|
import info.nightscout.androidaps.plugins.aps.loop.APSResult
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.DetermineBasalResultAMA
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.DetermineBasalResultAMA
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.DetermineBasalResultMA
|
import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.LoggerCallback
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalAdapterSMBJS
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalAdapterSMBJS
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalResultSMB
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalResultSMB
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.PluginStore
|
import info.nightscout.androidaps.plugins.configBuilder.PluginStore
|
||||||
|
@ -122,7 +121,6 @@ open class AppModule {
|
||||||
|
|
||||||
@ContributesAndroidInjector fun apsResultInjector(): APSResult
|
@ContributesAndroidInjector fun apsResultInjector(): APSResult
|
||||||
@ContributesAndroidInjector fun determineBasalResultSMBInjector(): DetermineBasalResultSMB
|
@ContributesAndroidInjector fun determineBasalResultSMBInjector(): DetermineBasalResultSMB
|
||||||
@ContributesAndroidInjector fun determineBasalResultMAInjector(): DetermineBasalResultMA
|
|
||||||
@ContributesAndroidInjector fun determineBasalResultAMAInjector(): DetermineBasalResultAMA
|
@ContributesAndroidInjector fun determineBasalResultAMAInjector(): DetermineBasalResultAMA
|
||||||
|
|
||||||
@ContributesAndroidInjector
|
@ContributesAndroidInjector
|
||||||
|
|
|
@ -6,7 +6,6 @@ import info.nightscout.androidaps.activities.MyPreferenceFragment
|
||||||
import info.nightscout.androidaps.dialogs.*
|
import info.nightscout.androidaps.dialogs.*
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopFragment
|
import info.nightscout.androidaps.plugins.aps.loop.LoopFragment
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAFragment
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAFragment
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAFragment
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBFragment
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBFragment
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderFragment
|
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderFragment
|
||||||
import info.nightscout.androidaps.plugins.constraints.objectives.ObjectivesFragment
|
import info.nightscout.androidaps.plugins.constraints.objectives.ObjectivesFragment
|
||||||
|
@ -63,7 +62,6 @@ abstract class FragmentsModule {
|
||||||
@ContributesAndroidInjector abstract fun contributesLocalProfileFragment(): LocalProfileFragment
|
@ContributesAndroidInjector abstract fun contributesLocalProfileFragment(): LocalProfileFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesObjectivesFragment(): ObjectivesFragment
|
@ContributesAndroidInjector abstract fun contributesObjectivesFragment(): ObjectivesFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesOpenAPSAMAFragment(): OpenAPSAMAFragment
|
@ContributesAndroidInjector abstract fun contributesOpenAPSAMAFragment(): OpenAPSAMAFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesOpenAPSMAFragment(): OpenAPSMAFragment
|
|
||||||
@ContributesAndroidInjector abstract fun contributesOpenAPSSMBFragment(): OpenAPSSMBFragment
|
@ContributesAndroidInjector abstract fun contributesOpenAPSSMBFragment(): OpenAPSSMBFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesOverviewFragment(): OverviewFragment
|
@ContributesAndroidInjector abstract fun contributesOverviewFragment(): OverviewFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesLocalInsightFragment(): LocalInsightFragment
|
@ContributesAndroidInjector abstract fun contributesLocalInsightFragment(): LocalInsightFragment
|
||||||
|
|
|
@ -11,7 +11,6 @@ import info.nightscout.androidaps.Config
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase
|
import info.nightscout.androidaps.interfaces.PluginBase
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
|
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
|
||||||
import info.nightscout.androidaps.plugins.constraints.dstHelper.DstHelperPlugin
|
import info.nightscout.androidaps.plugins.constraints.dstHelper.DstHelperPlugin
|
||||||
|
@ -188,36 +187,30 @@ abstract class PluginsModule {
|
||||||
@APS
|
@APS
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@IntKey(210)
|
@IntKey(210)
|
||||||
abstract fun bindOpenAPSMAPlugin(plugin: OpenAPSMAPlugin): PluginBase
|
|
||||||
|
|
||||||
@Binds
|
|
||||||
@APS
|
|
||||||
@IntoMap
|
|
||||||
@IntKey(220)
|
|
||||||
abstract fun bindOpenAPSAMAPlugin(plugin: OpenAPSAMAPlugin): PluginBase
|
abstract fun bindOpenAPSAMAPlugin(plugin: OpenAPSAMAPlugin): PluginBase
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@APS
|
@APS
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@IntKey(230)
|
@IntKey(220)
|
||||||
abstract fun bindOpenAPSSMBPlugin(plugin: OpenAPSSMBPlugin): PluginBase
|
abstract fun bindOpenAPSSMBPlugin(plugin: OpenAPSSMBPlugin): PluginBase
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@AllConfigs
|
@AllConfigs
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@IntKey(240)
|
@IntKey(230)
|
||||||
abstract fun bindNSProfilePlugin(plugin: NSProfilePlugin): PluginBase
|
abstract fun bindNSProfilePlugin(plugin: NSProfilePlugin): PluginBase
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@NotNSClient
|
@NotNSClient
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@IntKey(250)
|
@IntKey(240)
|
||||||
abstract fun bindLocalProfilePlugin(plugin: LocalProfilePlugin): PluginBase
|
abstract fun bindLocalProfilePlugin(plugin: LocalProfilePlugin): PluginBase
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@AllConfigs
|
@AllConfigs
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@IntKey(255)
|
@IntKey(250)
|
||||||
abstract fun bindAutomationPlugin(plugin: AutomationPlugin): PluginBase
|
abstract fun bindAutomationPlugin(plugin: AutomationPlugin): PluginBase
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA.events
|
package info.nightscout.androidaps.plugins.aps.events
|
||||||
|
|
||||||
import info.nightscout.androidaps.events.EventUpdateGui
|
import info.nightscout.androidaps.events.EventUpdateGui
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA.events
|
package info.nightscout.androidaps.plugins.aps.events
|
||||||
|
|
||||||
import info.nightscout.androidaps.events.EventUpdateGui
|
import info.nightscout.androidaps.events.EventUpdateGui
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA;
|
package info.nightscout.androidaps.plugins.aps.logger;
|
||||||
|
|
||||||
import org.mozilla.javascript.ScriptableObject;
|
import org.mozilla.javascript.ScriptableObject;
|
||||||
|
|
|
@ -29,7 +29,7 @@ import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
import info.nightscout.androidaps.logging.LTag;
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.LoggerCallback;
|
import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.SMBDefaults;
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.SMBDefaults;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
||||||
|
|
|
@ -9,8 +9,8 @@ import dagger.android.support.DaggerFragment
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateResultGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateResultGui
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
|
|
|
@ -23,8 +23,8 @@ import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
import info.nightscout.androidaps.logging.LTag;
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
|
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui;
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateResultGui;
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateResultGui;
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
||||||
|
|
|
@ -1,232 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.mozilla.javascript.Context;
|
|
||||||
import org.mozilla.javascript.Function;
|
|
||||||
import org.mozilla.javascript.NativeJSON;
|
|
||||||
import org.mozilla.javascript.NativeObject;
|
|
||||||
import org.mozilla.javascript.RhinoException;
|
|
||||||
import org.mozilla.javascript.Scriptable;
|
|
||||||
import org.mozilla.javascript.ScriptableObject;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import dagger.android.HasAndroidInjector;
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.data.IobTotal;
|
|
||||||
import info.nightscout.androidaps.data.MealData;
|
|
||||||
import info.nightscout.androidaps.data.Profile;
|
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
|
||||||
import info.nightscout.androidaps.logging.L;
|
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
|
||||||
import info.nightscout.androidaps.utils.SP;
|
|
||||||
|
|
||||||
public class DetermineBasalAdapterMAJS {
|
|
||||||
|
|
||||||
private HasAndroidInjector injector;
|
|
||||||
@Inject AAPSLogger aapsLogger;
|
|
||||||
@Inject ProfileFunction profileFunction;
|
|
||||||
@Inject TreatmentsPlugin treatmentsPlugin;
|
|
||||||
|
|
||||||
private ScriptReader mScriptReader;
|
|
||||||
private JSONObject mProfile;
|
|
||||||
private JSONObject mGlucoseStatus;
|
|
||||||
private JSONObject mIobData;
|
|
||||||
private JSONObject mMealData;
|
|
||||||
private JSONObject mCurrentTemp;
|
|
||||||
|
|
||||||
private String storedCurrentTemp = null;
|
|
||||||
private String storedIobData = null;
|
|
||||||
private String storedGlucoseStatus = null;
|
|
||||||
private String storedProfile = null;
|
|
||||||
private String storedMeal_data = null;
|
|
||||||
|
|
||||||
DetermineBasalAdapterMAJS(ScriptReader scriptReader, HasAndroidInjector injector) {
|
|
||||||
injector.androidInjector().inject(this);
|
|
||||||
mScriptReader = scriptReader;
|
|
||||||
this.injector = injector;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public DetermineBasalResultMA invoke() {
|
|
||||||
DetermineBasalResultMA determineBasalResultMA = null;
|
|
||||||
|
|
||||||
Context rhino = Context.enter();
|
|
||||||
Scriptable scope = rhino.initStandardObjects();
|
|
||||||
// Turn off optimization to make Rhino Android compatible
|
|
||||||
rhino.setOptimizationLevel(-1);
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
//register logger callback for console.log and console.error
|
|
||||||
ScriptableObject.defineClass(scope, LoggerCallback.class);
|
|
||||||
Scriptable myLogger = rhino.newObject(scope, "LoggerCallback", null);
|
|
||||||
scope.put("console", scope, myLogger);
|
|
||||||
|
|
||||||
//set module parent
|
|
||||||
rhino.evaluateString(scope, "var module = {\"parent\":Boolean(1)};", "JavaScript", 0, null);
|
|
||||||
|
|
||||||
//generate functions "determine_basal" and "setTempBasal"
|
|
||||||
rhino.evaluateString(scope, readFile("OpenAPSMA/determine-basal.js"), "JavaScript", 0, null);
|
|
||||||
|
|
||||||
String setTempBasalCode = "var setTempBasal = function (rate, duration, profile, rT, offline) {" +
|
|
||||||
"rT.duration = duration;\n" +
|
|
||||||
" rT.rate = rate;" +
|
|
||||||
"return rT;" +
|
|
||||||
"};";
|
|
||||||
rhino.evaluateString(scope, setTempBasalCode, "setTempBasal.js", 0, null);
|
|
||||||
Object determineBasalObj = scope.get("determine_basal", scope);
|
|
||||||
Object setTempBasalObj = scope.get("setTempBasal", scope);
|
|
||||||
|
|
||||||
//call determine-basal
|
|
||||||
if (determineBasalObj instanceof Function && setTempBasalObj instanceof Function) {
|
|
||||||
Function determineBasalJS = (Function) determineBasalObj;
|
|
||||||
Function setTempBasalJS = (Function) setTempBasalObj;
|
|
||||||
|
|
||||||
//prepare parameters
|
|
||||||
Object[] params = new Object[]{
|
|
||||||
makeParam(mGlucoseStatus, rhino, scope),
|
|
||||||
makeParam(mCurrentTemp, rhino, scope),
|
|
||||||
makeParam(mIobData, rhino, scope),
|
|
||||||
makeParam(mProfile, rhino, scope),
|
|
||||||
"undefined",
|
|
||||||
makeParam(mMealData, rhino, scope),
|
|
||||||
setTempBasalJS};
|
|
||||||
|
|
||||||
NativeObject jsResult = (NativeObject) determineBasalJS.call(rhino, scope, scope, params);
|
|
||||||
|
|
||||||
// Parse the jsResult object to a JSON-String
|
|
||||||
String result = NativeJSON.stringify(rhino, scope, jsResult, null, null).toString();
|
|
||||||
aapsLogger.debug(LTag.APS, "Result: " + result);
|
|
||||||
try {
|
|
||||||
determineBasalResultMA = new DetermineBasalResultMA(injector, jsResult, new JSONObject(result));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
aapsLogger.error(LTag.APS, "Unhandled exception", e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
aapsLogger.debug(LTag.APS, "Problem loading JS Functions");
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
aapsLogger.error(LTag.APS, "IOException");
|
|
||||||
} catch (RhinoException e) {
|
|
||||||
aapsLogger.error(LTag.APS, "RhinoException: (" + e.lineNumber() + "," + e.columnNumber() + ") " + e.toString());
|
|
||||||
} catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
|
|
||||||
aapsLogger.error(LTag.APS, e.toString());
|
|
||||||
} finally {
|
|
||||||
Context.exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
storedGlucoseStatus = mGlucoseStatus.toString();
|
|
||||||
storedIobData = mIobData.toString();
|
|
||||||
storedCurrentTemp = mCurrentTemp.toString();
|
|
||||||
storedProfile = mProfile.toString();
|
|
||||||
storedMeal_data = mMealData.toString();
|
|
||||||
|
|
||||||
return determineBasalResultMA;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getGlucoseStatusParam() {
|
|
||||||
return storedGlucoseStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getCurrentTempParam() {
|
|
||||||
return storedCurrentTemp;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getIobDataParam() {
|
|
||||||
return storedIobData;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getProfileParam() {
|
|
||||||
return storedProfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getMealDataParam() {
|
|
||||||
return storedMeal_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setData(Profile profile,
|
|
||||||
double maxIob,
|
|
||||||
double maxBasal,
|
|
||||||
double minBg,
|
|
||||||
double maxBg,
|
|
||||||
double targetBg,
|
|
||||||
double basalRate,
|
|
||||||
IobTotal iobData,
|
|
||||||
GlucoseStatus glucoseStatus,
|
|
||||||
MealData mealData) throws JSONException {
|
|
||||||
|
|
||||||
mProfile = new JSONObject();
|
|
||||||
mProfile.put("max_iob", maxIob);
|
|
||||||
mProfile.put("dia", Math.min(profile.getDia(), 3d));
|
|
||||||
mProfile.put("type", "current");
|
|
||||||
mProfile.put("max_daily_basal", profile.getMaxDailyBasal());
|
|
||||||
mProfile.put("max_basal", maxBasal);
|
|
||||||
mProfile.put("min_bg", minBg);
|
|
||||||
mProfile.put("max_bg", maxBg);
|
|
||||||
mProfile.put("target_bg", targetBg);
|
|
||||||
mProfile.put("carb_ratio", profile.getIc());
|
|
||||||
mProfile.put("sens", profile.getIsfMgdl());
|
|
||||||
|
|
||||||
mProfile.put("current_basal", basalRate);
|
|
||||||
|
|
||||||
if (profileFunction.getUnits().equals(Constants.MMOL)) {
|
|
||||||
mProfile.put("out_units", "mmol/L");
|
|
||||||
}
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
TemporaryBasal tb = treatmentsPlugin.getTempBasalFromHistory(now);
|
|
||||||
|
|
||||||
mCurrentTemp = new JSONObject();
|
|
||||||
mCurrentTemp.put("duration", tb != null ? tb.getPlannedRemainingMinutes() : 0);
|
|
||||||
mCurrentTemp.put("rate", tb != null ? tb.tempBasalConvertedToAbsolute(now, profile) : 0d);
|
|
||||||
|
|
||||||
mIobData = new JSONObject();
|
|
||||||
mIobData.put("iob", iobData.iob); //netIob
|
|
||||||
mIobData.put("activity", iobData.activity); //netActivity
|
|
||||||
mIobData.put("bolussnooze", iobData.bolussnooze); //bolusIob
|
|
||||||
mIobData.put("basaliob", iobData.basaliob);
|
|
||||||
mIobData.put("netbasalinsulin", iobData.netbasalinsulin);
|
|
||||||
mIobData.put("hightempinsulin", iobData.hightempinsulin);
|
|
||||||
|
|
||||||
mGlucoseStatus = new JSONObject();
|
|
||||||
mGlucoseStatus.put("glucose", glucoseStatus.glucose);
|
|
||||||
if (SP.getBoolean(R.string.key_always_use_shortavg, false)) {
|
|
||||||
mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta);
|
|
||||||
} else {
|
|
||||||
mGlucoseStatus.put("delta", glucoseStatus.delta);
|
|
||||||
}
|
|
||||||
mGlucoseStatus.put("avgdelta", glucoseStatus.avgdelta);
|
|
||||||
|
|
||||||
mMealData = new JSONObject();
|
|
||||||
mMealData.put("carbs", mealData.carbs);
|
|
||||||
mMealData.put("boluses", mealData.boluses);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String readFile(String filename) throws IOException {
|
|
||||||
byte[] bytes = mScriptReader.readFile(filename);
|
|
||||||
String string = new String(bytes, StandardCharsets.UTF_8);
|
|
||||||
if (string.startsWith("#!/usr/bin/env node")) {
|
|
||||||
string = string.substring(20);
|
|
||||||
}
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
|
|
||||||
Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), (context, scriptable, scriptable1, objects) -> objects[1]);
|
|
||||||
return param;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.mozilla.javascript.NativeObject;
|
|
||||||
|
|
||||||
import dagger.android.HasAndroidInjector;
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
|
|
||||||
|
|
||||||
public class DetermineBasalResultMA extends APSResult {
|
|
||||||
private AAPSLogger aapsLogger;
|
|
||||||
|
|
||||||
private double eventualBG;
|
|
||||||
private double snoozeBG;
|
|
||||||
private String mealAssist;
|
|
||||||
|
|
||||||
DetermineBasalResultMA(HasAndroidInjector injector, NativeObject result, JSONObject j) {
|
|
||||||
this(injector);
|
|
||||||
json = j;
|
|
||||||
if (result.containsKey("error")) {
|
|
||||||
reason = (String) result.get("error");
|
|
||||||
tempBasalRequested = false;
|
|
||||||
rate = -1;
|
|
||||||
duration = -1;
|
|
||||||
mealAssist = "";
|
|
||||||
} else {
|
|
||||||
reason = result.get("reason").toString();
|
|
||||||
eventualBG = (Double) result.get("eventualBG");
|
|
||||||
snoozeBG = (Double) result.get("snoozeBG");
|
|
||||||
if (result.containsKey("rate")) {
|
|
||||||
rate = (Double) result.get("rate");
|
|
||||||
if (rate < 0d) rate = 0d;
|
|
||||||
tempBasalRequested = true;
|
|
||||||
} else {
|
|
||||||
rate = -1;
|
|
||||||
tempBasalRequested = false;
|
|
||||||
}
|
|
||||||
if (result.containsKey("duration")) {
|
|
||||||
duration = ((Double) result.get("duration")).intValue();
|
|
||||||
//changeRequested as above
|
|
||||||
} else {
|
|
||||||
duration = -1;
|
|
||||||
tempBasalRequested = false;
|
|
||||||
}
|
|
||||||
if (result.containsKey("mealAssist")) {
|
|
||||||
mealAssist = result.get("mealAssist").toString();
|
|
||||||
} else mealAssist = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private DetermineBasalResultMA(HasAndroidInjector injector) {
|
|
||||||
super(injector);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DetermineBasalResultMA newAndClone(HasAndroidInjector injector) {
|
|
||||||
DetermineBasalResultMA newResult = new DetermineBasalResultMA(injector);
|
|
||||||
doClone(newResult);
|
|
||||||
|
|
||||||
newResult.eventualBG = eventualBG;
|
|
||||||
newResult.snoozeBG = snoozeBG;
|
|
||||||
newResult.mealAssist = mealAssist;
|
|
||||||
return newResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSONObject json() {
|
|
||||||
try {
|
|
||||||
JSONObject ret = new JSONObject(this.json.toString());
|
|
||||||
return ret;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
aapsLogger.error(LTag.APS, "Unhandled exception", e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import dagger.android.support.DaggerFragment
|
|
||||||
import info.nightscout.androidaps.R
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateResultGui
|
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
|
||||||
import info.nightscout.androidaps.utils.JSONFormatter
|
|
||||||
import info.nightscout.androidaps.utils.extensions.plusAssign
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
|
||||||
import kotlinx.android.synthetic.main.openapsama_fragment.*
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
class OpenAPSMAFragment : DaggerFragment() {
|
|
||||||
private var disposable: CompositeDisposable = CompositeDisposable()
|
|
||||||
|
|
||||||
@Inject lateinit var rxBus: RxBusWrapper
|
|
||||||
@Inject lateinit var fabricPrivacy: FabricPrivacy
|
|
||||||
@Inject lateinit var openAPSMAPlugin: OpenAPSMAPlugin
|
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
|
||||||
savedInstanceState: Bundle?): View? {
|
|
||||||
return inflater.inflate(R.layout.openapsma_fragment, container, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
||||||
super.onViewCreated(view, savedInstanceState)
|
|
||||||
|
|
||||||
openapsma_run.setOnClickListener {
|
|
||||||
openAPSMAPlugin.invoke("OpenAPSMA button", false)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
override fun onResume() {
|
|
||||||
super.onResume()
|
|
||||||
|
|
||||||
disposable += rxBus
|
|
||||||
.toObservable(EventOpenAPSUpdateGui::class.java)
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe({
|
|
||||||
updateGUI()
|
|
||||||
}, { fabricPrivacy.logException(it) })
|
|
||||||
disposable += rxBus
|
|
||||||
.toObservable(EventOpenAPSUpdateResultGui::class.java)
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe({
|
|
||||||
updateResultGUI(it.text)
|
|
||||||
}, { fabricPrivacy.logException(it) })
|
|
||||||
updateGUI()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
override fun onPause() {
|
|
||||||
super.onPause()
|
|
||||||
disposable.clear()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
private fun updateGUI() {
|
|
||||||
if (openapsma_result == null) return
|
|
||||||
openAPSMAPlugin.lastAPSResult?.let { lastAPSResult ->
|
|
||||||
openapsma_result.text = JSONFormatter.format(lastAPSResult.json)
|
|
||||||
openapsma_request.text = lastAPSResult.toSpanned()
|
|
||||||
}
|
|
||||||
openAPSMAPlugin.lastDetermineBasalAdapterMAJS?.let { determineBasalAdapterMAJS ->
|
|
||||||
openapsma_glucosestatus.text = JSONFormatter.format(determineBasalAdapterMAJS.glucoseStatusParam)
|
|
||||||
openapsma_currenttemp.text = JSONFormatter.format(determineBasalAdapterMAJS.currentTempParam)
|
|
||||||
openapsma_iobdata.text = JSONFormatter.format(determineBasalAdapterMAJS.iobDataParam)
|
|
||||||
openapsma_profile.text = JSONFormatter.format(determineBasalAdapterMAJS.profileParam)
|
|
||||||
openapsma_mealdata.text = JSONFormatter.format(determineBasalAdapterMAJS.mealDataParam)
|
|
||||||
}
|
|
||||||
if (openAPSMAPlugin.lastAPSRun != 0L) {
|
|
||||||
openapsma_lastrun.text = DateUtil.dateAndTimeString(openAPSMAPlugin.lastAPSRun)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
private fun updateResultGUI(text: String) {
|
|
||||||
if (openapsma_result == null) return
|
|
||||||
openapsma_result.text = text
|
|
||||||
openapsma_glucosestatus.text = ""
|
|
||||||
openapsma_currenttemp.text = ""
|
|
||||||
openapsma_iobdata.text = ""
|
|
||||||
openapsma_profile.text = ""
|
|
||||||
openapsma_mealdata.text = ""
|
|
||||||
openapsma_request.text = ""
|
|
||||||
openapsma_lastrun.text = ""
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,232 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.aps.openAPSMA;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
|
|
||||||
import dagger.android.HasAndroidInjector;
|
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.data.IobTotal;
|
|
||||||
import info.nightscout.androidaps.data.MealData;
|
|
||||||
import info.nightscout.androidaps.data.Profile;
|
|
||||||
import info.nightscout.androidaps.db.TempTarget;
|
|
||||||
import info.nightscout.androidaps.interfaces.APSInterface;
|
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginType;
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateResultGui;
|
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
|
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
|
||||||
import info.nightscout.androidaps.utils.DateUtil;
|
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy;
|
|
||||||
import info.nightscout.androidaps.utils.HardLimits;
|
|
||||||
import info.nightscout.androidaps.utils.Profiler;
|
|
||||||
import info.nightscout.androidaps.utils.Round;
|
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
|
|
||||||
private final RxBusWrapper rxBus;
|
|
||||||
private final ConstraintChecker constraintChecker;
|
|
||||||
private final ResourceHelper resourceHelper;
|
|
||||||
private final ProfileFunction profileFunction;
|
|
||||||
private final Context context;
|
|
||||||
private final ActivePluginProvider activePlugin;
|
|
||||||
private final TreatmentsPlugin treatmentsPlugin;
|
|
||||||
private final IobCobCalculatorPlugin iobCobCalculatorPlugin;
|
|
||||||
private final HardLimits hardLimits;
|
|
||||||
|
|
||||||
// last values
|
|
||||||
DetermineBasalAdapterMAJS lastDetermineBasalAdapterMAJS = null;
|
|
||||||
long lastAPSRun = 0;
|
|
||||||
DetermineBasalResultMA lastAPSResult = null;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public OpenAPSMAPlugin(
|
|
||||||
HasAndroidInjector injector,
|
|
||||||
AAPSLogger aapsLogger,
|
|
||||||
RxBusWrapper rxBus,
|
|
||||||
ConstraintChecker constraintChecker,
|
|
||||||
ResourceHelper resourceHelper,
|
|
||||||
ProfileFunction profileFunction,
|
|
||||||
Context context,
|
|
||||||
ActivePluginProvider activePlugin,
|
|
||||||
TreatmentsPlugin treatmentsPlugin,
|
|
||||||
IobCobCalculatorPlugin iobCobCalculatorPlugin,
|
|
||||||
HardLimits hardLimits
|
|
||||||
) {
|
|
||||||
super(new PluginDescription()
|
|
||||||
.mainType(PluginType.APS)
|
|
||||||
.fragmentClass(OpenAPSMAFragment.class.getName())
|
|
||||||
.pluginName(R.string.openapsma)
|
|
||||||
.shortName(R.string.oaps_shortname)
|
|
||||||
.preferencesId(R.xml.pref_openapsma)
|
|
||||||
.description(R.string.description_ma),
|
|
||||||
aapsLogger, resourceHelper, injector
|
|
||||||
);
|
|
||||||
|
|
||||||
this.constraintChecker = constraintChecker;
|
|
||||||
this.resourceHelper = resourceHelper;
|
|
||||||
this.profileFunction = profileFunction;
|
|
||||||
this.context = context;
|
|
||||||
this.rxBus = rxBus;
|
|
||||||
this.activePlugin = activePlugin;
|
|
||||||
this.treatmentsPlugin = treatmentsPlugin;
|
|
||||||
this.iobCobCalculatorPlugin = iobCobCalculatorPlugin;
|
|
||||||
this.hardLimits = hardLimits;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean specialEnableCondition() {
|
|
||||||
try {
|
|
||||||
PumpInterface pump = activePlugin.getActivePump();
|
|
||||||
return pump.getPumpDescription().isTempBasalCapable;
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
// may fail during initialization
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean specialShowInListCondition() {
|
|
||||||
PumpInterface pump = activePlugin.getActivePump();
|
|
||||||
return pump.getPumpDescription().isTempBasalCapable;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public APSResult getLastAPSResult() {
|
|
||||||
return lastAPSResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getLastAPSRun() {
|
|
||||||
return lastAPSRun;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void invoke(String initiator, boolean tempBasalFallback) {
|
|
||||||
getAapsLogger().debug(LTag.APS, "invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
|
|
||||||
lastAPSResult = null;
|
|
||||||
DetermineBasalAdapterMAJS determineBasalAdapterMAJS;
|
|
||||||
determineBasalAdapterMAJS = new DetermineBasalAdapterMAJS(new ScriptReader(context), getInjector());
|
|
||||||
|
|
||||||
GlucoseStatus glucoseStatus = new GlucoseStatus(getInjector()).getGlucoseStatusData();
|
|
||||||
Profile profile = profileFunction.getProfile();
|
|
||||||
PumpInterface pump = activePlugin.getActivePump();
|
|
||||||
|
|
||||||
if (profile == null) {
|
|
||||||
rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.noprofileselected)));
|
|
||||||
getAapsLogger().debug(LTag.APS, resourceHelper.gs(R.string.noprofileselected));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isEnabled(PluginType.APS)) {
|
|
||||||
rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openapsma_disabled)));
|
|
||||||
getAapsLogger().debug(LTag.APS, resourceHelper.gs(R.string.openapsma_disabled));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glucoseStatus == null) {
|
|
||||||
rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openapsma_noglucosedata)));
|
|
||||||
getAapsLogger().debug(LTag.APS, resourceHelper.gs(R.string.openapsma_noglucosedata));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
double maxBasal = constraintChecker.getMaxBasalAllowed(profile).value();
|
|
||||||
|
|
||||||
double minBg = profile.getTargetLowMgdl();
|
|
||||||
double maxBg = profile.getTargetHighMgdl();
|
|
||||||
double targetBg = profile.getTargetMgdl();
|
|
||||||
|
|
||||||
minBg = Round.roundTo(minBg, 0.1d);
|
|
||||||
maxBg = Round.roundTo(maxBg, 0.1d);
|
|
||||||
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
treatmentsPlugin.updateTotalIOBTreatments();
|
|
||||||
treatmentsPlugin.updateTotalIOBTempBasals();
|
|
||||||
IobTotal bolusIob = treatmentsPlugin.getLastCalculationTreatments();
|
|
||||||
IobTotal basalIob = treatmentsPlugin.getLastCalculationTempBasals();
|
|
||||||
|
|
||||||
IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round();
|
|
||||||
|
|
||||||
MealData mealData = iobCobCalculatorPlugin.getMealData();
|
|
||||||
|
|
||||||
double maxIob = constraintChecker.getMaxIOBAllowed().value();
|
|
||||||
Profiler.log(getAapsLogger(), LTag.APS, "MA data gathering", start);
|
|
||||||
|
|
||||||
minBg = hardLimits.verifyHardLimits(minBg, "minBg", hardLimits.getVERY_HARD_LIMIT_MIN_BG()[0], hardLimits.getVERY_HARD_LIMIT_MIN_BG()[1]);
|
|
||||||
maxBg = hardLimits.verifyHardLimits(maxBg, "maxBg", hardLimits.getVERY_HARD_LIMIT_MAX_BG()[0], hardLimits.getVERY_HARD_LIMIT_MAX_BG()[1]);
|
|
||||||
targetBg = hardLimits.verifyHardLimits(targetBg, "targetBg", hardLimits.getVERY_HARD_LIMIT_TARGET_BG()[0], hardLimits.getVERY_HARD_LIMIT_TARGET_BG()[1]);
|
|
||||||
|
|
||||||
TempTarget tempTarget = treatmentsPlugin.getTempTargetFromHistory(System.currentTimeMillis());
|
|
||||||
if (tempTarget != null) {
|
|
||||||
minBg = hardLimits.verifyHardLimits(tempTarget.low, "minBg", hardLimits.getVERY_HARD_LIMIT_TEMP_MIN_BG()[0], hardLimits.getVERY_HARD_LIMIT_TEMP_MIN_BG()[1]);
|
|
||||||
maxBg = hardLimits.verifyHardLimits(tempTarget.high, "maxBg", hardLimits.getVERY_HARD_LIMIT_TEMP_MAX_BG()[0], hardLimits.getVERY_HARD_LIMIT_TEMP_MAX_BG()[1]);
|
|
||||||
targetBg = hardLimits.verifyHardLimits(tempTarget.target(), "targetBg", hardLimits.getVERY_HARD_LIMIT_TEMP_TARGET_BG()[0], hardLimits.getVERY_HARD_LIMIT_TEMP_TARGET_BG()[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hardLimits.checkOnlyHardLimits(profile.getDia(), "dia", hardLimits.getMINDIA(), hardLimits.getMAXDIA()))
|
|
||||||
return;
|
|
||||||
if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.getMINIC(), hardLimits.getMAXIC()))
|
|
||||||
return;
|
|
||||||
if (!hardLimits.checkOnlyHardLimits(profile.getIsfMgdl(), "sens", hardLimits.getMINISF(), hardLimits.getMAXISF()))
|
|
||||||
return;
|
|
||||||
if (!hardLimits.checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.02, hardLimits.maxBasal()))
|
|
||||||
return;
|
|
||||||
if (!hardLimits.checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, hardLimits.maxBasal()))
|
|
||||||
return;
|
|
||||||
|
|
||||||
start = System.currentTimeMillis();
|
|
||||||
try {
|
|
||||||
determineBasalAdapterMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, activePlugin.getActivePump().getBaseBasalRate(), iobTotal, glucoseStatus, mealData);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
FabricPrivacy.getInstance().logException(e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Profiler.log(getAapsLogger(), LTag.APS, "MA calculation", start);
|
|
||||||
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
|
|
||||||
DetermineBasalResultMA determineBasalResultMA = determineBasalAdapterMAJS.invoke();
|
|
||||||
if (determineBasalResultMA == null) {
|
|
||||||
getAapsLogger().error(LTag.APS, "MA calculation returned null");
|
|
||||||
lastDetermineBasalAdapterMAJS = null;
|
|
||||||
lastAPSResult = null;
|
|
||||||
lastAPSRun = 0;
|
|
||||||
} else {
|
|
||||||
// Fix bug determine basal
|
|
||||||
if (determineBasalResultMA.rate == 0d && determineBasalResultMA.duration == 0 && !treatmentsPlugin.isTempBasalInProgress())
|
|
||||||
determineBasalResultMA.tempBasalRequested = false;
|
|
||||||
|
|
||||||
determineBasalResultMA.iob = iobTotal;
|
|
||||||
|
|
||||||
try {
|
|
||||||
determineBasalResultMA.json.put("timestamp", DateUtil.toISOString(now));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
getAapsLogger().error(LTag.APS, "Unhandled exception", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastDetermineBasalAdapterMAJS = determineBasalAdapterMAJS;
|
|
||||||
lastAPSResult = determineBasalResultMA;
|
|
||||||
lastAPSRun = now;
|
|
||||||
}
|
|
||||||
rxBus.send(new EventOpenAPSUpdateGui());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -29,7 +29,7 @@ import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
import info.nightscout.androidaps.logging.LTag;
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.LoggerCallback;
|
import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
||||||
|
|
|
@ -10,8 +10,8 @@ import dagger.android.support.DaggerFragment
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateResultGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateResultGui
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
|
|
|
@ -26,8 +26,8 @@ import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
import info.nightscout.androidaps.logging.LTag;
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
|
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui;
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateResultGui;
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateResultGui;
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction;
|
||||||
|
|
|
@ -20,7 +20,6 @@ import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin;
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin;
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin;
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin;
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin;
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
|
||||||
|
@ -42,7 +41,6 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
||||||
private RxBusWrapper rxBus;
|
private RxBusWrapper rxBus;
|
||||||
private ConstraintChecker constraintChecker;
|
private ConstraintChecker constraintChecker;
|
||||||
private OpenAPSAMAPlugin openAPSAMAPlugin;
|
private OpenAPSAMAPlugin openAPSAMAPlugin;
|
||||||
private OpenAPSMAPlugin openAPSMAPlugin;
|
|
||||||
private OpenAPSSMBPlugin openAPSSMBPlugin;
|
private OpenAPSSMBPlugin openAPSSMBPlugin;
|
||||||
private SensitivityOref1Plugin sensitivityOref1Plugin;
|
private SensitivityOref1Plugin sensitivityOref1Plugin;
|
||||||
private ActivePluginProvider activePlugin;
|
private ActivePluginProvider activePlugin;
|
||||||
|
@ -59,7 +57,6 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
||||||
RxBusWrapper rxBus,
|
RxBusWrapper rxBus,
|
||||||
ConstraintChecker constraintChecker,
|
ConstraintChecker constraintChecker,
|
||||||
OpenAPSAMAPlugin openAPSAMAPlugin,
|
OpenAPSAMAPlugin openAPSAMAPlugin,
|
||||||
OpenAPSMAPlugin openAPSMAPlugin,
|
|
||||||
OpenAPSSMBPlugin openAPSSMBPlugin,
|
OpenAPSSMBPlugin openAPSSMBPlugin,
|
||||||
SensitivityOref1Plugin sensitivityOref1Plugin,
|
SensitivityOref1Plugin sensitivityOref1Plugin,
|
||||||
ActivePluginProvider activePlugin,
|
ActivePluginProvider activePlugin,
|
||||||
|
@ -80,7 +77,6 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
||||||
this.rxBus = rxBus;
|
this.rxBus = rxBus;
|
||||||
this.constraintChecker = constraintChecker;
|
this.constraintChecker = constraintChecker;
|
||||||
this.openAPSAMAPlugin = openAPSAMAPlugin;
|
this.openAPSAMAPlugin = openAPSAMAPlugin;
|
||||||
this.openAPSMAPlugin = openAPSMAPlugin;
|
|
||||||
this.openAPSSMBPlugin = openAPSSMBPlugin;
|
this.openAPSSMBPlugin = openAPSSMBPlugin;
|
||||||
this.sensitivityOref1Plugin = sensitivityOref1Plugin;
|
this.sensitivityOref1Plugin = sensitivityOref1Plugin;
|
||||||
this.activePlugin = activePlugin;
|
this.activePlugin = activePlugin;
|
||||||
|
@ -276,8 +272,6 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
||||||
maxIobPref = sp.getDouble(R.string.key_openapsma_max_iob, 1.5d);
|
maxIobPref = sp.getDouble(R.string.key_openapsma_max_iob, 1.5d);
|
||||||
maxIob.setIfSmaller(getAapsLogger(), maxIobPref, String.format(getResourceHelper().gs(R.string.limitingiob), maxIobPref, getResourceHelper().gs(R.string.maxvalueinpreferences)), this);
|
maxIob.setIfSmaller(getAapsLogger(), maxIobPref, String.format(getResourceHelper().gs(R.string.limitingiob), maxIobPref, getResourceHelper().gs(R.string.maxvalueinpreferences)), this);
|
||||||
|
|
||||||
if (openAPSMAPlugin.isEnabled(PluginType.APS))
|
|
||||||
maxIob.setIfSmaller(getAapsLogger(), hardLimits.maxIobAMA(), String.format(getResourceHelper().gs(R.string.limitingiob), hardLimits.maxIobAMA(), getResourceHelper().gs(R.string.hardlimit)), this);
|
|
||||||
if (openAPSAMAPlugin.isEnabled(PluginType.APS))
|
if (openAPSAMAPlugin.isEnabled(PluginType.APS))
|
||||||
maxIob.setIfSmaller(getAapsLogger(), hardLimits.maxIobAMA(), String.format(getResourceHelper().gs(R.string.limitingiob), hardLimits.maxIobAMA(), getResourceHelper().gs(R.string.hardlimit)), this);
|
maxIob.setIfSmaller(getAapsLogger(), hardLimits.maxIobAMA(), String.format(getResourceHelper().gs(R.string.limitingiob), hardLimits.maxIobAMA(), getResourceHelper().gs(R.string.hardlimit)), this);
|
||||||
if (openAPSSMBPlugin.isEnabled(PluginType.APS))
|
if (openAPSSMBPlugin.isEnabled(PluginType.APS))
|
||||||
|
|
|
@ -22,7 +22,7 @@ import info.nightscout.androidaps.interfaces.PluginType
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
|
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
|
||||||
|
|
|
@ -11,7 +11,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
import info.nightscout.androidaps.interfaces.PluginType
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.events.EventOpenAPSUpdateGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
|
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress
|
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress
|
||||||
|
|
|
@ -7,7 +7,6 @@ import info.nightscout.androidaps.MainApp
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.TestBaseWithProfile
|
import info.nightscout.androidaps.TestBaseWithProfile
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin
|
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
|
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
|
@ -44,7 +43,7 @@ import java.util.*
|
||||||
* Created by mike on 18.03.2018.
|
* Created by mike on 18.03.2018.
|
||||||
*/
|
*/
|
||||||
@RunWith(PowerMockRunner::class)
|
@RunWith(PowerMockRunner::class)
|
||||||
@PrepareForTest(MainApp::class, ConfigBuilderPlugin::class, ConstraintChecker::class, SP::class, Context::class, OpenAPSMAPlugin::class, OpenAPSAMAPlugin::class, OpenAPSSMBPlugin::class, TreatmentsPlugin::class, TreatmentService::class, VirtualPumpPlugin::class, DetailedBolusInfoStorage::class, GlimpPlugin::class)
|
@PrepareForTest(MainApp::class, ConfigBuilderPlugin::class, ConstraintChecker::class, SP::class, Context::class, OpenAPSAMAPlugin::class, OpenAPSSMBPlugin::class, TreatmentsPlugin::class, TreatmentService::class, VirtualPumpPlugin::class, DetailedBolusInfoStorage::class, GlimpPlugin::class)
|
||||||
class ConstraintsCheckerTest : TestBaseWithProfile() {
|
class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
|
|
||||||
@Mock lateinit var activePlugin: ActivePluginProvider
|
@Mock lateinit var activePlugin: ActivePluginProvider
|
||||||
|
@ -70,7 +69,6 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
private lateinit var insightPlugin: LocalInsightPlugin
|
private lateinit var insightPlugin: LocalInsightPlugin
|
||||||
private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
|
private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
|
||||||
private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
|
private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
|
||||||
private lateinit var openAPSMAPlugin: OpenAPSMAPlugin
|
|
||||||
private lateinit var hardLimits: HardLimits
|
private lateinit var hardLimits: HardLimits
|
||||||
|
|
||||||
val injector = HasAndroidInjector {
|
val injector = HasAndroidInjector {
|
||||||
|
@ -119,8 +117,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, treatmentsPlugin, sp, commandQueue, profileFunction, context)
|
insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, treatmentsPlugin, sp, commandQueue, profileFunction, context)
|
||||||
openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits)
|
openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits)
|
||||||
openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits)
|
openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits)
|
||||||
openAPSMAPlugin = OpenAPSMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits)
|
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, buildHelper, treatmentsPlugin)
|
||||||
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, buildHelper, treatmentsPlugin)
|
|
||||||
val constraintsPluginsList = ArrayList<PluginBase?>()
|
val constraintsPluginsList = ArrayList<PluginBase?>()
|
||||||
constraintsPluginsList.add(safetyPlugin)
|
constraintsPluginsList.add(safetyPlugin)
|
||||||
constraintsPluginsList.add(objectivesPlugin)
|
constraintsPluginsList.add(objectivesPlugin)
|
||||||
|
@ -316,7 +313,6 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
`when`(sp.getDouble(R.string.key_openapsma_max_iob, 1.5)).thenReturn(1.5)
|
`when`(sp.getDouble(R.string.key_openapsma_max_iob, 1.5)).thenReturn(1.5)
|
||||||
`when`(sp.getString(R.string.key_age, "")).thenReturn("teenage")
|
`when`(sp.getString(R.string.key_age, "")).thenReturn("teenage")
|
||||||
openAPSAMAPlugin.setPluginEnabled(PluginType.APS, true)
|
openAPSAMAPlugin.setPluginEnabled(PluginType.APS, true)
|
||||||
openAPSMAPlugin.setPluginEnabled(PluginType.APS, false)
|
|
||||||
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, false)
|
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, false)
|
||||||
|
|
||||||
// Apply all limits
|
// Apply all limits
|
||||||
|
@ -333,7 +329,6 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
`when`(sp.getString(R.string.key_age, "")).thenReturn("teenage")
|
`when`(sp.getString(R.string.key_age, "")).thenReturn("teenage")
|
||||||
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
|
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
|
||||||
openAPSAMAPlugin.setPluginEnabled(PluginType.APS, false)
|
openAPSAMAPlugin.setPluginEnabled(PluginType.APS, false)
|
||||||
openAPSMAPlugin.setPluginEnabled(PluginType.APS, false)
|
|
||||||
|
|
||||||
// Apply all limits
|
// Apply all limits
|
||||||
val d = constraintChecker.getMaxIOBAllowed()
|
val d = constraintChecker.getMaxIOBAllowed()
|
||||||
|
|
Loading…
Reference in a new issue