From 68c24811c5e1ed7957e3554700e1dd98a659e1db Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 8 May 2021 13:32:37 +0100 Subject: [PATCH 01/15] kitchen: Added basic heart rate monitor watch face --- apps.json | 7 ++- apps/kitchen/ChangeLog | 1 + apps/kitchen/compass.kit.js | 2 +- apps/kitchen/digi.kit.js | 2 +- apps/kitchen/gps.kit.js | 2 +- apps/kitchen/heart.kit.js | 116 ++++++++++++++++++++++++++++++++++++ apps/kitchen/kitchen.app.js | 62 ++++++++++++++++++- apps/kitchen/stepo.kit.js | 2 +- apps/kitchen/swatch.kit.js | 2 +- 9 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 apps/kitchen/heart.kit.js diff --git a/apps.json b/apps.json index dbf438dde..cf70efb93 100644 --- a/apps.json +++ b/apps.json @@ -3085,7 +3085,7 @@ { "id": "kitchen", "name": "Kitchen Combo", "icon": "kitchen.png", - "version":"0.08", + "version":"0.09", "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'. Requires firmware v2.08.167 or later", "tags": "tool,outdoors,gps", "type":"clock", @@ -3096,11 +3096,14 @@ {"name":"stepo.kit.js","url":"stepo.kit.js"}, {"name":"gps.kit.js","url":"gps.kit.js"}, {"name":"digi.kit.js","url":"digi.kit.js"}, + {"name":"heart.kit.js","url":"heart.kit.js"}, {"name":"swatch.kit.js","url":"swatch.kit.js"}, {"name":"compass.kit.js","url":"compass.kit.js"}, - {"name":"waypoints.json","url":"waypoints.json","evaluate":false}, {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} ] + "data": [ + {"name":"waypoints.json","url":"waypoints.json"} + ] }, { "id": "qmsched", "name": "Quiet Mode Schedule", diff --git a/apps/kitchen/ChangeLog b/apps/kitchen/ChangeLog index c6ef8a39d..e1d816e47 100644 --- a/apps/kitchen/ChangeLog +++ b/apps/kitchen/ChangeLog @@ -6,3 +6,4 @@ 0.06: Reduced memory footprint of compass, used direct screen access rather than arrayBuffer 0.07: Added error codes if dependancies are missing 0.08: Improved error handling for missing firmware features, added template app.kit.js +0.09: Added heart rate monitor app diff --git a/apps/kitchen/compass.kit.js b/apps/kitchen/compass.kit.js index 4c85f058f..530ba021c 100644 --- a/apps/kitchen/compass.kit.js +++ b/apps/kitchen/compass.kit.js @@ -16,7 +16,7 @@ //console.log(o); } - function init(gps,sw) { + function init(gps,sw, hrm) { showMem("compass init() START"); gpsObject = gps; intervalRefSec = undefined; diff --git a/apps/kitchen/digi.kit.js b/apps/kitchen/digi.kit.js index f65880928..91ae70905 100644 --- a/apps/kitchen/digi.kit.js +++ b/apps/kitchen/digi.kit.js @@ -16,7 +16,7 @@ const Y_ACTIVITY = 116; const Y_MODELINE = 200; - function init(gps,sw) { + function init(gps,sw,hrm) { showMem("digi init 1"); days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday"]; prevInfo = ""; diff --git a/apps/kitchen/gps.kit.js b/apps/kitchen/gps.kit.js index 3977715f3..d6c936226 100644 --- a/apps/kitchen/gps.kit.js +++ b/apps/kitchen/gps.kit.js @@ -20,7 +20,7 @@ //console.log(o); } - function init(gps, sw) { + function init(gps, sw, hrm) { log_debug("gps init"); //log_debug(gps); gpsObject = gps; diff --git a/apps/kitchen/heart.kit.js b/apps/kitchen/heart.kit.js new file mode 100644 index 000000000..aedbadf9f --- /dev/null +++ b/apps/kitchen/heart.kit.js @@ -0,0 +1,116 @@ +(() => { + function getFace(){ + const Y_TIME = 30; + const Y_ACTIVITY = 116; + let prevTime; + let prevBpm; + let toggle = 1; + let redrawHrmPower = true; + let intervalRefSec; + let img; + let hrmObject; + + function log_debug(o) { + //console.log(o); + } + + function init(gps, sw, hrm) { + img = require("heatshrink").decompress(atob("mEwwRC/ABf/+ADBh//BQgGB//AgYDBCAQWCA4QPCDAYSC//8n4EC4AiEAAo1EBZIeDAAn8BZoKHJAYL7L64LLTa6/DAAi/CKhDjGBZBIGIwQ8IHQQ8IHQYwHBQgwFFwgwGFwgwGFwowFBQwwDFwwwEFwwwEFw4wDBRAkBERAkCERIA/AAYA=")); + prevTime = "-"; + prevBpm = "-"; + toggle = 1; + redrawHrmPower = true; + hrmObject = hrm; + intervalRefSec; + g.clear(); + } + + function freeResources() { + prevTime = undefined; + img = undefined; + } + + function startTimer() { + draw(); + intervalRefSec = setInterval(draw, 1000); + } + + function stopTimer() { + if (intervalRefSec) { intervalRefSec = clearInterval(intervalRefSec); } + } + + function onButtonShort(btn) {} + + function onButtonLong(btn) { + log_debug("toggleHRM"); + if (btn !== 1) return; + if (!Bangle.isHRMOn) return; // old firmware + hrmObject.toggleHRMPower(); + prevBpm = '-'; + toggle = 1; // ensure we draw the heart first + redrawHrmPower = true; + } + + function draw() { + let d = new Date(); + let da = d.toString().split(" "); + let time = da[4].substr(0,5); + + if (time !== prevTime) { + prevTime = time; + g.setColor(0); + g.fillRect(0, Y_TIME, 239, Y_ACTIVITY -1); + g.setColor(1,1,1); + g.setFont("Vector",80); + g.setFontAlign(0,-1); + g.drawString(time, 120, Y_TIME); + } + + let bpm = hrmObject.getBpm(); + + if (!Bangle.isHRMOn()) { + if (!redrawHrmPower) return; + redrawHrmPower = false; + g.setColor(0); + g.drawImage(img, 12, 132, {scale:2}); + g.fillRect(120,120,239,239); + g.setColor(255,0,0); + //g.setColor(0xFFC0); // yellow + g.drawImage(img, 12, 132, {scale:2}); + + g.setFont("Vector",40); + g.setFontAlign(0,0); + g.setColor(1,1,1); + g.drawString("OFF", 180, 180); + return; + } + + // draw the heart + if (++toggle % 2 === 0) { + g.setColor(0); + g.fillRect(12, 132, 108, 228); + } else { + g.setColor(255,0,0); + //g.setColor(0xFFC0); // yellow + g.drawImage(img, 12, 132, {scale:2}); + } + + // draw the bpm + if (bpm !== prevBpm) { + prevBpm = bpm; + g.setColor(0); + g.fillRect(120, 120, 239, 239); + g.setColor(1,1,1); + //g.setColor(0xFFC0); // yellow + g.setFont("Vector",52); + g.setFontAlign(0,0); + g.drawString(bpm, 180, 180); + } + } + + return {init:init, freeResources:freeResources, startTimer:startTimer, stopTimer:stopTimer, + onButtonShort:onButtonShort, onButtonLong:onButtonLong}; + } + + return getFace; +})(); diff --git a/apps/kitchen/kitchen.app.js b/apps/kitchen/kitchen.app.js index 7093950f7..f2ba5a220 100644 --- a/apps/kitchen/kitchen.app.js +++ b/apps/kitchen/kitchen.app.js @@ -26,7 +26,7 @@ function nextFace(){ g.clear(); g.reset(); - face.init(gpsObj, swObj); + face.init(gpsObj, swObj, hrmObj); startdraw(); } @@ -651,6 +651,64 @@ function stopwatchDraw() { } +/***************************************************************************** + +Heart Rate Monitor + +******************************************************************************/ + +function HRM() { + this.bpm = 0; + this.confidence = 0; +} + +HRM.prototype.log_debug = function(o) { + //console.log(o); +} + +HRM.prototype.toggleHRMPower = function() { + this.log_debug("HRM.toggleHRMPower()"); + if (!Bangle.isHRMOn) return; // old firmware + + if (!Bangle.isHRMOn()) { + this.log_debug("HRM.toggleHRMPower(powerOn)"); + Bangle.removeListener('HRM', onHRM); + Bangle.setHRMPower(1); + Bangle.on('HRM', onHRM); + } else { + this.log_debug("HRM.toggleHRMPower(powerOff)"); + Bangle.removeListener('HRM', onHRM); + Bangle.setHRMPower(0); + } + + // poke the hrt widget indicator to change + if (WIDGETS.widhrt !== undefined) { + WIDGETS.widhrt.draw(); + } +} + +HRM.prototype.getBpm = function() { + return this.bpm; +} + +HRM.prototype.getConfidence = function() { + return this.confidence; +} + +HRM.prototype.onHRM = function(hrm) { + this.bpm = hrm.bpm; + this.confidence = hrm.confidence; + this.log_debug("onHRM:(bpm)" + this.bpm); + this.log_debug("onHRM:(conf) " + this.confidence); +} + +let hrmObj = new HRM(); + +function onHRM(hrm) { + hrmObj.onHRM(hrm); +} + + /***************************************************************************** Start App @@ -659,6 +717,6 @@ Start App g.clear(); Bangle.loadWidgets(); -face.init(gpsObj,swObj); +face.init(gpsObj,swObj, hrmObj); startdraw(); setButtons(); diff --git a/apps/kitchen/stepo.kit.js b/apps/kitchen/stepo.kit.js index 072cb43f1..beda7cb9c 100644 --- a/apps/kitchen/stepo.kit.js +++ b/apps/kitchen/stepo.kit.js @@ -5,7 +5,7 @@ var buf; var intervalRefSec; - function init(g,sw) { + function init(g,sw,hrm) { showMem("stepo init 1"); pal4color = new Uint16Array([0x0000,0xFFFF,0x7BEF,0xAFE5],0,2); // b,w,grey,greenyellow pal4red = new Uint16Array([0x0000,0xFFFF,0xF800,0xAFE5],0,2); // b,w,red,greenyellow diff --git a/apps/kitchen/swatch.kit.js b/apps/kitchen/swatch.kit.js index efec39d97..b88518cbd 100644 --- a/apps/kitchen/swatch.kit.js +++ b/apps/kitchen/swatch.kit.js @@ -2,7 +2,7 @@ function getFace(){ let swObject = undefined; - function init(gps, sw) { + function init(gps, sw, hrm) { swObject = sw; g.clear(); } From 9a4c90da69253fe3f215830ea694d1d01f0d4058 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 8 May 2021 14:14:02 +0100 Subject: [PATCH 02/15] kitchen: added screenshots for heart and swatch, updated README --- apps/kitchen/README.md | 22 ++++++++++++++++++++-- apps/kitchen/screenshot_heart.jpg | Bin 0 -> 38357 bytes apps/kitchen/screenshot_swatch.jpg | Bin 0 -> 35360 bytes 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 apps/kitchen/screenshot_heart.jpg create mode 100644 apps/kitchen/screenshot_swatch.jpg diff --git a/apps/kitchen/README.md b/apps/kitchen/README.md index 82629835c..9c77e6534 100644 --- a/apps/kitchen/README.md +++ b/apps/kitchen/README.md @@ -1,4 +1,4 @@ -# Kitchen Combo - a multiclock format of the waypointer, walkersclock, stepo and arrow apps. +# Kitchen Combo - a multiclock format of the waypointer, walkersclock, stepo, stopwatch, heartrate and arrow apps. ![](screenshot_kitchen.jpg) @@ -66,10 +66,16 @@ The following buttons depend on which face is currently in use - Use BTN3 to switch to the next app. ## Swatch +![](screenshot_swatch.jpg) - A simple stopwatch - BTN1 - start, stop - BTN2 - lap if the timer is running, reset if the timer is stopped +## Heart +![](screenshot_heart.jpg) +- A simple heart rate monitor, at present the app is just showing the raw value from HRM.bpm +- BTN1, long press, turn heart rate monitor on / off + ## Waypointer - Use BTN1 to select previous waypoint (when GPS is on) - Use BTN2 to select the next waypoint (when GPS is on) @@ -218,6 +224,13 @@ I have settled on directly writing to the screen using the Graphics object (g.) for the compass App. This creates a bit of flicker when the arrow moves but is more reliable than using the ArrayBuffer. +v0.09: Since adding the heart rate monitor I have noticed that I can +sometimes can a memory error when switch through the Apps back to the +Stepo App. I think this can be cured by statically allocating the +ArrayBuffer for stepo rather than using new everytime you switch back +into the stepo watch face. The problem is that the bangle memory +management / defragmentation is quite slow to run. + ### Error Codes @@ -227,8 +240,13 @@ The following error codes will be displayed if one of the dependancies is not me * E-CALIB - no compass calibration data was found, see 'Compass Calibration' * E-FW - require firmware 2v08.187 or later to detect gps and compass power status -### Issues +### Issues / Future enhancements +* Revisit statically assigning the display buffer for stepo to avoid memory defrag * GPS time display shows GMT and not BST, needs localising * Occassional buzzing after 2-3 days of use, seems to disappear after a reset to the launcher menu. Needs investigation +* Automatically switch the GPS power setting from Super-E to PSMOO 10 + seconds after the LCD goes off. At present I just rely on using + the GPSSetup app and set the GPS power mode that I want. +* Add a small graph to the heart rate monitor app diff --git a/apps/kitchen/screenshot_heart.jpg b/apps/kitchen/screenshot_heart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0951a9b062acb5439ecee8aa324d5a026a5ea5c GIT binary patch literal 38357 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

3u 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 Date: Sat, 8 May 2021 19:42:41 +0100 Subject: [PATCH 03/15] added debug object to write to debug.log --- apps/kitchen/kitchen.app.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/apps/kitchen/kitchen.app.js b/apps/kitchen/kitchen.app.js index f2ba5a220..cf60da0b3 100644 --- a/apps/kitchen/kitchen.app.js +++ b/apps/kitchen/kitchen.app.js @@ -33,8 +33,10 @@ function nextFace(){ // when you feel the buzzer you know you have done a long press function longPressCheck() { Bangle.buzz(); + debugObj.log("long PressCheck()"); if (pressTimer) { clearInterval(pressTimer); + debugObj.log("clear pressTimer 2"); pressTimer = undefined; } } @@ -45,6 +47,11 @@ function buttonPressed(btn) { nextFace(); } else { firstPress = getTime(); + if (pressTimer) { + debugObj.log("clear pressTimer 1"); + clearInterval(pressTimer); + } + debugObj.log("set pressTimer 1"); pressTimer = setInterval(longPressCheck, 1500); } } @@ -53,6 +60,7 @@ function buttonPressed(btn) { function buttonReleased(btn) { var dur = getTime() - firstPress; if (pressTimer) { + debugObj.log("clear pressTimer 3"); clearInterval(pressTimer); pressTimer = undefined; } @@ -248,6 +256,7 @@ GPS.prototype.processFix = function(fix) { this.gpsState = this.GPS_RUNNING; if (!this.last_fix.fix && !(require("Storage").readJSON("setting.json", 1) || {}).quiet) { Bangle.buzz(); // buzz on first position + debugObj.log("GPS fix buzz"); } this.last_fix = fix; } @@ -708,6 +717,23 @@ function onHRM(hrm) { hrmObj.onHRM(hrm); } +/***************************************************************************** + +Debug Object + +******************************************************************************/ + +function DEBUG() { + this.logfile = require("Storage").open("debug.log","a"); +} + +DEBUG.prototype.log = function(msg) { + let timestamp = new Date().toString().split(" ")[4]; + let line = timestamp + ", " + msg + "\n"; + this.logfile.write(line); +} + +debugObj = new DEBUG(); /***************************************************************************** From 9aced63de989c790ac7641edc374820d9693afe6 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Mon, 10 May 2021 16:23:54 +0100 Subject: [PATCH 04/15] Added date to sweep clock face --- apps.json | 4 ++-- apps/sweepclock/ChangeLog | 1 + apps/sweepclock/sweepclock.js | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 7e6d2bb5a..cf24bb2bc 100644 --- a/apps.json +++ b/apps.json @@ -242,8 +242,8 @@ { "id": "sweepclock", "name": "Sweep Clock", "icon": "sweepclock.png", - "version":"0.02", - "description": "Smooth sweep secondhand with single hour numeral. Use button1 to toggle the numeral font and button3 to change the colour theme", + "version":"0.03", + "description": "Smooth sweep secondhand with single hour numeral. Use button1 to toggle the numeral font and button 3 to change the colour theme", "tags": "clock", "type":"clock", "allow_emulator":true, diff --git a/apps/sweepclock/ChangeLog b/apps/sweepclock/ChangeLog index d5cf3753c..8eeb95c09 100644 --- a/apps/sweepclock/ChangeLog +++ b/apps/sweepclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial Release 0.02: Added Colour Themes +0.03: Added Date diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 9c53efa55..9bbdb67d2 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -264,8 +264,30 @@ function draw_clock(){ draw_seconds(date); draw_mins(date); draw_hours(date); + draw_date(date); force_redraw = false; } + +var local = require('locale'); +var last_date = null; +var last_datestr = null; +const DATE_COORD_X = 180; +const DATE_COORD_Y = 30; +function draw_date(date){ + if(force_redraw || last_date == null || last_date.getDate() != date.getDate()){ + var date_format = local.dow(date,1) + " " + date.getDate(); + g.setFontAlign(-1,-1,0); + g.setFont("Vector",15); + background = color_schemes[color_scheme_index].background; + g.setColor(background[0],background[1],background[2]); + g.drawString(last_datestr,DATE_COORD_X,DATE_COORD_Y); + g.setColor(numeral_color[0],numeral_color[1],numeral_color[2]); + g.drawString(date_format,DATE_COORD_X,DATE_COORD_Y); + last_date = date; + last_datestr = date_format; + } +} + // drawing the second the millisecond as we need the fine gradation // for the sweep second hand. function draw_seconds(date){ @@ -363,6 +385,7 @@ class CopasetFont extends NumeralFont{ x,y+dim[1] ]); g.setColor(1.0,1.0,1.0);*/ + g.setFontAlign(-1,-1,0); g.setFontCopasetic40x58Numeric(); g.drawString(hour_txt,x,y); } @@ -408,6 +431,7 @@ class RomanNumeralFont extends NumeralFont{ getDimensions(hour){ return this.dimension_map[hour];} hour_txt(hour){ return this.txt_map[hour]; } draw(hour_txt,x,y){ + g.setFontAlign(-1,-1,0); g.setFont("Vector",40); g.drawString(hour_txt,x,y); } From 1c7fd13cba0a2e863ca2899db72b1d856caa7ec7 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 10 May 2021 20:05:09 +0100 Subject: [PATCH 05/15] corrected apps.json for data setting for kitchen, missed a comma before data --- apps.json | 2 +- apps/kitchen/kitchen.app.js | 39 +++++++++++- apps/kitchen/stepo.kit.js | 116 ++++++++++++++++++++---------------- 3 files changed, 102 insertions(+), 55 deletions(-) diff --git a/apps.json b/apps.json index c3f47d074..43afb8370 100644 --- a/apps.json +++ b/apps.json @@ -3100,7 +3100,7 @@ {"name":"swatch.kit.js","url":"swatch.kit.js"}, {"name":"compass.kit.js","url":"compass.kit.js"}, {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} - ] + ], "data": [ {"name":"waypoints.json","url":"waypoints.json"} ] diff --git a/apps/kitchen/kitchen.app.js b/apps/kitchen/kitchen.app.js index cf60da0b3..d2cd5f940 100644 --- a/apps/kitchen/kitchen.app.js +++ b/apps/kitchen/kitchen.app.js @@ -26,7 +26,7 @@ function nextFace(){ g.clear(); g.reset(); - face.init(gpsObj, swObj, hrmObj); + face.init(gpsObj, swObj, hrmObj, tripObject); startdraw(); } @@ -717,6 +717,41 @@ function onHRM(hrm) { hrmObj.onHRM(hrm); } + +/***************************************************************************** + +Trip Counter + +******************************************************************************/ + +function TRIP() { + this.showTrip = false; + this.tripStart = 0; +} + +TRIP.prototype.resetTrip = function(steps) { + this.tripStart = (0 + steps); + console.log("resetTrip starting=" + this.tripStart); +} + +TRIP.prototype.getTrip = function(steps) { + let tripSteps = (0 + steps) - this.tripStart; + console.log("getTrip steps=" + steps); + console.log("getTrip tripStart=" + this.tripStart); + console.log("getTrip=" + tripSteps); + return tripSteps; +} + +TRIP.prototype.getTripState = function() { + return this.showTrip; +} + +TRIP.prototype.setTripState = function(t) { + this.showTrip = t; +} + +let tripObject = new TRIP(); + /***************************************************************************** Debug Object @@ -743,6 +778,6 @@ Start App g.clear(); Bangle.loadWidgets(); -face.init(gpsObj,swObj, hrmObj); +face.init(gpsObj,swObj, hrmObj, tripObject); startdraw(); setButtons(); diff --git a/apps/kitchen/stepo.kit.js b/apps/kitchen/stepo.kit.js index beda7cb9c..9fa34e8ab 100644 --- a/apps/kitchen/stepo.kit.js +++ b/apps/kitchen/stepo.kit.js @@ -1,44 +1,28 @@ (() => { function getFace(){ - var pal4color; - var pal4red; - var buf; var intervalRefSec; + var trip; + var prevSteps; - function init(g,sw,hrm) { - showMem("stepo init 1"); - pal4color = new Uint16Array([0x0000,0xFFFF,0x7BEF,0xAFE5],0,2); // b,w,grey,greenyellow - pal4red = new Uint16Array([0x0000,0xFFFF,0xF800,0xAFE5],0,2); // b,w,red,greenyellow - buf = Graphics.createArrayBuffer(120,120,2,{msb:true}); - showMem("stepo init 2"); + function init(g,sw,hrm,tr) { + trip = tr; } function freeResources() { - showMem("stepo free 1"); - pal4color = undefined; - pal4red = undefined; - buf = undefined; - showMem("stepo free 2"); - } - - function showMem(msg) { - var val = process.memory(); - var str = msg + " " + Math.round(val.usage*100/val.total) + "%"; - //console.log(str); + trip = undefined; + prevSteps = -1; } - function flip(x,y) { - g.drawImage({width:120,height:120,bpp:2,buffer:buf.buffer, palette:pal4color}, x, y); - buf.clear(); + function onButtonShort(btn) { + trip.setTripState(!trip.getTripState()); + drawStepText(); } - function flip_red(x,y) { - g.drawImage({width:120,height:120,bpp:2,buffer:buf.buffer, palette:pal4red}, x, y); - buf.clear(); + function onButtonLong(btn) { + trip.resetTrip(getSteps()); + trip.setTripState(true); + drawStepText(); } - - function onButtonShort(btn) {} - function onButtonLong(btn) {} function radians(a) { return a*Math.PI/180; @@ -55,10 +39,16 @@ function drawSteps() { var i = 0; - var cx = 60; - var cy = 60; + var cx = 60 + 60; + var cy = 60 + 115; var r = 56; var steps = getSteps(); + + if (prevSteps == steps) + return; + + prevSteps = steps; + var percent = steps / 10000; if (percent > 1) percent = 1; @@ -66,38 +56,60 @@ var startrot = 0 - 180; var midrot = -180 - (360 * percent); var endrot = -360 - 180; - - buf.setColor(3); // green-yellow + + g.setColor(0xAFE5); // greenyellow // draw guauge for (i = startrot; i > midrot; i -= 4) { x = cx + r * Math.sin(radians(i)); y = cy + r * Math.cos(radians(i)); - buf.fillCircle(x,y,4); + g.fillCircle(x,y,4); } - buf.setColor(2); // grey - - // draw remainder of guage in grey - for (i = midrot; i > endrot; i -= 4) { - x = cx + r * Math.sin(radians(i)); - y = cy + r * Math.cos(radians(i)); - buf.fillCircle(x,y,4); - } - - // draw steps - buf.setColor(1); // white - buf.setFont("Vector", 24); - buf.setFontAlign(0,0); - buf.drawString(steps, cx, cy); - // change the remaining color to RED if battery is below 25% if (E.getBattery() > 25) - flip(60,115); + g.setColor(0x7BEF); // grey else - flip_red(60,115); + g.setColor(0xF800); // red + + // draw remainder of guage in grey or red + for (i = midrot; i > endrot; i -= 4) { + x = cx + r * Math.sin(radians(i)); + y = cy + r * Math.cos(radians(i)); + g.fillCircle(x,y,4); + } } + function drawStepText() { + var cx = 60 + 60; + var cy = 60 + 115; + var r = 56; + var steps = getSteps(); + + /* + * if our trip count is greater than todays steps then we have + * rolled over to the next day so we should reset the trip counter + */ + if (trip.getTrip(steps) < 0) + trip.resetTrip(steps); + + // show trip count or total steps today + g.setFontAlign(0,0); + g.setFont("Vector", 24); + + // clear the space for the text + g.clearRect(cx - (r - 12), cy - 16, cx + (r - 12), cy + 16); + + if (trip.getTripState() == true) { + g.setColor(0x7BEF); // grey + //g.setColor(1,0,0); // red + g.drawString(trip.getTrip(steps), cx, cy); + } else { + g.setColor(1,1,1); // white + g.drawString(steps, cx, cy); + } + } + function draw() { var d = new Date(); var da = d.toString().split(" "); @@ -110,6 +122,7 @@ g.drawString(time, 120, 30, true); drawSteps(); + drawStepText(); } function getSteps() { @@ -132,5 +145,4 @@ } return getFace; - })(); From 41dde5ff2d57419bee1620ef20531ab9e2e4b56e Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 10 May 2021 20:32:02 +0100 Subject: [PATCH 06/15] kitchen: added trip counter to stepo, revertd to direct screen writes to avoid mem errors --- apps.json | 2 +- apps/kitchen/ChangeLog | 1 + apps/kitchen/README.md | 6 +++++- apps/kitchen/kitchen.app.js | 18 ++++++++++++------ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/apps.json b/apps.json index 43afb8370..e4da83e7f 100644 --- a/apps.json +++ b/apps.json @@ -3085,7 +3085,7 @@ { "id": "kitchen", "name": "Kitchen Combo", "icon": "kitchen.png", - "version":"0.09", + "version":"0.10", "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'. Requires firmware v2.08.167 or later", "tags": "tool,outdoors,gps", "type":"clock", diff --git a/apps/kitchen/ChangeLog b/apps/kitchen/ChangeLog index e1d816e47..71548ec30 100644 --- a/apps/kitchen/ChangeLog +++ b/apps/kitchen/ChangeLog @@ -7,3 +7,4 @@ 0.07: Added error codes if dependancies are missing 0.08: Improved error handling for missing firmware features, added template app.kit.js 0.09: Added heart rate monitor app +0.10: Converted Stepo to use direct screen writes, added a Trip Counter feature to stepo diff --git a/apps/kitchen/README.md b/apps/kitchen/README.md index 9c77e6534..a829a39b0 100644 --- a/apps/kitchen/README.md +++ b/apps/kitchen/README.md @@ -50,8 +50,10 @@ The following buttons depend on which face is currently in use - Show step count in the middle of the doughnut gauge - The gauge show percentage of steps out of a goal of 10000 steps - When the battery is less than 25% the doughnut turns red +- Use BTN1 to switch to the Trip Counter, use long press to reset Trip Counter - Use BTN3 to switch to the next app + ## GPS ![](screenshot_gps.jpg) - Use BTN1 long press to switch the GPS on or off @@ -231,6 +233,9 @@ ArrayBuffer for stepo rather than using new everytime you switch back into the stepo watch face. The problem is that the bangle memory management / defragmentation is quite slow to run. +v0.10: Revisited having a display buffer for the stepo part of the App. +Now use direct screen writing as it means less memory allocation and +reduces chance of getting a memory error on switching watch faces. ### Error Codes @@ -242,7 +247,6 @@ The following error codes will be displayed if one of the dependancies is not me ### Issues / Future enhancements -* Revisit statically assigning the display buffer for stepo to avoid memory defrag * GPS time display shows GMT and not BST, needs localising * Occassional buzzing after 2-3 days of use, seems to disappear after a reset to the launcher menu. Needs investigation diff --git a/apps/kitchen/kitchen.app.js b/apps/kitchen/kitchen.app.js index d2cd5f940..c3f7bd74d 100644 --- a/apps/kitchen/kitchen.app.js +++ b/apps/kitchen/kitchen.app.js @@ -33,10 +33,10 @@ function nextFace(){ // when you feel the buzzer you know you have done a long press function longPressCheck() { Bangle.buzz(); - debugObj.log("long PressCheck()"); + debug_log("long PressCheck() buzz"); if (pressTimer) { clearInterval(pressTimer); - debugObj.log("clear pressTimer 2"); + debug_log("clear pressTimer 2"); pressTimer = undefined; } } @@ -48,10 +48,10 @@ function buttonPressed(btn) { } else { firstPress = getTime(); if (pressTimer) { - debugObj.log("clear pressTimer 1"); + debug_log("clear pressTimer 1"); clearInterval(pressTimer); } - debugObj.log("set pressTimer 1"); + debug_log("set pressTimer 1"); pressTimer = setInterval(longPressCheck, 1500); } } @@ -60,7 +60,7 @@ function buttonPressed(btn) { function buttonReleased(btn) { var dur = getTime() - firstPress; if (pressTimer) { - debugObj.log("clear pressTimer 3"); + debug_log("clear pressTimer 3"); clearInterval(pressTimer); pressTimer = undefined; } @@ -256,7 +256,7 @@ GPS.prototype.processFix = function(fix) { this.gpsState = this.GPS_RUNNING; if (!this.last_fix.fix && !(require("Storage").readJSON("setting.json", 1) || {}).quiet) { Bangle.buzz(); // buzz on first position - debugObj.log("GPS fix buzz"); + debug_log("GPS fix buzz"); } this.last_fix = fix; } @@ -758,6 +758,7 @@ Debug Object ******************************************************************************/ +/* function DEBUG() { this.logfile = require("Storage").open("debug.log","a"); } @@ -769,6 +770,11 @@ DEBUG.prototype.log = function(msg) { } debugObj = new DEBUG(); +*/ + +function debug_log(m) { + //debugObj.log(m); +} /***************************************************************************** From 1e68caf22d8231e945556ec0036ef9efe8519ee0 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Wed, 12 May 2021 18:56:15 +0100 Subject: [PATCH 07/15] sweep clock. Added date placement with bitton 4 --- apps/sweepclock/sweepclock.js | 161 ++++++++++++++++++++++------------ 1 file changed, 105 insertions(+), 56 deletions(-) diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 9bbdb67d2..fa97d1b32 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -101,14 +101,14 @@ class ThinHand extends Hand { // and then call the predicate to see if a redraw is needed this.draw_test(this.angle,this.last_draw_time) ){ // rub out the old hand line - background = color_schemes[color_scheme_index].background; + var background = color_schemes[color_scheme_index].background; g.setColor(background[0],background[1],background[2]); g.drawLine(this.centerX, this.centerY, this.last_x, this.last_y); // Now draw the new hand line - hand_color = color_schemes[color_scheme_index][this.color_theme]; + var hand_color = color_schemes[color_scheme_index][this.color_theme]; g.setColor(hand_color[0],hand_color[1],hand_color[2]); - x2 = this.centerX + this.length*Math.sin(angle); - y2 = this.centerY - this.length*Math.cos(angle); + var x2 = this.centerX + this.length*Math.sin(angle); + var y2 = this.centerY - this.length*Math.cos(angle); g.drawLine(this.centerX, this.centerY, x2, y2); // and store the last draw details for the next call this.last_x = x2; @@ -170,7 +170,7 @@ class ThickHand extends Hand { // method to move the hand to a new angle moveTo(angle){ if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle - this.delta_base,this.angle + this.delta_base ,this.last_draw_time) ){ - background = color_schemes[color_scheme_index].background; + var background = color_schemes[color_scheme_index].background; g.setColor(background[0],background[1],background[2]); g.fillPoly([this.last_x1, this.last_y1, @@ -182,20 +182,20 @@ class ThickHand extends Hand { this.last_y4 ]); // bottom left - x1 = this.centerX + + var x1 = this.centerX + this.vertex_radius_base*Math.sin(angle - this.delta_base); - y1 = this.centerY - this.vertex_radius_base*Math.cos(angle - this.delta_base); + var y1 = this.centerY - this.vertex_radius_base*Math.cos(angle - this.delta_base); // bottom right - x2 = this.centerX + + var x2 = this.centerX + this.vertex_radius_base*Math.sin(angle + this.delta_base); - y2 = this.centerY - this.vertex_radius_base*Math.cos(angle + this.delta_base); + var y2 = this.centerY - this.vertex_radius_base*Math.cos(angle + this.delta_base); // top right - x3 = this.centerX + this.vertex_radius_top*Math.sin(angle + this.delta_top); - y3 = this.centerY - this.vertex_radius_top*Math.cos(angle + this.delta_top); + var x3 = this.centerX + this.vertex_radius_top*Math.sin(angle + this.delta_top); + var y3 = this.centerY - this.vertex_radius_top*Math.cos(angle + this.delta_top); // top left - x4 = this.centerX + this.vertex_radius_top*Math.sin(angle - this.delta_top); - y4 = this.centerY - this.vertex_radius_top*Math.cos(angle - this.delta_top); - hand_color = color_schemes[color_scheme_index][this.color_theme]; + var x4 = this.centerX + this.vertex_radius_top*Math.sin(angle - this.delta_top); + var y4 = this.centerY - this.vertex_radius_top*Math.cos(angle - this.delta_top); + var hand_color = color_schemes[color_scheme_index][this.color_theme]; g.setColor(hand_color[0],hand_color[1],hand_color[2]); g.fillPoly([x1,y1, x2,y2, @@ -271,23 +271,60 @@ function draw_clock(){ var local = require('locale'); var last_date = null; var last_datestr = null; -const DATE_COORD_X = 180; -const DATE_COORD_Y = 30; +var last_coords = null; +var date_coords = [ + { name: "topright", coords:[180,30]}, + { name: "bottomright", coords:[180,220]}, + { name: "bottomleft", coords: [5,220]}, + { name: "topleft", coords:[5,30]}, + { name: "offscreen", coords: [240,30]} +]; +var date_coord_index = 0; + function draw_date(date){ if(force_redraw || last_date == null || last_date.getDate() != date.getDate()){ - var date_format = local.dow(date,1) + " " + date.getDate(); + //console.log("redrawing date"); g.setFontAlign(-1,-1,0); g.setFont("Vector",15); - background = color_schemes[color_scheme_index].background; - g.setColor(background[0],background[1],background[2]); - g.drawString(last_datestr,DATE_COORD_X,DATE_COORD_Y); - g.setColor(numeral_color[0],numeral_color[1],numeral_color[2]); - g.drawString(date_format,DATE_COORD_X,DATE_COORD_Y); - last_date = date; - last_datestr = date_format; + if(last_coords != null && last_datestr != null) { + background = color_schemes[color_scheme_index].background; + g.setColor(background[0], background[1], background[2]); + g.drawString(last_datestr, last_coords[0], last_coords[1]); + } + var coords = date_coords[date_coord_index].coords; + if(coords != null) { + var date_format = local.dow(date,1) + " " + date.getDate(); + var numeral_color = color_schemes[color_scheme_index].numeral; + g.setColor(numeral_color[0], numeral_color[1], numeral_color[2]); + g.drawString(date_format, coords[0], coords[1]); + last_date = date; + last_datestr = date_format; + last_coords = coords; + } } } +function next_datecoords() { + date_coord_index = date_coord_index + 1; + if (date_coord_index >= date_coords.length) { + date_coord_index = 0; + } + //console.log("date coord index->" + date_coord_index); + force_redraw = true; +} + +function set_datecoords(date_name){ + console.log("setting date:" + date_name); + for (var i=0; i < date_coords.length; i++) { + if(date_coords[i].getName() == date_name){ + date_coord_index = i; + force_redraw = true; + console.log("date match"); + break; + } + } +} + // drawing the second the millisecond as we need the fine gradation // for the sweep second hand. function draw_seconds(date){ @@ -495,48 +532,48 @@ class HourScriber { this.numeral_font = numeral_font; } drawHour(hours){ - changed = false; + var changed = false; if(this.curr_hours != hours || this.curr_numeral_font !=this.numeral_font){ - background = color_schemes[color_scheme_index].background; + var background = color_schemes[color_scheme_index].background; g.setColor(background[0],background[1],background[2]); this.curr_numeral_font.draw(this.curr_hour_str, this.curr_hour_x, this.curr_hour_y); //console.log("erasing old hour"); - hours_frac = hours / 12; - angle = 2*Math.PI*hours_frac; - dimensions = this.numeral_font.getDimensions(hours); + var hours_frac = hours / 12; + var angle = 2*Math.PI*hours_frac; + var dimensions = this.numeral_font.getDimensions(hours); // we set the radial coord to be in the middle // of the drawn text. - width = dimensions[0]; - height = dimensions[1]; - delta_center_x = this.radius*Math.sin(angle) - width/2; - delta_center_y = this.radius*Math.cos(angle) + height/2; + var width = dimensions[0]; + var height = dimensions[1]; + var delta_center_x = this.radius*Math.sin(angle) - width/2; + var delta_center_y = this.radius*Math.cos(angle) + height/2; this.curr_hour_x = screen_center_x + delta_center_x; this.curr_hour_y = screen_center_y - delta_center_y; this.curr_hour_str = this.numeral_font.hour_txt(hours); // now work out the angle of the beginning and the end of the // text box so we know when to redraw // bottom left angle - x1 = delta_center_x; - y1 = delta_center_y; - r1 = Math.sqrt(x1*x1 + y1*y1); - angle1 = reifyasin(x1,y1,Math.asin(x1/r1)); + var x1 = delta_center_x; + var y1 = delta_center_y; + var r1 = Math.sqrt(x1*x1 + y1*y1); + var angle1 = reifyasin(x1,y1,Math.asin(x1/r1)); // bottom right angle - x2 = delta_center_x; - y2 = delta_center_y - height; - r2 = Math.sqrt(x2*x2 + y2*y2); - angle2 = reifyasin(x2,y2,Math.asin(x2/r2)); + var x2 = delta_center_x; + var y2 = delta_center_y - height; + var r2 = Math.sqrt(x2*x2 + y2*y2); + var angle2 = reifyasin(x2,y2,Math.asin(x2/r2)); // top left angle - x3 = delta_center_x + width; - y3 = delta_center_y; - r3 = Math.sqrt(x3*x3 + y3*y3); - angle3 = reifyasin(x3,y3, Math.asin(x3/r3)); + var x3 = delta_center_x + width; + var y3 = delta_center_y; + var r3 = Math.sqrt(x3*x3 + y3*y3); + var angle3 = reifyasin(x3,y3, Math.asin(x3/r3)); // top right angle - x4 = delta_center_x + width; - y4 = delta_center_y - height; - r4 = Math.sqrt(x4*x4 + y4*y4); - angle4 = reifyasin(x4,y4,Math.asin(x4/r4)); + var x4 = delta_center_x + width; + var y4 = delta_center_y - height; + var r4 = Math.sqrt(x4*x4 + y4*y4); + var angle4 = reifyasin(x4,y4,Math.asin(x4/r4)); if(Math.min(angle1,angle2,angle3,angle4) < Math.PI && Math.max(angle1,angle2,angle3,angle4) > 1.5*Math.PI){ angle1 = rebaseNegative(angle1); angle2 = rebaseNegative(angle2); @@ -556,7 +593,7 @@ class HourScriber { } if(changed || this.draw_test(this.angle_from, this.angle_to, this.last_draw_time) ){ - numeral_color = color_schemes[color_scheme_index].numeral; + var numeral_color = color_schemes[color_scheme_index].numeral; g.setColor(numeral_color[0],numeral_color[1],numeral_color[2]); this.numeral_font.draw(this.curr_hour_str,this.curr_hour_x,this.curr_hour_y); this.last_draw_time = new Date(); @@ -571,7 +608,7 @@ let numeral_fonts_index = 0; * predicate for deciding when the digit has to be redrawn */ let hour_numeral_redraw = function(angle_from, angle_to, last_draw_time){ - seconds_hand_angle = seconds_hand.angle; + var seconds_hand_angle = seconds_hand.angle; // we have to cope with the 12 problem where the // left side of the box has a value almost 2PI and the right // side has a small positive value. The values are rebased so @@ -609,8 +646,8 @@ function next_font(){ } function draw_hour_digit(date){ - hours = date.getHours() % 12; - mins = date.getMinutes(); + var hours = date.getHours() % 12; + var mins = date.getMinutes(); if(mins > 30){ hours = (hours +1) % 12; } @@ -622,7 +659,7 @@ function draw_hour_digit(date){ function draw_background(){ if(force_redraw){ - background = color_schemes[color_scheme_index].background; + var background = color_schemes[color_scheme_index].background; g.setColor(background[0],background[1],background[2]); g.fillPoly([0,25, 0,240, @@ -649,7 +686,7 @@ function set_colorscheme(colorscheme_name){ if(color_schemes[i].name == colorscheme_name){ color_scheme_index = i; force_redraw = true; - console.log("match"); + console.log("color scheme match"); break; } } @@ -665,7 +702,7 @@ function set_font(font_name){ if(numeral_fonts[i].getName() == font_name){ numeral_fonts_index = i; force_redraw = true; - console.log("match"); + console.log("font match"); hour_scriber.setNumeralFont(numeral_fonts[numeral_fonts_index]); break; } @@ -686,6 +723,9 @@ function load_settings(){ if(settings.font != null){ set_font(settings.font); } + if(settings.date!= null){ + set_datecoords(settings.date); + } } else { console.log("no settings to load"); } @@ -701,6 +741,7 @@ function save_settings(){ settings = { font : numeral_fonts[numeral_fonts_index].getName(), color_scheme : color_schemes[color_scheme_index].name, + date: date_coords[date_coord_index].name }; console.log("saving:" + JSON.stringify(settings)); require("Storage").writeJSON("sweepclock.settings.json",settings); @@ -777,9 +818,17 @@ function button3pressed(){ save_settings(); } +function button4pressed(){ + //console.log("button 4 pressed"); + next_datecoords(); + save_settings(); +} + // Handle button 1 being pressed setWatch(button1pressed, BTN1,{repeat:true,edge:"falling"}); // Handle button 3 being pressed setWatch(button3pressed, BTN3,{repeat:true,edge:"falling"}); +// Handle button 3 being pressed +setWatch(button4pressed, BTN4,{repeat:true,edge:"falling"}); From 34552e090285cccf75f0b2beb50d074137841774 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Wed, 12 May 2021 18:57:47 +0100 Subject: [PATCH 08/15] Sweepclock: updated the decription for button 4 date placement --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index cf24bb2bc..7941cdb17 100644 --- a/apps.json +++ b/apps.json @@ -243,7 +243,7 @@ "name": "Sweep Clock", "icon": "sweepclock.png", "version":"0.03", - "description": "Smooth sweep secondhand with single hour numeral. Use button1 to toggle the numeral font and button 3 to change the colour theme", + "description": "Smooth sweep secondhand with single hour numeral. Use button1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement", "tags": "clock", "type":"clock", "allow_emulator":true, From d6d8747a2e4c72a89523b9aacf3bccef3206ec36 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Thu, 13 May 2021 00:45:21 +0100 Subject: [PATCH 09/15] Sweep clock - added documentation for the date button --- apps/sweepclock/README.md | 7 ++- apps/sweepclock/date-01.jpg | Bin 0 -> 18450 bytes apps/sweepclock/date-02.jpg | Bin 0 -> 19670 bytes apps/sweepclock/date-03.jpg | Bin 0 -> 19734 bytes apps/sweepclock/date-04.jpg | Bin 0 -> 19082 bytes apps/sweepclock/sweepclock.js | 87 ++++++++++++++++++---------------- 6 files changed, 51 insertions(+), 43 deletions(-) create mode 100644 apps/sweepclock/date-01.jpg create mode 100644 apps/sweepclock/date-02.jpg create mode 100644 apps/sweepclock/date-03.jpg create mode 100644 apps/sweepclock/date-04.jpg diff --git a/apps/sweepclock/README.md b/apps/sweepclock/README.md index 8ddb7decb..cbdb2a3f8 100644 --- a/apps/sweepclock/README.md +++ b/apps/sweepclock/README.md @@ -23,7 +23,12 @@ Button 3 (bottom right button) is used to change the colour | ---- | ---- | ---- | | ![](./color-01.jpg) | ![](color-02.jpg) | ![](color-03.jpg) | +### Button 4 +Button 4 (bottom left of screen) is used to change the date positioning (or to remove from the screen) +| Top Right | Bottom Right | Bottom Left | Top Left | +| ---- | ---- | ---- | ---- | +| ![](./date-01.jpg) | ![](date-02.jpg) | ![](date-03.jpg) | ![](date-04.jpg) | ## Further Details @@ -35,4 +40,4 @@ Reach out to adrian@adriankirk.com if you have feature requests or notice bugs. ## Creator -Made by [Adrian Kirk](mailto:adrian@adriankirk.com) +Made by [Adrian Kirk](mailto:adrian@adriankirk.com) \ No newline at end of file diff --git a/apps/sweepclock/date-01.jpg b/apps/sweepclock/date-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79d12e75b9b752d241953b7b16fbde86cc07d5ec GIT binary patch literal 18450 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 aa;?XDP0Q*r^`~|}QT=JSUqSg$2mjeZu75lL literal 0 HcmV?d00001 diff --git a/apps/sweepclock/date-02.jpg b/apps/sweepclock/date-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14a64980c7781ceba4cd3297a35f5409f47510b3 GIT binary patch literal 19670 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 literal 0 HcmV?d00001 diff --git a/apps/sweepclock/date-03.jpg b/apps/sweepclock/date-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e30a01932280a9b8a4a46695737b25e5f25d773c GIT binary patch literal 19734 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

$+} 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 AW&i*H literal 0 HcmV?d00001 diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index fa97d1b32..df6b09e3d 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -6,6 +6,7 @@ const screen_center_x = g.getWidth()/2; const screen_center_y = 10 + g.getHeight()/2; +const TWO_PI = 2*Math.PI; require("FontCopasetic40x58Numeric").add(Graphics); @@ -222,25 +223,27 @@ class ThickHand extends Hand { let force_redraw = false; // The seconds hand is the main focus and is set to redraw on every cycle let seconds_hand = new ThinHand(screen_center_x, - screen_center_y, - 95, - 0, - (angle, last_draw_time) => false, - "second_hand"); + screen_center_y, + 95, + 0, + (angle, last_draw_time) => false, + "second_hand"); + // The minute hand is set to redraw at a 250th of a circle, // when the second hand is ontop or slighly overtaking // or when a force_redraw is called let minutes_hand_redraw = function(angle, last_draw_time){ return force_redraw || (seconds_hand.angle > angle && - Math.abs(seconds_hand.angle - angle) <2*Math.PI/25 && + Math.abs(seconds_hand.angle - angle) 500); }; -let minutes_hand = new ThinHand(screen_center_x, - screen_center_y, - 80, - 2*Math.PI/250, - minutes_hand_redraw, - "minute_hand"); +let minutes_hand = new ThinHand(screen_center_x, + screen_center_y, + 80, + TWO_PI/250, + minutes_hand_redraw, + "minute_hand" +); // The hour hand is a thick hand so we have to redraw when the minute hand // overlaps from its behind andle coverage to its ahead angle coverage. let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ @@ -249,16 +252,16 @@ let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ new Date().getTime() - last_draw_time.getTime() > 500); }; let hours_hand = new ThickHand(screen_center_x, - screen_center_y, - 40, - 2*Math.PI/600, - hour_hand_redraw, - "hour_hand", - 5, - 4); + screen_center_y, + 40, + TWO_PI/600, + hour_hand_redraw, + "hour_hand", + 5, + 4); function draw_clock(){ - date = new Date(); + var date = new Date(); draw_background(); draw_hour_digit(date); draw_seconds(date); @@ -287,7 +290,7 @@ function draw_date(date){ g.setFontAlign(-1,-1,0); g.setFont("Vector",15); if(last_coords != null && last_datestr != null) { - background = color_schemes[color_scheme_index].background; + var background = color_schemes[color_scheme_index].background; g.setColor(background[0], background[1], background[2]); g.drawString(last_datestr, last_coords[0], last_coords[1]); } @@ -328,28 +331,28 @@ function set_datecoords(date_name){ // drawing the second the millisecond as we need the fine gradation // for the sweep second hand. function draw_seconds(date){ - seconds = date.getSeconds() + date.getMilliseconds()/1000; - seconds_frac = seconds / 60; - seconds_angle = 2*Math.PI*seconds_frac; + var seconds = date.getSeconds() + date.getMilliseconds()/1000; + var seconds_frac = seconds / 60; + var seconds_angle = TWO_PI*seconds_frac; seconds_hand.moveTo(seconds_angle); } // drawing the minute includes the second and millisec to make the // movement as continuous as possible. function draw_mins(date,seconds_angle){ - mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); - mins_frac = mins / 60; - mins_angle = 2*Math.PI*mins_frac; - redraw = minutes_hand.moveTo(mins_angle); + var mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); + var mins_frac = mins / 60; + var mins_angle = TWO_PI*mins_frac; + var redraw = minutes_hand.moveTo(mins_angle); if(redraw){ //console.log("redraw mins"); } } function draw_hours(date){ - hours = (date.getHours() % 12) + date.getMinutes()/60 + date.getSeconds()/3600; - hours_frac = hours / 12; - hours_angle = 2*Math.PI*hours_frac; - redraw = hours_hand.moveTo(hours_angle); + var hours = (date.getHours() % 12) + date.getMinutes()/60 + date.getSeconds()/3600; + var hours_frac = hours / 12; + var hours_angle = TWO_PI*hours_frac; + var redraw = hours_hand.moveTo(hours_angle); if(redraw){ //console.log("redraw hours"); } @@ -487,7 +490,7 @@ function reifyasin(x,y,asin_angle){ } else if(x < 0 && y < 0){ return Math.PI - asin_angle; } else { - return 2*Math.PI + asin_angle; + return TWO_PI + asin_angle; } } @@ -495,7 +498,7 @@ function reifyasin(x,y,asin_angle){ // rather than 0 to 2PI function rebaseNegative(angle){ if(angle > Math.PI){ - return angle - 2*Math.PI; + return angle - TWO_PI; } else { return angle; } @@ -505,7 +508,7 @@ function rebaseNegative(angle){ // rather than -pi to pi function rebasePositive(angle){ if(angle < 0){ - return angle + 2*Math.PI; + return angle + TWO_PI; } else { return angle; } @@ -541,7 +544,7 @@ class HourScriber { this.curr_hour_y); //console.log("erasing old hour"); var hours_frac = hours / 12; - var angle = 2*Math.PI*hours_frac; + var angle = TWO_PI*hours_frac; var dimensions = this.numeral_font.getDimensions(hours); // we set the radial coord to be in the middle // of the drawn text. @@ -614,12 +617,12 @@ let hour_numeral_redraw = function(angle_from, angle_to, last_draw_time){ // side has a small positive value. The values are rebased so // that they can be compared if(angle_from > angle_to && angle_from > 1.5*Math.PI){ - angle_from = angle_from - 2*Math.PI; + angle_from = angle_from - TWO_PI; if(seconds_hand_angle > Math.PI) - seconds_hand_angle = seconds_hand_angle - 2*Math.PI; + seconds_hand_angle = seconds_hand_angle - TWO_PI; } //console.log("initial:" + angle_from + "/" + angle_to + " seconds " + seconds_hand_angle); - redraw = force_redraw || + var redraw = force_redraw || (seconds_hand_angle >= angle_from && seconds_hand_angle <= angle_to) || (minutes_hand.last_draw_time.getTime() > last_draw_time.getTime()); if(redraw){ @@ -714,7 +717,7 @@ function set_font(font_name){ */ function load_settings(){ try{ - settings = require("Storage").readJSON("sweepclock.settings.json"); + var settings = require("Storage").readJSON("sweepclock.settings.json"); if(settings != null){ console.log("loaded:" + JSON.stringify(settings)); if(settings.color_scheme != null){ @@ -723,7 +726,7 @@ function load_settings(){ if(settings.font != null){ set_font(settings.font); } - if(settings.date!= null){ + if(settings.date != null){ set_datecoords(settings.date); } } else { @@ -738,7 +741,7 @@ function load_settings(){ * Called on button press to save down the last preference settings */ function save_settings(){ - settings = { + var settings = { font : numeral_fonts[numeral_fonts_index].getName(), color_scheme : color_schemes[color_scheme_index].name, date: date_coords[date_coord_index].name From 51fe73152d1efe71f6655804a70d59171d29256a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 13 May 2021 08:20:46 +0100 Subject: [PATCH 10/15] fix 'npm test' version warnings, add README --- apps.json | 7 ++++--- apps/doztime/ChangeLog | 1 + apps/doztime/README.md | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 apps/doztime/ChangeLog create mode 100644 apps/doztime/README.md diff --git a/apps.json b/apps.json index 7a5aae374..980eabc40 100644 --- a/apps.json +++ b/apps.json @@ -3155,7 +3155,7 @@ "id": "omnitrix", "name":"Omnitrix", "icon":"omnitrix.png", - "version": "1.0", + "version": "0.01", "readme": "README.md", "description": "An Omnitrix Showpiece", "tags": "game", @@ -3169,7 +3169,7 @@ "name": "Bat Clock", "shortName":"Bat Clock", "icon": "bat-clock.png", - "version":"1.0", + "version":"0.01", "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", "tags": "clock", "type": "clock", @@ -3183,10 +3183,11 @@ "name":"Dozenal Time", "shortName":"Dozenal Time", "icon":"app.png", - "version":"1.0", + "version":"0.01", "description":"A dozenal Holocene calendar and dozenal diurnal clock", "tags":"clock", "type":"clock", + "readme": "README.md", "storage": [ {"name":"doztime.app.js","url":"app.js"}, {"name":"doztime.img","url":"app-icon.js","evaluate":true} diff --git a/apps/doztime/ChangeLog b/apps/doztime/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/doztime/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/doztime/README.md b/apps/doztime/README.md new file mode 100644 index 000000000..075b2f66a --- /dev/null +++ b/apps/doztime/README.md @@ -0,0 +1,14 @@ +Dozenal Time +============ + +A dozenal Holocene calendar and a dozenal diurnal clock. For information about them, go to https://dozenal.ae-web.ca/pdf/dozenal-calendar.pdf and https://dozenal.ae-web.ca/pdf/about-short.pdf. They've been in use for some years. + +In the dozenal number base, ten and eleven are single digits, and 10 is a dozen. The clock simply divides the day by successive powers of a dozen. The day or parts of it may be divided easily into halves, thirds, quarters, sixths, or twelfths (dozenths). There is no conglomeration of bases two, ten, twelve, and sixty, as in the current system of time measurement. + +The annual calendar has a dozen months of 5 weeks each, each week having 6 days. The 5 or 6 days beyond 360 (dozenal 260) are added where they keep the season beginnings the most accurate. + +The year itself begins on the December solstice. Because that always happens, there is no need of a leap-year rule to keep the seasons from drifting. + +The epoch (year numbering) begins in the last year when the perihelion coincided with the June solstice, near the beginning of the Holocene era. That astronomical basis makes the calendar free from politics, religion, or geography. + +While the year number remains cardinal, BTN5 toggles between cardinal and ordinal for the rest of the calendar segments. BTN4 adds or removes a quickly changing digit to or from the clock. From bf1b2a52eb1779c1402a9aa175435f1a343dcbea Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 13 May 2021 08:20:54 +0100 Subject: [PATCH 11/15] update core --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 1b1293a5e..7d04c4884 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 1b1293a5eb9b8bb9e4f743c4599f0587f597d368 +Subproject commit 7d04c488496c873f392c5a068f72a6c75df40f70 From da8dc6cd57c8d7c1a07bde40e439434e4a785cc0 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Thu, 13 May 2021 15:00:03 +0200 Subject: [PATCH 12/15] gbmusic: reduce fadeout flicker, clean comments --- apps.json | 2 +- apps/gbmusic/ChangeLog | 1 + apps/gbmusic/app.js | 53 ++++++++++++++++++++++++++++-------------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index 980eabc40..c5fd8f130 100644 --- a/apps.json +++ b/apps.json @@ -3044,7 +3044,7 @@ "name": "Gadgetbridge Music Controls", "shortName":"Music Controls", "icon": "icon.png", - "version":"0.04", + "version":"0.05", "description": "Control the music on your Gadgetbridge-connected phone", "tags": "tools,bluetooth,gadgetbridge,music", "type":"app", diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index 99dd02116..e04b1b699 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -2,3 +2,4 @@ 0.02: Increase text brightness, improve controls, (try to) reduce memory usage 0.03: Only auto-start if active app is a clock, auto close after 1 hour of inactivity 0.04: Setting to disable touch controls, minor bugfix +0.05: Reduce fadeout flicker \ No newline at end of file diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index 75c028b20..908cba0a5 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -42,7 +42,7 @@ function fadeOut() { if (!Bangle.isLCDOn() || !fade) { return; } - drawMusic(); + drawMusic(false); // don't clear: draw over existing text to prevent flicker setTimeout(fadeOut, 500); } function brightness() { @@ -131,7 +131,7 @@ function f2hex(f) { return ("00"+(Math.round(f*255)).toString(16)).substr(-2); } /** - * @param name + * @param {string} name - musicinfo property "num"/"artist"/"album"/"track" * @return {string} Semi-random color to use for given info */ function infoColor(name) { @@ -174,7 +174,6 @@ function trackColor() { //////////////////// /** * Draw date and time - * @return {*} */ function drawDateTime() { const now = new Date; @@ -209,8 +208,9 @@ function drawDateTime() { /** * Draw track number and total count + * @param {boolean} clr - Clear area before redrawing? */ -function drawNum() { +function drawNum(clr) { let num = ""; if ("n" in info && info.n>0) { num = "#"+info.n; @@ -220,9 +220,11 @@ function drawNum() { } g.reset(); g.setFont("Vector", 30) - .setFontAlign(1, -1) // top right - .clearRect(225, 30, 120, 60) - .drawString(num, 225, 30); + .setFontAlign(1, -1); // top right + if (clr) { + g.clearRect(225, 30, 120, 60); + } + g.drawString(num, 225, 30); } /** * Clear rectangle used by track title @@ -232,8 +234,9 @@ function clearTrack() { } /** * Draw track title + * @param {boolean} clr - Clear area before redrawing? */ -function drawTrack() { +function drawTrack(clr) { let size = fitText(info.track); if (size<25) { // the title is too long: start the scroller @@ -250,7 +253,9 @@ function drawTrack() { g.setFont("Vector", size) .setFontAlign(0, 1) // center bottom .setColor(trackColor()); - clearTrack(); + if (clr) { + clearTrack(); + } g.drawString(info.track, 119, 109); } /** @@ -270,8 +275,9 @@ function drawScroller() { /** * Draw track artist and album + * @param {boolean} clr - Clear area before redrawing? */ -function drawArtistAlbum() { +function drawArtistAlbum(clr) { // we just use small enough fonts to make these always fit // calculate stuff before clear+redraw const aCol = infoColor("artist"); @@ -285,7 +291,9 @@ function drawArtistAlbum() { bSiz = 20; } g.reset(); - g.clearRect(0, 120, 240, 189); + if (clr) { + g.clearRect(0, 120, 240, 189); + } let top = 124; if (info.artist) { g.setFont("Vector", aSiz) @@ -379,10 +387,14 @@ function drawControls() { controlState = stat; } -function drawMusic() { - drawNum(); - drawTrack(); - drawArtistAlbum(); +/** + * @param {boolean} [clr=true] Clear area before redrawing? + */ +function drawMusic(clr) { + clr = !(clr===false); // undefined means yes + drawNum(clr); + drawTrack(clr); + drawArtistAlbum(clr); } //////////////////////// @@ -390,7 +402,7 @@ function drawMusic() { /////////////////////// /** * Update music info - * @param e + * @param {Object} e - Gadgetbridge musicinfo event */ function musicInfo(e) { info = e; @@ -410,7 +422,11 @@ function musicInfo(e) { } } -let tPxt, tIxt; +let tPxt, tIxt; // Timeouts to eXiT when Paused/Inactive for too long +/** + * Update music state + * @param {Object} e - Gadgetbridge musicstate event + */ function musicState(e) { stat = e.state; // if paused for five minutes, load the clock @@ -446,6 +462,7 @@ function musicState(e) { } } if (Bangle.isLCDOn()) { + drawMusic(false); // redraw in case we were fading out but resumed play drawControls(); } } @@ -500,7 +517,7 @@ function handleButton2Press() { let tCommand = {}; /** * Send command and highlight corresponding control - * @param command "play/pause/next/previous/volumeup/volumedown" + * @param {string} command - "play"/"pause"/"next"/"previous"/"volumeup"/"volumedown" */ function sendCommand(command) { Bluetooth.println(JSON.stringify({t: "music", n: command})); From 195f5928f623c8e7c6b880c5b4cf1d552b1a04e4 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Thu, 13 May 2021 15:14:07 +0200 Subject: [PATCH 13/15] gbmusic: Simplify touch controls setting Firmware 2v10 will disable touch/swipe while the LCD is off anyway. (Next commit will just remove this setting altogether, but just in case) --- apps/gbmusic/ChangeLog | 2 +- apps/gbmusic/README.md | 2 +- apps/gbmusic/app.js | 8 ++++---- apps/gbmusic/settings.js | 26 ++++++++++++++------------ 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index e04b1b699..a400e0737 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -2,4 +2,4 @@ 0.02: Increase text brightness, improve controls, (try to) reduce memory usage 0.03: Only auto-start if active app is a clock, auto close after 1 hour of inactivity 0.04: Setting to disable touch controls, minor bugfix -0.05: Reduce fadeout flicker \ No newline at end of file +0.05: Simplify touch controls setting, reduce fadeout flicker \ No newline at end of file diff --git a/apps/gbmusic/README.md b/apps/gbmusic/README.md index d081e952f..9a272f27d 100644 --- a/apps/gbmusic/README.md +++ b/apps/gbmusic/README.md @@ -22,7 +22,7 @@ You can change these under `Settings`->`App/Widget Settings`->`Music Controls`. Automatically load the app when you play music and close when the music stops. (If the app opened automatically, it closes after music has been paused for 5 minutes.) -**Touch**: +**Touch controls**: Enable touch controls? ## Controls diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index 908cba0a5..d3be1b3f6 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -13,9 +13,9 @@ let info = { }; const POUT = 300000; // auto close timeout when paused: 5 minutes (in ms) const IOUT = 3600000; // auto close timeout for inactivity: 1 hour (in ms) -// Touch controls? 0: off, 1: when LCD on, 2: always +// Touch controls? let s = require("Storage").readJSON("gbmusic.json", 1) || {}; -const TCTL = ("touch" in s) ? (s.touch|0)%3 : 1; +const TCTL = ("touch" in s) ? !!s.touch : true; // previous versions used an int for this setting delete s; /////////////////////// @@ -539,7 +539,7 @@ function togglePlay() { function startTouchWatches() { if (!TCTL) {return;} Bangle.on("touch", side => { - if (TCTL<2 && !Bangle.isLCDOn()) {return;} + if (!Bangle.isLCDOn()) {return;} // for <2v10 firmware switch(side) { case 1: sendCommand(stat==="play" ? "pause" : "previous"); @@ -552,7 +552,7 @@ function startTouchWatches() { } }); Bangle.on("swipe", dir => { - if (TCTL<2 && !Bangle.isLCDOn()) {return;} + if (!Bangle.isLCDOn()) {return;} // for <2v10 firmware sendCommand(dir===1 ? "previous" : "next"); }); } diff --git a/apps/gbmusic/settings.js b/apps/gbmusic/settings.js index d2dafb8f3..b8cdb002e 100644 --- a/apps/gbmusic/settings.js +++ b/apps/gbmusic/settings.js @@ -5,12 +5,11 @@ const SETTINGS_FILE = "gbmusic.json", storage = require("Storage"), translate = require("locale").translate; - const TOUCH_OPTIONS = ["Off", "When LCD on", "Always"]; // initialize with default settings... let s = { autoStart: true, - touch: 1, + touch: true, }; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -19,24 +18,27 @@ s[key] = saved[key]; } - function save(key, value) { - s[key] = value; - storage.write(SETTINGS_FILE, s); + function save(key) { + return function (value) { + s[key] = value; + storage.write(SETTINGS_FILE, s); + } } + const yesNo = (v) => translate(v ? "Yes" : "No"); let menu = { "": {"title": "Music Control"}, }; menu[translate("< Back")] = back; menu[translate("Auto start")] = { - value: s.autoStart, - format: v => translate(v ? "Yes" : "No"), - onchange: v => {save("autoStart", v);}, + value: !!s.autoStart, + format: yesNo, + onchange: save("autoStart"), }; - menu[translate("Touch")] = { - value: s.touch|0, - format: v => translate(TOUCH_OPTIONS[(v+3)%3]), - onchange: v => {save("touch", (v+3)%3);}, + menu[translate("Touch controls")] = { + value: !!s.touch, + format: yesNo, + onchange: save("touch"), }; E.showMenu(menu); From 14c4bfdb8b065a62929c8de60eafece332cb64e8 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Thu, 13 May 2021 15:21:24 +0200 Subject: [PATCH 14/15] gbmusic: Remove touch controls setting Firmware 2v10 will disable touch/swipe while the LCD is off anyway, so just enable them always. (but keeps the check that the LCD is on until the whole world has upgraded their firmware) --- apps/gbmusic/ChangeLog | 2 +- apps/gbmusic/README.md | 2 -- apps/gbmusic/app.js | 6 ------ apps/gbmusic/settings.js | 6 ------ 4 files changed, 1 insertion(+), 15 deletions(-) diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index a400e0737..814e6d3ae 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -2,4 +2,4 @@ 0.02: Increase text brightness, improve controls, (try to) reduce memory usage 0.03: Only auto-start if active app is a clock, auto close after 1 hour of inactivity 0.04: Setting to disable touch controls, minor bugfix -0.05: Simplify touch controls setting, reduce fadeout flicker \ No newline at end of file +0.05: Remove touch controls setting, reduce fadeout flicker \ No newline at end of file diff --git a/apps/gbmusic/README.md b/apps/gbmusic/README.md index 9a272f27d..52a74499c 100644 --- a/apps/gbmusic/README.md +++ b/apps/gbmusic/README.md @@ -22,8 +22,6 @@ You can change these under `Settings`->`App/Widget Settings`->`Music Controls`. Automatically load the app when you play music and close when the music stops. (If the app opened automatically, it closes after music has been paused for 5 minutes.) -**Touch controls**: -Enable touch controls? ## Controls diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index d3be1b3f6..741c2b48b 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -13,10 +13,6 @@ let info = { }; const POUT = 300000; // auto close timeout when paused: 5 minutes (in ms) const IOUT = 3600000; // auto close timeout for inactivity: 1 hour (in ms) -// Touch controls? -let s = require("Storage").readJSON("gbmusic.json", 1) || {}; -const TCTL = ("touch" in s) ? !!s.touch : true; // previous versions used an int for this setting -delete s; /////////////////////// // Self-repeating timeouts @@ -355,7 +351,6 @@ function controlColor(ctrl) { return (ctrl in tCommand) ? "#ff0000" : "#008800"; } function drawControl(ctrl, x, y) { - if (!TCTL) {return;} g.setColor(controlColor(ctrl)); const s = 20; if (stat!==controlState) { @@ -537,7 +532,6 @@ function togglePlay() { sendCommand(stat==="play" ? "pause" : "play"); } function startTouchWatches() { - if (!TCTL) {return;} Bangle.on("touch", side => { if (!Bangle.isLCDOn()) {return;} // for <2v10 firmware switch(side) { diff --git a/apps/gbmusic/settings.js b/apps/gbmusic/settings.js index b8cdb002e..e81a2c320 100644 --- a/apps/gbmusic/settings.js +++ b/apps/gbmusic/settings.js @@ -9,7 +9,6 @@ // initialize with default settings... let s = { autoStart: true, - touch: true, }; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -35,11 +34,6 @@ format: yesNo, onchange: save("autoStart"), }; - menu[translate("Touch controls")] = { - value: !!s.touch, - format: yesNo, - onchange: save("touch"), - }; E.showMenu(menu); }); From d642ad5c809b1d317412dd572c990edeac6d0a6e Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Thu, 13 May 2021 15:48:41 +0200 Subject: [PATCH 15/15] gbmusic: `Simple button` setting to disable double/triple pressing For music players which handle multiple button presses themselves. see http://forum.espruino.com/comments/15984222/ --- apps/gbmusic/ChangeLog | 2 +- apps/gbmusic/README.md | 3 +++ apps/gbmusic/app.js | 18 +++++++++++++----- apps/gbmusic/settings.js | 6 ++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index 814e6d3ae..ecbca5fb6 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -2,4 +2,4 @@ 0.02: Increase text brightness, improve controls, (try to) reduce memory usage 0.03: Only auto-start if active app is a clock, auto close after 1 hour of inactivity 0.04: Setting to disable touch controls, minor bugfix -0.05: Remove touch controls setting, reduce fadeout flicker \ No newline at end of file +0.05: Setting to disable double/triple press control, remove touch controls setting, reduce fadeout flicker \ No newline at end of file diff --git a/apps/gbmusic/README.md b/apps/gbmusic/README.md index 52a74499c..4bad9b8c8 100644 --- a/apps/gbmusic/README.md +++ b/apps/gbmusic/README.md @@ -22,6 +22,9 @@ You can change these under `Settings`->`App/Widget Settings`->`Music Controls`. Automatically load the app when you play music and close when the music stops. (If the app opened automatically, it closes after music has been paused for 5 minutes.) +**Simple button**: +Disable double/triple pressing Button 2: always simply toggle play/pause. +(For music players which handle multiple button presses themselves.) ## Controls diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index 741c2b48b..5f95868bb 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -485,11 +485,19 @@ function startButtonWatches() { tPress = setTimeout(() => {Bangle.showLauncher();}, 3000); } }, BTN2, {repeat: true, edge: "rising"}); - setWatch(() => { - nPress++; - clearTimeout(tPress); - tPress = setTimeout(handleButton2Press, 500); - }, BTN2, {repeat: true, edge: "falling"}); + const s = require("Storage").readJSON("gbmusic.json", 1) || {}; + if (s.simpleButton) { + setWatch(() => { + clearTimeout(tPress); + togglePlay(); + }, BTN2, {repeat: true, edge: "falling"}); + } else { + setWatch(() => { + nPress++; + clearTimeout(tPress); + tPress = setTimeout(handleButton2Press, 500); + }, BTN2, {repeat: true, edge: "falling"}); + } } function handleButton2Press() { tPress = null; diff --git a/apps/gbmusic/settings.js b/apps/gbmusic/settings.js index e81a2c320..ae013fda5 100644 --- a/apps/gbmusic/settings.js +++ b/apps/gbmusic/settings.js @@ -9,6 +9,7 @@ // initialize with default settings... let s = { autoStart: true, + simpleButton: false, }; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -34,6 +35,11 @@ format: yesNo, onchange: save("autoStart"), }; + menu[translate("Simple button")] = { + value: !!s.simpleButton, + format: yesNo, + onchange: save("simpleButton"), + }; E.showMenu(menu); });