forked from FOSS/BangleApps
powermanager - New option to automatically calibrate the battery
parent
5c110a89fb
commit
a79b130e88
|
@ -1,3 +1,5 @@
|
||||||
0.01: New App!
|
0.01: New App!
|
||||||
0.02: Allow forcing monotonic battery voltage/percentage
|
0.02: Allow forcing monotonic battery voltage/percentage
|
||||||
0.03: Use default Bangle formatter for booleans
|
0.03: Use default Bangle formatter for booleans
|
||||||
|
0.04: Remove calibration with current voltage (Calibrate->Auto) as it is now handled by settings app
|
||||||
|
Allow automatic calibration on every charge longer than 3 hours
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
Manages settings for charging.
|
Manages settings for charging.
|
||||||
Features:
|
Features:
|
||||||
* Warning threshold to be able to disconnect the charger at a given percentage
|
* Warning threshold to be able to disconnect the charger at a given percentage
|
||||||
* Set the battery calibration offset.
|
* Set the battery calibration offset
|
||||||
* Force monotonic battery percentage or voltage
|
* Force monotonic battery percentage or voltage
|
||||||
|
* Automatic calibration on charging uninterrupted longer than 3 hours (reloads of the watch reset the timer).
|
||||||
|
|
||||||
## Internals
|
## Internals
|
||||||
|
|
||||||
|
|
|
@ -48,4 +48,13 @@
|
||||||
return v;
|
return v;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.autoCalibration){
|
||||||
|
let chargeStart;
|
||||||
|
Bangle.on("charging", (charging)=>{
|
||||||
|
if (charging) chargeStart = Date.now();
|
||||||
|
if (chargeStart && !charging && (Date.now() - chargeStart > 1000*60*60*3)) require("powermanager").setCalibration();
|
||||||
|
if (!charging) chargeStart = undefined;
|
||||||
|
});
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
// set battery calibration value by either applying the given value or setting the currently read battery voltage
|
||||||
|
exports.setCalibration = function(calibration){
|
||||||
|
let s = require('Storage').readJSON("setting.json", true) || {};
|
||||||
|
s.batFullVoltage = calibration?calibration:((analogRead(D3) + analogRead(D3) + analogRead(D3) + analogRead(D3)) / 4);
|
||||||
|
require('Storage').writeJSON("setting.json", s);
|
||||||
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "powermanager",
|
"id": "powermanager",
|
||||||
"name": "Power Manager",
|
"name": "Power Manager",
|
||||||
"shortName": "Power Manager",
|
"shortName": "Power Manager",
|
||||||
"version": "0.03",
|
"version": "0.04",
|
||||||
"description": "Allow configuration of warnings and thresholds for battery charging and display.",
|
"description": "Allow configuration of warnings and thresholds for battery charging and display.",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"type": "bootloader",
|
"type": "bootloader",
|
||||||
|
@ -12,6 +12,7 @@
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"powermanager.boot.js","url":"boot.js"},
|
{"name":"powermanager.boot.js","url":"boot.js"},
|
||||||
{"name":"powermanager.settings.js","url":"settings.js"},
|
{"name":"powermanager.settings.js","url":"settings.js"},
|
||||||
|
{"name":"powermanager","url":"lib.js"},
|
||||||
{"name":"powermanager.default.json","url":"default.json"}
|
{"name":"powermanager.default.json","url":"default.json"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
'': {
|
'': {
|
||||||
'title': 'Power Manager'
|
'title': 'Power Manager'
|
||||||
},
|
},
|
||||||
'< Back': back,
|
|
||||||
'Monotonic percentage': {
|
'Monotonic percentage': {
|
||||||
value: !!settings.forceMonoPercentage,
|
value: !!settings.forceMonoPercentage,
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
|
@ -44,29 +43,29 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
function roundToDigits(number, stepsize) {
|
function roundToDigits(number, stepsize) {
|
||||||
return Math.round(number / stepsize) * stepsize;
|
return Math.round(number / stepsize) * stepsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCurrentVoltageDirect() {
|
|
||||||
return (analogRead(D3) + analogRead(D3) + analogRead(D3) + analogRead(D3)) / 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
var stepsize = 0.0002;
|
var stepsize = 0.0002;
|
||||||
var full = 0.32;
|
var full = 0.3144;
|
||||||
|
|
||||||
function getInitialCalibrationOffset() {
|
function getInitialCalibrationOffset() {
|
||||||
return roundToDigits(systemsettings.batFullVoltage - full, stepsize) || 0;
|
return roundToDigits(systemsettings.batFullVoltage - full, stepsize) || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var submenu_calibrate = {
|
var submenu_calibrate = {
|
||||||
'': {
|
'': {
|
||||||
title: "Calibrate"
|
title: "Calibrate",
|
||||||
|
back: function() {
|
||||||
|
E.showMenu(mainmenu);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
'< Back': function() {
|
'Autodetect': {
|
||||||
E.showMenu(mainmenu);
|
value: !!settings.autoCalibration,
|
||||||
|
onchange: v => {
|
||||||
|
writeSettings("autoCalibration", v);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
'Offset': {
|
'Offset': {
|
||||||
min: -0.05,
|
min: -0.05,
|
||||||
|
@ -75,25 +74,9 @@
|
||||||
value: getInitialCalibrationOffset(),
|
value: getInitialCalibrationOffset(),
|
||||||
format: v => roundToDigits(v, stepsize).toFixed((""+stepsize).length - 2),
|
format: v => roundToDigits(v, stepsize).toFixed((""+stepsize).length - 2),
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
print(typeof v);
|
require("powermanager").setCalibration(v + full);
|
||||||
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() {
|
'Clear': function() {
|
||||||
E.showPrompt("Clear charging offset?").then((r) => {
|
E.showPrompt("Clear charging offset?").then((r) => {
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -109,10 +92,10 @@
|
||||||
|
|
||||||
var submenu_chargewarn = {
|
var submenu_chargewarn = {
|
||||||
'': {
|
'': {
|
||||||
title: "Charge warning"
|
title: "Charge warning",
|
||||||
},
|
back: function() {
|
||||||
'< Back': function() {
|
E.showMenu(mainmenu);
|
||||||
E.showMenu(mainmenu);
|
},
|
||||||
},
|
},
|
||||||
'Enabled': {
|
'Enabled': {
|
||||||
value: !!settings.warnEnabled,
|
value: !!settings.warnEnabled,
|
||||||
|
|
Loading…
Reference in New Issue