mirror of https://github.com/espruino/BangleApps
New power management app for setting a charging alarm and voltage offset
parent
eca4079828
commit
30ade21eac
|
@ -0,0 +1 @@
|
|||
0.01: New App!
|
|
@ -0,0 +1,15 @@
|
|||
# Power manager
|
||||
|
||||
Manages settings for charging. You can set a warning threshold to be able to disconnect the charger at a given percentage. Also allows to set the battery calibration offset.
|
||||
|
||||
## Internals
|
||||
|
||||
Battery calibration offset is set by writing `batFullVoltage` in setting.json
|
||||
|
||||
## TODO
|
||||
|
||||
* Optionally keep battery history and show as graph
|
||||
|
||||
## Creator
|
||||
|
||||
[halemmerich](https://github.com/halemmerich)
|
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1,29 @@
|
|||
(function() {
|
||||
var settings = Object.assign(
|
||||
require('Storage').readJSON("powermanager.default.json", true) || {},
|
||||
require('Storage').readJSON("powermanager.json", true) || {}
|
||||
);
|
||||
|
||||
if (settings.warnEnabled){
|
||||
print("Charge warning enabled");
|
||||
var chargingInterval;
|
||||
|
||||
function handleCharging(charging){
|
||||
if (charging){
|
||||
if (chargingInterval) clearInterval(chargingInterval);
|
||||
chargingInterval = setInterval(()=>{
|
||||
if (E.getBattery() > settings.warn){
|
||||
Bangle.buzz(1000);
|
||||
}
|
||||
}, 10000);
|
||||
}
|
||||
if (chargingInterval && !charging){
|
||||
clearInterval(chargingInterval);
|
||||
chargingInterval = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
Bangle.on("charging",handleCharging);
|
||||
handleCharging(Bangle.isCharging());
|
||||
}
|
||||
})();
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"warnEnabled": false,
|
||||
"warn": 96
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"id": "powermanager",
|
||||
"name": "Power Manager",
|
||||
"shortName": "Power Manager",
|
||||
"version": "0.01",
|
||||
"description": "Allow configuration of warnings and thresholds for battery charging and display.",
|
||||
"icon": "app.png",
|
||||
"type": "bootloader",
|
||||
"tags": "tool",
|
||||
"supports": ["BANGLEJS2"],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"powermanager.boot.js","url":"boot.js"},
|
||||
{"name":"powermanager.settings.js","url":"settings.js"},
|
||||
{"name":"powermanager.default.json","url":"default.json"}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
(function(back) {
|
||||
var systemsettings = require("Storage").readJSON("setting.json") || {};
|
||||
|
||||
function writeSettings(key, value) {
|
||||
var s = require('Storage').readJSON(FILE, true) || {};
|
||||
s[key] = value;
|
||||
require('Storage').writeJSON(FILE, s);
|
||||
readSettings();
|
||||
}
|
||||
|
||||
function readSettings() {
|
||||
settings = Object.assign(
|
||||
require('Storage').readJSON("powermanager.default.json", true) || {},
|
||||
require('Storage').readJSON(FILE, true) || {}
|
||||
);
|
||||
}
|
||||
|
||||
var FILE = "powermanager.json";
|
||||
var settings;
|
||||
readSettings();
|
||||
|
||||
var mainmenu = {
|
||||
'': {
|
||||
'title': 'Power Manager'
|
||||
},
|
||||
'< Back': back,
|
||||
'Charge warning': function() {
|
||||
E.showMenu(submenu_chargewarn);
|
||||
},
|
||||
'Calibrate': function() {
|
||||
E.showMenu(submenu_calibrate);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
function roundToDigits(number, stepsize) {
|
||||
return Math.round(number / stepsize) * stepsize;
|
||||
}
|
||||
|
||||
function getCurrentVoltageDirect() {
|
||||
return (analogRead(D3) + analogRead(D3) + analogRead(D3) + analogRead(D3)) / 4;
|
||||
}
|
||||
|
||||
var stepsize = 0.0002;
|
||||
var full = 0.32;
|
||||
|
||||
function getInitialCalibrationOffset() {
|
||||
return roundToDigits(systemsettings.batFullVoltage - full, stepsize) || 0;
|
||||
}
|
||||
|
||||
|
||||
var submenu_calibrate = {
|
||||
'': {
|
||||
title: "Calibrate"
|
||||
},
|
||||
'< Back': function() {
|
||||
E.showMenu(mainmenu);
|
||||
},
|
||||
'Offset': {
|
||||
min: -0.05,
|
||||
max: 0.05,
|
||||
step: stepsize,
|
||||
value: getInitialCalibrationOffset(),
|
||||
format: v => roundToDigits(v, stepsize).toFixed((""+stepsize).length - 2),
|
||||
onchange: v => {
|
||||
print(typeof v);
|
||||
systemsettings.batFullVoltage = v + full;
|
||||
require("Storage").writeJSON("setting.json", systemsettings);
|
||||
}
|
||||
},
|
||||
'Auto': function() {
|
||||
var newVoltage = getCurrentVoltageDirect();
|
||||
E.showAlert("Please charge fully before auto setting").then(() => {
|
||||
E.showPrompt("Set current charge as full").then((r) => {
|
||||
if (r) {
|
||||
systemsettings.batFullVoltage = newVoltage;
|
||||
require("Storage").writeJSON("setting.json", systemsettings);
|
||||
//reset value shown in menu to the newly set one
|
||||
submenu_calibrate.Offset.value = getInitialCalibrationOffset();
|
||||
E.showMenu(mainmenu);
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
'Clear': function() {
|
||||
E.showPrompt("Clear charging offset?").then((r) => {
|
||||
if (r) {
|
||||
delete systemsettings.batFullVoltage;
|
||||
require("Storage").writeJSON("setting.json", systemsettings);
|
||||
//reset value shown in menu to the newly set one
|
||||
submenu_calibrate.Offset.value = getInitialCalibrationOffset();
|
||||
E.showMenu(mainmenu);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
var submenu_chargewarn = {
|
||||
'': {
|
||||
title: "Charge warning"
|
||||
},
|
||||
'< Back': function() {
|
||||
E.showMenu(mainmenu);
|
||||
},
|
||||
'Enabled': {
|
||||
value: !!settings.warnEnabled,
|
||||
format: v => settings.warnEnabled ? "On" : "Off",
|
||||
onchange: v => {
|
||||
writeSettings("warnEnabled", v);
|
||||
}
|
||||
},
|
||||
'Percentage': {
|
||||
min: 80,
|
||||
max: 100,
|
||||
step: 2,
|
||||
value: settings.warn,
|
||||
format: v => v + "%",
|
||||
onchange: v => {
|
||||
writeSettings("warn", v);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
E.showMenu(mainmenu);
|
||||
})
|
Loading…
Reference in New Issue