diff --git a/apps/powermanager/boot.js b/apps/powermanager/boot.js index 2bc2aaa35..801c1f48a 100644 --- a/apps/powermanager/boot.js +++ b/apps/powermanager/boot.js @@ -3,11 +3,89 @@ require('Storage').readJSON("powermanager.default.json", true) || {}, require('Storage').readJSON("powermanager.json", true) || {} ); - + + if (settings.log) { + let logFile = require('Storage').open("powermanager.log","a"); + let def = require('Storage').readJSON("powermanager.def.json", true) || {}; + if (!def.start) def.start = Date.now(); + if (!def.deferred) def.deferred = {}; + let sen = require('Storage').readJSON("powermanager.sen.json", true) || {}; + if (!sen.start) sen.start = Date.now(); + if (!sen.power) sen.power = {}; + + E.on("kill", ()=>{ + let defExists = require("Storage").read("powermanager.def.json")!==undefined; + if (!(!defExists && def.saved)){ + def.saved = Date.now(); + require('Storage').writeJSON("powermanager.def.json", def); + } + let senExists = require("Storage").read("powermanager.sen.json")!==undefined; + if (!(!senExists && sen.saved)){ + sen.saved = Date.now(); + require('Storage').writeJSON("powermanager.sen.json", sen); + } + }); + + + let logPower = (type, oldstate, state, app) => { + logFile.write("p," + type + ',' + (oldstate?1:0) + ',' + (state?1:0) + ',' + app + "\n"); + }; + let logDeferred = (type, duration, source) => { + logFile.write(type + ',' + duration + ',' + source + "\n"); + }; + + let lastPowerOn = {}; + + const TO_WRAP = ["GPS","Compass","Barometer","HRM","LCD"]; + for (let c of TO_WRAP){ + let functionName = "set" + c + "Power"; + let checkName = "is" + c + "On"; + let type = c + ""; + if (!sen.power[type]) sen.power[type] = 0; + + lastPowerOn[type] = Date.now(); + + Bangle[functionName] = ((o) => (a,b) => { + let oldstate = Bangle[checkName](); + let result = o(a,b); + if (!(oldstate && result)) { + if (result) { + //switched on, store time + lastPowerOn[type] = Date.now(); + } else { + //switched off + sen.power[type] += Date.now() - lastPowerOn[type]; + } + } + if (settings.logDetails) logPower(type, oldstate, result, b); + return result; + })(Bangle[functionName]); + } + + let functions = {}; + + let wrapDeferred = ((o,t) => (a,b,c,d) => { + let wrapped = (q,w,e,r)=>{ + let start = Date.now(); + let result = a(q,w,e,r); + let end = Date.now()-start; + let f = a.toString().substring(0,100); + if (settings.logDetails) logDeferred(t, end, f); + if (!def.deferred[f]) def.deferred[f] = 0; + def.deferred[f] += end; + return result; + }; + return o(wrapped,b,c,d); + }); + + global.setTimeout = wrapDeferred(global.setTimeout, "t"); + global.setInterval = wrapDeferred(global.setInterval, "i"); + } + if (settings.warnEnabled){ var chargingInterval; - function handleCharging(charging){ + let handleCharging = (charging) => { if (charging){ if (chargingInterval) clearInterval(chargingInterval); chargingInterval = setInterval(()=>{ @@ -20,12 +98,12 @@ clearInterval(chargingInterval); chargingInterval = undefined; } - } + }; Bangle.on("charging",handleCharging); handleCharging(Bangle.isCharging()); } - + if (settings.forceMonoPercentage){ var p = (E.getBattery()+E.getBattery()+E.getBattery()+E.getBattery())/4; var op = E.getBattery; diff --git a/apps/powermanager/default.json b/apps/powermanager/default.json index 6c929dc38..457f79610 100644 --- a/apps/powermanager/default.json +++ b/apps/powermanager/default.json @@ -2,5 +2,6 @@ "warnEnabled": false, "warn": 96, "forceMonoVoltage": false, - "forceMonoPercentage": false + "forceMonoPercentage": false, + "log": false } diff --git a/apps/powermanager/interface.html b/apps/powermanager/interface.html new file mode 100644 index 000000000..9434ac16f --- /dev/null +++ b/apps/powermanager/interface.html @@ -0,0 +1,273 @@ + + + + + +
+ + + + + diff --git a/apps/powermanager/metadata.json b/apps/powermanager/metadata.json index 456831aa9..3bfa47d88 100644 --- a/apps/powermanager/metadata.json +++ b/apps/powermanager/metadata.json @@ -9,6 +9,7 @@ "tags": "tool", "supports": ["BANGLEJS2"], "readme": "README.md", + "interface": "interface.html", "storage": [ {"name":"powermanager.boot.js","url":"boot.js"}, {"name":"powermanager.settings.js","url":"settings.js"}, diff --git a/apps/powermanager/settings.js b/apps/powermanager/settings.js index fe4719275..9df8b3534 100644 --- a/apps/powermanager/settings.js +++ b/apps/powermanager/settings.js @@ -36,6 +36,12 @@ writeSettings("forceMonoVoltage", v); } }, + 'Log': { + value: !!settings.log, + onchange: v => { + writeSettings("log", v); + } + }, 'Charge warning': function() { E.showMenu(submenu_chargewarn); },