diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java index 8875f04964..987e6410f2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java @@ -9,11 +9,14 @@ 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; @@ -42,91 +45,10 @@ public class DetermineBasalAdapterMAJS { private String storedProfile = null; private String storedMeal_data = null; - /** - * Main code - */ - public DetermineBasalAdapterMAJS(ScriptReader scriptReader) throws IOException { mScriptReader = scriptReader; - - //initLogCallback(); - //initProcessExitCallback(); - /* try { - setTestData(); - rhinotest(); - } catch (JSONException e) { - e.printStackTrace(); - }*/ - } - public void rhinotest(){ - Context rhino = Context.enter(); - Scriptable scope = rhino.initStandardObjects(); - // Turn off optimization to make Rhino Android compatible - rhino.setOptimizationLevel(-1); - - try { - //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); - - - // Get the functionName defined in JavaScriptCode - // Object obj = scope.get(functionNameInJavaScriptCode, scope); - Object determineBasalObj = scope.get("determine_basal", scope); - - Object setTempBasalObj = scope.get("setTempBasal", scope); - - 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 String - String result = NativeJSON.stringify(rhino, scope, jsResult, null, null).toString(); - log.debug("rhino result: + " + result); - } else { - log.debug("Problem loading JS Functions"); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - Context.exit(); - } - } - - public Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) { - Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), new Callable() { - @Override - public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) { - return objects[1]; - } - }); - return param; - } - - public DetermineBasalResultMA invoke() { DetermineBasalResultMA determineBasalResultMA = null; @@ -136,6 +58,12 @@ public class DetermineBasalAdapterMAJS { 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); @@ -148,12 +76,7 @@ public class DetermineBasalAdapterMAJS { "return rT;" + "};"; rhino.evaluateString(scope, setTempBasalCode, "setTempBasal.js", 0, null); - - - // Get the functionName defined in JavaScriptCode - // Object obj = scope.get(functionNameInJavaScriptCode, scope); Object determineBasalObj = scope.get("determine_basal", scope); - Object setTempBasalObj = scope.get("setTempBasal", scope); if (determineBasalObj instanceof Function && setTempBasalObj instanceof Function) { @@ -186,6 +109,14 @@ public class DetermineBasalAdapterMAJS { } } catch (IOException e) { log.debug("IOException"); + } catch (RhinoException e){ + log.error("RhinoException: (" + e.lineNumber() + ","+ e.columnNumber() + ") " + e.toString()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); } finally { Context.exit(); } @@ -219,37 +150,6 @@ public class DetermineBasalAdapterMAJS { return storedMeal_data; } - /* - private void initProcessExitCallback() { - JavaVoidCallback callbackProccessExit = new JavaVoidCallback() { - @Override - public void invoke(V8Object arg0, V8Array parameters) { - if (parameters.length() > 0) { - Object arg1 = parameters.get(0); - log.error("ProccessExit " + arg1); - } - } - }; - mV8rt.registerJavaMethod(callbackProccessExit, "proccessExit"); - mV8rt.executeVoidScript("var process = {\"exit\": function () { proccessExit(); } };"); - } - - private void initLogCallback() { - JavaVoidCallback callbackLog = new JavaVoidCallback() { - @Override - public void invoke(V8Object arg0, V8Array parameters) { - if (parameters.length() > 0) { - Object arg1 = parameters.get(0); - if (Config.logAPSResult) - log.debug("Input params: " + arg1); - } - } - }; - mV8rt.registerJavaMethod(callbackLog, "log"); - mV8rt.executeVoidScript("var console = {\"log\":log, \"error\":log};"); - } -*/ - public void setData(Profile profile, double maxIob, double maxBasal, @@ -307,50 +207,6 @@ public class DetermineBasalAdapterMAJS { mMealData.put("boluses", mealData.boluses); } - public void setTestData() throws JSONException { - - mProfile = new JSONObject(); - mProfile.put("max_iob", 5d); - mProfile.put("dia", 3d); - mProfile.put("type", "current"); - mProfile.put("max_daily_basal", 1d); - mProfile.put("max_basal", 4d); - mProfile.put("min_bg", 89d); - mProfile.put("max_bg", 91d); - mProfile.put("target_bg", 90d); - mProfile.put("carb_ratio", 5d); - mProfile.put("sens", 40d); - - mProfile.put("current_basal", 0.8); - - if (true) { - mProfile.put("out_units", "mmol/L"); - } - - mCurrentTemp = new JSONObject(); - mCurrentTemp.put("duration", 15d); - mCurrentTemp.put("rate", 0.2d); - - mIobData = new JSONObject(); - mIobData.put("iob", -0.1d); //netIob - mIobData.put("activity", -0.003d); //netActivity - mIobData.put("bolussnooze", 0d); //bolusIob - mIobData.put("basaliob", -0.1d); - mIobData.put("netbasalinsulin", -0.11); - mIobData.put("hightempinsulin", 0.03); - - mGlucoseStatus = new JSONObject(); - mGlucoseStatus.put("glucose", 170); - mGlucoseStatus.put("delta", 1.93); - - mGlucoseStatus.put("avgdelta", 2.1); - - mMealData = new JSONObject(); - mMealData.put("carbs", 0); - mMealData.put("boluses", 0); - } - - public String readFile(String filename) throws IOException { byte[] bytes = mScriptReader.readFile(filename); String string = new String(bytes, "UTF-8"); @@ -360,4 +216,14 @@ public class DetermineBasalAdapterMAJS { return string; } + public Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) { + Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), new Callable() { + @Override + public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) { + return objects[1]; + } + }); + return param; + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java new file mode 100644 index 0000000000..3f03e24699 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java @@ -0,0 +1,40 @@ +package info.nightscout.androidaps.plugins.OpenAPSMA; + +import org.mozilla.javascript.ScriptableObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.utils.ToastUtils; + +/** + * Created by adrian on 15/10/17. + */ + + +public class LoggerCallback extends ScriptableObject { + + private static Logger log = LoggerFactory.getLogger(DetermineBasalAdapterMAJS.class); + + + public LoggerCallback() { + //empty constructor needed for Rhino + } + + @Override + public String getClassName() { + return "LoggerCallback"; + } + + public void jsConstructor() { + //empty constructor on JS site; could work as setter + } + + public void jsFunction_log(String s) { + log.debug(s); + } + + public void jsFunction_error(String s) { + log.error(s); + } +} \ No newline at end of file