From c43c61eb8130a9b160d68eb0b79217ea3f873c8a Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 12:43:29 -0600 Subject: [PATCH 001/188] Create node.js.yml --- .github/workflows/node.js.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 000000000..278de90bf --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,31 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + - run: npm test From 8f4680d9bf9074be7d42dfbdc91f24b6a6a21df1 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 13:19:49 -0600 Subject: [PATCH 002/188] Inital commit for MTG Watchface --- apps/mtgwatchface/app-icon.js | 6 ++ apps/mtgwatchface/app.js | 126 ++++++++++++++++++++++++++++++++ apps/mtgwatchface/metadata.json | 36 +++++++++ 3 files changed, 168 insertions(+) create mode 100644 apps/mtgwatchface/app-icon.js create mode 100644 apps/mtgwatchface/app.js create mode 100644 apps/mtgwatchface/metadata.json diff --git a/apps/mtgwatchface/app-icon.js b/apps/mtgwatchface/app-icon.js new file mode 100644 index 000000000..3ca872eee --- /dev/null +++ b/apps/mtgwatchface/app-icon.js @@ -0,0 +1,6 @@ +{ + width : 48, height : 48, bpp : 2, + transparent : -1, + palette : new Uint16Array([65535,0,23275,42260]), + buffer : require("heatshrink").decompress(atob("AB8P9Wq3kD////gKCgeVqoAB2QHBhgLCkoKCqtaBYoWDAAIjEgXVBQdWHIkliojE0ALDqv1BYdlqgKCgNVpIvEqvABYMJqtfBYtABYM1BIoABsALBHIgADrgLBKIgADHgRpFAAVXKQQAIBYe6BAdsIYKkBH4U5QQcCMAILBwAGCIgYIBBwQbCqtwIgQLCSQZ0D6oLHFAJ0BwAfBBY4jBA4Nr4ENBYO8gEOHAR3DrNlNYr5Drt1copcCqttvIECrA4COoVtbQVWHQM61WqGIILDtWq1k8DIUFvuJQYUAnALEucJBYcInkCgWggt63Nch06wALBhM77kFU4UJidwBYMBlEsBYcOgFABYcYBYkDEYUBnNcBYOVBYMBHYQDB0EKqvVzkOhYLChsDoELBYPch029gLBh3NCANVi0chXuyALBNwILBysAjhrDBIMgAgPrgEsQYabC1WoA4IGD1gPCABIfBnnA0ewA4MDmADB1ks2/jwv4kHagQyC8sQ3OzhsHlERgUIBYP+ld8+fOmm3iXC5ALBhkAFAQAB4AGFABA")) + } \ No newline at end of file diff --git a/apps/mtgwatchface/app.js b/apps/mtgwatchface/app.js new file mode 100644 index 000000000..f3dc6b188 --- /dev/null +++ b/apps/mtgwatchface/app.js @@ -0,0 +1,126 @@ +var blueImg = require("heatshrink").decompress(atob("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")) +var redImg = require("heatshrink").decompress(atob("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")); +var greenImg = { + width : 142, height : 145, bpp : 1, + transparent : 1, + palette : new Uint16Array([2016,65535]), + buffer : require("heatshrink").decompress(atob("/4AF/kAv4JGAA4aBn4QN+ARQHwQRNEQRHOwARPNAJ0JAAvgCAUBK58AgYQL/ARDg4RL4ARDgkAh40NEpg0EAAQjJGggRMCA0Aj6/Gg40HbA3+Q4KeDAAjGFBwMDaYYAEIZrGIIZCOIPA58JCBRqFGhZqFGhZqFCBcDCAf8CJZYEVpDVIVpBYHaYJYP+ARMEYZ7MEYgQMCIZ7MfIhGNfIZGNUAaNMfIaNNLAf4LCDUMLAhGQRppGDGhsDGiCNCPZ0fPZ4RDYRpqDCBsAv40PPgQQOYYIiGh6OJRgyCC+DVFYI0DFQMDCIsfAwoZBZIMPBQs/Gg0PSgM/bwrBHnx1CDgkBGg0AvBGBDgsHYI0BIwSGFj7OKIwosBAAccXghjFC4kHF4cDTAsDC4iTERo0OfwpeDTA04dgoMDZoxGERAkDNIpGFgJYDh7MGRpMwAwt8CJJXFahAAIg5NFABUfFQoAK/4QPQ4gAMZIwAFXok/ZwcAhAvFDol+BYl4MgodECwl/AokDdgkBCwYKBDgl/MgkGUgn/UocB/4pEKQgRBfAYpBZBQjEg46ECI7JPh63RIwbJZVZQRMLBMQAws+Aws/DAVgBQrnGSoUDFo1ASgrdChxMLCAKnCvhdLCIQnBQwcPCAr4BAAK5Bv7fDv6LFh4RC/4nBBgQbBCIoQDG4YbDCIhoCAAbxDv4RFK4YAC/gJBgZyDGhJqCDYQQDDAQRHHQppFAAR8BBIX4cYgRG4CWDUoZGHEYJoBFAZ7IAAxqDPYylJSgQAKSYTlEABJYDIxpYDPY5YJCBixDYQ4AFWIbCHI35G/I0oQCgF/Gh8BERnALBxoDAAMHEJxqMIgY1NVwYRMEQw2KEQyQJ/gQICI6/DAAyLLAAi0GK5CiI+ARJfY3we4oACj7VOERB+KYhPwgcAhDWN4EcgF4fRuA/EDOAP8RgxYEg/gj/gGRRYCj/Av4TBCJaQBEAITBCJfn/xTB4IQLGwQgMAAf5DRAA=")) +} +var whiteImg = require("heatshrink").decompress(atob("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")); +var blackImg = { + width : 152, height : 144, bpp : 1, + transparent : 1, + palette : new Uint16Array([0,65535]), + buffer : require("heatshrink").decompress(atob("/4AGwAKBg4LHAAoeEh4RL8AyNEhAABj4RJ/ASGgYSJ4BsPG5AABn4RH/gSIJhHwCRCaIQQxfLXIQAGgJwQORISvJY/4OJISH8CERwASJVQ3+gC9JjwmF/EAuASImByFEYN4JRB7Bv7hFCREHAQM/cIs8VRMAj4SDAwISLh5wEM4ISKOQYSCj4SKX4f8FgROBfBiWBNAL3JAAKFCXQUDXxISEcAZPCABCYCCQZyLTARHLTAwSPg7PDCSAROXwYSPXwJ/LCS7RBCSN/eoQShn/4CUcfCSXwCUcPCSXgCSEHCWZHDgfAC4bfMCQn//wRGgf//4SFg4IBDAY3DBIYSDn4IBTowJCJgMBwA3CAAJCCAAYJCDgISCgIICIQQACBIf4CQZTCAAIsCKggvCCQQIDL4pdCCQoIDKoQACj4ICR4ISCBAYSFOASiFCQiFEv5oHDYYSFBAYSJPYISUUAiOECSRUECQazECRLkDCVbaDCRDsECSo6BCRwQBCQyEDCRKqICQoHBHQMPew4SE/zEBCQLHEM4YSEFwISCEwigDCQngCQgTCJQarEPIUBCoIAPgYSSNQYADgUAsASHIooABgwSIg7JDCRyaBCR5/BCRFwBI0fW4gSMeYJyGhwSKL4wSJaoQSHvAIFgLoECQqhGfgY5FCRBwBAARzECRF/CQYmEjwSGVAIAEJoYSGGwgADwASHNwYSOGwwSGgISDXIISQCJASDnwSDJRISEgYSCgYSMn4SDZgYSKw4SR/4SQbQISVLxt4OKIABnASRAAQS/CRb2NCX4S/CTkACRsMCR9ACQUCCRtgCQUGCX4SGuASChwSN+ASVjwSPEYM+CRv4CQV+CSP+CSEHCR38gEP/4SggIOBCSUfCRvAgP/gE/CRvgCQOAAwUAAwIAI/EDAwgSL/4SFwAGFAAvnKQsHAwgA==")) +} +var backgrounds = [blackImg, blueImg, redImg, greenImg, whiteImg] +var manaColors = ["#000000","#0000ff","#ff0000","#00ff00","#ffff00"] +var bgIndex = 0; +g.width = g.getWidth(); +g.height = g.getHeight(); + +//console.log(backgrounds.length); + +//var Layout = require("Layout"); +//var layout = new Layout(); + +Graphics.prototype.setFontTreasurehuntDOYwE_20 = function(scale) { + // Actual height 20 (19 - 0) + this.setFontCustom(atob("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C////4AP////gA/7/q+ADwB8A8APQLwDwAvS/APAC//8A4AP//0DAAv/f0sAAvg//gAAED/8AAAAL/gAAAAL4AAAAAEAAAAAAAAAAC//8AAAv//8AAL///8AA//7/wAH4AF/AAtAAB9ADwAAD4APAAALgA8AAAtADwAAC0APQAAPAAvAAA0AA8AALAADgAA0AAEAAAAAAAAAAAAHgAFbwAv///+AD////4AP////wA/v+q/AD8EAH8APwAAfgA+AAB+AD8AAD4APwAAPgA/gAA8AC/QAHgAP/kB9AAv/+/wAA///9AAB///QAAAf/0AAAAEQAAAAAAAAAAAH/4AAAD//8AAAv//8AAH///4AA/r//wAH0fB/AAsB4B+ADwHQD8APAcALwA8BwAeADwDACwAPAcAPAA+BwA8AD8LQHQALwtA8AAOBgCQAAQAAAAAHVURWQAv///+AC////4AP////gA//+q+AD4BwC8APQDADgA8AMANADwAwAAAPQHQAAA/AcAAAD8AQAAAPwAAAAA8AAAAABgAAAAAAAAAAAAAf//QAAD///QAAv///AAH/qv+AAvAAL8ADwAAPwANAAAvAB0BQA8ALQPADwAtA8APAC0DwA4ALwOAHgAPw9A8AA/D//gAC0P/8AABAr5AAAAAAAAAH/r5rgAf///9AB////0AL+///gAYAOQeAAAA0AUAAADQAAAAANAAAAAA4AAAKADwAQA+7/rvAD////4AL////gAv+v6+ACgAAAsAAAAAAQAAAAAAAB1BUAoAH//+/gAf///+AC////4APqv+vgAQAAAKAAAAAAEAAAAAAAKQAAAAP/AAAAb3//v+v+P/////w/////9D/+v/5AFAAEAAAAAAAAAAPVaVSgA////+AC////4AP////QA////+ACUf9V4AAD/4DgAAv/0EAAH9/wAAB/i/0AAP4D/wAD+AL/gAPgAL/AA8AAL+ACAAAH8AAAAAL4AAAAAPwAAAAAfAAAAAAsAAAAAAwAAAAADAAAAAAIAAAAAAADgFBQYAP7///wA////+AD////4APuvv/wAUAQAfAAAAAA4AAAAADgAAAAAOAAAAAA9AAAAAD8AAAAAeQAAAACwAAAAAFAAL///0AA/+lbwAP/AALQA/wAAIAD9AAAAAPwAAAAA/AAAAAD9AAAAAH9AAAAAD+AAAAAH/UBQAAH///gAB////AAf///4AD//6vQAv+oAEAD/QAAAAP8AAAAAvQAAAAC0AAAAAPgAABAAfgAAsAA/QALwAB/Qb/AAB///8AAB///gAAB//8AAABqUAAAAAAAAD+pZuq/v/////k/////kD/+AAAAO/8AAAAS/8AAAAD/wAAAAH/wAAAAP/AAAAAv9AAAABv4AAAQA/0AADAD/wAANAH/AAA0AL9AADkVf9AAP///9AA////8AD5ABWQAEAAAAAAAAAAAAAAH//8AAA///4AAP+r/wAB9AH/AALgAH8AB4AAH0ALAAALgA8AAAfADwAAA8APQAADgA/QAAMAC/QAGwAL/lC9AAf//vwAA///9AAB//+QAAB//wAAAAWQAAAAAAAAAIAAAAAH1WpVVB7//////P/////4/+///+DVRfVUAMAA8AAAwADwAADQAPAAAPAA4AAA/gHAAAD/74AAAP//AAAAf/8AAAAb+AAAAAFQAAAAAAAAAAAAD//8AAA///4AAL///wAA9QL/AALgAH9AB8AAH0ALQAALgAsAAAfADwAEA8APAA8DgA/AD4NAC/AL2wAH/UP9AAf//v0AA////wAB////AAB//x8AAAagA0AAAAADQAAAAAJAAAAAAACwAAAPAPVWqr4Av////AC////0AH///8AAf/7/AAB9QAQAAHAAAAAAcABgAAB8APAAAH4B/QAAf5v/QAA////AAD//f+gAD/0v/wAHpAv/wAAAAL/0AAAAL/gAAAAH/AAAAAH8AAAAALwAAAAAPAAAAAAcAAAAAA0AAAAABQAAAAAAAP/AHwAC/+AvQAP/8C9AC2/0D0APA/gPgA8C/AvADwL8B8APA/wHgA8D/QtADwP/rwAPgv//AAvA//wAB0D/+AAAAH/QAAAABUAAAAAAAAALgAAAAA8AAAAADwAAAAAPAAAAAA8AAAAADwAAAAAPQAARQA//7//AD////8AP////gA////+AD1WQD8APAAAHwA8AAAOADwAAAQAPAAAAAA+AAAAAD8AAAAAPwAAAAA9AAAAADgAAAAAEAAAAAA4L/5AAD2//8AAP///+AA////8AD/mv/wAPkAH/AAsAAH8AAAAAL4AAAAAPwAAAAA/AAAAAD8AAAAALQAAAAAtADAAADwAOQAJPAA////8AD////4AP////0A//v//w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"), 32, atob("BgYHDQsQEwQKCAgLBgkGDA4GCwoPCwwMCwwGBgwJCwoNGREQExEQEREICBcOHRUTERUaEBYXFh0TERIKCwcKCgYSDg0PDQ0NDgcGEg0XERAPEhINExERFw4ODwYFBgoK"), 20+(scale<<8)+(2<<16)); + return this; +} + +Graphics.prototype.setFontTreasurehuntDOYwE_40_N = function(scale) { + // Actual height 40 (39 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAA8AAAAABwAAAAAHAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAB4AAAAAfwAAAAB/AAAAA/4AAAAH+AAAAB/gAAAAf4AAAAH+AAAAB/gAAAA/4AAAAP+AAAAB/wAAAA/8AAAAf/AAAAD/gAAAAf4AAAAA+AAAAADwAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAP/wAAAB//wAAAf//wAAD///AAAf8H+AAB+AH8AAPgAHwAB4AAPgAHAAAeAA4AAB4ADgAAHgAOAAAOAA4AAB4ADgAAHgAPAAAeAA+AADwAD8AAeAAH4AD4AAf4APgAA/8H8AAD///gAAD//8AAAH//gAAAH/4AAAAAYAAAAAAAAAAAAAAAAAAAAAAAAYAABAADgAAeAAf///4AD////gAP///+AA////4ABwAADgAAAAAGAAAAAAAAAAAAAAABwAAGAAPgAA4AB8AAHgAHwAA8AA8AAHwADgAA/AAMAAP8AB4AB/4AHgAf3gAPAH8eAA8B/B4AD4P4HgAP/+AeAA//wB4AB/8AHgAD/AAPAAPgAB8AAAAAPwAAAAB+AAAAAHgAAAAAAAAAAAAAAAAAAAAABgAAPwAOAMA/AB4DwAcAHAeAA4AOD4ADgA4/AAMADn8AAwAP/wADAA/3AAcAD8cADwAPh4AeAB4HgH4AHAfB/gAAA//8AAAB//gAAAD/8AAAAH/AAAAAEAAAAAAAAAAAAAAAAAAA4AAAAADgAAAAAeAAAAAD4AAAAAPgAAAAB+AAAAAP4AAAAB/gAAAAHOAAAAA44AAAAHjgAAAA8OAGAAPg4AYAD8Dh/gAP///+AB////wAH////gAP///+AA4BwA4AAAHAAgAAAMAAAAAB4AAAAAHgAAAAAeAAAAAB4AAAAAPAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAcAPAAADwAMAAA+AAwAAP4ADAAD/AAOAA/8AA4AD/wADAAP3AAMAA8cABwADhwAfAAOHgD4AA4fAfgADh//8AAfD//gAB8P/8AAHwf/gAAeB/4AABwD/AAAAAAAAAAAAAAAAAAAf/AAAAH//AAAA//+AAAP//4AAB/5/gAAP8A/AAB/wB8AAf3ADwAD8cAPAAfDwA4AB4PADgAPA8AeAB4DwDwAPAHgPAB4Afj4APAB//AB4AD/8APgAH/AA8AAP4ADgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAPAAAAAB4AADgAPAAA+AB8AAP4AHwAD/gAfAAf4AB8AH+AADwA/gAAPAP4AAA8D+AAADw/wAAAPP8AAAA9/AAAAD/4AAAAP+AAAAA/gAAAAD4AAAAAfAAAAAAwAAAAACAAAAAAAAAAAAAAAAAAAAAAH8AAAAA/4AAAAP/wAADh//AAA/Pw+AAH+8B4AA//AHgAH/8AeAAcHgA4ADgeADgAOB4AOAB4HwB4AHg/gPgAfn/x8AB/9//gAD/3/8AAP+P/gAAPwf4AAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAfgAAcAH/gADwA//AAeAD/8ADwAf/4AeADwHgDwAeAeAfABwA4D4APADgfAA4AOD4ADgA4/AAPADn4AA+AN/AAD4A/4AAP8f+AAA///wAAB//8AAAH//gAAAH/4AAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAHAeAAAA+D4AAAB4PwAAAHg/AAAAcB4AAAAAAAAAAAAAA"), 46, atob("CxgcCxcUHhUXFxYXCw=="), 40+(scale<<8)+(1<<16)); + return this; +} + + +function draw() { + g.clear(); + drawBackground(); + drawDate(); + drawTime(); + drawBattery(); +} +function drawDate() { + days = ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"] + months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + var d = new Date(); + var dateString = `${days[d.getDay()]} ${months[d.getMonth()]} ${d.getDate()}`; + g.setFontTreasurehuntDOYwE_20(1); + var sm = g.stringMetrics(dateString); + g.setColor(0,0,0).drawString(dateString, (g.width - sm.width) / 2, g.height - sm.height - 3); +} + +function drawTime(){ + var top = 100; pad = 6; bh=48; bw=62; linew=3 + var boxH = {x:pad,y:top,x2:pad+bw,y2:top+bh}; + var boxM = {x:g.width-pad-bw,y:top,x2:g.width-pad,y2:top+bh}; + var innerH = {x:boxH.x+linew, y:boxH.y+linew, x2:boxH.x2-linew, y2:boxH.y2-linew} + var innerM = {x:boxM.x+linew, y:boxM.y+linew, x2:boxM.x2-linew, y2:boxM.y2-linew} + g.setColor(manaColors[bgIndex]).fillRect(boxH).fillRect(boxM).clearRect(innerH).clearRect(innerM); + + //Draw the hour and minute + g.setFontTreasurehuntDOYwE_40_N(1); + var d = new Date(); + var h = `00${d.getHours()}`.slice(-2); + var m = `00${d.getMinutes()}`.slice(-2); + + var yOffset = 1; xOffset=2; + var mH = g.stringMetrics(h); + var mM = g.stringMetrics(m); + var xH = (bw - mH.width)/2 + boxH.x+xOffset; + var yH = (bh - mH.height)/2 +boxH.y+yOffset; + console.log `Hours: ${h}, x: ${xH}, y:${yH}`; + var xM = (bw - mM.width)/2 + boxM.x+xOffset; + var yM = (bh - mM.height)/2 +boxM.y+yOffset; + g.setColor(0,0,0).drawString (h, xH, yH).drawString(m, xM, yM); +} + +function drawBattery(){ + var pad = 6; top=pad; bh=10; bw=40; linew=1; + var box = {x:g.width-pad-bw,y:top,x2:g.width-pad,y2:top+bh}; + var innerB = {x:box.x+linew, y:box.y+linew, x2:box.x2-linew, y2:box.y2-linew} + var batteryFill={x:box.x+linew, y:box.y+linew, x2:(box.x-linew)+bw*E.getBattery()/100, y2:box.y2-linew} + g.setColor(manaColors[bgIndex]).fillRect(box).clearRect(innerB).setColor(0,1,0).fillRect(batteryFill); +} + +function drawBluetooth(){ + +} + +function drawBackground() { + var metrics = g.imageMetrics(backgrounds[bgIndex]); + g.drawImage(backgrounds[bgIndex], (g.width-metrics.width)/2, 5); +} + +function nextBackground() { + bgIndex++; + if (bgIndex > backgrounds.length - 1) bgIndex = 0; + if (bgIndex < 0) bgIndex = backgrounds.length - 1; +} +function prevBackground() { + bgIndex--; + if (bgIndex > backgrounds.length - 1) bgIndex = 0; + if (bgIndex < 0) bgIndex = backgrounds.length - 1; +} + +Bangle.on("touch", function (button, xy) { + if (button == 1) { + prevBackground(); + } else { + nextBackground(); + } + draw(); +}); + +draw(); +Bangle.setLocked(false); +Bangle.setLCDPower(true); +Bangle.setUI("clock"); + +var redrawTimerId = setInterval(function(){ + draw(); +}, 60000); diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json new file mode 100644 index 000000000..dcc58ea6c --- /dev/null +++ b/apps/mtgwatchface/metadata.json @@ -0,0 +1,36 @@ +{ + "id": "appid", + "name": "Readable name", + "shortName": "Short name", + "version": "0v01", + "description": "Magic the Gathering themed watch face. Embrace the inner wizzard ", + "icon": "icon.png", + "screenshots": [ + { + "url": "screenshot.png" + } + ], + "tags": "", + "supports": [ + "BANGLEJS2" + ], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + { + "name": "mtgwatchface.app.js", + "url": "app.js", + "supports": [ + "BANGLEJS2" + ] + }, + { + "name": "mtgwatchface.img", + "url": "app-icon.js", + "evaluate":true, + "supports": [ + "BANGLEJS2" + ] + } + ] +} \ No newline at end of file From a9b072ccb4bd9567c15f87b7d7627373668cbae6 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 13:29:47 -0600 Subject: [PATCH 003/188] Delete node.js.yml --- .github/workflows/node.js.yml | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml deleted file mode 100644 index 278de90bf..000000000 --- a/.github/workflows/node.js.yml +++ /dev/null @@ -1,31 +0,0 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Node.js CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [12.x, 14.x, 16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - run: npm ci - - run: npm run build --if-present - - run: npm test From 1e0a8f2411748f2afd59155dfc75249d3ac8c972 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 13:33:24 -0600 Subject: [PATCH 004/188] Update metadata for MTG Watchface --- apps/mtgwatchface/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index dcc58ea6c..b3ec2d3f1 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -1,7 +1,7 @@ { - "id": "appid", - "name": "Readable name", - "shortName": "Short name", + "id": "mtgwatchface", + "name": "MTG Watchface", + "shortName": "Magic the Gathering Watch Face", "version": "0v01", "description": "Magic the Gathering themed watch face. Embrace the inner wizzard ", "icon": "icon.png", From 3f684d138dcc0886996996c8c40e25ae31af68eb Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 13:43:05 -0600 Subject: [PATCH 005/188] Add screenhshot for MTG Watchface --- apps/mtgwatchface/black.png | Bin 0 -> 3427 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/mtgwatchface/black.png diff --git a/apps/mtgwatchface/black.png b/apps/mtgwatchface/black.png new file mode 100644 index 0000000000000000000000000000000000000000..a348053a5e3adaacfc20f35ec577e39525312f50 GIT binary patch literal 3427 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 Date: Sun, 13 Mar 2022 13:46:17 -0600 Subject: [PATCH 006/188] Update metadata --- apps/mtgwatchface/metadata.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index b3ec2d3f1..268a39669 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -6,9 +6,7 @@ "description": "Magic the Gathering themed watch face. Embrace the inner wizzard ", "icon": "icon.png", "screenshots": [ - { - "url": "screenshot.png" - } + {"url": "black.png"} ], "tags": "", "supports": [ From d629f79e8dcfca30a976d5ad325b9c714d4f3571 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 13:50:36 -0600 Subject: [PATCH 007/188] Add icon --- apps/mtgwatchface/icon.png | Bin 0 -> 2240 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/mtgwatchface/icon.png diff --git a/apps/mtgwatchface/icon.png b/apps/mtgwatchface/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9fb2cd3e7b99f37ca2da0e93b7bc18745ac391 GIT binary patch literal 2240 zcmV;x2tW6UP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2vtc$K~!i%-I{l3 z6;BYyCmMV2-H6ybMiCVoiY>ONs7OQwODtdn(J1;yu*8A}Y+#EbiXd2mVu)g|v0wu+ zu_czMu||X4>~FvG_TIaDxA&U)5r4mr4B6dxw>Pu5J3F&yn2^wam_jk&?c2BX=+Ps} z%*^Eai4!OIuZ}u(>QI|DZKzSBM%1odJE~NvlKO?{QsyPf&&pRd-&CtsjUpo>iC{n| zNTtQrty@LUo;^i)csK?jXen2&oESQEs5o-u2=^Hw{{>1~S{nZi+JLWLzlwSD=84j! zOKX)1Rr>euFRJ8KQBU!YVL;GRXu*O7w0iYwRV!qoiPB=zRK-8iXlZ(YBT=QLI=oe#qUscSVgFHEa+66KUMIF)JSz7spd+ z;>3v}J3Cux;2WO?+`fHVNRMH8SYl$LNJ>hwwEd|>MMa6?#fw|o>eZ_!GBPrhCeAn- zfRXoB9)i)w=)}at*nTT)DOs|lNKH*u8tHK~V91am+D;+Tmy4xKmx|=%gvTD7Wn1pWrWg7(H@fQ%^J8;!Wt4TUHWj3wS{#&(brM*5YD~qo)uo$ps&mQefJ$m#I_wU~q z1qB7_N)KpDPfr(JyLQ#y>m+c$6DCX$A3l6gJz4qv`?uDWuUofHUE#uFz?wB{Y&SqL zM4gnFSJ58TH zoy*?+7`%M>l4Rb&%3r;DRkga(0g9Z(+cQkzXaFXFI z*RerOn>LLG3>ZL@CQWj;>o|S-G)dPesK&VfKLo2l!duy1_#t6bFuPVC>kj{JIdgtXQ#vWP(A%h7F^sQ>XGGmGQc| zvT%^zhU(U>OEPJqjEoGbT)8rbHkfKrQBmqDI{~=|tPeRN^y9}5u46hG-va&(%9bt5 zf7h>HPwm^cXQP}5$N;#j=g*&0)22FrLe-qX zV69!dme+$X0y3aWmo9Yk=1t1Z&gT38(+EMC8BDS0=x9~*FmBv9RdRu8A?LWNIfH-= z&H@AG3r7QF@=S8;c266SoSaOzZr!qlxCZ`Wci=RiF*rCn0f~u;Bx5OlHl|TbObi`A zew=^v#?b(T$b$zDW|s)IZ{JSKmMtThHu7}Q0oUgZLS}#+Rt94{sye=X`$kQgG+{+Q ze*DP$$BP#)=;FnT{PvB0Y`_)i+^CryJ9cnjC%1LgVh87!2(~(Q>}YY9h;DHdl9!jK zt`s67BEsfIgTd@Z-9w3(&T#m_K6$X%;eEe@R@K76QJ zy}%nVbN%{tKE9L53kOnCDgG{Id?A6if!9K?hfhri@(d3q-<;dq;1d-30Jyhi&6?ad zzH;Io9OxQA4P;$7Jbv}+m1-5N2ZB2Yg1w(Vf2v()vPkg*PbLNcuBcAab1KcBBrjS$A-LE$xc_HkY2(^nIqJIG32;w;Cv3=YC O0000 Date: Sun, 13 Mar 2022 14:01:53 -0600 Subject: [PATCH 008/188] Update metadata --- apps/mtgwatchface/metadata.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index 268a39669..79ae3fb7d 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -8,13 +8,14 @@ "screenshots": [ {"url": "black.png"} ], - "tags": "", + "tags": "clock", + "type": "clock", "supports": [ "BANGLEJS2" ], "readme": "README.md", "allow_emulator": true, - "storage": [ + "storage": [ { "name": "mtgwatchface.app.js", "url": "app.js", From 58fd4af88a6a792fe4b593aac4e0a0592b01e367 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 16:29:35 -0600 Subject: [PATCH 009/188] Changed background images --- apps/mtgwatchface/app.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/mtgwatchface/app.js b/apps/mtgwatchface/app.js index f3dc6b188..a90e9ba01 100644 --- a/apps/mtgwatchface/app.js +++ b/apps/mtgwatchface/app.js @@ -1,12 +1,27 @@ -var blueImg = require("heatshrink").decompress(atob("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")) -var redImg = require("heatshrink").decompress(atob("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")); +var blueImg = { + width : 93, height : 145, bpp : 2, + transparent : 1, + palette : new Uint16Array([31,65535,65535,59167]), + buffer : require("heatshrink").decompress(atob("qoAlgoWVgIWVKqwWXioWVOasAOarJWgEMLikAhZcUgEK4IWToEK2AWV1hcToEO1ZcTCwOqLiYWCLiYWCLiZbCLiYWClRcSCwS5TCwUCLiQWCgBcSCwZcSqECCwJcSCwZcSCwZcSCwOqCwJcRqEDCwRcRCwhcRCwXALiVUCwhcQCwpcQqkACwZcQCwpcQCwPqwAWCLh4WGLiAWFLiAWB2AWCLiBWBCwhcPCwxcPgE60AWDLh9ACwpcBgIWO1gWElWACxsKCwsO0BFMoEOCwsD1CiMqEO1AWEX4JcMCxE6LhlQgWrCwpcNqkDCwxcNCwOqCwpcNCxM6f5dUgGq4AWFf5o8BCwz/NCwOACwz/MBoOwCwyiMoBqBCwyiBIpQWB0AWGG4PACxUKCxAJBaJNQh2sCw7wBIpIWB1AWHRYR0IqkC1YWIHAIuIfoIWJeIMAFw79CCxKVBFxAWBfo50DFxD9BCxLyCUY9AP4IWJP4T9QAAfqFw9QcxKjDFw7mKFxbPBcxIuKZ5guKCx0OHgK4GCxgOBwDSEoDPLAAUK1kBXArPKAAeq4AuDXALPLAAU6Fwi4OAAMD1R0DXBwuDUYa4PAAMCaQhjBCx0AlQuDUJ7SDOgShQaQSjCUKDSDIoNUUJ8CUYiKBUJ+gUYRFBgChPlYwBOgSKQFYJ0COYKKPUAJ0B0EFRQJMBABhxB4D6BgNUgSKOIQInBlWAipzQnQQBhxFBOYLOP1RtBIoJzQgWqIocQOZ8A1SLBIoMEOaL9BIoRzQlWqaIMq4FAAQJzPH4JZChQcBc5pcCgYCBLh4WBLgS2CLhyhBXIS2CLh86OYSiBLiEDaARcSgEPCARcCMQQAQLgQCCACD/CL4QAQLgMBL4QARLgL/QLgsQUR5cGgRFSCYMBUoYAQ1cAqE6IqRwBqjoQOYewipFTOYMFIqZBBgJFBRaMDOYNVIoLRR1QWBqDRSFIMVqkDIqPqwEVIqcq2EFIoMOXSCdBCwNUMIQWP0EBqtVoC6QnS4BCwNQgSnBCx6hBAAJ5CCyZ0BUZwWFOgIuOlQWEOgMKFxvqCwqjCFxnq0AWEOgMKRhcD1SxBCwlQFwK7KhwWHFwIKB4CIJBYQWFFwPqIxPqCxAuDPwJDHEIL8CFww6B3hwFFgIgBCw67BHYWvCof61RxCgoWHXYKXBAAO//4ECMoUVCw4uCh4SCAAarCCxJ1BC4xKCLRBGEAAJDC/4GCLRCNFAA4VLC5IsMC5BZLO5AVLoAA==")) +} +var redImg = { + width : 130, height : 144, bpp : 1, + transparent : 1, + palette : new Uint16Array([63488,65535]), + buffer : require("heatshrink").decompress(atob("/4AD8EAh4HEAA38C4UHB5QeBAAQhKwA5Ev4PI/APEgYxK+AQDj5SOgJjLEIYgH/hbDKgQgHJ4JbCKgYgGBQKNDIJIaCII0/Lg4pC/y1IBISMD4CkIc4owDYoprCHIQPDKIopCDAS0EKIjwCIAT2EKIhwCFAQlCCQRwGB4JlCAgJ5C/ZwEBQIkCGgIgBgf+OYRgBF4QEBB4IZCv/PHQZPCYwgJBh/zLQZ4DwAPCCgMBGATRF/ydDGAWPMAbqFGAnhCoXAZIowE/gLBwHweITsHv43B8F8bIowF4LLBv+HaAQcBOwTWBgP4v/8n/jFQUHFgLfBLYV+FgM//AqDK4KCCfgWDDgRgC/EPBYP+VgY+BBgPfRgYLBn+fIAMALo4OBFYPjIAUPK4SMFFYJcBAgXgTwwKBIAMPEoV4TwzoBIAODIAUeGBMPVYIEBg+AVowKC/EOGoTPHGAMB/8BwAPBniYCAAZsCOoY1BCwIAFDYLRCAAIjBZIJRGv7VBAAVgUQxRBUwkAjBxGAAYwDgwnBB5AwEwBxGKgoACOIwwHRAQAIQoQACOIwwIOI7XFAAJxKa4QACB5RREIBQgEOJTUFB5RiEWRJiFWRP9cohAJ/gqBUgRAJ/0f+LlDIBH+g/4v5RCIBH+gP4n/gIBcAv0PMIRAJFQMDeoZAIFQPAWYbCIFQPwv6BCh57DAgYKBvEfKAUDBQQWBMwQKBjxyBGATJFv6MCg+BSIZACbIYaCgfgv7SFB4YAD/EfaQoPHn0H+CRECoQAEj+BKAoPHSIN+KAh2CAAkD+EfKAg1CAAv8g5KCKAI1DAAl/gKhEa4ZQF4EgKAaWDAAkPHIjyBB48HFIhQBSA6LBEoiAIHQIJDMAJwIv4JDEoJwIn5AEMBJKBMBpKFYIJgHB4JADAoLRHLQJADYJIJBHQbBJBII6DOAJQHB4Q6DAoKhGDIQ6DOAJQHB4I6DOAPIWA46ESwPGUBBQDQAPhSIxwCJQQFB8FAMBChCAoPwmBQIMARmB+EMIBBgDCgMDYJl//EBSJH+EoY0BuAgGn4PDh4PBnjCHB4cHB4MPB40AgQUDB4MHIAwAFQgMBQ4QAMM4YALn4POj/gB5pzCABh4EABSpBwAQN/5AOagJwO/4PPWRiAB/6yNB4JxNB4JxNv4PBOJaPBAALjLh4PCOJQOEOJQ9CAASiIHoYwLgYPGMI4PHGA4PHGA4/HGBBfFSRJ/FAATDHB470HII70Kn6zOB4qzIgEfWZoPHQQ4vGKJKTHEA6CHEAzTIEAxOGMQ7iIaosHBhA")) +} var greenImg = { width : 142, height : 145, bpp : 1, transparent : 1, palette : new Uint16Array([2016,65535]), buffer : require("heatshrink").decompress(atob("/4AF/kAv4JGAA4aBn4QN+ARQHwQRNEQRHOwARPNAJ0JAAvgCAUBK58AgYQL/ARDg4RL4ARDgkAh40NEpg0EAAQjJGggRMCA0Aj6/Gg40HbA3+Q4KeDAAjGFBwMDaYYAEIZrGIIZCOIPA58JCBRqFGhZqFGhZqFCBcDCAf8CJZYEVpDVIVpBYHaYJYP+ARMEYZ7MEYgQMCIZ7MfIhGNfIZGNUAaNMfIaNNLAf4LCDUMLAhGQRppGDGhsDGiCNCPZ0fPZ4RDYRpqDCBsAv40PPgQQOYYIiGh6OJRgyCC+DVFYI0DFQMDCIsfAwoZBZIMPBQs/Gg0PSgM/bwrBHnx1CDgkBGg0AvBGBDgsHYI0BIwSGFj7OKIwosBAAccXghjFC4kHF4cDTAsDC4iTERo0OfwpeDTA04dgoMDZoxGERAkDNIpGFgJYDh7MGRpMwAwt8CJJXFahAAIg5NFABUfFQoAK/4QPQ4gAMZIwAFXok/ZwcAhAvFDol+BYl4MgodECwl/AokDdgkBCwYKBDgl/MgkGUgn/UocB/4pEKQgRBfAYpBZBQjEg46ECI7JPh63RIwbJZVZQRMLBMQAws+Aws/DAVgBQrnGSoUDFo1ASgrdChxMLCAKnCvhdLCIQnBQwcPCAr4BAAK5Bv7fDv6LFh4RC/4nBBgQbBCIoQDG4YbDCIhoCAAbxDv4RFK4YAC/gJBgZyDGhJqCDYQQDDAQRHHQppFAAR8BBIX4cYgRG4CWDUoZGHEYJoBFAZ7IAAxqDPYylJSgQAKSYTlEABJYDIxpYDPY5YJCBixDYQ4AFWIbCHI35G/I0oQCgF/Gh8BERnALBxoDAAMHEJxqMIgY1NVwYRMEQw2KEQyQJ/gQICI6/DAAyLLAAi0GK5CiI+ARJfY3we4oACj7VOERB+KYhPwgcAhDWN4EcgF4fRuA/EDOAP8RgxYEg/gj/gGRRYCj/Av4TBCJaQBEAITBCJfn/xTB4IQLGwQgMAAf5DRAA=")) } -var whiteImg = require("heatshrink").decompress(atob("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")); +var whiteImg = { + width : 153, height : 145, bpp : 2, + transparent : 0, + palette : new Uint16Array([65535,65535,65504,65505]), + buffer : require("heatshrink").decompress(atob("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")) +} var blackImg = { width : 152, height : 144, bpp : 1, transparent : 1, From cc1f0f6d378dedb083f60370b9913a8acca296b4 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sun, 13 Mar 2022 23:51:22 -0600 Subject: [PATCH 010/188] Added Bluetooth v1 --- apps/mtgwatchface/app.js | 22 +++++++++++++++++++++- apps/mtgwatchface/metadata.json | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/apps/mtgwatchface/app.js b/apps/mtgwatchface/app.js index a90e9ba01..4f5587ad1 100644 --- a/apps/mtgwatchface/app.js +++ b/apps/mtgwatchface/app.js @@ -51,6 +51,16 @@ Graphics.prototype.setFontTreasurehuntDOYwE_40_N = function(scale) { return this; } +//Bluetooth on +var btOnImg = { + width : 15, height : 22, bpp : 3, + transparent : 2, + buffer : E.toArrayBuffer(atob("/////H//////A/////4A/////4BH////4JI////4JJH///4J5I///4BP5I///BJ/5A//BJPP5A/4JJ5P5H4J/PL/JHBJf/5JI4JJ/7JJIBP75/ZJAJZPJ/JIBJJ5/JJHBJP/JJA4JJ/JJI/4JPJJI//4BJJA////AAH//A==")) +} +var btOffImg = { + width : 15, height : 22, bpp : 1, + buffer : E.toArrayBuffer(atob("AAAAwAcAGgBEAQgEEBgQIDCAIQAiACgAUABgAMABgAKACQARAEGDAPgA")) +} function draw() { g.clear(); @@ -58,6 +68,7 @@ function draw() { drawDate(); drawTime(); drawBattery(); + drawBluetooth(); } function drawDate() { days = ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"] @@ -103,7 +114,13 @@ function drawBattery(){ } function drawBluetooth(){ - + var img; + if (NRF.getSecurityStatus().connected) { + img=btOnImg; + } else { + img=btOffImg; + } + g.reset().drawImage(img,3,3); } function drawBackground() { @@ -136,6 +153,9 @@ Bangle.setLocked(false); Bangle.setLCDPower(true); Bangle.setUI("clock"); +NRF.on('connect', draw); +NRF.on('disconnect', draw); + var redrawTimerId = setInterval(function(){ draw(); }, 60000); diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index 79ae3fb7d..3e1a9df29 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -2,7 +2,7 @@ "id": "mtgwatchface", "name": "MTG Watchface", "shortName": "Magic the Gathering Watch Face", - "version": "0v01", + "version": "1v01", "description": "Magic the Gathering themed watch face. Embrace the inner wizzard ", "icon": "icon.png", "screenshots": [ From faea4564f0a5409d1cc2021d3696ecac873b8516 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Tue, 15 Mar 2022 15:29:32 -0600 Subject: [PATCH 011/188] Added charger indicator --- apps/mtgwatchface/app.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/apps/mtgwatchface/app.js b/apps/mtgwatchface/app.js index 4f5587ad1..d54247033 100644 --- a/apps/mtgwatchface/app.js +++ b/apps/mtgwatchface/app.js @@ -62,6 +62,14 @@ var btOffImg = { buffer : E.toArrayBuffer(atob("AAAAwAcAGgBEAQgEEBgQIDCAIQAiACgAUABgAMABgAKACQARAEGDAPgA")) } +//Charging symbol +var chrgOn = { + width : 8, height : 15, bpp : 2, + transparent : 0, + palette : new Uint16Array([65535,65504,63488,64928]), + buffer : E.toArrayBuffer(atob("qterVKlcrVClcLVAlVfVVA1cDVANQA3ADQAPAAwA")) +} + function draw() { g.clear(); drawBackground(); @@ -69,6 +77,7 @@ function draw() { drawTime(); drawBattery(); drawBluetooth(); + drawBatteryStatus(); } function drawDate() { days = ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"] @@ -122,6 +131,17 @@ function drawBluetooth(){ } g.reset().drawImage(img,3,3); } +function drawBatteryStatus(){ + var left = g.width - (20+6+4); + var img; + if (Bangle.isCharging()) { + console.log("Charger connected"); + img=chrgOn; + g.reset().drawImage(img,left, 4); + } else { + console.log("Charger not connected"); + } +} function drawBackground() { var metrics = g.imageMetrics(backgrounds[bgIndex]); @@ -155,6 +175,7 @@ Bangle.setUI("clock"); NRF.on('connect', draw); NRF.on('disconnect', draw); +Bangle.on("charging", draw); var redrawTimerId = setInterval(function(){ draw(); From 79fb0a37a473638f4bad85ad31f6540958c16933 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Tue, 15 Mar 2022 15:32:58 -0600 Subject: [PATCH 012/188] Version up to 1v02 --- apps/mtgwatchface/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index 3e1a9df29..a24ca52c8 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -2,7 +2,7 @@ "id": "mtgwatchface", "name": "MTG Watchface", "shortName": "Magic the Gathering Watch Face", - "version": "1v01", + "version": "1v02", "description": "Magic the Gathering themed watch face. Embrace the inner wizzard ", "icon": "icon.png", "screenshots": [ From 90a946e99861fce41c447a98beebbf4e52051492 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Thu, 17 Mar 2022 09:17:31 +0100 Subject: [PATCH 013/188] Update app-icon.js --- apps/bikespeedo/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bikespeedo/app-icon.js b/apps/bikespeedo/app-icon.js index c34f52cfb..411d644fd 100644 --- a/apps/bikespeedo/app-icon.js +++ b/apps/bikespeedo/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+64A/AC+sF1uBgAwsq1W1krGEmswIFDlcAFoMrqyGjlcrGAQDB1guBBQJghKYZZCMYhqBlYugFAesgAuFYgQIHAE2sYMZDfwIABbgIuowMAqwABb4wAjFVQAEqyMrF4cAlYABqwypR4RgBwIyplYnF1hnBGIo8BAAQvhGIj6C1hpBgChBGCqGBqwdCRQQnCB4gJBGAgtWc4WBPoi9JH4ILBGYQATPoRHJRYoACwLFBLi4tGLIyLEA5QuPCoYpEMhBBBGDIuFgArIYQIUHA4b+GABLUBAwoQIXorDGI5RNGCB9WRQ0AJwwHGDxChOH4oDCRI4/GXpAaB1gyLEwlWKgTrBT46ALCogQKZoryFCwzgGBgz/NZpaQHHBCdEF5hKBBxWBUwoGBgEAEoIyHHYesBg7aBJQ7SBBAIvEIIJCBD4IFBgBIGEAcAUA8rGAIWHS4QvDCAJAHG4JfRCgKCFeAovCdRIiBDYq/NABi0Cfo5IEBgjUGACZ6BqwcGwLxBFYRsEHIKBIJwLkBNoIHDF468GYgIBBXY4EDE4IHDYwSwCN4IGBCIp5CJYtWgBZBHAgFEMoRjEE4QDCLYJUEUoaCBPYoQCgA4FGozxFLYwfEQgqrGexIYFBoxbDS4YHCIAYVEEAZcCYwwvGfoQHEcwQHHIg9WIAS9BIoYYESoowIABQuBUgg1DVwwACEpIwBChDLFDQ5JLlZnHJAajBQwgLEO4LDBHKAhBFxQxFCIIACAwadLHgJJBAAUrQJxYFAAbKPCwRGCCqAAm")) +require("heatshrink").decompress(atob("mEwgP/ABO/AokfAgf+r4FD3lPBQcZw4FC/nD+4FC/Pn+YFCBIP7GQ4aDEIMDAol/ApQRFuAFEv0/BoQXBx0HAoPgh/nn40C4fwEoP+n/4/BWC/weBBYP5BAM/C4Pz7/7z+f//n7/z5/f//vA4Pv5//AIPv8/n//d//Ou5yBDIOfu58Bz42B+Z8Bz/8AoPgv+/AoP7w0f3IFBnc/5+bL4Oyv/nEYP/+X/mYFC+n8mff8ln+v4vfd7tfsvzvfN7tPtv2vPn6H35vg/f36vX7vj/fz9vvznH+Z3B/0+5/3/l//iDBMwMf+KEBOAPBUoOCj///CNBUQQAEA=")) From 33cb21482c21223df3e071a0f9756516ed5f52dd Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 21 Mar 2022 21:38:29 +0100 Subject: [PATCH 014/188] Create readme.md --- apps/glbasic/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/glbasic/readme.md diff --git a/apps/glbasic/readme.md b/apps/glbasic/readme.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/glbasic/readme.md @@ -0,0 +1 @@ + From 7ddcfd7565f9920e5f3fed1b5b37a97c74ec5253 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 21 Mar 2022 21:39:02 +0100 Subject: [PATCH 015/188] Add files via upload --- apps/glbasic/GLBasic-Watchface-Bangle.JS2.js | 114 +++++++++++++++++++ apps/glbasic/glbasic.icon.js | 1 + apps/glbasic/glbasic_screenshot.png | Bin 0 -> 1809 bytes apps/glbasic/icon48.png | Bin 0 -> 1365 bytes apps/glbasic/metadata.json | 18 +++ 5 files changed, 133 insertions(+) create mode 100644 apps/glbasic/GLBasic-Watchface-Bangle.JS2.js create mode 100644 apps/glbasic/glbasic.icon.js create mode 100644 apps/glbasic/glbasic_screenshot.png create mode 100644 apps/glbasic/icon48.png create mode 100644 apps/glbasic/metadata.json diff --git a/apps/glbasic/GLBasic-Watchface-Bangle.JS2.js b/apps/glbasic/GLBasic-Watchface-Bangle.JS2.js new file mode 100644 index 000000000..d51d02a10 --- /dev/null +++ b/apps/glbasic/GLBasic-Watchface-Bangle.JS2.js @@ -0,0 +1,114 @@ + +Graphics.prototype.setFontLECO1976Regular42 = function(scale) { + // Actual height 42 (41 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60+(scale<<8)+(1<<16)); +}; + +Graphics.prototype.setFontLECO1976Regular22 = function(scale) { + // Actual height 22 (21 - 0) +g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); +}; + + +require("Font7x11Numeric7Seg").add(Graphics); + + +var temperature = 13; + +//the following 2 sections are used from waveclk to schedule minutely updates +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function drawBackground() { + g.setBgColor(0,0,0); + g.setColor(1,1,1); + g.clear(); +} + +function digit(num){ + return String.fromCharCode(num + 48); +} +function timeString(h, m){ + return digit(h/10) + digit(h%10) + ":" + digit(m/10) + digit(m%10); +} +function dayString(w){ + return digit(w/10) + digit(w%10); +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return '????'; +} + + + +function draw(){ + drawBackground(); + var date = new Date(); + var h = date.getHours(), m = date.getMinutes(); + var d = date.getDate(), w = date.getDay(); + + g.setBgColor(0,0,0); + g.setColor(1,1,1); + + + // g.setFont('Vector', 30); + // g.setFont("7x11Numeric7Seg", 5); + g.setFontLECO1976Regular42(); + g.setFontAlign(0, -1); + g.drawString(timeString(h, m), g.getWidth()/2,28); + g.drawString(dayString(w), g.getWidth()*3/4,88); + g.setColor(0,1,0); + g.fillRect(0,76,g.getWidth(), 80); + g.reset(); + + // Steps + g.setFontLECO1976Regular22(); + g.setFontAlign(-1, -1); + g.drawString(getSteps(), 8, 88); + + // g.drawString(temperature, 4, 108); + + + // widget redraw + Bangle.drawWidgets(); + queueDraw(); +} + + +//////////////////////////////////////////////////// +// Bangle.setBarometerPower(true); + +Bangle.loadWidgets(); +draw(); + + +// Bangle.on('pressure', function(e){ +// temperature = e.temperature; +// draw(); +// }); + +//the following section is also from waveclk +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.setUI("clock"); + +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/glbasic/glbasic.icon.js b/apps/glbasic/glbasic.icon.js new file mode 100644 index 000000000..0c3280635 --- /dev/null +++ b/apps/glbasic/glbasic.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///ssp4XthFCBwUBqoABqAaGBZcFBZdX1W1qgLHrwLKqv/6oLJAAILHioLJn5qBAAYLEBQoLeHQQABv4LjGAgLYq2qAAOlBbBHFBdPAKcQLdWcb7jAAoLcn4LKgEVHQVUBQsAgoLLq//6oLIr2q2oXJBZQvCqALGgILTA=")) diff --git a/apps/glbasic/glbasic_screenshot.png b/apps/glbasic/glbasic_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e5ff9f714ffdca28588be6cd6e87376f12cce9 GIT binary patch literal 1809 zcmds&`!|$%9LLAggNM+JX z$6zpuF8dt4(J1(~AQ^OTZl4Z9gVafHhCQa~8F3zikr{At+VSS^u+ zRTmX$Jc_o-yeFk<_Nw`DMvt@M?ehb7Cx2@1JF5vrx{7#68Iw1*M~-Zy73qP2+ew;l zaB8w`+UZCjpD%_AHU;ACM2&rnc`y}NYFYQT9am4mtAqK{|=d zdE>aKc^355KK4vD(Wr7(`!sFm28G(ZSCE+R#Sc65;nuQu~eBq3fCkLf?ePWX)BAi zDeJdeb1O<~)jC%#R}G^VwCCb2JQc98C;hX66rOnqjc_o#Va2a`G zQ^EP(&l`?j6T4Z@{=Q*ej%XV*h;go^ZYhUmr}s5{YRP^1s+U!clq0LPScpZlP_Bg+ zy31&ir^ZBd!;6QOT4L+H2Y+9guqxL7sL-Gi-Q%~wR9(Ag z)I9k0W&rql*@Fm3wh;lUAO$+rxiHR^T*abqIR(Kd4%`)NI>zw4f1yjiX1e6dj;9g3 zm~19{om3VdLNP)sJP?D}*GH^t;SN@v`%#~c-&TfpsJ+q++qw8V`)nwOs~E;@z7Ilnfo;wMrh@ea@80m@ zw73u#xRIcnfjEKKH7&7086_Q2=f!s9VSvM6ZBu!r8k2MF@WrmUyswJY_kszl@l`2a_EBJBI=vO*#@=m z(viI-w*ovd@Th6%BeE2z^zhnnB5I#XOMMwRG6#FCb@Vd0;R6$>O0s%;Rf*YH<)hQ3tr=g|jfS_!I z6a%i(b~f9yw^#y6 z8aa@`^{q-CZ0bE!>^5U3Qd-QQ`{!pM-B*MQyQRQXTjHE1iDGuuO%FAWA78v%#4f{uHkR48&=R(DU|9i5r$V1{zloT?{-g0#DbauG%AMI0d$oe9w!tOwqX z{WR}PH#$vXPF{^1S#Zqp5gUMP;%SaAKve=pTo1abh|)*|RhL0bRKakN^Mx literal 0 HcmV?d00001 diff --git a/apps/glbasic/icon48.png b/apps/glbasic/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..368e08750d5ede99497d54b310fe9b91e03d9c10 GIT binary patch literal 1365 zcmV-b1*-aqP)Px)4@pEpRA@upn$J%oWf;f5@65Ech+x zv{2{Lr1SoGKJW9q@AEwGGXxf&j*gBFO6h${sg)5nRaJf3O2^bb#OfezZEaUYQ5<26 zhgpeNqlqU<|a5!MM+tXy)-`__( z9#8#$LlA_fU@-V^J`k4nfTAcL1GvSlA&<$o1wnW%7!2OaV+?Bo$g<3Zznss+0AlfY z{JrJnjL8}`p4TwIc*HA2YF(Z&`TV|N3A zz$du?84BR>cxDJ8uUk3qa}k8M36YTEp zVrM5|vZwa&)vv9sO$dJk(C_#AZ`$UZ?XIgKO%tB)k~ zeOsM?$OPbWxe^*+jQ#2LdS5(s4KNT?RZs-3hq1m%@Nml*fG*HbV6|8N+4QG#d;Sbsoppz&lSeLBj3C!9cC9YdJ} zgjOVc_*FUp_XC8G&!(rRuMH0mI|MRySs0P!{IVQ$id*?;AX)$vDvuA$b@u1 zkaUa|#*v-02h4zE(?HQ2+5ZCIsS1i;M#9*O7@ow(6eEcYp%ok6|03NF6iov>l&Ekr zd~>M?YqU0q$(nx@?Wa7n*j z*EFq$Qd)@X_31z$&}T~Wqeg}RnFecZZM`K3LTMB@G65)x@)3aBW^T8$tmZbQ^wp)M zrTe+8cxqcq8c-DFO#r+!bgan7E0wm?91_5}EAq9pv^*zC(r>9{)}f&xw70jXm02ey zCNMfWn!0$4s;a({&*~>qSE~akin0peS-pR@Lign4Bp$&|E$>&@`<(6bhZ)rv|btUl9c1rWOBiEEs&!V)H@V+` XI5?_a++oDw00000NkvXXu0mjfkw}hY literal 0 HcmV?d00001 diff --git a/apps/glbasic/metadata.json b/apps/glbasic/metadata.json new file mode 100644 index 000000000..03559823a --- /dev/null +++ b/apps/glbasic/metadata.json @@ -0,0 +1,18 @@ +{ + "id": "glbasic", + "name": "GLBasic Clock", + "shortName": "GLBasic", + "version": "0.01", + "description": "A clock with large numbers", + "dependencies": {"widpedom":"app"}, + "readme": "README.md", + "icon": "icon48.png", + "screenshots": [{"url":glbasic_screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + {"name":"glbasic.app.js","url":"glbasic.app.js"}, + {"name":"glbasic.img","url":"glbasic.icon.js","evaluate":true} + ] +} \ No newline at end of file From a699247ad1ca640bff3a2845baaef6363f3204a2 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 21 Mar 2022 22:02:55 +0100 Subject: [PATCH 016/188] Typos Typos --- apps/glbasic/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/glbasic/metadata.json b/apps/glbasic/metadata.json index 03559823a..f4fe042db 100644 --- a/apps/glbasic/metadata.json +++ b/apps/glbasic/metadata.json @@ -7,7 +7,7 @@ "dependencies": {"widpedom":"app"}, "readme": "README.md", "icon": "icon48.png", - "screenshots": [{"url":glbasic_screenshot.png"}], + "screenshots": [{"url":"glbasic_screenshot.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS", "BANGLEJS2"], @@ -15,4 +15,4 @@ {"name":"glbasic.app.js","url":"glbasic.app.js"}, {"name":"glbasic.img","url":"glbasic.icon.js","evaluate":true} ] -} \ No newline at end of file +} From 5beec202f964c2eb54ee60c3d08b6b31f13a0c5b Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 21 Mar 2022 22:04:25 +0100 Subject: [PATCH 017/188] Add files via upload --- apps/glbasic/glbasic.app.js | 114 ++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 apps/glbasic/glbasic.app.js diff --git a/apps/glbasic/glbasic.app.js b/apps/glbasic/glbasic.app.js new file mode 100644 index 000000000..d51d02a10 --- /dev/null +++ b/apps/glbasic/glbasic.app.js @@ -0,0 +1,114 @@ + +Graphics.prototype.setFontLECO1976Regular42 = function(scale) { + // Actual height 42 (41 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60+(scale<<8)+(1<<16)); +}; + +Graphics.prototype.setFontLECO1976Regular22 = function(scale) { + // Actual height 22 (21 - 0) +g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); +}; + + +require("Font7x11Numeric7Seg").add(Graphics); + + +var temperature = 13; + +//the following 2 sections are used from waveclk to schedule minutely updates +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function drawBackground() { + g.setBgColor(0,0,0); + g.setColor(1,1,1); + g.clear(); +} + +function digit(num){ + return String.fromCharCode(num + 48); +} +function timeString(h, m){ + return digit(h/10) + digit(h%10) + ":" + digit(m/10) + digit(m%10); +} +function dayString(w){ + return digit(w/10) + digit(w%10); +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return '????'; +} + + + +function draw(){ + drawBackground(); + var date = new Date(); + var h = date.getHours(), m = date.getMinutes(); + var d = date.getDate(), w = date.getDay(); + + g.setBgColor(0,0,0); + g.setColor(1,1,1); + + + // g.setFont('Vector', 30); + // g.setFont("7x11Numeric7Seg", 5); + g.setFontLECO1976Regular42(); + g.setFontAlign(0, -1); + g.drawString(timeString(h, m), g.getWidth()/2,28); + g.drawString(dayString(w), g.getWidth()*3/4,88); + g.setColor(0,1,0); + g.fillRect(0,76,g.getWidth(), 80); + g.reset(); + + // Steps + g.setFontLECO1976Regular22(); + g.setFontAlign(-1, -1); + g.drawString(getSteps(), 8, 88); + + // g.drawString(temperature, 4, 108); + + + // widget redraw + Bangle.drawWidgets(); + queueDraw(); +} + + +//////////////////////////////////////////////////// +// Bangle.setBarometerPower(true); + +Bangle.loadWidgets(); +draw(); + + +// Bangle.on('pressure', function(e){ +// temperature = e.temperature; +// draw(); +// }); + +//the following section is also from waveclk +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.setUI("clock"); + +Bangle.drawWidgets(); \ No newline at end of file From a23e4ecd38f135228663f7cbea43bf4904ae82c3 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 21 Mar 2022 22:06:03 +0100 Subject: [PATCH 018/188] Update metadata.json --- apps/glbasic/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/glbasic/metadata.json b/apps/glbasic/metadata.json index f4fe042db..589ea6004 100644 --- a/apps/glbasic/metadata.json +++ b/apps/glbasic/metadata.json @@ -5,7 +5,7 @@ "version": "0.01", "description": "A clock with large numbers", "dependencies": {"widpedom":"app"}, - "readme": "README.md", + "readme": "readme.md", "icon": "icon48.png", "screenshots": [{"url":"glbasic_screenshot.png"}], "type": "clock", From e7f3c0f00e23b8ee9f732bb85ccc5a7cb147d3a7 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 22 Mar 2022 06:41:32 +0100 Subject: [PATCH 019/188] Added Calendar --- apps/glbasic/glbasic.app.js | 145 ++++++++++++++++++++++++++++-------- 1 file changed, 116 insertions(+), 29 deletions(-) diff --git a/apps/glbasic/glbasic.app.js b/apps/glbasic/glbasic.app.js index d51d02a10..b2b6f45ed 100644 --- a/apps/glbasic/glbasic.app.js +++ b/apps/glbasic/glbasic.app.js @@ -1,20 +1,17 @@ - Graphics.prototype.setFontLECO1976Regular42 = function(scale) { // Actual height 42 (41 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60+(scale<<8)+(1<<16)); + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60 + (scale << 8) + (1 << 16)); }; Graphics.prototype.setFontLECO1976Regular22 = function(scale) { // Actual height 22 (21 - 0) -g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22 + (scale << 8) + (1 << 16)); }; require("Font7x11Numeric7Seg").add(Graphics); -var temperature = 13; - //the following 2 sections are used from waveclk to schedule minutely updates // timeout used to update every minute var drawTimeout; @@ -29,19 +26,21 @@ function queueDraw() { } function drawBackground() { - g.setBgColor(0,0,0); - g.setColor(1,1,1); + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); g.clear(); } -function digit(num){ +function digit(num) { return String.fromCharCode(num + 48); } -function timeString(h, m){ - return digit(h/10) + digit(h%10) + ":" + digit(m/10) + digit(m%10); + +function timeString(h, m) { + return digit(h / 10) + digit(h % 10) + ":" + digit(m / 10) + digit(m % 10); } -function dayString(w){ - return digit(w/10) + digit(w%10); + +function dayString(w) { + return digit(w / 10) + digit(w % 10); } function getSteps() { @@ -51,36 +50,124 @@ function getSteps() { return '????'; } +/** + * draws calender week view (-1,0,1) for given date + */ +function drawCal() { + d = /*this.date ? this.date : */ new Date(); + + const DAY_NAME_FONT_SIZE = 10; + const CAL_Y = g.getHeight() - 44; // Bangle.appRect.y+this.DATE_FONT_SIZE()+10+this.TIME_FONT_SIZE()+3; + const CAL_AREA_H = 44; // g.getHeight()-CAL_Y+24; //+24: top widgtes only + const CELL_W = g.getWidth() / 7; //cell width + const CELL_H = (CAL_AREA_H - DAY_NAME_FONT_SIZE) / 3; //cell heigth + const DAY_NUM_FONT_SIZE = Math.min(CELL_H + 3, 15); //size down, max 15 + + const wdStrt = 1; + + const ABR_DAY = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + const IS_SUNDAY = [1, 0, 0, 0, 0, 1, 1]; // what days are sunday? + const nrgb = ["#000", "#FFF", "#F00", "#0F0", "#00F", "#FF0"]; //fg, r ,g , b + const suClr = 5; // sunday color fg + const tdyMrkClr = 3; // today bk + const tdyNumClr = 0; // today fg + + g.setFont("Vector", DAY_NAME_FONT_SIZE+3); + g.setColor(nrgb[1]); + g.setFontAlign(-1, -1); + // g.clearRect(Bangle.appRect.x, CAL_Y, Bangle.appRect.x2, CAL_Y+CAL_AREA_H); + + //draw grid & Headline + const dNames = ABR_DAY.map((a) => a.length <= 2 ? a : a.substr(0, 2)); //force shrt 2 + for (var dNo = 0; dNo < dNames.length; dNo++) { + const dIdx = wdStrt >= 0 ? ((wdStrt + dNo) % 7) : ((dNo + d.getDay() + 4) % 7); + const dName = dNames[dIdx]; + // if(dNo>0) { g.drawLine(dNo*CELL_W, CAL_Y, dNo*CELL_W, CAL_Y+CAL_AREA_H-1);} -function draw(){ + var colTx = 0; + var colBk = 1; + if (IS_SUNDAY[dIdx]) { + colBk = suClr; + } + + g.setColor(nrgb[colBk]); + g.fillRect(dNo * CELL_W, CAL_Y, dNo * CELL_W + CELL_W, CAL_Y + DAY_NAME_FONT_SIZE-1); + g.setColor(nrgb[colTx]); + g.drawString(dName, dNo * CELL_W + (CELL_W - g.stringWidth(dName)) / 2 + 2, CAL_Y-1); + // g.setColor(nrgb[clTxt]); + } + g.setColor(nrgb[1]); + var nextY = CAL_Y + DAY_NAME_FONT_SIZE; + + // horizontal lines + // for(i=0; i<3; i++){ const y=nextY+i*CELL_H; g.drawLine(Bangle.appRect.x, y, Bangle.appRect.x2, y); } + + g.setFont("Vector", DAY_NUM_FONT_SIZE); + + g.setFont("7x11Numeric7Seg", 1); + + //write days + const tdyDate = d.getDate(); + const days = wdStrt >= 0 ? 7 + ((7 + d.getDay() - wdStrt) % 7) : 10; //start day (week before=7 days + days in this week realtive to week start) or fixed 7+3 days + var rD = new Date(d.getTime()); + rD.setDate(rD.getDate() - days); + var rDate = rD.getDate(); + for (var y = 0; y < 3; y++) { + for (var x = 0; x < dNames.length; x++) { + if (rDate === tdyDate) { //today + g.setColor(nrgb[tdyMrkClr]); //today marker color or fg color + + // rectangle + g.fillRect(x * CELL_W, nextY + CELL_H-1, x * CELL_W + CELL_W, nextY + CELL_H + CELL_H - 1); + g.setColor(nrgb[tdyNumClr]); //today color or fg color + + // simulate "bold" + g.drawString(rDate, 1+ x * CELL_W + ((CELL_W - g.stringWidth(rDate)) / 2) + 2, nextY + ((CELL_H - DAY_NUM_FONT_SIZE + 2) / 2) + (CELL_H * y)); + + } else if (IS_SUNDAY[rD.getDay()]) { //sundays + g.setColor(nrgb[suClr]); + } else { //default + g.setColor(nrgb[1]); + } + g.drawString(rDate, x * CELL_W + ((CELL_W - g.stringWidth(rDate)) / 2) + 2, nextY + ((CELL_H - DAY_NUM_FONT_SIZE + 2) / 2) + (CELL_H * y)); + rD.setDate(rDate + 1); + rDate = rD.getDate(); + } + } +} + + +function draw() { drawBackground(); var date = new Date(); - var h = date.getHours(), m = date.getMinutes(); - var d = date.getDate(), w = date.getDay(); + var h = date.getHours(), + m = date.getMinutes(); + var d = date.getDate(), + w = date.getDay(); // d=1..31; w=0..6 + + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); + - g.setBgColor(0,0,0); - g.setColor(1,1,1); - - // g.setFont('Vector', 30); // g.setFont("7x11Numeric7Seg", 5); g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); - g.drawString(timeString(h, m), g.getWidth()/2,28); - g.drawString(dayString(w), g.getWidth()*3/4,88); - g.setColor(0,1,0); - g.fillRect(0,76,g.getWidth(), 80); + g.drawString(timeString(h, m), g.getWidth() / 2, 28); + g.drawString(dayString(d), g.getWidth() * 3 / 4, 88); + g.setColor(0, 1, 0); + g.fillRect(0, 76, g.getWidth(), 80); g.reset(); - + // Steps g.setFontLECO1976Regular22(); g.setFontAlign(-1, -1); g.drawString(getSteps(), 8, 88); - // g.drawString(temperature, 4, 108); - - + drawCal(); + + // widget redraw Bangle.drawWidgets(); queueDraw(); @@ -100,7 +187,7 @@ draw(); // }); //the following section is also from waveclk -Bangle.on('lcdPower',on=>{ +Bangle.on('lcdPower', on => { if (on) { draw(); // draw immediately, queue redraw } else { // stop draw timer @@ -111,4 +198,4 @@ Bangle.on('lcdPower',on=>{ Bangle.setUI("clock"); -Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); From 9df926f062d49c6087bc462061e2ca7edb4ac33a Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 22 Mar 2022 06:42:31 +0100 Subject: [PATCH 020/188] Version --- apps/glbasic/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/glbasic/metadata.json b/apps/glbasic/metadata.json index 589ea6004..9d8f5ec7b 100644 --- a/apps/glbasic/metadata.json +++ b/apps/glbasic/metadata.json @@ -2,7 +2,7 @@ "id": "glbasic", "name": "GLBasic Clock", "shortName": "GLBasic", - "version": "0.01", + "version": "0.2", "description": "A clock with large numbers", "dependencies": {"widpedom":"app"}, "readme": "readme.md", From 200e6fcc1dab2d087a825e824d0ea4b065c3abe8 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 22 Mar 2022 07:42:40 +0100 Subject: [PATCH 021/188] Update widget.js Buzz on connection loss. --- apps/widbt/widget.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index c7ef8c0ad..a6c15a97f 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -5,8 +5,11 @@ WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { else g.setColor(g.theme.dark ? "#666" : "#999"); g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); -},changed:function() { +},connect:function() { + WIDGETS["bluetooth"].draw(); +},dicconnect:function() { + Bangle.buzz(1000,1); // buzz on connection loss WIDGETS["bluetooth"].draw(); }}; -NRF.on('connect',WIDGETS["bluetooth"].changed); -NRF.on('disconnect',WIDGETS["bluetooth"].changed); +NRF.on('connect',WIDGETS["bluetooth"].connect); +NRF.on('disconnect',WIDGETS["bluetooth"].disconnect); From 0743af578641b5886b2fef52bb769d5cef2f83dc Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 22 Mar 2022 07:45:00 +0100 Subject: [PATCH 022/188] Update metadata.json --- apps/widbt/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt/metadata.json b/apps/widbt/metadata.json index e2d5082a5..78a61496c 100644 --- a/apps/widbt/metadata.json +++ b/apps/widbt/metadata.json @@ -1,7 +1,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.08", + "version": "0.09", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", From aa118dc3fa40501193874727235f9c86e4c7bedb Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 22 Mar 2022 07:46:04 +0100 Subject: [PATCH 023/188] Update ChangeLog 0.09 --- apps/widbt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 4c2132122..3b9024ee4 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -5,3 +5,4 @@ 0.06: Tweaking colors for dark/light themes and low bpp screens 0.07: Memory usage improvements 0.08: Disable LCD on, on bluetooth status change +0.09: Vibrate on connection loss From c7242674f27f4be0d0ab2576a855169a2d6ba6fe Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 23 Mar 2022 09:20:59 +0100 Subject: [PATCH 024/188] Update widget.js Typos --- apps/widbt/widget.js | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index a6c15a97f..246b8d65b 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -1,15 +1,23 @@ -WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { - g.reset(); - if (NRF.getSecurityStatus().connected) - g.setColor((g.getBPP()>8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); - else - g.setColor(g.theme.dark ? "#666" : "#999"); - g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); -},connect:function() { - WIDGETS["bluetooth"].draw(); -},dicconnect:function() { - Bangle.buzz(1000,1); // buzz on connection loss - WIDGETS["bluetooth"].draw(); -}}; -NRF.on('connect',WIDGETS["bluetooth"].connect); -NRF.on('disconnect',WIDGETS["bluetooth"].disconnect); +WIDGETS.bluetooth = { + area: "tr", + width: 15, + draw: function() { + g.reset(); + if (NRF.getSecurityStatus().connected) { + g.setColor((g.getBPP() > 8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); + } else { + g.setColor(g.theme.dark ? "#666" : "#999"); + } + g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), 2 + this.x, 2 + this.y); + }, + connect: function() { + WIDGETS.bluetooth.draw(); + }, + diconnect: function() { + Bangle.buzz(1000, 1); // buzz on connection loss + WIDGETS.bluetooth.draw(); + } +}; + +NRF.on('connect', WIDGETS.bluetooth.connect); +NRF.on('disconnect', WIDGETS.bluetooth.diconnect); From 8d7cf2dde6f2e40801abcda5d8dcd9df5cf9ad97 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 23 Mar 2022 09:21:48 +0100 Subject: [PATCH 025/188] Update ChangeLog bug fix --- apps/widbt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 3b9024ee4..04bff2b1a 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -6,3 +6,4 @@ 0.07: Memory usage improvements 0.08: Disable LCD on, on bluetooth status change 0.09: Vibrate on connection loss +0.10: Bug fix From ef6fcc92f0423954d444b9d26948b9b142474f92 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 23 Mar 2022 09:22:10 +0100 Subject: [PATCH 026/188] Update metadata.json version update --- apps/widbt/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt/metadata.json b/apps/widbt/metadata.json index 78a61496c..29d960f33 100644 --- a/apps/widbt/metadata.json +++ b/apps/widbt/metadata.json @@ -1,7 +1,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.09", + "version": "0.10", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", From b8e495d422b824b173df487240bf6f1265cd01ba Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 23 Mar 2022 09:40:36 +0100 Subject: [PATCH 027/188] Add files via upload updated screenshot --- apps/glbasic/glbasic_screenshot.png | Bin 1809 -> 2678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/glbasic/glbasic_screenshot.png b/apps/glbasic/glbasic_screenshot.png index e6e5ff9f714ffdca28588be6cd6e87376f12cce9..151ee38b922b4a10c35d81e44a2ecdcae1556759 100644 GIT binary patch literal 2678 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 From 60c3a3249459c7219ed28b8b1c8d6b9f7cd98fe8 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Wed, 23 Mar 2022 21:52:26 +0100 Subject: [PATCH 029/188] waypointer Bangle.js 2 compatibility --- apps/waypointer/ChangeLog | 2 ++ apps/waypointer/README.md | 2 +- apps/waypointer/app.js | 55 ++++++++++++++++++----------------- apps/waypointer/metadata.json | 4 +-- 4 files changed, 34 insertions(+), 29 deletions(-) create mode 100644 apps/waypointer/ChangeLog diff --git a/apps/waypointer/ChangeLog b/apps/waypointer/ChangeLog new file mode 100644 index 000000000..1b584f7dd --- /dev/null +++ b/apps/waypointer/ChangeLog @@ -0,0 +1,2 @@ +0.01: New app! +0.02: Make Bangle.js 2 compatible diff --git a/apps/waypointer/README.md b/apps/waypointer/README.md index e98fdbb7e..c0b4c5125 100644 --- a/apps/waypointer/README.md +++ b/apps/waypointer/README.md @@ -24,7 +24,7 @@ need to travel in to reach the selected waypoint. The blue text is the name of the current waypoint. NONE means that there is no waypoint set and so bearing and distance will remain at 0. To select a waypoint, press BTN2 (middle) and wait for the blue text to turn -white. Then use BTN1 and BTN3 to select a waypoint. The waypoint +white. Then use BTN1 and BTN3 (swipe up/down on Bangle.js 2) to select a waypoint. The waypoint choice is fixed by pressing BTN2 again. In the screen shot below a waypoint giving the location of Stone Henge has been selected. diff --git a/apps/waypointer/app.js b/apps/waypointer/app.js index d3aab7c50..615fbbc36 100644 --- a/apps/waypointer/app.js +++ b/apps/waypointer/app.js @@ -1,24 +1,25 @@ -var pal_by = new Uint16Array([0x0000,0xFFC0],0,1); // black, yellow -var pal_bw = new Uint16Array([0x0000,0xffff],0,1); // black, white -var pal_bb = new Uint16Array([0x0000,0x07ff],0,1); // black, blue +const scale = g.getWidth()/240; +var pal_by = new Uint16Array([g.getBgColor(),0xFFC0],0,1); // black, yellow +var pal_bw = new Uint16Array([g.getBgColor(),g.getColor()],0,1); // black, white +var pal_bb = new Uint16Array([g.getBgColor(),0x07ff],0,1); // black, blue // having 3 2 color pallette keeps the memory requirement lower -var buf1 = Graphics.createArrayBuffer(160,160,1, {msb:true}); -var buf2 = Graphics.createArrayBuffer(80,40,1, {msb:true}); +var buf1 = Graphics.createArrayBuffer(160*scale,160*scale,1, {msb:true}); +var buf2 = Graphics.createArrayBuffer(g.getWidth()/3,40*scale,1, {msb:true}); var arrow_img = require("heatshrink").decompress(atob("lEowIPMjAEDngEDvwED/4DCgP/wAEBgf/4AEBg//8AEBh//+AEBj///AEBn///gEBv///wmCAAImCAAIoBFggE/AkaaEABo=")); function flip1(x,y) { - g.drawImage({width:160,height:160,bpp:1,buffer:buf1.buffer, palette:pal_by},x,y); + g.drawImage({width:160*scale,height:160*scale,bpp:1,buffer:buf1.buffer, palette:pal_by},x,y); buf1.clear(); } function flip2_bw(x,y) { - g.drawImage({width:80,height:40,bpp:1,buffer:buf2.buffer, palette:pal_bw},x,y); + g.drawImage({width:g.getWidth()/3,height:40*scale,bpp:1,buffer:buf2.buffer, palette:pal_bw},x,y); buf2.clear(); } function flip2_bb(x,y) { - g.drawImage({width:80,height:40,bpp:1,buffer:buf2.buffer, palette:pal_bb},x,y); + g.drawImage({width:g.getWidth()/3,height:40*scale,bpp:1,buffer:buf2.buffer, palette:pal_bb},x,y); buf2.clear(); } @@ -51,12 +52,12 @@ function drawCompass(course) { previous.course = course; buf1.setColor(1); - buf1.fillCircle(80,80,79,79); + buf1.fillCircle(buf1.getWidth()/2,buf1.getHeight()/2,79*scale); buf1.setColor(0); - buf1.fillCircle(80,80,69,69); + buf1.fillCircle(buf1.getWidth()/2,buf1.getHeight()/2,69*scale); buf1.setColor(1); - buf1.drawImage(arrow_img, 80, 80, {scale:3, rotate:radians(course)} ); - flip1(40, 30); + buf1.drawImage(arrow_img, buf1.getWidth()/2, buf1.getHeight()/2, {scale:3*scale, rotate:radians(course)} ); + flip1(40*scale, Bangle.appRect.y+6*scale); } /***** COMPASS CODE ***********/ @@ -138,7 +139,7 @@ function distance(a,b){ function drawN(){ - buf2.setFont("Vector",24); + buf2.setFont("Vector",24*scale); var bs = wp_bearing.toString(); bs = wp_bearing<10?"00"+bs : wp_bearing<100 ?"0"+bs : bs; var dst = loc.distance(dist); @@ -147,12 +148,12 @@ function drawN(){ // show distance on the left if (previous.dst !== dst) { - previous.dst = dst + previous.dst = dst; buf2.setColor(1); buf2.setFontAlign(-1,-1); - buf2.setFont("Vector", 20); + buf2.setFont("Vector", 20*scale); buf2.drawString(dst,0,0); - flip2_bw(0, 200); + flip2_bw(0, g.getHeight()-40*scale); } // bearing, place in middle at bottom of compass @@ -160,9 +161,9 @@ function drawN(){ previous.bs = bs; buf2.setColor(1); buf2.setFontAlign(0, -1); - buf2.setFont("Vector",38); - buf2.drawString(bs,40,0); - flip2_bw(80, 200); + buf2.setFont("Vector",38*scale); + buf2.drawString(bs,40*scale,0); + flip2_bw(g.getWidth()/3, g.getHeight()-40*scale); } // waypoint name on right @@ -170,13 +171,13 @@ function drawN(){ previous.selected = selected; buf2.setColor(1); buf2.setFontAlign(1,-1); // right, bottom - buf2.setFont("Vector", 20); - buf2.drawString(wp.name, 80, 0); + buf2.setFont("Vector", 20*scale); + buf2.drawString(wp.name, 80*scale, 0); if (selected) - flip2_bw(160, 200); + flip2_bw(g.getWidth()/3*2, g.getHeight()-40*scale); else - flip2_bb(160, 200); + flip2_bb(g.getWidth()/3*2, g.getHeight()-40*scale); } } @@ -229,9 +230,11 @@ function startdraw(){ } function setButtons(){ - setWatch(nextwp.bind(null,-1), BTN1, {repeat:true,edge:"falling"}); - setWatch(doselect, BTN2, {repeat:true,edge:"falling"}); - setWatch(nextwp.bind(null,1), BTN3, {repeat:true,edge:"falling"}); + Bangle.setUI("updown", d=>{ + if (d<0) { nextwp(-1); } + else if (d>0) { nextwp(1); } + else { doselect(); } + }); } Bangle.on('lcdPower',function(on) { diff --git a/apps/waypointer/metadata.json b/apps/waypointer/metadata.json index cb477107b..111259bbc 100644 --- a/apps/waypointer/metadata.json +++ b/apps/waypointer/metadata.json @@ -1,11 +1,11 @@ { "id": "waypointer", "name": "Way Pointer", - "version": "0.01", + "version": "0.02", "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", "icon": "waypointer.png", "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "interface": "waypoints.html", "storage": [ From 6dbe7dfee1ddc3a661c509fc298b36063f033a28 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Fri, 25 Mar 2022 00:31:38 +0100 Subject: [PATCH 030/188] Bug: Fixed issue #1609 added a message popup state handler to control unwanted screen redraw --- apps/game1024/app.js | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 9f6081376..133630634 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -144,6 +144,13 @@ const buttons = { }, add: function(btn) { this.all.push(btn); + }, + isPopUpActive: false, + activatePopUp: function() { + this.isPopUpActive = true; + }, + deActivatePopUp: function() { + this.isPopUpActive = false; } }; /** @@ -253,7 +260,6 @@ const dragThreshold = 10; const clickThreshold = 3; let allSquares = []; -// let buttons = []; class Button { constructor(name, x0, y0, width, height, text, bg, fg, cb, enabled) { @@ -483,6 +489,7 @@ function initGame() { Bangle.drawWidgets(); } function drawPopUp(message,cb) { + buttons.activatePopUp(); g.setColor('#FFFFFF'); let rDims = Bangle.appRect; g.fillPoly([rDims.x+10, rDims.y+20, @@ -505,6 +512,7 @@ function drawPopUp(message,cb) { g.drawString(message, rDims.x+20, rDims.y+20); buttons.add(btnYes); buttons.add(btnNo); + } function handlePopUpClicks(btn) { const name = btn.name; @@ -512,6 +520,7 @@ function handlePopUpClicks(btn) { buttons.all.pop(); // remove the yes button buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again debug(() => console.log("Button name =", name)); + buttons.deActivatePopUp(); switch (name) { case 'yes': resetGame(); @@ -568,14 +577,13 @@ function handleclick(e) { // Handle a drag event (moving the stones around) function handledrag(e) { - /*debug(Math.abs(e.dx) > Math.abs(e.dy) ? - (e.dx > 0 ? e => console.log('To the right') : e => console.log('To the left') ) : - (e.dy > 0 ? e => console.log('Move down') : e => console.log('Move up') )); - */ - // [move.right, move.left, move.up, move.down] - runGame((Math.abs(e.dx) > Math.abs(e.dy) ? - (e.dx > 0 ? mover.direction.right : mover.direction.left ) : - (e.dy > 0 ? mover.direction.down : mover.direction.up ))); + // Stop moving things around when the popup message is active + // Bangleapps issue #1609 + if (!(buttons.isPopUpActive)) { + runGame((Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? mover.direction.right : mover.direction.left ) : + (e.dy > 0 ? mover.direction.down : mover.direction.up ))); + } } // Evaluate "drag" events from the UI and call handlers for drags or clicks // The UI sends a drag as a series of events indicating partial movements From a46051a88ec208a12edf48cf4ee7a3a2824a1dfc Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Fri, 25 Mar 2022 00:38:17 +0100 Subject: [PATCH 031/188] v0.06 added to metadata and changelog --- apps/game1024/ChangeLog | 3 ++- apps/game1024/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog index ffb1f94bc..8759fb428 100644 --- a/apps/game1024/ChangeLog +++ b/apps/game1024/ChangeLog @@ -2,4 +2,5 @@ 0.02: Temporary intermediate version 0.03: Basic colors 0.04: Bug fix score reset after Game Over, new icon -0.05: Chevron marker on the randomly added square \ No newline at end of file +0.05: Chevron marker on the randomly added square +0.06: Fixed issue 1609 added a message popup state handler to control unwanted screen redraw \ No newline at end of file diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 557d77b89..73d7607f3 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.05", + "version": "0.06", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", From f8d64ab7dd51ce9e391b27001b364226d2021f94 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:19:24 -0500 Subject: [PATCH 032/188] Create app.js --- apps/gsat/app.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 apps/gsat/app.js diff --git a/apps/gsat/app.js b/apps/gsat/app.js new file mode 100644 index 000000000..3a7d443fe --- /dev/null +++ b/apps/gsat/app.js @@ -0,0 +1,38 @@ +// Clear screen +g.clear(); + +const secsinmin = 60; +const quickfixperiod = 900; +var seconds = 1200; + +function countSecs() { + if (seconds != 0) {seconds -=1;} + console.log(seconds); +} +function drawTime() { + g.clear(); + g.setFontAlign(0,0); + g.setFont('Vector', 12); + g.drawString('Geek Squad Appointment Timer', 125, 20); + if (seconds == 0) { + g.setFont('Vector', 35); + g.drawString('Appointment', 125, 100); + g.drawString('finished!', 125, 150); + Bangle.buzz(); + return; + } + min = seconds / secsinmin; + if (seconds < quickfixperiod) { + g.setFont('Vector', 20); + g.drawString('Quick Fix', 125, 50); + g.drawString('Period Passed!', 125, 75); + } + g.setFont('Vector', 50); + g.drawString(Math.ceil(min), 125, 125); + g.setFont('Vector', 25); + g.drawString('minutes', 125, 165); + g.drawString('remaining', 125, 195); +} +drawTime(); +setInterval(countSecs, 1000); +setInterval(drawTime, 60000); From 840cecf976d2444edcae2c7466fc8a3c798594c3 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:22:45 -0500 Subject: [PATCH 033/188] Create metadata.json --- apps/gsat/metadata.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apps/gsat/metadata.json diff --git a/apps/gsat/metadata.json b/apps/gsat/metadata.json new file mode 100644 index 000000000..cda1f7096 --- /dev/null +++ b/apps/gsat/metadata.json @@ -0,0 +1,14 @@ +{ + "id": "gsat", + "name": "Geek Squad Appointment Timer", + "shortName": "gsat", + "version": "0.01", + "description": "Starts a 20 minute timer for appointments at Geek Squad.", + "icon": "app.png", + "tags": "tool", + "readme": "README.md", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gsat.app.js","url":"app.js"}, + ] +} From 027048302aa4ba67c68d7bffd1f4960048f2e687 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:23:20 -0500 Subject: [PATCH 034/188] Add app png --- apps/gsat/icons8-clock-48.png | Bin 0 -> 929 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gsat/icons8-clock-48.png diff --git a/apps/gsat/icons8-clock-48.png b/apps/gsat/icons8-clock-48.png new file mode 100644 index 0000000000000000000000000000000000000000..cf057046be6eca51564a213bc3e7307271464009 GIT binary patch literal 929 zcmV;S177@zP)hL^4Q9~j~`7LX9JB(!Q` zf!g{&{RcFW&Q~mny+EQd5wRkG(GU|*v#i00#krWf=gz{s+-Te{nPTqF`ObG{=bo84 z7wV|v|Hht3JPkk}FaUG|9Y7m!Ao=|p@Bx?yW`SwoCGazne{UQEt^-TJmSbB2t^w^e zR}HiRcY*JgVs~m~;0|!8R^p4mY6RiBtpaENr0^Uv>(vCT0r!Cspcg0r`;t~jo{azx zfb|`CCKF##(F8oL;_xjnl#FrV8%ADg6Xz30z8#UnEWQMc5jI;nU_9Z{{Eq{QD8L7t!&STXpy9ZFm@kj^1Fem7{l-O!eBYr8>b)d^b3W}9W~#A6U*g95Oi>^=c4 z)~Zv`8K;EXvhfK3pp)!7am&FTkR7(HNX8sFd;lS+^%_N}!U1DH{Ly|K9>B#6_hueBM`PvzgXPMrIx>vGBiU)6Z4 zEpn3sb9fkCLB-z-YcKpmwJ#|r9RWl zC5~dFfRx^~zcZo4lLpcS%$dU%U1Vo|3%C)3JcraOHF*iC9^?bK^S~v{rNu|U-T>|j zG$FN0?PUAC7)9=|wrEE3yiS#A@zILA+sGlcN|VDaIFIb+1>`8+h@2|>kwB-& z?yx%JM4NdN29eBAO@MFvNQ4*G7A;7*Pj7ZUZ3CJ0gS8T$MjKKwTeK9b&o&dl(GUSK zKeKitb( Date: Thu, 24 Mar 2022 20:23:55 -0500 Subject: [PATCH 035/188] Delete icons8-clock-48.png --- apps/gsat/icons8-clock-48.png | Bin 929 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/gsat/icons8-clock-48.png diff --git a/apps/gsat/icons8-clock-48.png b/apps/gsat/icons8-clock-48.png deleted file mode 100644 index cf057046be6eca51564a213bc3e7307271464009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmV;S177@zP)hL^4Q9~j~`7LX9JB(!Q` zf!g{&{RcFW&Q~mny+EQd5wRkG(GU|*v#i00#krWf=gz{s+-Te{nPTqF`ObG{=bo84 z7wV|v|Hht3JPkk}FaUG|9Y7m!Ao=|p@Bx?yW`SwoCGazne{UQEt^-TJmSbB2t^w^e zR}HiRcY*JgVs~m~;0|!8R^p4mY6RiBtpaENr0^Uv>(vCT0r!Cspcg0r`;t~jo{azx zfb|`CCKF##(F8oL;_xjnl#FrV8%ADg6Xz30z8#UnEWQMc5jI;nU_9Z{{Eq{QD8L7t!&STXpy9ZFm@kj^1Fem7{l-O!eBYr8>b)d^b3W}9W~#A6U*g95Oi>^=c4 z)~Zv`8K;EXvhfK3pp)!7am&FTkR7(HNX8sFd;lS+^%_N}!U1DH{Ly|K9>B#6_hueBM`PvzgXPMrIx>vGBiU)6Z4 zEpn3sb9fkCLB-z-YcKpmwJ#|r9RWl zC5~dFfRx^~zcZo4lLpcS%$dU%U1Vo|3%C)3JcraOHF*iC9^?bK^S~v{rNu|U-T>|j zG$FN0?PUAC7)9=|wrEE3yiS#A@zILA+sGlcN|VDaIFIb+1>`8+h@2|>kwB-& z?yx%JM4NdN29eBAO@MFvNQ4*G7A;7*Pj7ZUZ3CJ0gS8T$MjKKwTeK9b&o&dl(GUSK zKeKitb( Date: Thu, 24 Mar 2022 20:24:22 -0500 Subject: [PATCH 036/188] Add files via upload --- apps/gsat/app.png | Bin 0 -> 929 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gsat/app.png diff --git a/apps/gsat/app.png b/apps/gsat/app.png new file mode 100644 index 0000000000000000000000000000000000000000..cf057046be6eca51564a213bc3e7307271464009 GIT binary patch literal 929 zcmV;S177@zP)hL^4Q9~j~`7LX9JB(!Q` zf!g{&{RcFW&Q~mny+EQd5wRkG(GU|*v#i00#krWf=gz{s+-Te{nPTqF`ObG{=bo84 z7wV|v|Hht3JPkk}FaUG|9Y7m!Ao=|p@Bx?yW`SwoCGazne{UQEt^-TJmSbB2t^w^e zR}HiRcY*JgVs~m~;0|!8R^p4mY6RiBtpaENr0^Uv>(vCT0r!Cspcg0r`;t~jo{azx zfb|`CCKF##(F8oL;_xjnl#FrV8%ADg6Xz30z8#UnEWQMc5jI;nU_9Z{{Eq{QD8L7t!&STXpy9ZFm@kj^1Fem7{l-O!eBYr8>b)d^b3W}9W~#A6U*g95Oi>^=c4 z)~Zv`8K;EXvhfK3pp)!7am&FTkR7(HNX8sFd;lS+^%_N}!U1DH{Ly|K9>B#6_hueBM`PvzgXPMrIx>vGBiU)6Z4 zEpn3sb9fkCLB-z-YcKpmwJ#|r9RWl zC5~dFfRx^~zcZo4lLpcS%$dU%U1Vo|3%C)3JcraOHF*iC9^?bK^S~v{rNu|U-T>|j zG$FN0?PUAC7)9=|wrEE3yiS#A@zILA+sGlcN|VDaIFIb+1>`8+h@2|>kwB-& z?yx%JM4NdN29eBAO@MFvNQ4*G7A;7*Pj7ZUZ3CJ0gS8T$MjKKwTeK9b&o&dl(GUSK zKeKitb( Date: Thu, 24 Mar 2022 20:25:34 -0500 Subject: [PATCH 037/188] Create README.md --- apps/gsat/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apps/gsat/README.md diff --git a/apps/gsat/README.md b/apps/gsat/README.md new file mode 100644 index 000000000..faf986947 --- /dev/null +++ b/apps/gsat/README.md @@ -0,0 +1,3 @@ +# Geek Squad Appointment Timer + +An app dedicated to setting a 20 minute timer for Geek Squad Appointments. From b0f530107d33d849fe0f83b2e7fc0a0e9e7d11bf Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:26:21 -0500 Subject: [PATCH 038/188] Create ChangeLog --- apps/gsat/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/gsat/ChangeLog diff --git a/apps/gsat/ChangeLog b/apps/gsat/ChangeLog new file mode 100644 index 000000000..48156d0d4 --- /dev/null +++ b/apps/gsat/ChangeLog @@ -0,0 +1 @@ +0.01: Added Source Code From 62b2d94e9363257c5c321ae7aa80da8c7dc62034 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:27:52 -0500 Subject: [PATCH 039/188] Update metadata.json --- apps/gsat/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gsat/metadata.json b/apps/gsat/metadata.json index cda1f7096..678e1eb19 100644 --- a/apps/gsat/metadata.json +++ b/apps/gsat/metadata.json @@ -9,6 +9,6 @@ "readme": "README.md", "supports": ["BANGLEJS"], "storage": [ - {"name":"gsat.app.js","url":"app.js"}, + {"name":"gsat.app.js","url":"app.js"} ] } From 8f3f229c5519812dbc0ccd2c7e0e9b6ab411d006 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:31:26 -0500 Subject: [PATCH 040/188] Create app-icon.js --- apps/gsat/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/gsat/app-icon.js diff --git a/apps/gsat/app-icon.js b/apps/gsat/app-icon.js new file mode 100644 index 000000000..06f93e2ef --- /dev/null +++ b/apps/gsat/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwIdah/wAof//4ECgYFB4AFBg4FB8AFBj/wh/4AoM/wEB/gFBvwCEBAU/AQP4gfAj8AgPwAoMPwED8AFBg/AAYIBDA4ngg4TB4EBApkPKgJSBJQIFTMgIFCJIIFDKoIFEvgFBGoMAnw7DP4IFEh+BAoItBg+DNIQwBMIaeCKoKxCPoIzCEgKVHUIqtFXIrFFaIrdFdIwAV")) From b50f0d7a565994688ced0d52b1ecb64b249e19a9 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:31:55 -0500 Subject: [PATCH 041/188] Update metadata.json --- apps/gsat/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/gsat/metadata.json b/apps/gsat/metadata.json index 678e1eb19..0e81c0513 100644 --- a/apps/gsat/metadata.json +++ b/apps/gsat/metadata.json @@ -9,6 +9,7 @@ "readme": "README.md", "supports": ["BANGLEJS"], "storage": [ - {"name":"gsat.app.js","url":"app.js"} + {"name":"gsat.app.js","url":"app.js"}, + {"name":"gsat.img","url":"app-icon.js","evaluate":true} ] } From 9af8213b92312c846ce4e521c51af803f280c2f0 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:38:20 -0500 Subject: [PATCH 042/188] Update README.md --- apps/gsat/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/gsat/README.md b/apps/gsat/README.md index faf986947..17880e287 100644 --- a/apps/gsat/README.md +++ b/apps/gsat/README.md @@ -1,3 +1,4 @@ # Geek Squad Appointment Timer An app dedicated to setting a 20 minute timer for Geek Squad Appointments. +![screenshot](https://user-images.githubusercontent.com/37220586/160037582-71b46f82-aa7c-47cf-a42a-5e4bb72705c4.png) From e7ee68d5642d6b8c0a7d06406328f2a8350eab2b Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:42:15 -0500 Subject: [PATCH 043/188] Update README.md --- apps/gsat/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/gsat/README.md b/apps/gsat/README.md index 17880e287..faf986947 100644 --- a/apps/gsat/README.md +++ b/apps/gsat/README.md @@ -1,4 +1,3 @@ # Geek Squad Appointment Timer An app dedicated to setting a 20 minute timer for Geek Squad Appointments. -![screenshot](https://user-images.githubusercontent.com/37220586/160037582-71b46f82-aa7c-47cf-a42a-5e4bb72705c4.png) From 451ecd7226339b676f954588703502a7617f9af2 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:42:36 -0500 Subject: [PATCH 044/188] Add files via upload --- apps/gsat/screenshot.png | Bin 0 -> 4250 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gsat/screenshot.png diff --git a/apps/gsat/screenshot.png b/apps/gsat/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..032319bf674745ec454e9a16645aff39ba44d93f GIT binary patch literal 4250 zcmcgvc{r478-E)~$w2&EzMl74fA{bH-S>0P0&XZQC?N;{ zfUvRA2`d1Av~u1z8zG#QnA@-6oX;k-(P<0-h`i#y>tcTvkpzG(rp709t*_&z`kJD8 z%69O#xyNl_t>lp(3yAN__-LTUcZ+h}gV;{Iau3jbS2QX0+ea36#((DNnuGa5FgKP+ z2P*0QM-y8|!WgH866_izTAn*eFOcL?;!tee1kW$xT8BZ01q;v=S5-2(}=@ewRv$;=v0KZ2D~A!%RFGL^F6+@|D|6D zem7(SJzeUzJh(nFrTZl^%|`uLACy5Vp;hTl4=Y+aJ#SLc1g>FNF0PJ8nmtO=Jt zWd&R_(&PQ-VlYY(+C3w`nEg5IsJ@tdRkfg1w7bH2qVqgUDx1k#aJbE!@<{jz|9l;A z&R7yS_7L8vV_Kf#87gC0Y&9P~8TDw2x-#AtTcW|DG*qb$kjklhN4oN<OouWH0!;mRvv?SfSej4$9MND)~YZwD#&Y3`y@ELnL zhX58Q%??it&zC`8tm9#r{@H0914*R7Govzr+R3E}DswlW&eWql{%}q2 ztGM~njV1@TTeDStA;60?DV}>5Xqm{AyK*&4C^P?j@ySp&lH&EA z_y#$oLszg0wGA%vRdb0N9Ss4wdfjrQ$S*ZnvodT~g38T(f@z?C!AoQqUx$CB*pB7( zzcBOH^St3@ML~qt%RRJtra*k?UTd{dSlmot1ep2l>;)r$K3A*sV&B++(D};(iaVN` zZiD7NDD5F#JFl3_|#s@?rM#qn%BBBkMVnGOouFlZRkLf%hho^p6JgJdL3 zdD~@OKFHXumoE+i_+z$>PG_E^*Z3ZIf}3`^K7Q;-!xorg09)KCd5_&)5X?Aqfqm!G+x%S34wt)F-Ovw+nasXq-p)7*aZFV23>#r9p_pJ7 z`j#L$?4(*!vjt!0az3?Z2H}2nA!8=1Y{1-N@Jieh-X1Sn8Qq9eF`3Bn>(tT0 z%@g)a=hPf;zE;W*yXE+I`1C#8`~JRdt&I1ZfSdF+t_s_kioNgVGy;jM0aMR0S3C+j zMGq;0T#Py-93$7X`H00DzWilYl$jc6jWtLFf_HCUWaqaW+7BA~7)JLG8u$zaCmBPU zFFn5RG62 zsCVu=p4k;Q#G^)s@mUP<%vSQyc|<-$lMpR;oR5RL0&glv5FmwYK}>IszxqMu$Nkj9CJ zL_w?uF8H`yiRU}hS0@LaK{2*-!q5F)@}#uaC4)}45KoT*86$86X%I(<2w0D-EWBdk zDS1LM~N$;SCO2`rO(TmvMqNsXc`gHPupnIMzJ+ zpBj@(#pMrHgv&56i<6UbxXH|r8R9jygZCs9lrHb|+p*d=9~-U6-YnsM&O4^ew( zlgbr|T@MmU8@)g!g5W3JhSvFYU+}|^^&tqy3a;4D*gdLxZd2~z0A5Dnh9V$@nVZYT zJ`caPuZkCNCj0pZuPIIMOb@O;4Z;NIwWayo7*C%y1UI6KGSY&pmBD2H$d@;p_D^u_ hYr6cOT2SsQkk>x|=EPt9I9VS6jP>Csa*v~K{RJk1|9$`f literal 0 HcmV?d00001 From 9eff57362b1ff350b4bb320ae2f406c8c887ab76 Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:43:08 -0500 Subject: [PATCH 045/188] Update metadata.json --- apps/gsat/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/gsat/metadata.json b/apps/gsat/metadata.json index 0e81c0513..bdc8fee32 100644 --- a/apps/gsat/metadata.json +++ b/apps/gsat/metadata.json @@ -8,6 +8,7 @@ "tags": "tool", "readme": "README.md", "supports": ["BANGLEJS"], + "screenshots": [{"url":"screenshot.png"}] "storage": [ {"name":"gsat.app.js","url":"app.js"}, {"name":"gsat.img","url":"app-icon.js","evaluate":true} From db88e1800d1dec7d707d5a72697bc85d214ec4eb Mon Sep 17 00:00:00 2001 From: Smooklu <37220586+Smooklu@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:44:12 -0500 Subject: [PATCH 046/188] Update metadata.json --- apps/gsat/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gsat/metadata.json b/apps/gsat/metadata.json index bdc8fee32..878d213e4 100644 --- a/apps/gsat/metadata.json +++ b/apps/gsat/metadata.json @@ -8,7 +8,7 @@ "tags": "tool", "readme": "README.md", "supports": ["BANGLEJS"], - "screenshots": [{"url":"screenshot.png"}] + "screenshots": [{"url":"screenshot.png"}], "storage": [ {"name":"gsat.app.js","url":"app.js"}, {"name":"gsat.img","url":"app-icon.js","evaluate":true} From 9a0c31c56d41912074ba41ca034baeb7cdf17b12 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Thu, 24 Mar 2022 22:19:11 -0500 Subject: [PATCH 047/188] Fix run notifications bugs and improve accuracy --- apps/recorder/ChangeLog | 1 + apps/recorder/metadata.json | 2 +- apps/recorder/widget.js | 3 +-- apps/run/ChangeLog | 1 + apps/run/app.js | 4 ++-- apps/run/metadata.json | 2 +- apps/run/settings.js | 12 ++++++------ modules/exstats.js | 12 +++++++----- 8 files changed, 20 insertions(+), 17 deletions(-) diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 90937e160..e9877808c 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -17,3 +17,4 @@ 0.11: Fix KML and GPX export when there is no GPS data 0.12: Fix 'Back' label positioning on track/graph display, make translateable 0.13: Fix for when widget is used before app +0.14: Remove unneeded variable assignment \ No newline at end of file diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index e2400603d..d715af38d 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -2,7 +2,7 @@ "id": "recorder", "name": "Recorder", "shortName": "Recorder", - "version": "0.13", + "version": "0.14", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget", diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 221bc6c1a..4a105754b 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -248,7 +248,7 @@ } var buttons={Yes:"yes",No:"no"}; if (newFileName) buttons["New"] = "new"; - var prompt = E.showPrompt("Overwrite\nLog " + settings.file.match(/\d+/)[0] + "?",{title:"Recorder",buttons:buttons}).then(selection=>{ + return E.showPrompt("Overwrite\nLog " + settings.file.match(/\d+/)[0] + "?",{title:"Recorder",buttons:buttons}).then(selection=>{ if (selection==="no") return false; // just cancel if (selection==="yes") { require("Storage").open(settings.file,"r").erase(); @@ -259,7 +259,6 @@ } return WIDGETS["recorder"].setRecording(1); }); - return prompt; } settings.recording = isOn; updateSettings(settings); diff --git a/apps/run/ChangeLog b/apps/run/ChangeLog index 401a68de9..46fdb7e7e 100644 --- a/apps/run/ChangeLog +++ b/apps/run/ChangeLog @@ -9,3 +9,4 @@ 0.08: Added support for notifications from exstats. Support all stats from exstats 0.09: Fix broken start/stop if recording not enabled (fix #1561) 0.10: Don't allow the same setting to be chosen for 2 boxes (fix #1578) +0.11: Notifications fixes \ No newline at end of file diff --git a/apps/run/app.js b/apps/run/app.js index d066c8b1f..fb8158e58 100644 --- a/apps/run/app.js +++ b/apps/run/app.js @@ -59,7 +59,7 @@ function onStartStop() { layout.render(); }) ); - } else { + } else if (!settings.record && WIDGETS["recorder"]) { prepPromises.push( WIDGETS["recorder"].setRecording(false) ); @@ -124,7 +124,7 @@ function configureNotification(stat) { } Object.keys(settings.notify).forEach((statType) => { - if (settings.notify[statType].increment > 0) { + if (settings.notify[statType].increment > 0 && exs.stats[statType]) { configureNotification(exs.stats[statType]); } }); diff --git a/apps/run/metadata.json b/apps/run/metadata.json index 51239d297..09e5a3bed 100644 --- a/apps/run/metadata.json +++ b/apps/run/metadata.json @@ -1,6 +1,6 @@ { "id": "run", "name": "Run", - "version":"0.10", + "version":"0.11", "description": "Displays distance, time, steps, cadence, pace and more for runners.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps", diff --git a/apps/run/settings.js b/apps/run/settings.js index 949f7a235..6a7d169c4 100644 --- a/apps/run/settings.js +++ b/apps/run/settings.js @@ -90,8 +90,8 @@ [[300, 1],[300, 0],[300, 1],[300, 0],[300, 1]], ]; notificationsMenu[/*LANG*/"Dist Pattern"] = { - value: Math.max(0,vibPatterns.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.dist.notifications))), - min: 0, max: vibPatterns.length, + value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.dist.notifications))), + min: 0, max: vibTimes.length, format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.dist.notifications = vibTimes[v]; @@ -100,8 +100,8 @@ } } notificationsMenu[/*LANG*/"Step Pattern"] = { - value: Math.max(0,vibPatterns.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.step.notifications))), - min: 0, max: vibPatterns.length, + value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.step.notifications))), + min: 0, max: vibTimes.length, format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.step.notifications = vibTimes[v]; @@ -110,8 +110,8 @@ } } notificationsMenu[/*LANG*/"Time Pattern"] = { - value: Math.max(0,vibPatterns.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.time.notifications))), - min: 0, max: vibPatterns.length, + value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.time.notifications))), + min: 0, max: vibTimes.length, format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.time.notifications = vibTimes[v]; diff --git a/modules/exstats.js b/modules/exstats.js index b106622d0..ec0a838a7 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -139,9 +139,9 @@ Bangle.on("GPS", function(fix) { if (stats["pacea"]) stats["pacea"].emit("changed",stats["pacea"]); if (stats["pacec"]) stats["pacec"].emit("changed",stats["pacec"]); if (stats["speed"]) stats["speed"].emit("changed",stats["speed"]); - if (state.notify.dist.increment > 0 && state.notify.dist.next <= stats["dist"]) { + if (state.notify.dist.increment > 0 && state.notify.dist.next <= state.distance) { stats["dist"].emit("notify",stats["dist"]); - state.notify.dist.next = stats["dist"] + state.notify.dist.increment; + state.notify.dist.next = state.notify.dist.next + state.notify.dist.increment; } }); @@ -152,7 +152,7 @@ Bangle.on("step", function(steps) { state.lastStepCount = steps; if (state.notify.step.increment > 0 && state.notify.step.next <= steps) { stats["step"].emit("notify",stats["step"]); - state.notify.step.next = steps + state.notify.step.increment; + state.notify.step.next = state.notify.step.next + state.notify.step.increment; } }); Bangle.on("HRM", function(h) { @@ -285,7 +285,7 @@ exports.getStats = function(statIDs, options) { } if (state.notify.time.increment > 0 && state.notify.time.next <= now) { stats["time"].emit("notify",stats["time"]); - state.notify.time.next = now + state.notify.time.increment; + state.notify.time.next = state.notify.time.next + state.notify.time.increment; } }, 1000); function reset() { @@ -299,6 +299,8 @@ exports.getStats = function(statIDs, options) { state.curSpeed = 0; state.BPM = 0; state.BPMage = 0; + state.thisGPS = {}; + state.lastGPS = {}; state.notify = options.notify; if (options.notify.dist.increment > 0) { state.notify.dist.next = state.distance + options.notify.dist.increment; @@ -338,7 +340,7 @@ exports.appendMenuItems = function(menu, settings, saveSettings) { } exports.appendNotifyMenuItems = function(menu, settings, saveSettings) { var distNames = ['Off', "1000m","1 mile","1/2 Mthn", "Marathon",]; - var distAmts = [0, 1000,1609,21098,42195]; + var distAmts = [0, 1000, 1609, 21098, 42195]; menu['Ntfy Dist'] = { min: 0, max: distNames.length-1, value: Math.max(distAmts.indexOf(settings.notify.dist.increment),0), From 5e5ba0cc69b97835c535e578415cc993e7a4687a Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Fri, 25 Mar 2022 19:01:34 +0100 Subject: [PATCH 048/188] calendar: Add one to previous month --- apps/calendar/ChangeLog | 1 + apps/calendar/calendar.js | 2 +- apps/calendar/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index beba4ed95..cc8bb6306 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -4,3 +4,4 @@ 0.04: Add setting to switch color schemes. On Bangle 2 non-dithering colors will be used by default. Use localized names for months and days of the week (Language app needed). 0.05: Update calendar weekend colors for start on Sunday 0.06: Use larger font for dates +0.07: Fix off-by-one-error on previous month diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index 62702e349..3f4315811 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -171,7 +171,7 @@ function drawCalendar(date) { let days = []; let nextMonthDay = 1; let thisMonthDay = 51; - let prevMonthDay = monthMaxDayMap[month > 0 ? month - 1 : 11] - dowNorm; + let prevMonthDay = monthMaxDayMap[month > 0 ? month - 1 : 11] - dowNorm + 1; for (let i = 0; i < colN * (rowN - 1) + 1; i++) { if (i < dowNorm) { days.push(prevMonthDay); diff --git a/apps/calendar/metadata.json b/apps/calendar/metadata.json index 5531c03c3..62d2513ae 100644 --- a/apps/calendar/metadata.json +++ b/apps/calendar/metadata.json @@ -1,7 +1,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.06", + "version": "0.07", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], From 80f8b727d9bbcc0b8e6c29b519860f06bc15f38d Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 17:56:26 -0700 Subject: [PATCH 049/188] Create boot.js --- apps/quicklaunch/boot.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/quicklaunch/boot.js diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js new file mode 100644 index 000000000..f7fded6df --- /dev/null +++ b/apps/quicklaunch/boot.js @@ -0,0 +1,11 @@ +(function() { + var sui = Bangle.setUI; + Bangle.setUI = function(mode, cb) { + sui(mode,cb); + if(!mode) return; + if ("object"==typeof mode) mode = mode.mode; + if (!mode.startsWith("clock")) return; + Bangle.swipeHandler = dir => { if (dir<0) Bangle.showLauncher(); }; + Bangle.on("swipe", Bangle.swipeHandler); + }; +})(); From 65f81fbde963bcfb51777cb4291de97c825fb477 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:07:44 -0700 Subject: [PATCH 050/188] Create app-icon.js --- apps/quicklaunch/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/quicklaunch/app-icon.js diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js new file mode 100644 index 000000000..659d0d925 --- /dev/null +++ b/apps/quicklaunch/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("AAAAAAAHAAAAH8AACDBgwBAnMGA/7b/wP+if8BBokGAIKLDAACigAAAIgAAACPgAAAjIAAAIjgAACA+AAHgIgADIAPAAiADYAIAAiADAAAgAQAAIAEAACABAAAgAYAAYACAAGAAwABAAEAAQABgAMAAMACAAB//gAAP/wAAAAAA=")) From a20a159dc97a16cd1cc1a365b345c50e3b7687f3 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:10:55 -0700 Subject: [PATCH 051/188] Create metadata.json --- apps/quicklaunch/metadata.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/quicklaunch/metadata.json diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json new file mode 100644 index 000000000..8c624a6d3 --- /dev/null +++ b/apps/quicklaunch/metadata.json @@ -0,0 +1,12 @@ +{ "id": "quicklaunch", + "name": "Quick Launch", + "shortName":"Quick Launch", + "icon": "app.png", + "version":"0.01", + "description": "", + "tags": "", + "storage": [ + {"name":"quicklaunch.app.js","url":"quicklaunch.js"}, + {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} + ] +} From fbf762a825e61de868b5947b0189da8bd4a77cfd Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:15:27 -0700 Subject: [PATCH 052/188] Update metadata.json --- apps/quicklaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index 8c624a6d3..6a001dc56 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -6,7 +6,7 @@ "description": "", "tags": "", "storage": [ - {"name":"quicklaunch.app.js","url":"quicklaunch.js"}, + {"name":"quicklaunch.app.js","url":"app.js"}, {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} ] } From 34b99993d73aa6ec2c7f136fe31881912bdc463b Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:16:08 -0700 Subject: [PATCH 053/188] Update metadata.json --- apps/quicklaunch/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index 6a001dc56..dd58c6408 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -7,6 +7,7 @@ "tags": "", "storage": [ {"name":"quicklaunch.app.js","url":"app.js"}, + {"name":"quicklaunch.boot.js","url":"boot.js"}, {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} ] } From e1d6505b240e17aecb9198eb887881db4ad5ad51 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:22:57 -0700 Subject: [PATCH 054/188] Update metadata.json --- apps/quicklaunch/metadata.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index dd58c6408..a08e75ed9 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -1,13 +1,14 @@ { "id": "quicklaunch", "name": "Quick Launch", - "shortName":"Quick Launch", "icon": "app.png", "version":"0.01", "description": "", - "tags": "", + "tags": "tools, system", + "supports": ["BANGLEJS2"], "storage": [ {"name":"quicklaunch.app.js","url":"app.js"}, {"name":"quicklaunch.boot.js","url":"boot.js"}, {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} + ] } From fca2852e8896f4b39aeb723036fa286c92e01130 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:24:48 -0700 Subject: [PATCH 055/188] Create app.js --- apps/quicklaunch/app.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 apps/quicklaunch/app.js diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js new file mode 100644 index 000000000..ae684f005 --- /dev/null +++ b/apps/quicklaunch/app.js @@ -0,0 +1,26 @@ +var s = require("Storage"); +let settings = Object.assign({ showClocks: true }, s.readJSON("launch.json", true) || {}); + +var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || !app.type)); +apps.sort((a,b)=>{ + var n=(0|a.sortorder)-(0|b.sortorder); + if (n) return n; // do sortorder first + if (a.nameb.name) return 1; + return 0; +}); + +// First menu +var mainmenu = { + "" : { "title" : "-- Main Menu --" }, +}; + +apps.forEach((app)=>{ + mainmenu[app.name] = function() { + E.showMessage(/*LANG*/"Loading..."); + load(app.src); + }; +}); + +// Actually display the menu +E.showMenu(mainmenu); From 90a0c0e927637127503116f80588afb307290171 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:28:33 -0700 Subject: [PATCH 056/188] Update metadata.json --- apps/quicklaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index a08e75ed9..261b33327 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -1,6 +1,6 @@ { "id": "quicklaunch", "name": "Quick Launch", - "icon": "app.png", + "icon": "quicklaunch.img", "version":"0.01", "description": "", "tags": "tools, system", From 00a7971c88a231d5011b56278cacff42b1e37fa9 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:32:43 -0700 Subject: [PATCH 057/188] Add files via upload --- apps/quicklaunch/app.png | Bin 0 -> 321 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/quicklaunch/app.png diff --git a/apps/quicklaunch/app.png b/apps/quicklaunch/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1d0fdd245c75ffe952bfd214f70f372811b45f GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Ny!2~4Zgw&@2DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx`x67sn6}@3(yy#hMK`od5oxfA5;wrig%r zRo^zewX4YRXgb~hG2-FxxEp(0cXQTQM(y$cuA)09Q-C&(s6+rPOeWgFv` zz$=*z^z5U<~{GYcP2uO-+n*NoIz0BLf3=YrchFr6Z@QU(q&v-MMv= Q7SM+bp00i_>zopr0E3W$NB{r; literal 0 HcmV?d00001 From 77e3c27c507b10136686280ffb1b6fa38c3f0cbd Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:33:34 -0700 Subject: [PATCH 058/188] Update metadata.json --- apps/quicklaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index 261b33327..a08e75ed9 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -1,6 +1,6 @@ { "id": "quicklaunch", "name": "Quick Launch", - "icon": "quicklaunch.img", + "icon": "app.png", "version":"0.01", "description": "", "tags": "tools, system", From 1b2c2545cf6f10cea59671e592c71d4b39627dc4 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Fri, 25 Mar 2022 23:57:12 -0600 Subject: [PATCH 059/188] Update metadata.json --- apps/mtgwatchface/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index a24ca52c8..f0be4b206 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -3,7 +3,7 @@ "name": "MTG Watchface", "shortName": "Magic the Gathering Watch Face", "version": "1v02", - "description": "Magic the Gathering themed watch face. Embrace the inner wizzard ", + "description": "Magic the Gathering themed watch face. Embrace the inner wizzard. Dispay any of the different types of mana on your watch. Which color are you devoted to today? ", "icon": "icon.png", "screenshots": [ {"url": "black.png"} @@ -32,4 +32,4 @@ ] } ] -} \ No newline at end of file +} From 665f603a70fa48040d2c9f05004cfad017bf8f2d Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Fri, 25 Mar 2022 23:58:10 -0600 Subject: [PATCH 060/188] Create README --- apps/mtgwatchface/README | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 apps/mtgwatchface/README diff --git a/apps/mtgwatchface/README b/apps/mtgwatchface/README new file mode 100644 index 000000000..36c0c9efb --- /dev/null +++ b/apps/mtgwatchface/README @@ -0,0 +1,5 @@ +## Magic the Gathering Watch Face +Magic the Gathering themed watch face. Embrace the inner wizzard. Dispay any of the different types of mana on your watch. Which color are you devoted to today? + +### Touch Enabled +Simply touch the screen on the sides to switch the mana colors From 73774bbe070ed98bb70bb6a450cfb603ca0ac952 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Sat, 26 Mar 2022 00:01:40 -0600 Subject: [PATCH 061/188] Rename README to README.md --- apps/mtgwatchface/{README => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/mtgwatchface/{README => README.md} (100%) diff --git a/apps/mtgwatchface/README b/apps/mtgwatchface/README.md similarity index 100% rename from apps/mtgwatchface/README rename to apps/mtgwatchface/README.md From 6ea588646e16b7cd728a378f4513041304136b2e Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 23:45:53 -0700 Subject: [PATCH 062/188] Update boot.js --- apps/quicklaunch/boot.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index f7fded6df..1aa696f39 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,11 +1,25 @@ (function() { + var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); + + if (!settings.leftapp) { + settings["leftapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + if (!settings.rightapp) { + settings["rightapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + var sui = Bangle.setUI; Bangle.setUI = function(mode, cb) { sui(mode,cb); if(!mode) return; if ("object"==typeof mode) mode = mode.mode; if (!mode.startsWith("clock")) return; - Bangle.swipeHandler = dir => { if (dir<0) Bangle.showLauncher(); }; + Bangle.swipeHandler = dir => { + if (dir<0) load(settings.leftapp.src); + else load(settings.rightapp.src); + }; Bangle.on("swipe", Bangle.swipeHandler); }; })(); From dbc3da8a1a977aef0b976e0952ed4fcbf6c189b1 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Fri, 25 Mar 2022 23:53:20 -0700 Subject: [PATCH 063/188] Update app.js --- apps/quicklaunch/app.js | 68 +++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index ae684f005..8976cd20d 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -1,7 +1,15 @@ -var s = require("Storage"); -let settings = Object.assign({ showClocks: true }, s.readJSON("launch.json", true) || {}); +var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); -var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || !app.type)); +if (!settings.leftapp) { + settings["leftapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); +} +if (!settings.rightapp) { + settings["rightapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); +} + +var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); if (n) return n; // do sortorder first @@ -10,17 +18,57 @@ apps.sort((a,b)=>{ return 0; }); +function save(key, value) { + settings[key] = value; + require("Storage").write("quicklaunch.json",settings); +} + // First menu -var mainmenu = { - "" : { "title" : "-- Main Menu --" }, +function showMainMenu() { + var mainmenu = { + "" : { "title" : "Quick Launch" } + }; + + mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; + mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rtappmenu); }; + mainmenu["Launch left "+settings.leftapp.name] = function() { load(settings.leftapp.src); }; + mainmenu["Launch right "+settings.rightapp.name] = function() { load(settings.rightapp.src); }; + + return E.showMenu(mainmenu); +} + + +var ltappmenu = { + "" : { "title" : "Left Swipe" }, + "< Back" : showMainMenu }; -apps.forEach((app)=>{ - mainmenu[app.name] = function() { - E.showMessage(/*LANG*/"Loading..."); - load(app.src); +ltappmenu["(none)"] = function() { + save("leftapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((a)=>{ + ltappmenu[a.name] = function() { + save("leftapp", a); + showMainMenu(); + }; +}); + +var rtappmenu = { + "" : { "title" : "Right Swipe" }, + "< Back" : showMainMenu +}; + +rtappmenu["(none)"] = function() { + save("rightapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((b)=>{ + rtappmenu[b.name] = function() { + save("rightapp", b); + showMainMenu(); }; }); // Actually display the menu -E.showMenu(mainmenu); +showMainMenu(); From d3f41a367c93b7b697f944314eb821093c84dd54 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:07:11 -0700 Subject: [PATCH 065/188] Update metadata.json --- apps/quicklaunch/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index a08e75ed9..deadb8fc2 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -9,6 +9,6 @@ {"name":"quicklaunch.app.js","url":"app.js"}, {"name":"quicklaunch.boot.js","url":"boot.js"}, {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} - - ] + ], + "data": [{"name":"quicklaunch.json"}] } From 13a1d46144979cc3b34f9463403f76295c42860b Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:08:43 -0700 Subject: [PATCH 066/188] Update app.js --- apps/quicklaunch/app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 8976cd20d..c5b7fe0d7 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -31,8 +31,6 @@ function showMainMenu() { mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rtappmenu); }; - mainmenu["Launch left "+settings.leftapp.name] = function() { load(settings.leftapp.src); }; - mainmenu["Launch right "+settings.rightapp.name] = function() { load(settings.rightapp.src); }; return E.showMenu(mainmenu); } From 4242633f606d6f4d12fd6065849b760cdc4fcf60 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:19:38 -0700 Subject: [PATCH 067/188] Delete app-icon.js --- apps/quicklaunch/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/quicklaunch/app-icon.js diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js deleted file mode 100644 index 659d0d925..000000000 --- a/apps/quicklaunch/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -E.toArrayBuffer(atob("AAAAAAAHAAAAH8AACDBgwBAnMGA/7b/wP+if8BBokGAIKLDAACigAAAIgAAACPgAAAjIAAAIjgAACA+AAHgIgADIAPAAiADYAIAAiADAAAgAQAAIAEAACABAAAgAYAAYACAAGAAwABAAEAAQABgAMAAMACAAB//gAAP/wAAAAAA=")) From c661309138b9fedc0da1437c4b27f51207ee276c Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:19:58 -0700 Subject: [PATCH 068/188] Delete app.js --- apps/quicklaunch/app.js | 72 ----------------------------------------- 1 file changed, 72 deletions(-) delete mode 100644 apps/quicklaunch/app.js diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js deleted file mode 100644 index c5b7fe0d7..000000000 --- a/apps/quicklaunch/app.js +++ /dev/null @@ -1,72 +0,0 @@ -var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); - -if (!settings.leftapp) { - settings["leftapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); -} -if (!settings.rightapp) { - settings["rightapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); -} - -var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); -apps.sort((a,b)=>{ - var n=(0|a.sortorder)-(0|b.sortorder); - if (n) return n; // do sortorder first - if (a.nameb.name) return 1; - return 0; -}); - -function save(key, value) { - settings[key] = value; - require("Storage").write("quicklaunch.json",settings); -} - -// First menu -function showMainMenu() { - var mainmenu = { - "" : { "title" : "Quick Launch" } - }; - - mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; - mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rtappmenu); }; - - return E.showMenu(mainmenu); -} - - -var ltappmenu = { - "" : { "title" : "Left Swipe" }, - "< Back" : showMainMenu -}; - -ltappmenu["(none)"] = function() { - save("leftapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((a)=>{ - ltappmenu[a.name] = function() { - save("leftapp", a); - showMainMenu(); - }; -}); - -var rtappmenu = { - "" : { "title" : "Right Swipe" }, - "< Back" : showMainMenu -}; - -rtappmenu["(none)"] = function() { - save("rightapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((b)=>{ - rtappmenu[b.name] = function() { - save("rightapp", b); - showMainMenu(); - }; -}); - -// Actually display the menu -showMainMenu(); From 711394cfc1db6a522e2811efb42e0d2d960184a9 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:20:09 -0700 Subject: [PATCH 069/188] Delete app.png --- apps/quicklaunch/app.png | Bin 321 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/quicklaunch/app.png diff --git a/apps/quicklaunch/app.png b/apps/quicklaunch/app.png deleted file mode 100644 index 3d1d0fdd245c75ffe952bfd214f70f372811b45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Ny!2~4Zgw&@2DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx`x67sn6}@3(yy#hMK`od5oxfA5;wrig%r zRo^zewX4YRXgb~hG2-FxxEp(0cXQTQM(y$cuA)09Q-C&(s6+rPOeWgFv` zz$=*z^z5U<~{GYcP2uO-+n*NoIz0BLf3=YrchFr6Z@QU(q&v-MMv= Q7SM+bp00i_>zopr0E3W$NB{r; From a50f8b433f4b426c0c75ad23ddf4e38d2f2d5037 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:20:18 -0700 Subject: [PATCH 070/188] Delete boot.js --- apps/quicklaunch/boot.js | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 apps/quicklaunch/boot.js diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js deleted file mode 100644 index 1aa696f39..000000000 --- a/apps/quicklaunch/boot.js +++ /dev/null @@ -1,25 +0,0 @@ -(function() { - var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); - - if (!settings.leftapp) { - settings["leftapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); - } - if (!settings.rightapp) { - settings["rightapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); - } - - var sui = Bangle.setUI; - Bangle.setUI = function(mode, cb) { - sui(mode,cb); - if(!mode) return; - if ("object"==typeof mode) mode = mode.mode; - if (!mode.startsWith("clock")) return; - Bangle.swipeHandler = dir => { - if (dir<0) load(settings.leftapp.src); - else load(settings.rightapp.src); - }; - Bangle.on("swipe", Bangle.swipeHandler); - }; -})(); From 5056826d2d94fb9eae0b2f143ec74f91a132527d Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:20:25 -0700 Subject: [PATCH 071/188] Delete metadata.json --- apps/quicklaunch/metadata.json | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 apps/quicklaunch/metadata.json diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json deleted file mode 100644 index deadb8fc2..000000000 --- a/apps/quicklaunch/metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "quicklaunch", - "name": "Quick Launch", - "icon": "app.png", - "version":"0.01", - "description": "", - "tags": "tools, system", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"quicklaunch.app.js","url":"app.js"}, - {"name":"quicklaunch.boot.js","url":"boot.js"}, - {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"quicklaunch.json"}] -} From 92878dc159104ff70cbd1da4d0d6f594dfc8fc8f Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:23:20 -0700 Subject: [PATCH 072/188] Create app.js --- apps/quicklaunch/app.js | 72 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 apps/quicklaunch/app.js diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js new file mode 100644 index 000000000..c5b7fe0d7 --- /dev/null +++ b/apps/quicklaunch/app.js @@ -0,0 +1,72 @@ +var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); + +if (!settings.leftapp) { + settings["leftapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); +} +if (!settings.rightapp) { + settings["rightapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); +} + +var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); +apps.sort((a,b)=>{ + var n=(0|a.sortorder)-(0|b.sortorder); + if (n) return n; // do sortorder first + if (a.nameb.name) return 1; + return 0; +}); + +function save(key, value) { + settings[key] = value; + require("Storage").write("quicklaunch.json",settings); +} + +// First menu +function showMainMenu() { + var mainmenu = { + "" : { "title" : "Quick Launch" } + }; + + mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; + mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rtappmenu); }; + + return E.showMenu(mainmenu); +} + + +var ltappmenu = { + "" : { "title" : "Left Swipe" }, + "< Back" : showMainMenu +}; + +ltappmenu["(none)"] = function() { + save("leftapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((a)=>{ + ltappmenu[a.name] = function() { + save("leftapp", a); + showMainMenu(); + }; +}); + +var rtappmenu = { + "" : { "title" : "Right Swipe" }, + "< Back" : showMainMenu +}; + +rtappmenu["(none)"] = function() { + save("rightapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((b)=>{ + rtappmenu[b.name] = function() { + save("rightapp", b); + showMainMenu(); + }; +}); + +// Actually display the menu +showMainMenu(); From 9ab343db9dd21cb9f82e6c79840cf2e1cb317ff2 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:25:50 -0700 Subject: [PATCH 073/188] Create app-icon.js --- apps/quicklaunch/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/quicklaunch/app-icon.js diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js new file mode 100644 index 000000000..659d0d925 --- /dev/null +++ b/apps/quicklaunch/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("AAAAAAAHAAAAH8AACDBgwBAnMGA/7b/wP+if8BBokGAIKLDAACigAAAIgAAACPgAAAjIAAAIjgAACA+AAHgIgADIAPAAiADYAIAAiADAAAgAQAAIAEAACABAAAgAYAAYACAAGAAwABAAEAAQABgAMAAMACAAB//gAAP/wAAAAAA=")) From b05bc9e2918f9b2d6dcac0174d7158d991c3e482 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:26:32 -0700 Subject: [PATCH 074/188] Create boot.js --- apps/quicklaunch/boot.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/quicklaunch/boot.js diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js new file mode 100644 index 000000000..1aa696f39 --- /dev/null +++ b/apps/quicklaunch/boot.js @@ -0,0 +1,25 @@ +(function() { + var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); + + if (!settings.leftapp) { + settings["leftapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + if (!settings.rightapp) { + settings["rightapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + + var sui = Bangle.setUI; + Bangle.setUI = function(mode, cb) { + sui(mode,cb); + if(!mode) return; + if ("object"==typeof mode) mode = mode.mode; + if (!mode.startsWith("clock")) return; + Bangle.swipeHandler = dir => { + if (dir<0) load(settings.leftapp.src); + else load(settings.rightapp.src); + }; + Bangle.on("swipe", Bangle.swipeHandler); + }; +})(); From 62aebd710212ccdf630a3e45302bd1119fd46c6f Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:27:04 -0700 Subject: [PATCH 075/188] Create metadata.json --- apps/quicklaunch/metadata.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apps/quicklaunch/metadata.json diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json new file mode 100644 index 000000000..deadb8fc2 --- /dev/null +++ b/apps/quicklaunch/metadata.json @@ -0,0 +1,14 @@ +{ "id": "quicklaunch", + "name": "Quick Launch", + "icon": "app.png", + "version":"0.01", + "description": "", + "tags": "tools, system", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"quicklaunch.app.js","url":"app.js"}, + {"name":"quicklaunch.boot.js","url":"boot.js"}, + {"name":"quicklaunch.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"quicklaunch.json"}] +} From 7dfeb8fc61e5c47658affc55c7f31a08d8be65ee Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:27:21 -0700 Subject: [PATCH 076/188] Add files via upload --- apps/quicklaunch/app.png | Bin 0 -> 321 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/quicklaunch/app.png diff --git a/apps/quicklaunch/app.png b/apps/quicklaunch/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1d0fdd245c75ffe952bfd214f70f372811b45f GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Ny!2~4Zgw&@2DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx`x67sn6}@3(yy#hMK`od5oxfA5;wrig%r zRo^zewX4YRXgb~hG2-FxxEp(0cXQTQM(y$cuA)09Q-C&(s6+rPOeWgFv` zz$=*z^z5U<~{GYcP2uO-+n*NoIz0BLf3=YrchFr6Z@QU(q&v-MMv= Q7SM+bp00i_>zopr0E3W$NB{r; literal 0 HcmV?d00001 From ba669d2cabbfe7f3ed9837e9ee4623f6d3de0948 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:33:37 -0700 Subject: [PATCH 077/188] Update app.js --- apps/quicklaunch/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index c5b7fe0d7..3f3263c3e 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -27,6 +27,7 @@ function save(key, value) { function showMainMenu() { var mainmenu = { "" : { "title" : "Quick Launch" } + "< Back" : ()=>{load(); }; mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; From 86fe688d44374bcfb4528908dfc9b6992a793603 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:43:01 -0700 Subject: [PATCH 078/188] Update app.js --- apps/quicklaunch/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 3f3263c3e..e0f4827a9 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -26,8 +26,8 @@ function save(key, value) { // First menu function showMainMenu() { var mainmenu = { - "" : { "title" : "Quick Launch" } - "< Back" : ()=>{load(); + "" : { "title" : "Quick Launch" }, + "< Back" : ()=>{load();} }; mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; From 1a53e4b64e98e47f9187b42e94a74c978d989de5 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:02:35 -0700 Subject: [PATCH 079/188] Update app-icon.js --- apps/quicklaunch/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js index 659d0d925..2c7750df5 100644 --- a/apps/quicklaunch/app-icon.js +++ b/apps/quicklaunch/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("AAAAAAAHAAAAH8AACDBgwBAnMGA/7b/wP+if8BBokGAIKLDAACigAAAIgAAACPgAAAjIAAAIjgAACA+AAHgIgADIAPAAiADYAIAAiADAAAgAQAAIAEAACABAAAgAYAAYACAAGAAwABAAEAAQABgAMAAMACAAB//gAAP/wAAAAAA=")) +E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAP////AAAAAAAAAAAADwAAD/AAAP8AAA/wAAAAAA8AAADwD/8A/wAAD/AAAAAP/////w/w/w//////8AAAAP/////w8ADwD/////8AAAAA8AAA/w8ADwDwAAD/AAAAAADwAADw8ADw/wAA/wAAAAAAAAAADw8ADw8AAAAAAAAAAAAAAAAA8ADwAAAAAAAAAAAAAAAAAA8AD///AAAAAAAAAAAAAAAA8AD/APAAAAAAAAAAAAAAAA8ADwAP/wAAAAAAAAAAAAAA8AAAAP//8AAAAAAAAAAA//8AAAAPAA8AAAAAAAAAAP8A8AAAAAAA//8AAAAAAAAPAA8AAAAAAA/w/wAAAAAAAPAAAAAAAAAA8ADwAAAAAAAP8AAAAAAAAAAADwAAAAAAAA8AAAAAAAAAAADwAAAAAAAA8AAAAAAAAAAADwAAAAAAAA8AAAAAAAAAAADwAAAAAAAA/wAAAAAAAAAA/wAAAAAAAADwAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAA8AAAAAAAAAAPAAAAAAAAAA8AAAAAAAAAAP8AAAAAAAAP8AAAAAAAAAAA/wAAAAAAAPAAAAAAAAAAAAD/////////AAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) From e998b36e96459ae798bb1ed6b4dae525c31ffdb5 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:09:06 -0700 Subject: [PATCH 080/188] Update app-icon.js --- apps/quicklaunch/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js index 2c7750df5..14ae94823 100644 --- a/apps/quicklaunch/app-icon.js +++ b/apps/quicklaunch/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAP////AAAAAAAAAAAADwAAD/AAAP8AAA/wAAAAAA8AAADwD/8A/wAAD/AAAAAP/////w/w/w//////8AAAAP/////w8ADwD/////8AAAAA8AAA/w8ADwDwAAD/AAAAAADwAADw8ADw/wAA/wAAAAAAAAAADw8ADw8AAAAAAAAAAAAAAAAA8ADwAAAAAAAAAAAAAAAAAA8AD///AAAAAAAAAAAAAAAA8AD/APAAAAAAAAAAAAAAAA8ADwAP/wAAAAAAAAAAAAAA8AAAAP//8AAAAAAAAAAA//8AAAAPAA8AAAAAAAAAAP8A8AAAAAAA//8AAAAAAAAPAA8AAAAAAA/w/wAAAAAAAPAAAAAAAAAA8ADwAAAAAAAP8AAAAAAAAAAADwAAAAAAAA8AAAAAAAAAAADwAAAAAAAA8AAAAAAAAAAADwAAAAAAAA8AAAAAAAAAAADwAAAAAAAA/wAAAAAAAAAA/wAAAAAAAADwAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAA8AAAAAAAAAAPAAAAAAAAAA8AAAAAAAAAAP8AAAAAAAAP8AAAAAAAAAAA/wAAAAAAAPAAAAAAAAAAAAD/////////AAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) +require("heatshrink").decompress(atob("kMigILIgPAAYMD/ADBwcGhkAwM5wcA/+2//Av/Rn/giFoyFggkUrFggEKlAkCiApCx+AAYNGoADBkU4AYMQj4DBvEICANkAoIPBgE2B4MAiMAH4MAwECAYNALYUgBIISCHYMYAoQWBAIMEgAYBAIMBwEDDQNgDwUf/4eBg4DCAA4")) From 1a8febf9ee9b3aa70af0edf40654ecdc126620b1 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:15:00 -0700 Subject: [PATCH 081/188] Update app-icon.js --- apps/quicklaunch/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js index 14ae94823..1e100f6c3 100644 --- a/apps/quicklaunch/app-icon.js +++ b/apps/quicklaunch/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("kMigILIgPAAYMD/ADBwcGhkAwM5wcA/+2//Av/Rn/giFoyFggkUrFggEKlAkCiApCx+AAYNGoADBkU4AYMQj4DBvEICANkAoIPBgE2B4MAiMAH4MAwECAYNALYUgBIISCHYMYAoQWBAIMEgAYBAIMBwEDDQNgDwUf/4eBg4DCAA4")) +require("heatshrink").decompress(atob("ABEB4ADBgf4AYODg0MgGBnODgH/23/4F/6M/8EQtGQsEEilYsEAhUoEgUQFIWPwADBo1AAYMinADBiEfAYN4hAQBsgFBB4MAmwPBgERgA/BgGAgQDBoEBAYMgBIISCHYMYAoQWBAIMEgAYBAIMBwEDDQNgDwUf/4eBg4DCAA4A==")) From ecd6215eb537dde64ae3570a644b643688f3b0bb Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:21:07 -0700 Subject: [PATCH 082/188] Update metadata.json --- apps/quicklaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index deadb8fc2..09017f0f0 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -2,7 +2,7 @@ "name": "Quick Launch", "icon": "app.png", "version":"0.01", - "description": "", + "description": "Swipe left or right on your clock face to launch any two apps of your choice.", "tags": "tools, system", "supports": ["BANGLEJS2"], "storage": [ From 6b6125a619157efc819f4c4d60a56ca409365e2f Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:21:39 -0700 Subject: [PATCH 083/188] Create ChangeLog --- apps/quicklaunch/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/quicklaunch/ChangeLog diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog new file mode 100644 index 000000000..4022f485c --- /dev/null +++ b/apps/quicklaunch/ChangeLog @@ -0,0 +1 @@ +0.01: First version! From 9d8e8ed20837bf2cd2ea48ea16b32c6bf9337997 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:24:27 -0700 Subject: [PATCH 084/188] Update ChangeLog --- apps/quicklaunch/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog index 4022f485c..ec66c5568 100644 --- a/apps/quicklaunch/ChangeLog +++ b/apps/quicklaunch/ChangeLog @@ -1 +1 @@ -0.01: First version! +0.01: Initial version From 16f3a81d14d93df0094aeae6e8d26d4f39c19c3b Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 01:36:25 -0700 Subject: [PATCH 086/188] Update app-icon.js --- apps/quicklaunch/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/app-icon.js b/apps/quicklaunch/app-icon.js index 1e100f6c3..14ae94823 100644 --- a/apps/quicklaunch/app-icon.js +++ b/apps/quicklaunch/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("ABEB4ADBgf4AYODg0MgGBnODgH/23/4F/6M/8EQtGQsEEilYsEAhUoEgUQFIWPwADBo1AAYMinADBiEfAYN4hAQBsgFBB4MAmwPBgERgA/BgGAgQDBoEBAYMgBIISCHYMYAoQWBAIMEgAYBAIMBwEDDQNgDwUf/4eBg4DCAA4A==")) +require("heatshrink").decompress(atob("kMigILIgPAAYMD/ADBwcGhkAwM5wcA/+2//Av/Rn/giFoyFggkUrFggEKlAkCiApCx+AAYNGoADBkU4AYMQj4DBvEICANkAoIPBgE2B4MAiMAH4MAwECAYNALYUgBIISCHYMYAoQWBAIMEgAYBAIMBwEDDQNgDwUf/4eBg4DCAA4")) From f57d4d965c7b1195145e8c4e38510aef332fd68e Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 09:22:18 -0700 Subject: [PATCH 087/188] Update app.js --- apps/quicklaunch/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index e0f4827a9..226a0433f 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -9,7 +9,8 @@ if (!settings.rightapp) { require("Storage").write("quicklaunch.json",settings); } -var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); +var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); + apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); if (n) return n; // do sortorder first From 970c102822eee27aed0b360334c92bc162334357 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 09:30:44 -0700 Subject: [PATCH 088/188] Update boot.js --- apps/quicklaunch/boot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 1aa696f39..deb6b86cb 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -17,8 +17,8 @@ if ("object"==typeof mode) mode = mode.mode; if (!mode.startsWith("clock")) return; Bangle.swipeHandler = dir => { - if (dir<0) load(settings.leftapp.src); - else load(settings.rightapp.src); + if (dir<0) && (settings.leftapp.src) load(settings.leftapp.src); + if (dir>0) && (settings.rightapp.src) load(settings.rightapp.src); }; Bangle.on("swipe", Bangle.swipeHandler); }; From 7ff995e3ec79af1eefbe5cc3070928f26b3b2656 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 09:41:52 -0700 Subject: [PATCH 089/188] Update boot.js --- apps/quicklaunch/boot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index deb6b86cb..dfc427d5c 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -17,8 +17,8 @@ if ("object"==typeof mode) mode = mode.mode; if (!mode.startsWith("clock")) return; Bangle.swipeHandler = dir => { - if (dir<0) && (settings.leftapp.src) load(settings.leftapp.src); - if (dir>0) && (settings.rightapp.src) load(settings.rightapp.src); + if ((dir<0) && (settings.leftapp.src)) load(settings.leftapp.src); + if ((dir>0) && (settings.rightapp.src)) load(settings.rightapp.src); }; Bangle.on("swipe", Bangle.swipeHandler); }; From 1f81238c12bdd2c739e567803ae91c7b92e7245d Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 09:47:46 -0700 Subject: [PATCH 090/188] Update boot.js --- apps/quicklaunch/boot.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index dfc427d5c..c3e213d0c 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,25 +1,25 @@ (function() { - var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); + var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); - if (!settings.leftapp) { - settings["leftapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); - } - if (!settings.rightapp) { - settings["rightapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); - } + if (!settings.leftapp) { + settings["leftapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + if (!settings.rightapp) { + settings["rightapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } - var sui = Bangle.setUI; - Bangle.setUI = function(mode, cb) { - sui(mode,cb); - if(!mode) return; - if ("object"==typeof mode) mode = mode.mode; - if (!mode.startsWith("clock")) return; - Bangle.swipeHandler = dir => { - if ((dir<0) && (settings.leftapp.src)) load(settings.leftapp.src); - if ((dir>0) && (settings.rightapp.src)) load(settings.rightapp.src); - }; - Bangle.on("swipe", Bangle.swipeHandler); + var sui = Bangle.setUI; + Bangle.setUI = function(mode, cb) { + sui(mode,cb); + if(!mode) return; + if ("object"==typeof mode) mode = mode.mode; + if (!mode.startsWith("clock")) return; + Bangle.swipeHandler = dir => { + if ((dir<0) && (settings.leftapp.src)) load(settings.leftapp.src); + if ((dir>0) && (settings.rightapp.src)) load(settings.rightapp.src); }; + Bangle.on("swipe", Bangle.swipeHandler); + }; })(); From a20ea2df714887a9ac350b3ec668dc511b9ef6b5 Mon Sep 17 00:00:00 2001 From: Francois Lancelot <16709438+francoislanc@users.noreply.github.com> Date: Sat, 26 Mar 2022 18:40:11 +0100 Subject: [PATCH 091/188] Add UI for the TodoList app --- apps/todolist/README.md | 64 +++++++++++----- apps/todolist/interface.html | 135 ++++++++++++++++++++++++++++++++++ apps/todolist/metadata.json | 1 + apps/todolist/screenshot4.png | Bin 0 -> 74049 bytes 4 files changed, 180 insertions(+), 20 deletions(-) create mode 100644 apps/todolist/interface.html create mode 100644 apps/todolist/screenshot4.png diff --git a/apps/todolist/README.md b/apps/todolist/README.md index 27c7cfb63..0e1beb74a 100644 --- a/apps/todolist/README.md +++ b/apps/todolist/README.md @@ -2,39 +2,63 @@ Todo List ======== This is a simple Todo List application. +The content is loaded from a JSON file. +A task can be marked as completed or uncompleted. ![](screenshot2.png) -The content is loaded from a JSON file. -You can mark a task as completed. +Once installed, the list can be modified via the `Download data from app` icon in the [Bangle.js App Store](https://banglejs.com/apps/) (TodoList app). + +![](screenshot4.png) + JSON file content example: ```javascript [ { - name: "Pro", - children: [ + "name": "Pro", + "children": [ { - name: "Read doc", - done: true, - children: [], + "name": "Read doc", + "done": true, + "children": [] } - ], + ] }, { - name: "Pers", - children: [ + "name": "Pers", + "children": [ { - name: "Grocery", - children: [ - { name: "Milk", done: false, children: [] }, - { name: "Eggs", done: false, children: [] }, - { name: "Cheese", done: false, children: [] }, - ], + "name": "Grocery", + "children": [ + { + "name": "Milk", + "done": false, + "children": [] + }, + { + "name": "Eggs", + "done": false, + "children": [] + }, + { + "name": "Cheese", + "done": false, + "children": [] + } + ] }, - { name: "Workout", done: false, children: [] }, - { name: "Learn Rust", done: false, children: [] }, - ], - }, + { + "name": "Workout", + "done": false, + "children": [] + }, + { + "name": "Learn Rust", + "done": false, + "children": [] + } + ] + } ] ``` \ No newline at end of file diff --git a/apps/todolist/interface.html b/apps/todolist/interface.html new file mode 100644 index 000000000..5b9cb038e --- /dev/null +++ b/apps/todolist/interface.html @@ -0,0 +1,135 @@ + + + + + + + +
+ + + + + +

+
+    
+    
+  
+
diff --git a/apps/todolist/metadata.json b/apps/todolist/metadata.json
index 0833a86bd..a8eb6118b 100644
--- a/apps/todolist/metadata.json
+++ b/apps/todolist/metadata.json
@@ -10,6 +10,7 @@
   "tags": "tool,todo",
   "supports": ["BANGLEJS", "BANGLEJS2"],
   "readme": "README.md",
+  "interface": "interface.html",
   "storage": [
     { "name": "todolist.app.js", "url": "app.js" },
     { "name": "todolist.img", "url": "app-icon.js", "evaluate": true }
diff --git a/apps/todolist/screenshot4.png b/apps/todolist/screenshot4.png
new file mode 100644
index 0000000000000000000000000000000000000000..43db1b0e6e2c55ffe7506f204035e1a6207d9e93
GIT binary patch
literal 74049
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 Date: Sat, 26 Mar 2022 12:10:59 -0700 Subject: [PATCH 092/188] Update app.js --- apps/quicklaunch/app.js | 80 +++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 226a0433f..d6c9d0820 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -1,14 +1,5 @@ var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); -if (!settings.leftapp) { - settings["leftapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); -} -if (!settings.rightapp) { - settings["rightapp"] = {"name":"(none)"}; - require("Storage").write("quicklaunch.json",settings); -} - var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); apps.sort((a,b)=>{ @@ -31,41 +22,92 @@ function showMainMenu() { "< Back" : ()=>{load();} }; - mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(ltappmenu); }; - mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rtappmenu); }; + mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(leftmenu); }; + mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rightmenu); }; + mainmenu["Up: "+settings.upapp.name] = function() { E.showMenu(upmenu); }; + mainmenu["Down: "+settings.downapp.name] = function() { E.showMenu(downmenu); }; + mainmenu["Tap: "+settings.tapapp.name] = function() { E.showMenu(tapmenu); }; return E.showMenu(mainmenu); } -var ltappmenu = { +var leftmenu = { "" : { "title" : "Left Swipe" }, "< Back" : showMainMenu }; -ltappmenu["(none)"] = function() { +leftmenu["(none)"] = function() { save("leftapp", {"name":"(none)"}); showMainMenu(); }; apps.forEach((a)=>{ - ltappmenu[a.name] = function() { + leftmenu[a.name] = function() { save("leftapp", a); showMainMenu(); }; }); -var rtappmenu = { +var rightmenu = { "" : { "title" : "Right Swipe" }, "< Back" : showMainMenu }; -rtappmenu["(none)"] = function() { +rightmenu["(none)"] = function() { save("rightapp", {"name":"(none)"}); showMainMenu(); }; -apps.forEach((b)=>{ - rtappmenu[b.name] = function() { - save("rightapp", b); +apps.forEach((a)=>{ + rightmenu[a.name] = function() { + save("rightapp", a); + showMainMenu(); + }; +}); + +var upmenu = { + "" : { "title" : "Up Swipe" }, + "< Back" : showMainMenu +}; + +upmenu["(none)"] = function() { + save("upapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((a)=>{ + upmenu[a.name] = function() { + save("upapp", a); + showMainMenu(); + }; +}); + +var downmenu = { + "" : { "title" : "Down Swipe" }, + "< Back" : showMainMenu +}; + +downmenu["(none)"] = function() { + save("downapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((a)=>{ + downmenu[a.name] = function() { + save("downapp", a); + showMainMenu(); + }; +}); + +var tapmenu = { + "" : { "title" : "Tap" }, + "< Back" : showMainMenu +}; + +tapmenu["(none)"] = function() { + save("tapapp", {"name":"(none)"}); + showMainMenu(); +}; +apps.forEach((a)=>{ + tapmenu[a.name] = function() { + save("tapapp", a); showMainMenu(); }; }); From ea4187c00ea08fd36e22fed20d188cfa909e8ef2 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 12:11:26 -0700 Subject: [PATCH 093/188] Update boot.js --- apps/quicklaunch/boot.js | 43 +++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index c3e213d0c..33c1048b3 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -9,6 +9,18 @@ settings["rightapp"] = {"name":"(none)"}; require("Storage").write("quicklaunch.json",settings); } + if (!settings.upapp) { + settings["upapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + if (!settings.downapp) { + settings["downapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } + if (!settings.tapapp) { + settings["tapapp"] = {"name":"(none)"}; + require("Storage").write("quicklaunch.json",settings); + } var sui = Bangle.setUI; Bangle.setUI = function(mode, cb) { @@ -16,10 +28,31 @@ if(!mode) return; if ("object"==typeof mode) mode = mode.mode; if (!mode.startsWith("clock")) return; - Bangle.swipeHandler = dir => { - if ((dir<0) && (settings.leftapp.src)) load(settings.leftapp.src); - if ((dir>0) && (settings.rightapp.src)) load(settings.rightapp.src); - }; - Bangle.on("swipe", Bangle.swipeHandler); + + function tap() { + if (settings.tapapp.src) load (settings.tapapp.src); + } + + let drag; + let e; + + Bangle.on("touch",tap); + Bangle.on("drag", e => { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + if ((Math.abs(dx)>Math.abs(dy)+10) && (settings.leftapp.src)) { + // horizontal + load(dx>0 ? settings.rightapp.src : settings.leftapp.src); + } + else if (Math.abs(dy)>Math.abs(dx)+10) { + // vertical + load(dy>0 ? settings.downapp.src : settings.upapp.src); + } + } + }); + }; })(); From 26b4c43d4a195304ccee6b697b35b0fe96ca133a Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 12:34:00 -0700 Subject: [PATCH 094/188] Update boot.js --- apps/quicklaunch/boot.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 33c1048b3..4faf925e8 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -43,13 +43,13 @@ } else if (!e.b) { // released const dx = e.x-drag.x, dy = e.y-drag.y; drag = null; - if ((Math.abs(dx)>Math.abs(dy)+10) && (settings.leftapp.src)) { - // horizontal - load(dx>0 ? settings.rightapp.src : settings.leftapp.src); + if (Math.abs(dx)>Math.abs(dy)+10) { + if ((settings.leftapp.src) && dx<0) load(settings.leftapp.src); + if ((settings.rightapp.src) && dx>0) load(settings.rightapp.src); } else if (Math.abs(dy)>Math.abs(dx)+10) { - // vertical - load(dy>0 ? settings.downapp.src : settings.upapp.src); + if ((settings.upapp.src) && dy<0) load(settings.upapp.src); + if ((settings.downapp.src) && dy>0) load(settings.downapp.src); } } }); From 2a764c64ad70b8a8144909add9b6bdbcd28decc9 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 12:41:31 -0700 Subject: [PATCH 095/188] Update metadata.json --- apps/quicklaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index 09017f0f0..6411d1a5f 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -2,7 +2,7 @@ "name": "Quick Launch", "icon": "app.png", "version":"0.01", - "description": "Swipe left or right on your clock face to launch any two apps of your choice.", + "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice.", "tags": "tools, system", "supports": ["BANGLEJS2"], "storage": [ From bae7606df35b384476caa58dd6775088bb6718f2 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 13:06:48 -0700 Subject: [PATCH 096/188] Update app.js --- apps/quicklaunch/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index d6c9d0820..d919675f0 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -1,6 +1,6 @@ var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); -var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || (app.type=="clock" && Object.assign(require("Storage").readJSON("launch.json", true) || {}).showClocks) || !app.type)); +var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); From 3ffc4425760b8e1e9394675085a32e33884a4428 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 14:03:39 -0700 Subject: [PATCH 097/188] Update boot.js --- apps/quicklaunch/boot.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 4faf925e8..89a24aa02 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,6 +1,6 @@ (function() { var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); - + if (!settings.leftapp) { settings["leftapp"] = {"name":"(none)"}; require("Storage").write("quicklaunch.json",settings); @@ -30,7 +30,8 @@ if (!mode.startsWith("clock")) return; function tap() { - if (settings.tapapp.src) load (settings.tapapp.src); + var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); + if ((settings.tapapp.src) && apps.some(e => e.src === settings.tapapp.src)) load (settings.tapapp.src); } let drag; @@ -43,13 +44,14 @@ } else if (!e.b) { // released const dx = e.x-drag.x, dy = e.y-drag.y; drag = null; + var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); if (Math.abs(dx)>Math.abs(dy)+10) { - if ((settings.leftapp.src) && dx<0) load(settings.leftapp.src); - if ((settings.rightapp.src) && dx>0) load(settings.rightapp.src); + if ((settings.leftapp.src) && apps.some(e => e.src === settings.leftapp.src) && dx<0) load(settings.leftapp.src); + if ((settings.rightapp.src) && apps.some(e => e.src === settings.rightapp.src) && dx>0) load(settings.rightapp.src); } else if (Math.abs(dy)>Math.abs(dx)+10) { - if ((settings.upapp.src) && dy<0) load(settings.upapp.src); - if ((settings.downapp.src) && dy>0) load(settings.downapp.src); + if ((settings.upapp.src) && apps.some(e => e.src === settings.upapp.src) && dy<0) load(settings.upapp.src); + if ((settings.downapp.src) && apps.some(e => e.src === settings.downapp.src) && dy>0) load(settings.downapp.src); } } }); From 506746a4d47b09eeb1ac9c8372a9303f6e64d139 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 14:17:51 -0700 Subject: [PATCH 098/188] Update boot.js --- apps/quicklaunch/boot.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 89a24aa02..22ec670de 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,5 +1,7 @@ (function() { var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); + + //populate empty app list if (!settings.leftapp) { settings["leftapp"] = {"name":"(none)"}; @@ -22,6 +24,7 @@ require("Storage").write("quicklaunch.json",settings); } + //activate on clock faces var sui = Bangle.setUI; Bangle.setUI = function(mode, cb) { sui(mode,cb); @@ -30,6 +33,7 @@ if (!mode.startsWith("clock")) return; function tap() { + //tap, check if source exists var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); if ((settings.tapapp.src) && apps.some(e => e.src === settings.tapapp.src)) load (settings.tapapp.src); } @@ -44,11 +48,14 @@ } else if (!e.b) { // released const dx = e.x-drag.x, dy = e.y-drag.y; drag = null; + //check if source exists var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); + //horizontal swipes if (Math.abs(dx)>Math.abs(dy)+10) { if ((settings.leftapp.src) && apps.some(e => e.src === settings.leftapp.src) && dx<0) load(settings.leftapp.src); if ((settings.rightapp.src) && apps.some(e => e.src === settings.rightapp.src) && dx>0) load(settings.rightapp.src); } + //vertical swipes else if (Math.abs(dy)>Math.abs(dx)+10) { if ((settings.upapp.src) && apps.some(e => e.src === settings.upapp.src) && dy<0) load(settings.upapp.src); if ((settings.downapp.src) && apps.some(e => e.src === settings.downapp.src) && dy>0) load(settings.downapp.src); From 46d82b45c21197f77ebf2e15d528aaaec1f11fb7 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sat, 26 Mar 2022 14:20:10 -0700 Subject: [PATCH 099/188] Update app.js --- apps/quicklaunch/app.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index d919675f0..f2b749e3e 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -15,13 +15,14 @@ function save(key, value) { require("Storage").write("quicklaunch.json",settings); } -// First menu +// Quick Launch menu function showMainMenu() { var mainmenu = { "" : { "title" : "Quick Launch" }, "< Back" : ()=>{load();} }; + //List all selected apps mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(leftmenu); }; mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rightmenu); }; mainmenu["Up: "+settings.upapp.name] = function() { E.showMenu(upmenu); }; @@ -31,7 +32,7 @@ function showMainMenu() { return E.showMenu(mainmenu); } - +//Left swipe menu var leftmenu = { "" : { "title" : "Left Swipe" }, "< Back" : showMainMenu @@ -48,6 +49,7 @@ apps.forEach((a)=>{ }; }); +//Right swipe menu var rightmenu = { "" : { "title" : "Right Swipe" }, "< Back" : showMainMenu @@ -64,6 +66,7 @@ apps.forEach((a)=>{ }; }); +//Up swipe menu var upmenu = { "" : { "title" : "Up Swipe" }, "< Back" : showMainMenu @@ -80,6 +83,7 @@ apps.forEach((a)=>{ }; }); +//Down swipe menu var downmenu = { "" : { "title" : "Down Swipe" }, "< Back" : showMainMenu @@ -96,6 +100,7 @@ apps.forEach((a)=>{ }; }); +//Tap menu var tapmenu = { "" : { "title" : "Tap" }, "< Back" : showMainMenu @@ -112,5 +117,4 @@ apps.forEach((a)=>{ }; }); -// Actually display the menu showMainMenu(); From 4c90ea57d75e9dea0588a654d06e489fb85a8aec Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sun, 27 Mar 2022 09:02:15 +0800 Subject: [PATCH 100/188] Update interface.html Use Bangle styling for buttons. Move main token list UI button to above the tokens. --- apps/authentiwatch/interface.html | 39 ++++++++++++++++--------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/apps/authentiwatch/interface.html b/apps/authentiwatch/interface.html index 7d567d34f..13d46ac03 100644 --- a/apps/authentiwatch/interface.html +++ b/apps/authentiwatch/interface.html @@ -226,15 +226,15 @@ function editToken(id) { markup += selectMarkup('algorithm', otpAlgos, tokens[id].algorithm); markup += ''; markup += ''; - markup += ''; + markup += ''; markup += ''; - markup += ''; - markup += ''; + markup += ''; + markup += ''; if (tokens[id].isnew) { - markup += ''; + markup += ''; } else { - markup += ''; - markup += ''; + markup += ''; + markup += ''; } document.getElementById('edit').innerHTML = markup; document.body.className = 'editing'; @@ -304,9 +304,19 @@ function updateTokens() { return ''; }; const tokenButton = function(fn, id, label, dir) { - return ''; + return ''; }; - var markup = '
'; + var markup = ''; + markup += '
'; + markup += ''; + markup += ''; + markup += ''; + markup += ''; + markup += '
'; + markup += ''; + markup += ''; + markup += '
'; + markup += ''; /* any tokens marked new are cancelled new additions and must be removed */ @@ -331,15 +341,6 @@ function updateTokens() { markup += ''; } markup += '
'; markup += tokenSelect('all'); markup += 'TokenOrder
'; - markup += '
'; - markup += ''; - markup += ''; - markup += ''; - markup += ''; - markup += '
'; - markup += ''; - markup += ''; - markup += '
'; document.getElementById('tokens').innerHTML = markup; document.body.className = 'select'; } @@ -604,7 +605,7 @@ function qrBack() {
- +
@@ -613,7 +614,7 @@ function qrBack() {
- +
From ecc3f5ff66e0df4c9539795570022c747e5941e5 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sun, 27 Mar 2022 09:12:55 +0800 Subject: [PATCH 101/188] Update interface.html Space out buttons. --- apps/authentiwatch/interface.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/authentiwatch/interface.html b/apps/authentiwatch/interface.html index 13d46ac03..e80180a45 100644 --- a/apps/authentiwatch/interface.html +++ b/apps/authentiwatch/interface.html @@ -229,11 +229,14 @@ function editToken(id) { markup += ''; markup += '
'; markup += ''; + markup += ' '; markup += ''; + markup += ' '; if (tokens[id].isnew) { markup += ''; } else { markup += ''; + markup += ' '; markup += ''; } document.getElementById('edit').innerHTML = markup; @@ -309,11 +312,15 @@ function updateTokens() { var markup = ''; markup += '

'; markup += ''; markup += '
'; From 638bc7fb3ed540c9a6a3260d99f3972239de9c1f Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sun, 27 Mar 2022 09:22:39 +0800 Subject: [PATCH 102/188] Update interface.html Change button styling to non-primary. --- apps/authentiwatch/interface.html | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/authentiwatch/interface.html b/apps/authentiwatch/interface.html index e80180a45..011549df2 100644 --- a/apps/authentiwatch/interface.html +++ b/apps/authentiwatch/interface.html @@ -226,18 +226,18 @@ function editToken(id) { markup += selectMarkup('algorithm', otpAlgos, tokens[id].algorithm); markup += '
'; - markup += ''; + markup += ''; markup += '
'; - markup += ''; + markup += ''; markup += ' '; - markup += ''; + markup += ''; markup += ' '; if (tokens[id].isnew) { - markup += ''; + markup += ''; } else { - markup += ''; + markup += ''; markup += ' '; - markup += ''; + markup += ''; } document.getElementById('edit').innerHTML = markup; document.body.className = 'editing'; @@ -307,21 +307,21 @@ function updateTokens() { return ''; }; const tokenButton = function(fn, id, label, dir) { - return ''; + return ''; }; var markup = ''; markup += '
'; - markup += ''; + markup += ''; markup += ' '; - markup += ''; + markup += ''; markup += ' '; - markup += ''; + markup += ''; markup += ' '; - markup += ''; + markup += ''; markup += '
'; - markup += ''; + markup += ''; markup += ' '; - markup += ''; + markup += ''; markup += '
'; markup += '
'; markup += tokenSelect('all'); @@ -612,7 +612,7 @@ function qrBack() {
- +
@@ -621,7 +621,7 @@ function qrBack() {
- +
From 2b32bc37e26ab5965482ece5a1e3372389b2ffe6 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sun, 27 Mar 2022 09:27:01 +0800 Subject: [PATCH 103/188] Update interface.html Change token row background colours. --- apps/authentiwatch/interface.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/authentiwatch/interface.html b/apps/authentiwatch/interface.html index 011549df2..d7cd59f1a 100644 --- a/apps/authentiwatch/interface.html +++ b/apps/authentiwatch/interface.html @@ -12,8 +12,8 @@ body.select div.select,body.export div.export{display:block} body.select div.export,body.export div.select{display:none} body.select div#tokens,body.editing div#edit,body.scanning div#scan,body.showqr div#showqr,body.export div#tokens{display:block} #tokens th,#tokens td{padding:5px} -#tokens tr:nth-child(odd){background-color:#ccc} -#tokens tr:nth-child(even){background-color:#eee} +#tokens tr:nth-child(odd){background-color:#f1f1fc} +#tokens tr:nth-child(even){background-color:#fff} #qr-canvas{margin:auto;width:calc(100%-20px);max-width:400px} #advbtn,#scan,#tokenqr table{text-align:center} #edittoken tbody#adv{display:none} From 178b011c34c70ebcbf160fa986f7fd58324b8896 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sun, 27 Mar 2022 10:30:34 +0800 Subject: [PATCH 104/188] Fix #1583. Fix timers doubling (plus a bit) when they expire. Timer reset restores to configured time, not to the default. Added surise/sunset times (hidden by default). --- apps/timerclk/ChangeLog | 1 + apps/timerclk/README.md | 1 + apps/timerclk/alarm.info | 1 - apps/timerclk/app.js | 34 ++++++++++++++++++++++++++++++++++ apps/timerclk/boot.js | 19 +++++-------------- apps/timerclk/lib.js | 2 ++ apps/timerclk/metadata.json | 5 +---- apps/timerclk/settings.js | 28 ++++++++++++++++++++++++++++ apps/timerclk/stopwatch.info | 1 - apps/timerclk/timer.alert.js | 17 +++-------------- apps/timerclk/timer.info | 1 - apps/timerclk/timer.js | 8 +++++--- 12 files changed, 80 insertions(+), 38 deletions(-) delete mode 100644 apps/timerclk/alarm.info delete mode 100644 apps/timerclk/stopwatch.info delete mode 100644 apps/timerclk/timer.info diff --git a/apps/timerclk/ChangeLog b/apps/timerclk/ChangeLog index 5560f00bc..e17baa27c 100644 --- a/apps/timerclk/ChangeLog +++ b/apps/timerclk/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Add sunrise/sunset. Fix timer bugs. diff --git a/apps/timerclk/README.md b/apps/timerclk/README.md index fd6d2b16b..c27a8f6f8 100644 --- a/apps/timerclk/README.md +++ b/apps/timerclk/README.md @@ -11,6 +11,7 @@ A clock based on the Anton Clock with stopwatches, timers and alarms based on th * alarms * multiple stopwatches, timers and alarms * stopwatches and timers keep running in the background +* optional time of sunrise/sunset using the My Location app - hidden by default ## Images diff --git a/apps/timerclk/alarm.info b/apps/timerclk/alarm.info deleted file mode 100644 index 1289f8cef..000000000 --- a/apps/timerclk/alarm.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"timerclk","name":"tclk Alarm","src":"timerclk.alarm.js","icon":"timerclk.img","version":"0.01","tags":"","files":"","sortorder":10} diff --git a/apps/timerclk/app.js b/apps/timerclk/app.js index eeb3ac4cd..c750fcfde 100644 --- a/apps/timerclk/app.js +++ b/apps/timerclk/app.js @@ -3,6 +3,23 @@ Graphics.prototype.setFontAnton = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAA/gAAAAAAAAAAP/gAAAAAAAAAH//gAAAAAAAAB///gAAAAAAAAf///gAAAAAAAP////gAAAAAAD/////gAAAAAA//////gAAAAAP//////gAAAAH///////gAAAB////////gAAAf////////gAAP/////////gAD//////////AA//////////gAA/////////4AAA////////+AAAA////////gAAAA///////wAAAAA//////8AAAAAA//////AAAAAAA/////gAAAAAAA////4AAAAAAAA///+AAAAAAAAA///gAAAAAAAAA//wAAAAAAAAAA/8AAAAAAAAAAA/AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////AAAAAB///////8AAAAH////////AAAAf////////wAAA/////////4AAB/////////8AAD/////////+AAH//////////AAP//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wA//8AAAAAB//4A//wAAAAAAf/4A//gAAAAAAP/4A//gAAAAAAP/4A//gAAAAAAP/4A//wAAAAAAf/4A///////////4Af//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH//////////AAD/////////+AAB/////////8AAA/////////4AAAP////////gAAAD///////+AAAAAf//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAP/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/AAAAAAAAAAA//AAAAAAAAAAA/+AAAAAAAAAAB/8AAAAAAAAAAD//////////gAH//////////gAP//////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAB/gAAD//4AAAAf/gAAP//4AAAB//gAA///4AAAH//gAB///4AAAf//gAD///4AAA///gAH///4AAD///gAP///4AAH///gAP///4AAP///gAf///4AAf///gAf///4AB////gAf///4AD////gA////4AH////gA////4Af////gA////4A/////gA//wAAB/////gA//gAAH/////gA//gAAP/////gA//gAA///8//gA//gAD///w//gA//wA////g//gA////////A//gA///////8A//gA///////4A//gAf//////wA//gAf//////gA//gAf/////+AA//gAP/////8AA//gAP/////4AA//gAH/////gAA//gAD/////AAA//gAB////8AAA//gAA////wAAA//gAAP///AAAA//gAAD//8AAAA//gAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAD/wAAB//8AAAAP/wAAB///AAAA//wAAB///wAAB//wAAB///4AAD//wAAB///8AAH//wAAB///+AAP//wAAB///+AAP//wAAB////AAf//wAAB////AAf//wAAB////gAf//wAAB////gA///wAAB////gA///wAAB////gA///w//AAf//wA//4A//AAA//wA//gA//AAAf/wA//gB//gAAf/wA//gB//gAAf/wA//gD//wAA//wA//wH//8AB//wA///////////gA///////////gA///////////gA///////////gAf//////////AAf//////////AAP//////////AAP/////////+AAH/////////8AAH///+/////4AAD///+f////wAAA///8P////gAAAf//4H///+AAAAH//gB///wAAAAAP4AAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAA//wAAAAAAAAAP//wAAAAAAAAB///wAAAAAAAAf///wAAAAAAAH////wAAAAAAA/////wAAAAAAP/////wAAAAAB//////wAAAAAf//////wAAAAH///////wAAAA////////wAAAP////////wAAA///////H/wAAA//////wH/wAAA/////8AH/wAAA/////AAH/wAAA////gAAH/wAAA///4AAAH/wAAA//+AAAAH/wAAA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAH/4AAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8AAA/////+B///AAA/////+B///wAA/////+B///4AA/////+B///8AA/////+B///8AA/////+B///+AA/////+B////AA/////+B////AA/////+B////AA/////+B////gA/////+B////gA/////+B////gA/////+A////gA//gP/gAAB//wA//gf/AAAA//wA//gf/AAAAf/wA//g//AAAAf/wA//g//AAAA//wA//g//gAAA//wA//g//+AAP//wA//g////////gA//g////////gA//g////////gA//g////////gA//g////////AA//gf///////AA//gf//////+AA//gP//////+AA//gH//////8AA//gD//////4AA//gB//////wAA//gA//////AAAAAAAH////8AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAB///////+AAAAH////////gAAAf////////4AAB/////////8AAD/////////+AAH//////////AAH//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wAf//////////4A//wAD/4AAf/4A//gAH/wAAP/4A//gAH/wAAP/4A//gAP/wAAP/4A//gAP/4AAf/4A//wAP/+AD//4A///wP//////4Af//4P//////wAf//4P//////wAf//4P//////wAf//4P//////wAP//4P//////gAP//4H//////gAH//4H//////AAH//4D/////+AAD//4D/////8AAB//4B/////4AAA//4A/////wAAAP/4AP////AAAAB/4AD///4AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78+(scale<<8)+(1<<16)); }; +var SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); +const LOCATION_FILE = "mylocation.json"; +let location; +var sunRise = "--:--"; +var sunSet = "--:--"; +var sunIcons = "\0" + atob("DwyBAAAAAAAAAAgAOAD4A/gP+D/4//gAAAAA") + "\0" + atob("FQyDAAAAAAAAAAAAAAAABAAAAAAABAAIABAAAAABAAABAAAAAAABJAAAAABAAJJJIABAABAJJJJIBAAAAJJJJJIAAAAJJJJJJIAAJBJJJJJJBIAAJJJJJJIAAAAAAAAAAAAA") + "\0" + atob("DwyBAAAAAAAAA//j/4P+A/gD4AOAAgAAAAAA"); + +function loadLocation() { + location = require('Storage').readJSON(LOCATION_FILE, true) || {lat:51.5072,lon:0.1276,location:"London"}; +} + +function updateSunRiseSunSet(location) { + var times = SunCalc.getTimes(new Date(), location.lat, location.lon); + sunRise = require("locale").time(times.sunrise, 1); + sunSet = require("locale").time(times.sunset, 1); +} + var timerclk = require("timerclk.lib.js"); var settings = require('Storage').readJSON("timerclk.json", true) || {}; settings = Object.assign({ @@ -12,11 +29,14 @@ settings = Object.assign({ "dateFontSize":2, "dowFont":"6x8", "dowFontSize":2, + "srssFont":"6x8", + "srssFontSize":2, "specialFont":"6x8", "specialFontSize":2, "shortDate":true, "showStopwatches":true, "showTimers":true, + "showSrss":false, }, settings.clock||{}); var stopwatches = [], timers = []; @@ -77,7 +97,12 @@ function drawSpecial() { queueDraw(drawSpecialTimeout, interval, drawSpecial); } +var drawCount=0; + function draw() { + if (drawCount++ % 60 == 0) { + updateSunRiseSunSet(location); + } var x = g.getWidth()/2; var y = g.getHeight()/2; g.reset(); @@ -85,6 +110,7 @@ function draw() { var timeStr = require("locale").time(date,1); var dateStr = require("locale").date(date,settings.shortDate).toUpperCase(); var dowStr = require("locale").dow(date).toUpperCase(); + var srssStr = sunRise + sunIcons + sunSet; // draw time if (settings.timeFont == "Anton") { @@ -105,6 +131,13 @@ function draw() { g.setFontAlign(0,0).setFont(settings.dowFont, settings.dowFontSize); y += g.stringMetrics(dowStr).height/2; g.drawString(dowStr,x,y); + if (settings.showSrss) { + // draw sun rise sun set + y += g.stringMetrics(dowStr).height/2; + g.setFontAlign(0,0).setFont(settings.srssFont, settings.srssFontSize); + y += g.stringMetrics(srssStr).height/2; + g.drawString(srssStr,x,y); + } // queue draw in one minute queueDraw(drawTimeout, 60000, draw); } @@ -147,5 +180,6 @@ Bangle.setUI("clock"); // Show launcher when middle button pressed g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); +loadLocation(); draw(); if (stopwatches || timers) drawSpecial(); diff --git a/apps/timerclk/boot.js b/apps/timerclk/boot.js index 9a09f68f3..b6eb05c14 100644 --- a/apps/timerclk/boot.js +++ b/apps/timerclk/boot.js @@ -1,26 +1,17 @@ var timerclkTimerTimeout; var timerclkAlarmTimeout; function timerclkCheckTimers() { + var expiresIn=require("timerclk.lib.js").timerExpiresIn; if (timerclkTimerTimeout) clearTimeout(timerclkTimerTimeout); var timers = require('Storage').readJSON('timerclk.timer.json',1)||[]; timers = timers.filter(e=>e.start); if (timers.length) { - timers = timers.sort((a,b)=>{ - var at = a.timeAdd; - if (a.start) at += Date.now()-a.start; - at = a.period-at; - var bt = b.timeAdd; - if (b.start) bt += Date.now()-b.start; - bt = b.period-bt; - return at-bt; - }); + timers = timers.sort((a,b)=>expiresIn(a)-expiresIn(b)); if (!require('Storage').read("timerclk.timer.alert.js")) { console.log("No timer app!"); } else { - var time = timers[0].timeAdd; - if (timers[0].start) time += Date.now()-timers[0].start; - time = timers[0].time - time; - if (time<1000) t=1000; + var time = expiresIn(timers[0]); + if (time<1000) time=1000; if (timerclkTimerTimeout) clearTimeout(timerclkTimerTimeout); timerclkTimerTimeout = setTimeout(() => load("timerclk.timer.alert.js"),time); } @@ -38,7 +29,7 @@ function timerclkCheckAlarms() { } else { var time = alarms[0].time-currentTime; if (alarms[0].last == new Date().getDate() || time < 0) time += 86400000; - if (time<1000) t=1000; + if (time<1000) time=1000; if (timerclkAlarmTimeout) clearTimeout(timerclkAlarmTimeout); timerclkAlarmTimeout = setTimeout(() => load("timerclk.alarm.alert.js"),time); } diff --git a/apps/timerclk/lib.js b/apps/timerclk/lib.js index 718962fe0..dd3893fa1 100644 --- a/apps/timerclk/lib.js +++ b/apps/timerclk/lib.js @@ -125,3 +125,5 @@ exports.registerControls = function(o) { }); } }; + +exports.timerExpiresIn=t=>t.time-(Date.now()-t.start); diff --git a/apps/timerclk/metadata.json b/apps/timerclk/metadata.json index 6b415c0fc..ce8870ab0 100644 --- a/apps/timerclk/metadata.json +++ b/apps/timerclk/metadata.json @@ -2,7 +2,7 @@ "id": "timerclk", "name": "Timer Clock", "shortName":"Timer Clock", - "version":"0.01", + "version":"0.02", "description": "A clock with stopwatches, timers and alarms build in.", "icon": "app-icon.png", "type": "clock", @@ -29,9 +29,6 @@ {"name":"timerclk.timer.alert.js","url":"timer.alert.js"}, {"name":"timerclk.alarm.js","url":"alarm.js"}, {"name":"timerclk.alarm.alert.js","url":"alarm.alert.js"}, - {"name":"timerclk.stopwatch.info","url":"stopwatch.info"}, - {"name":"timerclk.timer.info","url":"timer.info"}, - {"name":"timerclk.alarm.info","url":"alarm.info"} ], "data": [{"name":"timerclk.json"},{"name":"timerclk.stopwatch.json"},{"name":"timerclk.timer.json"},{"name":"timerclk.alarm.json"}], "sortorder": 0 diff --git a/apps/timerclk/settings.js b/apps/timerclk/settings.js index 556dded98..992985f52 100644 --- a/apps/timerclk/settings.js +++ b/apps/timerclk/settings.js @@ -12,9 +12,12 @@ "dowFontSize":2, "specialFont":"6x8", "specialFontSize":2, + "srssFont":"6x8", + "srssFontSize":2, "shortDate":true, "showStopwatches":true, "showTimers":true, + "showSrss":false, }, settings.clock||{}); settings.stopwatch = Object.assign({ "font":"Vector", @@ -108,6 +111,23 @@ writeSettings(); } }, + "sun font":{ + value: 0|g.getFonts().indexOf(settings.clock.srssFont), + format: v => g.getFonts()[v], + min: 0, max: g.getFonts().length-1, + onchange: v => { + settings.clock.srssFont = g.getFonts()[v]; + writeSettings(); + } + }, + "sun size":{ + value: 0|settings.clock.srssFontSize, + min: 0, + onchange: v => { + settings.clock.srssFontSize = v; + writeSettings(); + } + }, "short date": { value: !!settings.clock.shortDate, format: BOOL_FORMAT, @@ -132,6 +152,14 @@ writeSettings(); } }, + "sun times": { + value: !!settings.clock.showSrss, + format: v=>v?/*LANG*/"Show":/*LANG*/"Hide", + onchange: v => { + settings.clock.showSrss = v; + writeSettings(); + } + }, }; var stopwatchMenu = { diff --git a/apps/timerclk/stopwatch.info b/apps/timerclk/stopwatch.info deleted file mode 100644 index 72ad418b1..000000000 --- a/apps/timerclk/stopwatch.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"timerclk","name":"tclk Stopwatch","src":"timerclk.stopwatch.js","icon":"timerclk.img","version":"0.01","tags":"","files":"","sortorder":10} diff --git a/apps/timerclk/timer.alert.js b/apps/timerclk/timer.alert.js index f51ea6767..96352097d 100644 --- a/apps/timerclk/timer.alert.js +++ b/apps/timerclk/timer.alert.js @@ -14,10 +14,7 @@ function showTimer(timer) { buttons : {/*LANG*/"Ok":true} }).then(function(ok) { buzzCount = 0; - if (ok) { - timer.time += Date.now() - timer.start; - timer.start = null; - } + timer.start = null; require("Storage").write("timerclk.timer.json",JSON.stringify(timers)); load(); }); @@ -45,16 +42,8 @@ console.log("checking for timers..."); var timers = require("Storage").readJSON("timerclk.timer.json",1)||[]; var active = timers.filter(e=>e.start); if (active.length) { - // if there's an timer, show it - active = active.sort((a,b)=>{ - var at = a.time; - if (a.start) at += Date.now()-a.start; - at = a.period-at; - var bt = b.time; - if (b.start) bt += Date.now()-b.start; - bt = b.period-bt; - return at-bt; - }); + // if there's an active timer, show it + active = active.sort((a,b)=>timerclk.timerExpiresIn(a)-timerclk.timerExpiresIn(b)); showTimer(active[0]); } else { // otherwise just go back to default app diff --git a/apps/timerclk/timer.info b/apps/timerclk/timer.info deleted file mode 100644 index 39a338693..000000000 --- a/apps/timerclk/timer.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"timerclk","name":"tclk Timer","src":"timerclk.timer.js","icon":"timerclk.img","version":"0.01","tags":"","files":"","sortorder":10} diff --git a/apps/timerclk/timer.js b/apps/timerclk/timer.js index 060c07813..25052e6ae 100644 --- a/apps/timerclk/timer.js +++ b/apps/timerclk/timer.js @@ -34,18 +34,20 @@ function update() { } function play() { if (all[current].start) { // running - all[current].timeAdd += Date.now() - all[current].start; + all[current].timeAdd = Date.now() - all[current].start; all[current].start = null; update(); } else { // paused - all[current].start = Date.now(); + all[current].start = Date.now() - all[current].timeAdd; + all[current].timeAdd = 0; update(); } require("Storage").write("timerclk.timer.json",JSON.stringify(all)); timerclkCheckTimers(); } function reset() { - all[current] = defaultElement.clone(); + all[current].start = null; + all[current].timeAdd = 0; update(); require("Storage").write("timerclk.timer.json",JSON.stringify(all)); timerclkCheckTimers(); From 2a530646c1cc87297ef39e4692e37b9ac918522a Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sun, 27 Mar 2022 10:40:26 +0800 Subject: [PATCH 105/188] Fix metadata. --- apps/timerclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/timerclk/metadata.json b/apps/timerclk/metadata.json index ce8870ab0..7c6c7c9b3 100644 --- a/apps/timerclk/metadata.json +++ b/apps/timerclk/metadata.json @@ -28,7 +28,7 @@ {"name":"timerclk.timer.js","url":"timer.js"}, {"name":"timerclk.timer.alert.js","url":"timer.alert.js"}, {"name":"timerclk.alarm.js","url":"alarm.js"}, - {"name":"timerclk.alarm.alert.js","url":"alarm.alert.js"}, + {"name":"timerclk.alarm.alert.js","url":"alarm.alert.js"} ], "data": [{"name":"timerclk.json"},{"name":"timerclk.stopwatch.json"},{"name":"timerclk.timer.json"},{"name":"timerclk.alarm.json"}], "sortorder": 0 From 6330ec0b93a67b4cfc96062370d3653af9360acf Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Sun, 27 Mar 2022 09:33:57 +0200 Subject: [PATCH 106/188] Add files via upload --- apps/bikespeedo/settings.js | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 apps/bikespeedo/settings.js diff --git a/apps/bikespeedo/settings.js b/apps/bikespeedo/settings.js new file mode 100644 index 000000000..a3921f4a3 --- /dev/null +++ b/apps/bikespeedo/settings.js @@ -0,0 +1,48 @@ +(function(back) { + + let settings = require('Storage').readJSON('bikespeedo.json',1)||{}; + + function writeSettings() { + require('Storage').write('bikespeedo.json',settings); + } + + const appMenu = { + '': {'title': 'Bike Speedometer'}, + '< Back': back, + '< Load Bike Speedometer': ()=>{load('bikespeedo.app.js');}, + 'Barometer Altitude adjustment' : function() { E.showMenu(altdiffMenu); }, + 'Kalman Filters' : function() { E.showMenu(kalMenu); } + }; + + const altdiffMenu = { + '': { 'title': 'Altitude adjustment' }, + '< Back': function() { E.showMenu(appMenu); }, + 'Altitude delta': { + value: settings.altDiff || 100, + min: -200, + max: 200, + step: 10, + onchange: v => { + settings.altDiff = v; + writeSettings(); } + } + }; + + const kalMenu = { + '': {'title': 'Kalman Filters'}, + '< Back': function() { E.showMenu(appMenu); }, + 'Speed' : { + value : settings.spdFilt, + format : v => v?"On":"Off", + onchange : () => { settings.spdFilt = !settings.spdFilt; writeSettings(); } + }, + 'Altitude' : { + value : settings.altFilt, + format : v => v?"On":"Off", + onchange : () => { settings.altFilt = !settings.altFilt; writeSettings(); } + } + }; + + E.showMenu(appMenu); + +}); From 354d6e283202908b5356d82ff7950b05a8f94436 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Sun, 27 Mar 2022 09:36:06 +0200 Subject: [PATCH 107/188] Update metadata.json --- apps/bikespeedo/metadata.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/bikespeedo/metadata.json b/apps/bikespeedo/metadata.json index 7dea28649..a627f19f8 100644 --- a/apps/bikespeedo/metadata.json +++ b/apps/bikespeedo/metadata.json @@ -2,7 +2,7 @@ "id": "bikespeedo", "name": "Bike Speedometer (beta)", "shortName": "Bike Speedomet.", - "version": "0.01", + "version": "0.02", "description": "Shows GPS speed, GPS heading, Compass heading, GPS altitude and Barometer altitude from internal sources", "icon": "app.png", "screenshots": [{"url":"Screenshot.png"}], @@ -13,6 +13,8 @@ "allow_emulator": true, "storage": [ {"name":"bikespeedo.app.js","url":"app.js"}, - {"name":"bikespeedo.img","url":"app-icon.js","evaluate":true} - ] + {"name":"bikespeedo.img","url":"app-icon.js","evaluate":true}, + {"name":"bikespeedo.settings.js","url":"settings.js"} + ], + "data": [{"name":"bikespeedo.json"}] } From 746bbe7a10c3c3d631f9c8e6bb03b7a3f5647b48 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Sun, 27 Mar 2022 09:38:13 +0200 Subject: [PATCH 108/188] Update ChangeLog --- apps/bikespeedo/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/bikespeedo/ChangeLog b/apps/bikespeedo/ChangeLog index 5fb78710b..2a3023750 100644 --- a/apps/bikespeedo/ChangeLog +++ b/apps/bikespeedo/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Barometer altitude adjustment setting From 0c29915231aec60f0a00d1e2b21a28ab93c61771 Mon Sep 17 00:00:00 2001 From: The Dod Date: Sun, 27 Mar 2022 14:11:49 +0300 Subject: [PATCH 109/188] `mkFourTwentyTz.js` now handles new CSV format Also make a fresh `fourTwentyTz.js` from latest timezonedb.com CSV zip. --- apps/ftclock/.gitignore | 7 ++- apps/ftclock/ChangeLog | 1 + apps/ftclock/fourTwentyTz.js | 42 ++++++------- apps/ftclock/metadata.json | 2 +- apps/ftclock/mkFourTwentyTz.js | 104 +++++++++++++++------------------ 5 files changed, 75 insertions(+), 81 deletions(-) diff --git a/apps/ftclock/.gitignore b/apps/ftclock/.gitignore index b384cf1f2..304792757 100644 --- a/apps/ftclock/.gitignore +++ b/apps/ftclock/.gitignore @@ -1,4 +1,5 @@ -timezonedb.csv.zip +TimeZoneDB.csv.zip country.csv -zone.csv -timezone.csv +time_zone.csv +database.sql +readme.txt diff --git a/apps/ftclock/ChangeLog b/apps/ftclock/ChangeLog index c944dd9ac..83ec21ee6 100644 --- a/apps/ftclock/ChangeLog +++ b/apps/ftclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: first release 0.02: RAM efficient version of `fourTwentyTz.js` (as suggested by @gfwilliams). +0.03: `mkFourTwentyTz.js` now handles new timezonedb.com CSV format diff --git a/apps/ftclock/fourTwentyTz.js b/apps/ftclock/fourTwentyTz.js index 5fa6cdab7..7ef7418f6 100644 --- a/apps/ftclock/fourTwentyTz.js +++ b/apps/ftclock/fourTwentyTz.js @@ -1,33 +1,33 @@ // Generated by mkFourTwentyTz.js -// Wed Jan 12 2022 19:35:36 GMT+0200 (Israel Standard Time) -// Data source: https://timezonedb.com/files/timezonedb.csv.zip +// Sun Mar 27 2022 14:10:08 GMT+0300 (Israel Daylight Time) +// Data source: https://timezonedb.com/files/TimeZoneDB.csv.zip exports.offsets = [1380,1320,1260,1200,1140,1080,1020,960,900,840,780,720,660,600,540,480,420,360,300,240,180,120,60,0]; exports.timezones = function(offs) { switch (offs) { - case 1380: return ["Cape Verde, Cabo Verde","Scoresbysund, Greenland","Azores, Portugal"]; - case 1320: return ["Noronha, Brazil","South Georgia, South Georgia and the South Sandwich Islands"]; - case 1260: return ["Palmer, Antarctica","Rothera, Antarctica","Buenos Aires, Argentina","Cordoba, Argentina","Salta, Argentina","Jujuy, Argentina","Tucuman, Argentina","Catamarca, Argentina","La Rioja, Argentina","San Juan, Argentina","Mendoza, Argentina","San Luis, Argentina","Rio Gallegos, Argentina","Ushuaia, Argentina","Belem, Brazil","Fortaleza, Brazil","Recife, Brazil","Araguaina, Brazil","Maceio, Brazil","Bahia, Brazil","Sao Paulo, Brazil","Santarem, Brazil","Santiago, Chile","Punta Arenas, Chile","Stanley, Falkland Islands (Malvinas)","Cayenne, French Guiana","Nuuk, Greenland","Miquelon, Saint Pierre and Miquelon","Asuncion, Paraguay","Paramaribo, Suriname","Montevideo, Uruguay"]; - case 1200: return ["Antigua, Antigua and Barbuda","Anguilla, Anguilla","Aruba, Aruba","Barbados, Barbados","St Barthelemy, Saint Barthélemy","Bermuda, Bermuda","La Paz, Bolivia (Plurinational State of)","Kralendijk, Bonaire, Sint Eustatius and Saba","Campo Grande, Brazil","Cuiaba, Brazil","Porto Velho, Brazil","Boa Vista, Brazil","Manaus, Brazil","Halifax, Canada","Glace Bay, Canada","Moncton, Canada","Goose Bay, Canada","Blanc-Sablon, Canada","Curacao, Curaçao","Dominica, Dominica","Santo Domingo, Dominican Republic","Grenada, Grenada","Thule, Greenland","Guadeloupe, Guadeloupe","Guyana, Guyana","St Kitts, Saint Kitts and Nevis","St Lucia, Saint Lucia","Marigot, Saint Martin (French part)","Martinique, Martinique","Montserrat, Montserrat","Puerto Rico, Puerto Rico","Lower Princes, Sint Maarten (Dutch part)","Port of_Spain, Trinidad and Tobago","St Vincent, Saint Vincent and the Grenadines","Caracas, Venezuela (Bolivarian Republic of)","Tortola, Virgin Islands (British)","St Thomas, Virgin Islands (U.S.)"]; - case 1140: return ["Eirunepe, Brazil","Rio Branco, Brazil","Nassau, Bahamas","Toronto, Canada","Nipigon, Canada","Thunder Bay, Canada","Iqaluit, Canada","Pangnirtung, Canada","Atikokan, Canada","Easter, Chile","Bogota, Colombia","Havana, Cuba","Guayaquil, Ecuador","Port-au-Prince, Haiti","Jamaica, Jamaica","Cayman, Cayman Islands","Cancun, Mexico","Panama, Panama","Lima, Peru","Grand Turk, Turks and Caicos Islands","New York, United States of America","Detroit, United States of America","Louisville, Kentucky","Monticello, Kentucky","Indianapolis, Indiana","Vincennes, Indiana","Winamac, Indiana","Marengo, Indiana","Petersburg, Indiana","Vevay, Indiana"]; - case 1080: return ["Belize, Belize","Winnipeg, Canada","Rainy River, Canada","Resolute, Canada","Rankin Inlet, Canada","Regina, Canada","Swift Current, Canada","Costa Rica, Costa Rica","Galapagos, Ecuador","Guatemala, Guatemala","Tegucigalpa, Honduras","Mexico City, Mexico","Merida, Mexico","Monterrey, Mexico","Matamoros, Mexico","Bahia Banderas, Mexico","Managua, Nicaragua","El Salvador, El Salvador","Chicago, United States of America","Tell City, Indiana","Knox, Indiana","Menominee, United States of America","Center, North Dakota","New_Salem, North Dakota","Beulah, North Dakota"]; - case 1020: return ["Edmonton, Canada","Cambridge Bay, Canada","Yellowknife, Canada","Inuvik, Canada","Creston, Canada","Dawson Creek, Canada","Fort Nelson, Canada","Whitehorse, Canada","Dawson, Canada","Mazatlan, Mexico","Chihuahua, Mexico","Ojinaga, Mexico","Hermosillo, Mexico","Denver, United States of America","Boise, United States of America","Phoenix, United States of America"]; - case 960: return ["Vancouver, Canada","Tijuana, Mexico","Pitcairn, Pitcairn","Los Angeles, United States of America"]; - case 900: return ["Gambier, French Polynesia","Anchorage, United States of America","Juneau, United States of America","Sitka, United States of America","Metlakatla, United States of America","Yakutat, United States of America","Nome, United States of America"]; - case 840: return ["Rarotonga, Cook Islands","Kiritimati, Kiribati","Tahiti, French Polynesia","Adak, United States of America","Honolulu, United States of America"]; - case 780: return ["McMurdo, Antarctica","Pago Pago, American Samoa","Fiji, Fiji","Kanton, Kiribati","Niue, Niue","Auckland, New Zealand","Fakaofo, Tokelau","Tongatapu, Tonga","Midway, United States Minor Outlying Islands","Apia, Samoa"]; - case 720: return ["Tarawa, Kiribati","Majuro, Marshall Islands","Kwajalein, Marshall Islands","Norfolk, Norfolk Island","Nauru, Nauru","Kamchatka, Russian Federation","Anadyr, Russian Federation","Funafuti, Tuvalu","Wake, United States Minor Outlying Islands","Wallis, Wallis and Futuna"]; - case 660: return ["Casey, Antarctica","Lord Howe, Australia","Macquarie, Australia","Hobart, Australia","Melbourne, Australia","Sydney, Australia","Pohnpei, Micronesia (Federated States of)","Kosrae, Micronesia (Federated States of)","Noumea, New Caledonia","Bougainville, Papua New Guinea","Magadan, Russian Federation","Sakhalin, Russian Federation","Srednekolymsk, Russian Federation","Guadalcanal, Solomon Islands","Efate, Vanuatu"]; - case 600: return ["DumontDUrville, Antarctica","Brisbane, Australia","Lindeman, Australia","Chuuk, Micronesia (Federated States of)","Guam, Guam","Saipan, Northern Mariana Islands","Port Moresby, Papua New Guinea","Vladivostok, Russian Federation","Ust-Nera, Russian Federation"]; - case 540: return ["Jayapura, Indonesia","Tokyo, Japan","Pyongyang, Korea (Democratic People's Republic of)","Seoul, Korea, Republic of","Palau, Palau","Chita, Russian Federation","Yakutsk, Russian Federation","Khandyga, Russian Federation","Dili, Timor-Leste"]; + case 1380: return ["Cape Verde, Cape Verde"]; + case 1320: return ["Noronha, Brazil","Nuuk, Greenland","South Georgia, South Georgia and the South Sandwich Islands","Miquelon, Saint Pierre and Miquelon"]; + case 1260: return ["Palmer, Antarctica","Rothera, Antarctica","Buenos Aires, Argentina","Cordoba, Argentina","Salta, Argentina","Jujuy, Argentina","Tucuman, Argentina","Catamarca, Argentina","La Rioja, Argentina","San Juan, Argentina","Mendoza, Argentina","San Luis, Argentina","Rio Gallegos, Argentina","Ushuaia, Argentina","Bermuda, Bermuda","Belem, Brazil","Fortaleza, Brazil","Recife, Brazil","Araguaina, Brazil","Maceio, Brazil","Bahia, Brazil","Sao Paulo, Brazil","Santarem, Brazil","Halifax, Canada","Glace Bay, Canada","Moncton, Canada","Goose Bay, Canada","Santiago, Chile","Punta Arenas, Chile","Stanley, Falkland Islands (Malvinas)","Cayenne, French Guiana","Thule, Greenland","Paramaribo, Suriname","Montevideo, Uruguay"]; + case 1200: return ["Antigua, Antigua and Barbuda","Anguilla, Anguilla","Aruba, Aruba","Barbados, Barbados","St Barthelemy, Saint Barthélemy","La Paz, Bolivia, Plurinational State of","Kralendijk, Bonaire, Sint Eustatius and Saba","Campo Grande, Brazil","Cuiaba, Brazil","Porto Velho, Brazil","Boa Vista, Brazil","Manaus, Brazil","Nassau, Bahamas","Blanc-Sablon, Canada","Toronto, Canada","Nipigon, Canada","Thunder Bay, Canada","Iqaluit, Canada","Pangnirtung, Canada","Havana, Cuba","Curacao, Curaçao","Dominica, Dominica","Santo Domingo, Dominican Republic","Grenada, Grenada","Guadeloupe, Guadeloupe","Guyana, Guyana","Port-au-Prince, Haiti","St Kitts, Saint Kitts and Nevis","St Lucia, Saint Lucia","Marigot, Saint Martin (French part)","Martinique, Martinique","Montserrat, Montserrat","Puerto Rico, Puerto Rico","Asuncion, Paraguay","Lower Princes, Sint Maarten (Dutch part)","Grand Turk, Turks and Caicos Islands","Port of_Spain, Trinidad and Tobago","New York, United States","Detroit, United States","Louisville, Kentucky","Monticello, Kentucky","Indianapolis, Indiana","Vincennes, Indiana","Winamac, Indiana","Marengo, Indiana","Petersburg, Indiana","Vevay, Indiana","St Vincent, Saint Vincent and the Grenadines","Caracas, Venezuela, Bolivarian Republic of","Tortola, Virgin Islands, British","St Thomas, Virgin Islands, U.S."]; + case 1140: return ["Eirunepe, Brazil","Rio Branco, Brazil","Atikokan, Canada","Winnipeg, Canada","Rainy River, Canada","Resolute, Canada","Rankin Inlet, Canada","Easter, Chile","Bogota, Colombia","Guayaquil, Ecuador","Jamaica, Jamaica","Cayman, Cayman Islands","Cancun, Mexico","Matamoros, Mexico","Panama, Panama","Lima, Peru","Chicago, United States","Tell City, Indiana","Knox, Indiana","Menominee, United States","Center, North Dakota","New_Salem, North Dakota","Beulah, North Dakota"]; + case 1080: return ["Belize, Belize","Regina, Canada","Swift Current, Canada","Edmonton, Canada","Cambridge Bay, Canada","Yellowknife, Canada","Inuvik, Canada","Costa Rica, Costa Rica","Galapagos, Ecuador","Guatemala, Guatemala","Tegucigalpa, Honduras","Mexico City, Mexico","Merida, Mexico","Monterrey, Mexico","Ojinaga, Mexico","Bahia Banderas, Mexico","Managua, Nicaragua","El Salvador, El Salvador","Denver, United States","Boise, United States"]; + case 1020: return ["Creston, Canada","Dawson Creek, Canada","Fort Nelson, Canada","Whitehorse, Canada","Dawson, Canada","Vancouver, Canada","Mazatlan, Mexico","Chihuahua, Mexico","Hermosillo, Mexico","Tijuana, Mexico","Phoenix, United States","Los Angeles, United States"]; + case 960: return ["Pitcairn, Pitcairn","Anchorage, United States","Juneau, United States","Sitka, United States","Metlakatla, United States","Yakutat, United States","Nome, United States"]; + case 900: return ["Gambier, French Polynesia","Adak, United States"]; + case 840: return ["Rarotonga, Cook Islands","Kiritimati, Kiribati","Tahiti, French Polynesia","Honolulu, United States"]; + case 780: return ["McMurdo, Antarctica","Pago Pago, American Samoa","Kanton, Kiribati","Niue, Niue","Auckland, New Zealand","Fakaofo, Tokelau","Tongatapu, Tonga","Midway, United States Minor Outlying Islands","Apia, Samoa"]; + case 720: return ["Fiji, Fiji","Tarawa, Kiribati","Majuro, Marshall Islands","Kwajalein, Marshall Islands","Norfolk, Norfolk Island","Nauru, Nauru","Kamchatka, Russian Federation","Anadyr, Russian Federation","Funafuti, Tuvalu","Wake, United States Minor Outlying Islands","Wallis, Wallis and Futuna"]; + case 660: return ["Casey, Antarctica","Lord Howe, Australia","Macquarie, Australia","Hobart, Australia","Melbourne, Australia","Sydney, Australia","Pohnpei, Micronesia, Federated States of","Kosrae, Micronesia, Federated States of","Noumea, New Caledonia","Bougainville, Papua New Guinea","Magadan, Russian Federation","Sakhalin, Russian Federation","Srednekolymsk, Russian Federation","Guadalcanal, Solomon Islands","Efate, Vanuatu"]; + case 600: return ["DumontDUrville, Antarctica","Brisbane, Australia","Lindeman, Australia","Chuuk, Micronesia, Federated States of","Guam, Guam","Saipan, Northern Mariana Islands","Port Moresby, Papua New Guinea","Vladivostok, Russian Federation","Ust-Nera, Russian Federation"]; + case 540: return ["Jayapura, Indonesia","Tokyo, Japan","Pyongyang, Korea, Democratic People's Republic of","Seoul, Korea, Republic of","Palau, Palau","Chita, Russian Federation","Yakutsk, Russian Federation","Khandyga, Russian Federation","Dili, Timor-Leste"]; case 480: return ["Perth, Australia","Brunei, Brunei Darussalam","Shanghai, China","Hong Kong, Hong Kong","Makassar, Indonesia","Ulaanbaatar, Mongolia","Choibalsan, Mongolia","Macau, Macao","Kuala Lumpur, Malaysia","Kuching, Malaysia","Manila, Philippines","Irkutsk, Russian Federation","Singapore, Singapore","Taipei, Taiwan, Province of China"]; case 420: return ["Davis, Antarctica","Christmas, Christmas Island","Jakarta, Indonesia","Pontianak, Indonesia","Phnom Penh, Cambodia","Vientiane, Lao People's Democratic Republic","Hovd, Mongolia","Novosibirsk, Russian Federation","Barnaul, Russian Federation","Tomsk, Russian Federation","Novokuznetsk, Russian Federation","Krasnoyarsk, Russian Federation","Bangkok, Thailand","Ho Chi_Minh, Viet Nam"]; case 360: return ["Vostok, Antarctica","Dhaka, Bangladesh","Thimphu, Bhutan","Urumqi, China","Chagos, British Indian Ocean Territory","Bishkek, Kyrgyzstan","Almaty, Kazakhstan","Qostanay, Kazakhstan","Omsk, Russian Federation"]; case 300: return ["Mawson, Antarctica","Qyzylorda, Kazakhstan","Aqtobe, Kazakhstan","Aqtau, Kazakhstan","Atyrau, Kazakhstan","Oral, Kazakhstan","Maldives, Maldives","Karachi, Pakistan","Yekaterinburg, Russian Federation","Kerguelen, French Southern Territories","Dushanbe, Tajikistan","Ashgabat, Turkmenistan","Samarkand, Uzbekistan","Tashkent, Uzbekistan"]; case 240: return ["Dubai, United Arab Emirates","Yerevan, Armenia","Baku, Azerbaijan","Tbilisi, Georgia","Mauritius, Mauritius","Muscat, Oman","Reunion, Réunion","Astrakhan, Russian Federation","Saratov, Russian Federation","Ulyanovsk, Russian Federation","Samara, Russian Federation","Mahe, Seychelles"]; - case 180: return ["Syowa, Antarctica","Bahrain, Bahrain","Minsk, Belarus","Djibouti, Djibouti","Asmara, Eritrea","Addis Ababa, Ethiopia","Baghdad, Iraq","Nairobi, Kenya","Comoro, Comoros","Kuwait, Kuwait","Antananarivo, Madagascar","Qatar, Qatar","Moscow, Russian Federation","Simferopol, Ukraine","Kirov, Russian Federation","Volgograd, Russian Federation","Riyadh, Saudi Arabia","Mogadishu, Somalia","Istanbul, Turkey","Dar es_Salaam, Tanzania, United Republic of","Kampala, Uganda","Aden, Yemen","Mayotte, Mayotte"]; - case 120: return ["Mariehamn, Åland Islands","Sofia, Bulgaria","Bujumbura, Burundi","Gaborone, Botswana","Lubumbashi, Congo, Democratic Republic of the","Nicosia, Cyprus","Famagusta, Cyprus","Tallinn, Estonia","Cairo, Egypt","Helsinki, Finland","Athens, Greece","Jerusalem, Israel","Amman, Jordan","Beirut, Lebanon","Maseru, Lesotho","Vilnius, Lithuania","Riga, Latvia","Tripoli, Libya","Chisinau, Moldova, Republic of","Blantyre, Malawi","Maputo, Mozambique","Windhoek, Namibia","Gaza, Palestine, State of","Hebron, Palestine, State of","Bucharest, Romania","Kaliningrad, Russian Federation","Kigali, Rwanda","Khartoum, Sudan","Juba, South Sudan","Damascus, Syrian Arab Republic","Mbabane, Eswatini","Kiev, Ukraine","Uzhgorod, Ukraine","Zaporozhye, Ukraine","Johannesburg, South Africa","Lusaka, Zambia","Harare, Zimbabwe"]; - case 60: return ["Andorra, Andorra","Tirane, Albania","Luanda, Angola","Vienna, Austria","Sarajevo, Bosnia and Herzegovina","Brussels, Belgium","Porto-Novo, Benin","Kinshasa, Congo, Democratic Republic of the","Bangui, Central African Republic","Brazzaville, Congo","Zurich, Switzerland","Douala, Cameroon","Prague, Czechia","Berlin, Germany","Busingen, Germany","Copenhagen, Denmark","Algiers, Algeria","El Aaiun, Western Sahara","Madrid, Spain","Ceuta, Spain","Paris, France","Libreville, Gabon","Gibraltar, Gibraltar","Malabo, Equatorial Guinea","Zagreb, Croatia","Budapest, Hungary","Rome, Italy","Vaduz, Liechtenstein","Luxembourg, Luxembourg","Casablanca, Morocco","Monaco, Monaco","Podgorica, Montenegro","Skopje, North Macedonia","Malta, Malta","Niamey, Niger","Lagos, Nigeria","Amsterdam, Netherlands","Oslo, Norway","Warsaw, Poland","Belgrade, Serbia","Stockholm, Sweden","Ljubljana, Slovenia","Longyearbyen, Svalbard and Jan Mayen","Bratislava, Slovakia","San Marino, San Marino","Ndjamena, Chad","Tunis, Tunisia","Vatican, Holy See"]; - case 0: return ["Troll, Antarctica","Ouagadougou, Burkina Faso","Abidjan, Côte d'Ivoire","Canary, Spain","Faroe, Faroe Islands","London, United Kingdom of Great Britain and Northern Ireland","Guernsey, Guernsey","Accra, Ghana","Danmarkshavn, Greenland","Banjul, Gambia","Conakry, Guinea","Bissau, Guinea-Bissau","Dublin, Ireland","Isle of_Man, Isle of Man","Reykjavik, Iceland","Jersey, Jersey","Monrovia, Liberia","Bamako, Mali","Nouakchott, Mauritania","Lisbon, Portugal","Madeira, Portugal","St Helena, Saint Helena, Ascension and Tristan da Cunha","Freetown, Sierra Leone","Dakar, Senegal","Sao Tome, Sao Tome and Principe","Lome, Togo"]; + case 180: return ["Syowa, Antarctica","Mariehamn, Åland Islands","Sofia, Bulgaria","Bahrain, Bahrain","Minsk, Belarus","Nicosia, Cyprus","Famagusta, Cyprus","Djibouti, Djibouti","Tallinn, Estonia","Asmara, Eritrea","Addis Ababa, Ethiopia","Helsinki, Finland","Athens, Greece","Jerusalem, Israel","Baghdad, Iraq","Amman, Jordan","Nairobi, Kenya","Comoro, Comoros","Kuwait, Kuwait","Beirut, Lebanon","Vilnius, Lithuania","Riga, Latvia","Chisinau, Moldova, Republic of","Antananarivo, Madagascar","Gaza, Palestine, State of","Hebron, Palestine, State of","Qatar, Qatar","Bucharest, Romania","Moscow, Russian Federation","Simferopol, Ukraine","Kirov, Russian Federation","Volgograd, Russian Federation","Riyadh, Saudi Arabia","Mogadishu, Somalia","Damascus, Syrian Arab Republic","Istanbul, Turkey","Dar es_Salaam, Tanzania, United Republic of","Kiev, Ukraine","Uzhgorod, Ukraine","Zaporozhye, Ukraine","Kampala, Uganda","Aden, Yemen","Mayotte, Mayotte"]; + case 120: return ["Andorra, Andorra","Tirane, Albania","Troll, Antarctica","Vienna, Austria","Sarajevo, Bosnia and Herzegovina","Brussels, Belgium","Bujumbura, Burundi","Gaborone, Botswana","Lubumbashi, Congo, the Democratic Republic of the","Zurich, Switzerland","Prague, Czech Republic","Berlin, Germany","Busingen, Germany","Copenhagen, Denmark","Cairo, Egypt","Madrid, Spain","Ceuta, Spain","Paris, France","Gibraltar, Gibraltar","Zagreb, Croatia","Budapest, Hungary","Rome, Italy","Vaduz, Liechtenstein","Maseru, Lesotho","Luxembourg, Luxembourg","Tripoli, Libya","Monaco, Monaco","Podgorica, Montenegro","Skopje, Macedonia, the Former Yugoslav Republic of","Malta, Malta","Blantyre, Malawi","Maputo, Mozambique","Windhoek, Namibia","Amsterdam, Netherlands","Oslo, Norway","Warsaw, Poland","Belgrade, Serbia","Kaliningrad, Russian Federation","Kigali, Rwanda","Khartoum, Sudan","Stockholm, Sweden","Ljubljana, Slovenia","Longyearbyen, Svalbard and Jan Mayen","Bratislava, Slovakia","San Marino, San Marino","Juba, South Sudan","Mbabane, Swaziland","Vatican, Holy See (Vatican City State)","Johannesburg, South Africa","Lusaka, Zambia","Harare, Zimbabwe"]; + case 60: return ["Luanda, Angola","Porto-Novo, Benin","Kinshasa, Congo, the Democratic Republic of the","Bangui, Central African Republic","Brazzaville, Congo","Douala, Cameroon","Algiers, Algeria","Canary, Spain","Faroe, Faroe Islands","Libreville, Gabon","London, United Kingdom","Guernsey, Guernsey","Malabo, Equatorial Guinea","Dublin, Ireland","Isle of_Man, Isle of Man","Jersey, Jersey","Niamey, Niger","Lagos, Nigeria","Lisbon, Portugal","Madeira, Portugal","Ndjamena, Chad","Tunis, Tunisia"]; + case 0: return ["Ouagadougou, Burkina Faso","Abidjan, Côte d'Ivoire","El Aaiun, Western Sahara","Accra, Ghana","Danmarkshavn, Greenland","Scoresbysund, Greenland","Banjul, Gambia","Conakry, Guinea","Bissau, Guinea-Bissau","Reykjavik, Iceland","Monrovia, Liberia","Casablanca, Morocco","Bamako, Mali","Nouakchott, Mauritania","Azores, Portugal","St Helena, Saint Helena, Ascension and Tristan da Cunha","Freetown, Sierra Leone","Dakar, Senegal","Sao Tome, Sao Tome and Principe","Lome, Togo"]; default: return ["Houston, we have a bug."]; } }; diff --git a/apps/ftclock/metadata.json b/apps/ftclock/metadata.json index 3cbf5ce66..876feb1bb 100644 --- a/apps/ftclock/metadata.json +++ b/apps/ftclock/metadata.json @@ -1,7 +1,7 @@ { "id": "ftclock", "name": "Four Twenty Clock", - "version": "0.02", + "version": "0.03", "description": "A clock that tells when and where it's going to be 4:20 next", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot1.png"}], diff --git a/apps/ftclock/mkFourTwentyTz.js b/apps/ftclock/mkFourTwentyTz.js index 4571c15f7..4e7829aa3 100644 --- a/apps/ftclock/mkFourTwentyTz.js +++ b/apps/ftclock/mkFourTwentyTz.js @@ -4,7 +4,7 @@ let csv = require('csv'); let countries = {}, zones = {}, offsdict = {}, - now = Date.now(); // we need this to find zone's current DST state + now = Date.now()/1000; // we need this to find zone's current DST state function handleWrite(err,bytes) { if (err) { @@ -19,10 +19,10 @@ fs.createReadStream(__dirname+'/country.csv') countries[r[0]] = r[1]; }) .on('end', () => { - fs.createReadStream(__dirname+'/zone.csv') + fs.createReadStream(__dirname+'/time_zone.csv') .pipe(csv.parse()) .on('data', (r) => { - let parts = r[2].replace('_',' ').split('/'); + let parts = r[0].replace('_',' ').split('/'); let city = parts[parts.length-1]; let country =''; if (parts.length>2) { // e.g. America/North_Dakota/New_Salem @@ -30,59 +30,51 @@ fs.createReadStream(__dirname+'/country.csv') } else { country = countries[r[1]]; // e.g. United States } - zones[parseInt(r[0])] = {"name": `${city}, ${country}`}; + zone = zones[r[0]] || { "name": `${city}, ${country}` }; + let starttime = parseInt(r[3] || "0"), // Bugger. They're feeding us blanks for UTC now + offs = parseInt(r[4]); + if (offs<0) { + offs += 60*60*24; + } + if (starttime { - fs.createReadStream(__dirname+'/timezone.csv') - .pipe(csv.parse()) - .on('data', (r) => { - code = parseInt(r[0]); - if (!(code in zones)) return; - starttime = parseInt(r[2] || "0"); // Bugger. They're feeding us blanks for UTC now - offs = parseInt(r[3]); - if (offs<0) { - offs += 60*60*24; - } - zone = zones[code]; - if (starttime { - for (z in zones) { - zone = zones[z]; - if (zone.offs%60) continue; // One a dem funky timezones. Ignore. - zonelist = offsdict[zone.offs] || []; - zonelist.push(zone.name); - offsdict[zone.offs] = zonelist; - } - offsets = []; - for (o in offsdict) { - offsets.unshift(parseInt(o)); - } - fs.open("fourTwentyTz.js","w", (err, fd) => { - if (err) { - console.log("Can't open output file"); - return; - } - fs.write(fd, "// Generated by mkFourTwentyTz.js\n", handleWrite); - fs.write(fd, `// ${Date()}\n`, handleWrite); - fs.write(fd, "// Data source: https://timezonedb.com/files/timezonedb.csv.zip\n", handleWrite); - fs.write(fd, "exports.offsets = ", handleWrite); - fs.write(fd, JSON.stringify(offsets), handleWrite); - fs.write(fd, ";\n", handleWrite); - fs.write(fd, "exports.timezones = function(offs) {\n", handleWrite); - fs.write(fd, " switch (offs) {\n", handleWrite); - for (i=0; i { + if (err) { + console.log("Can't open output file"); + return; + } + fs.write(fd, "// Generated by mkFourTwentyTz.js\n", handleWrite); + fs.write(fd, `// ${Date()}\n`, handleWrite); + fs.write(fd, "// Data source: https://timezonedb.com/files/TimeZoneDB.csv.zip\n", handleWrite); + fs.write(fd, "exports.offsets = ", handleWrite); + fs.write(fd, JSON.stringify(offsets), handleWrite); + fs.write(fd, ";\n", handleWrite); + fs.write(fd, "exports.timezones = function(offs) {\n", handleWrite); + fs.write(fd, " switch (offs) {\n", handleWrite); + for (i=0; i Date: Sun, 27 Mar 2022 13:27:17 +0200 Subject: [PATCH 110/188] Update app.js --- apps/bikespeedo/app.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/bikespeedo/app.js b/apps/bikespeedo/app.js index 0c5680c9d..edb23fc78 100644 --- a/apps/bikespeedo/app.js +++ b/apps/bikespeedo/app.js @@ -460,9 +460,11 @@ function updateClock() { } +// =Main Prog + +// Read settings. +let cfg = require('Storage').readJSON('bikespeedo.json',1)||{}; -//### -let cfg = {}; cfg.spd = 1; // Multiplier for speed unit conversions. 0 = use the locale values for speed cfg.spd_unit = 'km/h'; // Displayed speed unit cfg.alt = 1; // Multiplier for altitude unit conversions. (feet:'0.3048') @@ -472,8 +474,12 @@ cfg.dist_unit = 'km'; // Displayed distnce units cfg.modeA = 1; cfg.primSpd = 1; // 1 = Spd in primary, 0 = Spd in secondary -cfg.spdFilt = false; -cfg.altFilt = false; +cfg.altDiff = cfg.altDiff==undefined?100:cfg.altDiff; +cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; +cfg.altFilt = cfg.altFilt==undefined?false:cfg.altFilt; +console.log("cfg.altDiff: " + cfg.altDiff); +console.log("cfg.spdFilt: " + cfg.spdFilt); +console.log("cfg.altFilt: " + cfg.altFilt); if ( cfg.spdFilt ) var spdFilter = new KalmanFilter({R: 0.1 , Q: 1 }); if ( cfg.altFilt ) var altFilter = new KalmanFilter({R: 0.01, Q: 2 }); @@ -489,7 +495,9 @@ function onGPSraw(nmea) { } } if(BANGLEJS2) Bangle.on('GPS-raw', onGPSraw); -function onPressure(dat) { altiBaro = dat.altitude.toFixed(0); } +function onPressure(dat) { + altiBaro = Number(dat.altitude.toFixed(0)) + Number(cfg.altDiff); +} Bangle.setBarometerPower(1); // needs some time... g.clearRect(0,screenYstart,screenW,screenH); @@ -520,10 +528,10 @@ function Compass_tiltfixread(O,S){ return psi; } var Compass_heading = 0; -function Compass_newHeading(m,h){ +function Compass_newHeading(m,h){ var s = Math.abs(m - h); var delta = (m>h)?1:-1; - if (s>=180){s=360-s; delta = -delta;} + if (s>=180){s=360-s; delta = -delta;} if (s<2) return h; var hd = h + delta*(1 + Math.round(s/5)); if (hd<0) hd+=360; From c43124360f30c73e5c4501b5abfeb037d6893027 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sun, 27 Mar 2022 11:23:23 -0700 Subject: [PATCH 111/188] Update boot.js --- apps/quicklaunch/boot.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 22ec670de..4389e6a84 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,5 +1,8 @@ (function() { var settings = Object.assign(require("Storage").readJSON("quicklaunch.json", true) || {}); + + //list all sources + var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); //populate empty app list @@ -33,7 +36,7 @@ if (!mode.startsWith("clock")) return; function tap() { - //tap, check if source exists + //tap, check if source exists, launch var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); if ((settings.tapapp.src) && apps.some(e => e.src === settings.tapapp.src)) load (settings.tapapp.src); } @@ -48,14 +51,12 @@ } else if (!e.b) { // released const dx = e.x-drag.x, dy = e.y-drag.y; drag = null; - //check if source exists - var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); - //horizontal swipes + //horizontal swipes, check if source exists, launch if (Math.abs(dx)>Math.abs(dy)+10) { if ((settings.leftapp.src) && apps.some(e => e.src === settings.leftapp.src) && dx<0) load(settings.leftapp.src); if ((settings.rightapp.src) && apps.some(e => e.src === settings.rightapp.src) && dx>0) load(settings.rightapp.src); } - //vertical swipes + //vertical swipes, check if source exists, launch else if (Math.abs(dy)>Math.abs(dx)+10) { if ((settings.upapp.src) && apps.some(e => e.src === settings.upapp.src) && dy<0) load(settings.upapp.src); if ((settings.downapp.src) && apps.some(e => e.src === settings.downapp.src) && dy>0) load(settings.downapp.src); From 252f58d1ec429636fc5b4dd3ce40280e252e7629 Mon Sep 17 00:00:00 2001 From: frigis1 <63980066+frigis1@users.noreply.github.com> Date: Sun, 27 Mar 2022 11:31:58 -0700 Subject: [PATCH 112/188] Update boot.js --- apps/quicklaunch/boot.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 4389e6a84..3670c4776 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -37,7 +37,6 @@ function tap() { //tap, check if source exists, launch - var apps = require("Storage").list(/\.info$/).map(app=>{var a=require("Storage").readJSON(app,1);return a&&{src:a.src};}); if ((settings.tapapp.src) && apps.some(e => e.src === settings.tapapp.src)) load (settings.tapapp.src); } From aa99d5cea83b5fb9caba5890ef6b05cdf87be0fe Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Sun, 27 Mar 2022 15:42:13 -0500 Subject: [PATCH 113/188] Reverting fix that was actually a bug --- apps/run/ChangeLog | 3 ++- apps/run/app.js | 4 ++-- apps/run/metadata.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/run/ChangeLog b/apps/run/ChangeLog index 46fdb7e7e..9f1a547b1 100644 --- a/apps/run/ChangeLog +++ b/apps/run/ChangeLog @@ -9,4 +9,5 @@ 0.08: Added support for notifications from exstats. Support all stats from exstats 0.09: Fix broken start/stop if recording not enabled (fix #1561) 0.10: Don't allow the same setting to be chosen for 2 boxes (fix #1578) -0.11: Notifications fixes \ No newline at end of file +0.11: Notifications fixes +0.12: Fix for recorder not stopping at end of run. Bug introduced in 0.11 \ No newline at end of file diff --git a/apps/run/app.js b/apps/run/app.js index fb8158e58..19dcd7e88 100644 --- a/apps/run/app.js +++ b/apps/run/app.js @@ -59,7 +59,7 @@ function onStartStop() { layout.render(); }) ); - } else if (!settings.record && WIDGETS["recorder"]) { + } else { prepPromises.push( WIDGETS["recorder"].setRecording(false) ); @@ -68,7 +68,7 @@ function onStartStop() { if (!prepPromises.length) // fix for Promise.all bug in 2v12 prepPromises.push(Promise.resolve()); - + Promise.all(prepPromises) .then(() => { if (running) { diff --git a/apps/run/metadata.json b/apps/run/metadata.json index 09e5a3bed..b1b5617be 100644 --- a/apps/run/metadata.json +++ b/apps/run/metadata.json @@ -1,6 +1,6 @@ { "id": "run", "name": "Run", - "version":"0.11", + "version":"0.12", "description": "Displays distance, time, steps, cadence, pace and more for runners.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps", From e96e181eded86393f2b26c9a2b67071ddc764831 Mon Sep 17 00:00:00 2001 From: BartS23 <10829389+BartS23@users.noreply.github.com> Date: Sun, 27 Mar 2022 23:29:46 +0200 Subject: [PATCH 114/188] Fix exception on Dist/Step/Time pattern selection --- apps/run/settings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/run/settings.js b/apps/run/settings.js index 6a7d169c4..240df9f07 100644 --- a/apps/run/settings.js +++ b/apps/run/settings.js @@ -91,7 +91,7 @@ ]; notificationsMenu[/*LANG*/"Dist Pattern"] = { value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.dist.notifications))), - min: 0, max: vibTimes.length, + min: 0, max: vibTimes.length - 1, format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.dist.notifications = vibTimes[v]; @@ -101,7 +101,7 @@ } notificationsMenu[/*LANG*/"Step Pattern"] = { value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.step.notifications))), - min: 0, max: vibTimes.length, + min: 0, max: vibTimes.length - 1, format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.step.notifications = vibTimes[v]; @@ -111,7 +111,7 @@ } notificationsMenu[/*LANG*/"Time Pattern"] = { value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.time.notifications))), - min: 0, max: vibTimes.length, + min: 0, max: vibTimes.length - 1, format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.time.notifications = vibTimes[v]; From 02fca7a4c881cdb8ad3019fb4adbe9be4412c673 Mon Sep 17 00:00:00 2001 From: BartS23 <10829389+BartS23@users.noreply.github.com> Date: Mon, 28 Mar 2022 00:04:01 +0200 Subject: [PATCH 115/188] Fix.speed could be NaN then curSpeed during the entire run is NaN --- modules/exstats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/exstats.js b/modules/exstats.js index ec0a838a7..b22f3f5d3 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -135,7 +135,7 @@ Bangle.on("GPS", function(fix) { if (stats["dist"]) stats["dist"].emit("changed",stats["dist"]); var duration = Date.now() - state.startTime; // in ms state.avrSpeed = state.distance * 1000 / duration; // meters/sec - state.curSpeed = state.curSpeed*0.8 + fix.speed*0.2/3.6; // meters/sec + if (!isNaN(fix.speed)) state.curSpeed = state.curSpeed*0.8 + fix.speed*0.2/3.6; // meters/sec if (stats["pacea"]) stats["pacea"].emit("changed",stats["pacea"]); if (stats["pacec"]) stats["pacec"].emit("changed",stats["pacec"]); if (stats["speed"]) stats["speed"].emit("changed",stats["speed"]); From bacc9e80af40ec2940fd9fb901647e682a998728 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 08:24:12 +0200 Subject: [PATCH 116/188] Update widget.js -Avoid too many notifications on connection loss. -Change non-connected icon color. --- apps/widbt/widget.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 246b8d65b..96656324e 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -1,12 +1,14 @@ WIDGETS.bluetooth = { area: "tr", width: 15, + warningEnabled: 1, draw: function() { g.reset(); if (NRF.getSecurityStatus().connected) { g.setColor((g.getBPP() > 8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); } else { - g.setColor(g.theme.dark ? "#666" : "#999"); + // g.setColor(g.theme.dark ? "#666" : "#999"); + g.setColor("#f00"); // red is easier to distinguish from blue } g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), 2 + this.x, 2 + this.y); }, @@ -14,7 +16,11 @@ WIDGETS.bluetooth = { WIDGETS.bluetooth.draw(); }, diconnect: function() { - Bangle.buzz(1000, 1); // buzz on connection loss + if(warningEnabled == 1){ + Bangle.buzz(700, 1); // buzz on connection loss + warningEnabled = 0; + setTimeout('WIDGETS.bluetooth.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. + } WIDGETS.bluetooth.draw(); } }; From 9ad0704cd26a7c1ab56c8ce5573d0b724247c5c4 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 08:24:40 +0200 Subject: [PATCH 117/188] Update metadata.json Version update. --- apps/widbt/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt/metadata.json b/apps/widbt/metadata.json index 29d960f33..6e705584e 100644 --- a/apps/widbt/metadata.json +++ b/apps/widbt/metadata.json @@ -1,7 +1,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.10", + "version": "0.11", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", From c8bc3f7254f0aa32ff80a6c176c1c8715401d7b0 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 08:25:36 +0200 Subject: [PATCH 118/188] Update ChangeLog 0.11: Avoid too many notifications. Change disconnected colour to red. --- apps/widbt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 04bff2b1a..b5a50210e 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -7,3 +7,4 @@ 0.08: Disable LCD on, on bluetooth status change 0.09: Vibrate on connection loss 0.10: Bug fix +0.11: Avoid too many notifications. Change disconnected colour to red. From c34ade140c8f3c7b36c1082d5bed16c1c74c0a73 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 28 Mar 2022 10:30:26 +0100 Subject: [PATCH 119/188] messages 0.27: Add 'mark all read' option to popup menu (fix #1624) --- apps/messages/ChangeLog | 1 + apps/messages/app.js | 5 +++++ apps/messages/metadata.json | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index c39e7d6fe..91d2bb0bf 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -39,3 +39,4 @@ 0.24: Remove left-over debug statement 0.25: Fix widget memory usage issues if message received and watch repeatedly calls Bangle.drawWidgets (fix #1550) 0.26: Setting to auto-open music +0.27: Add 'mark all read' option to popup menu (fix #1624) diff --git a/apps/messages/app.js b/apps/messages/app.js index 403f9b5d8..655fc7122 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -302,6 +302,11 @@ function showMessageSettings(msg) { saveMessages(); checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0,openMusic:0}); }, + /*LANG*/"Mark all read" : () => { + MESSAGES.forEach(msg => msg.new = false); + saveMessages(); + checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0,openMusic:0}); + }, /*LANG*/"Delete all messages" : () => { E.showPrompt(/*LANG*/"Are you sure?", {title:/*LANG*/"Delete All Messages"}).then(isYes => { if (isYes) { diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index a3d3f4179..4fb5a4045 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.26", + "version": "0.27", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", From 105e5279b2a88b651b3efd526ef0665dd00518a6 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 28 Mar 2022 14:27:04 +0200 Subject: [PATCH 120/188] Update metadata.json --- apps/bikespeedo/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bikespeedo/metadata.json b/apps/bikespeedo/metadata.json index a627f19f8..c3de0487c 100644 --- a/apps/bikespeedo/metadata.json +++ b/apps/bikespeedo/metadata.json @@ -1,7 +1,7 @@ { "id": "bikespeedo", "name": "Bike Speedometer (beta)", - "shortName": "Bike Speedomet.", + "shortName": "Bike Speedometer", "version": "0.02", "description": "Shows GPS speed, GPS heading, Compass heading, GPS altitude and Barometer altitude from internal sources", "icon": "app.png", From a7cb978e040266a42c9b15cfe5dfc03a4350c4e6 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 28 Mar 2022 14:49:25 +0200 Subject: [PATCH 121/188] Update README.md --- apps/bikespeedo/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/bikespeedo/README.md b/apps/bikespeedo/README.md index 7d271a022..e4ce5ea5c 100644 --- a/apps/bikespeedo/README.md +++ b/apps/bikespeedo/README.md @@ -6,6 +6,10 @@ #### If "CALIB!" is shown on the display or the compass heading differs too much from GPS heading, compass calibration should be done with the ["Navigation Compass" App](https://banglejs.com/apps/?id=magnav) +Permanently diverging Barometer Altitude values can be compensated in the settings menu. + +Please report bugs to https://github.com/espruino/BangleApps/issues/new?assignees=&labels=bug&template=bangle-bug-report-custom-form.yaml&title=%5BBike+Speedometer%5D+Short+description+of+bug + **Credits:**
Bike Speedometer App by github.com/HilmarSt
Big parts of the software are based on github.com/espruino/BangleApps/tree/master/apps/speedalt
From 74ca4151cd404be0db074ee722e058a91f5fc1f8 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 28 Mar 2022 14:51:45 +0200 Subject: [PATCH 122/188] Update app.js --- apps/bikespeedo/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/bikespeedo/app.js b/apps/bikespeedo/app.js index edb23fc78..a62a429e5 100644 --- a/apps/bikespeedo/app.js +++ b/apps/bikespeedo/app.js @@ -477,9 +477,9 @@ cfg.primSpd = 1; // 1 = Spd in primary, 0 = Spd in secondary cfg.altDiff = cfg.altDiff==undefined?100:cfg.altDiff; cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; cfg.altFilt = cfg.altFilt==undefined?false:cfg.altFilt; -console.log("cfg.altDiff: " + cfg.altDiff); -console.log("cfg.spdFilt: " + cfg.spdFilt); -console.log("cfg.altFilt: " + cfg.altFilt); +// console.log("cfg.altDiff: " + cfg.altDiff); +// console.log("cfg.spdFilt: " + cfg.spdFilt); +// console.log("cfg.altFilt: " + cfg.altFilt); if ( cfg.spdFilt ) var spdFilter = new KalmanFilter({R: 0.1 , Q: 1 }); if ( cfg.altFilt ) var altFilter = new KalmanFilter({R: 0.01, Q: 2 }); From ae972f71c5f74e889c9e2618e2bae69500f728f0 Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Mon, 28 Mar 2022 07:03:59 -0600 Subject: [PATCH 123/188] Update metadata.json --- apps/mtgwatchface/metadata.json | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index f0be4b206..22bdcee1e 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -18,18 +18,12 @@ "storage": [ { "name": "mtgwatchface.app.js", - "url": "app.js", - "supports": [ - "BANGLEJS2" - ] + "url": "app.js" }, { "name": "mtgwatchface.img", "url": "app-icon.js", - "evaluate":true, - "supports": [ - "BANGLEJS2" - ] + "evaluate":true } ] } From a4acab8316754df93a02c541c1badf76080cd68a Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Mon, 28 Mar 2022 07:11:26 -0600 Subject: [PATCH 124/188] Update app-icon.js --- apps/mtgwatchface/app-icon.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/apps/mtgwatchface/app-icon.js b/apps/mtgwatchface/app-icon.js index 3ca872eee..ebeeb7840 100644 --- a/apps/mtgwatchface/app-icon.js +++ b/apps/mtgwatchface/app-icon.js @@ -1,6 +1 @@ -{ - width : 48, height : 48, bpp : 2, - transparent : -1, - palette : new Uint16Array([65535,0,23275,42260]), - buffer : require("heatshrink").decompress(atob("AB8P9Wq3kD////gKCgeVqoAB2QHBhgLCkoKCqtaBYoWDAAIjEgXVBQdWHIkliojE0ALDqv1BYdlqgKCgNVpIvEqvABYMJqtfBYtABYM1BIoABsALBHIgADrgLBKIgADHgRpFAAVXKQQAIBYe6BAdsIYKkBH4U5QQcCMAILBwAGCIgYIBBwQbCqtwIgQLCSQZ0D6oLHFAJ0BwAfBBY4jBA4Nr4ENBYO8gEOHAR3DrNlNYr5Drt1copcCqttvIECrA4COoVtbQVWHQM61WqGIILDtWq1k8DIUFvuJQYUAnALEucJBYcInkCgWggt63Nch06wALBhM77kFU4UJidwBYMBlEsBYcOgFABYcYBYkDEYUBnNcBYOVBYMBHYQDB0EKqvVzkOhYLChsDoELBYPch029gLBh3NCANVi0chXuyALBNwILBysAjhrDBIMgAgPrgEsQYabC1WoA4IGD1gPCABIfBnnA0ewA4MDmADB1ks2/jwv4kHagQyC8sQ3OzhsHlERgUIBYP+ld8+fOmm3iXC5ALBhkAFAQAB4AGFABA")) - } \ No newline at end of file +var img = E.toArrayBuffer(atob("MDCDAf/////////////////////////////////+AAAP/////////////////wAAAAAAAB+v////x//////+AAAAAAAAAAAv///////////wAAAAAAAAAAAhxxxxx/////+OAAAAAAAAAAAP//////////wAAAAAAAAAABxx/////////wAOAAAAAAAAAAAAB////////wABwAAAAAAAAAAAAB//////wAAAOAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAAAB/////+AAAAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP///wAAAOOAAAAAAAAAP+AAAP///wABx///wAAAAAB////wAB//+AAB////+AAAAAP////wAP///wAB/////wAAAB/////wAB//+AAP/////wAAAB/////+AB///wAP/////wAAAB/////wAB//+AAP/////wAAAB/////+AB///wABxx//wAAAABx///xwAB///wAAAAAAAAAAAAAAAAAAAP////wAAAAAAAABwAAAAAAAB/////+AAAAAAAOBwAAAAAAAP///////wAAAABwBwAAAAABx////wAAAAAAAAAOB+AAAAAAAAAP/x///////wBwBwAB///////x/////////wB+P+AP///////x/x/x//x//wBxxwAB/x/xx//x///+Px+P/wAAAAAP/wOPwP/x/x/wPx/x/wAAAAAB/x//x//x///+OB+P/wAAAAAP/+P+B//x/x/wPwAB/wAAAAAB/x/+B//x///+P/wP/wAAOAAP/+P+P//x/x/wP/x//xwAAAAB/x/xxx/x///+P+P//xwAOAOP/+OOAP/x/x///x///xwAP/+B///////x////+P///x+B//+P///////x/xxxxxxxxx/////xxxxxxxxx//////////////////////////xx///xx/x/x///////x/////wP+P+B+P/wPx+P+OP+OP////xwAPxwB//x/xxx+B//xx////+OOPwP///+OBwAOOP+Px/////x///////x////x///x///////////////////////////w==")) From 3f4a45b59f2bfcd9a358de9c9ca665d85ad0e9ff Mon Sep 17 00:00:00 2001 From: Brant Peery Date: Mon, 28 Mar 2022 11:26:14 -0600 Subject: [PATCH 125/188] Update version --- apps/mtgwatchface/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mtgwatchface/metadata.json b/apps/mtgwatchface/metadata.json index 22bdcee1e..fd81ce10f 100644 --- a/apps/mtgwatchface/metadata.json +++ b/apps/mtgwatchface/metadata.json @@ -2,7 +2,7 @@ "id": "mtgwatchface", "name": "MTG Watchface", "shortName": "Magic the Gathering Watch Face", - "version": "1v02", + "version": "1v03", "description": "Magic the Gathering themed watch face. Embrace the inner wizzard. Dispay any of the different types of mana on your watch. Which color are you devoted to today? ", "icon": "icon.png", "screenshots": [ From 464643db38fb264ab0f0766fe6183e2dd5b12ebd Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 21:40:10 +0200 Subject: [PATCH 126/188] Update widget.js --- apps/widbt/widget.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 96656324e..b9035e9bb 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -15,10 +15,11 @@ WIDGETS.bluetooth = { connect: function() { WIDGETS.bluetooth.draw(); }, - diconnect: function() { + disconnect: function() { if(warningEnabled == 1){ Bangle.buzz(700, 1); // buzz on connection loss - warningEnabled = 0; + E.showMessage("Connection\nlost.","Bluetooth"); + WIDGETS.bluetooth.warningEnabled = 0; setTimeout('WIDGETS.bluetooth.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. } WIDGETS.bluetooth.draw(); @@ -26,4 +27,4 @@ WIDGETS.bluetooth = { }; NRF.on('connect', WIDGETS.bluetooth.connect); -NRF.on('disconnect', WIDGETS.bluetooth.diconnect); +NRF.on('disconnect', WIDGETS.bluetooth.disconnect); From cd1294af40f8365e0fa62b6828a29c8c6ac2b988 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 21:53:55 +0200 Subject: [PATCH 127/188] Update widget.js --- apps/widbt/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index b9035e9bb..58b4d4b4a 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -16,7 +16,7 @@ WIDGETS.bluetooth = { WIDGETS.bluetooth.draw(); }, disconnect: function() { - if(warningEnabled == 1){ + if(WIDGETS.bluetooth.warningEnabled == 1){ Bangle.buzz(700, 1); // buzz on connection loss E.showMessage("Connection\nlost.","Bluetooth"); WIDGETS.bluetooth.warningEnabled = 0; From a06c782edeb56ed540f8baf6b160b7f01e24d42f Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 21:57:52 +0200 Subject: [PATCH 128/188] Update settings.js -Option to unlock the watch, when a message arrives, so the buttons can directly be touched. --- apps/messages/settings.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 99843602b..1e9605360 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -4,6 +4,7 @@ if (settings.vibrate===undefined) settings.vibrate="."; if (settings.repeat===undefined) settings.repeat=4; if (settings.unreadTimeout===undefined) settings.unreadTimeout=60; + if( settings.unlockWatch===undefined) settings.unlockWatch = false; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; return settings; @@ -49,6 +50,11 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("openMusic", v) }, + /*LANG*/'Unlock Watch': { + value: !!settings().unlockWatch, + format: v => v?/*LANG*/'Yes':/*LANG*/'No', + onchange: v => updateSetting("unlockWatch", v) + }, }; E.showMenu(mainmenu); }) From af7f67205378c374d87fa0ab5bf890a81fed0ebf Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:08:16 +0200 Subject: [PATCH 129/188] Update lib.js Unlock the watch, to get touch access, if the user want that. --- apps/messages/lib.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 0f514a73d..3e6dd2426 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -58,6 +58,7 @@ exports.pushMessage = function(event) { var loadMessages = Bangle.CLOCK || event.important; // first, buzz var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; + var unlockWatch = (require('Storage').readJSON('setting.json',1)||{}).unlockWatch; if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages) WIDGETS.messages.buzz(); // after a delay load the app, to ensure we have all the messages @@ -65,7 +66,12 @@ exports.pushMessage = function(event) { exports.messageTimeout = setTimeout(function() { exports.messageTimeout = undefined; // if we're in a clock or it's important, go straight to messages app - if (loadMessages) return load("messages.app.js"); + if (loadMessages){ + if(unlockWatch){ + Bangle.setLocked(false); + } + return load("messages.app.js"); + } if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz to let someone know WIDGETS.messages.show(); }, 500); From 29f93c01655b9026df946a1e4699bd4719696472 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:10:29 +0200 Subject: [PATCH 130/188] Update README.md --- apps/messages/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/messages/README.md b/apps/messages/README.md index 655c549b9..780d8e50b 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -20,6 +20,7 @@ to the clock where a ringing bell will be shown in the Widget bar. is chosen if there isn't much message text, but this specifies the smallest the font should get before it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? +* `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? ## New Messages From 148e571769bd9cd5e2add8884e26f634a24c1fa6 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:12:19 +0200 Subject: [PATCH 131/188] Update ChangeLog 0.27: Option to auto-unlock the watch when a new message arrives --- apps/messages/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index c39e7d6fe..e263227e5 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -39,3 +39,4 @@ 0.24: Remove left-over debug statement 0.25: Fix widget memory usage issues if message received and watch repeatedly calls Bangle.drawWidgets (fix #1550) 0.26: Setting to auto-open music +0.27: Option to auto-unlock the watch when a new message arrives From febcdf4f536360fab3b6fba853a19eefc887c9f1 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:15:41 +0200 Subject: [PATCH 132/188] Update metadata.json --- apps/messages/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index a3d3f4179..4fb5a4045 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.26", + "version": "0.27", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", From 14e8a93c81840788ee1e7264cb85356abdfc6d77 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:28:39 +0200 Subject: [PATCH 133/188] Update lib.js --- apps/messages/lib.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 3e6dd2426..ba632cb46 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -58,18 +58,19 @@ exports.pushMessage = function(event) { var loadMessages = Bangle.CLOCK || event.important; // first, buzz var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; - var unlockWatch = (require('Storage').readJSON('setting.json',1)||{}).unlockWatch; - if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages) + var unlockWatch = !!((require('Storage').readJSON("messages.settings.json", true) || {}).unlockWatch; + if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages){ WIDGETS.messages.buzz(); + if(unlockWatch){ + Bangle.setLocked(false); + } + } // after a delay load the app, to ensure we have all the messages if (exports.messageTimeout) clearTimeout(exports.messageTimeout); exports.messageTimeout = setTimeout(function() { exports.messageTimeout = undefined; // if we're in a clock or it's important, go straight to messages app if (loadMessages){ - if(unlockWatch){ - Bangle.setLocked(false); - } return load("messages.app.js"); } if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz to let someone know From b5010b41098e862d0f53f42d4c0c1ee32f12683c Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:33:52 +0200 Subject: [PATCH 134/188] Update lib.js --- apps/messages/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index ba632cb46..f7489c276 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -58,7 +58,7 @@ exports.pushMessage = function(event) { var loadMessages = Bangle.CLOCK || event.important; // first, buzz var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; - var unlockWatch = !!((require('Storage').readJSON("messages.settings.json", true) || {}).unlockWatch; + var unlockWatch = !!((require('Storage').readJSON("messages.settings.json", true) || {}).unlockWatch); if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages){ WIDGETS.messages.buzz(); if(unlockWatch){ From a011858cab9218642bf43344dd3d389b83c203c1 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:43:46 +0200 Subject: [PATCH 135/188] Update lib.js --- apps/messages/lib.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index f7489c276..30ffe0a95 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -57,11 +57,11 @@ exports.pushMessage = function(event) { // otherwise load messages/show widget var loadMessages = Bangle.CLOCK || event.important; // first, buzz - var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; - var unlockWatch = !!((require('Storage').readJSON("messages.settings.json", true) || {}).unlockWatch); + var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; + var unlockWatch = (require('Storage').readJSON('setting.json',1)||{}).unlockWatch; if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages){ WIDGETS.messages.buzz(); - if(unlockWatch){ + if(!!unlockWatch){ Bangle.setLocked(false); } } From cf53626c5957e7eb08f9080964b28560b11b0fbd Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 22:45:41 +0200 Subject: [PATCH 136/188] Update lib.js --- apps/messages/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 30ffe0a95..fa607b268 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -61,7 +61,7 @@ exports.pushMessage = function(event) { var unlockWatch = (require('Storage').readJSON('setting.json',1)||{}).unlockWatch; if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages){ WIDGETS.messages.buzz(); - if(!!unlockWatch){ + if(unlockWatch != false){ Bangle.setLocked(false); } } From 284da20f01b3425b6238c558de8761433ddb01aa Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Mon, 28 Mar 2022 23:14:00 +0200 Subject: [PATCH 137/188] Update ChangeLog --- apps/messages/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 91d2bb0bf..7815cc3d1 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -40,3 +40,4 @@ 0.25: Fix widget memory usage issues if message received and watch repeatedly calls Bangle.drawWidgets (fix #1550) 0.26: Setting to auto-open music 0.27: Add 'mark all read' option to popup menu (fix #1624) + Option to auto-unlock the watch when a new message arrives From deb18b0ef5cc8138f17a00a356daa38f64fb67db Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 29 Mar 2022 07:15:05 +0200 Subject: [PATCH 138/188] Update widget.js Reload the clock after the "connection lost" message was shown. --- apps/widbt/widget.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 58b4d4b4a..5d752b575 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -18,7 +18,10 @@ WIDGETS.bluetooth = { disconnect: function() { if(WIDGETS.bluetooth.warningEnabled == 1){ Bangle.buzz(700, 1); // buzz on connection loss - E.showMessage("Connection\nlost.","Bluetooth"); + + E.showMessage(/*LANG*/"Connection\nlost.","Bluetooth"); + setInterval(()=>{load();}, 3000); // clear message + WIDGETS.bluetooth.warningEnabled = 0; setTimeout('WIDGETS.bluetooth.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. } From be3d00e9746528d82564d9d4f3be78d4e216d01b Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 29 Mar 2022 07:25:56 +0200 Subject: [PATCH 139/188] Update widget.js --- apps/widbt/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 5d752b575..6fa7f3b7a 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -19,7 +19,7 @@ WIDGETS.bluetooth = { if(WIDGETS.bluetooth.warningEnabled == 1){ Bangle.buzz(700, 1); // buzz on connection loss - E.showMessage(/*LANG*/"Connection\nlost.","Bluetooth"); + E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); setInterval(()=>{load();}, 3000); // clear message WIDGETS.bluetooth.warningEnabled = 0; From 5ff8ab62a2c7344eb5abaf6b0f4b92f68915b9c0 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 29 Mar 2022 07:44:41 +0200 Subject: [PATCH 140/188] Update settings.js --- apps/messages/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 1e9605360..589d603da 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -4,7 +4,7 @@ if (settings.vibrate===undefined) settings.vibrate="."; if (settings.repeat===undefined) settings.repeat=4; if (settings.unreadTimeout===undefined) settings.unreadTimeout=60; - if( settings.unlockWatch===undefined) settings.unlockWatch = false; + settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; return settings; From 30c946ceaa6d767874c74c5b5321c9790dd51b4c Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 29 Mar 2022 07:54:18 +0200 Subject: [PATCH 141/188] Update lib.js --- apps/messages/lib.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index fa607b268..d7c95570b 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -63,6 +63,7 @@ exports.pushMessage = function(event) { WIDGETS.messages.buzz(); if(unlockWatch != false){ Bangle.setLocked(false); + Bangle.setLCDPower(1); // turn screen on } } // after a delay load the app, to ensure we have all the messages From 599f20aca93934e7b84e06d957ca42000033cd28 Mon Sep 17 00:00:00 2001 From: Brendan Hubble Date: Tue, 29 Mar 2022 18:59:05 +1100 Subject: [PATCH 142/188] touchtimer: FIX countdown buzz to be in last 5 seconds - The countdown buzz was happening on each minute and not only on the last 5 seconds --- apps/touchtimer/ChangeLog | 1 + apps/touchtimer/app.js | 7 ++++++- apps/touchtimer/metadata.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog index 0969a3da4..f81907152 100644 --- a/apps/touchtimer/ChangeLog +++ b/apps/touchtimer/ChangeLog @@ -2,3 +2,4 @@ 0.02: Add settings menu 0.03: Add ability to repeat last timer 0.04: Add 5 second count down buzzer +0.05: Fix 5 second count down buzzer to be only in the final 5 seconds diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index c2f2fb5e9..18c07feef 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -129,7 +129,12 @@ var main = () => { // Buzz lightly when there are less then 5 seconds left if (settings.countDownBuzz) { var remainingSeconds = timerCountDown.getAdjustedTime().seconds; - if (remainingSeconds <= 5 && remainingSeconds > 0) { + var remainingMinutes = timerCountDown.getAdjustedTime().minutes; + var remainingHours = timerCountDown.getAdjustedTime().hours; + if ( remainingSeconds <= 5 + && remainingSeconds > 0 + && remainingMinutes <= 0 + && remainingHours <= 0) { Bangle.buzz(); } } diff --git a/apps/touchtimer/metadata.json b/apps/touchtimer/metadata.json index 0f2b9f491..9261f3619 100644 --- a/apps/touchtimer/metadata.json +++ b/apps/touchtimer/metadata.json @@ -2,7 +2,7 @@ "id": "touchtimer", "name": "Touch Timer", "shortName": "Touch Timer", - "version": "0.04", + "version": "0.05", "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", From 011388e442ec0f7093724062c540ec106160dfdb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 29 Mar 2022 09:17:28 +0100 Subject: [PATCH 143/188] icon tweak --- apps/mtgwatchface/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mtgwatchface/app-icon.js b/apps/mtgwatchface/app-icon.js index ebeeb7840..61ba9e656 100644 --- a/apps/mtgwatchface/app-icon.js +++ b/apps/mtgwatchface/app-icon.js @@ -1 +1 @@ -var img = E.toArrayBuffer(atob("MDCDAf/////////////////////////////////+AAAP/////////////////wAAAAAAAB+v////x//////+AAAAAAAAAAAv///////////wAAAAAAAAAAAhxxxxx/////+OAAAAAAAAAAAP//////////wAAAAAAAAAABxx/////////wAOAAAAAAAAAAAAB////////wABwAAAAAAAAAAAAB//////wAAAOAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAAAB/////+AAAAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP///wAAAOOAAAAAAAAAP+AAAP///wABx///wAAAAAB////wAB//+AAB////+AAAAAP////wAP///wAB/////wAAAB/////wAB//+AAP/////wAAAB/////+AB///wAP/////wAAAB/////wAB//+AAP/////wAAAB/////+AB///wABxx//wAAAABx///xwAB///wAAAAAAAAAAAAAAAAAAAP////wAAAAAAAABwAAAAAAAB/////+AAAAAAAOBwAAAAAAAP///////wAAAABwBwAAAAABx////wAAAAAAAAAOB+AAAAAAAAAP/x///////wBwBwAB///////x/////////wB+P+AP///////x/x/x//x//wBxxwAB/x/xx//x///+Px+P/wAAAAAP/wOPwP/x/x/wPx/x/wAAAAAB/x//x//x///+OB+P/wAAAAAP/+P+B//x/x/wPwAB/wAAAAAB/x/+B//x///+P/wP/wAAOAAP/+P+P//x/x/wP/x//xwAAAAB/x/xxx/x///+P+P//xwAOAOP/+OOAP/x/x///x///xwAP/+B///////x////+P///x+B//+P///////x/xxxxxxxxx/////xxxxxxxxx//////////////////////////xx///xx/x/x///////x/////wP+P+B+P/wPx+P+OP+OP////xwAPxwB//x/xxx+B//xx////+OOPwP///+OBwAOOP+Px/////x///////x////x///x///////////////////////////w==")) +E.toArrayBuffer(atob("MDCDAf/////////////////////////////////+AAAP/////////////////wAAAAAAAB+v////x//////+AAAAAAAAAAAv///////////wAAAAAAAAAAAhxxxxx/////+OAAAAAAAAAAAP//////////wAAAAAAAAAABxx/////////wAOAAAAAAAAAAAAB////////wABwAAAAAAAAAAAAB//////wAAAOAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAAAB/////+AAAAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP///wAAAOOAAAAAAAAAP+AAAP///wABx///wAAAAAB////wAB//+AAB////+AAAAAP////wAP///wAB/////wAAAB/////wAB//+AAP/////wAAAB/////+AB///wAP/////wAAAB/////wAB//+AAP/////wAAAB/////+AB///wABxx//wAAAABx///xwAB///wAAAAAAAAAAAAAAAAAAAP////wAAAAAAAABwAAAAAAAB/////+AAAAAAAOBwAAAAAAAP///////wAAAABwBwAAAAABx////wAAAAAAAAAOB+AAAAAAAAAP/x///////wBwBwAB///////x/////////wB+P+AP///////x/x/x//x//wBxxwAB/x/xx//x///+Px+P/wAAAAAP/wOPwP/x/x/wPx/x/wAAAAAB/x//x//x///+OB+P/wAAAAAP/+P+B//x/x/wPwAB/wAAAAAB/x/+B//x///+P/wP/wAAOAAP/+P+P//x/x/wP/x//xwAAAAB/x/xxx/x///+P+P//xwAOAOP/+OOAP/x/x///x///xwAP/+B///////x////+P///x+B//+P///////x/xxxxxxxxx/////xxxxxxxxx//////////////////////////xx///xx/x/x///////x/////wP+P+B+P/wPx+P+OP+OP////xwAPxwB//x/xxx+B//xx////+OOPwP///+OBwAOOP+Px/////x///////x////x///x///////////////////////////w==")) From 6389b27d41577544a09719c96aad2f9d0138874d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 10:51:29 +0100 Subject: [PATCH 144/188] Update pebble.app.js First stab at adding theme selection --- apps/pebble/pebble.app.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 106e09b82..d4e9110b7 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebble.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'theme':'System'}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); @@ -107,6 +107,17 @@ function getSteps() { return '????'; } +function set_colors() { + if (settings.theme == 'Light') { + pass + } else if (settings.theme == 'Dark') { + pass + } else { + let color_bg = g.theme.bg + let color_fg = g.theme.fg + } +} + g.clear(); Bangle.loadWidgets(); /* @@ -116,6 +127,7 @@ Bangle.loadWidgets(); */ for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} loadSettings(); +set_colors(); setInterval(draw, 15000); // refresh every 15s draw(); Bangle.setUI("clock"); From dcd39418a58495809f02f644e8595c7a74207486 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 29 Mar 2022 10:58:48 +0100 Subject: [PATCH 145/188] quick removal of GPS clear from #1619 --- modules/exstats.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/exstats.js b/modules/exstats.js index b22f3f5d3..056dc9f0f 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -299,8 +299,6 @@ exports.getStats = function(statIDs, options) { state.curSpeed = 0; state.BPM = 0; state.BPMage = 0; - state.thisGPS = {}; - state.lastGPS = {}; state.notify = options.notify; if (options.notify.dist.increment > 0) { state.notify.dist.next = state.distance + options.notify.dist.increment; From aba96398f17366634a5a84332b0e4dc462dbd486 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 11:06:29 +0100 Subject: [PATCH 146/188] Update metadata.json Switched on allow emulator --- apps/pebble/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/pebble/metadata.json b/apps/pebble/metadata.json index 4295d7507..68f7d1465 100644 --- a/apps/pebble/metadata.json +++ b/apps/pebble/metadata.json @@ -11,6 +11,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, "storage": [ {"name":"pebble.app.js","url":"pebble.app.js"}, {"name":"pebble.settings.js","url":"pebble.settings.js"}, From 24689a7684dca116e1b8ffee8ed719726b9ca520 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:39:55 +0100 Subject: [PATCH 147/188] Update pebble.settings.js --- apps/pebble/pebble.settings.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index ff408907d..95eecc7e3 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "pebble.json"; // initialize with default settings... - let s = {'bg': '#0f0', 'color': 'Green'} + let s = {'bg': '#0f0', 'color': 'Green', 'theme':'System'} // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -20,6 +20,7 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; + var theme_options = ['System', 'Light', 'Dark']; E.showMenu({ '': { 'title': 'Pebble Clock' }, @@ -33,6 +34,14 @@ s.bg = bg_code[v]; save(); }, + 'Theme': { + value: 0 | theme_options.indexOf(s.theme), + min: 0, max: theme_options.length - 1, + format: v => theme_options[v], + onchange: v => { + s.theme = theme_options[v]; + save(); + }, } }); }) From 358e8d18c804bb27e1d8307aba7b3a58692101fd Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:45:08 +0100 Subject: [PATCH 148/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index d4e9110b7..159bc2bf8 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -30,6 +30,8 @@ function draw() { let da = date.toString().split(" "); let timeStr = da[4].substr(0,5); const t = 6; + print('Theme'); + print(theme); // turn the warning on once we have dipped below 30% if (E.getBattery() < 30) @@ -44,7 +46,7 @@ function draw() { g.fillRect(0, 0, w, h2 - t); // contrast bar - g.setColor(g.theme.fg); + g.setColor(theme.fg); g.fillRect(0, h2 - t, w, h2); // day and steps @@ -65,11 +67,11 @@ function draw() { g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); - g.setColor(!batteryWarning ? g.theme.fg : '#fff'); + g.setColor(!batteryWarning ? theme.fg : '#fff'); g.drawString(timeStr, w/2, h2 + 8); // contrast bar - g.setColor(g.theme.fg); + g.setColor(theme.fg); g.fillRect(0, h3, w, h3 + t); // the bottom @@ -83,11 +85,11 @@ function draw() { // at x,y width:wi thicknes:th function drawCalendar(x,y,wi,th,str) { - g.setColor(g.theme.fg); + g.setColor(theme.fg); g.fillRect(x, y, x + wi, y + wi); - g.setColor(g.theme.bg); + g.setColor(theme.bg); g.fillRect(x + th, y + th, x + wi - th, y + wi - th); - g.setColor(g.theme.fg); + g.setColor(theme.fg); let hook_t = 6; // first calendar hook, one third in @@ -107,15 +109,13 @@ function getSteps() { return '????'; } -function set_colors() { - if (settings.theme == 'Light') { - pass - } else if (settings.theme == 'Dark') { - pass - } else { - let color_bg = g.theme.bg - let color_fg = g.theme.fg - } +function loadThemeColors(style) { + if (style === "Dark") + theme = {fg: g.toColor(1,1,1), bg: g.toColor(0,0,0)}; + else if (style === "Light") + theme = {fg: g.toColor(0,0,0), bg: g.toColor(1,1,1)}; + else + theme = {fg: g.theme.fg, bg: g.theme.bg}; } g.clear(); @@ -127,7 +127,7 @@ Bangle.loadWidgets(); */ for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} loadSettings(); -set_colors(); +loadThemeColors(settings.theme); setInterval(draw, 15000); // refresh every 15s draw(); Bangle.setUI("clock"); From 4658fb9743aa138d1cd6f7145f0ae2de25e05bbc Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:46:07 +0100 Subject: [PATCH 149/188] Update README.md --- apps/pebble/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebble/README.md b/apps/pebble/README.md index 4b0233781..15d2bd58c 100644 --- a/apps/pebble/README.md +++ b/apps/pebble/README.md @@ -4,7 +4,7 @@ * Designed specifically for Bangle 2 * A choice of 6 different background colous through its setting menu. Goto Settings, App/Widget settings, Pebble. -* Supports the Light and Dark themes +* Supports the Light and Dark themes (or set theme independently) * Uses pedometer widget to get latest step count * Dependant apps are installed when Pebble installs * Uses the whole screen, widgets are made invisible but still run in the background From f867c68340df0d3d2cc51ba58251c9684e2a5c1a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:55:42 +0100 Subject: [PATCH 150/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 159bc2bf8..36bdf8c31 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -62,7 +62,7 @@ function draw() { // time // white on red for battery warning - g.setColor(!batteryWarning ? g.theme.bg : '#f00'); + g.setColor(!batteryWarning ? theme.bg : '#f00'); g.fillRect(0, h2, w, h3); g.setFontLECO1976Regular42(); From 2330f1f4642ec4912c35352c41db19d64743d3a8 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:00:21 +0100 Subject: [PATCH 151/188] Update ChangeLog --- apps/pebble/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index 0cba5a2b2..c2705b790 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -5,3 +5,4 @@ 0.05: Fix typo in settings - Purple 0.06: Added dependancy on Pedometer Widget 0.07: Fixed icon and ong file to 48x48 +0.08: Added theme options From 3d9a49a5fba15fa1275d9b6d8d9f927444ea2bad Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:00:36 +0100 Subject: [PATCH 152/188] Update metadata.json --- apps/pebble/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebble/metadata.json b/apps/pebble/metadata.json index 68f7d1465..eb049e78e 100644 --- a/apps/pebble/metadata.json +++ b/apps/pebble/metadata.json @@ -2,7 +2,7 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.07", + "version": "0.08", "description": "A pebble style clock to keep the rebellion going", "dependencies": {"widpedom":"app"}, "readme": "README.md", From e3db453b44691cd7e84643a7eb612beb92fd06f3 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:00:55 +0100 Subject: [PATCH 153/188] Update pebble.settings.js --- apps/pebble/pebble.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index 95eecc7e3..4e235791b 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -41,7 +41,7 @@ onchange: v => { s.theme = theme_options[v]; save(); - }, + } } }); }) From 62b3336e6aac21cbd75b978204f63a844936bb10 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:10:48 +0100 Subject: [PATCH 154/188] Update pebble.settings.js --- apps/pebble/pebble.settings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index 4e235791b..58715750d 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -33,7 +33,8 @@ s.color = color_options[v]; s.bg = bg_code[v]; save(); - }, + } + }, 'Theme': { value: 0 | theme_options.indexOf(s.theme), min: 0, max: theme_options.length - 1, From d8b49af3c844d3dcedee49dd52cf1e839db1850f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:28:32 +0100 Subject: [PATCH 155/188] Update pebble.app.js Removed print statements from debugging --- apps/pebble/pebble.app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 36bdf8c31..bbe2596ab 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -30,8 +30,6 @@ function draw() { let da = date.toString().split(" "); let timeStr = da[4].substr(0,5); const t = 6; - print('Theme'); - print(theme); // turn the warning on once we have dipped below 30% if (E.getBattery() < 30) From 8df137b21ddfa41cebd26f628b4b6413c34c593b Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Tue, 29 Mar 2022 14:32:33 +0200 Subject: [PATCH 156/188] widget 'widbt_notify' New Widget 'widbt_notify' is a bluetooth widget, that vibrates, when the connection gets lost. --- apps/widbt_notify/ChangeLog | 10 ++++++++++ apps/widbt_notify/metadata.json | 13 +++++++++++++ apps/widbt_notify/widget.js | 33 ++++++++++++++++++++++++++++++++ apps/widbt_notify/widget.png | Bin 0 -> 1119 bytes 4 files changed, 56 insertions(+) create mode 100644 apps/widbt_notify/ChangeLog create mode 100644 apps/widbt_notify/metadata.json create mode 100644 apps/widbt_notify/widget.js create mode 100644 apps/widbt_notify/widget.png diff --git a/apps/widbt_notify/ChangeLog b/apps/widbt_notify/ChangeLog new file mode 100644 index 000000000..b5a50210e --- /dev/null +++ b/apps/widbt_notify/ChangeLog @@ -0,0 +1,10 @@ +0.02: Tweaks for variable size widget system +0.03: Ensure redrawing works with variable size widget system +0.04: Fix automatic update of Bluetooth connection status +0.05: Make Bluetooth widget thinner, and when on a bright theme use light grey for disabled color +0.06: Tweaking colors for dark/light themes and low bpp screens +0.07: Memory usage improvements +0.08: Disable LCD on, on bluetooth status change +0.09: Vibrate on connection loss +0.10: Bug fix +0.11: Avoid too many notifications. Change disconnected colour to red. diff --git a/apps/widbt_notify/metadata.json b/apps/widbt_notify/metadata.json new file mode 100644 index 000000000..0b795c2c8 --- /dev/null +++ b/apps/widbt_notify/metadata.json @@ -0,0 +1,13 @@ +{ + "id": "widbt_notify", + "name": "Bluetooth Widget with Notification", + "version": "0.11", + "description": "Show the current Bluetooth connection status in the top right of the clock and vibrate when disconnected.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbt_notify.wid.js","url":"widget.js"} + ] +} diff --git a/apps/widbt_notify/widget.js b/apps/widbt_notify/widget.js new file mode 100644 index 000000000..04f91a698 --- /dev/null +++ b/apps/widbt_notify/widget.js @@ -0,0 +1,33 @@ +WIDGETS.bluetooth_notify = { + area: "tr", + width: 15, + warningEnabled: 1, + draw: function() { + g.reset(); + if (NRF.getSecurityStatus().connected) { + g.setColor((g.getBPP() > 8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); + } else { + // g.setColor(g.theme.dark ? "#666" : "#999"); + g.setColor("#f00"); // red is easier to distinguish from blue + } + g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), 2 + this.x, 2 + this.y); + }, + connect: function() { + WIDGETS.bluetooth_notify.draw(); + }, + disconnect: function() { + if(WIDGETS.bluetooth_notify.warningEnabled == 1){ + Bangle.buzz(700, 1); // buzz on connection loss + + E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); + setInterval(()=>{load();}, 3000); // clear message + + WIDGETS.bluetooth_notify.warningEnabled = 0; + setTimeout('WIDGETS.bluetooth_notify.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. + } + WIDGETS.bluetooth_notify.draw(); + } +}; + +NRF.on('connect', WIDGETS.bluetooth_notify.connect); +NRF.on('disconnect', WIDGETS.bluetooth_notify.disconnect); diff --git a/apps/widbt_notify/widget.png b/apps/widbt_notify/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..1a884a62c1029ae43243f8f58ef9dc3a3327e437 GIT binary patch literal 1119 zcmV-l1fctgP)cE5(396`@Dz$wLqIPzYppJ*B(brZX|I zHChYW;Hm1lL~9feUi^283bm!!Ka0DG`v(zZvk8h?W%2@c?XT zES*ZPJU3a{7h{cB0RRrPTh=dGr*a^!0&xQX?DMczGEQwQ4)Y`c0EQJR_Oa?r)W%5x z0HhI_x1HK2pc0j7k^sKW*iQXQ=2YX6D9n-q_%qO+(!1;R%(3!ggBm9SkZ!j|fYm^E zR%O?(qZ5_=gLo$b@WZ#`wXJ`4=)@t~Y>Yv)Y!7y;OB zeO8rs?l*_RK!7NCKLhRU0}||esEhzCyx)O;I=Y5XtC(@B$NTljy45^tT?SHJ10ruX zOS$(<@@!=?P@`0+S)vnkL!=bB)DOg{Q*}L+GO)XAK;&$g@DSo22n#XlR9!)?07D(! zDxz;SOSunBbNCAVm!5U2c~9jVx@WU3=u3)pJ!ur3cu;sm-)NQ!pM}i;0{{TnZpA^Z ztASvff%b#?JdoF$<=hv8)Q159pyx{LBoBD4SyIzhb(HlW;>}!J+1=AqCDO_A6&XN}=e)0!pcibn z_HtD9d_@BAknp}zDCb9=>MK#y^fmCZ_8GoYkv>KTT7e$nHy?0mXP*UpX*>1PgVgRc z3#Fdn#d~2}5mATky^{qxZ#%U!Ve5AonQN!;&C-!_@cJGbKmk6^xYakqWbkDSU>e?6 zF9=onXw<2mHO=A62q0{DUp*iYB(+@Ja7a-n2aQU$C-1do)^M)j_l7Z`m-DHf;N2WNgeIsEr6@kFmJ z8_YbwGn3bL?QPY+LOBr_TDRcEMmfJ|;s=HR0IQ!ry9xAti1(G5Y&@#1^&${_&Hfi+ z9c`2jUpMuHhg{we{KebpwXs3NLqaRiAr)b6sg!$n>kZxDN)lj0k<-mm?qZatNdeqJ z)Lky+8&Ml40dUjvB)_tlzY&Ld+&A&{bh~wEWib~^c!+ZagoS&X-t=l^d_A@r#J2*U lKABp3ezkHW*6{xc{R@3@kib`1LqGrk002ovPDHLkV1l684mkh- literal 0 HcmV?d00001 From e60586f13824bbf0c2f9cfba5ed41931581f4ed5 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:58:05 +0100 Subject: [PATCH 157/188] Update pebble.app.js Move day and steps color into loadThemeColors function. Added test lock icon --- apps/pebble/pebble.app.js | 46 +++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index bbe2596ab..b6aab30d7 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebble.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'theme':'System'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':'false'}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); @@ -48,11 +48,11 @@ function draw() { g.fillRect(0, h2 - t, w, h2); // day and steps - if (settings.color == 'Blue' || settings.color == 'Red') - g.setColor('#fff'); // white on blue or red best contrast - else - g.setColor('#000'); // otherwise black regardless of theme - + //if (settings.color == 'Blue' || settings.color == 'Red') + // g.setColor('#fff'); // white on blue or red best contrast + //else + // g.setColor('#000'); // otherwise black regardless of theme + g.setColor(theme.day); g.setFontLECO1976Regular22(); g.setFontAlign(0, -1); g.drawString(da[0].toUpperCase(), w/4, ha); // day of week @@ -107,15 +107,33 @@ function getSteps() { return '????'; } -function loadThemeColors(style) { - if (style === "Dark") - theme = {fg: g.toColor(1,1,1), bg: g.toColor(0,0,0)}; - else if (style === "Light") - theme = {fg: g.toColor(0,0,0), bg: g.toColor(1,1,1)}; - else - theme = {fg: g.theme.fg, bg: g.theme.bg}; +function loadThemeColors() { + theme = {fg: g.theme.fg, bg: g.theme.bg, day: g.toColor(0,0,0)}; + if (settings.theme === "Dark") { + theme.fg = g.toColor(1,1,1); + theme.bg = g.toColor(0,0,0); + } + else if (settings.theme === "Light") { + theme.fg = g.toColor(0,0,0); + theme.bg = g.toColor(1,1,1); + } + // day and steps + if (settings.color == 'Blue' || settings.color == 'Red') + theme.day = g.toColor(1,1,1); // white on blue or red best contrast } +function drawLock(){ + if(Bangle.isLocked()){ + g.drawImage(atob("DhABH+D/wwMMDDAwwMf/v//4f+H/h/8//P/z///f/g=="), 1, 4); + } else { + g.clearRect(0, 0, 20, 20); + } +} + +Bangle.on('lock', function(isLocked) { + drawLock(); +}); + g.clear(); Bangle.loadWidgets(); /* @@ -125,7 +143,7 @@ Bangle.loadWidgets(); */ for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} loadSettings(); -loadThemeColors(settings.theme); +loadThemeColors(); setInterval(draw, 15000); // refresh every 15s draw(); Bangle.setUI("clock"); From 7c697cf74939b4988879e78b9d14838a44994286 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 14:06:58 +0100 Subject: [PATCH 158/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index b6aab30d7..b6576671c 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -79,6 +79,8 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, 1, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 14, 42, 4, da[2]); + + drawLock(); } // at x,y width:wi thicknes:th @@ -124,9 +126,11 @@ function loadThemeColors() { function drawLock(){ if(Bangle.isLocked()){ + g.setColor(theme.day); g.drawImage(atob("DhABH+D/wwMMDDAwwMf/v//4f+H/h/8//P/z///f/g=="), 1, 4); } else { - g.clearRect(0, 0, 20, 20); + g.setColor(settings.bg); + g.drawRect(0, 0, 20, 20); } } From 181db378678b2d51c216df462440b4f0f076bf3d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 14:17:13 +0100 Subject: [PATCH 159/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index b6576671c..e583f1706 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -130,11 +130,11 @@ function drawLock(){ g.drawImage(atob("DhABH+D/wwMMDDAwwMf/v//4f+H/h/8//P/z///f/g=="), 1, 4); } else { g.setColor(settings.bg); - g.drawRect(0, 0, 20, 20); + g.fillRect(0, 0, 20, 20); } } -Bangle.on('lock', function(isLocked) { +Bangle.on('lock', function(on) { drawLock(); }); From c8e90b1f926d432ce17bc07d8d8115d1e2c47363 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:21:21 +0100 Subject: [PATCH 160/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index e583f1706..28e32354a 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -125,12 +125,15 @@ function loadThemeColors() { } function drawLock(){ - if(Bangle.isLocked()){ - g.setColor(theme.day); - g.drawImage(atob("DhABH+D/wwMMDDAwwMf/v//4f+H/h/8//P/z///f/g=="), 1, 4); - } else { - g.setColor(settings.bg); - g.fillRect(0, 0, 20, 20); + if (settings.showlock == 'true') { + if (Bangle.isLocked()){ + g.setColor(theme.day); + g.setBgColor(settings.bg); + g.drawImage(atob("DhABH+D/wwMMDDAwwMf/v//4f+H/h/8//P/z///f/g=="), 1, 4); + } else { + g.setColor(settings.bg); + g.fillRect(0, 0, 20, 20); + } } } From abdd91b6f1bc84a3fdeb9d77f988aeaf2e5c9814 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:24:13 +0100 Subject: [PATCH 161/188] Update pebble.settings.js --- apps/pebble/pebble.settings.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index 58715750d..3fbf72118 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "pebble.json"; // initialize with default settings... - let s = {'bg': '#0f0', 'color': 'Green', 'theme':'System'} + let s = {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':'false'} // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -21,6 +21,7 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var theme_options = ['System', 'Light', 'Dark']; + var lock_options = ['false', 'true']; E.showMenu({ '': { 'title': 'Pebble Clock' }, @@ -43,6 +44,15 @@ s.theme = theme_options[v]; save(); } + }, + 'Show Lock': { + value: 0 | lock_options.indexOf(s.showlock), + min: 0, max: lock_options.length - 1, + format: v => lock_options[v], + onchange: v => { + s.showlock = lock_options[v]; + save(); + } } }); }) From 4d6773c022c08cbbb337ef4e6eac03a859270ddc Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:27:34 +0100 Subject: [PATCH 162/188] Update pebble.settings.js --- apps/pebble/pebble.settings.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index 3fbf72118..8a5fba63b 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "pebble.json"; // initialize with default settings... - let s = {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':'false'} + let s = {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':false} // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -21,7 +21,6 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var theme_options = ['System', 'Light', 'Dark']; - var lock_options = ['false', 'true']; E.showMenu({ '': { 'title': 'Pebble Clock' }, @@ -46,13 +45,12 @@ } }, 'Show Lock': { - value: 0 | lock_options.indexOf(s.showlock), - min: 0, max: lock_options.length - 1, - format: v => lock_options[v], - onchange: v => { - s.showlock = lock_options[v]; + value: settings.showlock, + format: () => (settings.showlock ? 'Yes' : 'No'), + onchange: () => { + settings.showlock = !settings.showlock; save(); } - } + }, }); }) From 01a868155ebc5dd59eec5b52e70d5875b21b43b6 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:28:42 +0100 Subject: [PATCH 163/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 28e32354a..80243c890 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebble.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':'false'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':false}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); @@ -125,7 +125,7 @@ function loadThemeColors() { } function drawLock(){ - if (settings.showlock == 'true') { + if (settings.showlock) { if (Bangle.isLocked()){ g.setColor(theme.day); g.setBgColor(settings.bg); From b7ba1314b293af0ae61a60c536a4bf1bc73f8bbc Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:30:22 +0100 Subject: [PATCH 164/188] Update README.md --- apps/pebble/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/pebble/README.md b/apps/pebble/README.md index 15d2bd58c..953db0ba7 100644 --- a/apps/pebble/README.md +++ b/apps/pebble/README.md @@ -9,6 +9,7 @@ * Dependant apps are installed when Pebble installs * Uses the whole screen, widgets are made invisible but still run in the background * When battery is less than 30% main screen goes Red +* Optionally show a lock symbol when screen is locked (default off, enable in Settings) ![](pebble_screenshot.png) ![](pebble_screenshot2.png) From 6ff39e55843ff96cbafdc1837e90a937e0d8524a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:30:45 +0100 Subject: [PATCH 165/188] Update ChangeLog --- apps/pebble/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index c2705b790..01f653f48 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -5,4 +5,4 @@ 0.05: Fix typo in settings - Purple 0.06: Added dependancy on Pedometer Widget 0.07: Fixed icon and ong file to 48x48 -0.08: Added theme options +0.08: Added theme options and optional lock symbol From e0d457fd56fe6e485043c11663487b1d705f1759 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 29 Mar 2022 23:34:01 +0200 Subject: [PATCH 166/188] Changed basic mover algorithme in favor of speed --- apps/game1024/app.js | 95 +++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 54 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 133630634..b0e8d74f7 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -164,16 +164,16 @@ const buttons = { const mover = { direction: { up: {name: 'up', step: 1, innerBegin: 0, innerEnd: rows-1, outerBegin: 0, outerEnd: cols-1, iter: rows -1, - sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m < rows -1 ? (m+1)*(cols) + n : -1;} + sqIndex: function (i,o) {return i*(cols) + o;}, sqNextIndex: function (i,o) {return i < rows -1 ? (i+1)*(cols) + o : -1;} }, down: {name: 'down', step:-1, innerBegin: rows-1, innerEnd: 0, outerBegin: cols-1, outerEnd: 0, iter: rows -1, - sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m > 0 ? (m-1)*(cols) + n : -1;} + sqIndex: function (i,o) {return i*(cols) + o;}, sqNextIndex: function (i,o) {return i > 0 ? (i-1)*(cols) + o : -1;} }, left: {name: 'left', step: 1, innerBegin: 0, innerEnd: cols-1, outerBegin: 0, outerEnd: rows-1, iter: cols -1, - sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m < cols -1 ? n*(rows) + m +1 : -1;} + sqIndex: function (i,o) {return o*(rows) + i;}, sqNextIndex: function (i,o) {return i < cols -1 ? o*(rows) + i +1 : -1;} }, right: {name: 'right', step:-1, innerBegin: cols-1, innerEnd: 0, outerBegin: rows-1, outerEnd: 0, iter: cols -1, - sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m > 0 ? n*(rows) + m -1: -1;} + sqIndex: function (i,o) {return o*(rows) + i;}, sqNextIndex: function (i,o) {return i > 0 ? o*(rows) + i -1: -1;} } }, anyLeft: function() { @@ -207,49 +207,39 @@ const mover = { }); return canContinue; }, - nonEmptyCells: function (dir) { - debug(() => console.log("Move: ", dir.name)); + moveAndMerge: function (dir) { const step = dir.step; // outer loop for all colums/rows - for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { - // let rowStr = '| '; - - // Move a number of iteration with the squares to move them all to one side - for (let iter = 0; iter < dir.iter; iter++) { - - // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up - for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { - // get the array of squares index for current cell - const idx = dir.sqIndex(m,n); - const nextIdx = dir.sqNextIndex(m,n); - - if (allSquares[idx].expVal == 0 && nextIdx >= 0) { - allSquares[idx].setExpVal(allSquares[nextIdx].expVal); - allSquares[nextIdx].setExpVal(0); - } - } - } - } - }, - // add up the conjacent squares with identical values en set next square to empty in the process - mergeEqlCells: function(dir) { - const step = dir.step; - // outer loop for all colums/rows - for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { - // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let o = dir.outerBegin; step*o <= step*dir.outerEnd; o=o+step) { + + let allVals = allSquares.map(sq=>{return sq.getExpVal()}); + let allLineVals = []; for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { - const idx = dir.sqIndex(m,n); - const nextIdx = dir.sqNextIndex(m,n); - - if ((allSquares[idx].expVal > 0) && nextIdx >= 0) { - if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { - let expVal = allSquares[idx].expVal; - allSquares[idx].setExpVal(++expVal); - allSquares[idx].addToScore(); - allSquares[nextIdx].setExpVal(0); - } - } + allLineVals.push(allVals[dir.sqIndex(m,o)]); } + + let sortedLineVals = allLineVals.filter((val)=>{return val>0;}); + let zeroLineVals = allLineVals.filter((val)=>{return val==0;}); + // merge the equally valued adjacent cells + let r=0; + while (r{return val>0;}); + sortedLineVals.filter((val)=>{return val==0;}).forEach((zero)=>{mergedLineVals.push(zero);}); + zeroLineVals.forEach((zero)=>{mergedLineVals.push(zero);}); + + let i = 0; + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + let idx = dir.sqIndex(m,o); + allSquares[idx].setExpVal(mergedLineVals[i++]); + } + debug(()=>console.log("new allSquares values:", allSquares.map(sq=>{return sq.expVal}))); } } }; @@ -301,7 +291,7 @@ class Button { } class Cell { - constructor(x0, y0, width, idx, cb) { + constructor(x0, y0, width, idx) { this.x0 = x0; this.y0 = y0; this.x1 = x0 + width; @@ -309,7 +299,7 @@ class Cell { this.expVal = 0; this.previousExpVals=[]; this.idx = idx; - this.cb = cb; + // this.cb = cb; this.isRndm = false; this.ax = x0; this.ay = Math.floor(0.2*width+y0); @@ -345,6 +335,9 @@ class Cell { .drawString(char, strX, strY); } } + getExpVal() { + return this.expVal; + } setExpVal(val) { this.expVal = val; } @@ -364,10 +357,6 @@ class Cell { removeUndo() { this.previousExpVals=[0]; } - addToScore() {if (typeof this.cb === 'function') { - this.cb(this.expVal); - } - } setRndmFalse() { this.isRndm = false; } @@ -416,7 +405,7 @@ function createGrid () { for (let c = 0; c < cols; c++) { let x0 = borderWidth + c*(borderWidth + sqWidth) - (rows/2)*(2*borderWidth + sqWidth) + middle.x + Math.floor(sqWidth/3); let y0 = borderWidth + r*(borderWidth + sqWidth) - (cols/2)*(2*borderWidth + sqWidth) + middle.y + Math.floor(sqWidth/3); - let cell = new Cell(x0, y0, sqWidth, c + r*cols, addToScore); + let cell = new Cell(x0, y0, sqWidth, c + r*cols); allSquares.push(cell); } } @@ -454,7 +443,7 @@ function addRandomNumber() { let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); allSquares[emptySquaresIdxs[randomIdx]].setRndmTrue(); - } + } } function drawGrid() { allSquares.forEach(sq => { @@ -651,9 +640,7 @@ dragger.attach(); function runGame(dir){ addToUndo(); updUndoLvlIndex(); - mover.nonEmptyCells(dir); - mover.mergeEqlCells(dir); - mover.nonEmptyCells(dir); + mover.moveAndMerge(dir); allSquares.forEach(sq => {sq.setRndmFalse();}); addRandomNumber(); drawGrid(); From d7bf20ebc7e71eff0e5afb868440c9421343535f Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 29 Mar 2022 23:38:19 +0200 Subject: [PATCH 167/188] v0.07 efficiency improvements --- apps/game1024/ChangeLog | 3 ++- apps/game1024/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog index 8759fb428..6ec8a15fc 100644 --- a/apps/game1024/ChangeLog +++ b/apps/game1024/ChangeLog @@ -3,4 +3,5 @@ 0.03: Basic colors 0.04: Bug fix score reset after Game Over, new icon 0.05: Chevron marker on the randomly added square -0.06: Fixed issue 1609 added a message popup state handler to control unwanted screen redraw \ No newline at end of file +0.06: Fixed issue 1609 added a message popup state handler to control unwanted screen redraw +0.07: Optimized the mover algorithm for efficiency (work in progress) \ No newline at end of file diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 73d7607f3..14e64347a 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.06", + "version": "0.07", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", From 9c86c483980ff76427675fec0050c437a5779b90 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 07:17:52 +0200 Subject: [PATCH 168/188] Update widget.js --- apps/widbt_notify/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt_notify/widget.js b/apps/widbt_notify/widget.js index 04f91a698..f1e4d372f 100644 --- a/apps/widbt_notify/widget.js +++ b/apps/widbt_notify/widget.js @@ -20,7 +20,7 @@ WIDGETS.bluetooth_notify = { Bangle.buzz(700, 1); // buzz on connection loss E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); - setInterval(()=>{load();}, 3000); // clear message + // setInterval(()=>{load();}, 3000); // clear message - this will reload the widget, resetting 'warningEnabled'. WIDGETS.bluetooth_notify.warningEnabled = 0; setTimeout('WIDGETS.bluetooth_notify.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. From a59579476b914f03cb397c0cedb5f51d25476cfc Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 07:19:58 +0200 Subject: [PATCH 169/188] Revert "Update widget.js" This reverts commit be3d00e9746528d82564d9d4f3be78d4e216d01b. --- apps/widbt/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 6fa7f3b7a..5d752b575 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -19,7 +19,7 @@ WIDGETS.bluetooth = { if(WIDGETS.bluetooth.warningEnabled == 1){ Bangle.buzz(700, 1); // buzz on connection loss - E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); + E.showMessage(/*LANG*/"Connection\nlost.","Bluetooth"); setInterval(()=>{load();}, 3000); // clear message WIDGETS.bluetooth.warningEnabled = 0; From 3986899c8b305b5dbff421d0cb43d65602e9d338 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 07:20:11 +0200 Subject: [PATCH 170/188] Revert "Update widget.js" This reverts commit deb18b0ef5cc8138f17a00a356daa38f64fb67db. --- apps/widbt/widget.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 5d752b575..58b4d4b4a 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -18,10 +18,7 @@ WIDGETS.bluetooth = { disconnect: function() { if(WIDGETS.bluetooth.warningEnabled == 1){ Bangle.buzz(700, 1); // buzz on connection loss - - E.showMessage(/*LANG*/"Connection\nlost.","Bluetooth"); - setInterval(()=>{load();}, 3000); // clear message - + E.showMessage("Connection\nlost.","Bluetooth"); WIDGETS.bluetooth.warningEnabled = 0; setTimeout('WIDGETS.bluetooth.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. } From 85a0c4100d954793ec5581840da16e07a64c5500 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 07:25:49 +0200 Subject: [PATCH 171/188] Restored widbt I restored the widbt code and made a separate widget widbt_notify. --- apps/widbt/ChangeLog | 3 --- apps/widbt/metadata.json | 2 +- apps/widbt/widget.js | 42 ++++++++++++---------------------------- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index b5a50210e..4c2132122 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -5,6 +5,3 @@ 0.06: Tweaking colors for dark/light themes and low bpp screens 0.07: Memory usage improvements 0.08: Disable LCD on, on bluetooth status change -0.09: Vibrate on connection loss -0.10: Bug fix -0.11: Avoid too many notifications. Change disconnected colour to red. diff --git a/apps/widbt/metadata.json b/apps/widbt/metadata.json index 6e705584e..e2d5082a5 100644 --- a/apps/widbt/metadata.json +++ b/apps/widbt/metadata.json @@ -1,7 +1,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.11", + "version": "0.08", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 58b4d4b4a..c7ef8c0ad 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -1,30 +1,12 @@ -WIDGETS.bluetooth = { - area: "tr", - width: 15, - warningEnabled: 1, - draw: function() { - g.reset(); - if (NRF.getSecurityStatus().connected) { - g.setColor((g.getBPP() > 8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); - } else { - // g.setColor(g.theme.dark ? "#666" : "#999"); - g.setColor("#f00"); // red is easier to distinguish from blue - } - g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), 2 + this.x, 2 + this.y); - }, - connect: function() { - WIDGETS.bluetooth.draw(); - }, - disconnect: function() { - if(WIDGETS.bluetooth.warningEnabled == 1){ - Bangle.buzz(700, 1); // buzz on connection loss - E.showMessage("Connection\nlost.","Bluetooth"); - WIDGETS.bluetooth.warningEnabled = 0; - setTimeout('WIDGETS.bluetooth.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. - } - WIDGETS.bluetooth.draw(); - } -}; - -NRF.on('connect', WIDGETS.bluetooth.connect); -NRF.on('disconnect', WIDGETS.bluetooth.disconnect); +WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { + g.reset(); + if (NRF.getSecurityStatus().connected) + g.setColor((g.getBPP()>8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); + else + g.setColor(g.theme.dark ? "#666" : "#999"); + g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); +},changed:function() { + WIDGETS["bluetooth"].draw(); +}}; +NRF.on('connect',WIDGETS["bluetooth"].changed); +NRF.on('disconnect',WIDGETS["bluetooth"].changed); From b5e66340045b3d6f6c32c3d912921917f69ef731 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 10:42:00 +0200 Subject: [PATCH 172/188] bugfix settings.json Read settings from the wron file. --- apps/messages/lib.js | 2 +- apps/widbt_notify/widget.js | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index d7c95570b..c517fde73 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -58,7 +58,7 @@ exports.pushMessage = function(event) { var loadMessages = Bangle.CLOCK || event.important; // first, buzz var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; - var unlockWatch = (require('Storage').readJSON('setting.json',1)||{}).unlockWatch; + var unlockWatch = (require('Storage').readJSON('messages.setting.json',1)||{}).unlockWatch; if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages){ WIDGETS.messages.buzz(); if(unlockWatch != false){ diff --git a/apps/widbt_notify/widget.js b/apps/widbt_notify/widget.js index f1e4d372f..d6bad5dc9 100644 --- a/apps/widbt_notify/widget.js +++ b/apps/widbt_notify/widget.js @@ -17,13 +17,16 @@ WIDGETS.bluetooth_notify = { }, disconnect: function() { if(WIDGETS.bluetooth_notify.warningEnabled == 1){ - Bangle.buzz(700, 1); // buzz on connection loss - E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); // setInterval(()=>{load();}, 3000); // clear message - this will reload the widget, resetting 'warningEnabled'. WIDGETS.bluetooth_notify.warningEnabled = 0; setTimeout('WIDGETS.bluetooth_notify.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. + + var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; + if(!quiet){ + Bangle.buzz(700, 1); // buzz on connection loss + } } WIDGETS.bluetooth_notify.draw(); } From 15a6d07e067a5d8378f795e5a81b6896bd0bd8b0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Mar 2022 11:10:15 +0100 Subject: [PATCH 173/188] 0.47: Add polyfill for setUI with an object as an argument (fix regression for 2v12 devices after Layout module changed) --- apps/boot/ChangeLog | 1 + apps/boot/bootupdate.js | 60 ++++++++++------------------------------- apps/boot/metadata.json | 2 +- 3 files changed, 16 insertions(+), 47 deletions(-) diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog index 87b5f7def..e3f492d3b 100644 --- a/apps/boot/ChangeLog +++ b/apps/boot/ChangeLog @@ -50,3 +50,4 @@ 0.44: Write .boot0 without ever having it all in RAM (fix Bangle.js 1 issues with BTHRM) 0.45: Fix 0.44 regression (auto-add semi-colon between each boot code chunk) 0.46: Fix no clock found error on Bangle.js 2 +0.47: Add polyfill for setUI with an object as an argument (fix regression for 2v12 devices after Layout module changed) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index c2ed5458d..46391d874 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -97,52 +97,20 @@ delete g.theme; // deleting stops us getting confused by our own decl. builtins if (!g.theme) { boot += `g.theme={fg:-1,bg:0,fg2:-1,bg2:7,fgH:-1,bgH:0x02F7,dark:true};\n`; } -delete Bangle.setUI; // deleting stops us getting confused by our own decl. builtins can't be deleted -if (!Bangle.setUI) { // assume this is just for F18 - Q3 should already have it - boot += `Bangle.setUI=function(mode, cb) { -if (Bangle.btnWatches) { - Bangle.btnWatches.forEach(clearWatch); - delete Bangle.btnWatches; -} -if (Bangle.swipeHandler) { - Bangle.removeListener("swipe", Bangle.swipeHandler); - delete Bangle.swipeHandler; -} -if (Bangle.touchHandler) { - Bangle.removeListener("touch", Bangle.touchHandler); - delete Bangle.touchHandler; -} -if (!mode) return; -else if (mode=="updown") { - Bangle.btnWatches = [ - setWatch(function() { cb(-1); }, BTN1, {repeat:1}), - setWatch(function() { cb(1); }, BTN3, {repeat:1}), - setWatch(function() { cb(); }, BTN2, {repeat:1}) - ]; -} else if (mode=="leftright") { - Bangle.btnWatches = [ - setWatch(function() { cb(-1); }, BTN1, {repeat:1}), - setWatch(function() { cb(1); }, BTN3, {repeat:1}), - setWatch(function() { cb(); }, BTN2, {repeat:1}) - ]; - Bangle.swipeHandler = d => {cb(d);}; - Bangle.on("swipe", Bangle.swipeHandler); - Bangle.touchHandler = d => {cb();}; - Bangle.on("touch", Bangle.touchHandler); -} else if (mode=="clock") { - Bangle.CLOCK=1; - Bangle.btnWatches = [ - setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) - ]; -} else if (mode=="clockupdown") { - Bangle.CLOCK=1; - Bangle.btnWatches = [ - setWatch(function() { cb(-1); }, BTN1, {repeat:1}), - setWatch(function() { cb(1); }, BTN3, {repeat:1}), - setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) - ]; -} else - throw new Error("Unknown UI mode"); +try { + Bangle.setUI({}); // In 2v12.xx we added the option for mode to be an object - for 2v12 and earlier, add a fix if it fails with an object supplied +} catch(e) { + boot += `Bangle._setUI = Bangle.setUI; +Bangle.setUI=function(mode, cb) { + if (Bangle.uiRemove) { + Bangle.uiRemove(); + delete Bangle.uiRemove; + } + if ("object"==typeof mode) { + // TODO: handle mode.back? + mode = mode.mode; + } + Bangle._setUI(mode, cb); };\n`; } delete E.showScroller; // deleting stops us getting confused by our own decl. builtins can't be deleted diff --git a/apps/boot/metadata.json b/apps/boot/metadata.json index 11884576f..d1bf2edde 100644 --- a/apps/boot/metadata.json +++ b/apps/boot/metadata.json @@ -1,7 +1,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.46", + "version": "0.47", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", From a09df566f259955024bd2e7e6441edad9afe3dd2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Mar 2022 14:36:52 +0100 Subject: [PATCH 174/188] ignore backup files of length 0, fix #1593 --- backup.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backup.js b/backup.js index 75e236049..8a894666e 100644 --- a/backup.js +++ b/backup.js @@ -79,7 +79,9 @@ function bangleUpload() { .then(() => file.async("string")) .then(data => { console.log("decoded", path); - if (path.startsWith(BACKUP_STORAGEFILE_DIR)) { + if (data.length==0) { // https://github.com/espruino/BangleApps/issues/1593 + console.log("Can't restore files of length 0, ignoring "+path); + } else if (path.startsWith(BACKUP_STORAGEFILE_DIR)) { path = path.substr(BACKUP_STORAGEFILE_DIR.length+1); cmds += AppInfo.getStorageFileUploadCommands(path, data)+"\n"; } else if (!path.includes("/")) { From 48efab699d1e4aed4313b033d2707b2e491e85e9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Mar 2022 15:11:14 +0100 Subject: [PATCH 175/188] Show distance more accurately in conjunction with new locale app (fix #1523) Also slightly more memory efficient locale module --- apps/gpsrec/ChangeLog | 3 ++- apps/gpsrec/app.js | 2 +- apps/gpsrec/metadata.json | 2 +- apps/locale/ChangeLog | 4 +++- apps/locale/locale.html | 26 +++++++++++++------------- apps/locale/metadata.json | 2 +- apps/recorder/ChangeLog | 3 ++- apps/recorder/app.js | 2 +- apps/recorder/metadata.json | 2 +- modules/exstats.js | 4 ++-- 10 files changed, 27 insertions(+), 23 deletions(-) diff --git a/apps/gpsrec/ChangeLog b/apps/gpsrec/ChangeLog index 365405846..f923739f0 100644 --- a/apps/gpsrec/ChangeLog +++ b/apps/gpsrec/ChangeLog @@ -28,4 +28,5 @@ 0.24: Better support for Bangle.js 2, avoid widget area for Graphs, smooth graphs more 0.25: Fix issue where if Bangle.js 2 got a GPS fix but no reported time, errors could be caused by the widget (fix #935) 0.26: Multiple bugfixes -0.27: Map drawing with light theme (fix #1023) +0.27: Map drawing with light theme (fix #1023) +0.28: Show distance more accurately in conjunction with new locale app (fix #1523) diff --git a/apps/gpsrec/app.js b/apps/gpsrec/app.js index 833a816ea..527eb780d 100644 --- a/apps/gpsrec/app.js +++ b/apps/gpsrec/app.js @@ -248,7 +248,7 @@ function plotTrack(info) { g.fillCircle(ox,oy,5); if (info.qOSTM) g.setColor(0, 0, 0); else g.setColor(g.theme.fg); - g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); + g.drawString(require("locale").distance(dist,2),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); g.drawString("Back",g.getWidth() - 10, g.getHeight()/2); diff --git a/apps/gpsrec/metadata.json b/apps/gpsrec/metadata.json index 088b8c741..8f4736066 100644 --- a/apps/gpsrec/metadata.json +++ b/apps/gpsrec/metadata.json @@ -1,7 +1,7 @@ { "id": "gpsrec", "name": "GPS Recorder", - "version": "0.27", + "version": "0.28", "description": "Application that allows you to record a GPS track. Can run in background", "icon": "app.png", "tags": "tool,outdoors,gps,widget", diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index 2dbb4febb..3354a57c1 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -15,4 +15,6 @@ 0.13: Now use shorter de_DE date format to more closely match other languages for size 0.14: Added some first translations for Messages in nl_NL 0.15: Fixed sv_SE formatting, long date does not work well for Bangle.js2 - Added Swedish localisation with English text \ No newline at end of file + Added Swedish localisation with English text +0.16: Remove global variables that used RAM + Add second 'dp' argument for decimal places in distance/speed/temp (fix #1523) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index b23225d5f..b58b4a297 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -158,10 +158,10 @@ exports = { name : "en_GB", currencySym:"£", "%HH": "('0'+getHours(d)).slice(-2)", "%MM": "('0'+d.getMinutes()).slice(-2)", "%SS": "('0'+d.getSeconds()).slice(-2)", - "%A": "day.split(',')[d.getDay()]", - "%a": "day.split(',')[d.getDay() + 7]", - "%B": "month.split(',')[d.getMonth()]", - "%b": "month.split(',')[d.getMonth() + 12]", + "%A": `${js(locale.day)}.split(',')[d.getDay()]`, + "%a": `${js(locale.abday)}.split(',')[d.getDay()]`, + "%B": `${js(locale.month)}.split(',')[d.getMonth()]`, + "%b": `${js(locale.abmonth)}.split(',')[d.getMonth() + 12]`, "%p": `d.getHours()<12?${js(locale.ampm[0].toUpperCase())}:${js(locale.ampm[1].toUpperCase())}`, "%P": `d.getHours()<12?${js(locale.ampm[0].toLowerCase())}:${js(locale.ampm[1].toLowerCase())}` }; @@ -182,10 +182,10 @@ exports = { name : "en_GB", currencySym:"£", var temperature = locale.temperature=='°F' ? '(t*9/5)+32' : 't'; var localeModule = ` -var day = ${js(locale.day + ',' + locale.abday)}; -var month = ${js(locale.month + ',' + locale.abmonth)}; -function round(n) { - return n < 10 ? Math.round(n * 10) / 10 : Math.round(n); +function round(n, dp) { + if (dp===undefined) dp=0; + var p = Math.min(dp,dp - Math.floor(Math.log(n)/Math.log(10))); + return n.toFixed(p); } var is12; function getHours(d) { @@ -197,8 +197,8 @@ function getHours(d) { exports = { name: ${js(locale.lang)}, currencySym: ${js(locale.currency_symbol)}, - dow: (d,short) => day.split(',')[d.getDay() + (short ? 7 : 0)], - month: (d,short) => month.split(',')[d.getMonth() + (short ? 12 : 0)], + dow: (d,short) => ${js(locale.day + ',' + locale.abday)}.split(',')[d.getDay() + (short ? 7 : 0)], + month: (d,short) => ${js(locale.month + ',' + locale.abmonth)}.split(',')[d.getMonth() + (short ? 12 : 0)], number: (n, dec) => { if (dec == null) dec = 2; var w = n.toFixed(dec), @@ -215,9 +215,9 @@ exports = { return s.substr(0, i + 3) + r + (d ? '${locale.decimal_point}' + d: ''); }, currency: n => ${currency}, - distance: n => n < ${distanceUnits[locale.distance[1]]} ? round(${unitConv(distanceUnits[locale.distance[0]])}) + ${js(locale.distance[0])} : round(${unitConv(distanceUnits[locale.distance[1]])}) + ${js(locale.distance[1])}, - speed: n => round(${unitConv(speedUnits[locale.speed])}) + ${js(locale.speed)}, - temp: t => Math.round(${temperature}) + ${js(locale.temperature)}, + distance: (n,dp) => n < ${distanceUnits[locale.distance[1]]} ? round(${unitConv(distanceUnits[locale.distance[0]])},dp) + ${js(locale.distance[0])} : round(${unitConv(distanceUnits[locale.distance[1]])},dp) + ${js(locale.distance[1])}, + speed: (n,dp) => round(${unitConv(speedUnits[locale.speed])},dp) + ${js(locale.speed)}, + temp: (t,dp) => round(${temperature},dp) + ${js(locale.temperature)}, translate: s => ${locale.trans?`{var t=${js(locale.trans)};s=''+s;return t[s]||t[s.toLowerCase()]||s;}`:`s`}, date: (d,short) => short ? \`${dateS}\` : \`${dateN}\`, time: (d,short) => short ? \`${timeS}\` : \`${timeN}\`, diff --git a/apps/locale/metadata.json b/apps/locale/metadata.json index c8908c7a7..20f1f72b8 100644 --- a/apps/locale/metadata.json +++ b/apps/locale/metadata.json @@ -1,7 +1,7 @@ { "id": "locale", "name": "Languages", - "version": "0.15", + "version": "0.16", "description": "Translations for different countries", "icon": "locale.png", "type": "locale", diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index e9877808c..877b1354a 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -17,4 +17,5 @@ 0.11: Fix KML and GPX export when there is no GPS data 0.12: Fix 'Back' label positioning on track/graph display, make translateable 0.13: Fix for when widget is used before app -0.14: Remove unneeded variable assignment \ No newline at end of file +0.14: Remove unneeded variable assignment +0.15: Show distance more accurately in conjunction with new locale app (fix #1523) diff --git a/apps/recorder/app.js b/apps/recorder/app.js index 99252e0e2..fb3dfab4f 100644 --- a/apps/recorder/app.js +++ b/apps/recorder/app.js @@ -307,7 +307,7 @@ function viewTrack(filename, info) { g.fillCircle(ox,oy,5); if (info.qOSTM) g.setColor("#000"); else g.setColor(g.theme.fg); - g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); + g.drawString(require("locale").distance(dist,2),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); var isBTN3 = "BTN3" in global; diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index d715af38d..4146e92be 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -2,7 +2,7 @@ "id": "recorder", "name": "Recorder", "shortName": "Recorder", - "version": "0.14", + "version": "0.15", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget", diff --git a/modules/exstats.js b/modules/exstats.js index 056dc9f0f..5d7cf0c2b 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -212,7 +212,7 @@ exports.getStats = function(statIDs, options) { stats["dist"]={ title : "Dist", getValue : function() { return state.distance; }, - getString : function() { return require("locale").distance(state.distance); }, + getString : function() { return require("locale").distance(state.distance,2); }, }; } if (statIDs.includes("step")) { @@ -251,7 +251,7 @@ exports.getStats = function(statIDs, options) { stats["speed"]={ title : "Speed", getValue : function() { return state.curSpeed*3.6; }, // in kph - getString : function() { return require("locale").speed(state.curSpeed*3.6); }, + getString : function() { return require("locale").speed(state.curSpeed*3.6,2); }, }; } if (statIDs.includes("caden")) { From 00f1de401acba484ee4e3429e57f9a494718aa82 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Mar 2022 15:55:31 +0100 Subject: [PATCH 176/188] Add 'reinstall apps' button --- index.html | 7 ++++--- loader.js | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index bd8ddea5a..7a94f684a 100644 --- a/index.html +++ b/index.html @@ -128,9 +128,10 @@

Utilities

- + + -

+

Settings

@@ -179,6 +180,6 @@ - + diff --git a/loader.js b/loader.js index 82d6172cb..c4553940b 100644 --- a/loader.js +++ b/loader.js @@ -155,6 +155,29 @@ window.addEventListener('load', (event) => { }); }); + // Button to install all default apps in one go + document.getElementById("reinstallall").addEventListener("click",event=>{ + var promise = showPrompt("Reinstall","Really re-install all apps?").then(() => { + getInstalledApps().then(installedapps => { + console.log(installedapps); + var promise = Promise.resolve(); + installedapps.forEach(app => { + if (app.custom) + return console.log(`Ignoring ${app.id} as customised`); + var oldApp = app; + app = appJSON.find(a => a.id==oldApp.id); + if (!app) + return console.log(`Ignoring ${oldApp.id} as not found`); + promise = promise.then(() => updateApp(app)); + }); + return promise; + }).catch(err=>{ + Progress.hide({sticky:true}); + showToast("App re-install failed, "+err,"error"); + }); + }); + }); + // Button to install all default apps in one go document.getElementById("installdefault").addEventListener("click",event=>{ getInstalledApps().then(() => { From c95067521210fbc31a7d1d4beed7c6ef76c5db05 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Mar 2022 15:56:35 +0100 Subject: [PATCH 177/188] fix upload progress bar regression --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 27c7db603..7b189b5aa 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 27c7db6035832837ca3909ea52939f60803df72f +Subproject commit 7b189b5aa85e6d85c8e0fd8b6db16f3d69387de0 From 7c97c138b182decfed7b33e7a178d81039ba260a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Mar 2022 16:10:32 +0100 Subject: [PATCH 178/188] Disable App Loader "Update App Button" for customizable apps. (fix https://github.com/espruino/BangleApps/issues/1383) --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 7b189b5aa..e9097fa68 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 7b189b5aa85e6d85c8e0fd8b6db16f3d69387de0 +Subproject commit e9097fa680182069a5814c3e566a0bcbcb5e72a1 From 5254f20bb660d0ae2737ad720c1b9dbb5d18beed Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 17:43:46 +0200 Subject: [PATCH 179/188] Redrawing the current clock, if a 'draw()' function exists. --- apps/widbt_notify/widget.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/widbt_notify/widget.js b/apps/widbt_notify/widget.js index d6bad5dc9..0c0a53bba 100644 --- a/apps/widbt_notify/widget.js +++ b/apps/widbt_notify/widget.js @@ -12,16 +12,26 @@ WIDGETS.bluetooth_notify = { } g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), 2 + this.x, 2 + this.y); }, + + redrawCurrentApp: function(){ + if(typeof(draw)=='function'){ + draw(); + }else{ + load(); // fallback. This might reset some variables + } + }, + connect: function() { WIDGETS.bluetooth_notify.draw(); }, + disconnect: function() { if(WIDGETS.bluetooth_notify.warningEnabled == 1){ E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); - // setInterval(()=>{load();}, 3000); // clear message - this will reload the widget, resetting 'warningEnabled'. + setInterval(WIDGETS.bluetooth_notify.redrawCurrentApp()=>{;}, 3000); // clear message WIDGETS.bluetooth_notify.warningEnabled = 0; - setTimeout('WIDGETS.bluetooth_notify.warningEnabled = 1;', 30000); // re-notify only after 30 seconds. + setTimeout('WIDGETS.bluetooth_notify.warningEnabled = 1;', 30000); // don't buzz for the next 30 seconds. var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; if(!quiet){ From 50e38126fba23c3893e3b62036f4be87b132b24c Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 17:45:58 +0200 Subject: [PATCH 180/188] typos --- apps/widbt_notify/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbt_notify/widget.js b/apps/widbt_notify/widget.js index 0c0a53bba..47765f3d0 100644 --- a/apps/widbt_notify/widget.js +++ b/apps/widbt_notify/widget.js @@ -28,7 +28,7 @@ WIDGETS.bluetooth_notify = { disconnect: function() { if(WIDGETS.bluetooth_notify.warningEnabled == 1){ E.showMessage(/*LANG*/'Connection\nlost.', 'Bluetooth'); - setInterval(WIDGETS.bluetooth_notify.redrawCurrentApp()=>{;}, 3000); // clear message + setInterval(()=>{WIDGETS.bluetooth_notify.redrawCurrentApp();}, 3000); // clear message - this will reload the widget, resetting 'warningEnabled'. WIDGETS.bluetooth_notify.warningEnabled = 0; setTimeout('WIDGETS.bluetooth_notify.warningEnabled = 1;', 30000); // don't buzz for the next 30 seconds. From 2e05c57259eb4dae4568912c4a84c3bb818a3354 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Wed, 30 Mar 2022 18:03:54 +0200 Subject: [PATCH 181/188] typo fixed --- apps/messages/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index c517fde73..7d49d4c64 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -58,7 +58,7 @@ exports.pushMessage = function(event) { var loadMessages = Bangle.CLOCK || event.important; // first, buzz var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; - var unlockWatch = (require('Storage').readJSON('messages.setting.json',1)||{}).unlockWatch; + var unlockWatch = (require('Storage').readJSON('messages.settings.json',1)||{}).unlockWatch; if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages){ WIDGETS.messages.buzz(); if(unlockWatch != false){ From d356735bf2f50e7b7ccce8c9193c9639256c391f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 30 Mar 2022 20:52:13 +0100 Subject: [PATCH 182/188] Update pebble.app.js --- apps/pebble/pebble.app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 80243c890..062592e47 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -10,6 +10,7 @@ Graphics.prototype.setFontLECO1976Regular22 = function(scale) { const SETTINGS_FILE = "pebble.json"; let settings; +let theme; function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'theme':'System', 'showlock':false}; From 1642dbc93a937a8f73f05f4fa3b9c824c6bafb36 Mon Sep 17 00:00:00 2001 From: KungPhoo Date: Thu, 31 Mar 2022 07:37:43 +0200 Subject: [PATCH 183/188] reset graphics before drawing --- apps/glbasic/glbasic.app.js | 237 ++++++++++++++++++------------------ 1 file changed, 119 insertions(+), 118 deletions(-) diff --git a/apps/glbasic/glbasic.app.js b/apps/glbasic/glbasic.app.js index b2b6f45ed..ff7837ada 100644 --- a/apps/glbasic/glbasic.app.js +++ b/apps/glbasic/glbasic.app.js @@ -1,176 +1,177 @@ -Graphics.prototype.setFontLECO1976Regular42 = function(scale) { - // Actual height 42 (41 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60 + (scale << 8) + (1 << 16)); +Graphics.prototype.setFontLECO1976Regular42 = function (scale) { + // Actual height 42 (41 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60 + (scale << 8) + (1 << 16)); }; -Graphics.prototype.setFontLECO1976Regular22 = function(scale) { - // Actual height 22 (21 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22 + (scale << 8) + (1 << 16)); +Graphics.prototype.setFontLECO1976Regular22 = function (scale) { + // Actual height 22 (21 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22 + (scale << 8) + (1 << 16)); }; require("Font7x11Numeric7Seg").add(Graphics); -//the following 2 sections are used from waveclk to schedule minutely updates +// the following 2 sections are used from waveclk to schedule minutely updates // timeout used to update every minute var drawTimeout; // schedule a draw for the next minute function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); } function drawBackground() { - g.setBgColor(0, 0, 0); - g.setColor(1, 1, 1); - g.clear(); + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); + g.clear(); } function digit(num) { - return String.fromCharCode(num + 48); + return String.fromCharCode(num + 48); } function timeString(h, m) { - return digit(h / 10) + digit(h % 10) + ":" + digit(m / 10) + digit(m % 10); + return digit(h / 10) + digit(h % 10) + ":" + digit(m / 10) + digit(m % 10); } function dayString(w) { - return digit(w / 10) + digit(w % 10); + return digit(w / 10) + digit(w % 10); } function getSteps() { - if (WIDGETS.wpedom !== undefined) { - return WIDGETS.wpedom.getSteps(); - } - return '????'; + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return '????'; } /** * draws calender week view (-1,0,1) for given date */ function drawCal() { - d = /*this.date ? this.date : */ new Date(); + d = /*this.date ? this.date : */ new Date(); - const DAY_NAME_FONT_SIZE = 10; - const CAL_Y = g.getHeight() - 44; // Bangle.appRect.y+this.DATE_FONT_SIZE()+10+this.TIME_FONT_SIZE()+3; - const CAL_AREA_H = 44; // g.getHeight()-CAL_Y+24; //+24: top widgtes only - const CELL_W = g.getWidth() / 7; //cell width - const CELL_H = (CAL_AREA_H - DAY_NAME_FONT_SIZE) / 3; //cell heigth - const DAY_NUM_FONT_SIZE = Math.min(CELL_H + 3, 15); //size down, max 15 + const DAY_NAME_FONT_SIZE = 10; + const CAL_Y = g.getHeight() - 44; // Bangle.appRect.y+this.DATE_FONT_SIZE()+10+this.TIME_FONT_SIZE()+3; + const CAL_AREA_H = 44; // g.getHeight()-CAL_Y+24; //+24: top widgtes only + const CELL_W = g.getWidth() / 7; //cell width + const CELL_H = (CAL_AREA_H - DAY_NAME_FONT_SIZE) / 3; //cell heigth + const DAY_NUM_FONT_SIZE = Math.min(CELL_H + 3, 15); //size down, max 15 - const wdStrt = 1; + const wdStrt = 1; - const ABR_DAY = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - const IS_SUNDAY = [1, 0, 0, 0, 0, 1, 1]; // what days are sunday? - const nrgb = ["#000", "#FFF", "#F00", "#0F0", "#00F", "#FF0"]; //fg, r ,g , b - const suClr = 5; // sunday color fg - const tdyMrkClr = 3; // today bk - const tdyNumClr = 0; // today fg + const ABR_DAY = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + const IS_SUNDAY = [1, 0, 0, 0, 0, 1, 1]; // what days are sunday? + const nrgb = ["#000", "#FFF", "#F00", "#0F0", "#00F", "#FF0"]; //fg, r ,g , b + const suClr = 5; // sunday color fg + const tdyMrkClr = 3; // today bk + const tdyNumClr = 0; // today fg - g.setFont("Vector", DAY_NAME_FONT_SIZE+3); - g.setColor(nrgb[1]); - g.setFontAlign(-1, -1); - // g.clearRect(Bangle.appRect.x, CAL_Y, Bangle.appRect.x2, CAL_Y+CAL_AREA_H); + g.setFont("Vector", DAY_NAME_FONT_SIZE + 3); + g.setColor(nrgb[1]); + g.setFontAlign(-1, -1); + // g.clearRect(Bangle.appRect.x, CAL_Y, Bangle.appRect.x2, CAL_Y+CAL_AREA_H); - //draw grid & Headline - const dNames = ABR_DAY.map((a) => a.length <= 2 ? a : a.substr(0, 2)); //force shrt 2 - for (var dNo = 0; dNo < dNames.length; dNo++) { - const dIdx = wdStrt >= 0 ? ((wdStrt + dNo) % 7) : ((dNo + d.getDay() + 4) % 7); - const dName = dNames[dIdx]; - // if(dNo>0) { g.drawLine(dNo*CELL_W, CAL_Y, dNo*CELL_W, CAL_Y+CAL_AREA_H-1);} + //draw grid & Headline + const dNames = ABR_DAY.map((a) => a.length <= 2 ? a : a.substr(0, 2)); //force shrt 2 + for (var dNo = 0; dNo < dNames.length; dNo++) { + const dIdx = wdStrt >= 0 ? ((wdStrt + dNo) % 7) : ((dNo + d.getDay() + 4) % 7); + const dName = dNames[dIdx]; + // if(dNo>0) { g.drawLine(dNo*CELL_W, CAL_Y, dNo*CELL_W, CAL_Y+CAL_AREA_H-1);} - var colTx = 0; - var colBk = 1; - if (IS_SUNDAY[dIdx]) { - colBk = suClr; + var colTx = 0; + var colBk = 1; + if (IS_SUNDAY[dIdx]) { + colBk = suClr; + } + + g.setColor(nrgb[colBk]); + g.fillRect(dNo * CELL_W, CAL_Y, dNo * CELL_W + CELL_W, CAL_Y + DAY_NAME_FONT_SIZE - 1); + g.setColor(nrgb[colTx]); + g.drawString(dName, dNo * CELL_W + (CELL_W - g.stringWidth(dName)) / 2 + 2, CAL_Y - 1); + // g.setColor(nrgb[clTxt]); } + g.setColor(nrgb[1]); + var nextY = CAL_Y + DAY_NAME_FONT_SIZE; - g.setColor(nrgb[colBk]); - g.fillRect(dNo * CELL_W, CAL_Y, dNo * CELL_W + CELL_W, CAL_Y + DAY_NAME_FONT_SIZE-1); - g.setColor(nrgb[colTx]); - g.drawString(dName, dNo * CELL_W + (CELL_W - g.stringWidth(dName)) / 2 + 2, CAL_Y-1); - // g.setColor(nrgb[clTxt]); - } - g.setColor(nrgb[1]); - var nextY = CAL_Y + DAY_NAME_FONT_SIZE; + // horizontal lines + // for(i=0; i<3; i++){ const y=nextY+i*CELL_H; g.drawLine(Bangle.appRect.x, y, Bangle.appRect.x2, y); } - // horizontal lines - // for(i=0; i<3; i++){ const y=nextY+i*CELL_H; g.drawLine(Bangle.appRect.x, y, Bangle.appRect.x2, y); } + g.setFont("Vector", DAY_NUM_FONT_SIZE); - g.setFont("Vector", DAY_NUM_FONT_SIZE); + g.setFont("7x11Numeric7Seg", 1); - g.setFont("7x11Numeric7Seg", 1); - - //write days - const tdyDate = d.getDate(); - const days = wdStrt >= 0 ? 7 + ((7 + d.getDay() - wdStrt) % 7) : 10; //start day (week before=7 days + days in this week realtive to week start) or fixed 7+3 days - var rD = new Date(d.getTime()); - rD.setDate(rD.getDate() - days); - var rDate = rD.getDate(); - for (var y = 0; y < 3; y++) { - for (var x = 0; x < dNames.length; x++) { - if (rDate === tdyDate) { //today - g.setColor(nrgb[tdyMrkClr]); //today marker color or fg color + //write days + const tdyDate = d.getDate(); + const days = wdStrt >= 0 ? 7 + ((7 + d.getDay() - wdStrt) % 7) : 10; //start day (week before=7 days + days in this week realtive to week start) or fixed 7+3 days + var rD = new Date(d.getTime()); + rD.setDate(rD.getDate() - days); + var rDate = rD.getDate(); + for (var y = 0; y < 3; y++) { + for (var x = 0; x < dNames.length; x++) { + if (rDate === tdyDate) { //today + g.setColor(nrgb[tdyMrkClr]); //today marker color or fg color - // rectangle - g.fillRect(x * CELL_W, nextY + CELL_H-1, x * CELL_W + CELL_W, nextY + CELL_H + CELL_H - 1); - g.setColor(nrgb[tdyNumClr]); //today color or fg color + // rectangle + g.fillRect(x * CELL_W, nextY + CELL_H - 1, x * CELL_W + CELL_W, nextY + CELL_H + CELL_H - 1); + g.setColor(nrgb[tdyNumClr]); //today color or fg color - // simulate "bold" - g.drawString(rDate, 1+ x * CELL_W + ((CELL_W - g.stringWidth(rDate)) / 2) + 2, nextY + ((CELL_H - DAY_NUM_FONT_SIZE + 2) / 2) + (CELL_H * y)); + // simulate "bold" + g.drawString(rDate, 1 + x * CELL_W + ((CELL_W - g.stringWidth(rDate)) / 2) + 2, nextY + ((CELL_H - DAY_NUM_FONT_SIZE + 2) / 2) + (CELL_H * y)); - } else if (IS_SUNDAY[rD.getDay()]) { //sundays - g.setColor(nrgb[suClr]); - } else { //default - g.setColor(nrgb[1]); - } - g.drawString(rDate, x * CELL_W + ((CELL_W - g.stringWidth(rDate)) / 2) + 2, nextY + ((CELL_H - DAY_NUM_FONT_SIZE + 2) / 2) + (CELL_H * y)); - rD.setDate(rDate + 1); - rDate = rD.getDate(); + } else if (IS_SUNDAY[rD.getDay()]) { //sundays + g.setColor(nrgb[suClr]); + } else { //default + g.setColor(nrgb[1]); + } + g.drawString(rDate, x * CELL_W + ((CELL_W - g.stringWidth(rDate)) / 2) + 2, nextY + ((CELL_H - DAY_NUM_FONT_SIZE + 2) / 2) + (CELL_H * y)); + rD.setDate(rDate + 1); + rDate = rD.getDate(); + } } - } } function draw() { - drawBackground(); - var date = new Date(); - var h = date.getHours(), - m = date.getMinutes(); - var d = date.getDate(), - w = date.getDay(); // d=1..31; w=0..6 + g.reset(); + drawBackground(); + var date = new Date(); + var h = date.getHours(), + m = date.getMinutes(); + var d = date.getDate(), + w = date.getDay(); // d=1..31; w=0..6 - g.setBgColor(0, 0, 0); - g.setColor(1, 1, 1); + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); - // g.setFont('Vector', 30); - // g.setFont("7x11Numeric7Seg", 5); - g.setFontLECO1976Regular42(); - g.setFontAlign(0, -1); - g.drawString(timeString(h, m), g.getWidth() / 2, 28); - g.drawString(dayString(d), g.getWidth() * 3 / 4, 88); - g.setColor(0, 1, 0); - g.fillRect(0, 76, g.getWidth(), 80); - g.reset(); + // g.setFont('Vector', 30); + // g.setFont("7x11Numeric7Seg", 5); + g.setFontLECO1976Regular42(); + g.setFontAlign(0, -1); + g.drawString(timeString(h, m), g.getWidth() / 2, 28); + g.drawString(dayString(d), g.getWidth() * 3 / 4, 88); + g.setColor(0, 1, 0); + g.fillRect(0, 76, g.getWidth(), 80); + g.reset(); - // Steps - g.setFontLECO1976Regular22(); - g.setFontAlign(-1, -1); - g.drawString(getSteps(), 8, 88); + // Steps + g.setFontLECO1976Regular22(); + g.setFontAlign(-1, -1); + g.drawString(getSteps(), 8, 88); - drawCal(); + drawCal(); - // widget redraw - Bangle.drawWidgets(); - queueDraw(); + // widget redraw + Bangle.drawWidgets(); + queueDraw(); } @@ -188,12 +189,12 @@ draw(); //the following section is also from waveclk Bangle.on('lcdPower', on => { - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } }); Bangle.setUI("clock"); From aff76fe2c012e509b4264a69f20b7c60f483c3e3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 11:39:59 +0100 Subject: [PATCH 184/188] 0.17: Fix regression where long month names were 'undefined' (fix #1641)Fix issue where long month names included 'undefined' (fix #1641) --- apps/locale/ChangeLog | 1 + apps/locale/locale.html | 2 +- apps/locale/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index 3354a57c1..d21cb1a56 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -18,3 +18,4 @@ Added Swedish localisation with English text 0.16: Remove global variables that used RAM Add second 'dp' argument for decimal places in distance/speed/temp (fix #1523) +0.17: Fix regression where long month names were 'undefined' (fix #1641) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index b58b4a297..bac938ffa 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -161,7 +161,7 @@ exports = { name : "en_GB", currencySym:"£", "%A": `${js(locale.day)}.split(',')[d.getDay()]`, "%a": `${js(locale.abday)}.split(',')[d.getDay()]`, "%B": `${js(locale.month)}.split(',')[d.getMonth()]`, - "%b": `${js(locale.abmonth)}.split(',')[d.getMonth() + 12]`, + "%b": `${js(locale.abmonth)}.split(',')[d.getMonth()]`, "%p": `d.getHours()<12?${js(locale.ampm[0].toUpperCase())}:${js(locale.ampm[1].toUpperCase())}`, "%P": `d.getHours()<12?${js(locale.ampm[0].toLowerCase())}:${js(locale.ampm[1].toLowerCase())}` }; diff --git a/apps/locale/metadata.json b/apps/locale/metadata.json index 20f1f72b8..54ad64e80 100644 --- a/apps/locale/metadata.json +++ b/apps/locale/metadata.json @@ -1,7 +1,7 @@ { "id": "locale", "name": "Languages", - "version": "0.16", + "version": "0.17", "description": "Translations for different countries", "icon": "locale.png", "type": "locale", From ee739ec447358c86dcac3bfb0987380270299633 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 13:47:35 +0100 Subject: [PATCH 185/188] minor tweaks --- apps/glbasic/ChangeLog | 2 ++ apps/glbasic/metadata.json | 3 +-- apps/glbasic/readme.md | 1 - apps/messages/ChangeLog | 2 +- apps/messages/metadata.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 apps/glbasic/ChangeLog delete mode 100644 apps/glbasic/readme.md diff --git a/apps/glbasic/ChangeLog b/apps/glbasic/ChangeLog new file mode 100644 index 000000000..89aee01f8 --- /dev/null +++ b/apps/glbasic/ChangeLog @@ -0,0 +1,2 @@ +0.20: New App! + diff --git a/apps/glbasic/metadata.json b/apps/glbasic/metadata.json index 9d8f5ec7b..7c79097da 100644 --- a/apps/glbasic/metadata.json +++ b/apps/glbasic/metadata.json @@ -2,10 +2,9 @@ "id": "glbasic", "name": "GLBasic Clock", "shortName": "GLBasic", - "version": "0.2", + "version": "0.20", "description": "A clock with large numbers", "dependencies": {"widpedom":"app"}, - "readme": "readme.md", "icon": "icon48.png", "screenshots": [{"url":"glbasic_screenshot.png"}], "type": "clock", diff --git a/apps/glbasic/readme.md b/apps/glbasic/readme.md deleted file mode 100644 index 8b1378917..000000000 --- a/apps/glbasic/readme.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 7815cc3d1..416cb1694 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -40,4 +40,4 @@ 0.25: Fix widget memory usage issues if message received and watch repeatedly calls Bangle.drawWidgets (fix #1550) 0.26: Setting to auto-open music 0.27: Add 'mark all read' option to popup menu (fix #1624) - Option to auto-unlock the watch when a new message arrives +0.28: Option to auto-unlock the watch when a new message arrives diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 4fb5a4045..6f35f39b0 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.27", + "version": "0.28", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", From 60af0ea6a59fbb59155d08be996eeff964593df9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 15:40:29 +0100 Subject: [PATCH 186/188] Naming - fix #1640 --- apps/doztime/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/doztime/metadata.json b/apps/doztime/metadata.json index 6933487ab..a05bf1470 100644 --- a/apps/doztime/metadata.json +++ b/apps/doztime/metadata.json @@ -1,9 +1,9 @@ { "id": "doztime", - "name": "Dozenal Time", - "shortName": "Dozenal Time", + "name": "Dozenal Digital Time", + "shortName": "Dozenal Digital", "version": "0.05", - "description": "A dozenal Holocene calendar and dozenal diurnal clock", + "description": "A dozenal Holocene calendar and dozenal diurnal digital clock", "icon": "app.png", "type": "clock", "tags": "clock", From 605a1fb96d39c44fbd42cb5b0fce6afc1d3ab0f9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 15:41:22 +0100 Subject: [PATCH 187/188] version sync --- apps/smclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index 55668adcc..ca40193a2 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -4,7 +4,7 @@ "shortName": "MonoClock", "icon": "app.png", "screenshots": [{ "url": "screenshot0.png" }, {"url": "screenshot1.png" }], - "version": "0.04", + "version": "0.06", "description": "A simple watchface based on my stylised monogram.", "type": "clock", "tags": "clock", From 7fc1747a3fe59909002dae1ac4e8add6c0d12b57 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 15:52:17 +0100 Subject: [PATCH 188/188] 0.13: Revert #1578 (stop duplicate entries) as with 2v12 menus it causes other boxes to be wiped (fix #1643) --- apps/run/ChangeLog | 3 ++- apps/run/metadata.json | 2 +- apps/run/settings.js | 5 ----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/run/ChangeLog b/apps/run/ChangeLog index 9f1a547b1..de070dbd8 100644 --- a/apps/run/ChangeLog +++ b/apps/run/ChangeLog @@ -10,4 +10,5 @@ 0.09: Fix broken start/stop if recording not enabled (fix #1561) 0.10: Don't allow the same setting to be chosen for 2 boxes (fix #1578) 0.11: Notifications fixes -0.12: Fix for recorder not stopping at end of run. Bug introduced in 0.11 \ No newline at end of file +0.12: Fix for recorder not stopping at end of run. Bug introduced in 0.11 +0.13: Revert #1578 (stop duplicate entries) as with 2v12 menus it causes other boxes to be wiped (fix #1643) diff --git a/apps/run/metadata.json b/apps/run/metadata.json index b1b5617be..afa52b2f7 100644 --- a/apps/run/metadata.json +++ b/apps/run/metadata.json @@ -1,6 +1,6 @@ { "id": "run", "name": "Run", - "version":"0.12", + "version":"0.13", "description": "Displays distance, time, steps, cadence, pace and more for runners.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps", diff --git a/apps/run/settings.js b/apps/run/settings.js index 240df9f07..c3bb31a0d 100644 --- a/apps/run/settings.js +++ b/apps/run/settings.js @@ -42,11 +42,6 @@ value: Math.max(statsIDs.indexOf(settings[boxID]),0), format: v => statsList[v].name, onchange: v => { - for (var i=1;i<=6;i++) - if (settings["B"+i]==statsIDs[v]) { - settings["B"+i]=""; - boxMenu["Box "+i].value=0; - } settings[boxID] = statsIDs[v]; saveSettings(); },