From 9ca209dad3c407a76a2329e934a1d0dd0533e9ea Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Wed, 27 Jan 2021 17:29:11 +0100 Subject: [PATCH] adding new app --- apps.json | 12 +++ apps/intervals/app-icon.js | 1 + apps/intervals/app.js | 167 +++++++++++++++++++++++++++++++++++++ apps/intervals/app.png | Bin 0 -> 2930 bytes 4 files changed, 180 insertions(+) create mode 100644 apps/intervals/app-icon.js create mode 100644 apps/intervals/app.js create mode 100644 apps/intervals/app.png diff --git a/apps.json b/apps.json index 91262762b..a61e33036 100644 --- a/apps.json +++ b/apps.json @@ -2661,5 +2661,17 @@ {"name":"mclockplus.app.js","url":"mclockplus.app.js"}, {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true} ] +}, +{ "id": "intervals", + "name": "Intervals App", + "shortName":"Intervals", + "icon": "app.png", + "version":"0.01", + "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.", + "tags": "", + "storage": [ + {"name":"intervals.app.js","url":"app.js"}, + {"name":"intervals.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/intervals/app-icon.js b/apps/intervals/app-icon.js new file mode 100644 index 000000000..1edb36293 --- /dev/null +++ b/apps/intervals/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQCZAAAAAAAAAAAAAAAAAAAAAACZAAAACZmQAAAAmQAAAAAAAAAAAAAAAAmQAAAAAAAAAAAACZAAAAAAAAAAAAAAAJkAAAAAAAAAAAAAAJkAAAAAAAAAAAAACZAAAACZmZmZmQAAAAmQAAAAAAAAAAAAmQAACZmZAAAAmZmQAACZAAAAAAAAAAAJkAAJmZAAAAAAAAmZkAAJkAAAAAAAAAAJAACZkAAJmZmZkAAJmQAAkAAAAAAAAAAAAAmQAJmZkJkJmZkACZAAAAAAAAAAAAAAAJkAmZAAAJkAAAmZAJkAAAAAAAAAAAAACZAJmQAAAJkAAACZkAmQAAAAAAAAAAAAmQCZAAAACJkAAACZmZmZmZmZmQAAAAAAkAmQAACIiJkAAAmZmZmZmZmZmZAAAAAJkAkAAAIiIqkAAAmQAAAAAAAACZAAAAAJAJkAAiIiIqkAAAmZmZmZmZmZmZAAAACqCqAAAiIiIqoAAACqqqqqqqqqqgAAAACgCqAAIiIiIqoAAAAKAAAAAAAAoAAAAACgCgACIiIiIqoAAAAKACIiIiIAoAAAAAqgqgACIiIiKqqgAAAKoAIiIiAKoAAAAAqgqgACIiIiqqqqAAAAoAAiIgAKAAAAAAqgqgACIiIqoAAKAAAAqgAKoACqAAAAAAqgqqqqqqqqoAAKoAAACqoKoKqgAAAAAAqgqqqqqqqqoAAKoAAAAKqqqqoAAAAAAAqgqgAAAAAAqgCqAAAACqoKoKqgAAAAAAqgqgAAAAAACqqgAAAAqgAKoACqAAAAAAqgCgAAAAAAAAAAAAAAoAAAAAAKAAAAAACgCgAAAAAAAAAAAAAKoAAAAAAKoAAAAACqCqAAAAAAAAAAAAAKAAAAAAAAoAAAAACqAKAAAAAAAAAAAAAKAAAAAAAAoAAAAAAKAKoAAAAAAAAAAACqqqqqqqqqqgAAAAAKoAqgAAAAAAAAAAqqqqqqqqqqqqAAAAAAqgCqAAAAAAAAAAqgAAAAAAAACqAAAAAACqAKoAAAAAAAAAqqqqqqqqqqqqAAAAAACqAAqgAAAAAAAAqqqqqqqqqqqgAAAAAAAKqgCqqgAAAACqqgCqoAAAAAAAAAAAAAAAqqAAqqqqqqqqAAqqAAAAAAAAAAAAAAAAAKqgAAqqqqAACqoAAAAAAAAAAAAAAAAAAAqqoAAAAAAKqqAAAAAAAAAAAAAAAAAAAAAKqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) \ No newline at end of file diff --git a/apps/intervals/app.js b/apps/intervals/app.js new file mode 100644 index 000000000..da436b104 --- /dev/null +++ b/apps/intervals/app.js @@ -0,0 +1,167 @@ +var counter; +var counterInterval; + +var settings; + +var work=false; //true if training false if resting +var prep=true; //true if we are in prep phase (at the beginning of the session +var setNum; + +var paused; + +function endPart() { + g.clear(); + if (prep){ + prep=false; + work = true; + counter = settings.workseg+settings.workmin*60; + startCounter(); + }else if (work){ + work = false; + counter = settings.restseg+settings.restmin*60; + startCounter(); + } + else{ + if (setNum>1) + { + setNum--; + work = true; + counter = settings.workseg+settings.workmin*60; + startCounter(); + } + else + { + //End session + setWatch(showMenu, BTN2); + E.showMessage("Press BTN2 for\ngoing back\nto the menu","Well done!"); + } + } +} + +function printCounter(counter){ + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + let minutes = Math.floor(counter/60); + let segs = counter % 60; + let textMinutes = minutes.toString().padStart(2, "0"); + let textSegs = segs.toString().padStart(2,"0"); + g.clearRect(0,80,239,160); + g.setFont("Vector",30); + if (prep) + g.setColor(125,125,0); + else if (work) + g.setColor(255,0,0); + else + g.setColor(0,255,0); + g.drawString(setNum,120,50); + if (prep) + g.drawString("PREPARATION",120,190); + else if (work) + g.drawString("WORK",120,190); + else + g.drawString("REST",120,190); + g.setFont("Vector",10); + g.drawString("Touch to pause",120,215); + g.setFont("Vector",80); + g.drawString(textMinutes+":"+textSegs,120,120); +} + +function signal_to_user(le){ + if (settings.buzz) + Bangle.buzz(le); + else + Bangle.beep(le,4000); +} + +function countDown() { + counter--; + if (counter<4 && counter>0) + signal_to_user(200); + if (counter==0) + signal_to_user(600); + + if (counter<0) { + clearInterval(counterInterval); + counterInterval = undefined; + endPart(); + } + else + { + printCounter(counter); + } + g.flip(); +} + +function startCounter(){ + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +function pause() +{ + if (!paused) + { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(resume,BTN4); + setWatch(resume,BTN5); + paused=true; + g.clear(); + g.setFont("Vector",60); + g.drawString("PAUSED",120,120); + g.setFont("Vector",20); + g.drawString("Touch to continue",120,180); + } +} + +function resume(){ + if (paused) + { + g.clear(); + counterInterval = setInterval(countDown, 1000); + setWatch(pause,BTN4); + setWatch(pause,BTN5); + paused=false; + } +} + +function startSession() { + E.showMenu(); + paused=false; + setWatch(pause,BTN4); + setWatch(pause,BTN5); + require('Storage').write('intervals.settings.json',settings); + setNum = settings.sets; + counter = 5;//prep time + prep=true; + work=false; + startCounter(); +} + +function showMenu() +{ + settings = require('Storage').readJSON('intervals.settings.json',1)|| + { sets:1,workseg:10,workmin:0,restseg:5,restmin:0,buzz:true}; + + var mainmenu = { + "" : { "title" : "-- Main Menu --" }, + "START" : function() { startSession(); }, + "Sets" : { value : settings.sets,min:0,max:20,step:1,onchange : v => { settings.sets=v; } }, + "Work minutes" : { value : settings.workmin,min:0,max:59,step:1,onchange : v => { settings.workmin=v; } }, + "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, + "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, + "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, + "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} + }; + + E.showMenu(mainmenu); +} + +showMenu(); + + + + + + diff --git a/apps/intervals/app.png b/apps/intervals/app.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ca9ff41f50a570bb66426bc4e93bdc73a4aba0 GIT binary patch literal 2930 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