New power management app for setting a charging alarm and voltage offset

pull/1549/head
Martin Boonk 2022-03-08 20:16:00 +01:00
parent eca4079828
commit 30ade21eac
7 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1 @@
0.01: New App!

View File

@ -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)

BIN
apps/powermanager/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

29
apps/powermanager/boot.js Normal file
View File

@ -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());
}
})();

View File

@ -0,0 +1,4 @@
{
"warnEnabled": false,
"warn": 96
}

View File

@ -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"}
]
}

View File

@ -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);
})