From 798ce38600a209e1c2f386ecefd62cd730561ede Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 01:22:43 +0300 Subject: [PATCH 01/24] added timestamp --- apps/accelrec/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index cf434fd7b..175801ee5 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -6,6 +6,7 @@ var THRESH = 1.04; var accelx = new Int16Array(SAMPLES); var accely = new Int16Array(SAMPLES); // North var accelz = new Int16Array(SAMPLES); // Into clock face +var timestep = new Int16Array(SAMPLES); // Into clock face var accelIdx = 0; var lastAccel; function accelHandlerTrigger(a) {"ram" @@ -26,6 +27,7 @@ function accelHandlerRecord(a) {"ram" accelx[i] = a.x*SCALE*2; accely[i] = -a.y*SCALE*2; accelz[i] = a.z*SCALE*2; + timestep[i] = getTime(); if (accelIdx>=SAMPLES) recordStop(); } function recordStart() {"ram" @@ -167,7 +169,7 @@ function showSaveMenu() { menu["Recording "+i+(exists?" *":"")] = function() { var csv = ""; for (var i=0;i Date: Sun, 21 Apr 2024 01:40:29 +0300 Subject: [PATCH 02/24] milliseconds --- apps/accelrec/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 175801ee5..d8c359acb 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -27,7 +27,7 @@ function accelHandlerRecord(a) {"ram" accelx[i] = a.x*SCALE*2; accely[i] = -a.y*SCALE*2; accelz[i] = a.z*SCALE*2; - timestep[i] = getTime(); + timestep[i] = Date.prototype.getTime(); if (accelIdx>=SAMPLES) recordStop(); } function recordStart() {"ram" From efc89bb7cfeebe81ae8ec92f138ff83cb4aa1f09 Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 01:45:17 +0300 Subject: [PATCH 03/24] Update app.js --- apps/accelrec/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index d8c359acb..58d3ce445 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -27,7 +27,7 @@ function accelHandlerRecord(a) {"ram" accelx[i] = a.x*SCALE*2; accely[i] = -a.y*SCALE*2; accelz[i] = a.z*SCALE*2; - timestep[i] = Date.prototype.getTime(); + timestep[i] = getTime(); if (accelIdx>=SAMPLES) recordStop(); } function recordStart() {"ram" @@ -169,7 +169,7 @@ function showSaveMenu() { menu["Recording "+i+(exists?" *":"")] = function() { var csv = ""; for (var i=0;i Date: Sun, 21 Apr 2024 10:33:32 +0300 Subject: [PATCH 04/24] right way this time --- apps/accelrec/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 58d3ce445..512c73d9d 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -27,7 +27,7 @@ function accelHandlerRecord(a) {"ram" accelx[i] = a.x*SCALE*2; accely[i] = -a.y*SCALE*2; accelz[i] = a.z*SCALE*2; - timestep[i] = getTime(); + timestep[i] = (getTime() - tStart)*100; if (accelIdx>=SAMPLES) recordStop(); } function recordStart() {"ram" @@ -169,7 +169,7 @@ function showSaveMenu() { menu["Recording "+i+(exists?" *":"")] = function() { var csv = ""; for (var i=0;i Date: Sun, 21 Apr 2024 11:07:05 +0300 Subject: [PATCH 05/24] More time and more timestamp digits --- apps/accelrec/app.js | 4 ++-- apps/accelrec/interface.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 512c73d9d..d866af9e2 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; var HZ = 100; -var SAMPLES = 5*HZ; // 5 seconds +var SAMPLES = 8*HZ; // 8 seconds var SCALE = 5000; var THRESH = 1.04; var accelx = new Int16Array(SAMPLES); @@ -27,7 +27,7 @@ function accelHandlerRecord(a) {"ram" accelx[i] = a.x*SCALE*2; accely[i] = -a.y*SCALE*2; accelz[i] = a.z*SCALE*2; - timestep[i] = (getTime() - tStart)*100; + timestep[i] = (getTime() - tStart)*1000; if (accelIdx>=SAMPLES) recordStop(); } function recordStart() {"ram" diff --git a/apps/accelrec/interface.html b/apps/accelrec/interface.html index ce3547387..d69b2d50c 100644 --- a/apps/accelrec/interface.html +++ b/apps/accelrec/interface.html @@ -37,7 +37,7 @@ function getData() { `; promise = promise.then(function() { document.querySelector(`.btn[fn='${fn}'][act='save']`).addEventListener("click", function() { - Util.saveCSV(fn.slice(0,-4), "X,Y,Z\n"+fileData[fn]); + Util.saveCSV(fn.slice(0,-4), "Time,X,Y,Z\n"+fileData[fn]); }); document.querySelector(`.btn[fn='${fn}'][act='delete']`).addEventListener("click", function() { Util.showModal("Deleting..."); From 651cf4295372a94563add7b45989342fcee0da16 Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 17:14:13 +0300 Subject: [PATCH 06/24] try with 400 hz --- apps/accelrec/app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index d866af9e2..41a8cb8fc 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; -var HZ = 100; -var SAMPLES = 8*HZ; // 8 seconds +var HZ = 400; +var SAMPLES = 5*HZ; // 5 seconds var SCALE = 5000; var THRESH = 1.04; var accelx = new Int16Array(SAMPLES); @@ -35,7 +35,8 @@ function recordStart() {"ram" accelIdx = 0; lastAccel = []; Bangle.accelWr(0x18,0b01110100); // off, +-8g - Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter + //Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter + Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g Bangle.setPollInterval(10); // 100hz input setTimeout(function() { From c961406da98f835477a6459d53868a8b84cc2788 Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 17:28:27 +0300 Subject: [PATCH 07/24] set pollintervall to 2.5(400hz) --- apps/accelrec/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 41a8cb8fc..1a3e0fd24 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -38,7 +38,8 @@ function recordStart() {"ram" //Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g - Bangle.setPollInterval(10); // 100hz input + //Bangle.setPollInterval(10); // 100hz input + Bangle.setPollInterval(2.5); // 400hz input setTimeout(function() { Bangle.on('accel',accelHandlerTrigger); g.clear(1).setFont("6x8",2).setFontAlign(0,0); From ac36b5bb5531ad4ca2d19c63117b59993ea846e9 Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 17:34:20 +0300 Subject: [PATCH 08/24] can't take the space. Lower time to 4 seconds --- apps/accelrec/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 1a3e0fd24..d5b5e676a 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; var HZ = 400; -var SAMPLES = 5*HZ; // 5 seconds +var SAMPLES = 4*HZ; // 5 seconds var SCALE = 5000; var THRESH = 1.04; var accelx = new Int16Array(SAMPLES); @@ -39,7 +39,7 @@ function recordStart() {"ram" Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g //Bangle.setPollInterval(10); // 100hz input - Bangle.setPollInterval(2.5); // 400hz input + Bangle.setPollInterval(2.5); // 400hz input setTimeout(function() { Bangle.on('accel',accelHandlerTrigger); g.clear(1).setFont("6x8",2).setFontAlign(0,0); From caae40d14d6e5f99369112483466a8115ac98027 Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 17:42:24 +0300 Subject: [PATCH 09/24] Cant with 400hz. No space. lets try with 200hz --- apps/accelrec/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index d5b5e676a..af1c1f5a3 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; -var HZ = 400; -var SAMPLES = 4*HZ; // 5 seconds +var HZ = 200; +var SAMPLES = 5*HZ; // 5 seconds var SCALE = 5000; var THRESH = 1.04; var accelx = new Int16Array(SAMPLES); @@ -36,10 +36,10 @@ function recordStart() {"ram" lastAccel = []; Bangle.accelWr(0x18,0b01110100); // off, +-8g //Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter - Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter + Bangle.accelWr(0x1B,0x04 | 0x40); // 200hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g //Bangle.setPollInterval(10); // 100hz input - Bangle.setPollInterval(2.5); // 400hz input + Bangle.setPollInterval(5); // 200hz input setTimeout(function() { Bangle.on('accel',accelHandlerTrigger); g.clear(1).setFont("6x8",2).setFontAlign(0,0); From 10e56fb2de449ef16f90d7521bcf796b1297904d Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 17:49:40 +0300 Subject: [PATCH 10/24] update --- apps/accelrec/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/accelrec/metadata.json b/apps/accelrec/metadata.json index b8831c31b..36d700a19 100644 --- a/apps/accelrec/metadata.json +++ b/apps/accelrec/metadata.json @@ -2,7 +2,7 @@ "id": "accelrec", "name": "Acceleration Recorder", "shortName": "Accel Rec", - "version": "0.04", + "version": "0.05", "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", "icon": "app.png", "tags": "", From 6bbcdf1de50fcc089880f862638db8096b9bd471 Mon Sep 17 00:00:00 2001 From: pinq- Date: Sun, 21 Apr 2024 18:00:37 +0300 Subject: [PATCH 11/24] Update app.js --- apps/accelrec/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index af1c1f5a3..92efc5c6a 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,5 +1,5 @@ //var acc; -var HZ = 200; +var HZ = 400; var SAMPLES = 5*HZ; // 5 seconds var SCALE = 5000; var THRESH = 1.04; @@ -36,10 +36,10 @@ function recordStart() {"ram" lastAccel = []; Bangle.accelWr(0x18,0b01110100); // off, +-8g //Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter - Bangle.accelWr(0x1B,0x04 | 0x40); // 200hz output, ODR/2 filter + Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g //Bangle.setPollInterval(10); // 100hz input - Bangle.setPollInterval(5); // 200hz input + Bangle.setPollInterval(2.5); // 100hz input setTimeout(function() { Bangle.on('accel',accelHandlerTrigger); g.clear(1).setFont("6x8",2).setFontAlign(0,0); From 6cc888000aad2b8744b9841630a1455af24e3e37 Mon Sep 17 00:00:00 2001 From: pinq- Date: Fri, 26 Apr 2024 10:27:07 +0300 Subject: [PATCH 12/24] back to 100hz --- apps/accelrec/app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 92efc5c6a..cfd8d8ca4 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,5 +1,5 @@ //var acc; -var HZ = 400; +var HZ = 100; var SAMPLES = 5*HZ; // 5 seconds var SCALE = 5000; var THRESH = 1.04; @@ -35,11 +35,11 @@ function recordStart() {"ram" accelIdx = 0; lastAccel = []; Bangle.accelWr(0x18,0b01110100); // off, +-8g - //Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter - Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter + Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter + //Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g - //Bangle.setPollInterval(10); // 100hz input - Bangle.setPollInterval(2.5); // 100hz input + Bangle.setPollInterval(10); // 100hz input + //Bangle.setPollInterval(2.5); // 100hz input setTimeout(function() { Bangle.on('accel',accelHandlerTrigger); g.clear(1).setFont("6x8",2).setFontAlign(0,0); From 805f13fb595a73d2a938eebd1c24394276866ac6 Mon Sep 17 00:00:00 2001 From: pinq- Date: Mon, 29 Apr 2024 19:24:44 +0300 Subject: [PATCH 13/24] higher threshold and lower scale for 16bit --- apps/accelrec/app.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index cfd8d8ca4..fd28b3440 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,8 +1,8 @@ //var acc; var HZ = 100; var SAMPLES = 5*HZ; // 5 seconds -var SCALE = 5000; -var THRESH = 1.04; +var SCALE = 2000; +var THRESH = 1.4; var accelx = new Int16Array(SAMPLES); var accely = new Int16Array(SAMPLES); // North var accelz = new Int16Array(SAMPLES); // Into clock face @@ -24,7 +24,7 @@ function accelHandlerTrigger(a) {"ram" } function accelHandlerRecord(a) {"ram" var i = accelIdx++; - accelx[i] = a.x*SCALE*2; + accelx[i] = a.x*SCALE*2; // *2 because of 8g mode accely[i] = -a.y*SCALE*2; accelz[i] = a.z*SCALE*2; timestep[i] = (getTime() - tStart)*1000; @@ -36,10 +36,8 @@ function recordStart() {"ram" lastAccel = []; Bangle.accelWr(0x18,0b01110100); // off, +-8g Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter - //Bangle.accelWr(0x1B,0x05 | 0x40); // 400hz output, ODR/2 filter Bangle.accelWr(0x18,0b11110100); // +-8g Bangle.setPollInterval(10); // 100hz input - //Bangle.setPollInterval(2.5); // 100hz input setTimeout(function() { Bangle.on('accel',accelHandlerTrigger); g.clear(1).setFont("6x8",2).setFontAlign(0,0); From 368ae251d20070e51e1b9c1a06b237809f914020 Mon Sep 17 00:00:00 2001 From: pinq- Date: Tue, 2 Jul 2024 21:35:55 +0300 Subject: [PATCH 14/24] Update pebblepp and accelrec app Pebbleapp * Add date on the bottom of the screen Accelratino * Change zline color to yellow * Auto save to file without selecting the file * Timestamp on the file name * Storage option to delet records --- apps/accelrec/app.js | 358 ++++++++++++++++++++++++++----------------- apps/pebblepp/app.js | 4 +- 2 files changed, 217 insertions(+), 145 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index fd28b3440..0665a0229 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; var HZ = 100; -var SAMPLES = 5*HZ; // 5 seconds +var SAMPLES = 5 * HZ; // 5 seconds var SCALE = 2000; var THRESH = 1.4; var accelx = new Int16Array(SAMPLES); @@ -9,173 +9,243 @@ var accelz = new Int16Array(SAMPLES); // Into clock face var timestep = new Int16Array(SAMPLES); // Into clock face var accelIdx = 0; var lastAccel; -function accelHandlerTrigger(a) {"ram" - if (a.mag*2>THRESH) { // *2 because 8g mode - tStart = getTime(); - g.drawString("Recording",g.getWidth()/2,g.getHeight()/2,1); - Bangle.removeListener('accel',accelHandlerTrigger); - Bangle.on('accel',accelHandlerRecord); - lastAccel.forEach(accelHandlerRecord); - accelHandlerRecord(a); - } else { - if (lastAccel.length>10) lastAccel.shift(); - lastAccel.push(a); - } + +function accelHandlerTrigger(a) { + "ram" + if (a.mag * 2 > THRESH) { // *2 because 8g mode + tStart = getTime(); + g.drawString("Recording", g.getWidth() / 2, g.getHeight() / 2, 1); + Bangle.removeListener('accel', accelHandlerTrigger); + Bangle.on('accel', accelHandlerRecord); + lastAccel.forEach(accelHandlerRecord); + accelHandlerRecord(a); + } else { + if (lastAccel.length > 10) lastAccel.shift(); + lastAccel.push(a); + } } -function accelHandlerRecord(a) {"ram" - var i = accelIdx++; - accelx[i] = a.x*SCALE*2; // *2 because of 8g mode - accely[i] = -a.y*SCALE*2; - accelz[i] = a.z*SCALE*2; - timestep[i] = (getTime() - tStart)*1000; - if (accelIdx>=SAMPLES) recordStop(); + +function accelHandlerRecord(a) { + "ram" + var i = accelIdx++; + accelx[i] = a.x * SCALE * 2; // *2 because of 8g mode + accely[i] = -a.y * SCALE * 2; + accelz[i] = a.z * SCALE * 2; + timestep[i] = (getTime() - tStart) * 1000; + if (accelIdx >= SAMPLES) recordStop(); } -function recordStart() {"ram" - Bangle.setLCDTimeout(0); // force LCD on - accelIdx = 0; - lastAccel = []; - Bangle.accelWr(0x18,0b01110100); // off, +-8g - Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter - Bangle.accelWr(0x18,0b11110100); // +-8g - Bangle.setPollInterval(10); // 100hz input - setTimeout(function() { - Bangle.on('accel',accelHandlerTrigger); - g.clear(1).setFont("6x8",2).setFontAlign(0,0); - g.drawString("Waiting",g.getWidth()/2,g.getHeight()/2); - }, 200); + +function recordStart() { + "ram" + Bangle.setLCDTimeout(0); // force LCD on + accelIdx = 0; + lastAccel = []; + Bangle.accelWr(0x18, 0b01110100); // off, +-8g + Bangle.accelWr(0x1B, 0x03 | 0x40); // 100hz output, ODR/2 filter + Bangle.accelWr(0x18, 0b11110100); // +-8g + Bangle.setPollInterval(10); // 100hz input + setTimeout(function() { + Bangle.on('accel', accelHandlerTrigger); + g.clear(1).setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Waiting", g.getWidth() / 2, g.getHeight() / 2); + }, 200); } -function recordStop() {"ram" - //console.log("Length:",getTime()-tStart); - Bangle.setPollInterval(80); // default poll interval - Bangle.accelWr(0x18,0b01101100); // off, +-4g - Bangle.accelWr(0x1B,0x0); // default 12.5hz output - Bangle.accelWr(0x18,0b11101100); // +-4g - Bangle.removeListener('accel',accelHandlerRecord); - E.showMessage("Finished"); - showData(); +function recordStop() { + "ram" + //console.log("Length:",getTime()-tStart); + Bangle.setPollInterval(80); // default poll interval + Bangle.accelWr(0x18, 0b01101100); // off, +-4g + Bangle.accelWr(0x1B, 0x0); // default 12.5hz output + Bangle.accelWr(0x18, 0b11101100); // +-4g + Bangle.removeListener('accel', accelHandlerRecord); + E.showMessage("Finished"); + showData(); } function showData() { - g.clear(1); - var w = g.getWidth()-20; // width - var m = g.getHeight()/2; // middle - var s = 12; // how many pixels per G - g.fillRect(9,0,9,g.getHeight()); - g.setFontAlign(0,0); - for (var l=-8;l<=8;l++) - g.drawString(l, 5, m - l*s); + g.clear(1); + let csv_files_N = require("Storage").list(/^acc.*.csv$/).length; + let w_full = g.getWidth(); + let h = g.getHeight(); + var w = g.getWidth() - 20; // width + var m = g.getHeight() / 2; // middle + var s = 12; // how many pixels per G + g.fillRect(9, 0, 9, g.getHeight()); + g.setFontAlign(0, 0); + for (var l = -8; l <= 8; l++) + g.drawString(l, 5, m - l * s); - function plot(a) { - g.moveTo(10,m - a[0]*s/SCALE); - for (var i=0;i0.1) { - if (itEnd) tEnd=i; + function plot(a) { + g.moveTo(10, m - a[0] * s / SCALE); + for (var i = 0; i < SAMPLES; i++) + g.lineTo(10 + i * w / SAMPLES, m - a[i] * s / SCALE); } - if (a>maxAccel) maxAccel=a; - vel += a/HZ; - if (vel>maxVel) maxVel=vel; - } - g.reset(); - g.setFont("6x8").setFontAlign(1,0); - g.drawString("Max Y Accel: "+maxAccel.toFixed(2)+" g",g.getWidth()-14,g.getHeight()-50); - g.drawString("Max Y Vel: "+maxVel.toFixed(2)+" m/s",g.getWidth()-14,g.getHeight()-40); - g.drawString("Time moving: "+(tEnd-tStart)/HZ+" s",g.getWidth()-14,g.getHeight()-30); - //console.log("End Velocity "+vel); - g.setFont("6x8").setFontAlign(0,0,1); - g.drawString("FINISH",g.getWidth()-4,g.getHeight()/2); - setWatch(function() { - showMenu(); - }, global.BTN2?BTN2:BTN); + g.setColor("#FFFA5F"); + plot(accelz); + g.setColor("#ff0000"); + plot(accelx); + g.setColor("#00ff00"); + plot(accely); + + // work out stats + var maxAccel = 0; + var tStart = SAMPLES, + tEnd = 0; + var vel = 0, + maxVel = 0; + for (var i = 0; i < SAMPLES; i++) { + var a = Math.abs(accely[i] / SCALE); + let a_yz = Math.sqrt(Math.pow(accely[i] / SCALE, 2) + Math.pow(accelz[i] / SCALE, 2)); + if (a > 0.1) { + if (i < tStart) tStart = i; + if (i > tEnd) tEnd = i; + } + if (a > maxAccel) maxAccel = a; + if (a_yz > maxVel) maxVel = a_yz; + } + g.reset(); + g.setFont("6x8").setFontAlign(1, 0); + g.drawString("Max X Accel: " + maxAccel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 50); + g.drawString("Max YZ Accel: " + maxVel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 40); + g.drawString("Time moving: " + (tEnd - tStart) / HZ + " s", g.getWidth() - 14, g.getHeight() - 30); + g.setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("File num: " + (csv_files_N + 1), w_full / 2, h - 20); + g.setFont("6x8").setFontAlign(0, 0, 1); + g.drawString("FINISH", g.getWidth() - 4, g.getHeight() / 2); + setWatch(function() { + showMenu(); + }, global.BTN2 ? BTN2 : BTN); } function showBig(txt) { - g.clear(1); - g.setFontVector(80).setFontAlign(0,0); - g.drawString(txt,g.getWidth()/2, g.getHeight()/2); - g.flip(); + g.clear(1); + g.setFontVector(80).setFontAlign(0, 0); + g.drawString(txt, g.getWidth() / 2, g.getHeight() / 2); + g.flip(); } function countDown() { - showBig(3); - setTimeout(function() { - showBig(2); + showBig(3); setTimeout(function() { - showBig(1); - setTimeout(function() { - recordStart(); - }, 800); + showBig(2); + setTimeout(function() { + showBig(1); + setTimeout(function() { + recordStart(); + }, 800); + }, 1000); }, 1000); - }, 1000); } function showMenu() { - Bangle.setLCDTimeout(10); // set timeout for LCD in menu - var menu = { - "" : { title : "Acceleration Rec" }, - "Start" : function() { - E.showMenu(); - if (accelIdx==0) countDown(); - else E.showPrompt("Overwrite Recording?").then(ok=>{ - if (ok) countDown(); else showMenu(); - }); - }, - "Plot" : function() { - E.showMenu(); - if (accelIdx) showData(); - else E.showAlert("No Data").then(()=>{ - showMenu(); - }); - }, - "Save" : function() { - E.showMenu(); - if (accelIdx) showSaveMenu(); - else E.showAlert("No Data").then(()=>{ - showMenu(); - }); - }, - "Exit" : function() { - load(); - }, - }; - E.showMenu(menu); + Bangle.setLCDTimeout(10); // set timeout for LCD in menu + var menu = { + "": { title: "Acceleration Rec" }, + "Start": function() { + E.showMenu(); + if (accelIdx == 0) countDown(); + else E.showPrompt("Overwrite Recording?").then(ok => { + if (ok) countDown(); + else showMenu(); + }); + }, + "Plot": function() { + E.showMenu(); + if (accelIdx) showData(); + else E.showAlert("No Data").then(() => { + showMenu(); + }); + }, + "Storage": function() { + E.showMenu(); + if (require("Storage").list(/^acc.*.csv$/).length) + StorageMenu(); + else + E.showAlert("No Data").then(() => { + showMenu(); + }); + }, + "Exit": function() { + load(); + }, + }; + E.showMenu(menu); } function showSaveMenu() { - var menu = { - "" : { title : "Save" } - }; - [1,2,3,4,5,6].forEach(i=>{ - var fn = "accelrec."+i+".csv"; - var exists = require("Storage").read(fn)!==undefined; - menu["Recording "+i+(exists?" *":"")] = function() { - var csv = ""; - for (var i=0;i { + if (ok) + SaveFile(); + else + showMenu(); + }); } -showMenu(); +function SaveFile() { + let csv_files_N = require("Storage").list(/^acc.*.csv$/).length; + //if (csv_files_N > 20) + // E.showMessage("Storage is full"); + // showMenu(); + let csv = ""; + let date = new Date(); + let fn = "accelrec_" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "_" + (csv_files_N + 1) + ".csv"; + E.showMessage("Saveing to file \n" + fn); + for (var i = 0; i < SAMPLES; i++) + csv += `${timestep[i]},${accelx[i]/SCALE},${accely[i]/SCALE},${accelz[i]/SCALE}\n`; + require("Storage").write(fn, csv); + showMenu(); +} + +function StorageMenu() { + var menu = { + "": { + title: "Storage" + } + }; + let csv_files = require("Storage").list(/^acc.*.csv$/); + var inx = 0; + csv_files.forEach(fn => { + inx++; + menu[inx + ". " + fn] = function() { + StorageOptions(fn); + }; + }); + menu["< Back"] = function() { + showMenu(); + }; + E.showMenu(menu); +} + +function StorageOptions(file) { + let menu = { + "": { + title: "Options" + }, + "Plot": function() { + showMenu(); + }, + "Delete": function() { + E.showMenu(); + E.showPrompt("Delete recording?").then(ok => { + if (ok) + DeleteRecord(file); + else + StorageMenu(); + }); + }, + "< Back": function() { + StorageMenu(); + }, + }; + E.showMenu(menu); +} + +function DeleteRecord(file) { + E.showMessage("Deleteing file \n" + file); + require("Storage").erase(file); + StorageMenu(); +} +showMenu(); \ No newline at end of file diff --git a/apps/pebblepp/app.js b/apps/pebblepp/app.js index 2c8e24192..5ffd82a9e 100644 --- a/apps/pebblepp/app.js +++ b/apps/pebblepp/app.js @@ -38,6 +38,8 @@ let draw = function() { g.reset(); g.setBgColor(theme.bg).clearRect(0, h2, w, h3); + g.setFontLECO1976Regular22().setFontAlign(0, -1); + g.setColor(0, 0, 0).drawString(date.getDay() + "." + (date.getMonth() + 1), w / 2, h3 + 5); g.setFontLECO1976Regular42().setFontAlign(0, -1); g.setColor(theme.fg); g.drawString(time, w/2, h2 + 8); @@ -133,7 +135,7 @@ background.fillRect(Bangle.appRect); // start off with completely clear backgrou // contrast bar (top) g.setColor(theme.fg).fillRect(0, h2 - 6, w, h2); // contrast bar (bottom) -g.setColor(theme.fg).fillRect(0, h3, w, h3 + 6); +g.setColor(theme.fg).fillRect(w / 2 - 30, h3, w / 2 + 30, h); draw(); } From 31c08d149f088bd99f21e14048487d59d3acfe97 Mon Sep 17 00:00:00 2001 From: pinq- Date: Tue, 2 Jul 2024 21:44:04 +0300 Subject: [PATCH 15/24] update on the version info --- apps/accelrec/ChangeLog | 1 + apps/accelrec/metadata.json | 2 +- apps/pebblepp/ChangeLog | 3 ++- apps/pebblepp/metadata.json | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/accelrec/ChangeLog b/apps/accelrec/ChangeLog index 2254ad9ea..eace81e1e 100644 --- a/apps/accelrec/ChangeLog +++ b/apps/accelrec/ChangeLog @@ -4,3 +4,4 @@ Trigger on 1.04g now, and record 10 samples before trigger 0.03: Bangle.js 2 compatibility 0.04: Minor code improvements +0.05: Can record 100hz, z-axis color changed to yellow, autosave to file, no need select, delete old records diff --git a/apps/accelrec/metadata.json b/apps/accelrec/metadata.json index 36d700a19..10a57fcaa 100644 --- a/apps/accelrec/metadata.json +++ b/apps/accelrec/metadata.json @@ -2,7 +2,7 @@ "id": "accelrec", "name": "Acceleration Recorder", "shortName": "Accel Rec", - "version": "0.05", + "version": "0.06", "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", "icon": "app.png", "tags": "", diff --git a/apps/pebblepp/ChangeLog b/apps/pebblepp/ChangeLog index 552258649..4d81b17d8 100644 --- a/apps/pebblepp/ChangeLog +++ b/apps/pebblepp/ChangeLog @@ -6,4 +6,5 @@ 0.05: Minor code improvements 0.06: Use the clockbg library to allow custom image backgrounds 0.07: Fix automatic coloring of middle of clockinfo images if clockinfo image goes right to the top or left -0.08: Use new clockinfo lib with function to render images wirh borders \ No newline at end of file +0.08: Use new clockinfo lib with function to render images wirh borders +0.09: Add date on the bottom \ No newline at end of file diff --git a/apps/pebblepp/metadata.json b/apps/pebblepp/metadata.json index 66ce91ee1..eb74fda25 100644 --- a/apps/pebblepp/metadata.json +++ b/apps/pebblepp/metadata.json @@ -2,7 +2,7 @@ "id": "pebblepp", "name": "Pebble++ Clock", "shortName": "Pebble++", - "version": "0.08", + "version": "0.09", "description": "A pebble style clock (based on the 'Pebble Clock' app) but with two configurable ClockInfo items at the top", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], From 66bbdd1242d4e63916752b0829e7cbfeca638346 Mon Sep 17 00:00:00 2001 From: pinq- Date: Wed, 3 Jul 2024 21:16:25 +0300 Subject: [PATCH 16/24] Auto generate button number no 0 button number --- apps/bthome/ChangeLog | 1 + apps/bthome/metadata.json | 2 +- apps/bthome/settings.js | 22 ++++++++++++++++------ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/bthome/ChangeLog b/apps/bthome/ChangeLog index 82c93ee1f..1920ee3a8 100644 --- a/apps/bthome/ChangeLog +++ b/apps/bthome/ChangeLog @@ -4,3 +4,4 @@ Set 'n' for buttons in Bangle.btHomeData correctly (avoids adding extra buttons on end of advertising) 0.04: Fix duplicate button on edit->save 0.05: Use the bleAdvert module +0.06: button number can't be 0. Now generates number automatically diff --git a/apps/bthome/metadata.json b/apps/bthome/metadata.json index 0156a5d32..bbfcfcfe5 100644 --- a/apps/bthome/metadata.json +++ b/apps/bthome/metadata.json @@ -1,7 +1,7 @@ { "id": "bthome", "name": "BTHome", "shortName":"BTHome", - "version":"0.05", + "version":"0.06", "description": "Allow your Bangle to advertise with BTHome and send events to Home Assistant via Bluetooth", "icon": "icon.png", "type": "app", diff --git a/apps/bthome/settings.js b/apps/bthome/settings.js index 1bdcb270d..d4910c1f7 100644 --- a/apps/bthome/settings.js +++ b/apps/bthome/settings.js @@ -11,10 +11,24 @@ require("Storage").writeJSON("bthome.json",settings) } + function getNewIdNumber(){ + var id_start = 1; + var select = false; + while(!select){ + select = true; + settings.buttons.forEach((button, idx) => { + if (id_start == button.n){ + id_start++; + select = false; + } + }); + } + return id_start; + } + function showButtonMenu(button, isNew) { - var isNew = false; if (!button) { - button = {name:"home", icon:"home", n:0, v:"press"}; + button = {name:"home", icon:"home", n:getNewIdNumber(), v:"press"}; isNew = true; } var actions = ["press","double_press","triple_press","long_press","long_double_press","long_triple_press"]; @@ -51,10 +65,6 @@ format : v => actions[v], onchange : v => button.v=actions[v] }, - /*LANG*/"Button #" : { - value : button.n, min:0, max:3, - onchange : v => button.n=v - }, /*LANG*/"Save" : () => { if (isNew) settings.buttons.push(button); saveSettings(); From 7de5d5037480bb13c317cf63d856f5db4be28eb7 Mon Sep 17 00:00:00 2001 From: pinq- Date: Fri, 5 Jul 2024 23:10:43 +0300 Subject: [PATCH 17/24] update version --- apps/accelrec/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/accelrec/metadata.json b/apps/accelrec/metadata.json index 10a57fcaa..36d700a19 100644 --- a/apps/accelrec/metadata.json +++ b/apps/accelrec/metadata.json @@ -2,7 +2,7 @@ "id": "accelrec", "name": "Acceleration Recorder", "shortName": "Accel Rec", - "version": "0.06", + "version": "0.05", "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", "icon": "app.png", "tags": "", From df4cfaa77c957b0a5c592b279302a544af174c58 Mon Sep 17 00:00:00 2001 From: pinq- Date: Fri, 5 Jul 2024 23:30:45 +0300 Subject: [PATCH 18/24] add showSaveMenu(); menu --- apps/accelrec/app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 0665a0229..7cf354e34 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -9,11 +9,12 @@ var accelz = new Int16Array(SAMPLES); // Into clock face var timestep = new Int16Array(SAMPLES); // Into clock face var accelIdx = 0; var lastAccel; +var timestep_start = 0; function accelHandlerTrigger(a) { "ram" if (a.mag * 2 > THRESH) { // *2 because 8g mode - tStart = getTime(); + timestep_start = getTime(); g.drawString("Recording", g.getWidth() / 2, g.getHeight() / 2, 1); Bangle.removeListener('accel', accelHandlerTrigger); Bangle.on('accel', accelHandlerRecord); @@ -31,7 +32,7 @@ function accelHandlerRecord(a) { accelx[i] = a.x * SCALE * 2; // *2 because of 8g mode accely[i] = -a.y * SCALE * 2; accelz[i] = a.z * SCALE * 2; - timestep[i] = (getTime() - tStart) * 1000; + timestep[i] = (getTime() - timestep_start) * 1000; if (accelIdx >= SAMPLES) recordStop(); } @@ -94,8 +95,7 @@ function showData() { var maxAccel = 0; var tStart = SAMPLES, tEnd = 0; - var vel = 0, - maxVel = 0; + var maxVel = 0; for (var i = 0; i < SAMPLES; i++) { var a = Math.abs(accely[i] / SCALE); let a_yz = Math.sqrt(Math.pow(accely[i] / SCALE, 2) + Math.pow(accelz[i] / SCALE, 2)); @@ -116,7 +116,7 @@ function showData() { g.setFont("6x8").setFontAlign(0, 0, 1); g.drawString("FINISH", g.getWidth() - 4, g.getHeight() / 2); setWatch(function() { - showMenu(); + showSaveMenu(); }, global.BTN2 ? BTN2 : BTN); } From 5c6e3b61e3d2252d3bdd56458e66021acde8e6bb Mon Sep 17 00:00:00 2001 From: jeonlab <37269397+jeonlab@users.noreply.github.com> Date: Tue, 9 Jul 2024 07:41:54 -0400 Subject: [PATCH 19/24] Update metadata.json --- apps/gpssetup/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpssetup/metadata.json b/apps/gpssetup/metadata.json index 15a7c1cf2..b8b6dfc23 100644 --- a/apps/gpssetup/metadata.json +++ b/apps/gpssetup/metadata.json @@ -6,7 +6,7 @@ "description": "Configure the GPS power options and store them in the GPS nvram", "icon": "gpssetup.png", "tags": "gps,tools,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], + "supports": ["BANGLEJS"], "readme": "README.md", "storage": [ {"name":"gpssetup","url":"gpssetup.js"}, From 2c79aa27f973eef963e09851a90dce65c02f7310 Mon Sep 17 00:00:00 2001 From: pinq- Date: Tue, 9 Jul 2024 18:00:06 +0300 Subject: [PATCH 20/24] Minor fix on the accerec, pebbleapp and bthome pebblepp: -refresh date background also -getDay -> getDate -add some comments bthome: - better id search accelrec: - fix on the regex search - Don't ask save option when only show plot - add some comments --- apps/accelrec/app.js | 26 ++++++++++++++------------ apps/bthome/settings.js | 14 ++------------ apps/pebblepp/app.js | 7 +++---- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 7cf354e34..eb91d77af 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; var HZ = 100; -var SAMPLES = 5 * HZ; // 5 seconds +var SAMPLES = 6 * HZ; // 6 seconds var SCALE = 2000; var THRESH = 1.4; var accelx = new Int16Array(SAMPLES); @@ -62,13 +62,13 @@ function recordStop() { Bangle.accelWr(0x18, 0b11101100); // +-4g Bangle.removeListener('accel', accelHandlerRecord); E.showMessage("Finished"); - showData(); + showData(true); } -function showData() { +function showData(save_file) { g.clear(1); - let csv_files_N = require("Storage").list(/^acc.*.csv$/).length; + let csv_files_N = require("Storage").list(/^acc.*\.csv$/).length; let w_full = g.getWidth(); let h = g.getHeight(); var w = g.getWidth() - 20; // width @@ -95,7 +95,7 @@ function showData() { var maxAccel = 0; var tStart = SAMPLES, tEnd = 0; - var maxVel = 0; + var max_YZ = 0; for (var i = 0; i < SAMPLES; i++) { var a = Math.abs(accely[i] / SCALE); let a_yz = Math.sqrt(Math.pow(accely[i] / SCALE, 2) + Math.pow(accelz[i] / SCALE, 2)); @@ -104,19 +104,20 @@ function showData() { if (i > tEnd) tEnd = i; } if (a > maxAccel) maxAccel = a; - if (a_yz > maxVel) maxVel = a_yz; + if (a_yz > max_YZ) max_YZ = a_yz; } g.reset(); g.setFont("6x8").setFontAlign(1, 0); g.drawString("Max X Accel: " + maxAccel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 50); - g.drawString("Max YZ Accel: " + maxVel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 40); + g.drawString("Max YZ Accel: " + max_YZ.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 40); g.drawString("Time moving: " + (tEnd - tStart) / HZ + " s", g.getWidth() - 14, g.getHeight() - 30); g.setFont("6x8", 2).setFontAlign(0, 0); g.drawString("File num: " + (csv_files_N + 1), w_full / 2, h - 20); g.setFont("6x8").setFontAlign(0, 0, 1); g.drawString("FINISH", g.getWidth() - 4, g.getHeight() / 2); setWatch(function() { - showSaveMenu(); + if (save_file) showSaveMenu(); // when select only plot, don't ask for save option + else showMenu(); }, global.BTN2 ? BTN2 : BTN); } @@ -154,14 +155,14 @@ function showMenu() { }, "Plot": function() { E.showMenu(); - if (accelIdx) showData(); + if (accelIdx) showData(false); else E.showAlert("No Data").then(() => { showMenu(); }); }, "Storage": function() { E.showMenu(); - if (require("Storage").list(/^acc.*.csv$/).length) + if (require("Storage").list(/^acc.*\.csv$/).length) StorageMenu(); else E.showAlert("No Data").then(() => { @@ -185,7 +186,7 @@ function showSaveMenu() { } function SaveFile() { - let csv_files_N = require("Storage").list(/^acc.*.csv$/).length; + let csv_files_N = require("Storage").list(/^acc.*\.csv$/).length; //if (csv_files_N > 20) // E.showMessage("Storage is full"); // showMenu(); @@ -199,13 +200,14 @@ function SaveFile() { showMenu(); } +//Show saved csv files function StorageMenu() { var menu = { "": { title: "Storage" } }; - let csv_files = require("Storage").list(/^acc.*.csv$/); + let csv_files = require("Storage").list(/^acc.*\.csv$/); var inx = 0; csv_files.forEach(fn => { inx++; diff --git a/apps/bthome/settings.js b/apps/bthome/settings.js index d4910c1f7..19a854151 100644 --- a/apps/bthome/settings.js +++ b/apps/bthome/settings.js @@ -11,19 +11,9 @@ require("Storage").writeJSON("bthome.json",settings) } + // Get id number for button that is sent to bthome function getNewIdNumber(){ - var id_start = 1; - var select = false; - while(!select){ - select = true; - settings.buttons.forEach((button, idx) => { - if (id_start == button.n){ - id_start++; - select = false; - } - }); - } - return id_start; + return [1, 2, 3, 4, 5, 6, 7, 8, 9].find(id => settings.buttons.every(button => id != button.n)); } function showButtonMenu(button, isNew) { diff --git a/apps/pebblepp/app.js b/apps/pebblepp/app.js index 5ffd82a9e..7551e77ab 100644 --- a/apps/pebblepp/app.js +++ b/apps/pebblepp/app.js @@ -38,8 +38,9 @@ let draw = function() { g.reset(); g.setBgColor(theme.bg).clearRect(0, h2, w, h3); + g.setColor(theme.fg).fillRect(w / 2 - 30, h3, w / 2 + 30, h); // refresh date background g.setFontLECO1976Regular22().setFontAlign(0, -1); - g.setColor(0, 0, 0).drawString(date.getDay() + "." + (date.getMonth() + 1), w / 2, h3 + 5); + g.setColor(0, 0, 0).drawString(date.getDate() + "." + (date.getMonth() + 1), w / 2, h3 + 5); g.setFontLECO1976Regular42().setFontAlign(0, -1); g.setColor(theme.fg); g.drawString(time, w/2, h2 + 8); @@ -132,10 +133,8 @@ Bangle.setUI({ Bangle.loadWidgets(); require("widget_utils").swipeOn(); // hide widgets, make them visible with a swipe background.fillRect(Bangle.appRect); // start off with completely clear background -// contrast bar (top) +// background contrast bar g.setColor(theme.fg).fillRect(0, h2 - 6, w, h2); -// contrast bar (bottom) -g.setColor(theme.fg).fillRect(w / 2 - 30, h3, w / 2 + 30, h); draw(); } From 379e712b1899e20f881c2bcf5cafc78a02b72e1a Mon Sep 17 00:00:00 2001 From: pinq- Date: Tue, 9 Jul 2024 18:29:09 +0300 Subject: [PATCH 21/24] pebbleapp works also with light colors --- apps/pebblepp/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/pebblepp/app.js b/apps/pebblepp/app.js index 7551e77ab..2aa50b7de 100644 --- a/apps/pebblepp/app.js +++ b/apps/pebblepp/app.js @@ -38,9 +38,9 @@ let draw = function() { g.reset(); g.setBgColor(theme.bg).clearRect(0, h2, w, h3); - g.setColor(theme.fg).fillRect(w / 2 - 30, h3, w / 2 + 30, h); // refresh date background + g.setColor(theme.fg).fillRect(w / 2 - 30, h3 + 5, w / 2 + 30, h); // refresh date background g.setFontLECO1976Regular22().setFontAlign(0, -1); - g.setColor(0, 0, 0).drawString(date.getDate() + "." + (date.getMonth() + 1), w / 2, h3 + 5); + g.setColor(theme.bg).drawString(date.getDate() + "." + (date.getMonth() + 1), w / 2, h3 + 5); g.setFontLECO1976Regular42().setFontAlign(0, -1); g.setColor(theme.fg); g.drawString(time, w/2, h2 + 8); @@ -134,7 +134,7 @@ Bangle.loadWidgets(); require("widget_utils").swipeOn(); // hide widgets, make them visible with a swipe background.fillRect(Bangle.appRect); // start off with completely clear background // background contrast bar -g.setColor(theme.fg).fillRect(0, h2 - 6, w, h2); +g.setColor(theme.fg).fillRect(0, h2 - 6, w, h3 + 5); draw(); } From 422a3492cf0d2ee28dddd1746b752946245955a2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 10 Jul 2024 14:31:20 +0100 Subject: [PATCH 22/24] 0.74: Add extra layer of checks before allowing a factory reset (fix #3476) --- apps/setting/ChangeLog | 1 + apps/setting/metadata.json | 2 +- apps/setting/settings.js | 20 +++++++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 3be7db96a..27aa5c90c 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -82,3 +82,4 @@ of 'Select Clock' 0.71: Minor code improvements 0.72: Add setting for configuring BLE privacy 0.73: Fix `const` bug / work with fastload +0.74: Add extra layer of checks before allowing a factory reset (fix #3476) \ No newline at end of file diff --git a/apps/setting/metadata.json b/apps/setting/metadata.json index 44774dc08..67ca847d9 100644 --- a/apps/setting/metadata.json +++ b/apps/setting/metadata.json @@ -1,7 +1,7 @@ { "id": "setting", "name": "Settings", - "version": "0.73", + "version": "0.74", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/settings.js b/apps/setting/settings.js index b348e00d5..d8ecefd92 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -702,14 +702,24 @@ function showUtilMenu() { } }); }; - if (Bangle.factoryReset) { menu[/*LANG*/'Factory Reset'] = ()=>{ - E.showPrompt(/*LANG*/'This will remove everything!',{title:/*LANG*/"Factory Reset"}).then((v) => { + E.showPrompt(/*LANG*/'This will remove everything!',{title:/*LANG*/"Factory Reset",back:showUtilMenu}).then((v) => { if (v) { - E.showMessage(); - Terminal.setConsole(); - Bangle.factoryReset(); + var n = ((Math.random()*4)&3) + 1; + E.showPrompt(/*LANG*/"To confirm, please press "+n,{ + title:/*LANG*/"Factory Reset", + buttons : {"1":1,"2":2,"3":3,"4":4}, + back:showUtilMenu + }).then(function(v) { + if (v==n) { + E.showMessage(); + Terminal.setConsole(); + Bangle.factoryReset(); + } else { + showUtilMenu(); + } + }); } else showUtilMenu(); }); } From 1344838a996d2fad165e417c7fe55f4bbf2650ad Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 10 Jul 2024 14:35:56 +0100 Subject: [PATCH 23/24] add back arrows to confirmation dialogs --- apps/setting/settings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index d8ecefd92..c5149ab5a 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -663,7 +663,7 @@ function showUtilMenu() { }; if (BANGLEJS2) menu[/*LANG*/'Calibrate Battery'] = () => { - E.showPrompt(/*LANG*/"Is the battery fully charged?",{title:/*LANG*/"Calibrate"}).then(ok => { + E.showPrompt(/*LANG*/"Is the battery fully charged?",{title:/*LANG*/"Calibrate",back:showUtilMenu}).then(ok => { if (ok) { var s=storage.readJSON("setting.json"); s.batFullVoltage = (analogRead(D3)+analogRead(D3)+analogRead(D3)+analogRead(D3))/4; @@ -675,7 +675,7 @@ function showUtilMenu() { }); }; menu[/*LANG*/'Reset Settings'] = () => { - E.showPrompt(/*LANG*/'Reset to Defaults?',{title:/*LANG*/"Settings"}).then((v) => { + E.showPrompt(/*LANG*/'Reset to Defaults?',{title:/*LANG*/"Settings",back:showUtilMenu}).then((v) => { if (v) { E.showMessage(/*LANG*/'Resetting'); resetSettings(); @@ -685,7 +685,7 @@ function showUtilMenu() { }; menu[/*LANG*/"Turn Off"] = () => { E.showPrompt(/*LANG*/"Are you sure? Alarms and timers won't fire", { - title:/*LANG*/"Turn Off" + title:/*LANG*/"Turn Off",back:showUtilMenu }).then((confirmed) => { if (confirmed) { E.showMessage(/*LANG*/"See you\nlater!", /*LANG*/"Goodbye"); From 35bc00e27128d0b4c87f803d3a170ac2825cfa3a Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Fri, 12 Jul 2024 12:58:37 +0100 Subject: [PATCH 24/24] widbattpwr: show percentage if charging --- apps/widbattpwr/ChangeLog | 1 + apps/widbattpwr/README.md | 4 ++++ apps/widbattpwr/metadata.json | 2 +- apps/widbattpwr/widget.js | 2 +- apps/widbattpwr/widget.ts | 2 +- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/widbattpwr/ChangeLog b/apps/widbattpwr/ChangeLog index b1bdaa6fc..daeba172f 100644 --- a/apps/widbattpwr/ChangeLog +++ b/apps/widbattpwr/ChangeLog @@ -1 +1,2 @@ 0.01: Initial fork from hwid_a_battery_widget +0.02: Show battery percentage (instead of power) if charging diff --git a/apps/widbattpwr/README.md b/apps/widbattpwr/README.md index 4dd4c8a5a..22a575166 100644 --- a/apps/widbattpwr/README.md +++ b/apps/widbattpwr/README.md @@ -2,6 +2,10 @@ Show the time remaining at the current power consumption, and battery percentage via shading of the text and a percentage bar. +Battery percentage can be seen: +- Temporarily by tapping the widget +- By charging the watch + Requires firmware 2v23 or above. This is a copy of `hwid_a_battery_widget` (that being a copy of `wid_a_battery_widget`). diff --git a/apps/widbattpwr/metadata.json b/apps/widbattpwr/metadata.json index 667485666..f802a21f5 100644 --- a/apps/widbattpwr/metadata.json +++ b/apps/widbattpwr/metadata.json @@ -3,7 +3,7 @@ "name": "Battery power and percentage widget", "shortName": "Batt Pwr", "icon": "widget.png", - "version": "0.01", + "version": "0.02", "type": "widget", "supports": ["BANGLEJS2"], "readme": "README.md", diff --git a/apps/widbattpwr/widget.js b/apps/widbattpwr/widget.js index 58f89dc34..305b12a54 100644 --- a/apps/widbattpwr/widget.js +++ b/apps/widbattpwr/widget.js @@ -39,7 +39,7 @@ g.setFont("Vector", 16); { var txt = void 0; - if (showPct) { + if (showPct || Bangle.isCharging()) { txt = "".concat(batt, "%"); } else { diff --git a/apps/widbattpwr/widget.ts b/apps/widbattpwr/widget.ts index de5352f32..53337724b 100644 --- a/apps/widbattpwr/widget.ts +++ b/apps/widbattpwr/widget.ts @@ -44,7 +44,7 @@ g.setFont("Vector", 16); { let txt; - if(showPct){ + if(showPct || Bangle.isCharging()){ txt = `${batt}%`; }else{ // 175mAh, scaled based on battery (batt/100), scaled down based on usage