From aa53046f594a84ee9663829c3c3419aa51dbe055 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 13 Mar 2022 20:54:06 +0100 Subject: [PATCH 1/4] powermanager - Allow forcing monotonic battery voltage/percentage --- apps/powermanager/ChangeLog | 1 + apps/powermanager/README.md | 6 +++++- apps/powermanager/boot.js | 22 ++++++++++++++++++++++ apps/powermanager/default.json | 4 +++- apps/powermanager/metadata.json | 2 +- apps/powermanager/settings.js | 14 ++++++++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/apps/powermanager/ChangeLog b/apps/powermanager/ChangeLog index 5560f00bc..8ccf678de 100644 --- a/apps/powermanager/ChangeLog +++ b/apps/powermanager/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Allow forcing monotonic battery voltage/percentage diff --git a/apps/powermanager/README.md b/apps/powermanager/README.md index f2cfcdf3e..434ec814e 100644 --- a/apps/powermanager/README.md +++ b/apps/powermanager/README.md @@ -1,6 +1,10 @@ # 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. +Manages settings for charging. +Features: +* Warning threshold to be able to disconnect the charger at a given percentage +* Set the battery calibration offset. +* Force monotonic battery percentage or voltage ## Internals diff --git a/apps/powermanager/boot.js b/apps/powermanager/boot.js index ff4ba8932..1f6ec332a 100644 --- a/apps/powermanager/boot.js +++ b/apps/powermanager/boot.js @@ -26,4 +26,26 @@ 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; + E.getBattery = function() { + var current = (op()+op()+op()+op())/4; + if (Bangle.isCharging() && current > p) p = current; + if (!Bangle.isCharging() && current < p) p = current; + return p; + }; + } + + if (settings.forceMonoVoltage){ + var v = (NRF.getBattery()+NRF.getBattery()+NRF.getBattery()+NRF.getBattery())/4; + var ov = NRF.getBattery; + NRF.getBattery = function() { + var current = (ov()+ov()+ov()+ov())/4; + if (Bangle.isCharging() && current > v) v = current; + if (!Bangle.isCharging() && current < v) v = current; + return v; + }; + } })(); diff --git a/apps/powermanager/default.json b/apps/powermanager/default.json index a6d8412b2..6c929dc38 100644 --- a/apps/powermanager/default.json +++ b/apps/powermanager/default.json @@ -1,4 +1,6 @@ { "warnEnabled": false, - "warn": 96 + "warn": 96, + "forceMonoVoltage": false, + "forceMonoPercentage": false } diff --git a/apps/powermanager/metadata.json b/apps/powermanager/metadata.json index 3ad31ba1e..2bb531099 100644 --- a/apps/powermanager/metadata.json +++ b/apps/powermanager/metadata.json @@ -2,7 +2,7 @@ "id": "powermanager", "name": "Power Manager", "shortName": "Power Manager", - "version": "0.01", + "version": "0.02", "description": "Allow configuration of warnings and thresholds for battery charging and display.", "icon": "app.png", "type": "bootloader", diff --git a/apps/powermanager/settings.js b/apps/powermanager/settings.js index c8aa057fa..8af873e5f 100644 --- a/apps/powermanager/settings.js +++ b/apps/powermanager/settings.js @@ -24,6 +24,20 @@ 'title': 'Power Manager' }, '< Back': back, + 'Monotonic percentage': { + value: !!settings.forceMonoPercentage, + format: v => settings.forceMonoPercentage ? "On" : "Off", + onchange: v => { + writeSettings("forceMonoPercentage", v); + } + }, + 'Monotonic voltage': { + value: !!settings.forceMonoVoltage, + format: v => settings.forceMonoVoltage ? "On" : "Off", + onchange: v => { + writeSettings("forceMonoVoltage", v); + } + }, 'Charge warning': function() { E.showMenu(submenu_chargewarn); }, From 28e30164149a810384fcf9a102e7d72b64c1175b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 14 Mar 2022 18:27:58 +0100 Subject: [PATCH 2/4] powermanager - Round percentage values to get integer values for E.getBattery() --- apps/powermanager/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/powermanager/boot.js b/apps/powermanager/boot.js index 1f6ec332a..077e24413 100644 --- a/apps/powermanager/boot.js +++ b/apps/powermanager/boot.js @@ -31,7 +31,7 @@ var p = (E.getBattery()+E.getBattery()+E.getBattery()+E.getBattery())/4; var op = E.getBattery; E.getBattery = function() { - var current = (op()+op()+op()+op())/4; + var current = Math.round((op()+op()+op()+op())/4); if (Bangle.isCharging() && current > p) p = current; if (!Bangle.isCharging() && current < p) p = current; return p; From 993850ad99047988a0351e8a55fce3fe6010927f Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 14 Mar 2022 19:53:35 +0100 Subject: [PATCH 3/4] main.cc: Force line break for smaller resolutions --- css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/main.css b/css/main.css index f4850babe..a986df22e 100644 --- a/css/main.css +++ b/css/main.css @@ -81,7 +81,7 @@ a.btn.btn-link.dropdown-toggle { min-height: 8em; } -.tile-content { position: relative; } +.tile-content { position: relative; word-break: break-all; } .link-github { position:absolute; top: 36px; From bd899c7f725c3f9730273f4cb2e3b253eced8697 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 15 Mar 2022 12:47:57 +0000 Subject: [PATCH 4/4] Added backup/restore buttons --- backup.js | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ core | 2 +- index.html | 4 ++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 backup.js diff --git a/backup.js b/backup.js new file mode 100644 index 000000000..d40121fb2 --- /dev/null +++ b/backup.js @@ -0,0 +1,114 @@ +/* Code to handle Backup/Restore functionality */ + +const BACKUP_STORAGEFILE_DIR = "storage-files"; + +function bangleDownload() { + var zip = new JSZip(); + Progress.show({title:"Scanning...",sticky:true}); + var normalFiles, storageFiles; + console.log("Listing normal files..."); + Comms.listFiles({sf:false}).then(f => { + normalFiles = f; + console.log(" - "+f.join(",")); + console.log("Listing StorageFiles..."); + return Comms.listFiles({sf:true}); + }).then(f => { + storageFiles = f; + console.log(" - "+f.join(",")); + var fileCount = normalFiles.length + storageFiles.length; + var promise = Promise.resolve(); + // Normal files + normalFiles.forEach((filename,n) => { + promise = promise.then(() => { + Progress.hide({sticky: true}); + var percent = n/fileCount; + Progress.show({title:`Download ${filename}`,sticky:true,min:percent,max:percent,percent:0}); + return Comms.readFile(filename).then(data => zip.file(filename,data)); + }); + }); + // Storage files + if (storageFiles.length) { + var zipStorageFiles = zip.folder(BACKUP_STORAGEFILE_DIR); + storageFiles.forEach((filename,n) => { + promise = promise.then(() => { + Progress.hide({sticky: true}); + var percent = (normalFiles.length+n)/fileCount; + Progress.show({title:`Download ${filename}`,sticky:true,min:percent,max:percent,percent:0}); + return Comms.readStorageFile(filename).then(data => zipStorageFiles.file(filename,data)); + }); + }); + } + console.log("Listing StorageFiles..."); + return promise; + }).then(() => { + return zip.generateAsync({type:"blob"}); + }).then(content => { + Progress.hide({ sticky: true }); + showToast('Backup complete!', 'success'); + Espruino.Core.Utils.fileSaveDialog(content, "Banglejs backup.zip"); + }).catch(err => { + Progress.hide({ sticky: true }); + showToast('Backup failed, ' + err, 'error'); + }); +} + +function bangleUpload() { + Espruino.Core.Utils.fileOpenDialog({ + id:"backup", + type:"arraybuffer", + mimeType:".zip,application/zip"}, function(data) { + if (data===undefined) return; + var promise = Promise.resolve(); + var zip = new JSZip(); + var cmds = ""; + zip.loadAsync(data).then(function(zip) { + return showPrompt("Restore from ZIP","Are you sure? This will remove all existing apps"); + }).then(()=>{ + Progress.show({title:`Reading ZIP`}); + zip.forEach(function (path, file){ + console.log("path"); + promise = promise + .then(() => file.async("string")) + .then(data => { + console.log("decoded", path); + if (path.startsWith(BACKUP_STORAGEFILE_DIR)) { + path = path.substr(BACKUP_STORAGEFILE_DIR.length+1); + cmds += AppInfo.getStorageFileUploadCommands(path, data)+"\n"; + } else if (!path.includes("/")) { + cmds += AppInfo.getFileUploadCommands(path, data)+"\n"; + } else console.log("Ignoring "+path); + }); + }); + return promise; + }) + .then(() => { + Progress.hide({sticky:true}); + Progress.show({title:`Erasing...`}); + return Comms.removeAllApps(); }) + .then(() => { + Progress.hide({sticky:true}); + Progress.show({title:`Restoring...`, sticky:true}); + return Comms.showMessage(`Restoring...`); }) + .then(() => Comms.write("\x10"+Comms.getProgressCmd()+"\n")) + .then(() => Comms.uploadCommandList(cmds, 0, cmds.length)) + .then(() => Comms.showMessage(Const.MESSAGE_RELOAD)) + .then(() => { + Progress.hide({sticky:true}); + showToast('Restore complete!', 'success'); + }) + .catch(err => { + Progress.hide({sticky:true}); + showToast('Restore failed, ' + err, 'error'); + }); + return promise; + }); +} + +window.addEventListener('load', (event) => { + document.getElementById("downloadallapps").addEventListener("click",event=>{ + bangleDownload(); + }); + document.getElementById("uploadallapps").addEventListener("click",event=>{ + bangleUpload(); + }); +}); diff --git a/core b/core index affb0b15b..05f97e6ad 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit affb0b15b41eb35a1548373831af7001bad64435 +Subproject commit 05f97e6ade4605ac7a6105def52a34280f4f0c4d diff --git a/index.html b/index.html index 6c9a21bf8..a418b48eb 100644 --- a/index.html +++ b/index.html @@ -131,6 +131,8 @@

+

+

Settings