From 78a33debb4315ea72ec109d8635f409c68b137c2 Mon Sep 17 00:00:00 2001 From: Arne Schauf Date: Tue, 27 Sep 2022 13:04:36 +0200 Subject: [PATCH 01/44] Improve accellog --- apps/accellog/ChangeLog | 1 + apps/accellog/app.js | 86 ++++++++++++++++++++++++++++++------- apps/accellog/metadata.json | 2 +- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/apps/accellog/ChangeLog b/apps/accellog/ChangeLog index 80981fe27..94241c7a7 100644 --- a/apps/accellog/ChangeLog +++ b/apps/accellog/ChangeLog @@ -2,3 +2,4 @@ 0.02: Use the new multiplatform 'Layout' library 0.03: Exit as first menu option, dont show decimal places for seconds 0.04: Localisation, change Exit->Back to allow back-arrow to appear on 2v13 firmware +0.05: Add max G values during recording, record actual G values and magnitude to CSV diff --git a/apps/accellog/app.js b/apps/accellog/app.js index f4c1b3c5a..bcdb6fe32 100644 --- a/apps/accellog/app.js +++ b/apps/accellog/app.js @@ -78,6 +78,7 @@ function viewLogs() { } function startRecord(force) { + var stopped = false; if (!force) { // check for existing file var f = require("Storage").open(getFileName(fileNumber), "r"); @@ -92,39 +93,92 @@ function startRecord(force) { var Layout = require("Layout"); var layout = new Layout({ type: "v", c: [ - {type:"txt", font:"6x8", label:/*LANG*/"Samples", pad:2}, - {type:"txt", id:"samples", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg}, - {type:"txt", font:"6x8", label:/*LANG*/"Time", pad:2}, - {type:"txt", id:"time", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg}, - {type:"txt", font:"6x8:2", label:/*LANG*/"RECORDING", bgCol:"#f00", pad:5, fillx:1}, - ] - },{btns:[ // Buttons... - {label:/*LANG*/"STOP", cb:()=>{ - Bangle.removeListener('accel', accelHandler); - showMenu(); + { type: "h", c: [ + { type: "v", c: [ + {type:"txt", font:"6x8", label:/*LANG*/"Samples", pad:2}, + {type:"txt", id:"samples", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg}, + ]}, + { type: "v", c: [ + {type:"txt", font:"6x8", label:/*LANG*/"Time", pad:2}, + {type:"txt", id:"time", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg}, + ]}, + ]}, + { type: "h", c: [ + { type: "v", c: [ + {type:"txt", font:"6x8", label:/*LANG*/"Max X", pad:2}, + {type:"txt", id:"maxX", font:"6x8", label:" - ", pad:5, bgCol:g.theme.bg}, + ]}, + { type: "v", c: [ + {type:"txt", font:"6x8", label:/*LANG*/"Max Y", pad:2}, + {type:"txt", id:"maxY", font:"6x8", label:" - ", pad:5, bgCol:g.theme.bg}, + ]}, + { type: "v", c: [ + {type:"txt", font:"6x8", label:/*LANG*/"Max Z", pad:2}, + {type:"txt", id:"maxZ", font:"6x8", label:" - ", pad:5, bgCol:g.theme.bg}, + ]}, + ]}, + {type:"txt", font:"6x8", label:/*LANG*/"Max G", pad:2}, + {type:"txt", id:"maxMag", font:"6x8:4", label:" - ", pad:5, bgCol:g.theme.bg}, + {type:"txt", id:"state", font:"6x8:2", label:/*LANG*/"RECORDING", bgCol:"#f00", pad:5, fillx:1}, + ]}, + { + btns:[ // Buttons... + {id: "btnStop", label:/*LANG*/"STOP", cb:()=>{ + if (stopped) { + showMenu(); + } + else { + Bangle.removeListener('accel', accelHandler); + layout.state.label = /*LANG*/"STOPPED"; + layout.state.bgCol = /*LANG*/"#0f0"; + stopped = true; + layout.btnStop.label = /*LANG*/"MENU"; + layout.render(); + } }} ]}); layout.render(); // now start writing var f = require("Storage").open(getFileName(fileNumber), "w"); - f.write("Time (ms),X,Y,Z\n"); + f.write("Time (ms),X,Y,Z,Total\n"); var start = getTime(); var sampleCount = 0; + var maxMag = 0; + var maxX = 0; + var maxY = 0; + var maxZ = 0; function accelHandler(accel) { var t = getTime()-start; f.write([ t*1000, - accel.x*8192, - accel.y*8192, - accel.z*8192].map(n=>Math.round(n)).join(",")+"\n"); + accel.x, + accel.y, + accel.z, + accel.mag, + ].map(n => n.toFixed(2)).join(",")+"\n"); + if (accel.mag > maxMag) { + maxMag = accel.mag.toFixed(2); + } + if (accel.x > maxX) { + maxX = accel.x.toFixed(2); + } + if (accel.y > maxY) { + maxY = accel.y.toFixed(2); + } + if (accel.z > maxZ) { + maxZ = accel.z.toFixed(2); + } sampleCount++; layout.samples.label = sampleCount; layout.time.label = Math.round(t)+"s"; - layout.render(layout.samples); - layout.render(layout.time); + layout.maxX.label = maxX; + layout.maxY.label = maxY; + layout.maxZ.label = maxZ; + layout.maxMag.label = maxMag; + layout.render(); } Bangle.setPollInterval(80); // 12.5 Hz - the default diff --git a/apps/accellog/metadata.json b/apps/accellog/metadata.json index fdf6cf320..903c57903 100644 --- a/apps/accellog/metadata.json +++ b/apps/accellog/metadata.json @@ -2,7 +2,7 @@ "id": "accellog", "name": "Acceleration Logger", "shortName": "Accel Log", - "version": "0.04", + "version": "0.05", "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", "icon": "app.png", "tags": "outdoor", From b292a54677e03689924cb495c97d47335512af32 Mon Sep 17 00:00:00 2001 From: storm64 Date: Mon, 3 Oct 2022 12:39:44 +0200 Subject: [PATCH 02/44] [gpsnav] Correct wpindex check --- apps/gpsnav/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gpsnav/app.js b/apps/gpsnav/app.js index e2b6ee6f1..9fb743176 100644 --- a/apps/gpsnav/app.js +++ b/apps/gpsnav/app.js @@ -36,7 +36,7 @@ function drawCompass(course) { } xpos+=15; } - if (wpindex!=0) { + if (wpindex>=0) { var bpos = brg - course; if (bpos>180) bpos -=360; if (bpos<-180) bpos +=360; @@ -220,7 +220,7 @@ function nextwp(inc){ } function doselect(){ - if (selected && wpindex!=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { + if (selected && wpindex<=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon}; wp = waypoints[wpindex]; require("waypoints").save(waypoints); From 459a1b91d93b8c93656ed7b2cf76ad6d1fab47cd Mon Sep 17 00:00:00 2001 From: storm64 Date: Mon, 3 Oct 2022 13:18:40 +0200 Subject: [PATCH 03/44] [gpsnav] Correct wpindex check --- apps/gpsnav/app_b2.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/gpsnav/app_b2.js b/apps/gpsnav/app_b2.js index e46be649f..241666d43 100644 --- a/apps/gpsnav/app_b2.js +++ b/apps/gpsnav/app_b2.js @@ -43,7 +43,7 @@ function drawCompass(course) { } xpos += 12; } - if (wpindex != 0) { + if (wpindex >= 0) { var bpos = brg - course; if (bpos > 180) bpos -= 360; if (bpos < -180) bpos += 360; @@ -241,7 +241,7 @@ function nextwp(inc) { } function doselect() { - if (selected && wpindex != 0 && waypoints[wpindex].lat === undefined && savedfix.fix) { + if (selected && wpindex >= 0 && waypoints[wpindex].lat === undefined && savedfix.fix) { waypoints[wpindex] = { name: "@" + wp.name, lat: savedfix.lat, @@ -265,4 +265,4 @@ drawAll(); startTimers(); Bangle.on('GPS', onGPS); // Toggle selected -setButtons(); \ No newline at end of file +setButtons(); From 4410c4458fd5ae2a53735c61bc0452ce14019bf8 Mon Sep 17 00:00:00 2001 From: storm64 Date: Mon, 3 Oct 2022 13:21:16 +0200 Subject: [PATCH 04/44] [gpsnav] Update ChangeLog --- apps/gpsnav/ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/gpsnav/ChangeLog b/apps/gpsnav/ChangeLog index 6f327f364..5e1c98160 100644 --- a/apps/gpsnav/ChangeLog +++ b/apps/gpsnav/ChangeLog @@ -4,4 +4,5 @@ 0.04: Fix great circle formula 0.05: Use locale for speed and distance + fix Vector font sizes 0.06: Move waypoints.json (and editor) to 'waypoints' app -0.07: Add support for b2 \ No newline at end of file +0.07: Add support for b2 +0.08: Fix not displaying of wpindex = 0 From ed1675d297647434c1ad19cf716ebe82a1ee8fb9 Mon Sep 17 00:00:00 2001 From: storm64 Date: Mon, 3 Oct 2022 13:22:15 +0200 Subject: [PATCH 05/44] [gpsnav] Update metadata.js --- apps/gpsnav/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpsnav/metadata.json b/apps/gpsnav/metadata.json index dce80112f..bc46a733c 100644 --- a/apps/gpsnav/metadata.json +++ b/apps/gpsnav/metadata.json @@ -1,7 +1,7 @@ { "id": "gpsnav", "name": "GPS Navigation", - "version": "0.07", + "version": "0.08", "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", "screenshots": [{"url":"screenshot-b2.png"}], "icon": "icon.png", From c39d40b0ce78514bcb60c302601d5fce2db016ca Mon Sep 17 00:00:00 2001 From: storm64 Date: Mon, 3 Oct 2022 16:33:10 +0200 Subject: [PATCH 06/44] [gpsnav] Correct typo --- apps/gpsnav/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpsnav/app.js b/apps/gpsnav/app.js index 9fb743176..68bd2cbda 100644 --- a/apps/gpsnav/app.js +++ b/apps/gpsnav/app.js @@ -220,7 +220,7 @@ function nextwp(inc){ } function doselect(){ - if (selected && wpindex<=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { + if (selected && wpindex>=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon}; wp = waypoints[wpindex]; require("waypoints").save(waypoints); From 31794449595b5d85971f2fdada8b64243583b386 Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 4 Oct 2022 12:08:29 +0200 Subject: [PATCH 07/44] [gpsnav] Add reset and clear for compass drawing --- apps/gpsnav/app_b2.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/gpsnav/app_b2.js b/apps/gpsnav/app_b2.js index 241666d43..635567493 100644 --- a/apps/gpsnav/app_b2.js +++ b/apps/gpsnav/app_b2.js @@ -21,7 +21,7 @@ var loc = { function drawCompass(course) { if (!candraw) return; - g.setColor(g.theme.fg); + g.reset().clearRect(0, 24, 175, 70); g.setFont("Vector", 18); var start = course - 90; if (start < 0) start += 360; @@ -106,9 +106,8 @@ function distance(a, b) { var selected = false; function drawN() { - g.clearRect(0, 89, 175, 175); + g.reset().clearRect(0, 89, 175, 175); var txt = loc.speed[locindex](speed); - g.setColor(g.theme.fg); g.setFont("6x8", 2); g.drawString("o", 68, 87); g.setFont("6x8", 1); @@ -117,10 +116,8 @@ function drawN() { var cs = course.toString().padStart(3, "0"); g.drawString(cs, 2, 89); g.drawString(txt.substring(0, txt.length - 3), 92, 89); - g.setColor(g.theme.fg); g.setFont("Vector", 18); var bs = brg.toString().padStart(3, "0"); - g.setColor(g.theme.fg); g.drawString("Brg:", 1, 128); g.drawString("Dist:", 1, 148); g.setColor(selected ? g.theme.bgH : g.theme.bg); From 488d865218f3026626d18d67ff3be870b228f0b0 Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 4 Oct 2022 12:16:23 +0200 Subject: [PATCH 08/44] [gpsnav] Add changes --- apps/gpsnav/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpsnav/ChangeLog b/apps/gpsnav/ChangeLog index 5e1c98160..6784a8243 100644 --- a/apps/gpsnav/ChangeLog +++ b/apps/gpsnav/ChangeLog @@ -5,4 +5,4 @@ 0.05: Use locale for speed and distance + fix Vector font sizes 0.06: Move waypoints.json (and editor) to 'waypoints' app 0.07: Add support for b2 -0.08: Fix not displaying of wpindex = 0 +0.08: Fix not displaying of wpindex = 0, correct compass drawing on b2 From a4c1348013c16bb5fd03526dc4a35c460c34fc8c Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 4 Oct 2022 12:44:08 +0200 Subject: [PATCH 09/44] [gpsnav] Correct nm calculation --- apps/gpsnav/app_b2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpsnav/app_b2.js b/apps/gpsnav/app_b2.js index 635567493..ed3035029 100644 --- a/apps/gpsnav/app_b2.js +++ b/apps/gpsnav/app_b2.js @@ -13,7 +13,7 @@ var loc = { distance: [ require("locale").distance, (m) => { - return (m / 1.852).toFixed(3) + "nm "; + return (m / 1852).toFixed(3) + "nm "; } ] }; From fd3d47bd7b2832944c35e6e8b6bb02fd385fd2e1 Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 4 Oct 2022 12:45:09 +0200 Subject: [PATCH 10/44] [gpsnav] Add changes --- apps/gpsnav/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpsnav/ChangeLog b/apps/gpsnav/ChangeLog index 6784a8243..840f9ecbc 100644 --- a/apps/gpsnav/ChangeLog +++ b/apps/gpsnav/ChangeLog @@ -5,4 +5,4 @@ 0.05: Use locale for speed and distance + fix Vector font sizes 0.06: Move waypoints.json (and editor) to 'waypoints' app 0.07: Add support for b2 -0.08: Fix not displaying of wpindex = 0, correct compass drawing on b2 +0.08: Fix not displaying of wpindex = 0, correct compass drawing and nm calculation on b2 From 9e0147d8bc1cded0a4ecc37dce1be6dc2e843dc3 Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 4 Oct 2022 12:58:00 +0200 Subject: [PATCH 11/44] [gpsnav] Correct clearing rect --- apps/gpsnav/app_b2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpsnav/app_b2.js b/apps/gpsnav/app_b2.js index ed3035029..ee6519c92 100644 --- a/apps/gpsnav/app_b2.js +++ b/apps/gpsnav/app_b2.js @@ -21,7 +21,7 @@ var loc = { function drawCompass(course) { if (!candraw) return; - g.reset().clearRect(0, 24, 175, 70); + g.reset().clearRect(0, 24, 175, 71); g.setFont("Vector", 18); var start = course - 90; if (start < 0) start += 360; From 74166eaedc951528a5af04f131c7a8a4729ce36d Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 4 Oct 2022 17:42:08 +0200 Subject: [PATCH 12/44] [waypointer] Correct wpindex=0 check --- apps/waypointer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/waypointer/app.js b/apps/waypointer/app.js index 9fd288c9a..fe3f73fc3 100644 --- a/apps/waypointer/app.js +++ b/apps/waypointer/app.js @@ -263,7 +263,7 @@ function nextwp(inc){ } function doselect(){ - if (selected && wpindex!=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { + if (selected && wpindex>=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon}; wp = waypoints[wpindex]; require("waypoints").save(waypoints); From 9cb61cb335c0512f1c3e90eafa1857ce29684fb6 Mon Sep 17 00:00:00 2001 From: Arne Schauf Date: Wed, 5 Oct 2022 11:30:04 +0200 Subject: [PATCH 13/44] [accellog] Add option to log raw sensor values --- apps/accellog/app.js | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/accellog/app.js b/apps/accellog/app.js index bcdb6fe32..147f7503f 100644 --- a/apps/accellog/app.js +++ b/apps/accellog/app.js @@ -1,5 +1,6 @@ var fileNumber = 0; var MAXLOGS = 9; +var logRawData = false; function getFileName(n) { return "accellog."+n+".csv"; @@ -24,6 +25,11 @@ function showMenu() { /*LANG*/"View Logs" : function() { viewLogs(); }, + /*LANG*/"Log raw data" : { + value : logRawData, + format : v => v?/*LANG*/"Yes":/*LANG*/"No", + onchange : v => { logRawData=v; } + }, }; E.showMenu(menu); } @@ -132,7 +138,6 @@ function startRecord(force) { layout.state.label = /*LANG*/"STOPPED"; layout.state.bgCol = /*LANG*/"#0f0"; stopped = true; - layout.btnStop.label = /*LANG*/"MENU"; layout.render(); } }} @@ -151,13 +156,23 @@ function startRecord(force) { function accelHandler(accel) { var t = getTime()-start; - f.write([ - t*1000, - accel.x, - accel.y, - accel.z, - accel.mag, - ].map(n => n.toFixed(2)).join(",")+"\n"); + if (logRawData) { + f.write([ + t*1000, + accel.x*8192, + accel.y*8192, + accel.z*8192, + accel.mag*8192, + ].map(n=>Math.round(n)).join(",")+"\n"); + } else { + f.write([ + Math.round(t*1000), + accel.x, + accel.y, + accel.z, + accel.mag, + ].join(",")+"\n"); + } if (accel.mag > maxMag) { maxMag = accel.mag.toFixed(2); } From 298fbf0d84afe6399a00f00f048fd02369a1dc7d Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 6 Oct 2022 20:06:12 +0200 Subject: [PATCH 14/44] iconlaunch - Directly eval apps instead of loading them --- apps/iconlaunch/app.js | 68 ++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/apps/iconlaunch/app.js b/apps/iconlaunch/app.js index 97f7f0ac1..dee237515 100644 --- a/apps/iconlaunch/app.js +++ b/apps/iconlaunch/app.js @@ -2,14 +2,6 @@ const s = require("Storage"); const settings = s.readJSON("launch.json", true) || { showClocks: true, fullscreen: false,direct:false,oneClickExit:false }; - function returnToClock() { - Bangle.setUI(); - setTimeout(eval,0,s.read(".bootcde")); - } - - if( settings.oneClickExit) - setWatch(returnToClock, BTN1); - if (!settings.fullscreen) { if (!global.WIDGETS) Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -58,7 +50,7 @@ const itemSize = iconSize + whitespace; - function drawItem(itemI, r) { + let drawItem = function(itemI, r) { g.clearRect(r.x, r.y, r.x + r.w - 1, r.y + r.h - 1); let x = 0; for (let i = itemI * appsN; i < appsN * (itemI + 1); i++) { @@ -80,9 +72,9 @@ x += iconSize; } drawText(itemI); - } + }; - function drawItemAuto(i) { + let drawItemAuto = function(i) { var y = idxToY(i); g.reset().setClipRect(R.x, y, R.x2, y + itemSize); drawItem(i, { @@ -92,11 +84,11 @@ h: itemSize }); g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); - } + }; let lastIsDown = false; - function drawText(i) { + let drawText = function(i) { const selectedApp = apps[selectedItem]; const idy = (selectedItem - (selectedItem % 3)) / 3; if (!selectedApp || i != idy) return; @@ -111,14 +103,14 @@ appY + rect.height / 2 ); g.drawString(selectedApp.name, R.w / 2, appY); - } + }; - function selectItem(id, e) { + let selectItem = function(id, e) { const iconN = E.clip(Math.floor((e.x - R.x) / itemSize), 0, appsN - 1); const appId = id * appsN + iconN; if( settings.direct && apps[appId]) { - load(apps[appId].src); + loadApp(apps[appId].src); return; } if (appId == selectedItem && apps[appId]) { @@ -131,17 +123,17 @@ } selectedItem = appId; drawItems(); - } + }; - function idxToY(i) { + let idxToY = function(i) { return i * itemSize + R.y - (scroll & ~1); - } + }; - function YtoIdx(y) { + let YtoIdx = function(y) { return Math.floor((y + (scroll & ~1) - R.y) / itemSize); - } + }; - function drawItems() { + let drawItems = function() { g.reset().clearRect(R.x, R.y, R.x2, R.y2); g.setClipRect(R.x, R.y, R.x2, R.y2); var a = YtoIdx(R.y); @@ -154,14 +146,14 @@ h: itemSize, }); g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); - } + }; drawItems(); g.flip(); const itemsN = Math.ceil(apps.length / appsN); - function onDrag(e){ + let onDrag = function(e){ g.setColor(g.theme.fg); g.setBgColor(g.theme.bg); let dy = e.dy; @@ -206,7 +198,7 @@ } } g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); - } + }; Bangle.setUI({ mode: "custom", @@ -217,4 +209,30 @@ selectItem(i, e); }, }); + + const returnToClock = function() { + loadApp(".bootcde"); + }; + + let loadApp = function(name){ + Bangle.setUI(); + //minimize RAM use during load + apps = []; + delete drawItemAuto; + delete drawText; + delete selectItem; + delete onDrag; + delete drawItems; + delete drawItem; + delete returnToClock; + delete idxToY; + delete YtoIdx; + delete settings; + setTimeout(eval,0,s.read(name)); + return; + }; + + if( settings.oneClickExit){ + setWatch(returnToClock, BTN1); + } } From f586bacbf2cae12464b4533a38304a0100cf78cc Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 6 Oct 2022 20:08:21 +0200 Subject: [PATCH 15/44] iconlaunch - Bump version and changelog --- apps/iconlaunch/ChangeLog | 1 + apps/iconlaunch/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/iconlaunch/ChangeLog b/apps/iconlaunch/ChangeLog index fcd7c9194..8426673aa 100644 --- a/apps/iconlaunch/ChangeLog +++ b/apps/iconlaunch/ChangeLog @@ -2,3 +2,4 @@ 0.02: implemented "direct launch" and "one click exit" settings 0.03: Use default Bangle formatter for booleans 0.04: Support new fast app switching +0.05: Directly eval apps instead of loading diff --git a/apps/iconlaunch/metadata.json b/apps/iconlaunch/metadata.json index f1c34cf3d..82d2e7578 100644 --- a/apps/iconlaunch/metadata.json +++ b/apps/iconlaunch/metadata.json @@ -2,7 +2,7 @@ "id": "iconlaunch", "name": "Icon Launcher", "shortName" : "Icon launcher", - "version": "0.04", + "version": "0.05", "icon": "app.png", "description": "A launcher inspired by smartphones, with an icon-only scrollable menu.", "tags": "tool,system,launcher", From e893f10663f7fb4058807647a2531271afbd9c45 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 7 Oct 2022 08:23:21 +0200 Subject: [PATCH 16/44] iconlaunch - Also reset button watch --- apps/iconlaunch/app.js | 63 ++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/apps/iconlaunch/app.js b/apps/iconlaunch/app.js index dee237515..8f4b359fe 100644 --- a/apps/iconlaunch/app.js +++ b/apps/iconlaunch/app.js @@ -1,23 +1,21 @@ { const s = require("Storage"); const settings = s.readJSON("launch.json", true) || { showClocks: true, fullscreen: false,direct:false,oneClickExit:false }; - if (!settings.fullscreen) { if (!global.WIDGETS) Bangle.loadWidgets(); Bangle.drawWidgets(); } - var apps = s .list(/\.info$/) .map((app) => { - var a = s.readJSON(app, 1); + var a = s.readJSON(app, 1); return ( a && { - name: a.name, - type: a.type, - icon: a.icon, - sortorder: a.sortorder, - src: a.src, + name: a.name, + type: a.type, + icon: a.icon, + sortorder: a.sortorder, + src: a.src, } ); }) @@ -30,26 +28,21 @@ ); apps.sort((a, b) => { var n = (0 | a.sortorder) - (0 | b.sortorder); - if (n) return n; // do sortorder first + if (n) return n; if (a.name < b.name) return -1; if (a.name > b.name) return 1; return 0; }); apps.forEach((app) => { - if (app.icon) app.icon = s.read(app.icon); // should just be a link to a memory area + if (app.icon) app.icon = s.read(app.icon); }); - let scroll = 0; let selectedItem = -1; const R = Bangle.appRect; - const iconSize = 48; - const appsN = Math.floor(R.w / iconSize); const whitespace = (R.w - appsN * iconSize) / (appsN + 1); - const itemSize = iconSize + whitespace; - let drawItem = function(itemI, r) { g.clearRect(r.x, r.y, r.x + r.w - 1, r.y + r.h - 1); let x = 0; @@ -57,7 +50,7 @@ if (!apps[i]) break; x += whitespace; if (!apps[i].icon) { - g.setFontAlign(0,0,0).setFont("12x20:2").drawString("?", x + r.x+iconSize/2, r.y + iconSize/2); + g.setFontAlign(0, 0, 0).setFont("12x20:2").drawString("?", x + r.x + iconSize / 2, r.y + iconSize / 2); } else { g.drawImage(apps[i].icon, x + r.x, r.y); } @@ -73,7 +66,6 @@ } drawText(itemI); }; - let drawItemAuto = function(i) { var y = idxToY(i); g.reset().setClipRect(R.x, y, R.x2, y + itemSize); @@ -85,9 +77,7 @@ }); g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); }; - let lastIsDown = false; - let drawText = function(i) { const selectedApp = apps[selectedItem]; const idy = (selectedItem - (selectedItem % 3)) / 3; @@ -104,7 +94,6 @@ ); g.drawString(selectedApp.name, R.w / 2, appY); }; - let selectItem = function(id, e) { const iconN = E.clip(Math.floor((e.x - R.x) / itemSize), 0, appsN - 1); const appId = id * appsN + iconN; @@ -124,15 +113,12 @@ selectedItem = appId; drawItems(); }; - let idxToY = function(i) { return i * itemSize + R.y - (scroll & ~1); }; - let YtoIdx = function(y) { return Math.floor((y + (scroll & ~1) - R.y) / itemSize); }; - let drawItems = function() { g.reset().clearRect(R.x, R.y, R.x2, R.y2); g.setClipRect(R.x, R.y, R.x2, R.y2); @@ -140,20 +126,17 @@ var b = Math.min(YtoIdx(R.y2), 99); for (var i = a; i <= b; i++) drawItem(i, { - x: R.x, - y: idxToY(i), - w: R.w, - h: itemSize, - }); + x: R.x, + y: idxToY(i), + w: R.w, + h: itemSize, + }); g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); }; - drawItems(); g.flip(); - const itemsN = Math.ceil(apps.length / appsN); - - let onDrag = function(e){ + let onDrag = function(e) { g.setColor(g.theme.fg); g.setBgColor(g.theme.bg); let dy = e.dy; @@ -182,7 +165,6 @@ y += itemSize; } } else { - // d>0 g.setClipRect(R.x, R.y, R.x2, R.y + dy); let i = YtoIdx(R.y + dy); let y = idxToY(i); @@ -199,7 +181,6 @@ } g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); }; - Bangle.setUI({ mode: "custom", drag: onDrag, @@ -209,14 +190,13 @@ selectItem(i, e); }, }); - const returnToClock = function() { loadApp(".bootcde"); }; - - let loadApp = function(name){ + let watch; + let loadApp = function(name) { Bangle.setUI(); - //minimize RAM use during load + if (watch) clearWatch(watch); apps = []; delete drawItemAuto; delete drawText; @@ -228,11 +208,10 @@ delete idxToY; delete YtoIdx; delete settings; - setTimeout(eval,0,s.read(name)); + setTimeout(eval, 0, s.read(name)); return; }; - - if( settings.oneClickExit){ - setWatch(returnToClock, BTN1); + if (settings.oneClickExit) { + watch = setWatch(returnToClock, BTN1); } } From e59dade545c9232c265636a7ceb192674e889668 Mon Sep 17 00:00:00 2001 From: storm64 Date: Fri, 7 Oct 2022 20:56:19 +0200 Subject: [PATCH 17/44] [waypointer] Update ChangeLog --- apps/waypointer/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/waypointer/ChangeLog b/apps/waypointer/ChangeLog index 292d77a99..ea86cbe0c 100644 --- a/apps/waypointer/ChangeLog +++ b/apps/waypointer/ChangeLog @@ -2,3 +2,4 @@ 0.02: Make Bangle.js 2 compatible 0.03: Silently use built in heading when no magnav calibration file is present 0.04: Move waypoints.json (and editor) to 'waypoints' app +0.05: Fix not displaying of wpindex = 0 From 070991120ef2a84649c7068600f2bfeda58a5416 Mon Sep 17 00:00:00 2001 From: storm64 Date: Fri, 7 Oct 2022 20:58:44 +0200 Subject: [PATCH 18/44] [waypointer] Update metadata.js --- apps/waypointer/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/waypointer/metadata.json b/apps/waypointer/metadata.json index 8b923c604..a55db8c0e 100644 --- a/apps/waypointer/metadata.json +++ b/apps/waypointer/metadata.json @@ -1,7 +1,7 @@ { "id": "waypointer", "name": "Way Pointer", - "version": "0.04", + "version": "0.05", "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", From 4b702ccfca91923b6fcb4950339372df866a0582 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 20:05:02 +0100 Subject: [PATCH 19/44] Create PrimeTime --- apps/PrimeTime | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 apps/PrimeTime diff --git a/apps/PrimeTime b/apps/PrimeTime new file mode 100644 index 000000000..66e9a8e14 --- /dev/null +++ b/apps/PrimeTime @@ -0,0 +1,89 @@ +const h = g.getHeight(); +const w = g.getWidth(); + + + +// creates a list of prime factors of n and outputs them as a string, if n is prime outputs "Prime Time!" +function primeFactors(n) { + const factors = []; + let divisor = 2; + + while (n >= 2) { + if (n % divisor == 0) { + factors.push(divisor); + n = n / divisor; + } else { + divisor++; + } + } + if (factors.length === 1) { + return "Prime Time!"; + } + else + return factors.toString(); +} + + +// converts time HR:MIN to integer HRMIN e.g. 15:35 => 1535 +function timeToInt(t) { + var arr = t.split(':'); + var intTime = parseInt(arr[0])*100+parseInt(arr[1]); + + return intTime; +} + + + +function draw() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var primeStr = primeFactors(timeToInt(timeStr)); + + g.reset(); + g.setColor(0,0,0); + g.fillRect(Bangle.appRect); + + g.setFont("6x8", w/30); + g.setFontAlign(0, 0); + g.setColor(100,100,100); + g.drawString(timeStr, w/2, h/2); + g.setFont("6x8", w/60); + g.drawString(primStr, w/2, 3*h/4); + queueDraw(); +} + +// 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)); +} + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +g.clear(); + +// Show launcher when middle button pressed +// Bangle.setUI("clock"); +// use clockupdown as it tests for issue #1249 +Bangle.setUI("clockupdown", btn=> { + draw(); +}); + +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From 4aa05ecaf75818901a3951abf8d5d7d68fd6add7 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 20:10:30 +0100 Subject: [PATCH 20/44] Delete PrimeTime --- apps/PrimeTime | 89 -------------------------------------------------- 1 file changed, 89 deletions(-) delete mode 100644 apps/PrimeTime diff --git a/apps/PrimeTime b/apps/PrimeTime deleted file mode 100644 index 66e9a8e14..000000000 --- a/apps/PrimeTime +++ /dev/null @@ -1,89 +0,0 @@ -const h = g.getHeight(); -const w = g.getWidth(); - - - -// creates a list of prime factors of n and outputs them as a string, if n is prime outputs "Prime Time!" -function primeFactors(n) { - const factors = []; - let divisor = 2; - - while (n >= 2) { - if (n % divisor == 0) { - factors.push(divisor); - n = n / divisor; - } else { - divisor++; - } - } - if (factors.length === 1) { - return "Prime Time!"; - } - else - return factors.toString(); -} - - -// converts time HR:MIN to integer HRMIN e.g. 15:35 => 1535 -function timeToInt(t) { - var arr = t.split(':'); - var intTime = parseInt(arr[0])*100+parseInt(arr[1]); - - return intTime; -} - - - -function draw() { - var date = new Date(); - var timeStr = require("locale").time(date,1); - var primeStr = primeFactors(timeToInt(timeStr)); - - g.reset(); - g.setColor(0,0,0); - g.fillRect(Bangle.appRect); - - g.setFont("6x8", w/30); - g.setFontAlign(0, 0); - g.setColor(100,100,100); - g.drawString(timeStr, w/2, h/2); - g.setFont("6x8", w/60); - g.drawString(primStr, w/2, 3*h/4); - queueDraw(); -} - -// 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)); -} - -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); - -g.clear(); - -// Show launcher when middle button pressed -// Bangle.setUI("clock"); -// use clockupdown as it tests for issue #1249 -Bangle.setUI("clockupdown", btn=> { - draw(); -}); - -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); -draw(); From c796889b16e96692ccb34fe0aa4e4cc3276f13e4 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:01:24 +0100 Subject: [PATCH 21/44] Create primetime.js --- apps/primetime/primetime.js | 89 +++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 apps/primetime/primetime.js diff --git a/apps/primetime/primetime.js b/apps/primetime/primetime.js new file mode 100644 index 000000000..66e9a8e14 --- /dev/null +++ b/apps/primetime/primetime.js @@ -0,0 +1,89 @@ +const h = g.getHeight(); +const w = g.getWidth(); + + + +// creates a list of prime factors of n and outputs them as a string, if n is prime outputs "Prime Time!" +function primeFactors(n) { + const factors = []; + let divisor = 2; + + while (n >= 2) { + if (n % divisor == 0) { + factors.push(divisor); + n = n / divisor; + } else { + divisor++; + } + } + if (factors.length === 1) { + return "Prime Time!"; + } + else + return factors.toString(); +} + + +// converts time HR:MIN to integer HRMIN e.g. 15:35 => 1535 +function timeToInt(t) { + var arr = t.split(':'); + var intTime = parseInt(arr[0])*100+parseInt(arr[1]); + + return intTime; +} + + + +function draw() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var primeStr = primeFactors(timeToInt(timeStr)); + + g.reset(); + g.setColor(0,0,0); + g.fillRect(Bangle.appRect); + + g.setFont("6x8", w/30); + g.setFontAlign(0, 0); + g.setColor(100,100,100); + g.drawString(timeStr, w/2, h/2); + g.setFont("6x8", w/60); + g.drawString(primStr, w/2, 3*h/4); + queueDraw(); +} + +// 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)); +} + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +g.clear(); + +// Show launcher when middle button pressed +// Bangle.setUI("clock"); +// use clockupdown as it tests for issue #1249 +Bangle.setUI("clockupdown", btn=> { + draw(); +}); + +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From 7657dad208615baaeb00e660594073027fafe0d1 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:10:19 +0100 Subject: [PATCH 22/44] Create README.md --- apps/primetime/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 apps/primetime/README.md diff --git a/apps/primetime/README.md b/apps/primetime/README.md new file mode 100644 index 000000000..a85d03e00 --- /dev/null +++ b/apps/primetime/README.md @@ -0,0 +1,10 @@ +# App Name + +Watchface that displays time and the prime factors of the "military time" (i.e. 15:34 => 1534, shows prime factors of 1534). Displays "Prime Time!" if prime. + +![image](https://user-images.githubusercontent.com/115424919/194777279-7f5e4d2a-f475-4099-beaf-38db5b460714.png) + + +## Creator + +Adapted from simplestclock by [Eve Bury](https://www.github.com/eveeeon) From 14bebdc68333f66c22117f5364761457ca00c35e Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:10:54 +0100 Subject: [PATCH 23/44] Update primetime.js --- apps/primetime/primetime.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/primetime/primetime.js b/apps/primetime/primetime.js index 66e9a8e14..bba63bc48 100644 --- a/apps/primetime/primetime.js +++ b/apps/primetime/primetime.js @@ -48,7 +48,7 @@ function draw() { g.setColor(100,100,100); g.drawString(timeStr, w/2, h/2); g.setFont("6x8", w/60); - g.drawString(primStr, w/2, 3*h/4); + g.drawString(primeStr, w/2, 3*h/4); queueDraw(); } From 9cd10311f7e8ecd39fc110043ed97f8b550718d2 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:20:16 +0100 Subject: [PATCH 24/44] Create app.png --- apps/primetime/app.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/primetime/app.png diff --git a/apps/primetime/app.png b/apps/primetime/app.png new file mode 100644 index 000000000..2d5c63f0d --- /dev/null +++ b/apps/primetime/app.png @@ -0,0 +1 @@ +https://user-images.githubusercontent.com/115424919/194777279-7f5e4d2a-f475-4099-beaf-38db5b460714.png From e8b70261712d0a00a71d7a28c4c3281b515c4054 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:23:33 +0100 Subject: [PATCH 25/44] Create primetime-icon.js --- apps/primetime/primetime-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/primetime/primetime-icon.js diff --git a/apps/primetime/primetime-icon.js b/apps/primetime/primetime-icon.js new file mode 100644 index 000000000..cf60105c5 --- /dev/null +++ b/apps/primetime/primetime-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("atob("uLQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAHwAAAAAAAD//gB////AAAAAAAP/+AAAfAAAAAAAAP/+AH///8AAAAAAA//4AAB8AAAAAAAA//4Af///wAAAAAAD//gAAHwAAAAAAAD//gB////AAAAAAAP/+AAAfAAAAAAAAP/+AH///8AAAAAAfAAHwA/8AAAB8AAfAD/wfAAAAAAAAAB8AAfAD/wAAAHwAB8AP/B8AAAAAAAAAHwAB8AP/AAAAfAAHwA/8HwAAAAAAAAAfAAHwA/8AAAB8AAfAD/wfAAAAAAAAAB8AAfAD/wAAAHwAB8AP/B8AAAAAAAAAAAAB8HwfAAAAfAAHwfB8H//+AAAAAAAAAAHwfB8AAAB8AAfB8Hwf//4AAAAAAAAAAfB8HwAAAHwAB8HwfB///gAAAAAAAAAB8HwfAAAAfAAHwfB8H//+AAAAAAAAAAHwfB8AAAB8AAfB8Hwf//4AAAAAAAD//gAAHwAAAAAAB8HwfAAAAfAAAAAAAP/+AAAfAAAAAAAHwfB8AAAB8AAAAAAA//4AAB8AAAAAAAfB8HwAAAHwAAAAAAD//gAAHwAAAAAAB8HwfAAAAfAAAAAAAP/+AAAfAAAAAAAHwfB8AAAB8AAAAAAfAAAAAB8AAAB8AAf+AHwfAAHwAAAAAB8AAAAAHwAAAHwAB/4AfB8AAfAAAAAAHwAAAAAfAAAAfAAH/gB8HwAB8AAAAAAfAAAAAB8AAAB8AAf+AHwfAAHwAAAAAB8AAAAAHwAAAHwAB/4AfB8AAfAAAAAAH///8H///8AAfAAAP/+AAP/+AAAAAAAf///wf///wAB8AAA//4AA//4AAAAAAB////B////AAHwAAD//gAD//gAAAAAAH///8H///8AAfAAAP/+AAP/+AAAAAAAf///wf///wAB8AAA//4AA//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAADA/AMAAAAAAAAAAAAAAAAAAAAAP/AAAMD8AwAAAAAAAAAAAAAAAAAAAAAwAAADwwMPAAAAAAAAAAAAAAAAAAAAADAAAAPDAw8AAAAAAAAAAAAAAAAAAAAAP8AADMADMwAAAAAAAAAAAAAAAAAAAAA/wAAMwAMzAAAAAAAAAAAAAAAAAAAAAAAwADDA/AMAAAAAAAAAAAAAAAAAAAAAADAAMMD8AwAAAAAAAAAAAAAAAAAAAAAwMDA/8wADAAAAAAAAAAAAAAAAAAAAADAwMD/zAAMAAAAAAAAAAAAAAAAAAAAAD8AwAMP/P/AAAAAAAAAAAAAAAAAAAAAPwDAAw/8/8AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")") From de709f7ad07c39efae4d88fb71386733c6623757 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:24:28 +0100 Subject: [PATCH 26/44] Create metadata.json --- apps/primetime/metadata.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 apps/primetime/metadata.json diff --git a/apps/primetime/metadata.json b/apps/primetime/metadata.json new file mode 100644 index 000000000..8d56f24b0 --- /dev/null +++ b/apps/primetime/metadata.json @@ -0,0 +1,10 @@ +{ "id": "primetime", + "name": "Prime Time Clock", + "type": "clock", + "description": "A clock that tells you the primes of the time", + "tags": "clock", + "storage": [ + {"name":"primetime.app.js","url":"primetime.js"}, + {"name":"primetime.img","url":"primetime-icon.js","evaluate":true} + ], +}, From acc9461e92ada3fe8b38d63db1de9270414a3dbc Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:25:45 +0100 Subject: [PATCH 27/44] Update README.md --- apps/primetime/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/primetime/README.md b/apps/primetime/README.md index a85d03e00..a07c19f52 100644 --- a/apps/primetime/README.md +++ b/apps/primetime/README.md @@ -1,6 +1,6 @@ # App Name -Watchface that displays time and the prime factors of the "military time" (i.e. 15:34 => 1534, shows prime factors of 1534). Displays "Prime Time!" if prime. +Watchface that displays time and the prime factors of the "military time" (i.e. 21:05 => 2105, shows prime factors of 2105 which are 5 & 421). Displays "Prime Time!" if prime. ![image](https://user-images.githubusercontent.com/115424919/194777279-7f5e4d2a-f475-4099-beaf-38db5b460714.png) From 598710280eba21fe22deb16d55046d903f3dc111 Mon Sep 17 00:00:00 2001 From: Eveeeon <115424919+Eveeeon@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:28:35 +0100 Subject: [PATCH 28/44] Update primetime-icon.js --- apps/primetime/primetime-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/primetime/primetime-icon.js b/apps/primetime/primetime-icon.js index cf60105c5..0fe90eb12 100644 --- a/apps/primetime/primetime-icon.js +++ b/apps/primetime/primetime-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("atob("uLQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAHwAAAAAAAD//gB////AAAAAAAP/+AAAfAAAAAAAAP/+AH///8AAAAAAA//4AAB8AAAAAAAA//4Af///wAAAAAAD//gAAHwAAAAAAAD//gB////AAAAAAAP/+AAAfAAAAAAAAP/+AH///8AAAAAAfAAHwA/8AAAB8AAfAD/wfAAAAAAAAAB8AAfAD/wAAAHwAB8AP/B8AAAAAAAAAHwAB8AP/AAAAfAAHwA/8HwAAAAAAAAAfAAHwA/8AAAB8AAfAD/wfAAAAAAAAAB8AAfAD/wAAAHwAB8AP/B8AAAAAAAAAAAAB8HwfAAAAfAAHwfB8H//+AAAAAAAAAAHwfB8AAAB8AAfB8Hwf//4AAAAAAAAAAfB8HwAAAHwAB8HwfB///gAAAAAAAAAB8HwfAAAAfAAHwfB8H//+AAAAAAAAAAHwfB8AAAB8AAfB8Hwf//4AAAAAAAD//gAAHwAAAAAAB8HwfAAAAfAAAAAAAP/+AAAfAAAAAAAHwfB8AAAB8AAAAAAA//4AAB8AAAAAAAfB8HwAAAHwAAAAAAD//gAAHwAAAAAAB8HwfAAAAfAAAAAAAP/+AAAfAAAAAAAHwfB8AAAB8AAAAAAfAAAAAB8AAAB8AAf+AHwfAAHwAAAAAB8AAAAAHwAAAHwAB/4AfB8AAfAAAAAAHwAAAAAfAAAAfAAH/gB8HwAB8AAAAAAfAAAAAB8AAAB8AAf+AHwfAAHwAAAAAB8AAAAAHwAAAHwAB/4AfB8AAfAAAAAAH///8H///8AAfAAAP/+AAP/+AAAAAAAf///wf///wAB8AAA//4AA//4AAAAAAB////B////AAHwAAD//gAD//gAAAAAAH///8H///8AAfAAAP/+AAP/+AAAAAAAf///wf///wAB8AAA//4AA//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAADA/AMAAAAAAAAAAAAAAAAAAAAAP/AAAMD8AwAAAAAAAAAAAAAAAAAAAAAwAAADwwMPAAAAAAAAAAAAAAAAAAAAADAAAAPDAw8AAAAAAAAAAAAAAAAAAAAAP8AADMADMwAAAAAAAAAAAAAAAAAAAAA/wAAMwAMzAAAAAAAAAAAAAAAAAAAAAAAwADDA/AMAAAAAAAAAAAAAAAAAAAAAADAAMMD8AwAAAAAAAAAAAAAAAAAAAAAwMDA/8wADAAAAAAAAAAAAAAAAAAAAADAwMD/zAAMAAAAAAAAAAAAAAAAAAAAAD8AwAMP/P/AAAAAAAAAAAAAAAAAAAAAPwDAAw/8/8AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")") +require("heatshrink").decompress(atob("sLABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAfAAAAAAAAP/+AAAf+AAAAAAD//gAAHwAAAAAAAD//gAAH/gAAAAAA//4AAB8AAAAAAAA//4AAB/4AAAAAAP/+AAAfAAAAAAAAP/+AAAf+AAAAAAD//gAAHwAAAAAAAD//gAAH/gAAAAAfAAHwA/8AAAB8AAfAAHwA+AAAAAAAHwAB8AP/AAAAfAAHwAB8APgAAAAAAB8AAfAD/wAAAHwAB8AAfAD4AAAAAAAfAAHwA/8AAAB8AAfAAHwA+AAAAAAAHwAB8AP/AAAAfAAHwAB8APgAAAAAAAAAAfB8HwAAAHwAAAAAfB///gAAAAAAAAHwfB8AAAB8AAAAAHwf//4AAAAAAAAB8HwfAAAAfAAAAAB8H//+AAAAAAAAAfB8HwAAAHwAAAAAfB///gAAAAAAAAHwfB8AAAB8AAAAAHwf//4AAAAAAP/+AAAfAAAAAAAAP/+AHwAB8AAAAAD//gAAHwAAAAAAAD//gB8AAfAAAAAA//4AAB8AAAAAAAA//4AfAAHwAAAAAP/+AAAfAAAAAAAAP/+AHwAB8AAAAAD//gAAHwAAAAAAAD//gB8AAfAAAAAfAAAAAB8AAAB8AAfAAAAfAAHwAAAAHwAAAAAfAAAAfAAHwAAAHwAB8AAAAB8AAAAAHwAAAHwAB8AAAB8AAfAAAAAfAAAAAB8AAAB8AAfAAAAfAAHwAAAAHwAAAAAfAAAAfAAHwAAAHwAB8AAAAB////B////AAHwAB////AD//gAAAAAf///wf///wAB8AAf///wA//4AAAAAH///8H///8AAfAAH///8AP/+AAAAAB////B////AAHwAB////AD//gAAAAAf///wf///wAB8AAf///wA//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAMA/APA/AAAAAAAAAAAAAAAAAAPwAADAPwDwPwAAAAAAAAAAAAAAAAAMDAADwMPDAMDAAAAAAAAAAAAAAAAADAwAA8DDwwDAwAAAAAAAAAAAAAAAAAAMAAzAzM/wDwAAAAAAAAAAAAAAAAAADAAMwMzP8A8AAAAAAAAAAAAAAAAAA/AAAMDMzAwAwAAAAAAAAAAAAAAAAAPwAADAzMwMAMAAAAAAAAAAAAAAAAAMAAwAwPDMDMDAAAAAAAAAAAAAAAAADAAMAMDwzAzAwAAAAAAAAAAAAAAAAA/8DA/8PwPwPwAAAAAAAAAAAAAAAAAP/AwP/D8D8D8AAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")) From 82492b90186ecf2e619cc0cb6c23035d15581d6f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 10 Oct 2022 10:36:03 +0100 Subject: [PATCH 29/44] tweaks to first primetime release --- apps/primetime/app.png | Bin 103 -> 10147 bytes apps/primetime/metadata.json | 9 +++++++-- apps/primetime/primetime-icon.js | 2 +- apps/primetime/screenshot.png | Bin 0 -> 2024 bytes 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 apps/primetime/screenshot.png diff --git a/apps/primetime/app.png b/apps/primetime/app.png index 2d5c63f0d0f51a7cd64f3323a16badb5bff96dcd..5024727fbaf7ab089da427bcc462fa5c8480604b 100644 GIT binary patch literal 10147 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 Date: Wed, 12 Oct 2022 16:28:26 +0100 Subject: [PATCH 32/44] Improve search, and now order searches by the relevance of the search result --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index be7115722..371fa63ae 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit be7115722d8e85d1a890585d2812d5ff6079762c +Subproject commit 371fa63ae0cd69d5be52a4189400190e86491651 From 0af49fc6d911e5ad56f9c01d8ca039dac0fe1369 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 12 Oct 2022 16:33:56 +0100 Subject: [PATCH 33/44] move searchRelevance to utils, and fix CI tests --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 371fa63ae..764197500 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 371fa63ae0cd69d5be52a4189400190e86491651 +Subproject commit 76419750083a88ee7a569db3975ae1bdd6dc155a From 89a8d9a0263404725e8a14468d8c120593acda0e Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 20:30:12 +0200 Subject: [PATCH 34/44] gpstrek - Differentiate between starting/stopping for usage and background --- apps/gpstrek/app.js | 6 +++--- apps/gpstrek/widget.js | 15 ++++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/gpstrek/app.js b/apps/gpstrek/app.js index 091c407fb..057d01388 100644 --- a/apps/gpstrek/app.js +++ b/apps/gpstrek/app.js @@ -7,7 +7,7 @@ if (showWidgets){ } let state = WIDGETS["gpstrek"].getState(); -WIDGETS["gpstrek"].start(); +WIDGETS["gpstrek"].start(false); function parseNumber(toParse){ if (toParse.includes(".")) return parseFloat(toParse); @@ -591,8 +591,8 @@ function showMenu(){ "Route" : showRouteMenu, "Waypoint" : showWaypointMenu, "Calibration": showCalibrationMenu, - "Start" : ()=>{ E.showPrompt("Start?").then((v)=>{ if (v) {state.active = true; removeMenu();} else {E.showMenu(mainmenu);}});}, - "Stop" : ()=>{ E.showPrompt("Stop?").then((v)=>{ if (v) {WIDGETS["gpstrek"].stop(); removeMenu();} else {E.showMenu(mainmenu);}});}, + "Start" : ()=>{ E.showPrompt("Start?").then((v)=>{ if (v) {WIDGETS["gpstrek"].start(true); removeMenu();} else {E.showMenu(mainmenu);}});}, + "Stop" : ()=>{ E.showPrompt("Stop?").then((v)=>{ if (v) {WIDGETS["gpstrek"].stop(true); removeMenu();} else {E.showMenu(mainmenu);}});}, "Reset" : ()=>{ E.showPrompt("Do Reset?").then((v)=>{ if (v) {WIDGETS["gpstrek"].resetState(); removeMenu();} else {E.showMenu(mainmenu);}});}, "Slices" : { value : numberOfSlices, diff --git a/apps/gpstrek/widget.js b/apps/gpstrek/widget.js index bba1298d0..acb8e016a 100644 --- a/apps/gpstrek/widget.js +++ b/apps/gpstrek/widget.js @@ -72,7 +72,7 @@ function onPressure(e) { } } -function start(){ +function start(bg){ Bangle.on('GPS', onGPS); Bangle.on("HRM", onPulse); Bangle.on("mag", onMag); @@ -83,13 +83,18 @@ function start(){ Bangle.setHRMPower(1, "gpstrek"); Bangle.setCompassPower(1, "gpstrek"); Bangle.setBarometerPower(1, "gpstrek"); - state.active = true; + if (bg){ + state.active = true; + saveState(); + } Bangle.drawWidgets(); } -function stop(){ - state.active = false; - saveState(); +function stop(bg){ + if (bg){ + state.active = false; + saveState(); + } Bangle.drawWidgets(); } From 50c3d764d9568253c5096c9e12259ce58cf31fb7 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 20:36:47 +0200 Subject: [PATCH 35/44] gpstrek - Make starting and stopping the background activity more explicit --- apps/gpstrek/app.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/gpstrek/app.js b/apps/gpstrek/app.js index 057d01388..0c3579d4b 100644 --- a/apps/gpstrek/app.js +++ b/apps/gpstrek/app.js @@ -6,8 +6,8 @@ if (showWidgets){ Bangle.loadWidgets(); } -let state = WIDGETS["gpstrek"].getState(); -WIDGETS["gpstrek"].start(false); +let state = WIDGETS.gpstrek.getState(); +WIDGETS.gpstrek.start(false); function parseNumber(toParse){ if (toParse.includes(".")) return parseFloat(toParse); @@ -582,6 +582,18 @@ function showWaypointMenu(){ E.showMenu(menu); } +function showBackgroundMenu(){ + let menu = { + "" : { + "title" : "Background", + back : showMenu, + }, + "Start" : ()=>{ E.showPrompt("Start?").then((v)=>{ if (v) {WIDGETS.gpstrek.start(true); removeMenu();} else {E.showMenu(mainmenu);}});}, + "Stop" : ()=>{ E.showPrompt("Stop?").then((v)=>{ if (v) {WIDGETS.gpstrek.stop(true); removeMenu();} else {E.showMenu(mainmenu);}});}, + }; + E.showMenu(menu); +} + function showMenu(){ var mainmenu = { "" : { @@ -590,10 +602,9 @@ function showMenu(){ }, "Route" : showRouteMenu, "Waypoint" : showWaypointMenu, + "Background" : showBackgroundMenu, "Calibration": showCalibrationMenu, - "Start" : ()=>{ E.showPrompt("Start?").then((v)=>{ if (v) {WIDGETS["gpstrek"].start(true); removeMenu();} else {E.showMenu(mainmenu);}});}, - "Stop" : ()=>{ E.showPrompt("Stop?").then((v)=>{ if (v) {WIDGETS["gpstrek"].stop(true); removeMenu();} else {E.showMenu(mainmenu);}});}, - "Reset" : ()=>{ E.showPrompt("Do Reset?").then((v)=>{ if (v) {WIDGETS["gpstrek"].resetState(); removeMenu();} else {E.showMenu(mainmenu);}});}, + "Reset" : ()=>{ E.showPrompt("Do Reset?").then((v)=>{ if (v) {WIDGETS.gpstrek.resetState(); removeMenu();} else {E.showMenu(mainmenu);}});}, "Slices" : { value : numberOfSlices, min:1,max:6,step:1, From f12c25cb784b0956118e01d3fa9e91db03eb7bc3 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 20:41:47 +0200 Subject: [PATCH 36/44] gpstrek - Bump version --- apps/gpstrek/ChangeLog | 1 + apps/gpstrek/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/gpstrek/ChangeLog b/apps/gpstrek/ChangeLog index 5560f00bc..2f1a9ce45 100644 --- a/apps/gpstrek/ChangeLog +++ b/apps/gpstrek/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Make selection of background activity more explicit diff --git a/apps/gpstrek/metadata.json b/apps/gpstrek/metadata.json index 5168c870e..f0fe0c7e0 100644 --- a/apps/gpstrek/metadata.json +++ b/apps/gpstrek/metadata.json @@ -1,7 +1,7 @@ { "id": "gpstrek", "name": "GPS Trekking", - "version": "0.01", + "version": "0.02", "description": "Helper for tracking the status/progress during hiking. Do NOT depend on this for navigation!", "icon": "icon.png", "screenshots": [{"url":"screen1.png"},{"url":"screen2.png"},{"url":"screen3.png"},{"url":"screen4.png"}], From c2d55ab0312dafe143c4046d6058c3cfa2dce5dd Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 21:10:30 +0200 Subject: [PATCH 37/44] gpstrek - Adds state file as data --- apps/gpstrek/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/gpstrek/metadata.json b/apps/gpstrek/metadata.json index f0fe0c7e0..67f71566e 100644 --- a/apps/gpstrek/metadata.json +++ b/apps/gpstrek/metadata.json @@ -13,5 +13,6 @@ {"name":"gpstrek.app.js","url":"app.js"}, {"name":"gpstrek.wid.js","url":"widget.js"}, {"name":"gpstrek.img","url":"app-icon.js","evaluate":true} - ] + ], + "data": [{"name":"gpstrek.state.json"}] } From 6dbd99fdabe3d1c38a1ec31037b3ea3870e7ead5 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 21:13:07 +0200 Subject: [PATCH 38/44] gpstrek - Only store state file if needed --- apps/gpstrek/widget.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/gpstrek/widget.js b/apps/gpstrek/widget.js index acb8e016a..8d9831e06 100644 --- a/apps/gpstrek/widget.js +++ b/apps/gpstrek/widget.js @@ -1,6 +1,7 @@ (() => { const STORAGE=require('Storage'); let state = STORAGE.readJSON("gpstrek.state.json")||{}; +let bgChanged = false; function saveState(){ state.saved = Date.now(); @@ -8,7 +9,7 @@ function saveState(){ } E.on("kill",()=>{ - if (state.active){ + if (bgChanged){ saveState(); } }); @@ -84,6 +85,7 @@ function start(bg){ Bangle.setCompassPower(1, "gpstrek"); Bangle.setBarometerPower(1, "gpstrek"); if (bg){ + if (!state.active) bgChanged = true; state.active = true; saveState(); } @@ -92,6 +94,7 @@ function start(bg){ function stop(bg){ if (bg){ + if (state.active) bgChanged = true; state.active = false; saveState(); } @@ -112,7 +115,7 @@ if (state.saved && state.saved < Date.now() - 60000){ } if (state.active){ - start(); + start(false); } WIDGETS["gpstrek"]={ From 453885fccd12f3ee546aada676cd2313a68cfa4b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 21:22:30 +0200 Subject: [PATCH 39/44] gpstrek - Update readme --- apps/gpstrek/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/gpstrek/README.md b/apps/gpstrek/README.md index eecf4d087..439b7497a 100644 --- a/apps/gpstrek/README.md +++ b/apps/gpstrek/README.md @@ -39,5 +39,9 @@ If the compass fallback starts to show unreliable values, you can reset the cali ## Widget -The widget keeps the sensors alive and records some very basic statics when the app is not started. -This uses a lot of power so ensure to stop the app if you are not actively using it. +The widget keeps the sensors alive and records some very basic statistics when the app is not started. It shows as the app icon in the widget bar when the background task is active. +This uses a lot of power so ensure to stop the app if you are not actively using it. + +# Creator + +[halemmerich](https://github.com/halemmerich) From f3118e8fe0063905aa671166ec2928edc30a12be Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 22:09:51 +0200 Subject: [PATCH 40/44] iconlaunch - Adds setting for fast loading apps --- apps/iconlaunch/app.js | 44 ++++++++++++++++++++++--------------- apps/iconlaunch/settings.js | 4 ++++ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/apps/iconlaunch/app.js b/apps/iconlaunch/app.js index 8f4b359fe..50c55d155 100644 --- a/apps/iconlaunch/app.js +++ b/apps/iconlaunch/app.js @@ -107,7 +107,7 @@ if (!app.src || s.read(app.src) === undefined) { E.showMessage( /*LANG*/ "App Source\nNot found"); } else { - load(app.src); + loadApp(app.src); } } selectedItem = appId; @@ -194,23 +194,31 @@ loadApp(".bootcde"); }; let watch; - let loadApp = function(name) { - Bangle.setUI(); - if (watch) clearWatch(watch); - apps = []; - delete drawItemAuto; - delete drawText; - delete selectItem; - delete onDrag; - delete drawItems; - delete drawItem; - delete returnToClock; - delete idxToY; - delete YtoIdx; - delete settings; - setTimeout(eval, 0, s.read(name)); - return; - }; + let loadApp; + if (settings.fastload){ + loadApp = function(name) { + Bangle.setUI(); + if (watch) clearWatch(watch); + apps = []; + delete drawItemAuto; + delete drawText; + delete selectItem; + delete onDrag; + delete drawItems; + delete drawItem; + delete returnToClock; + delete idxToY; + delete YtoIdx; + delete settings; + setTimeout(eval, 0, s.read(name)); + return; + }; + } else { + loadApp = function(name) { + load(name); + } + } + if (settings.oneClickExit) { watch = setWatch(returnToClock, BTN1); } diff --git a/apps/iconlaunch/settings.js b/apps/iconlaunch/settings.js index bd1a4a597..449a1c096 100644 --- a/apps/iconlaunch/settings.js +++ b/apps/iconlaunch/settings.js @@ -28,6 +28,10 @@ /*LANG*/"One click exit": { value: settings.oneClickExit == true, onchange: (m) => { save("oneClickExit", m) } + }, + /*LANG*/"Fastload": { + value: settings.fastload == true, + onchange: (m) => { save("fastload", m) } } }; E.showMenu(appMenu); From 10e8062a08382b99d71778439bc78a195343872b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 22:26:09 +0200 Subject: [PATCH 41/44] iconlaunch - Update readme --- apps/iconlaunch/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/iconlaunch/README.md b/apps/iconlaunch/README.md index 0d36fdeb4..0b67494ce 100644 --- a/apps/iconlaunch/README.md +++ b/apps/iconlaunch/README.md @@ -10,3 +10,7 @@ This launcher shows 9 apps per screen, making it much faster to navigate versus ## Technical note The app uses `E.showScroller`'s code in the app but not the function itself because `E.showScroller` doesn't report the position of a press to the select function. + +### Fastload option + +Fastload clears up the memory used by the launcher and directly evals the code of the app to load. This means if widgets are loaded (fullscreen option) it is possible that widgets stay loaded in apps not expecting that and the widgets may draw over the app. From 58308103c115f79aa4e173e462472dcb76ac265c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 22:26:33 +0200 Subject: [PATCH 42/44] iconlaunch - Remove redundant check --- apps/iconlaunch/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/iconlaunch/app.js b/apps/iconlaunch/app.js index 50c55d155..fd58176db 100644 --- a/apps/iconlaunch/app.js +++ b/apps/iconlaunch/app.js @@ -2,7 +2,7 @@ const s = require("Storage"); const settings = s.readJSON("launch.json", true) || { showClocks: true, fullscreen: false,direct:false,oneClickExit:false }; if (!settings.fullscreen) { - if (!global.WIDGETS) Bangle.loadWidgets(); + Bangle.loadWidgets(); Bangle.drawWidgets(); } var apps = s From 145bde8240290a0075f7052da215fcf88abc1a95 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 13 Oct 2022 22:41:20 +0200 Subject: [PATCH 43/44] iconlaunch - Modify changelog --- apps/iconlaunch/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/iconlaunch/ChangeLog b/apps/iconlaunch/ChangeLog index 8426673aa..858d13b80 100644 --- a/apps/iconlaunch/ChangeLog +++ b/apps/iconlaunch/ChangeLog @@ -2,4 +2,4 @@ 0.02: implemented "direct launch" and "one click exit" settings 0.03: Use default Bangle formatter for booleans 0.04: Support new fast app switching -0.05: Directly eval apps instead of loading +0.05: Allow to directly eval apps instead of loading From da9c6a1d960c3524ca0b0be741eda00bb73e0d2b Mon Sep 17 00:00:00 2001 From: Gabriele Monaco Date: Fri, 14 Oct 2022 09:37:17 +0200 Subject: [PATCH 44/44] agenda: added troubleshooting guidelines to the README --- apps/agenda/README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/agenda/README.md b/apps/agenda/README.md index 7063a70a2..1a0ec9264 100644 --- a/apps/agenda/README.md +++ b/apps/agenda/README.md @@ -10,11 +10,21 @@ Basic agenda reading the events synchronised from GadgetBridge. * Show the colour of the calendar in the list * Display description, location and calendar name after tapping on events +### Troubleshooting + +For the events sync to work, GadgetBridge needs to have the calendar permission and calendar sync should be enabled in the devices settings (gear sign in GB, also check the blacklisted calendars there, if events are missing). +Keep in mind that GadgetBridge won't synchronize all events on your calendar, just the ones in a time window of 7 days (you don't want your watch to explode), ideally every day old events get deleted since they appear out of such window. + +#### Force Sync + +If for any reason events still cannot sync or some are missing, you can try any of the following (just one, you normally don't need to do this): +1. from GB open the burger menu (side), tap debug and set time. +2. from the bangle, open settings > apps > agenda > Force calendar sync, then select not to delete the local events (this is equivalent to option 1). +3. do like option 2 but delete events, GB will synchronize a fresh database instead of patching the old one (good in case you somehow cannot get rid of older events) + +After any of the options, you may need to disconnect/force close Gadgetbridge before reconnecting and let it sync (give it some time for that too), restart the agenda app on the bangle after a while to see the changes. + ### Report a bug You can easily open an issue in the espruino repo, but I won't be notified and it might take time. If you want a (hopefully) quicker response, just report [on my fork](https://github.com/glemco/BangleApps). - -### Known Problems - -Any all-day event lasts just one day: that is a GB limitation that we will likely fix in the future.