mirror of https://github.com/espruino/BangleApps
powermanager - Cleanup interface UI
parent
6104946a08
commit
48ac083189
|
@ -9,9 +9,9 @@
|
||||||
let def = require('Storage').readJSON("powermanager.def.json", true) || {};
|
let def = require('Storage').readJSON("powermanager.def.json", true) || {};
|
||||||
if (!def.start) def.start = Date.now();
|
if (!def.start) def.start = Date.now();
|
||||||
if (!def.deferred) def.deferred = {};
|
if (!def.deferred) def.deferred = {};
|
||||||
let sen = require('Storage').readJSON("powermanager.sen.json", true) || {};
|
let hw = require('Storage').readJSON("powermanager.hw.json", true) || {};
|
||||||
if (!sen.start) sen.start = Date.now();
|
if (!hw.start) hw.start = Date.now();
|
||||||
if (!sen.power) sen.power = {};
|
if (!hw.power) hw.power = {};
|
||||||
|
|
||||||
const saveEvery = 1000 * 60 * 5;
|
const saveEvery = 1000 * 60 * 5;
|
||||||
const TO_WRAP = ["GPS","Compass","Barometer","HRM","LCD"];
|
const TO_WRAP = ["GPS","Compass","Barometer","HRM","LCD"];
|
||||||
|
@ -22,10 +22,10 @@
|
||||||
def.saved = Date.now();
|
def.saved = Date.now();
|
||||||
require('Storage').writeJSON("powermanager.def.json", def);
|
require('Storage').writeJSON("powermanager.def.json", def);
|
||||||
}
|
}
|
||||||
let senExists = require("Storage").read("powermanager.sen.json")!==undefined;
|
let hwExists = require("Storage").read("powermanager.hw.json")!==undefined;
|
||||||
if (!(!senExists && sen.saved)){
|
if (!(!hwExists && hw.saved)){
|
||||||
sen.saved = Date.now();
|
hw.saved = Date.now();
|
||||||
require('Storage').writeJSON("powermanager.sen.json", sen);
|
require('Storage').writeJSON("powermanager.hw.json", hw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
E.on("kill", ()=>{
|
E.on("kill", ()=>{
|
||||||
for (let c of TO_WRAP){
|
for (let c of TO_WRAP){
|
||||||
if (lastPowerOn[c] && Bangle["is"+c+"On"]()){
|
if (lastPowerOn[c] && Bangle["is"+c+"On"]()){
|
||||||
sen.power[c] += Date.now() - lastPowerOn[c];
|
hw.power[c] += Date.now() - lastPowerOn[c];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
save();
|
save();
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
logFile.write("p," + type + ',' + (oldstate?1:0) + ',' + (state?1:0) + ',' + app + "\n");
|
logFile.write("p," + type + ',' + (oldstate?1:0) + ',' + (state?1:0) + ',' + app + "\n");
|
||||||
};
|
};
|
||||||
let logDeferred = (type, duration, source) => {
|
let logDeferred = (type, duration, source) => {
|
||||||
logFile.write(type + ',' + duration + ',' + source + "\n");
|
logFile.write(type + ',' + duration + ',' + source.replace(/\n/g, " ").replace(/,/g,"") + "\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
let lastPowerOn = {};
|
let lastPowerOn = {};
|
||||||
|
@ -66,7 +66,7 @@
|
||||||
lastPowerOn[type] = Date.now();
|
lastPowerOn[type] = Date.now();
|
||||||
} else if (lastPowerOn[type] && !result){
|
} else if (lastPowerOn[type] && !result){
|
||||||
//switched off
|
//switched off
|
||||||
sen.power[type] += Date.now() - lastPowerOn[type];
|
hw.power[type] += Date.now() - lastPowerOn[type];
|
||||||
lastPowerOn[type] = undefined;
|
lastPowerOn[type] = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,23 +76,28 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let functions = {};
|
let functions = {};
|
||||||
|
|
||||||
let wrapDeferred = ((o,t) => (a) => {
|
let wrapDeferred = ((o,t) => (a) => {
|
||||||
if (a == eval){
|
if (a == eval){
|
||||||
return o.apply(this, arguments);
|
return o.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
let wrapped = ()=>{
|
let wrapped = a;
|
||||||
let start = Date.now();
|
if (!a.__wrapped){
|
||||||
let result = a.apply(undefined, arguments.slice(1));
|
wrapped = ()=>{
|
||||||
let end = Date.now()-start;
|
let start = Date.now();
|
||||||
let f = a.toString().substring(0,100);
|
let result = a.apply(undefined, arguments.slice(1));
|
||||||
if (settings.logDetails) logDeferred(t, end, f);
|
let end = Date.now()-start;
|
||||||
if (!def.deferred[f]) def.deferred[f] = 0;
|
let f = a.toString().substring(0,100);
|
||||||
def.deferred[f] += end;
|
if (settings.logDetails) logDeferred(t, end, f);
|
||||||
return result;
|
if (!def.deferred[f]) def.deferred[f] = 0;
|
||||||
};
|
def.deferred[f] += end;
|
||||||
for (let p in a){
|
return result;
|
||||||
wrapped[p] = a[p];
|
};
|
||||||
|
//copy over properties of functions
|
||||||
|
for (let p in a){
|
||||||
|
wrapped[p] = a[p];
|
||||||
|
}
|
||||||
|
//mark function as wrapped
|
||||||
|
wrapped.__wrapped = true;
|
||||||
}
|
}
|
||||||
let newArgs = arguments.slice();
|
let newArgs = arguments.slice();
|
||||||
newArgs[0] = wrapped;
|
newArgs[0] = wrapped;
|
||||||
|
@ -156,4 +161,4 @@
|
||||||
if (!charging) chargeStart = undefined;
|
if (!charging) chargeStart = undefined;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})();
|
})();
|
|
@ -21,7 +21,7 @@ function show() {
|
||||||
Util.showModal("Loading...");
|
Util.showModal("Loading...");
|
||||||
domContent.innerHTML = "";
|
domContent.innerHTML = "";
|
||||||
var htmlOverview = `<table class="table table-striped table-hover">
|
var htmlOverview = `<table class="table table-striped table-hover">
|
||||||
<div>This needs "Log" to be enabled in power manager settings. The deferred function calls table is only updated on the bangle on reloads.</div>
|
<div>This needs "Logging" to be enabled in power manager settings. The deferred function calls table is only updated on the bangle on reloads.</div>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
|
@ -37,14 +37,14 @@ function show() {
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Sensors</td>
|
<td>Hardware</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="btn btn-primary" filename="powermanager.sen.json" task="sensorstable">Table</button>
|
<button class="btn btn-primary" filename="powermanager.hw.json" task="hardwaretable">Table</button>
|
||||||
<button class="btn btn-error" filename="powermanager.sen.json" task="clear" style="float: right;margin-right: 5px;">Clear</button>
|
<button class="btn btn-error" filename="powermanager.hw.json" task="clear" style="float: right;margin-right: 5px;">Clear</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Details</td>
|
<td>Details (Trace)</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="btn btn-primary" filename="powermanager.log" task="detailstable">Table</button>
|
<button class="btn btn-primary" filename="powermanager.log" task="detailstable">Table</button>
|
||||||
<button class="btn btn-error" filename="powermanager.log" task="detailsclear" style="float: right;margin-right: 5px;">Clear</button>
|
<button class="btn btn-error" filename="powermanager.log" task="detailsclear" style="float: right;margin-right: 5px;">Clear</button>
|
||||||
|
@ -78,8 +78,8 @@ function show() {
|
||||||
if (task=="deftable") {
|
if (task=="deftable") {
|
||||||
viewDeferredTable(filename);
|
viewDeferredTable(filename);
|
||||||
}
|
}
|
||||||
if (task=="sensorstable") {
|
if (task=="hardwaretable") {
|
||||||
viewSensorsTable(filename);
|
viewHardwareTable(filename);
|
||||||
}
|
}
|
||||||
if (task=="detailstable") {
|
if (task=="detailstable") {
|
||||||
viewDetailsTable(filename);
|
viewDetailsTable(filename);
|
||||||
|
@ -110,7 +110,7 @@ function viewDeferredTable(filename) {
|
||||||
tableRows += `<tr>
|
tableRows += `<tr>
|
||||||
<td>${(c.time/1000).toFixed(2)}s</td>
|
<td>${(c.time/1000).toFixed(2)}s</td>
|
||||||
<td>${(c.time/sum*100).toFixed(2)}%</td>
|
<td>${(c.time/sum*100).toFixed(2)}%</td>
|
||||||
<td>${c.func}</td>`
|
<td><pre>${c.func}</pre></td>`
|
||||||
}
|
}
|
||||||
|
|
||||||
let duration = parsed.saved - parsed.start;
|
let duration = parsed.saved - parsed.start;
|
||||||
|
@ -165,15 +165,15 @@ function viewDeferredTable(filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function viewSensorsTable(filename) {
|
function viewHardwareTable(filename) {
|
||||||
Puck.eval(`require("Storage").list("powermanager.sen.json").length > 0`, (f)=>{
|
Puck.eval(`require("Storage").list("powermanager.hw.json").length > 0`, (f)=>{
|
||||||
if (f) {
|
if (f) {
|
||||||
Util.showModal("Reading sensor info...");
|
Util.showModal("Reading hardware info...");
|
||||||
Util.readStorage(
|
Util.readStorage(
|
||||||
filename, data => {
|
filename, data => {
|
||||||
Util.hideModal();
|
Util.hideModal();
|
||||||
let parsed = JSON.parse(data);
|
let parsed = JSON.parse(data);
|
||||||
console.log("Sensors", parsed);
|
console.log("Hardware", parsed);
|
||||||
let duration = parsed.saved - parsed.start;
|
let duration = parsed.saved - parsed.start;
|
||||||
|
|
||||||
let rows = [];
|
let rows = [];
|
||||||
|
@ -191,7 +191,7 @@ function viewSensorsTable(filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var htmlOverview = `<h1>Sensor power</h1>
|
var htmlOverview = `<h1>Hardware power</h1>
|
||||||
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;margin-left: 10px;">Back</button>
|
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;margin-left: 10px;">Back</button>
|
||||||
<div>
|
<div>
|
||||||
Recorded in a time span of <b>${Math.round(duration/1000)}s</b>. Percentages are calculated from recording time.
|
Recorded in a time span of <b>${Math.round(duration/1000)}s</b>. Percentages are calculated from recording time.
|
||||||
|
@ -201,7 +201,7 @@ function viewSensorsTable(filename) {
|
||||||
<tr>
|
<tr>
|
||||||
<th>Time</th>
|
<th>Time</th>
|
||||||
<th>Percentage</th>
|
<th>Percentage</th>
|
||||||
<th>Sensor</th>
|
<th>Device</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>\n`;
|
<tbody>\n`;
|
||||||
|
@ -213,7 +213,7 @@ function viewSensorsTable(filename) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var htmlOverview = `<h1>Sensor power</h1>
|
var htmlOverview = `<h1>Hardware power</h1>
|
||||||
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;">Back</button>
|
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;">Back</button>
|
||||||
<div>
|
<div>
|
||||||
No data available.
|
No data available.
|
||||||
|
@ -234,16 +234,11 @@ function viewDetailsTable(filename) {
|
||||||
Util.hideModal();
|
Util.hideModal();
|
||||||
|
|
||||||
var htmlOverview = `<h1>Detailed logging</h1>
|
var htmlOverview = `<h1>Detailed logging</h1>
|
||||||
|
|
||||||
|
This is a trace log of all logged power entries, first column denotes the type. p for power, i for interval and t for timeout. Power is logged with old state, new state and calling app if available. Functions are logged with execution duraion and source if available.
|
||||||
|
|
||||||
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;">Back</button>
|
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;">Back</button>
|
||||||
<table class="table table-striped table-hover">
|
<table class="table table-striped table-hover">
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Type</th>
|
|
||||||
<th></th>
|
|
||||||
<th></th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>\n`;
|
<tbody>\n`;
|
||||||
let rows = data.trim().split("\n");
|
let rows = data.trim().split("\n");
|
||||||
for (var row of rows) {
|
for (var row of rows) {
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
{"name":"powermanager.default.json","url":"default.json"}
|
{"name":"powermanager.default.json","url":"default.json"}
|
||||||
],
|
],
|
||||||
"data": [
|
"data": [
|
||||||
{"name":"powermanager.sen.json"},
|
{"name":"powermanager.hw.json"},
|
||||||
{"name":"powermanager.def.json"},
|
{"name":"powermanager.def.json"},
|
||||||
{"name":"powermanager.log"}
|
{"name":"powermanager.log"}
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue