From 79f8528a1861b0863436fc6c2c917e69bf947472 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Wed, 23 Nov 2022 17:24:19 +0100 Subject: [PATCH 001/183] First step to music implementation - proxy now handles music messages - added TODO in the app - implemented a settings for the app --- apps/messages_light/messages_light.app.js | 148 +++++++++++------- apps/messages_light/messages_light.boot.js | 4 +- .../messages_light.messagesProxy.js | 43 ++++- apps/messages_light/messages_light.music.js | 2 + .../messages_light/messages_light.settings.js | 31 +++- 5 files changed, 162 insertions(+), 66 deletions(-) create mode 100644 apps/messages_light/messages_light.music.js diff --git a/apps/messages_light/messages_light.app.js b/apps/messages_light/messages_light.app.js index 5d5363d38..daf173ab8 100644 --- a/apps/messages_light/messages_light.app.js +++ b/apps/messages_light/messages_light.app.js @@ -10,6 +10,11 @@ } */ + + +//TODO: quando apro l'app dal menu principale ( quindi non c'è niente nella queue) +//visualizzo l'interfaccia per la musica ( o un settings che mi sceglie di aprire la musica? ) + let LOG=function(){ //print.apply(null, arguments); } @@ -38,6 +43,15 @@ let settings= (()=>{ let EventQueue=[]; //in posizione 0, c'è quello attualmente visualizzato let callInProgress=false; +//TODO: implemento il resto ( nel template ) +var music=undefined; +//se definita, vuol dire che è arrivata una richiesta di musica -> dopo aver fino la queue di messaggi, ri-visualizza la schermata di musica +//se premo "back" in quella di musica -> esco dall'app +//template qua sotto +/*{ + artist:"", + track:"", +}*/ @@ -46,68 +60,89 @@ var manageEvent = function(event) { event.new=true; - LOG("manageEvent"); - if( event.id=="call") - { - showCall(event); - return; + LOG(event); + + + if( event.id=="call"){ + showCall(event); } - switch(event.t) - { - case "add": - EventQueue.unshift(event); + else if( event.id=="music"){ + //TODO: + //se c'è qualcosa nella queue, quindi app già aperta, + //se musicRunngin==true, vuol dire che c'è già della musica in ascolto prima + // quindi non mostro nulla - if(!callInProgress) - showMessage(event); - break; + //se prima era musicRunngin == false + //NON DOVREBBE NEANCHE ARRIVA QUA ( da codice nel proxy ) - case "modify": - //cerco l'evento nella lista, se lo trovo, lo modifico, altrimenti lo pusho - let find=false; - EventQueue.forEach(element => { - if(element.id == event.id) - { - find=true; - Object.assign(element,event); - } - }); - if(!find) //se non l'ho trovato, lo aggiungo in fondo + + + //LOGICA DA QUA-> + //aggiorno i dati della musica + //quindi se mi arriva la notifica vuol dire che: + //l'app l'ho appena aperta -> visualizzo la schermata di musica + //oppure + //l'app era già stata aperta in modalità musica -> non faccio nulla ( avendo già aggiornato i dati della musica ) + //POI + //se c'è roba nella queue -> NON visualizzo la schermata di musica ( quando finirà la queue, la next visualizzerà la musica ) + //se non c'è roba nella queue -> aggiorno la visualizzazione + + + } + else{ + + //----------------- + //notification + //----------------- + if(event.t=="add"){ EventQueue.unshift(event); - - if(!callInProgress) - showMessage(event); - break; - - case "remove": - - //se non c'è niente nella queue e non c'è una chiamata in corso - if( EventQueue.length==0 && !callInProgress) - next(); - - //se l'id è uguale a quello attualmente visualizzato ( e non siamo in chiamata ) - if(!callInProgress && EventQueue[0] !== undefined && EventQueue[0].id == event.id) - next(); //passo al messaggio successivo ( per la rimozione ci penserà la next ) - - else{ - //altrimenti rimuovo tutti gli elementi con quell'id( creando un nuovo array ) - let newEventQueue=[]; + + if(!callInProgress) + showMessage(event); + } + else if(event.t=="modify"){ + //cerco l'evento nella lista, se lo trovo, lo modifico, altrimenti lo pusho + let find=false; EventQueue.forEach(element => { - if(element.id != event.id) - newEventQueue.push(element); + if(element.id == event.id) + { + find=true; + Object.assign(element,event); + } }); - EventQueue=newEventQueue; - } - - + if(!find) //se non l'ho trovato, lo aggiungo in fondo + EventQueue.unshift(event); + + if(!callInProgress) + showMessage(event); + } + else if(event.t=="remove"){ + //se non c'è niente nella queue e non c'è una chiamata in corso + if( EventQueue.length==0 && !callInProgress) + next(); + + //se l'id è uguale a quello attualmente visualizzato ( e non siamo in chiamata ) + if(!callInProgress && EventQueue[0] !== undefined && EventQueue[0].id == event.id) + next(); //passo al messaggio successivo ( per la rimozione ci penserà la next ) + + else{ + //altrimenti rimuovo tutti gli elementi con quell'id( creando un nuovo array ) + let newEventQueue=[]; + EventQueue.forEach(element => { + if(element.id != event.id) + newEventQueue.push(element); + }); + EventQueue=newEventQueue; + } + } + //----------------- + //notification + //----------------- + - - break; - case "musicstate": - case "musicinfo": - - break; } + }; @@ -296,7 +331,7 @@ let next=function(){ -let showMapMessage=function(msg) { +let showMap=function(msg) { g.clearRect(Bangle.appRect); PrintMessageStrings({body:"Not implemented!"}); @@ -304,6 +339,11 @@ let showMapMessage=function(msg) { } +let showMusic=function(msg){ + + + //TODO: implementa tutte le funzionalità per visualizza la track in corso e gestire la musica +} diff --git a/apps/messages_light/messages_light.boot.js b/apps/messages_light/messages_light.boot.js index 741d08b96..db93615ac 100644 --- a/apps/messages_light/messages_light.boot.js +++ b/apps/messages_light/messages_light.boot.js @@ -25,9 +25,7 @@ Bangle.on("call", messageBootManager);*/ //override require to filter require("message") global.require_real=global.require; global.require = (_require => file => { - if (file==="messages") file = "messagesProxy"; - //else if (file==="messages_REAL") file = "messages"; //backdoor to real message - + if (file==="messages") file = "messagesProxy"; return _require(file); })(require); diff --git a/apps/messages_light/messages_light.messagesProxy.js b/apps/messages_light/messages_light.messagesProxy.js index 723397057..8d159bfad 100644 --- a/apps/messages_light/messages_light.messagesProxy.js +++ b/apps/messages_light/messages_light.messagesProxy.js @@ -1,24 +1,51 @@ + +let openMusic = function() { + // only read settings file for first music message + if ("undefined"==typeof exports._openMusic) { + const SETTINGS_FILE_NAME="messages_light.settings.json"; + exports._openMusic = !!((require('Storage').readJSON(SETTINGS_FILE_NAME, true) || {}).openMusic); + } + return exports._openMusic; +} + //gestisco il messaggio a modo mio exports.pushMessage = function(event) { - //TODO: now i can't handle the music, so i call the real message app - if( event.id=="music") return require_real("messages").pushMessage(event); + //TODO: rimuovere questa riga per far funzionare la musica tramite l'app "message_light" + if( event.id=="music") return require_real("messages").pushMessage(event); + - //se l'app non è aperta + let callApp; + //se l'app non è aperta if ("undefined"==typeof manageEvent) { if(event.t=="remove") return; //l'app non è aperta, non c'è nessun messaggio da rimuovere dalla queue -> non lancio l'app - //la apro - require_real("Storage").writeJSON("messages_light.NewEvent.json",event); - load("messages_light.app.js"); + //chiamo la load dell'app + callApp=function(event){ + require_real("Storage").writeJSON("messages_light.NewEvent.json",event); + load("messages_light.app.js"); + } } else { - //altrimenti gli dico di gestire il messaggio - manageEvent(event); + //dico all'app di gestire l'evento + callApp=function(event){ + manageEvent(event); + } } + + + //se il messaggio è una notifica -> gestisco l'evento + //oppure + //se music è definita ( vuol dire che l'app è aperta e mi è arrivata prima una richiesta di apertura in modalità "musica" via notifica o via launcher ) -> gestisco l'evento + //oppure + //se se è una notifica di musica ( definito dal primo controllo ) e nei settings ho salvato di aprire l'app in musica -> gestisco l'evento + + if( event.id!="music" || typeof music !== "undefined" || openMusic()) + callApp(event); + } diff --git a/apps/messages_light/messages_light.music.js b/apps/messages_light/messages_light.music.js new file mode 100644 index 000000000..86a2b8f68 --- /dev/null +++ b/apps/messages_light/messages_light.music.js @@ -0,0 +1,2 @@ +//TODO: +//codice che verrà evalutato dall'app per caricare l'interfaccia della musica \ No newline at end of file diff --git a/apps/messages_light/messages_light.settings.js b/apps/messages_light/messages_light.settings.js index b7197c70a..057a38a3f 100644 --- a/apps/messages_light/messages_light.settings.js +++ b/apps/messages_light/messages_light.settings.js @@ -1 +1,30 @@ -eval(require("Storage").read("messages.settings.js")); +//eval(require("Storage").read("messages.settings.js")); +(function(back) { + const SETTINGS_FILE_NAME="messages_light.settings.json"; + let settings = function() { + let settings = require('Storage').readJSON(SETTINGS_FILE_NAME, true) || {}; + settings.openMusic=!!settings.openMusic; + //settings.unlockWatch=!!settings.unlockWatch; + return settings; + } + function updateSetting(setting, value) { + let settings = require('Storage').readJSON(SETTINGS_FILE_NAME, true) || {}; + settings[setting] = value; + require('Storage').writeJSON(SETTINGS_FILE_NAME, settings); + } + + var mainmenu = { + "" : { "title" : /*LANG*/"Messages Light" }, + "< Back" : back, + /*LANG*/'Auto-Open Music': { + value: !!settings().openMusic, + onchange: v => updateSetting("openMusic", v) + } + /*,/LANG/'Unlock Watch': { + value: !!settings().unlockWatch, + onchange: v => updateSetting("unlockWatch", v) + },*/ + }; + E.showMenu(mainmenu); + }); + \ No newline at end of file From 1d22ea404bd76fb6dadb728905eeba6bef3baf94 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Wed, 23 Nov 2022 18:50:30 +0100 Subject: [PATCH 002/183] music implementation progress --- apps/messages_light/messages_light.app.js | 99 ++++++++++++++++----- apps/messages_light/messages_light.music.js | 7 +- apps/messages_light/metadata.json | 3 +- 3 files changed, 83 insertions(+), 26 deletions(-) diff --git a/apps/messages_light/messages_light.app.js b/apps/messages_light/messages_light.app.js index daf173ab8..5b55ab762 100644 --- a/apps/messages_light/messages_light.app.js +++ b/apps/messages_light/messages_light.app.js @@ -53,6 +53,8 @@ var music=undefined; track:"", }*/ +let justOpen=true; + //TODO: RICORDARSI DI FARE IL DELETE @@ -63,32 +65,64 @@ var manageEvent = function(event) { LOG("manageEvent"); LOG(event); - if( event.id=="call"){ showCall(event); } else if( event.id=="music"){ - //TODO: - //se c'è qualcosa nella queue, quindi app già aperta, - //se musicRunngin==true, vuol dire che c'è già della musica in ascolto prima - // quindi non mostro nulla - //se prima era musicRunngin == false - //NON DOVREBBE NEANCHE ARRIVA QUA ( da codice nel proxy ) + + /* + //DEBUG -> save the event into file + let musicLogFile="music_log"; + let logMusic = require('Storage').readJSON(musicLogFile, true) || []; + logMusic.push(event); + require('Storage').writeJSON(musicLogFile, logMusic); + */ + + + //se c'è qualcosa nella queue, quindi app già aperta, + //se musicRunngin==true, vuol dire che c'è già della musica in ascolto prima + // quindi non mostro nulla + + //se prima era musicRunngin == false + //NON DOVREBBE NEANCHE ARRIVA QUA ( da codice nel proxy ) - //LOGICA DA QUA-> - //aggiorno i dati della musica - //quindi se mi arriva la notifica vuol dire che: - //l'app l'ho appena aperta -> visualizzo la schermata di musica - //oppure - //l'app era già stata aperta in modalità musica -> non faccio nulla ( avendo già aggiornato i dati della musica ) - //POI - //se c'è roba nella queue -> NON visualizzo la schermata di musica ( quando finirà la queue, la next visualizzerà la musica ) - //se non c'è roba nella queue -> aggiorno la visualizzazione + //LOGICA DA QUA-> + //aggiorno i dati della musica - + + + LOG("old music",music) + LOG("music event",event) + if( music==undefined) music={}; + Object.assign(music,event); + //tolgo tutto quello che non mi serve salvare ( non lo faccio prima perchè non so se l'event verrà usato da altri) + delete music.t; + delete music.id; + delete music.title; + delete music.new; + LOG("joined",music) + + + + //quindi se mi arriva la notifica vuol dire che: + //l'app l'ho appena aperta -> visualizzo la schermata di musica + //oppure + //l'app era già stata aperta in modalità musica -> non faccio nulla ( avendo già aggiornato i dati della musica ) + + //POI + //se c'è roba nella queue -> NON visualizzo la schermata di musica ( quando finirà la queue, la next visualizzerà la musica ) + //se non c'è roba nella queue -> aggiorno la visualizzazione + + + // ho unito le due condizioni di prima + + if( justOpen || EventQueue.length==0) + showMusic(); + + } else{ @@ -293,7 +327,17 @@ let showCall = function(msg) +let musicCode=undefined; +//visualizza cioè che c'è nella variabile music ( se undefined, richiama la next) +let showMusic=function(){ + if( music===undefined) next(); //TOCHECK: controllo rimuovibile? + //carico dinamicamente il codice per la musica ( non mi serve sempre ) + if(musicCode===undefined) musicCode = require("messages_light.music.js") //eval(require("Storage").read("messages_light.music.js")); + + musicCode.show(); + +} @@ -312,7 +356,16 @@ let next=function(){ if( EventQueue.length == 0) { LOG("no element in queue - closing") - setTimeout(_ => load()); + if( music!==undefined) + { + LOG("opened/received music -> show music"); + showMusic(); + } + else + { + LOG("no music -> close") + setTimeout(_ => load()); + } return; } @@ -339,12 +392,8 @@ let showMap=function(msg) { } -let showMusic=function(msg){ - //TODO: implementa tutte le funzionalità per visualizza la track in corso e gestire la musica -} - let CallBuzzTimer=null; @@ -525,9 +574,11 @@ let main = function(){ manageEvent(eventToShow); else { - LOG("file not found!"); - setTimeout(_ => load(), 0); + LOG("file event not found! -> Open in music mode"); + music={}; //imposto un oggetto nella variabile music, cosi non viene chiuso il programma dalla showMusic + setTimeout(_ => showMusic(), 0); } + justOpen=false; }; diff --git a/apps/messages_light/messages_light.music.js b/apps/messages_light/messages_light.music.js index 86a2b8f68..a9599784e 100644 --- a/apps/messages_light/messages_light.music.js +++ b/apps/messages_light/messages_light.music.js @@ -1,2 +1,7 @@ //TODO: -//codice che verrà evalutato dall'app per caricare l'interfaccia della musica \ No newline at end of file +//codice che verrà evalutato dall'app per caricare l'interfaccia della musica + + +exports.show = function() { + g.drawString("music",20,20); +} \ No newline at end of file diff --git a/apps/messages_light/metadata.json b/apps/messages_light/metadata.json index 3515a75c2..30b6cb288 100644 --- a/apps/messages_light/metadata.json +++ b/apps/messages_light/metadata.json @@ -14,7 +14,8 @@ {"name":"messages_light.settings.js","url":"messages_light.settings.js"}, {"name":"messages_light.img","url":"app-icon.js","evaluate":true}, {"name":"messagesProxy","url":"messages_light.messagesProxy.js"}, - {"name":"messages_light.boot.js","url":"messages_light.boot.js"} + {"name":"messages_light.boot.js","url":"messages_light.boot.js"}, + {"name":"messages_light.music.js","url":"messages_light.music.js"} ], "data": [{"name":"messages_light.settings.json"},{"name":"messages_light.NewMessage.json"}], "screenshots": [{"url":"screenshot-notify.png"} ,{"url":"screenshot-long-text1.png"},{"url":"screenshot-long-text2.png"}, {"url":"screenshot-call.png"} ] From 08cac4a389e8473854889e3fefc5f8b0071470ec Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Wed, 23 Nov 2022 23:10:49 +0100 Subject: [PATCH 003/183] added timeout --- apps/messages_light/messages_light.app.js | 52 ++++++++++++++++--- .../messages_light/messages_light.settings.js | 16 +++--- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/apps/messages_light/messages_light.app.js b/apps/messages_light/messages_light.app.js index 5b55ab762..6dcde08b1 100644 --- a/apps/messages_light/messages_light.app.js +++ b/apps/messages_light/messages_light.app.js @@ -20,8 +20,6 @@ let LOG=function(){ } - - let settings= (()=>{ let tmp={}; tmp.NewEventFileName="messages_light.NewEvent.json"; @@ -36,10 +34,15 @@ let settings= (()=>{ tmp.colBg = g.theme.dark ? "#000":"#fff"; tmp.colLock = g.theme.dark ? "#ff0000":"#ff0000"; - tmp.quiet=((require('Storage').readJSON('setting.json', 1) || {}).quiet) + tmp.quiet=!!((require('Storage').readJSON("setting.json", true) || {}).quiet); + tmp.timeOut=(require('Storage').readJSON("messages_light.settings.json", true) || {}).timeOut || "Off"; return tmp; })(); + + + + let EventQueue=[]; //in posizione 0, c'è quello attualmente visualizzato let callInProgress=false; @@ -53,7 +56,7 @@ var music=undefined; track:"", }*/ -let justOpen=true; +let justOpened=true; @@ -119,7 +122,7 @@ var manageEvent = function(event) { // ho unito le due condizioni di prima - if( justOpen || EventQueue.length==0) + if( justOpened || EventQueue.length==0) showMusic(); @@ -187,6 +190,10 @@ var manageEvent = function(event) { let showMessage = function(msg){ LOG("showMessage"); LOG(msg); + + updateTimeout(); + + g.setBgColor(settings.colBg); @@ -277,7 +284,7 @@ let showCall = function(msg) } callInProgress=true; - + updateTimeout(); //se è una chiamata ( o una nuova chiamata, diversa dalla precedente ) @@ -532,6 +539,7 @@ let PrintMessageStrings=function(msg) let doubleTapUnlock=function(data) { + updateTimeout(); if( data.double) //solo se in double { Bangle.setLocked(false); @@ -539,6 +547,8 @@ let doubleTapUnlock=function(data) { } } let toushScroll=function(button, xy) { + updateTimeout(); + let height=176; //g.getHeight(); -> 176 B2 height/=2; @@ -553,6 +563,33 @@ let toushScroll=function(button, xy) { } + +let timeout; +const updateTimeout = function(){ +if (settings.timeOut!="Off"){ + removeTimeout(); + if( callInProgress) return; //c'è una chiamata in corso -> no timeout + if( music!=undefined && EventQueue.length==0 ) return; //ho aperto l'interfaccia della musica e non ho messaggi davanti -> no timeout + + + let time=parseInt(settings.timeOut); //the "s" will be trimmed by the parseInt + timeout = setTimeout(next,time*1000); //next or Bangle.showClock/load()??? + } +}; +const removeTimeout=function(){ + if (timeout) clearTimeout(timeout); +} + + +//not currently used -> for fast load? +let unsetApp=function(){ + delete(music); + delete(manageEvent); + removeTimeout(); +} + + + let main = function(){ LOG("Main"); @@ -578,7 +615,8 @@ let main = function(){ music={}; //imposto un oggetto nella variabile music, cosi non viene chiuso il programma dalla showMusic setTimeout(_ => showMusic(), 0); } - justOpen=false; + justOpened=false; + }; diff --git a/apps/messages_light/messages_light.settings.js b/apps/messages_light/messages_light.settings.js index 057a38a3f..2143dee80 100644 --- a/apps/messages_light/messages_light.settings.js +++ b/apps/messages_light/messages_light.settings.js @@ -12,18 +12,22 @@ settings[setting] = value; require('Storage').writeJSON(SETTINGS_FILE_NAME, settings); } - + const timeOutChoices = [/*LANG*/"Off", "10s", "15s", "20s", "30s"]; var mainmenu = { "" : { "title" : /*LANG*/"Messages Light" }, "< Back" : back, /*LANG*/'Auto-Open Music': { value: !!settings().openMusic, onchange: v => updateSetting("openMusic", v) - } - /*,/LANG/'Unlock Watch': { - value: !!settings().unlockWatch, - onchange: v => updateSetting("unlockWatch", v) - },*/ + }, + /*LANG*/'Time Out': { + value: timeOutChoices.indexOf(settings.timeOut), + min: 0, max: timeOutChoices.length-1, + format: v => timeOutChoices[v], + onchange: m => { + updateSetting("timeOut", timeOutChoices[m]); + } + }, }; E.showMenu(mainmenu); }); From a1097a3eea26442cbcbc1bf2ce20a46bec7bb746 Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sun, 8 Jan 2023 23:04:13 -0500 Subject: [PATCH 004/183] [sched, alarm] allow dated Event repeat --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 1 + apps/alarm/app.js | 101 +++++++++++++++++++++++++-------------- apps/alarm/metadata.json | 2 +- apps/sched/ChangeLog | 1 + apps/sched/README.md | 4 +- apps/sched/metadata.json | 2 +- apps/sched/sched.js | 28 ++++++++++- 8 files changed, 100 insertions(+), 40 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index bb8a292a0..89fb08a6f 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -38,3 +38,4 @@ 0.35: Add automatic translation of more strings 0.36: alarm widget moved out of app 0.37: add message input and dated Events +0.38: Dated event repeat option diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 0298e0836..9da142dab 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -13,6 +13,7 @@ It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master - `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely) - `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds) - `New Event` → Configure a new event (triggered based on time and date) + - `Repeat` → Alarm can be be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) - `Advanced` - `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details - `Enable All` → Enable _all_ disabled alarms & timers diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 74007d04b..972080872 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -6,6 +6,8 @@ const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}) const WORKDAYS = 62 const WEEKEND = firstDayOfWeek ? 192 : 65; const EVERY_DAY = firstDayOfWeek ? 254 : 127; +const INTERVALS = ["day", "week", "month", "year"]; +const INTERVAL_LABELS = [/*LANG*/"Day", /*LANG*/"Week", /*LANG*/"Month", /*LANG*/"Year"]; const iconAlarmOn = "\0" + atob("GBiBAAAAAAAAAAYAYA4AcBx+ODn/nAP/wAf/4A/n8A/n8B/n+B/n+B/n+B/n+B/h+B/4+A/+8A//8Af/4AP/wAH/gAB+AAAAAAAAAA=="); const iconAlarmOff = "\0" + (g.theme.dark @@ -50,8 +52,9 @@ function showMainMenu() { alarms.forEach((e, index) => { var label = (e.timer ? require("time_utils").formatDuration(e.timer) - : (e.date ? `${e.date.substring(5,10)} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : "")) - ) + (e.msg ? " " + e.msg : ""); + : (e.date ? `${e.date.substring(5,10)}${e.rp?"*":""} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeRepeat(e)}` : "")) + ) + (e.msg ? ` ${e.msg}` : ""); + menu[label] = { value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff), onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index) @@ -148,8 +151,8 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { onchange: v => alarm.on = v }, /*LANG*/"Repeat": { - value: decodeDOW(alarm), - onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, alarm.dow, (repeat, dow) => { + value: decodeRepeat(alarm), + onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, date || alarm.dow, (repeat, dow) => { alarm.rp = repeat; alarm.dow = dow; prepareAlarmForSave(alarm, alarmIndex, time, date, true); @@ -174,9 +177,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; - if (alarm.date || withDate) { - delete menu[/*LANG*/"Repeat"]; - } else { + if (!alarm.date) { delete menu[/*LANG*/"Day"]; delete menu[/*LANG*/"Month"]; delete menu[/*LANG*/"Year"]; @@ -225,49 +226,77 @@ function saveAndReload() { alarms.filter(e => e.timer === undefined).forEach(a => a.dow = handleFirstDayOfWeek(a.dow)); } -function decodeDOW(alarm) { +function decodeRepeat(alarm) { return alarm.rp - ? require("date_utils") - .dows(firstDayOfWeek, 2) - .map((day, index) => alarm.dow & (1 << (index + firstDayOfWeek)) ? day : "_") - .join("") - .toLowerCase() + ? (alarm.date + ? `${alarm.rp.num}*${INTERVAL_LABELS[INTERVALS.indexOf(alarm.rp.interval)]}` + : require("date_utils") + .dows(firstDayOfWeek, 2) + .map((day, index) => alarm.dow & (1 << (index + firstDayOfWeek)) ? day : "_") + .join("") + .toLowerCase()) : /*LANG*/"Once" } -function showEditRepeatMenu(repeat, dow, dowChangeCallback) { +function showEditRepeatMenu(repeat, day, dowChangeCallback) { var originalRepeat = repeat; - var originalDow = dow; - var isCustom = repeat && dow != WORKDAYS && dow != WEEKEND && dow != EVERY_DAY; + var dow; const menu = { "": { "title": /*LANG*/"Repeat Alarm" }, "< Back": () => dowChangeCallback(repeat, dow), - /*LANG*/"Once": { + /*LANG*/"Only Once": () => dowChangeCallback(false, EVERY_DAY) // The alarm will fire once. Internally it will be saved // as "fire every days" BUT the repeat flag is false so // we avoid messing up with the scheduler. - value: !repeat, - onchange: () => dowChangeCallback(false, EVERY_DAY) - }, - /*LANG*/"Workdays": { - value: repeat && dow == WORKDAYS, - onchange: () => dowChangeCallback(true, WORKDAYS) - }, - /*LANG*/"Weekends": { - value: repeat && dow == WEEKEND, - onchange: () => dowChangeCallback(true, WEEKEND) - }, - /*LANG*/"Every Day": { - value: repeat && dow == EVERY_DAY, - onchange: () => dowChangeCallback(true, EVERY_DAY) - }, - /*LANG*/"Custom": { - value: isCustom ? decodeDOW({ rp: true, dow: dow }) : false, - onchange: () => setTimeout(showCustomDaysMenu, 10, isCustom ? dow : EVERY_DAY, dowChangeCallback, originalRepeat, originalDow) - } }; + let restOfMenu; + if (typeof day === "number") { + dow = day; + var originalDow = dow; + var isCustom = repeat && dow != WORKDAYS && dow != WEEKEND && dow != EVERY_DAY; + + restOfMenu = { + /*LANG*/"Workdays": { + value: repeat && dow == WORKDAYS, + onchange: () => dowChangeCallback(true, WORKDAYS) + }, + /*LANG*/"Weekends": { + value: repeat && dow == WEEKEND, + onchange: () => dowChangeCallback(true, WEEKEND) + }, + /*LANG*/"Every Day": { + value: repeat && dow == EVERY_DAY, + onchange: () => dowChangeCallback(true, EVERY_DAY) + }, + /*LANG*/"Custom": { + value: isCustom ? decodeRepeat({ rp: true, dow: dow }) : false, + onchange: () => setTimeout(showCustomDaysMenu, 10, isCustom ? dow : EVERY_DAY, dowChangeCallback, originalRepeat, originalDow) + } + }; + } else { + var date = day; // eventually: detect day of date and configure a repeat e.g. 3rd Monday of Month + dow = EVERY_DAY; + repeat = repeat || {interval: "month", num: 1}; + + restOfMenu = { + /*LANG*/"Every": { + value: repeat.num, + min: 1, + onchange: v => repeat.num = v + }, + /*LANG*/"Interval": { + value: INTERVALS.indexOf(repeat.interval), + format: v => INTERVAL_LABELS[v], + min: 0, + max: INTERVALS.length - 1, + onchange: v => repeat.interval = INTERVALS[v] + } + }; + } + + Object.assign(menu, restOfMenu); E.showMenu(menu); } diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 29e71b3d9..28d48daab 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.37", + "version": "0.38", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index 634250d48..92b04fb32 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -22,3 +22,4 @@ 0.19: Update clock_info to refresh periodically on active alarms/timers 0.20: Alarm dismiss and snooze events 0.21: Fix crash in clock_info +0.22: Dated event repeat option diff --git a/apps/sched/README.md b/apps/sched/README.md index c874b5577..2fb201cee 100644 --- a/apps/sched/README.md +++ b/apps/sched/README.md @@ -45,7 +45,9 @@ Alarms are stored in an array in `sched.json`, and take the form: // eg (new Date()).toISOString().substr(0,10) msg : "Eat food", // message to display. last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! (No change from 0 on timers) - rp : true, // repeat the alarm every day? + rp : true, // repeat the alarm every day? If date is given, pass an object instead of a boolean, + // e.g. repeat every 2 months: { interval: "month", num: 2 }. + // Supported intervals: day, week, month, year vibrate : "...", // OPTIONAL pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) hidden : false, // OPTIONAL if false, the widget should not show an icon for this alarm as : false, // auto snooze diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 2a1b0f8ca..98602318d 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.21", + "version": "0.22", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", diff --git a/apps/sched/sched.js b/apps/sched/sched.js index f2f2644f9..57876ff69 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -42,7 +42,9 @@ function showAlarm(alarm) { if (del) { alarms.splice(alarmIndex, 1); } else { - if (!alarm.timer) { + if (alarm.date && alarm.rp) { + setNextRepeatDate(alarm); + } else if (!alarm.timer) { alarm.last = new Date().getDate(); } if (alarm.ot !== undefined) { @@ -78,6 +80,30 @@ function showAlarm(alarm) { }); } + function setNextRepeatDate(alarm) { + let date = new Date(alarm.date); + let rp = alarm.rp; + switch(rp.interval) { + case "day": + date.setDate(date.getDate() + rp.num); + break; + case "week": + date.setDate(date.getDate() + (rp.num * 7)); + break; + case "month": + if (!alarm.od) alarm.od = date.getDate(); + date = new Date(date.getFullYear(), date.getMonth() + rp.num, alarm.od); + if (date.getDate() != alarm.od) date.setDate(0); + break; + case "year": + if (!alarm.od) alarm.od = date.getDate(); + date = new Date(date.getFullYear() + rp.num, date.getMonth(), alarm.od); + if (date.getDate() != alarm.od) date.setDate(0); + break; + } + alarm.date = date.toLocalISOString().slice(0,10); + } + if ((require("Storage").readJSON("setting.json", 1) || {}).quiet > 1) return; From 1e23787b57534d523881d0f7959d71939b04c67f Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:17:21 -0500 Subject: [PATCH 005/183] Added app.js to this repository --- apps/multidice/app.js | 169 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 apps/multidice/app.js diff --git a/apps/multidice/app.js b/apps/multidice/app.js new file mode 100644 index 000000000..d0f62b8e9 --- /dev/null +++ b/apps/multidice/app.js @@ -0,0 +1,169 @@ +var menu = true; +var diceOpts = {amount: 2, selected: 5}; // TODO: grab values from settings +const DICE_ARRAY = [4, 6, 8, 10, 12, 20, 100]; // TODO: place in settings + +function drawMenu() { + + g.clear(); + g.setFont ("6x8", 2); + + g.drawString ("# of dice:", 5, 5); + g.drawString (diceOpts.amount, 137, 5); + + g.drawString ("dice:", 5, 32); + g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); +} + +function touchHandler (button, xy) { + + if (menu) { + + if (xy.y <= 26) { // selecting number of dice + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.amount > 1) + diceOpts.amount--; + } else { // right edge: increase + + if (diceOpts.amount < 6) + diceOpts.amount++; + } + + drawMenu(); + } else if (xy.y <= 53) { // selecting dice type + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.selected > 0) + diceOpts.selected--; + } else { // right edge: increase + + if (diceOpts.selected < DICE_ARRAY.length - 1) + diceOpts.selected++; + } + + drawMenu(); + } else { + + rollDice(); + } + } else { // return to menu screen + + menu = true; + drawMenu (); + } +} + +function rollDice() { + + menu = false; + if (diceOpts.amount == 1) { + + let output = random (DICE_ARRAY [diceOpts.selected]); + + g.clear(); + g.setFont ("Vector", 90); + + g.drawString ((" " + output).slice (-3), 10, 0); + } else { + + let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); + for (let i = 0; i < diceOpts.amount; i++) { + + output [i] = random (DICE_ARRAY [diceOpts.selected]); + } + + g.clear(); + g.setFont ("Vector", 40); + + for (let i = 0; i < 3; i++) { // draws all the numbers in two rows + + if (output [i * 2 + 0] == -1) { + + break; + } else if (output [i * 2 + 1] == -1) { + + + g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); + } else { + + g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); + } + } + + g.setFont ("Vector", 20); + g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); + g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); + g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); + g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); + } +} + +function random (max) { // number is always between 1 and max + + return Math.round (Math.random() * (max - 1) + 1); +} + +function max (array) { + + let max = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] > max) + max = array [i]; + } + + return max; +} + +function min (array) { + + let min = array [0]; + for (let i = 1; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] < min) + min = array [i]; + } + + return min; +} + +function total (array) { + + let total = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + total += array [i]; + } + + return total; +} + +function average (array) { + + let average = 0; + let rounds = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + average += array [i]; + rounds++; + } + + return Math.round (average / rounds); +} + +drawMenu(); +Bangle.on ('touch', touchHandler); From 9dcf3e715e66230f21b1cf1e3dc59ab7da44ab7e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:28:29 -0500 Subject: [PATCH 006/183] added a one-line changelog, and filled out the metadata.json file --- apps/multidice/ChangeLog | 1 + apps/multidice/metadata.json | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 apps/multidice/ChangeLog create mode 100644 apps/multidice/metadata.json diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog new file mode 100644 index 000000000..1c7728b3d --- /dev/null +++ b/apps/multidice/ChangeLog @@ -0,0 +1 @@ +0.90: got most of the features done, lacking some polish and real-hardware testing diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json new file mode 100644 index 000000000..b42c2ba16 --- /dev/null +++ b/apps/multidice/metadata.json @@ -0,0 +1,14 @@ +{ "id": "multidice", + "name": "multiple dice roller", + "shortName":"multidice", + "version":"0.90", + "description": "roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"multidice.app.js","url":"app.js"}, + {"name":"multidice.img","url":"app-icon.js","evaluate":true} + ] +} From cd788fba56e409d7577381e6cd0a24aa648f4bed Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:31:32 -0500 Subject: [PATCH 007/183] left README.md incomplete so I can emulate + add screenshots --- apps/multidice/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/multidice/README.md diff --git a/apps/multidice/README.md b/apps/multidice/README.md new file mode 100644 index 000000000..23a485d63 --- /dev/null +++ b/apps/multidice/README.md @@ -0,0 +1,25 @@ +# multiple dice roller + +roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name From c4bd98b35dd72a5133ff88ea1d1f20ee2646589d Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:57:31 -0500 Subject: [PATCH 008/183] toggled the enable emulation flag in metadata.json --- apps/multidice/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index b42c2ba16..1a41cf09f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -7,6 +7,7 @@ "tags": "", "supports" : ["BANGLEJS2"], "readme": "README.md", + "allow_emulator": true, "storage": [ {"name":"multidice.app.js","url":"app.js"}, {"name":"multidice.img","url":"app-icon.js","evaluate":true} From 44dd494c5b4f50edfb30ccad70d675f553245ca5 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 20:10:09 -0500 Subject: [PATCH 009/183] forgot to switch from hard tabs to soft tabs --- apps/multidice/app.js | 278 +++++++++++++++++++++--------------------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index d0f62b8e9..d11bc99d5 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,166 +3,166 @@ var diceOpts = {amount: 2, selected: 5}; // TODO: grab values from settings const DICE_ARRAY = [4, 6, 8, 10, 12, 20, 100]; // TODO: place in settings function drawMenu() { - - g.clear(); - g.setFont ("6x8", 2); - - g.drawString ("# of dice:", 5, 5); - g.drawString (diceOpts.amount, 137, 5); - - g.drawString ("dice:", 5, 32); - g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); + + g.clear(); + g.setFont ("6x8", 2); + + g.drawString ("# of dice:", 5, 5); + g.drawString (diceOpts.amount, 137, 5); + + g.drawString ("dice:", 5, 32); + g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); } function touchHandler (button, xy) { - - if (menu) { - - if (xy.y <= 26) { // selecting number of dice - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.amount > 1) - diceOpts.amount--; - } else { // right edge: increase - - if (diceOpts.amount < 6) - diceOpts.amount++; - } - - drawMenu(); - } else if (xy.y <= 53) { // selecting dice type - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.selected > 0) - diceOpts.selected--; - } else { // right edge: increase - - if (diceOpts.selected < DICE_ARRAY.length - 1) - diceOpts.selected++; - } - - drawMenu(); - } else { - - rollDice(); - } - } else { // return to menu screen - - menu = true; - drawMenu (); - } + + if (menu) { + + if (xy.y <= 26) { // selecting number of dice + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.amount > 1) + diceOpts.amount--; + } else { // right edge: increase + + if (diceOpts.amount < 6) + diceOpts.amount++; + } + + drawMenu(); + } else if (xy.y <= 53) { // selecting dice type + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.selected > 0) + diceOpts.selected--; + } else { // right edge: increase + + if (diceOpts.selected < DICE_ARRAY.length - 1) + diceOpts.selected++; + } + + drawMenu(); + } else { + + rollDice(); + } + } else { // return to menu screen + + menu = true; + drawMenu (); + } } function rollDice() { - - menu = false; - if (diceOpts.amount == 1) { - - let output = random (DICE_ARRAY [diceOpts.selected]); - - g.clear(); - g.setFont ("Vector", 90); - - g.drawString ((" " + output).slice (-3), 10, 0); - } else { - - let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); - for (let i = 0; i < diceOpts.amount; i++) { - - output [i] = random (DICE_ARRAY [diceOpts.selected]); - } - - g.clear(); - g.setFont ("Vector", 40); - - for (let i = 0; i < 3; i++) { // draws all the numbers in two rows - - if (output [i * 2 + 0] == -1) { - - break; - } else if (output [i * 2 + 1] == -1) { - - - g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); - } else { - - g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); - } - } - - g.setFont ("Vector", 20); - g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); - g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); - g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); - g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); - } + + menu = false; + if (diceOpts.amount == 1) { + + let output = random (DICE_ARRAY [diceOpts.selected]); + + g.clear(); + g.setFont ("Vector", 90); + + g.drawString ((" " + output).slice (-3), 10, 0); + } else { + + let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); + for (let i = 0; i < diceOpts.amount; i++) { + + output [i] = random (DICE_ARRAY [diceOpts.selected]); + } + + g.clear(); + g.setFont ("Vector", 40); + + for (let i = 0; i < 3; i++) { // draws all the numbers in two rows + + if (output [i * 2 + 0] == -1) { + + break; + } else if (output [i * 2 + 1] == -1) { + + + g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); + } else { + + g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); + } + } + + g.setFont ("Vector", 20); + g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); + g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); + g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); + g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); + } } function random (max) { // number is always between 1 and max - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } function max (array) { - - let max = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] > max) - max = array [i]; - } - - return max; + + let max = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] > max) + max = array [i]; + } + + return max; } function min (array) { - - let min = array [0]; - for (let i = 1; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] < min) - min = array [i]; - } - - return min; + + let min = array [0]; + for (let i = 1; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] < min) + min = array [i]; + } + + return min; } function total (array) { - - let total = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - total += array [i]; - } - - return total; + + let total = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + total += array [i]; + } + + return total; } function average (array) { - - let average = 0; - let rounds = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - average += array [i]; - rounds++; - } - - return Math.round (average / rounds); + + let average = 0; + let rounds = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + average += array [i]; + rounds++; + } + + return Math.round (average / rounds); } drawMenu(); From 0176522932179597fd018ce0550f75a9c5df43fe Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 20:26:04 -0500 Subject: [PATCH 010/183] filled out the README.md, and added screenshots of the app. --- apps/multidice/2d20.png | Bin 0 -> 2352 bytes apps/multidice/README.md | 19 ++++++++++++------- apps/multidice/d100.png | Bin 0 -> 1936 bytes apps/multidice/main.png | Bin 0 -> 1547 bytes apps/multidice/menuPercent.png | Bin 0 -> 1467 bytes 5 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 apps/multidice/2d20.png create mode 100644 apps/multidice/d100.png create mode 100644 apps/multidice/main.png create mode 100644 apps/multidice/menuPercent.png diff --git a/apps/multidice/2d20.png b/apps/multidice/2d20.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c52b839b07e4237582668126be172707a6309c GIT binary patch literal 2352 zcmeH}`8V5%7Qo{xOkzd_#Vcy5B{VfUlxJGCHI){nQIbY%XADt0ovNMG(W1zs_H~NX zl0=AoZ8};@#8$B{jkR7ap|Mph&->+_^ZtkV;okepz2~0u`P?6F!hLI$sEDix2m}(n zdk1NIR;<5aF{-Z(MQ)fgt;Lk*0Pb&KvpjVbcabfd_e~L(NSUyd6!68YR;(HJj)$ z7_+h+NrGAG zTfsy{Qnz-@sQ(^@J@5Cf^&jlQeHx&swW(>A!6YpDyHj%eaNNm!y!Tr&GxcGK?d?TH z0mXt5G&jC;U5`Ft&}YMid|8E3lRl;S2A5NiSOd1BxAzGvGz&@vMaJD=FxiGr4HIoT>s zns-RsQQ<@q>dM+Q}P3S=$f0x=7nDJ1_IGr+JbGgBz;f zw5J`kXTl3RQO~j?eKYTINQZ|tVRJ72MRUiN1sOm3KraX}PUVTy?>RG^79XS2_Umo0 zn1r$bF?q02S!SxvgXvczGzDc?lX(kkJP)n`ma2MhNxE(?rmquX<=*aa0K=iM1QJyK8*A=VM?Qh$P_ zOUW}{SY(c*NrtFR3^!jk>wA9R-neBiQc>y(>_BN&dSV!cFr!H5+!$D$5;xc`)RP-% zFiNAsdpy~xQCO$x+D(kVl$8PT6@06~5n6Yt)c%<{Ut=w~t4IDk>tQ48Ax=XNwyIpc zWa((*<|rr-2Lcf3s1%7QZ?Vd6UN>1m}L!xT~T@_{N<`(C^D24>hE3?p%07T7RhuQq;sJ<{oM^Hp820crGFeLi+>rdd>pTFV-Y@RT1Oe0Lx7+`6+hq7r2akhE#^3dUYCa8_fuWzFLwYKqU^3#k(*?p#iTZv~^pOUFJ#sC^Z7Mxh>z zU&A+NPmXPgDmmvNlewPO;1gxpKvod;%jmCz)_%(`gZW@g?)q#XYr^6l7)qq8Z1s`Z z1>0`mIo`^8qm#QXjhdjpIhj?mn(5dqOzu{}eNqotUKp)m{A=^8x*4vK6@YQ#EasHE z0|@#X%;u`fka+319)TX>T=X{lA})dRgwRc+lERX7(2V98d^`*9=23t;SqVvc2UBgdo#hs z-c@@?-XCi2BRY3s6F(q99 zD`CRTsLP?`gMcg*cV-3{7NX|6av6U0h!mQRy}0b;FFX@1N1D6*`x;@-`DXCS@uS@t z+ID&e!{6SS?}Xucz6(#S-9-piyG5E@I1asFMN((h&Ty^ zI82fAid#jf3dk%&VjkW8B+7JBB!@O=u~T)Zu~hiLf6Rf=UcQ?p9TM$jJ{aqDOodUp zlg(1V^vyCoXU^J*Lw$#%>yrg^$S{pB8I>+ylcK-FM!nG}8gs*YES|wN{$%n`(vQ=k zfrkTEamFpZ9?taV5vrl8QMW%y0SGxO>89V%NdiQ#Gne<$w=>UNlACg5>E1>@ zbE)a4PEn6xjv_DkYYKp!6Z3j2p-KUI=q|hkh?uqD!T8_kfy|B(&Y>3Jee>)S0^PlB KjjS?refA&Y2tz>t literal 0 HcmV?d00001 diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 23a485d63..b33365d49 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -1,25 +1,30 @@ # multiple dice roller -roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice +roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all the dice -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) +![the start-up screen](main.png) +![two rolled dice](2d20.png) +![the startup screen](menuPercent.png) +![one large dice](d100.png) ## Usage -Describe how to use it +On the menu screen: tap to the right or left of the "# of dice" option to change how many dice to roll, & tap to the left or right of the "dice" option to select a different type (currently hard-coded to only allow DnD dice). To roll the dice, simply tap anywhere else on the screen. To go back to the dice selector. + +Once you're no longer on the menu screen, tap anywhere on the screen to return to the menu (W.I.P: shaking the watch to allow rolling dice again without having to go to the menu every time) ## Features -Name the function +roll anywhere from 1-6 dice (d4, d6, d8, d10, d12, d20, & d percentile). If only one dice is selected, it simply displays the output; if two or more dice are selected it also displays basic stats such as the highest & lowest roll, the total sum, and the average of all the dice. ## Controls -Name the buttons and what they are used for +No button is used in the app, it simply uses touch controls (W.I.P: accelerometor to roll the dice & compatability with the bangle.js 1). ## Requests -Name who should be contacted for support/update requests +Le3Kat@gmail.com ## Creator -Your name +Le~Kat diff --git a/apps/multidice/d100.png b/apps/multidice/d100.png new file mode 100644 index 0000000000000000000000000000000000000000..16350db1657632de685f8c0289d84112b8334f6d GIT binary patch literal 1936 zcmeHI`%{t$6vZ#UM6wA~EK76=-;AcEtENyPCak5DDLs6xWtv7>t*fSF>_BBDRGVp; zT4vHtDr{PsDB`2(HAbeE76Q7I_yWuaqN1z+!R|~y_QSnr=AOB8XU@5IZVn|la5Zc_ z3<80yCXSF4DEK#Ztl;*NdkQDcQ2zi;$00rM9Zm3?;c*IVIt53%B+ z>yx4mKY38ka<@IL(=KK&&V&FqzsO5PHn;E4vJsS+fSCjUHs3Mc+W?G+0?jCL4qN;c zIg_&@{|)$g+&FsFDh>|{J12``)VU$%x`YWQjm^l;m4%Mq_6+(qii(=;FJ{f?-p*dW za;v!tu2W9Xx8VAW8#ebGx+YM)2rN-AxKU!}BU|TKC{r#p>p`cx>@P4FR*R9}7i*O- zy}OO?SZES*IQZqVNm`j`sil`S=HZZ%D7tTppUvW06r2yjGp{zj#Md&ey%gIh`bTy1npI(Ue_NY$HD7A?jt@TNv0&uoIJW?il+--h?Q3jh6hIUUI3__z=!}) zojH-(_PgwMn7Nv~%PZB|DL7~-RI$vjNKau)+1Q{Djo}O;_=kIJ6OXOxm#iyiH{li{A#v{dIh5Baf zZ=ybZxEs58tV1egc$p4alwuUBVl7GHo)4(e*|p`N=c}&zW=b#flb+7$ag4Raq9Qc! zM%`&wP@2i~kTC@Q;qusbfss-t0=KP*o*dWblkcFhpsPgz1WvyAdXKNB#aEL$(y@c* zm!aOnE^bdoi+bO?v?;F&<|==(!W9BkrC0Vv0WEIdJMy=)Vz0!f@f{f~$lfMrv}rCh z96j!qA9aRG-%c8O^!jH6HNEUDk-_))UGiF5~lixc@d}K~dERs%v$M%G6>bf;SZ%;2@b26mqlGDN<@l| zIN0a<)ac{zjHxWxyxbdw{x%#F-56wb3=f{Y=3%_`fCS-i>QfeMmut<3HaJCI;CP$~ zr^FE2Z?6MjR%WbRH~`!A@PL{BcE;gSK7z2FVeFX{3w2D{W&Se(>gaaw=x!4Oke$=A z6KVk3cU9z|?~2^_^gx$@dE3+7(A?V|wgGKuUO=g~KYtE*LHrfNJO`L1{uuT{#_zTu a^F~jqKDvZ8uF)=iS_nBHm{>)K`Qu-37+f|0 literal 0 HcmV?d00001 diff --git a/apps/multidice/main.png b/apps/multidice/main.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca8f963174c7da421bc8d8abfd3391a64f13492 GIT binary patch literal 1547 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v?ipf%TH7i(^Pd+}qg?%Vq@#u)Y3m zUvhi$5wnLK)#3p=?)&_2DoRgxSn~1P@Av!T{}nS$_Ir?aVDhZuoASa23C=UBnAmK# z+KJ~MFf;hdvW(|P*=}2zU#s`^-|OH0?cddJE4g?6c*I-b5Fnbdwf2F)yG?~m{>*V* zmeE%tkK4cAAw75Bo7DIJo=7tqK4{dG{P29jGR}(Jh2Gbz-&?w~2dzziZ}l$b?qi+r z>#rG}ie8)k#o}rm^YeH81?zvvK6og)L#UGdzV(8@g;%S-ty|2M)_c97K5l0JCxfb_ z+8QmJ-}85b-(?P$Kbd`d_4U#N``<_JeZP9U{`J4_9_P-z{ppDLgY}&fAD$;4S}T9^ zD(43C8}B&FzkIBVsoBHy|9{b^RSCNsL$~|5-#t`%SZeRn*Zbbj`@6UG$G5k)8s;xI z@jbA9A5%!UO1|Q}`%WR@YqIuTeZ9VWZ8tzQ?{ zh*ah7e>FLM=el?9uL9r4105#b@ovtl((uy(|h7TI^L(_^h@6Z4b`8E-gg6OeYGP`zo;b~*ju^t`%xe*F8rvdO8ACI z!Po14SHIm8x_g^*jsJm$waKqI_ozHrss89uxO%}A`493xKUXuG-FV39BVO<|c+x9z zma8+rt!u3Cx4ZM=uRoVqxYtO%$|8Gs*>-Ej66IQ)t+vEQ7cYHK!RPO!Fk5)3RbLii(d{v+0 zJ-c6XmvU{ZW~??VW>yownF5Te#?tc#-u=59Jz<&qop*PC>O05(-c)}?{aHx(gS7`@ z8Fx5wKX~`YkN?NH&EG8xzV3Oy;=8=r#N_oe3t7ANM`p4(G% z_u6u`YBrCGw_6y6pPaDx&SLgg_sE?S>+CX_*yf}NpGZ33@Y3_dD04I%hFl`3XK-^& Wv6(9Jbw99>XYh3Ob6Mw<&;$UNdjDDZGy0Y(FVSM=e(rLfL zi?^)XK5O|`tE+W;FI8W^UH#AYH}jtfQU`9gBr)jEXMETHBz$j4$n(hCakAT=3;y|g zea`>+S#SPMdHCYv>7D)a)?4i}U+!P6|Hb0J=Jx}k2N?eUo>6dxnd?FG{r`+R-Y>1n zeII`R@wP+jer4O9*Z%gI=g-0I0-*;P*4NBjUS(X&UzXo+Rr!YQk#D*#th-Nbx7v5h z?$@8IUr$#jG}OCAh?bR9zn{Hh)q|{guYP3xe(^c{x;|t7Kar%$e@_oo-{12^=g-Z3 zSDDK#udlYd9$W4DdT#pK?H6~-)VkUk-3Pjd!G8UkuZ%&Bm0yihzB;UWX34b0%Iwo= zo2!d*=BqO{Jb(FXk~Zs)Nn6it)}WNLBDP_5zIEvB=bhKR+|?OAyl9zQpTXqJz(4oK zNq_$ZUq!!##{ang>!s9z<;5qY71#>C`u=$(&T_Ti?*2!PzmG0TRmd&hH_r zvyX?{Kia$g)6K85>Vme22_JaRTJr5`5<~d;h{fCWyQ{u`J=gXr^LqTV`?uXoYulfW9ltxP#esqLrRM6#t6$Ua$1$#+SFq}F_4eaT>l8x2-?{p6+ji9eTg5L; zZ|=%J*f#IY)=3Npj@G9~?N#}DY8BIa+xu^RhgXK>f4erX@VZ^@ja~Ot-!*CnggyXj z{O_~i)aQ}|r_GbA?cJiQUH1O^v-Wyn|DN{?BmUYhsCpI?xAj-Sg3|x%|F+ff-Qjxu zf_ceTD+YhIiu*;fs*T@OH@x00@Lu}-RFw_Dq}}48&QMTN+r~bl@dXP*-@5Z37>tpV zJcGq9yTi<997>oN+^?rsG)Q*%F+6zji-+HU`64HSOzixJjA;s1j17xl8`~V<88r-4 hOpJyZdeZnKZ+?G`jqq~$%fLdJ!PC{xWt~$(696AnwY>lU literal 0 HcmV?d00001 From abc1951d485ae493778e16eb8984c3a7a595f741 Mon Sep 17 00:00:00 2001 From: Le-Kat <37410281+Le-Kat@users.noreply.github.com> Date: Fri, 10 Feb 2023 01:27:49 +0000 Subject: [PATCH 011/183] added spacing between two of the images --- apps/multidice/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/multidice/README.md b/apps/multidice/README.md index b33365d49..7e44600d6 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -4,6 +4,7 @@ roll anywhere from 1-6 dice at the same time, and display stats like the highest ![the start-up screen](main.png) ![two rolled dice](2d20.png) + ![the startup screen](menuPercent.png) ![one large dice](d100.png) From a2010999e4c7dfdf4a83ee48163c0ad70f9eb241 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 20:39:22 -0500 Subject: [PATCH 012/183] added app icon --- apps/multidice/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/multidice/app-icon.js diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js new file mode 100644 index 000000000..d79fe5bd2 --- /dev/null +++ b/apps/multidice/app-icon.js @@ -0,0 +1 @@ +E.toArraybuffer(atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==")) From e3f3fe3ddddc041ed0fdd72f171d32eb9fa7cefb Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 21:36:51 -0500 Subject: [PATCH 013/183] removed email from README b/c I don't want it getting scraped --- apps/multidice/README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 7e44600d6..06ea82075 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -21,11 +21,3 @@ roll anywhere from 1-6 dice (d4, d6, d8, d10, d12, d20, & d percentile). If only ## Controls No button is used in the app, it simply uses touch controls (W.I.P: accelerometor to roll the dice & compatability with the bangle.js 1). - -## Requests - -Le3Kat@gmail.com - -## Creator - -Le~Kat From d236364b9ca21f592be45f64d2685ebd0a5f52c6 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 21:41:49 -0500 Subject: [PATCH 014/183] added app.png --- apps/multidice/app.png | Bin 0 -> 1330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/multidice/app.png diff --git a/apps/multidice/app.png b/apps/multidice/app.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee0514a953e29e618bf56a49e8526e8eac59f5 GIT binary patch literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& literal 0 HcmV?d00001 From a8339c1718a5acaf0d38dce3f2d9821a59cd6096 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 22:31:50 -0500 Subject: [PATCH 015/183] added tags to metadata.json, trying to wrap my head around the sanitycheck --- apps/multidice/app-icon.js | 2 +- apps/multidice/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index d79fe5bd2..d6e931259 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -E.toArraybuffer(atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==")) +atob("MDCEAREREREREREREREREREREQAAEREREREREREREREREREREREREREREAAAARERERERERAAAAAAAAAAAAAAARERABERABEREREREQARERERERERERERAREQAREREAEREREREQARERERERERERERABEAEREREQAREREREQARERERERERERERABABERERERABEREREQAREREREREREREREQARERAAEREAEREREQAREREREREREREREAEREQAAAREQAREREQARERERERERERERABEREAERARERABEREQARERERAAAREREQAREREAERAREREAEREQAREREQAAABEREAEREREQEQAREREQAREQAREREAEREAERABEREREQAAERERERABEQAREREBEREQEQAREREREREREREREREAEQAREREBEREQEAEREQAAERERERAAAREQAQAREREBEREQABEREAEQEREREQARARERAAAREREAEREAABEREBEQAREREQERABERAAAREREQAAABEBEREBEQAREREQERABERAAARERERAAAREAEREAAAEREREQAAARERAAAREREREREREQARERABEREREREAEREQAQARERERERERERABERERERABEREREREAEQAREREREREREREAEREREQAAARERERABEQAREREREREREREQAREREAERAREREQAREQARERERERERERERABEREAERAREREAEREQARERERERERERERAAEREQEQARERABERERAAAAAAAAAAAAAAAQAREQAAEREQAQABERAAAAAAAAAAAAAAAAABEREREREAEQAAEQARERERERERERERABEAERERERABEREQEQARAAARERERERERABEQAREREQAQABEQEQAQAAABERERERERABERABEREAEAAAEQAQAQARABERERERERABEREAERABEBEQEQAQEQARABERERERERABEBEQAAAREBEQEQAREQAAABERERERERABEAABEREREAAAEQAQERAAARERERERERABEQABEREREQABEQAQERERERAAARERERABEREREQABEREREQAREREREQAAABERERABEREREAAAEREREQAQEREREQARABERERABEREREBEQEREREQAQAREREQARABERERABEREREBEQEREREQAQAREREQAAABERERABEREREAAAEREREQAQARERERAAARERERABEREREQABEREREQAQARERERERERAAARABEQABEREREQABEQAQAREREREREQAAABABEAAAEREREAAAEQAQAREREREREQARABABEBEQEREREBEQEQAQAREREREREQARABABEBEQEREREBEQEQAQAREREREREQAAABABEAAAEREREAAAEQAQARERERERERAAARABEQABEREREQABEQEQARERERERERERERABEREREREREREREQERAAEREREREREREAAAARERERERERERAAEREAAAAAAAAAAAAAEQAAAAAAAAAAAAAREQ==") diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 1a41cf09f..b7537d0b3 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -4,7 +4,7 @@ "version":"0.90", "description": "roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice", "icon": "app.png", - "tags": "", + "tags": "tool,game", "supports" : ["BANGLEJS2"], "readme": "README.md", "allow_emulator": true, From b2c8f55261a2b84bc184e93f60e81cadec24da3e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Fri, 24 Feb 2023 23:39:42 -0500 Subject: [PATCH 016/183] after a rigorous field study of size n = 1, I have determined this to be a better app after this change --- apps/multidice/app.js | 230 +++++++++++++++++------------------------- 1 file changed, 94 insertions(+), 136 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index d11bc99d5..911177983 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -1,169 +1,127 @@ var menu = true; -var diceOpts = {amount: 2, selected: 5}; // TODO: grab values from settings -const DICE_ARRAY = [4, 6, 8, 10, 12, 20, 100]; // TODO: place in settings +const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; +const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + g.clear(); - g.setFont ("6x8", 2); + g.setFont ("Vector", 40); - g.drawString ("# of dice:", 5, 5); - g.drawString (diceOpts.amount, 137, 5); - - g.drawString ("dice:", 5, 32); - g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - if (menu) { - - if (xy.y <= 26) { // selecting number of dice - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.amount > 1) - diceOpts.amount--; - } else { // right edge: increase - - if (diceOpts.amount < 6) - diceOpts.amount++; - } - - drawMenu(); - } else if (xy.y <= 53) { // selecting dice type - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.selected > 0) - diceOpts.selected--; - } else { // right edge: increase - - if (diceOpts.selected < DICE_ARRAY.length - 1) - diceOpts.selected++; - } - - drawMenu(); - } else { - - rollDice(); - } - } else { // return to menu screen + if (! menu) { menu = true; - drawMenu (); + drawMenu(); + return; } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function rollDice() { - menu = false; - if (diceOpts.amount == 1) { + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { - let output = random (DICE_ARRAY [diceOpts.selected]); - - g.clear(); - g.setFont ("Vector", 90); - - g.drawString ((" " + output).slice (-3), 10, 0); - } else { - - let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); - for (let i = 0; i < diceOpts.amount; i++) { + if (SELECTION_ARRAY [i] != 0) { - output [i] = random (DICE_ARRAY [diceOpts.selected]); + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { - g.clear(); - g.setFont ("Vector", 40); - - for (let i = 0; i < 3; i++) { // draws all the numbers in two rows + if (SELECTION_ARRAY [i] != 0) { - if (output [i * 2 + 0] == -1) { - - break; - } else if (output [i * 2 + 1] == -1) { - - - g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); - } else { - - g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); - } + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); } + } + + for (i = 4; i < 8; i++) { - g.setFont ("Vector", 20); - g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); - g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); - g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); - g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * i); + } } } -function random (max) { // number is always between 1 and max +function random (max) { return Math.round (Math.random() * (max - 1) + 1); } -function max (array) { - - let max = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] > max) - max = array [i]; - } - - return max; -} - -function min (array) { - - let min = array [0]; - for (let i = 1; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] < min) - min = array [i]; - } - - return min; -} - -function total (array) { - - let total = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - total += array [i]; - } - - return total; -} - -function average (array) { - - let average = 0; - let rounds = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - average += array [i]; - rounds++; - } - - return Math.round (average / rounds); -} - drawMenu(); Bangle.on ('touch', touchHandler); +Bangle.on ('accel', function (xyz) { + + if (xyz.diff >= 0.3) { + + menu = false; + rollDice(); + } +}); From d567a55f9ca34700fd8bc9200fec1c7750333ae2 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Fri, 24 Feb 2023 23:46:13 -0500 Subject: [PATCH 017/183] updated changelog, metadata, & readme. deleted outdated images --- apps/multidice/2d20.png | Bin 2352 -> 0 bytes apps/multidice/ChangeLog | 1 + apps/multidice/README.md | 16 +++++----------- apps/multidice/app.png | Bin 1330 -> 0 bytes apps/multidice/d100.png | Bin 1936 -> 0 bytes apps/multidice/main.png | Bin 1547 -> 0 bytes apps/multidice/menuPercent.png | Bin 1467 -> 0 bytes apps/multidice/metadata.json | 4 ++-- 8 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 apps/multidice/2d20.png delete mode 100644 apps/multidice/app.png delete mode 100644 apps/multidice/d100.png delete mode 100644 apps/multidice/main.png delete mode 100644 apps/multidice/menuPercent.png diff --git a/apps/multidice/2d20.png b/apps/multidice/2d20.png deleted file mode 100644 index e6c52b839b07e4237582668126be172707a6309c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmeH}`8V5%7Qo{xOkzd_#Vcy5B{VfUlxJGCHI){nQIbY%XADt0ovNMG(W1zs_H~NX zl0=AoZ8};@#8$B{jkR7ap|Mph&->+_^ZtkV;okepz2~0u`P?6F!hLI$sEDix2m}(n zdk1NIR;<5aF{-Z(MQ)fgt;Lk*0Pb&KvpjVbcabfd_e~L(NSUyd6!68YR;(HJj)$ z7_+h+NrGAG zTfsy{Qnz-@sQ(^@J@5Cf^&jlQeHx&swW(>A!6YpDyHj%eaNNm!y!Tr&GxcGK?d?TH z0mXt5G&jC;U5`Ft&}YMid|8E3lRl;S2A5NiSOd1BxAzGvGz&@vMaJD=FxiGr4HIoT>s zns-RsQQ<@q>dM+Q}P3S=$f0x=7nDJ1_IGr+JbGgBz;f zw5J`kXTl3RQO~j?eKYTINQZ|tVRJ72MRUiN1sOm3KraX}PUVTy?>RG^79XS2_Umo0 zn1r$bF?q02S!SxvgXvczGzDc?lX(kkJP)n`ma2MhNxE(?rmquX<=*aa0K=iM1QJyK8*A=VM?Qh$P_ zOUW}{SY(c*NrtFR3^!jk>wA9R-neBiQc>y(>_BN&dSV!cFr!H5+!$D$5;xc`)RP-% zFiNAsdpy~xQCO$x+D(kVl$8PT6@06~5n6Yt)c%<{Ut=w~t4IDk>tQ48Ax=XNwyIpc zWa((*<|rr-2Lcf3s1%7QZ?Vd6UN>1m}L!xT~T@_{N<`(C^D24>hE3?p%07T7RhuQq;sJ<{oM^Hp820crGFeLi+>rdd>pTFV-Y@RT1Oe0Lx7+`6+hq7r2akhE#^3dUYCa8_fuWzFLwYKqU^3#k(*?p#iTZv~^pOUFJ#sC^Z7Mxh>z zU&A+NPmXPgDmmvNlewPO;1gxpKvod;%jmCz)_%(`gZW@g?)q#XYr^6l7)qq8Z1s`Z z1>0`mIo`^8qm#QXjhdjpIhj?mn(5dqOzu{}eNqotUKp)m{A=^8x*4vK6@YQ#EasHE z0|@#X%;u`fka+319)TX>T=X{lA})dRgwRc+lERX7(2V98d^`*9=23t;SqVvc2UBgdo#hs z-c@@?-XCi2BRY3s6F(q99 zD`CRTsLP?`gMcg*cV-3{7NX|6av6U0h!mQRy}0b;FFX@1N1D6*`x;@-`DXCS@uS@t z+ID&e!{6SS?}Xucz6(#S-9-piyG5E@I1asFMN((h&Ty^ zI82fAid#jf3dk%&VjkW8B+7JBB!@O=u~T)Zu~hiLf6Rf=UcQ?p9TM$jJ{aqDOodUp zlg(1V^vyCoXU^J*Lw$#%>yrg^$S{pB8I>+ylcK-FM!nG}8gs*YES|wN{$%n`(vQ=k zfrkTEamFpZ9?taV5vrl8QMW%y0SGxO>89V%NdiQ#Gne<$w=>UNlACg5>E1>@ zbE)a4PEn6xjv_DkYYKp!6Z3j2p-KUI=q|hkh?uqD!T8_kfy|B(&Y>3Jee>)S0^PlB KjjS?refA&Y2tz>t diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 1c7728b3d..a216ea61b 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -1 +1,2 @@ 0.90: got most of the features done, lacking some polish and real-hardware testing +1.00: overhauled the whole app, made some margins larger to be easier to tap on diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 06ea82075..2d28ef33f 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -1,23 +1,17 @@ # multiple dice roller -roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all the dice +roll anywhere from 1-8 dice at the same time. -![the start-up screen](main.png) -![two rolled dice](2d20.png) - -![the startup screen](menuPercent.png) -![one large dice](d100.png) ## Usage -On the menu screen: tap to the right or left of the "# of dice" option to change how many dice to roll, & tap to the left or right of the "dice" option to select a different type (currently hard-coded to only allow DnD dice). To roll the dice, simply tap anywhere else on the screen. To go back to the dice selector. - -Once you're no longer on the menu screen, tap anywhere on the screen to return to the menu (W.I.P: shaking the watch to allow rolling dice again without having to go to the menu every time) +On the menu screen: tap on the dice to change what variant is selected, & shake the watch in order to roll those dice +On the dice screen: tap anywhere on the screen to go back to the menu, or shake to roll the dice again ## Features -roll anywhere from 1-6 dice (d4, d6, d8, d10, d12, d20, & d percentile). If only one dice is selected, it simply displays the output; if two or more dice are selected it also displays basic stats such as the highest & lowest roll, the total sum, and the average of all the dice. +roll anywhere from 1-8 dice (d4, d6, d8, d10, d12, d20, & d percentile). You can select multiple different dice at the same time ## Controls -No button is used in the app, it simply uses touch controls (W.I.P: accelerometor to roll the dice & compatability with the bangle.js 1). +No button is used in the app, it simply uses touch controls & the accelerometor diff --git a/apps/multidice/app.png b/apps/multidice/app.png deleted file mode 100644 index 75ee0514a953e29e618bf56a49e8526e8eac59f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& diff --git a/apps/multidice/d100.png b/apps/multidice/d100.png deleted file mode 100644 index 16350db1657632de685f8c0289d84112b8334f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmeHI`%{t$6vZ#UM6wA~EK76=-;AcEtENyPCak5DDLs6xWtv7>t*fSF>_BBDRGVp; zT4vHtDr{PsDB`2(HAbeE76Q7I_yWuaqN1z+!R|~y_QSnr=AOB8XU@5IZVn|la5Zc_ z3<80yCXSF4DEK#Ztl;*NdkQDcQ2zi;$00rM9Zm3?;c*IVIt53%B+ z>yx4mKY38ka<@IL(=KK&&V&FqzsO5PHn;E4vJsS+fSCjUHs3Mc+W?G+0?jCL4qN;c zIg_&@{|)$g+&FsFDh>|{J12``)VU$%x`YWQjm^l;m4%Mq_6+(qii(=;FJ{f?-p*dW za;v!tu2W9Xx8VAW8#ebGx+YM)2rN-AxKU!}BU|TKC{r#p>p`cx>@P4FR*R9}7i*O- zy}OO?SZES*IQZqVNm`j`sil`S=HZZ%D7tTppUvW06r2yjGp{zj#Md&ey%gIh`bTy1npI(Ue_NY$HD7A?jt@TNv0&uoIJW?il+--h?Q3jh6hIUUI3__z=!}) zojH-(_PgwMn7Nv~%PZB|DL7~-RI$vjNKau)+1Q{Djo}O;_=kIJ6OXOxm#iyiH{li{A#v{dIh5Baf zZ=ybZxEs58tV1egc$p4alwuUBVl7GHo)4(e*|p`N=c}&zW=b#flb+7$ag4Raq9Qc! zM%`&wP@2i~kTC@Q;qusbfss-t0=KP*o*dWblkcFhpsPgz1WvyAdXKNB#aEL$(y@c* zm!aOnE^bdoi+bO?v?;F&<|==(!W9BkrC0Vv0WEIdJMy=)Vz0!f@f{f~$lfMrv}rCh z96j!qA9aRG-%c8O^!jH6HNEUDk-_))UGiF5~lixc@d}K~dERs%v$M%G6>bf;SZ%;2@b26mqlGDN<@l| zIN0a<)ac{zjHxWxyxbdw{x%#F-56wb3=f{Y=3%_`fCS-i>QfeMmut<3HaJCI;CP$~ zr^FE2Z?6MjR%WbRH~`!A@PL{BcE;gSK7z2FVeFX{3w2D{W&Se(>gaaw=x!4Oke$=A z6KVk3cU9z|?~2^_^gx$@dE3+7(A?V|wgGKuUO=g~KYtE*LHrfNJO`L1{uuT{#_zTu a^F~jqKDvZ8uF)=iS_nBHm{>)K`Qu-37+f|0 diff --git a/apps/multidice/main.png b/apps/multidice/main.png deleted file mode 100644 index 7ca8f963174c7da421bc8d8abfd3391a64f13492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1547 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v?ipf%TH7i(^Pd+}qg?%Vq@#u)Y3m zUvhi$5wnLK)#3p=?)&_2DoRgxSn~1P@Av!T{}nS$_Ir?aVDhZuoASa23C=UBnAmK# z+KJ~MFf;hdvW(|P*=}2zU#s`^-|OH0?cddJE4g?6c*I-b5Fnbdwf2F)yG?~m{>*V* zmeE%tkK4cAAw75Bo7DIJo=7tqK4{dG{P29jGR}(Jh2Gbz-&?w~2dzziZ}l$b?qi+r z>#rG}ie8)k#o}rm^YeH81?zvvK6og)L#UGdzV(8@g;%S-ty|2M)_c97K5l0JCxfb_ z+8QmJ-}85b-(?P$Kbd`d_4U#N``<_JeZP9U{`J4_9_P-z{ppDLgY}&fAD$;4S}T9^ zD(43C8}B&FzkIBVsoBHy|9{b^RSCNsL$~|5-#t`%SZeRn*Zbbj`@6UG$G5k)8s;xI z@jbA9A5%!UO1|Q}`%WR@YqIuTeZ9VWZ8tzQ?{ zh*ah7e>FLM=el?9uL9r4105#b@ovtl((uy(|h7TI^L(_^h@6Z4b`8E-gg6OeYGP`zo;b~*ju^t`%xe*F8rvdO8ACI z!Po14SHIm8x_g^*jsJm$waKqI_ozHrss89uxO%}A`493xKUXuG-FV39BVO<|c+x9z zma8+rt!u3Cx4ZM=uRoVqxYtO%$|8Gs*>-Ej66IQ)t+vEQ7cYHK!RPO!Fk5)3RbLii(d{v+0 zJ-c6XmvU{ZW~??VW>yownF5Te#?tc#-u=59Jz<&qop*PC>O05(-c)}?{aHx(gS7`@ z8Fx5wKX~`YkN?NH&EG8xzV3Oy;=8=r#N_oe3t7ANM`p4(G% z_u6u`YBrCGw_6y6pPaDx&SLgg_sE?S>+CX_*yf}NpGZ33@Y3_dD04I%hFl`3XK-^& Wv6(9Jbw99>XYh3Ob6Mw<&;$UNdjDDZGy0Y(FVSM=e(rLfL zi?^)XK5O|`tE+W;FI8W^UH#AYH}jtfQU`9gBr)jEXMETHBz$j4$n(hCakAT=3;y|g zea`>+S#SPMdHCYv>7D)a)?4i}U+!P6|Hb0J=Jx}k2N?eUo>6dxnd?FG{r`+R-Y>1n zeII`R@wP+jer4O9*Z%gI=g-0I0-*;P*4NBjUS(X&UzXo+Rr!YQk#D*#th-Nbx7v5h z?$@8IUr$#jG}OCAh?bR9zn{Hh)q|{guYP3xe(^c{x;|t7Kar%$e@_oo-{12^=g-Z3 zSDDK#udlYd9$W4DdT#pK?H6~-)VkUk-3Pjd!G8UkuZ%&Bm0yihzB;UWX34b0%Iwo= zo2!d*=BqO{Jb(FXk~Zs)Nn6it)}WNLBDP_5zIEvB=bhKR+|?OAyl9zQpTXqJz(4oK zNq_$ZUq!!##{ang>!s9z<;5qY71#>C`u=$(&T_Ti?*2!PzmG0TRmd&hH_r zvyX?{Kia$g)6K85>Vme22_JaRTJr5`5<~d;h{fCWyQ{u`J=gXr^LqTV`?uXoYulfW9ltxP#esqLrRM6#t6$Ua$1$#+SFq}F_4eaT>l8x2-?{p6+ji9eTg5L; zZ|=%J*f#IY)=3Npj@G9~?N#}DY8BIa+xu^RhgXK>f4erX@VZ^@ja~Ot-!*CnggyXj z{O_~i)aQ}|r_GbA?cJiQUH1O^v-Wyn|DN{?BmUYhsCpI?xAj-Sg3|x%|F+ff-Qjxu zf_ceTD+YhIiu*;fs*T@OH@x00@Lu}-RFw_Dq}}48&QMTN+r~bl@dXP*-@5Z37>tpV zJcGq9yTi<997>oN+^?rsG)Q*%F+6zji-+HU`64HSOzixJjA;s1j17xl8`~V<88r-4 hOpJyZdeZnKZ+?G`jqq~$%fLdJ!PC{xWt~$(696AnwY>lU diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index b7537d0b3..1b02945b6 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,8 +1,8 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"0.90", - "description": "roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice", + "version":"1.00", + "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", "supports" : ["BANGLEJS2"], From c6dbb65bd3a7f408f428357ed18e0752a135b8bc Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Fri, 24 Feb 2023 23:59:41 -0500 Subject: [PATCH 018/183] fixed bug that caused rolled dice on the right of screen to be writ off-screen --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index a216ea61b..c35862f7c 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -1,2 +1,3 @@ 0.90: got most of the features done, lacking some polish and real-hardware testing 1.00: overhauled the whole app, made some margins larger to be easier to tap on +1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 911177983..58b72e9fc 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -105,7 +105,7 @@ function rollDice() { if (SELECTION_ARRAY [i] != 0) { - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * i); + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 1b02945b6..3e82d01be 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.00", + "version":"1.01", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 4d2763d1e013f38c65a2097b03433d6a57e7206a Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:09:16 -0500 Subject: [PATCH 019/183] added vibration when dice is rolled --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 ++ apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index c35862f7c..ee190c200 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -1,3 +1,4 @@ 0.90: got most of the features done, lacking some polish and real-hardware testing 1.00: overhauled the whole app, made some margins larger to be easier to tap on 1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen +1.02: added vibration when dice is rolled diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 58b72e9fc..0ab98f8d0 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -108,6 +108,8 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } + + Bangle.buzz(); } function random (max) { diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 3e82d01be..ba0b5a57f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.01", + "version":"1.02", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 4deee14663f2526bb1295db11273c36ecd180c03 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:18:26 -0500 Subject: [PATCH 020/183] vibration caused the accelerometer to never stop --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ee190c200..6316210e5 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -2,3 +2,4 @@ 1.00: overhauled the whole app, made some margins larger to be easier to tap on 1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen 1.02: added vibration when dice is rolled +1.03: vibration caused the accelerometer to never stop diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 0ab98f8d0..8bf2ca662 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -121,7 +121,7 @@ drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', function (xyz) { - if (xyz.diff >= 0.3) { + if (xyz.diff >= 0.5) { menu = false; rollDice(); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ba0b5a57f..6612cc999 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.02", + "version":"1.03", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From ae1bb8dab407fdcd9977b1bcd7eca48e1346198b Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:23:15 -0500 Subject: [PATCH 021/183] accidentally deleted app icon LMAO --- apps/multidice/app.png | Bin 0 -> 1330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/multidice/app.png diff --git a/apps/multidice/app.png b/apps/multidice/app.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee0514a953e29e618bf56a49e8526e8eac59f5 GIT binary patch literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& literal 0 HcmV?d00001 From ec1c534b0d0b525879263d5fd3d4a8354cc9f7c7 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:25:33 -0500 Subject: [PATCH 022/183] decreased vibration strength --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 4 ++-- apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 6316210e5..9bc00d9be 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -3,3 +3,4 @@ 1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen 1.02: added vibration when dice is rolled 1.03: vibration caused the accelerometer to never stop +1.04: decreased vibration strength diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 8bf2ca662..ef16ca2de 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -109,7 +109,7 @@ function rollDice() { } } - Bangle.buzz(); + Bangle.buzz (200, 0.1); } function random (max) { @@ -121,7 +121,7 @@ drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', function (xyz) { - if (xyz.diff >= 0.5) { + if (xyz.diff >= 0.4) { menu = false; rollDice(); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 6612cc999..ef5841877 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.03", + "version":"1.04", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 379af915458eb6ee653d1c5a14dc3adcee04c651 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 07:52:26 -0500 Subject: [PATCH 023/183] toggled the acceleration handler to prevent infinite buzz loop --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 236 +++++++++++++++++++---------------- apps/multidice/metadata.json | 2 +- 3 files changed, 127 insertions(+), 112 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 9bc00d9be..fc6479e98 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -4,3 +4,4 @@ 1.02: added vibration when dice is rolled 1.03: vibration caused the accelerometer to never stop 1.04: decreased vibration strength +1.05: toggled the acceleration handler to prevent infinite buzz loop diff --git a/apps/multidice/app.js b/apps/multidice/app.js index ef16ca2de..15d9564bc 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,127 +3,141 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); +} + +function accelHandler (xyz) { + + if (xyz.diff >= 0.4) { + + menu = false; + rollDice(); + } +} + +function voidFn() { + + return; } function rollDice() { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - Bangle.buzz (200, 0.1); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); +} + +function vibrate() { + + Bangle.on ('accel', voidFn); + Bangle.buzz (200, 0.1).then( + + Bangle.on ('accel', accelHandler) + ); } drawMenu(); Bangle.on ('touch', touchHandler); -Bangle.on ('accel', function (xyz) { - - if (xyz.diff >= 0.4) { - - menu = false; - rollDice(); - } -}); +Bangle.on ('accel', accelHandler); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ef5841877..82af0ef8b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.04", + "version":"1.05", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 79a64152cf4802af6f1dd2c8e0f89e34351509f3 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 07:55:52 -0500 Subject: [PATCH 024/183] increased vibration again --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index fc6479e98..b5de3ea67 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -5,3 +5,4 @@ 1.03: vibration caused the accelerometer to never stop 1.04: decreased vibration strength 1.05: toggled the acceleration handler to prevent infinite buzz loop +1.06: increased vibration again diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 15d9564bc..04e23e22a 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz (200, 0.1).then( + Bangle.buzz (200, 1).then( Bangle.on ('accel', accelHandler) ); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 82af0ef8b..36c0d9c1f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.05", + "version":"1.06", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 54f61412a87a6fefd52b6ba4051ba7abc26d9f26 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 08:05:35 -0500 Subject: [PATCH 025/183] IDK how to use promises properly --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index b5de3ea67..445dd4d68 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -6,3 +6,4 @@ 1.04: decreased vibration strength 1.05: toggled the acceleration handler to prevent infinite buzz loop 1.06: increased vibration again +1.07: IDK how to use promises properly diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 04e23e22a..e99e785c3 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz (200, 1).then( + Bangle.buzz (200, 1).then ((value) => Bangle.on ('accel', accelHandler) ); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 36c0d9c1f..743cb79ae 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.06", + "version":"1.07", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From b688a4e90ad026a62ab34ca2142a778d9563697a Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 08:21:42 -0500 Subject: [PATCH 026/183] still trying to fix the lack of vibrations --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 445dd4d68..a9fc055c0 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -7,3 +7,4 @@ 1.05: toggled the acceleration handler to prevent infinite buzz loop 1.06: increased vibration again 1.07: IDK how to use promises properly +1.08: still trying to fix the lack of vibrations diff --git a/apps/multidice/app.js b/apps/multidice/app.js index e99e785c3..789cf26bd 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz (200, 1).then ((value) => + Bangle.buzz().then ((value) => Bangle.on ('accel', accelHandler) ); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 743cb79ae..effb1c57b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.07", + "version":"1.08", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 53ba86b01a617576d4cb680b21ed13271779aa6e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 08:35:18 -0500 Subject: [PATCH 027/183] hopefully now it's fixed? --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 4 ++-- apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index a9fc055c0..ce7632d7c 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -8,3 +8,4 @@ 1.06: increased vibration again 1.07: IDK how to use promises properly 1.08: still trying to fix the lack of vibrations +1.09: hopefully now it's fixed? diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 789cf26bd..8f027c47a 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,10 +132,10 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz().then ((value) => + Bangle.buzz().then ((value) => { Bangle.on ('accel', accelHandler) - ); + }); } drawMenu(); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index effb1c57b..95071c67b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.08", + "version":"1.09", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From bf3a9e0002e82cbaf9b289a4b8fea77c7d92e408 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 16:05:03 +0100 Subject: [PATCH 028/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 5 ++- apps/weatherClock/app.js | 13 +++++- apps/weatherClock/metadata.json | 12 ++++-- apps/weatherClock/weatherClock.settings.js | 49 ++++++++++++++++++++++ core | 2 +- 5 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 apps/weatherClock/weatherClock.settings.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index a6a12c297..e8b056999 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -1,5 +1,6 @@ 0.01: New App! 0.02: Minor layout format tweak so it uses less memory and draws ok on Bangle.js 1 (#1012) 0.03: Minor layout extra spaces. -0.04: Layout now compatible with Bangle.js 2 -0.05: Use weather condition code for icon selection +0.04: Layout now compatible with Bangle.js 2. +0.05: Use weather condition code for icon selection. +0.06: New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 91d0ab36f..fbdc39264 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -1,6 +1,8 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); +const SETTINGS_FILE = "weatherClock.json"; +let settings; // weather icons from https://icons8.com/icon/set/weather/color var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); @@ -18,6 +20,13 @@ var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmY // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.day = settings.day||true; + settings.date = settings.date||true; + settings.wind = settings.wind||true; +} + /** Choose weather icon to display based on condition. Based on function from the Bangle weather app so it should handle all of the conditions @@ -120,8 +129,8 @@ function queueDraw() { function draw() { var date = new Date(); clockLayout.time.label = locale.time(date, 1); - clockLayout.date.label = locale.date(date, 1).toUpperCase(); - clockLayout.dow.label = locale.dow(date, 1).toUpperCase() + " "; + clockLayout.date.label = (settings.date) ? locale.date(date, 1).toUpperCase() : ""; + clockLayout.dow.label = (settings.day) ? locale.dow(date, 1).toUpperCase() + " " : ""; var weatherJson = getWeather(); if(weatherJson && weatherJson.weather){ var currentWeather = weatherJson.weather; diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index cf8bd899e..38f3eccca 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -1,10 +1,12 @@ { "id": "weatherClock", "name": "Weather Clock", - "version": "0.05", + "shortName": "Weather Clock", + "version": "0.06", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", - "screenshots": [{"url":"screens/screen1.png"}], + "dependencies": {"weather":"app"}, + "screenshots": [{"url":"screens/screen1.png"}, {"url":"screens/screen2.png"}], "type": "clock", "tags": "clock, weather", "supports": ["BANGLEJS","BANGLEJS2"], @@ -12,6 +14,8 @@ "readme": "README.md", "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, - {"name":"weatherClock.img","url":"app-icon.js","evaluate":true} - ] + {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, + {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} + ], + "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js new file mode 100644 index 000000000..89b76adb5 --- /dev/null +++ b/apps/weatherClock/weatherClock.settings.js @@ -0,0 +1,49 @@ +(function(back) { + const SETTINGS_FILE = "weatherClock.json"; + + // initialize with default settings... + let s = { + 'day': true, + 'date': true, + 'wind': true + } + + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + let settings = storage.readJSON(SETTINGS_FILE, 1) || {} + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + + E.showMenu({ + '': { 'title': 'Show Day of Week': { + value: !!s.day, + onchange: v => { + s.day = v; + save(); + }, + }, + 'Show Date': { + value: !!s.date, + onchange: v => { + s.date = v; + save(); + }, + }, + 'Show Wind Speed': { + value: !!s.wind, + onchange: v => { + s.wind = v; + save(); + }, + } + }) +}) diff --git a/core b/core index 0d02ff376..23854083e 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 0d02ff3763783d166ff84906af038420736aabfc +Subproject commit 23854083e0c3f83c649073a2d85e8079efc471d3 From 79b733b963846f874c834ba1c52486c1569d3da5 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 10:06:52 -0500 Subject: [PATCH 029/183] not having web bluetooth to debug is a PAIN --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 13 ++++++++++++- apps/multidice/metadata.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ce7632d7c..ca48267be 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -9,3 +9,4 @@ 1.07: IDK how to use promises properly 1.08: still trying to fix the lack of vibrations 1.09: hopefully now it's fixed? +1.10: not having web bluetooth to debug is a PAIN diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 8f027c47a..98a43eef8 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -35,6 +35,9 @@ function touchHandler (button, xy) { return; } + rollDice(); + return; + if (xy.x <= 87) { // left if (xy.y <= 43) { @@ -122,6 +125,13 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } + + Bangle.on ('accel', voidFn); + console.log ("before"); + Bangle.buzz().then(()=>{ + Bangle.on ('accel', accelHandler); + }); + console.log ("after"); } function random (max) { @@ -134,7 +144,8 @@ function vibrate() { Bangle.on ('accel', voidFn); Bangle.buzz().then ((value) => { - Bangle.on ('accel', accelHandler) + console.log ("I ran."); + Bangle.on ('accel', accelHandler); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 95071c67b..37adcac91 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.09", + "version":"1.10", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 4680ad77098f6159f83d65f6163d04e966f28405 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 16:19:10 +0100 Subject: [PATCH 030/183] weatherclock v0.06 --- apps/weatherClock/weatherClock.settings.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js index 89b76adb5..658630696 100644 --- a/apps/weatherClock/weatherClock.settings.js +++ b/apps/weatherClock/weatherClock.settings.js @@ -22,9 +22,10 @@ storage.write(SETTINGS_FILE, settings) } - E.showMenu({ - '': { 'title': 'Show Day of Week': { + '': { 'title': 'Weather Clock' }, + '< Back': back, + 'Show DoW': { value: !!s.day, onchange: v => { s.day = v; @@ -38,7 +39,7 @@ save(); }, }, - 'Show Wind Speed': { + 'Show Wind': { value: !!s.wind, onchange: v => { s.wind = v; From bd9ac4fc33856abc1c18a5683ea5e4ee3e779feb Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 10:20:26 -0500 Subject: [PATCH 031/183] decreased vibration time, decreased accel requirement --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 12 +++--------- apps/multidice/metadata.json | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ca48267be..68ada4870 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -10,3 +10,4 @@ 1.08: still trying to fix the lack of vibrations 1.09: hopefully now it's fixed? 1.10: not having web bluetooth to debug is a PAIN +1.11: decreased vibration time, decreased accel requirement diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 98a43eef8..5469b495b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -84,7 +84,7 @@ function touchHandler (button, xy) { function accelHandler (xyz) { - if (xyz.diff >= 0.4) { + if (xyz.diff >= 0.3) { menu = false; rollDice(); @@ -126,12 +126,7 @@ function rollDice() { } } - Bangle.on ('accel', voidFn); - console.log ("before"); - Bangle.buzz().then(()=>{ - Bangle.on ('accel', accelHandler); - }); - console.log ("after"); + vibrate(); } function random (max) { @@ -142,9 +137,8 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz().then ((value) => { + Bangle.buzz(50, 1).then ((value) => { - console.log ("I ran."); Bangle.on ('accel', accelHandler); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 37adcac91..ca5ec991f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.10", + "version":"1.11", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 9db41919f80e6c2b7150bb73f940aa0f4d39796c Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 18:11:13 +0100 Subject: [PATCH 032/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index e8b056999..ffaf87d1e 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: New settings to (un)hide day of week, date and wind speed. +0.06: Dev-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index fbdc39264..914b0b041 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -156,6 +156,8 @@ function draw() { queueDraw(); } +loadSettings(); + g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); From b9559280f973a430c1b2b088f7559ae9bafd099b Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:17:09 -0500 Subject: [PATCH 033/183] issue with app calling roll function too many times at startup --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 68ada4870..29da3bf24 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -11,3 +11,4 @@ 1.09: hopefully now it's fixed? 1.10: not having web bluetooth to debug is a PAIN 1.11: decreased vibration time, decreased accel requirement +1.12: issue with app calling roll function too many times at startup diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 5469b495b..6295c7a9b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -137,7 +137,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz(50, 1).then ((value) => { + Bangle.buzz(50, 0.5).then ((value) => { Bangle.on ('accel', accelHandler); }); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ca5ec991f..177b8a32a 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.11", + "version":"1.12", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From a41402607462fc9545ce212d9c52d0405e779160 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 18:23:28 +0100 Subject: [PATCH 034/183] weatherclock v0.06 --- apps/weatherClock/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 914b0b041..1fc5f5de5 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -22,9 +22,9 @@ var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqg function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; - settings.day = settings.day||true; - settings.date = settings.date||true; - settings.wind = settings.wind||true; + settings.day = (settings.day === undefined ? true : settings.day); + settings.date = (settings.date === undefined ? true : settings.date); + settings.wind = (settings.wind === undefined ? true : settings.wind); } /** From 5d399688910171e05d351b7f3afb9f56c0102a76 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:27:24 -0500 Subject: [PATCH 035/183] added a delay after the buzzer stops to prevent multi-rolling --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 18 ++++++++---------- apps/multidice/metadata.json | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 29da3bf24..7eb5f605c 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -12,3 +12,4 @@ 1.10: not having web bluetooth to debug is a PAIN 1.11: decreased vibration time, decreased accel requirement 1.12: issue with app calling roll function too many times at startup +1.13: added a delay after the buzzer stops to prevent multi-rolling diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 6295c7a9b..0d4b57a6c 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -126,7 +126,14 @@ function rollDice() { } } - vibrate(); + Bangle.on ('accel', voidFn); + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (function() { // wait 50ms *after* the buzzing has stopped + + Bangle.on ('accel', accelHandler); + }, 50); + }); } function random (max) { @@ -134,15 +141,6 @@ function random (max) { return Math.round (Math.random() * (max - 1) + 1); } -function vibrate() { - - Bangle.on ('accel', voidFn); - Bangle.buzz(50, 0.5).then ((value) => { - - Bangle.on ('accel', accelHandler); - }); -} - drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', accelHandler); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 177b8a32a..a6cbf46b9 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.12", + "version":"1.13", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From f85c17814cbe1cf2bb748615975c4925d8b60dec Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:35:36 -0500 Subject: [PATCH 036/183] made the delay needlessly long to see if it even does anything --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 7eb5f605c..d8a684575 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -13,3 +13,4 @@ 1.11: decreased vibration time, decreased accel requirement 1.12: issue with app calling roll function too many times at startup 1.13: added a delay after the buzzer stops to prevent multi-rolling +1.14: made the delay needlessly long to see if it even does anything diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 0d4b57a6c..271b7bad3 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function rollDice() { setTimeout (function() { // wait 50ms *after* the buzzing has stopped Bangle.on ('accel', accelHandler); - }, 50); + }, 1000); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index a6cbf46b9..2bcf4d2eb 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.13", + "version":"1.14", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 6cd3c02253a2916d6388c9ea95a883af8c8a2b71 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 18:43:59 +0100 Subject: [PATCH 037/183] fork bwclklite from bwclk --- apps/bwclklite/ChangeLog | 33 +++ apps/bwclklite/README.md | 27 +++ apps/bwclklite/app-icon.js | 1 + apps/bwclklite/app.js | 376 ++++++++++++++++++++++++++++++++ apps/bwclklite/app.png | Bin 0 -> 2116 bytes apps/bwclklite/metadata.json | 19 ++ apps/bwclklite/screenshot.png | Bin 0 -> 2841 bytes apps/bwclklite/screenshot_2.png | Bin 0 -> 3038 bytes apps/bwclklite/screenshot_3.png | Bin 0 -> 3031 bytes apps/bwclklite/settings.js | 50 +++++ 10 files changed, 506 insertions(+) create mode 100644 apps/bwclklite/ChangeLog create mode 100644 apps/bwclklite/README.md create mode 100644 apps/bwclklite/app-icon.js create mode 100644 apps/bwclklite/app.js create mode 100644 apps/bwclklite/app.png create mode 100644 apps/bwclklite/metadata.json create mode 100644 apps/bwclklite/screenshot.png create mode 100644 apps/bwclklite/screenshot_2.png create mode 100644 apps/bwclklite/screenshot_3.png create mode 100644 apps/bwclklite/settings.js diff --git a/apps/bwclklite/ChangeLog b/apps/bwclklite/ChangeLog new file mode 100644 index 000000000..06f94854e --- /dev/null +++ b/apps/bwclklite/ChangeLog @@ -0,0 +1,33 @@ +0.01: New App. +0.02: Use build in function for steps and other improvements. +0.03: Adapt colors based on the theme of the user. +0.04: Steps can be hidden now such that the time is even larger. +0.05: Included icons for information. +0.06: Design and usability improvements. +0.07: Improved positioning. +0.08: Select the color of widgets correctly. Additional settings to hide colon. +0.09: Larger font size if colon is hidden to improve readability further. +0.10: HomeAssistant integration if HomeAssistant is installed. +0.11: Performance improvements. +0.12: Implements a 2D menu. +0.13: Clicks < 24px are for widgets, if fullscreen mode is disabled. +0.14: Adds humidity to weather data. +0.15: Added option for a dynamic mode to show widgets only if unlocked. +0.16: You can now show your agenda if your calendar is synced with Gadgetbridge. +0.17: Fix - Step count was no more shown in the menu. +0.18: Set timer for an agenda entry by simply clicking in the middle of the screen. Only one timer can be set. +0.19: Fix - Compatibility with "Digital clock widget" +0.20: Better handling of async data such as getPressure. +0.21: On the default menu the week of year can be shown. +0.22: Use the new clkinfo module for the menu. +0.23: Feedback of apps after run is now optional and decided by the corresponding clkinfo. +0.24: Update clock_info to avoid a redraw +0.25: Use Bangle.setUI({remove:...}) to allow loading the launcher without a full reset on fw2v16. + ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc. +0.26: Use clkinfo.addInteractive instead of a custom implementation +0.27: Clean out some leftovers in the remove function after switching to +clkinfo.addInteractive that would cause ReferenceError. +0.28: Option to show (1) time only and (2) week of year. +0.29: use setItem of clockInfoMenu to change the active item +0.30: Use widget_utils +0.31: Use clock_info module as an app diff --git a/apps/bwclklite/README.md b/apps/bwclklite/README.md new file mode 100644 index 000000000..882d525f6 --- /dev/null +++ b/apps/bwclklite/README.md @@ -0,0 +1,27 @@ +# BW Clock +A very minimalistic clock. + +![](screenshot.png) + +## Features +The BW clock implements features that are exposed by other apps through the `clkinfo` module. +For example, if you install the HomeAssistant app, this menu item will be shown if you first +touch the bottom of the screen and then swipe left/right to the home assistant menu. To select +sub-items simply swipe up/down. To run an action (e.g. trigger home assistant), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: + +![](screenshot_3.png) + +Note: Check out the settings to change different themes. + +## Settings +- Screen: Normal (widgets shown), Dynamic (widgets shown if unlocked) or Full (widgets are hidden). +- Enable/disable lock icon in the settings. Useful if fullscreen mode is on. +- The colon (e.g. 7:35 = 735) can be hidden in the settings for an even larger time font to improve readability further. +- Your bangle uses the sys color settings so you can change the color too. + +## Thanks to +- Thanks to Gordon Williams not only for the great BangleJs, but specifically also for the implementation of `clkinfo` which simplified the BWClock a lot and moved complexety to the apps where it should be located. +- Icons created by Flaticon + +## Creator +[David Peer](https://github.com/peerdavid) diff --git a/apps/bwclklite/app-icon.js b/apps/bwclklite/app-icon.js new file mode 100644 index 000000000..1df0fa6a5 --- /dev/null +++ b/apps/bwclklite/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIcah0EgEB/H8iFsAoOY4kMBYMDhmGgXkAoUGiWkAoQQBoAFCjgnCAoM4hgFDuEI+wpC8EKyg1C/0eAoMAsEAiQvBAAeAApQAB/4Ao+P4v/wn0P8Pgn/wnkH4Pjv/j/nn9PH//n/nj/IFF4F88AXBAoM88EcAoPHj//jlDAoOf/+Y+YFHjnnjAjBEIIjD+BHDO9IALA==")) diff --git a/apps/bwclklite/app.js b/apps/bwclklite/app.js new file mode 100644 index 000000000..770c053c2 --- /dev/null +++ b/apps/bwclklite/app.js @@ -0,0 +1,376 @@ +{ // must be inside our own scope here so that when we are unloaded everything disappears + +/************************************************ + * Includes + */ +const locale = require('locale'); +const storage = require('Storage'); +const clock_info = require("clock_info"); +const widget_utils = require("widget_utils"); + +/************************************************ + * Globals + */ +const SETTINGS_FILE = "bwclk.setting.json"; +const W = g.getWidth(); +const H = g.getHeight(); + +/************************************************ + * Settings + */ +let settings = { + screen: "Normal", + showLock: true, + hideColon: false, + menuPosX: 0, + menuPosY: 0, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key]; +} + +let isFullscreen = function() { + var s = settings.screen.toLowerCase(); + if(s == "dynamic"){ + return Bangle.isLocked(); + } else { + return s == "full"; + } +}; + +let getLineY = function(){ + return H/5*2 + (isFullscreen() ? 0 : 8); +} + +/************************************************ + * Assets + */ +// Manrope font +Graphics.prototype.setLargeFont = function(scale) { + // Actual height 47 (48 - 2) + this.setFontCustom( + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAD/AAAAAAAAP/wAAAAAAAf/8AAAAAAB///AAAAAAH///wAAAAAf///8AAAAB/////AAAAH////8AAAAP////wAAAA/////AAAAB////+AAAAA////4AAAAAP///gAAAAAD//+AAAAAAA//4AAAAAAAP/gAAAAAAAD/AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAB////8AAAAB/////wAAAA/////+AAAA//////wAAAf/////+AAAH//////wAAD//////+AAB/+AAAf/gAAf+AAAA/8AAH/AAAAH/AAD/gAAAA/4AA/wAAAAH+AAP8AAAAB/gAD+AAAAAf4AA/gAAAAH+AAP4AAAAA/gAD+AAAAAf4AA/wAAAAH+AAP8AAAAB/gAD/AAAAA/4AA/4AAAAP+AAH/AAAAH/AAB/4AAAH/wAAP/wAAP/4AAD//////+AAAf//////AAAD//////gAAAf/////wAAAD/////4AAAAf////4AAAAB////4AAAAAB///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAH/AAAAAAAAD/gAAAAAAAA/4AAAAAAAAf8AAAAAAAAH+AAAAAAAAD/gAAAAAAAB/wAAAAAAAAf8AAAAAAAAP///////AAD///////wAA///////8AAP///////AAD///////wAA///////8AAP///////AAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAB/AAAA/gAAA/wAAA/4AAAf8AAAf+AAAP/AAAP/gAAH/wAAH/4AAD/8AAD/+AAB//AAA//gAA//wAAf/AAAP/8AAH/AAAH//AAD/gAAD//wAA/wAAB//8AAP8AAA///AAD/AAAf+fwAA/gAAP/n8AAP4AAH/x/AAD+AAD/4fwAA/gAB/8H8AAP8AAf+B/AAD/AAP/AfwAA/4AH/gH8AAH/AH/wB/AAB/8H/4AfwAAP///8AH8AAD////AB/AAAf///gAfwAAD///wAH8AAAf//4AB/AAAD//4AAfwAAAP/8AAH8AAAAf4AAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAADgAAAfwAAAB+AAAH8AAAAfwAAB/AAAAH+AAAfwAAAB/wAAH8AAAA/+AAB/AAAAP/gAAfwA4AA/8AAH8AfgAH/AAB/AP8AA/4AAfwD/gAH+AAH8B/4AB/gAB/A/8AAf4AAfwf/AAD+AAH8P/wAA/gAB/H/8AAf4AAfz//gAH+AAH8//4AB/gAB/f//AA/4AAf/+/4Af8AAH//P/AP/AAB//j////gAAf/wf///4AAH/4H///8AAB/8A///+AAAf+AH///AAAH/AA///gAAB/gAD//wAAAfwAAP/wAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAH/wAAAAAAAH/8AAAAAAAH//AAAAAAAH//wAAAAAAH//8AAAAAAH///AAAAAAH///wAAAAAH///8AAAAAP//9/AAAAAP//8fwAAAAP//4H8AAAAP//4B/AAAAP//4AfwAAAP//4AH8AAAD//4AB/AAAA//4AAfwAAAP/4AAH8AAAD/wAAB/AAAA/wAAAfwAAAPwAH////AADwAB////wAAwAAf///8AAAAAH////AAAAAB////wAAAAAf///8AAAAAH////AAAAAA////wAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAGAHwAAAB///gB+AAAH///8AfwAAB////AP+AAAf///wD/wAAH///+A/+AAB////gP/gAAf///4A/8AAH/8P8AH/AAB/AD+AA/4AAfwA/gAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/AAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/gAH+AAH8Af4AB/gAB/AH/AA/wAAfwB/4Af8AAH8AP/AP/AAB/AD////gAAfwAf///wAAH8AD///8AAB/AA///+AAAfwAH///AAAAAAA///gAAAAAAD//gAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///4AAAAAH////wAAAAH/////AAAAD/////4AAAB//////AAAA//////4AAAf//////AAAP//////4AAD/8D/w/+AAB/4B/wD/wAAf8A/wAf8AAP+AP4AD/gAD/AD+AAf4AA/wB/AAH+AAP4AfwAB/gAD+AH8AAf4AA/gB/AAH+AAP4AfwAB/gAD+AH+AAf4AA/wB/gAH+AAP8Af8AD/gAD/gH/gB/wAAf8A/8A/8AAH/AP///+AAB/gB////gAAPwAP///wAAB4AD///4AAAMAAf//8AAAAAAD//+AAAAAAAP/+AAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAABwAAfwAAAAB8AAH8AAAAD/AAB/AAAAD/wAAfwAAAH/8AAH8AAAH//AAB/AAAP//wAAfwAAP//8AAH8AAf//+AAB/AAf//8AAAfwA///8AAAH8A///4AAAB/A///4AAAAfx///wAAAAH9///wAAAAB////gAAAAAf///gAAAAAH///AAAAAAB///AAAAAAAf/+AAAAAAAH/+AAAAAAAB/8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAf/AAAAAP+Af/8AAAAP/4P//wAAAP//P//+AAAH//////wAAB//////8AAA///////gAAf//////8AAH////gP/AAD/wf/wA/wAA/4D/4AP+AAP8Af8AB/gAD/AH/AAf4AA/gA/wAH+AAP4AP4AA/gAD+AD/AAP4AA/gA/wAH+AAP8Af8AB/gAD/AH/AAf4AA/4D/4AP+AAP/B//AH/AAB////4D/wAAf//////8AAD//////+AAAf//////AAAH//////wAAA//8///4AAAD/+D//8AAAAP+Af/8AAAAAAAB/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAB//AAAAAAAB//8AAAAAAB///gAAgAAA///8AAcAAAf///gAPAAAH///8AH4AAD////AD/AAB/+H/4B/wAAf+Af+Af8AAP+AB/wD/gAD/gAf8Af4AA/wAD/AH+AAP8AA/wB/gAD+AAH8AP4AA/gAB/AD+AAP4AAfwB/gAD+AAH8Af4AA/wAD/AH+AAP8AA/gD/gAD/gAf4A/wAAf8AP8A/8AAH/gH/Af/AAA///////gAAP//////wAAB//////8AAAP/////+AAAB//////AAAAP/////AAAAA/////gAAAAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='), + 46, + atob("ExspGyUkJiQnISYnFQ=="), + 62+(scale<<8)+(1<<16) + ); + return this; +}; + +Graphics.prototype.setMediumFont = function(scale) { + // Actual height 41 (42 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); + return this; +}; + +Graphics.prototype.setSmallFont = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom( + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+cB//5wH//nAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAQcAADhwAAOHBAA4c8ADh/wAP/+AB/+AA//wAH+HAAe4cMBDh/wAOP/AA//wAP/wAH/3AAf4cABzhwAAOHAAA4cAADgAAAOAAAAAAAAAAAAAAAAAAAAwAH8HwA/4PgD/geAePA8BwcBw/BwH78DgfvwOB+HA4HAeBwcA8HDgB4f+ADg/wAGB+AAAAAAAAAAAAAAAH4AAA/wBwHngPAcOB4Bw4PAHDh4AcOPAA/x4AD/PAADx4AAAPAAAB5wAAPPwAB5/gAPOPAB4wcAPDBwB4MHAPA4cA4B/gBAH8AAAHAAAAAAAAAAAAAPAAHD/AB/f+AP/x4B4+DwHB4HAcDwcBwHhwHAPHAcAccB4A5wDgB+AGA/4AAH/AAAf+AAAA8AAABgAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAHAAAAcwAAA/gAAb8AAB/gAAH+AAAD+AAAOwAABxAAADAAAAAAAAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAB//AAH/8AAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAABwAAAHIAAAfgAAB8AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAA/wAA//AA//AA//AAH/AAAfAAABAAAAAAAAAAAAAAAAAAAf/wAH//wA///gDgAOAcAAcBwABwHAAHAcAAcBwABwHgAPAPAB4Af//AA//4AA/+AAAAAAAAAAAAAAAAMAAABwAAAOAAAB4AAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAAwAcAPADwB8AfAPAB8B4APwHAB/AcAPcBwB5wHAPHAcB4cA8PBwD/4HAH/AcAHwBwAAAAAAAAAAAAGAHAAcAcAB4BwYDwHDwHAceAcBz4BwHfgHAf3AcB+eDwHw/+AeB/wBwD+AAAAAAAAAAAAAAAAABwAAAfAAAP8AAD/wAA/nAAP4cAD+BwAfgHAB4AcAEA//AAD/8AAP/wAABwAAAHAAAAMAAAAAAAAAAAAAEAH/w4Af/D4B/8HgHDgPAcOAcBw4BwHDgHAcOAcBw8DwHB4eAcH/wBgP+AAAPwAAAAAAAAAAAAAAAB//AAf//AD//+AOHB4Bw4BwHDgHAcOAcBw4BwHDgHAcPA8A4eHgDh/8AEB/gAAD4AAAAAAAAAABwAAAHAAAAcAAMBwADwHAB/AcA/4BwP8AHH/AAd/gAB/wAAH8AAAeAAAAAAAAAAAAAAAEAAPD+AB/f8AP//4B4+DwHDwHAcHAcBwcBwHBwHAcPAcB/+DgD//+AH5/wACB8AAAAAAAAAAAAAAAAEAAAD+AAAf+DAD74OAODw8BwHBwHAOHAcA4cBwDBwHAcHAeBw8A+ePgB//8AD//gAB/wAAAAAAAAAAAAAAAAAAAAAHBwAAcHAABwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AcgDgB+AOAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAeAAAD8AAAf4AADzwAAeHgADwPAAGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAOAcAA8DgAB4cAABzgAAD8AAAHgAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAHgAAA+AAAHgAAAcAAABwD5wHAfnAcD8cBweAAHzwAAP+AAAfwAAAcAAAAAAAAAAAAAAAAAAB/AAA//AAH/+AA8A8AHAA4A4ABwDg+HAcH8OBw444GDBhgYMGGBgwYYHDjjgcP8OBw/44DgDhAOAGAAeAYAA+HgAB/8AAB/gAAAAAAAAAAAAABAAAA8AAAfwAAP/AAH/gAD/4AB/zgAf4OAB8A4AHwDgAf4OAA/84AAP/gAAH/AAAD/gAAB/AAAA8AAAAQAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBweBwHj4HAP/58Afz/gAcH8AAAPAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB8B8ADwHgADAYAAAAAAAAAAAAAAAH///Af//8B///wHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAeAA8A8AHgB8B+AD//gAH/8AAD/AAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOAAHA4AAcDgABwOAAHA4AAcDgABwOAAHAAAAcAAAAAAAAAP/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwGBwHgYPAOBg4A+GPgB4f8ADh/gAAH4AAAAAAAAAAAAAAAH///Af//8B///wAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAeAAAA8AAABwAAAHAAAAcAAABwH///Af//4B///AAAAAAAAAAAAAAAAAAAAf//8B///wH///AAHgAAA/AAAH+AAA88AAHh8AA8D4AHgDwA8AHgHgAPAYAAcBAAAwAAABAAAAAAAAAAH///Af//8B///wAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAAAAAAAAAAAAH///Af//8B///wB/AAAB/AAAA/AAAA/gAAA/gAAA/gAAA/AAAD8AAA/AAAfwAAH8AAB/AAAfgAAP4AAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wD8AAAD4AAAH4AAAHwAAAPwAAAPgAAAPgAAAfAAAAfAAAA/Af//8B///wH///AAAAAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAH///Af//8B///wHAOAAcA4ABwDgAHAOAAcA4ABwDgAHAeAAeBwAA+fAAD/4AAD/AAADgAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAnAcAHcA4AfgDwA+AH4P4AP//wAf/3AAP4AAAAAAAAAAAf//8B///wH///AcA4ABwDgAHAOAAcA4ABwDgAHAOAAcB+AB4H+AD59/AP/h8AP8BwAOABAAAAAAAAAAAAAwAD4HwA/4fAD/geAePA8BwcBwHBwHAcDgcBwOBwHA4HAcDgcA4HDwD4eeAHw/4AOD/AAIDwAAAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAH///Af//8B///wHAAAAcAAABwAAAHAAAAcAAABwAAAGAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAGAAAAfAAAB/gAAB/wAAA/4AAAf8AAAP/AAAH8AAADwAAA/AAAf8AAP+AAP/AAH/gAB/wAAH4AAAcAAABAAAAHwAAAf4AAA/+AAAP/gAAH/wAAB/wAAA/AAAf8AAf/AAP/gAP/gAB/gAAH4AAAf+AAAf/AAAH/wAAB/8AAAfwAAB/AAB/8AA/+AA/+AAf+AAB/AAAHAAAAAAAAAAAAQGAADAeAA8B8AHwD8B+AD4PgAH74AAH/AAAPwAAA/gAAP/gAD8fAAfA/AH4A+AeAA8BwABwEAABAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAABAcAAcBwADwHAA/AcAP8BwD/wHAfnAcH4cBx+BwHPwHAf8AcB/ABwH4AHAeAAcBgABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAAeAAAB/gAAH/4AAB/+AAAf/gAAH/AAAB8AAAAQAAAAAAAAAAAAAAOAAAA4AAADgAAAP/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xwAOGHAA44MADjgwAOOHAA44YADjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wH//+AAcA4ADgBwAOAHAA4AcADgBwAOAHAA8A8AB8PgAD/8AAH/gAAH4AAAAAAAAAAAAH4AAB/4AAP/wAB4HgAPAPAA4AcADgBwAOAHAA4AcADgBwAPAPAAeB4AA4HAABgYAAAAAAAAAAAAfgAAH/gAB//gAHgeAA8A8ADgBwAOAHAA4AcADgBwAOAHAAcA4B///wH///Af//8AAAAAAAAAAAAAAAAH4AAB/4AAP/wAB7HgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAwAAAAAAAAAAAAwAAADAAAB///AP//8B///wHMAAAYwAABjAAAGMAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAB///wH///AAf/8ABwAAAOAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAAAAAc//8Bz//wHP//AAAAAAAAAAAAAAHAAAAcAAAH+f///5///7H//8AAAAAAAAAAAAAAH///Af//8B///wAAPAAAB+AAAP8AAB54AAfDwAD4HgAOAPAAwAcACAAwAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAAD4AAAH//AAP/8AB//wAHAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAADgAAAPAAAAf/8AA//wAB//AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAeB4ADwDwAOAHAA4AcADgBwAOAHAA4AcADwDwAHw+AAP/wAAf+AAAfgAAAAAAAAAAAAAAAB///8H///wP///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAD//wAP//AAf/8ABwAAAOAAAA4AAADgAAAOAAAAAAAAAYGAAD4cAAfx4AD3DwAOOHAA44cADjhwAOGHAA4ccADxzwAHj+AAOP4AAYOAAAAAAAwAAADAAAAMAAAP//wA///gD///AAwAcADABwAMAHAAwAcADAAwAAAAAAAAAAD/gAAP/4AA//4AAA/gAAAPAAAAcAAABwAAAHAAAAcAAABwAAAOAA//8AD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAH+AAAH/AAAD/gAAB/AAAB8AAA/wAAf8AAP+AAD/AAAPgAAAwAAAAAAAAIAAAA8AAAD/AAAH/gAAD/wAAA/wAAA/AAAf8AAP+AAP+AAA/AAAD+AAAH/AAAD/gAAA/wAAA/AAAf8AAP/AAP/AAA/gAADgAAAAAAAAAAEADAAwAOAHAA+B8AB8PgAB74AAD/AAAH4AAA/wAAHvgAB8PgAPgfAA4AcADAAwAAABABAAAAHAAAAfgAAA/wAAA/wAwAf4fAAP/8AAP/AAB/gAA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAEADAAwAOAPAA4B8ADgPwAOD/AA4ecADnxwAO8HAA/gcAD8BwAPAHAA4AcACAAwAAAAAAAAAAAAAAAAAAAAAAAAAA8AB////f//////n/+AAAA4AAADgAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////z////AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHwAAAcAAABwAAAHgAAAOAAAA8AAABwAAAHAAAB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn//gOf/+A5//4AAAAAAAAAAAAAAAAAAAD/AAA//AAH/+AA+B8ADgBwAOAHAHwAPgfAA+B8AD4A4AcADwDwAHgeAAOBwAAQCAAAAAAAAAAAADgcAAOBwAA4HAD//8A///wD///AeDgcBwOBwHA4HAcDgcB4GBwD4AHAHgAcAOAAAAAAAAAAAAAMAGAB7+8AD//gAHx8AAcBwADgDgAOAOAA4A4ADgDgAOAOAA4A4ABwHAAHg8AA//4AH//wAMOGAAAAAAQAAABwAAAHwMYAPwxgAfjGAAfsYAAf7gAAf/wAB//AAf/8AH7GAA/MYAPwxgB8DGAHAAAAQAAAAAAAAAAAAAf/D/5/8P/n/w/+AAAAAAAAAAAAAAAAAAAABwAAffhwD//Hgf+cfBzwwcGHDhwYcOHBxw4cHDhxwfOPvA8//4Bx//AADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAP/wAB//gAPAPAB4AOAPDw8A4/xwHH/jgc4HOBzgc4HMAzgcwDOBzgc4HPDjgOcOeA4whwBwAOAHwD4APw/AAf/4AAf+AAAPAAAAAAAATgAAD/AAANsAAA2wAADTAAAP8AAAfwAAAAAAAAAAAAAAAAAAgAAAPAAAB+AAAOeAADw8AAOIwAADxAAAfgAADngAA8PAADgMAAEAQAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAB+AAAH4AAAAAAAAAAAAAAAAAAAAD8AAA/8AAHh4AAYDgAD/3AAN/MAA0QwADRjAAN/MAA7hwABwOAADhwAAH+AAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAD/AAAeeAABw4AAGDgAAYOAABw4AAH/AAAP8AAAfAAAAAAAAAAAAAAAAAAAwYAADBgAAMGAAAwYAADBgAAMGAAP+YAA/5gAD/mAAAwYAADBgAAMGAAAwYAADBgAAAAAAAAAAAAAAAMDAABwcAAPDwAAwPAADB8AAMOwAA5zAAB+MAADwwAAAAAAAAAAAIBAAAwGAADMcAANwwAA/DAAD8MAAO/wAAx+AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///B///8H//AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAAAAAAP4AAB/4AAP/gAB//AAH/8AAf/wAB//AAH///8f///x////AAAAAAAAAB////H///8f///wAAAAAAAAAAAAAAABAAAAOAAAB4AAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzAAAPMAAA/wAAAeAAAAAAAAAAAAAAAAAAAIAAABgAAAMAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAA8AAAP4AAAwwAADDAAAMMAAA5wAAB+AAADwAAAAAAAAAAAAAAAAAMAwAA8HAAB44AAD/AAAD4AADGMAAOBwAAeOAAA/wAAA+AAABgAAAAAAAAAAAAAAABAAAAMAAABwAAAH/8CAf/wcAAAHgAAA8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgCAA8A8APAfwB4H7AHB+MAAHAwAAQ/wAAD/AAAAwAAADAAAAAAAAAAAAAAAAAAAAEAAAAwAAAHAAAAf/wIB//BwAAAeAAADwAAAeAAAHgAAA8AAAHgAAB4AAAPAAAD4AAAeAAADwAAA8GAwHg4HAcHA8AAYHwABg7AAGHMAAf4wAA/DAAA4MAAAAAAAAAAYBgABgHAAGMOAAZwYABvBgAH8OCAe/wcBx+HgABg8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgHAA8B8APAfwB4HzADB8MAAHAwAAQ/wAAD/AAAAwAAAAAAAAAAAAAAAAAA4AAAP4AAB/wAAPHgABwOA4/A4Dn4DgOfAOAAAA4AAAHgAAB8AAAHgAAAYAAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAAAAAABwAAA/AAAf8AAP/AAH/wfD/nD+/wcMb4BwxvgHD+/wcHx/5wEAf/AAAP+AAAH/AAAD8AAABwAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAcAOABwA4AHADgAf//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAYAAMAAAAAAAAAAA/4AAP/4AD//4APAHgB4APAPAAeA4AA4DgADg+AAPz4AA//gAD/+AAOe4AA4BwAHAHgA8APgPgAeA8AAYDAAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcAAcBwABwAAAAAAAAAAAAAAH///Af//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwABwHAAHAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAABgAAAGAAH///Af//8B///wHAYHAcBgcBwGBwHAYHAcBgcBwABwHAAHAeAA8A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAAAAAf//8B///wH///APwAAAPgAAAfgAAAfAAAA/AAAA+AAAA+AAAB8AAAB8AAAD8B///wH///Af//8AAAAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAB/wAAf/wAH//wAeAPADwAeAeAA8BwABwHAAHAcAAcBwABwHAAHAcAAcBwABwDgAOAPAB4Afg/AA//4AB//AAA/gAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAGDgAA8eAAB7wAAD+AAAHwAAAfAAAD+AAAe8AADw4AAGBAAAAAAAAAAAAAAAAAf8MAH//4B///AHgD4A8AfgHgD/AcAecBwDxwHAeHAcDwcBw+BwHHgHAc8AcA/gDgD8AeAH4PwA//+AH//wAMP4AAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4Af//wAAAHgAAAPAAAAcAAABwAAAHAAAAcAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAAAAf//8B///wH///ABwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHg8AAP/gAAf8AAA/gAAAAAAAAAAAAAAAA///AP//8A///wHgAAAcAAcBwABwHBwHAcHAcB4+BwD/4PAH954APn/gAAP8AAAOAAAAAAAAAAAAAD4AAcfwADz/gAfOOCBww4PHHBg+ccGAZxw4AHHDAAcYcAA//gAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPP+AB844AHDDgAccGAZxwYPnHDg8ccMDBxhwAD/+AAP/+AAP/4AAAAAAAAAAAAAAAAA+AAHH8AA8/4BnzjgOcMOBxxwYOHHBg4ccOBxxwwDnGHAGP/4AA//4AA//gAAAAAAAAAAAAAAAAHwAA4/gAHn/A8+ccDzhhwMOODA444MBjjhwHOOGAM4w4Dx//AOH//AAH/8AAAAAAAAAAAAAAAAAfAADj+AAef8Bz5xwHOGHAc44MADjgwAOOHAY44YBzjDgHH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xweOGHD844MMzjgwzOOHD844YHjjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAHwAAx/gAHn/AAc4cADjhwAOMDAA4wcADjBwAOMHAA4w4AB//AAH/4AAP/wAB/fgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAAAAAAAAAA/AAAP/AAB/+AAPA8AB4B4AHADgwcAPzBwA/8HADngcAOMB4B4ADwPAAHA4AAMDAAAAAAAAAAAAA/AAAP/AAB/+AAPY8AB5h4OHGDg+cYOB5xg4AnGDgAcYOAB5h4AD+PAAH44AAPjAAAGAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgOcYOD5xg4OHGDggeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAAAD8AAA/8AAH/4AY9jwDnmHgecYODhxg4OHGDg8cYOB5xg4BnmHgCP48AAfjgAA+MAAAYAAAAAAAAAAAAB+AAAf+AAD/8Acex4BzzDwHOMHAA4wcADjBwAOMHAc4wcBzzDwGH8eAAPxwAAfGAAAMAAAAAAAAAAAOAAAA+f/+A5//4An//gAAAAAAAAAAAAAAAAAAAJ//4Dn//g+f/+DgAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAHAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/AAB//AAPA8AA4A4DDgDgPMAOA/wA4D7ADgPOAOB+8B4C/+/AA//4AB//AAAHAAAAAAAAAAAAP//AA//8Bx//wPHAAAw4AADjgAAGOAAAc4AAAzgAAPPAAA4f/8AA//wAB//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAPA8CB4B4OHADg+cAOA5wA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AnADgecAOD5wA4OHADgAeAeAA+HwAB/+AAD/wAAD8AAAAAAAAAAAAD8AAA/8AAH/4AY8DwDngHgecAODhwA4OHADg8cAOB5wA4BngHgCPh8AAf/gAA/8AAA/AAAAAAAAAAAAB+AAAf+AAD/8AceB4DzwDwMOAHA44AcBjgBwHOAHAM4AcDzwDwOHw+AAP/wAAf+AAAfgAAAAAAAAAAAAfgAAH/gAA//AHHgeAc8A8BzgBwAOAHAA4AcADgBwHOAHAc8A8Bh8PgAD/8AAH/gAAH4AAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAA7cAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5gAB//AAP/4AB4PgAPB/AA4PcADh5wAOPHAA54cADvBwAP4PAAfD4AB//AAP/4AAZ+AAAAAAAAAAAAf8AAB//AAH//AAAH8AAAB4OAADg+AAOB4AA4AgADgAAAOAAABwAH//gAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4BgADgeAAOD4AA4MAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AYAfwDgAHgcAAODgAA4OAADg8AAOB4AA4BgAHACf/+AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AcAP4BwADwHAAHAAAAcAAABwAAAHAcAAcBwADgGP//AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAA/wAAA/wAAAf4cAAP/zgAP/+AB/jgA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAAAAAAA//////////////A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAABAAAAHAAAAfgAAw/wADg/wA+Af4fAAP/8AAP/AAB/g4A/wDgf4AOP+AAB/AAAHgAAAQAAA=='), + 32, + atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), + 28+(scale<<8)+(1<<16) + ); + return this; +}; + +Graphics.prototype.setMiniFont = function(scale) { + // Actual height 16 (15 - 0) + this.setFontCustom( + atob('AAAAAAAAAAAAAP+w/5AAAAAA4ADgAOAA4AAAAAAAAAABgBmAGbAb8D+A+YDZ8B/wf4D5gJmAGQAQAAAAAAAeOD8cMwzxj/GPMYwc/Az4AAAAAHAA+DDIYMjA+YBzAAYADeA7MHMw4zDD4ADAAAAz4H/wzjDHMMMwwbBj4APgADAAAAAA4ADgAAAAAAAAAAfwH/54B+ABAAAAAOABeAcf/gfwAAAAACAAaAD4APgAOABgAAAAAAACAAIAAgA/wAMAAgACAAAAAAAAPAA4AAAAAAIAAgACAAIAAgAAAAAAADAAMAAAAAAAcAfwf4D4AIAAAAA/wH/gwDDAMMAwwDB/4D/AAAAAAGAAwAD/8P/wAAAAAHAw8HDA8MHww7DnMH4wGBAAAMBgyHDcMPww/DDv4MfAAAAAAAHgD+A+YPhgwGAH8AfwAEAAAAAA/GD8cMwwzDDMMM5wx+ABgAAAP8B/4MwwzDDMMMwwx+ADwAAAgADAAMBwwfDPgP4A8ADAAAAAe+D/8M4wxjDGMP5wf+ABwAAAfAB+cMYwwjDCMMYwf+A/wAAAAAAAAAxgBCAAAAAAAAAYPBA4AAAAAAAAAgAHAA+AHMAYYAAAAAAAAAAAAAAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAAABhgHMAPgAcAAgAAAAAAAABgAOAAwbDDsMYA/AA4AAAAAAAD4A/wGBgxzDPsMyQjJDPkM+wYIBxgD+AAAAAAABAA8A/gf8DwwODA/sAfwAHwADAAAP/w//DGMMYwxjDOMP9we+ABwA8AP8Bw4MAwwDDAMMAwwDDgcHDgMMAAAAAA//D/8MAwwDDAMMAw4HB/4D/AAAAAAP/w//DGMMYwxjDGMMQwgBAAAP/w//DDAMMAwwDDAMAADwA/wHDgwDDAMMAwwDDCMOJwc+ADwAAA//D/8AMAAwADAAMAAwD/8P/wAAAAAP/w//AAAABgAHAAMAAwAHD/4P+AAAAAAP/w//AOAB+AOcBw4MBwgDAAEAAA//D/8AAwADAAMAAwADAAAP/w//A8AA8AA+AA8AHwB8AeAHgA//D/8AAAAAD/8P/wcAAcAA8AA4AB4P/w//AAAA8AP8Bw4MAwwDDAMMAwwDDgcH/gP8AAAAAA//D/8MMAwwDDAMYA7gB8ABgADwA/wHDgwDDAMMAwwDDA8ODwf/A/8AAAAAD/8P/wwwDDAMMAx4Dv4HxwEBAAAHjg/HDMMMYwxjDGMONwc+ABwMAAwADAAMAA//D/8MAAwADAAIAAAAD/wP/gAHAAMAAwADAAMAHg/8AAAMAA+AA/AAfgAPAA8AfgPwD4AMAAwAD4AD+AA/AA8A/g/gDwAP4AH8AB8APwH8D8AMAAgBDAMPDgO8APAB8AOcDw8MAwgBCAAOAAeAAeAAfwH/B4AOAAwAAAAMAwwPDB8Mew3jD4MPAwwDAAAAAAAAB//3//QABAAAAAAADgAP4AH+AB8AAQAABAAEAAf/9//wAAAAAAAAAAGAAwAGAAwABgADAAGAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAQA3wHbAZMBswGzAf4A/wAAAAAP/w//AYMBgwGDAYMA/gB8AAAAEAD+Ae8BgwGDAYMBgwDGAAAAMAD+Ae8BgwGDAYMBhw//D/8AAAAYAP4B/wGTAZMBkwGTAP4AcAEAAYAP/w//CQAJAAAwAP4hz3GDMQMxAzGHcf/h/8AAAAAP/w//AYABgAGAAYAA/wB/AAAAAA3/Df8AAAAAOf/9//AAAAAP/w//ADgAfADGAYMBAQAAD/8P/wAAAAAB/wH/AYABgAGAAf8A/wGAAYABgAH/AP8AAAAAAf8B/wGAAYABgAGAAP8AfwAAADAA/gHvAYMBgwGDAYMA/gB8AAAAAAH/8f/xgwGDAYMBgwD+AHwAAAAwAP4B7wGDAYMBgwGHAf/x//AAAAAB/wH/AYABgAEAAAAA5gHzAbMBkwGbAd8AzgEAAYAP/wf/AQMBAwAAAAAB/gH/AAMAAwADAAcB/wH/AAABAAHgAPwAHwAPAH4B8AGAAQAB8AB+AA8APwHwAeAA/AAPAD8B+AHAAQEBgwHOAHwAOAD+AccBAwAAAQAB4AD4EB/wB8A/APgBwAAAAAEBgwGPAZ8B8wHjAcMBAQAAAAAABgf/9/n2AAAAAAAP/w//AAAEAAYAB/nz//AGAAAAAAAAAAAAcABgAGAAcAAwAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'), + 32, + atob("AwUHDwoOCwQHBwcJBAcEBgoGCQkKCQoICQoFBQoMCgkPCgoMCwkICwsECAoIDgsMCgwKCgoLCg8KCQoHBgcLCwgJCgkKCQYKCgQECAQOCgoKCgYIBwoIDAkJCAcEBwsQ"), + 16+(scale<<8)+(1<<16) + ); + return this; +}; + +let imgLock = function() { + return { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) + }; +}; + + +/************************************************ + * Clock Info + */ +let clockInfoItems = clock_info.load(); + +// Add some custom clock-infos +let weekOfYear = function() { + var date = new Date(); + date.setHours(0, 0, 0, 0); + // Thursday in current week decides the year. + date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); + // January 4 is always in week 1. + var week1 = new Date(date.getFullYear(), 0, 4); + // Adjust to Thursday in week 1 and count number of weeks from date to week1. + return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 + - 3 + (week1.getDay() + 6) % 7) / 7); +} + +clockInfoItems[0].items.unshift({ name : "weekofyear", + get : function() { return { text : "Week " + weekOfYear(), + img : null}}, + show : function() {}, + hide : function() {}, +}) + +// Empty for large time +clockInfoItems[0].items.unshift({ name : "nop", + get : function() { return { text : null, + img : null}}, + show : function() {}, + hide : function() {}, +}) + + + +let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { + app: "bwclk", + x : 0, + y: 135, + w: W, + h: H-135, + draw : (itm, info, options) => { + var hideClkInfo = info.text == null; + + g.setColor(g.theme.fg); + g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); + + g.setFontAlign(0,0); + g.setColor(g.theme.bg); + + if (options.focus){ + var y = hideClkInfo ? options.y+20 : options.y+2; + var h = hideClkInfo ? options.h-20 : options.h-2; + g.drawRect(options.x, y, options.x+options.w-2, y+h-1); // show if focused + g.drawRect(options.x+1, y+1, options.x+options.w-3, y+h-2); // show if focused + } + + // In case we hide the clkinfo, we show the time again as the time should + // be drawn larger. + if(hideClkInfo){ + drawTime(); + return; + } + + // Set text and font + var image = info.img; + var text = String(info.text); + if(text.split('\n').length > 1){ + g.setMiniFont(); + } else { + g.setSmallFont(); + } + + // Compute sizes + var strWidth = g.stringWidth(text); + var imgWidth = image == null ? 0 : 24; + var midx = options.x+options.w/2; + + // Draw + if (image) { + var scale = imgWidth / image.width; + g.drawImage(image, midx-parseInt(imgWidth*1.3/2)-parseInt(strWidth/2), options.y+6, {scale: scale}); + } + g.drawString(text, midx+parseInt(imgWidth*1.3/2), options.y+20); + + // In case we are in focus and the focus box changes (fullscreen yes/no) + // we draw the time again. Otherwise it could happen that a while line is + // not cleared correctly. + if(options.focus) drawTime(); + } +}); + + +/************************************************ + * Draw + */ +let draw = function() { + // Queue draw again + queueDraw(); + + // Draw clock + drawDate(); + drawTime(); + drawLock(); + drawWidgets(); +}; + + +let drawDate = function() { + // Draw background + var y = getLineY() + g.reset().clearRect(0,0,W,y); + + // Draw date + y = parseInt(y/2)+4; + y += isFullscreen() ? 0 : 8; + var date = new Date(); + var dateStr = date.getDate(); + dateStr = ("0" + dateStr).substr(-2); + g.setMediumFont(); // Needed to compute the width correctly + var dateW = g.stringWidth(dateStr); + + g.setSmallFont(); + var dayStr = locale.dow(date, true); + var monthStr = locale.month(date, 1); + var dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr)); + var fullDateW = dateW + 10 + dayW; + + g.setFontAlign(-1,0); + g.drawString(dayStr, W/2 - fullDateW/2 + 10 + dateW, y-12); + g.drawString(monthStr, W/2 - fullDateW/2 + 10 + dateW, y+11); + + g.setMediumFont(); + g.setColor(g.theme.fg); + g.drawString(dateStr, W/2 - fullDateW / 2, y+2); +}; + + +let drawTime = function() { + var hideClkInfo = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; + + // Draw background + var y1 = getLineY(); + var y = y1; + var date = new Date(); + + var hours = String(date.getHours()); + var minutes = date.getMinutes(); + minutes = minutes < 10 ? String("0") + minutes : minutes; + var colon = settings.hideColon ? "" : ":"; + var timeStr = hours + colon + minutes; + + // Set y coordinates correctly + y += parseInt((H - y)/2) + 5; + + if (hideClkInfo){ + g.setLargeFont(); + } else { + y -= 15; + g.setMediumFont(); + } + + // Clear region and draw time + g.setColor(g.theme.fg); + g.fillRect(0,y1,W,y+20 + (hideClkInfo ? 1 : 0) + (isFullscreen() ? 3 : 0)); + + g.setColor(g.theme.bg); + g.setFontAlign(0,0); + g.drawString(timeStr, W/2, y); +}; + + +let drawLock = function() { + if(settings.showLock && Bangle.isLocked()){ + g.setColor(g.theme.fg); + g.drawImage(imgLock(), W-16, 2); + } +}; + + +let drawWidgets = function() { + if(isFullscreen()){ + widget_utils.hide(); + } else { + Bangle.drawWidgets(); + } +}; + + +/************************************************ + * Listener + */ +// timeout used to update every minute +let drawTimeout; + +// schedule a draw for the next minute +let queueDraw = function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +}; + + +// Stop updates when LCD is off, restart when on +let lcdListenerBw = function(on) { + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}; +Bangle.on('lcdPower', lcdListenerBw); + +let lockListenerBw = function(isLocked) { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + + if(!isLocked && settings.screen.toLowerCase() == "dynamic"){ + // If we have to show the widgets again, we load it from our + // cache and not through Bangle.loadWidgets as its much faster! + widget_utils.show(); + } + + draw(); +}; +Bangle.on('lock', lockListenerBw); + +let charging = function(charging){ + // Jump to battery + clockInfoMenu.setItem(0, 2); + drawTime(); +} +Bangle.on('charging', charging); + +let kill = function(){ + clockInfoMenu.remove(); + delete clockInfoMenu; +}; +E.on("kill", kill); + +/************************************************ + * Startup Clock + */ + +// The upper part is inverse i.e. light if dark and dark if light theme +// is enabled. In order to draw the widgets correctly, we invert the +// dark/light theme as well as the colors. +let themeBackup = g.theme; +g.setTheme({bg:g.theme.fg,fg:g.theme.bg, dark:!g.theme.dark}).clear(); + +// Show launcher when middle button pressed +Bangle.setUI({ + mode : "clock", + remove : function() { + // Called to unload all of the clock app + Bangle.removeListener('lcdPower', lcdListenerBw); + Bangle.removeListener('lock', lockListenerBw); + Bangle.removeListener('charging', charging); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + // save settings + kill(); + E.removeListener("kill", kill); + g.setTheme(themeBackup); + widget_utils.show(); + } +}); + +// Load widgets and draw clock the first time +Bangle.loadWidgets(); + +// Draw first time +draw(); + +} // End of app scope diff --git a/apps/bwclklite/app.png b/apps/bwclklite/app.png new file mode 100644 index 0000000000000000000000000000000000000000..5073f0ed0ee9f9c74536e8120360af8caf25aa46 GIT binary patch literal 2116 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 bu7T|roXdI-%T9jpy1+p%KhG+6@|Ax8FvV5G literal 0 HcmV?d00001 diff --git a/apps/bwclklite/screenshot_2.png b/apps/bwclklite/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2f1717f7bbebcac6557e2d6e475741f708ab67 GIT binary patch literal 3038 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 literal 0 HcmV?d00001 diff --git a/apps/bwclklite/screenshot_3.png b/apps/bwclklite/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d52057569b0c80df6656e22333f4347e7552411a GIT binary patch literal 3031 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 literal 0 HcmV?d00001 diff --git a/apps/bwclklite/settings.js b/apps/bwclklite/settings.js new file mode 100644 index 000000000..116253fda --- /dev/null +++ b/apps/bwclklite/settings.js @@ -0,0 +1,50 @@ +(function(back) { + const SETTINGS_FILE = "bwclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + screen: "Normal", + showLock: true, + hideColon: false, + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + var screenOptions = ["Normal", "Dynamic", "Full"]; + E.showMenu({ + '': { 'title': 'BW Clock' }, + '< Back': back, + 'Screen': { + value: 0 | screenOptions.indexOf(settings.screen), + min: 0, max: 2, + format: v => screenOptions[v], + onchange: v => { + settings.screen = screenOptions[v]; + save(); + }, + }, + 'Show Lock': { + value: settings.showLock, + format: () => (settings.showLock ? 'Yes' : 'No'), + onchange: () => { + settings.showLock = !settings.showLock; + save(); + }, + }, + 'Hide Colon': { + value: settings.hideColon, + format: () => (settings.hideColon ? 'Yes' : 'No'), + onchange: () => { + settings.hideColon = !settings.hideColon; + save(); + }, + } + }); + }) From e6e2d622fbe3e0208a2fcc174160828a4c491c47 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:48:47 -0500 Subject: [PATCH 038/183] moved accel & vibration commands to the accelHandler function --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 23 +++++++++++------------ apps/multidice/metadata.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index d8a684575..2e6b8c622 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -14,3 +14,4 @@ 1.12: issue with app calling roll function too many times at startup 1.13: added a delay after the buzzer stops to prevent multi-rolling 1.14: made the delay needlessly long to see if it even does anything +1.15: moved accel & vibration commands to the accelHandler function diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 271b7bad3..6dddf1e19 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -35,9 +35,6 @@ function touchHandler (button, xy) { return; } - rollDice(); - return; - if (xy.x <= 87) { // left if (xy.y <= 43) { @@ -84,11 +81,22 @@ function touchHandler (button, xy) { function accelHandler (xyz) { + Bangle.on ('accel', voidFn); // temporarily disable more acceleration events if (xyz.diff >= 0.3) { menu = false; rollDice(); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (function() { // wait 50ms *after* the buzzing has stopped + + Bangle.on ('accel', accelHandler); + }, 50); + }); } + + Bangle.on ('accel', accelHandler); // re-enable acceleration events } function voidFn() { @@ -125,15 +133,6 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } - - Bangle.on ('accel', voidFn); - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (function() { // wait 50ms *after* the buzzing has stopped - - Bangle.on ('accel', accelHandler); - }, 1000); - }); } function random (max) { diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 2bcf4d2eb..7eb1c1607 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.14", + "version":"1.15", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 09eeac356b8adbcf17ca146ea26b2d96a3616744 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 18:52:29 +0100 Subject: [PATCH 039/183] Add changes to bwclklite after forking from bwclk. Change custom font to a standard bitmap one. Don't invert theme as this doesn't work very well with fastloading. Do an initial fillRect on the clock info area since it would wait for clock info before drawing out the previous app. Change all occurences of var to let. --- apps/bwclklite/ChangeLog | 4 ++ apps/bwclklite/app.js | 133 ++++++++++++----------------------- apps/bwclklite/metadata.json | 38 ++++++++-- 3 files changed, 79 insertions(+), 96 deletions(-) diff --git a/apps/bwclklite/ChangeLog b/apps/bwclklite/ChangeLog index 06f94854e..8b79a4c4e 100644 --- a/apps/bwclklite/ChangeLog +++ b/apps/bwclklite/ChangeLog @@ -31,3 +31,7 @@ clkinfo.addInteractive that would cause ReferenceError. 0.29: use setItem of clockInfoMenu to change the active item 0.30: Use widget_utils 0.31: Use clock_info module as an app +0.32: Diverge from BW Clock. Change out the custom font for a standard bitmap + one to speed up loading times. Remove invertion of theme as this doesn't + work very well with fastloading. Do an quick inital fillRect on the + clock info area. diff --git a/apps/bwclklite/app.js b/apps/bwclklite/app.js index 770c053c2..61a3feae1 100644 --- a/apps/bwclklite/app.js +++ b/apps/bwclklite/app.js @@ -32,7 +32,7 @@ for (const key in saved_settings) { } let isFullscreen = function() { - var s = settings.screen.toLowerCase(); + let s = settings.screen.toLowerCase(); if(s == "dynamic"){ return Bangle.isLocked(); } else { @@ -42,51 +42,11 @@ let isFullscreen = function() { let getLineY = function(){ return H/5*2 + (isFullscreen() ? 0 : 8); -} +}; /************************************************ * Assets */ -// Manrope font -Graphics.prototype.setLargeFont = function(scale) { - // Actual height 47 (48 - 2) - this.setFontCustom( - atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAD/AAAAAAAAP/wAAAAAAAf/8AAAAAAB///AAAAAAH///wAAAAAf///8AAAAB/////AAAAH////8AAAAP////wAAAA/////AAAAB////+AAAAA////4AAAAAP///gAAAAAD//+AAAAAAA//4AAAAAAAP/gAAAAAAAD/AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAB////8AAAAB/////wAAAA/////+AAAA//////wAAAf/////+AAAH//////wAAD//////+AAB/+AAAf/gAAf+AAAA/8AAH/AAAAH/AAD/gAAAA/4AA/wAAAAH+AAP8AAAAB/gAD+AAAAAf4AA/gAAAAH+AAP4AAAAA/gAD+AAAAAf4AA/wAAAAH+AAP8AAAAB/gAD/AAAAA/4AA/4AAAAP+AAH/AAAAH/AAB/4AAAH/wAAP/wAAP/4AAD//////+AAAf//////AAAD//////gAAAf/////wAAAD/////4AAAAf////4AAAAB////4AAAAAB///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAH/AAAAAAAAD/gAAAAAAAA/4AAAAAAAAf8AAAAAAAAH+AAAAAAAAD/gAAAAAAAB/wAAAAAAAAf8AAAAAAAAP///////AAD///////wAA///////8AAP///////AAD///////wAA///////8AAP///////AAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAB/AAAA/gAAA/wAAA/4AAAf8AAAf+AAAP/AAAP/gAAH/wAAH/4AAD/8AAD/+AAB//AAA//gAA//wAAf/AAAP/8AAH/AAAH//AAD/gAAD//wAA/wAAB//8AAP8AAA///AAD/AAAf+fwAA/gAAP/n8AAP4AAH/x/AAD+AAD/4fwAA/gAB/8H8AAP8AAf+B/AAD/AAP/AfwAA/4AH/gH8AAH/AH/wB/AAB/8H/4AfwAAP///8AH8AAD////AB/AAAf///gAfwAAD///wAH8AAAf//4AB/AAAD//4AAfwAAAP/8AAH8AAAAf4AAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAADgAAAfwAAAB+AAAH8AAAAfwAAB/AAAAH+AAAfwAAAB/wAAH8AAAA/+AAB/AAAAP/gAAfwA4AA/8AAH8AfgAH/AAB/AP8AA/4AAfwD/gAH+AAH8B/4AB/gAB/A/8AAf4AAfwf/AAD+AAH8P/wAA/gAB/H/8AAf4AAfz//gAH+AAH8//4AB/gAB/f//AA/4AAf/+/4Af8AAH//P/AP/AAB//j////gAAf/wf///4AAH/4H///8AAB/8A///+AAAf+AH///AAAH/AA///gAAB/gAD//wAAAfwAAP/wAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAH/wAAAAAAAH/8AAAAAAAH//AAAAAAAH//wAAAAAAH//8AAAAAAH///AAAAAAH///wAAAAAH///8AAAAAP//9/AAAAAP//8fwAAAAP//4H8AAAAP//4B/AAAAP//4AfwAAAP//4AH8AAAD//4AB/AAAA//4AAfwAAAP/4AAH8AAAD/wAAB/AAAA/wAAAfwAAAPwAH////AADwAB////wAAwAAf///8AAAAAH////AAAAAB////wAAAAAf///8AAAAAH////AAAAAA////wAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAGAHwAAAB///gB+AAAH///8AfwAAB////AP+AAAf///wD/wAAH///+A/+AAB////gP/gAAf///4A/8AAH/8P8AH/AAB/AD+AA/4AAfwA/gAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/AAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/gAH+AAH8Af4AB/gAB/AH/AA/wAAfwB/4Af8AAH8AP/AP/AAB/AD////gAAfwAf///wAAH8AD///8AAB/AA///+AAAfwAH///AAAAAAA///gAAAAAAD//gAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///4AAAAAH////wAAAAH/////AAAAD/////4AAAB//////AAAA//////4AAAf//////AAAP//////4AAD/8D/w/+AAB/4B/wD/wAAf8A/wAf8AAP+AP4AD/gAD/AD+AAf4AA/wB/AAH+AAP4AfwAB/gAD+AH8AAf4AA/gB/AAH+AAP4AfwAB/gAD+AH+AAf4AA/wB/gAH+AAP8Af8AD/gAD/gH/gB/wAAf8A/8A/8AAH/AP///+AAB/gB////gAAPwAP///wAAB4AD///4AAAMAAf//8AAAAAAD//+AAAAAAAP/+AAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAABwAAfwAAAAB8AAH8AAAAD/AAB/AAAAD/wAAfwAAAH/8AAH8AAAH//AAB/AAAP//wAAfwAAP//8AAH8AAf//+AAB/AAf//8AAAfwA///8AAAH8A///4AAAB/A///4AAAAfx///wAAAAH9///wAAAAB////gAAAAAf///gAAAAAH///AAAAAAB///AAAAAAAf/+AAAAAAAH/+AAAAAAAB/8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAf/AAAAAP+Af/8AAAAP/4P//wAAAP//P//+AAAH//////wAAB//////8AAA///////gAAf//////8AAH////gP/AAD/wf/wA/wAA/4D/4AP+AAP8Af8AB/gAD/AH/AAf4AA/gA/wAH+AAP4AP4AA/gAD+AD/AAP4AA/gA/wAH+AAP8Af8AB/gAD/AH/AAf4AA/4D/4AP+AAP/B//AH/AAB////4D/wAAf//////8AAD//////+AAAf//////AAAH//////wAAA//8///4AAAD/+D//8AAAAP+Af/8AAAAAAAB/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAB//AAAAAAAB//8AAAAAAB///gAAgAAA///8AAcAAAf///gAPAAAH///8AH4AAD////AD/AAB/+H/4B/wAAf+Af+Af8AAP+AB/wD/gAD/gAf8Af4AA/wAD/AH+AAP8AA/wB/gAD+AAH8AP4AA/gAB/AD+AAP4AAfwB/gAD+AAH8Af4AA/wAD/AH+AAP8AA/gD/gAD/gAf4A/wAAf8AP8A/8AAH/gH/Af/AAA///////gAAP//////wAAB//////8AAAP/////+AAAB//////AAAAP/////AAAAA/////gAAAAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='), - 46, - atob("ExspGyUkJiQnISYnFQ=="), - 62+(scale<<8)+(1<<16) - ); - return this; -}; - -Graphics.prototype.setMediumFont = function(scale) { - // Actual height 41 (42 - 2) - this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); - return this; -}; - -Graphics.prototype.setSmallFont = function(scale) { - // Actual height 28 (27 - 0) - this.setFontCustom( - atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+cB//5wH//nAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAQcAADhwAAOHBAA4c8ADh/wAP/+AB/+AA//wAH+HAAe4cMBDh/wAOP/AA//wAP/wAH/3AAf4cABzhwAAOHAAA4cAADgAAAOAAAAAAAAAAAAAAAAAAAAwAH8HwA/4PgD/geAePA8BwcBw/BwH78DgfvwOB+HA4HAeBwcA8HDgB4f+ADg/wAGB+AAAAAAAAAAAAAAAH4AAA/wBwHngPAcOB4Bw4PAHDh4AcOPAA/x4AD/PAADx4AAAPAAAB5wAAPPwAB5/gAPOPAB4wcAPDBwB4MHAPA4cA4B/gBAH8AAAHAAAAAAAAAAAAAPAAHD/AB/f+AP/x4B4+DwHB4HAcDwcBwHhwHAPHAcAccB4A5wDgB+AGA/4AAH/AAAf+AAAA8AAABgAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAHAAAAcwAAA/gAAb8AAB/gAAH+AAAD+AAAOwAABxAAADAAAAAAAAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAB//AAH/8AAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAABwAAAHIAAAfgAAB8AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAA/wAA//AA//AA//AAH/AAAfAAABAAAAAAAAAAAAAAAAAAAf/wAH//wA///gDgAOAcAAcBwABwHAAHAcAAcBwABwHgAPAPAB4Af//AA//4AA/+AAAAAAAAAAAAAAAAMAAABwAAAOAAAB4AAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAAwAcAPADwB8AfAPAB8B4APwHAB/AcAPcBwB5wHAPHAcB4cA8PBwD/4HAH/AcAHwBwAAAAAAAAAAAAGAHAAcAcAB4BwYDwHDwHAceAcBz4BwHfgHAf3AcB+eDwHw/+AeB/wBwD+AAAAAAAAAAAAAAAAABwAAAfAAAP8AAD/wAA/nAAP4cAD+BwAfgHAB4AcAEA//AAD/8AAP/wAABwAAAHAAAAMAAAAAAAAAAAAAEAH/w4Af/D4B/8HgHDgPAcOAcBw4BwHDgHAcOAcBw8DwHB4eAcH/wBgP+AAAPwAAAAAAAAAAAAAAAB//AAf//AD//+AOHB4Bw4BwHDgHAcOAcBw4BwHDgHAcPA8A4eHgDh/8AEB/gAAD4AAAAAAAAAABwAAAHAAAAcAAMBwADwHAB/AcA/4BwP8AHH/AAd/gAB/wAAH8AAAeAAAAAAAAAAAAAAAEAAPD+AB/f8AP//4B4+DwHDwHAcHAcBwcBwHBwHAcPAcB/+DgD//+AH5/wACB8AAAAAAAAAAAAAAAAEAAAD+AAAf+DAD74OAODw8BwHBwHAOHAcA4cBwDBwHAcHAeBw8A+ePgB//8AD//gAB/wAAAAAAAAAAAAAAAAAAAAAHBwAAcHAABwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AcgDgB+AOAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAeAAAD8AAAf4AADzwAAeHgADwPAAGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAOAcAA8DgAB4cAABzgAAD8AAAHgAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAHgAAA+AAAHgAAAcAAABwD5wHAfnAcD8cBweAAHzwAAP+AAAfwAAAcAAAAAAAAAAAAAAAAAAB/AAA//AAH/+AA8A8AHAA4A4ABwDg+HAcH8OBw444GDBhgYMGGBgwYYHDjjgcP8OBw/44DgDhAOAGAAeAYAA+HgAB/8AAB/gAAAAAAAAAAAAABAAAA8AAAfwAAP/AAH/gAD/4AB/zgAf4OAB8A4AHwDgAf4OAA/84AAP/gAAH/AAAD/gAAB/AAAA8AAAAQAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBweBwHj4HAP/58Afz/gAcH8AAAPAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB8B8ADwHgADAYAAAAAAAAAAAAAAAH///Af//8B///wHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAeAA8A8AHgB8B+AD//gAH/8AAD/AAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOAAHA4AAcDgABwOAAHA4AAcDgABwOAAHAAAAcAAAAAAAAAP/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwGBwHgYPAOBg4A+GPgB4f8ADh/gAAH4AAAAAAAAAAAAAAAH///Af//8B///wAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAeAAAA8AAABwAAAHAAAAcAAABwH///Af//4B///AAAAAAAAAAAAAAAAAAAAf//8B///wH///AAHgAAA/AAAH+AAA88AAHh8AA8D4AHgDwA8AHgHgAPAYAAcBAAAwAAABAAAAAAAAAAH///Af//8B///wAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAAAAAAAAAAAAH///Af//8B///wB/AAAB/AAAA/AAAA/gAAA/gAAA/gAAA/AAAD8AAA/AAAfwAAH8AAB/AAAfgAAP4AAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wD8AAAD4AAAH4AAAHwAAAPwAAAPgAAAPgAAAfAAAAfAAAA/Af//8B///wH///AAAAAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAH///Af//8B///wHAOAAcA4ABwDgAHAOAAcA4ABwDgAHAeAAeBwAA+fAAD/4AAD/AAADgAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAnAcAHcA4AfgDwA+AH4P4AP//wAf/3AAP4AAAAAAAAAAAf//8B///wH///AcA4ABwDgAHAOAAcA4ABwDgAHAOAAcB+AB4H+AD59/AP/h8AP8BwAOABAAAAAAAAAAAAAwAD4HwA/4fAD/geAePA8BwcBwHBwHAcDgcBwOBwHA4HAcDgcA4HDwD4eeAHw/4AOD/AAIDwAAAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAH///Af//8B///wHAAAAcAAABwAAAHAAAAcAAABwAAAGAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAGAAAAfAAAB/gAAB/wAAA/4AAAf8AAAP/AAAH8AAADwAAA/AAAf8AAP+AAP/AAH/gAB/wAAH4AAAcAAABAAAAHwAAAf4AAA/+AAAP/gAAH/wAAB/wAAA/AAAf8AAf/AAP/gAP/gAB/gAAH4AAAf+AAAf/AAAH/wAAB/8AAAfwAAB/AAB/8AA/+AA/+AAf+AAB/AAAHAAAAAAAAAAAAQGAADAeAA8B8AHwD8B+AD4PgAH74AAH/AAAPwAAA/gAAP/gAD8fAAfA/AH4A+AeAA8BwABwEAABAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAABAcAAcBwADwHAA/AcAP8BwD/wHAfnAcH4cBx+BwHPwHAf8AcB/ABwH4AHAeAAcBgABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAAeAAAB/gAAH/4AAB/+AAAf/gAAH/AAAB8AAAAQAAAAAAAAAAAAAAOAAAA4AAADgAAAP/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xwAOGHAA44MADjgwAOOHAA44YADjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wH//+AAcA4ADgBwAOAHAA4AcADgBwAOAHAA8A8AB8PgAD/8AAH/gAAH4AAAAAAAAAAAAH4AAB/4AAP/wAB4HgAPAPAA4AcADgBwAOAHAA4AcADgBwAPAPAAeB4AA4HAABgYAAAAAAAAAAAAfgAAH/gAB//gAHgeAA8A8ADgBwAOAHAA4AcADgBwAOAHAAcA4B///wH///Af//8AAAAAAAAAAAAAAAAH4AAB/4AAP/wAB7HgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAwAAAAAAAAAAAAwAAADAAAB///AP//8B///wHMAAAYwAABjAAAGMAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAB///wH///AAf/8ABwAAAOAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAAAAAc//8Bz//wHP//AAAAAAAAAAAAAAHAAAAcAAAH+f///5///7H//8AAAAAAAAAAAAAAH///Af//8B///wAAPAAAB+AAAP8AAB54AAfDwAD4HgAOAPAAwAcACAAwAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAAD4AAAH//AAP/8AB//wAHAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAADgAAAPAAAAf/8AA//wAB//AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAeB4ADwDwAOAHAA4AcADgBwAOAHAA4AcADwDwAHw+AAP/wAAf+AAAfgAAAAAAAAAAAAAAAB///8H///wP///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAD//wAP//AAf/8ABwAAAOAAAA4AAADgAAAOAAAAAAAAAYGAAD4cAAfx4AD3DwAOOHAA44cADjhwAOGHAA4ccADxzwAHj+AAOP4AAYOAAAAAAAwAAADAAAAMAAAP//wA///gD///AAwAcADABwAMAHAAwAcADAAwAAAAAAAAAAD/gAAP/4AA//4AAA/gAAAPAAAAcAAABwAAAHAAAAcAAABwAAAOAA//8AD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAH+AAAH/AAAD/gAAB/AAAB8AAA/wAAf8AAP+AAD/AAAPgAAAwAAAAAAAAIAAAA8AAAD/AAAH/gAAD/wAAA/wAAA/AAAf8AAP+AAP+AAA/AAAD+AAAH/AAAD/gAAA/wAAA/AAAf8AAP/AAP/AAA/gAADgAAAAAAAAAAEADAAwAOAHAA+B8AB8PgAB74AAD/AAAH4AAA/wAAHvgAB8PgAPgfAA4AcADAAwAAABABAAAAHAAAAfgAAA/wAAA/wAwAf4fAAP/8AAP/AAB/gAA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAEADAAwAOAPAA4B8ADgPwAOD/AA4ecADnxwAO8HAA/gcAD8BwAPAHAA4AcACAAwAAAAAAAAAAAAAAAAAAAAAAAAAA8AB////f//////n/+AAAA4AAADgAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////z////AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHwAAAcAAABwAAAHgAAAOAAAA8AAABwAAAHAAAB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn//gOf/+A5//4AAAAAAAAAAAAAAAAAAAD/AAA//AAH/+AA+B8ADgBwAOAHAHwAPgfAA+B8AD4A4AcADwDwAHgeAAOBwAAQCAAAAAAAAAAAADgcAAOBwAA4HAD//8A///wD///AeDgcBwOBwHA4HAcDgcB4GBwD4AHAHgAcAOAAAAAAAAAAAAAMAGAB7+8AD//gAHx8AAcBwADgDgAOAOAA4A4ADgDgAOAOAA4A4ABwHAAHg8AA//4AH//wAMOGAAAAAAQAAABwAAAHwMYAPwxgAfjGAAfsYAAf7gAAf/wAB//AAf/8AH7GAA/MYAPwxgB8DGAHAAAAQAAAAAAAAAAAAAf/D/5/8P/n/w/+AAAAAAAAAAAAAAAAAAAABwAAffhwD//Hgf+cfBzwwcGHDhwYcOHBxw4cHDhxwfOPvA8//4Bx//AADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAP/wAB//gAPAPAB4AOAPDw8A4/xwHH/jgc4HOBzgc4HMAzgcwDOBzgc4HPDjgOcOeA4whwBwAOAHwD4APw/AAf/4AAf+AAAPAAAAAAAATgAAD/AAANsAAA2wAADTAAAP8AAAfwAAAAAAAAAAAAAAAAAAgAAAPAAAB+AAAOeAADw8AAOIwAADxAAAfgAADngAA8PAADgMAAEAQAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAB+AAAH4AAAAAAAAAAAAAAAAAAAAD8AAA/8AAHh4AAYDgAD/3AAN/MAA0QwADRjAAN/MAA7hwABwOAADhwAAH+AAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAD/AAAeeAABw4AAGDgAAYOAABw4AAH/AAAP8AAAfAAAAAAAAAAAAAAAAAAAwYAADBgAAMGAAAwYAADBgAAMGAAP+YAA/5gAD/mAAAwYAADBgAAMGAAAwYAADBgAAAAAAAAAAAAAAAMDAABwcAAPDwAAwPAADB8AAMOwAA5zAAB+MAADwwAAAAAAAAAAAIBAAAwGAADMcAANwwAA/DAAD8MAAO/wAAx+AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///B///8H//AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAAAAAAP4AAB/4AAP/gAB//AAH/8AAf/wAB//AAH///8f///x////AAAAAAAAAB////H///8f///wAAAAAAAAAAAAAAABAAAAOAAAB4AAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzAAAPMAAA/wAAAeAAAAAAAAAAAAAAAAAAAIAAABgAAAMAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAA8AAAP4AAAwwAADDAAAMMAAA5wAAB+AAADwAAAAAAAAAAAAAAAAAMAwAA8HAAB44AAD/AAAD4AADGMAAOBwAAeOAAA/wAAA+AAABgAAAAAAAAAAAAAAABAAAAMAAABwAAAH/8CAf/wcAAAHgAAA8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgCAA8A8APAfwB4H7AHB+MAAHAwAAQ/wAAD/AAAAwAAADAAAAAAAAAAAAAAAAAAAAEAAAAwAAAHAAAAf/wIB//BwAAAeAAADwAAAeAAAHgAAA8AAAHgAAB4AAAPAAAD4AAAeAAADwAAA8GAwHg4HAcHA8AAYHwABg7AAGHMAAf4wAA/DAAA4MAAAAAAAAAAYBgABgHAAGMOAAZwYABvBgAH8OCAe/wcBx+HgABg8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgHAA8B8APAfwB4HzADB8MAAHAwAAQ/wAAD/AAAAwAAAAAAAAAAAAAAAAAA4AAAP4AAB/wAAPHgABwOA4/A4Dn4DgOfAOAAAA4AAAHgAAB8AAAHgAAAYAAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAAAAAABwAAA/AAAf8AAP/AAH/wfD/nD+/wcMb4BwxvgHD+/wcHx/5wEAf/AAAP+AAAH/AAAD8AAABwAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAcAOABwA4AHADgAf//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAYAAMAAAAAAAAAAA/4AAP/4AD//4APAHgB4APAPAAeA4AA4DgADg+AAPz4AA//gAD/+AAOe4AA4BwAHAHgA8APgPgAeA8AAYDAAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcAAcBwABwAAAAAAAAAAAAAAH///Af//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwABwHAAHAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAABgAAAGAAH///Af//8B///wHAYHAcBgcBwGBwHAYHAcBgcBwABwHAAHAeAA8A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAAAAAf//8B///wH///APwAAAPgAAAfgAAAfAAAA/AAAA+AAAA+AAAB8AAAB8AAAD8B///wH///Af//8AAAAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAB/wAAf/wAH//wAeAPADwAeAeAA8BwABwHAAHAcAAcBwABwHAAHAcAAcBwABwDgAOAPAB4Afg/AA//4AB//AAA/gAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAGDgAA8eAAB7wAAD+AAAHwAAAfAAAD+AAAe8AADw4AAGBAAAAAAAAAAAAAAAAAf8MAH//4B///AHgD4A8AfgHgD/AcAecBwDxwHAeHAcDwcBw+BwHHgHAc8AcA/gDgD8AeAH4PwA//+AH//wAMP4AAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4Af//wAAAHgAAAPAAAAcAAABwAAAHAAAAcAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAAAAf//8B///wH///ABwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHg8AAP/gAAf8AAA/gAAAAAAAAAAAAAAAA///AP//8A///wHgAAAcAAcBwABwHBwHAcHAcB4+BwD/4PAH954APn/gAAP8AAAOAAAAAAAAAAAAAD4AAcfwADz/gAfOOCBww4PHHBg+ccGAZxw4AHHDAAcYcAA//gAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPP+AB844AHDDgAccGAZxwYPnHDg8ccMDBxhwAD/+AAP/+AAP/4AAAAAAAAAAAAAAAAA+AAHH8AA8/4BnzjgOcMOBxxwYOHHBg4ccOBxxwwDnGHAGP/4AA//4AA//gAAAAAAAAAAAAAAAAHwAA4/gAHn/A8+ccDzhhwMOODA444MBjjhwHOOGAM4w4Dx//AOH//AAH/8AAAAAAAAAAAAAAAAAfAADj+AAef8Bz5xwHOGHAc44MADjgwAOOHAY44YBzjDgHH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xweOGHD844MMzjgwzOOHD844YHjjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAHwAAx/gAHn/AAc4cADjhwAOMDAA4wcADjBwAOMHAA4w4AB//AAH/4AAP/wAB/fgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAAAAAAAAAA/AAAP/AAB/+AAPA8AB4B4AHADgwcAPzBwA/8HADngcAOMB4B4ADwPAAHA4AAMDAAAAAAAAAAAAA/AAAP/AAB/+AAPY8AB5h4OHGDg+cYOB5xg4AnGDgAcYOAB5h4AD+PAAH44AAPjAAAGAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgOcYOD5xg4OHGDggeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAAAD8AAA/8AAH/4AY9jwDnmHgecYODhxg4OHGDg8cYOB5xg4BnmHgCP48AAfjgAA+MAAAYAAAAAAAAAAAAB+AAAf+AAD/8Acex4BzzDwHOMHAA4wcADjBwAOMHAc4wcBzzDwGH8eAAPxwAAfGAAAMAAAAAAAAAAAOAAAA+f/+A5//4An//gAAAAAAAAAAAAAAAAAAAJ//4Dn//g+f/+DgAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAHAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/AAB//AAPA8AA4A4DDgDgPMAOA/wA4D7ADgPOAOB+8B4C/+/AA//4AB//AAAHAAAAAAAAAAAAP//AA//8Bx//wPHAAAw4AADjgAAGOAAAc4AAAzgAAPPAAA4f/8AA//wAB//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAPA8CB4B4OHADg+cAOA5wA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AnADgecAOD5wA4OHADgAeAeAA+HwAB/+AAD/wAAD8AAAAAAAAAAAAD8AAA/8AAH/4AY8DwDngHgecAODhwA4OHADg8cAOB5wA4BngHgCPh8AAf/gAA/8AAA/AAAAAAAAAAAAB+AAAf+AAD/8AceB4DzwDwMOAHA44AcBjgBwHOAHAM4AcDzwDwOHw+AAP/wAAf+AAAfgAAAAAAAAAAAAfgAAH/gAA//AHHgeAc8A8BzgBwAOAHAA4AcADgBwHOAHAc8A8Bh8PgAD/8AAH/gAAH4AAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAA7cAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5gAB//AAP/4AB4PgAPB/AA4PcADh5wAOPHAA54cADvBwAP4PAAfD4AB//AAP/4AAZ+AAAAAAAAAAAAf8AAB//AAH//AAAH8AAAB4OAADg+AAOB4AA4AgADgAAAOAAABwAH//gAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4BgADgeAAOD4AA4MAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AYAfwDgAHgcAAODgAA4OAADg8AAOB4AA4BgAHACf/+AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AcAP4BwADwHAAHAAAAcAAABwAAAHAcAAcBwADgGP//AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAA/wAAA/wAAAf4cAAP/zgAP/+AB/jgA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAAAAAAA//////////////A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAABAAAAHAAAAfgAAw/wADg/wA+Af4fAAP/8AAP/AAB/g4A/wDgf4AOP+AAB/AAAHgAAAQAAA=='), - 32, - atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), - 28+(scale<<8)+(1<<16) - ); - return this; -}; - -Graphics.prototype.setMiniFont = function(scale) { - // Actual height 16 (15 - 0) - this.setFontCustom( - atob('AAAAAAAAAAAAAP+w/5AAAAAA4ADgAOAA4AAAAAAAAAABgBmAGbAb8D+A+YDZ8B/wf4D5gJmAGQAQAAAAAAAeOD8cMwzxj/GPMYwc/Az4AAAAAHAA+DDIYMjA+YBzAAYADeA7MHMw4zDD4ADAAAAz4H/wzjDHMMMwwbBj4APgADAAAAAA4ADgAAAAAAAAAAfwH/54B+ABAAAAAOABeAcf/gfwAAAAACAAaAD4APgAOABgAAAAAAACAAIAAgA/wAMAAgACAAAAAAAAPAA4AAAAAAIAAgACAAIAAgAAAAAAADAAMAAAAAAAcAfwf4D4AIAAAAA/wH/gwDDAMMAwwDB/4D/AAAAAAGAAwAD/8P/wAAAAAHAw8HDA8MHww7DnMH4wGBAAAMBgyHDcMPww/DDv4MfAAAAAAAHgD+A+YPhgwGAH8AfwAEAAAAAA/GD8cMwwzDDMMM5wx+ABgAAAP8B/4MwwzDDMMMwwx+ADwAAAgADAAMBwwfDPgP4A8ADAAAAAe+D/8M4wxjDGMP5wf+ABwAAAfAB+cMYwwjDCMMYwf+A/wAAAAAAAAAxgBCAAAAAAAAAYPBA4AAAAAAAAAgAHAA+AHMAYYAAAAAAAAAAAAAAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAAABhgHMAPgAcAAgAAAAAAAABgAOAAwbDDsMYA/AA4AAAAAAAD4A/wGBgxzDPsMyQjJDPkM+wYIBxgD+AAAAAAABAA8A/gf8DwwODA/sAfwAHwADAAAP/w//DGMMYwxjDOMP9we+ABwA8AP8Bw4MAwwDDAMMAwwDDgcHDgMMAAAAAA//D/8MAwwDDAMMAw4HB/4D/AAAAAAP/w//DGMMYwxjDGMMQwgBAAAP/w//DDAMMAwwDDAMAADwA/wHDgwDDAMMAwwDDCMOJwc+ADwAAA//D/8AMAAwADAAMAAwD/8P/wAAAAAP/w//AAAABgAHAAMAAwAHD/4P+AAAAAAP/w//AOAB+AOcBw4MBwgDAAEAAA//D/8AAwADAAMAAwADAAAP/w//A8AA8AA+AA8AHwB8AeAHgA//D/8AAAAAD/8P/wcAAcAA8AA4AB4P/w//AAAA8AP8Bw4MAwwDDAMMAwwDDgcH/gP8AAAAAA//D/8MMAwwDDAMYA7gB8ABgADwA/wHDgwDDAMMAwwDDA8ODwf/A/8AAAAAD/8P/wwwDDAMMAx4Dv4HxwEBAAAHjg/HDMMMYwxjDGMONwc+ABwMAAwADAAMAA//D/8MAAwADAAIAAAAD/wP/gAHAAMAAwADAAMAHg/8AAAMAA+AA/AAfgAPAA8AfgPwD4AMAAwAD4AD+AA/AA8A/g/gDwAP4AH8AB8APwH8D8AMAAgBDAMPDgO8APAB8AOcDw8MAwgBCAAOAAeAAeAAfwH/B4AOAAwAAAAMAwwPDB8Mew3jD4MPAwwDAAAAAAAAB//3//QABAAAAAAADgAP4AH+AB8AAQAABAAEAAf/9//wAAAAAAAAAAGAAwAGAAwABgADAAGAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAQA3wHbAZMBswGzAf4A/wAAAAAP/w//AYMBgwGDAYMA/gB8AAAAEAD+Ae8BgwGDAYMBgwDGAAAAMAD+Ae8BgwGDAYMBhw//D/8AAAAYAP4B/wGTAZMBkwGTAP4AcAEAAYAP/w//CQAJAAAwAP4hz3GDMQMxAzGHcf/h/8AAAAAP/w//AYABgAGAAYAA/wB/AAAAAA3/Df8AAAAAOf/9//AAAAAP/w//ADgAfADGAYMBAQAAD/8P/wAAAAAB/wH/AYABgAGAAf8A/wGAAYABgAH/AP8AAAAAAf8B/wGAAYABgAGAAP8AfwAAADAA/gHvAYMBgwGDAYMA/gB8AAAAAAH/8f/xgwGDAYMBgwD+AHwAAAAwAP4B7wGDAYMBgwGHAf/x//AAAAAB/wH/AYABgAEAAAAA5gHzAbMBkwGbAd8AzgEAAYAP/wf/AQMBAwAAAAAB/gH/AAMAAwADAAcB/wH/AAABAAHgAPwAHwAPAH4B8AGAAQAB8AB+AA8APwHwAeAA/AAPAD8B+AHAAQEBgwHOAHwAOAD+AccBAwAAAQAB4AD4EB/wB8A/APgBwAAAAAEBgwGPAZ8B8wHjAcMBAQAAAAAABgf/9/n2AAAAAAAP/w//AAAEAAYAB/nz//AGAAAAAAAAAAAAcABgAGAAcAAwAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'), - 32, - atob("AwUHDwoOCwQHBwcJBAcEBgoGCQkKCQoICQoFBQoMCgkPCgoMCwkICwsECAoIDgsMCgwKCgoLCg8KCQoHBgcLCwgJCgkKCQYKCgQECAQOCgoKCgYIBwoIDAkJCAcEBwsQ"), - 16+(scale<<8)+(1<<16) - ); - return this; -}; - let imgLock = function() { return { width : 16, height : 16, bpp : 1, @@ -103,31 +63,31 @@ let clockInfoItems = clock_info.load(); // Add some custom clock-infos let weekOfYear = function() { - var date = new Date(); + let date = new Date(); date.setHours(0, 0, 0, 0); // Thursday in current week decides the year. date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); // January 4 is always in week 1. - var week1 = new Date(date.getFullYear(), 0, 4); + let week1 = new Date(date.getFullYear(), 0, 4); // Adjust to Thursday in week 1 and count number of weeks from date to week1. return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); -} +}; clockInfoItems[0].items.unshift({ name : "weekofyear", get : function() { return { text : "Week " + weekOfYear(), - img : null}}, + img : null};}, show : function() {}, hide : function() {}, -}) +}); // Empty for large time clockInfoItems[0].items.unshift({ name : "nop", get : function() { return { text : null, - img : null}}, + img : null};}, show : function() {}, hide : function() {}, -}) +}); @@ -138,7 +98,7 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { w: W, h: H-135, draw : (itm, info, options) => { - var hideClkInfo = info.text == null; + let hideClkInfo = info.text == null; g.setColor(g.theme.fg); g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); @@ -147,8 +107,8 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { g.setColor(g.theme.bg); if (options.focus){ - var y = hideClkInfo ? options.y+20 : options.y+2; - var h = hideClkInfo ? options.h-20 : options.h-2; + let y = hideClkInfo ? options.y+20 : options.y+2; + let h = hideClkInfo ? options.h-20 : options.h-2; g.drawRect(options.x, y, options.x+options.w-2, y+h-1); // show if focused g.drawRect(options.x+1, y+1, options.x+options.w-3, y+h-2); // show if focused } @@ -161,22 +121,22 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { } // Set text and font - var image = info.img; - var text = String(info.text); + let image = info.img; + let text = String(info.text); if(text.split('\n').length > 1){ - g.setMiniFont(); + g.setFont("6x8"); //g.setMiniFont(); } else { - g.setSmallFont(); + g.setFont("6x8:3"); //g.setSmallFont(); } // Compute sizes - var strWidth = g.stringWidth(text); - var imgWidth = image == null ? 0 : 24; - var midx = options.x+options.w/2; + let strWidth = g.stringWidth(text); + let imgWidth = image == null ? 0 : 24; + let midx = options.x+options.w/2; // Draw if (image) { - var scale = imgWidth / image.width; + let scale = imgWidth / image.width; g.drawImage(image, midx-parseInt(imgWidth*1.3/2)-parseInt(strWidth/2), options.y+6, {scale: scale}); } g.drawString(text, midx+parseInt(imgWidth*1.3/2), options.y+20); @@ -206,56 +166,56 @@ let draw = function() { let drawDate = function() { // Draw background - var y = getLineY() + let y = getLineY(); g.reset().clearRect(0,0,W,y); // Draw date y = parseInt(y/2)+4; y += isFullscreen() ? 0 : 8; - var date = new Date(); - var dateStr = date.getDate(); + let date = new Date(); + let dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.setMediumFont(); // Needed to compute the width correctly - var dateW = g.stringWidth(dateStr); + g.setFont("6x8:4"); //g.setMediumFont(); // Needed to compute the width correctly + let dateW = g.stringWidth(dateStr); - g.setSmallFont(); - var dayStr = locale.dow(date, true); - var monthStr = locale.month(date, 1); - var dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr)); - var fullDateW = dateW + 10 + dayW; + g.setFont("6x8:3"); //g.setSmallFont(); + let dayStr = locale.dow(date, true); + let monthStr = locale.month(date, 1); + let dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr)); + let fullDateW = dateW + 10 + dayW; g.setFontAlign(-1,0); g.drawString(dayStr, W/2 - fullDateW/2 + 10 + dateW, y-12); g.drawString(monthStr, W/2 - fullDateW/2 + 10 + dateW, y+11); - g.setMediumFont(); + g.setFont("6x8:4"); //g.setMediumFont(); g.setColor(g.theme.fg); g.drawString(dateStr, W/2 - fullDateW / 2, y+2); }; let drawTime = function() { - var hideClkInfo = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; + let hideClkInfo = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; // Draw background - var y1 = getLineY(); - var y = y1; - var date = new Date(); + let y1 = getLineY(); + let y = y1; + let date = new Date(); - var hours = String(date.getHours()); - var minutes = date.getMinutes(); + let hours = String(date.getHours()); + let minutes = date.getMinutes(); minutes = minutes < 10 ? String("0") + minutes : minutes; - var colon = settings.hideColon ? "" : ":"; - var timeStr = hours + colon + minutes; + let colon = settings.hideColon ? "" : ":"; + let timeStr = hours + colon + minutes; // Set y coordinates correctly y += parseInt((H - y)/2) + 5; if (hideClkInfo){ - g.setLargeFont(); + g.setFont("6x8:5"); //g.setLargeFont(); } else { y -= 15; - g.setMediumFont(); + g.setFont("6x8:4"); //g.setMediumFont(); } // Clear region and draw time @@ -330,7 +290,7 @@ let charging = function(charging){ // Jump to battery clockInfoMenu.setItem(0, 2); drawTime(); -} +}; Bangle.on('charging', charging); let kill = function(){ @@ -343,12 +303,6 @@ E.on("kill", kill); * Startup Clock */ -// The upper part is inverse i.e. light if dark and dark if light theme -// is enabled. In order to draw the widgets correctly, we invert the -// dark/light theme as well as the colors. -let themeBackup = g.theme; -g.setTheme({bg:g.theme.fg,fg:g.theme.bg, dark:!g.theme.dark}).clear(); - // Show launcher when middle button pressed Bangle.setUI({ mode : "clock", @@ -362,7 +316,7 @@ Bangle.setUI({ // save settings kill(); E.removeListener("kill", kill); - g.setTheme(themeBackup); + Bangle.removeListener('charging', charging); widget_utils.show(); } }); @@ -371,6 +325,7 @@ Bangle.setUI({ Bangle.loadWidgets(); // Draw first time +g.setColor(g.theme.fg).fillRect(0,135,W,H); // Otherwise this rect will wait for clock_info before updating draw(); } // End of app scope diff --git a/apps/bwclklite/metadata.json b/apps/bwclklite/metadata.json index 430f466b2..8c68bc40d 100644 --- a/apps/bwclklite/metadata.json +++ b/apps/bwclklite/metadata.json @@ -1,19 +1,43 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.31", + "version": "0.32", "description": "A very minimalistic clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}], + "screenshots": [ + { + "url": "screenshot.png" + }, + { + "url": "screenshot_2.png" + }, + { + "url": "screenshot_3.png" + } + ], "type": "clock", "tags": "clock,clkinfo", - "supports": ["BANGLEJS2"], - "dependencies" : { "clock_info":"module" }, + "supports": [ + "BANGLEJS2" + ], + "dependencies": { + "clock_info": "module" + }, "allow_emulator": true, "storage": [ - {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, - {"name":"bwclk.settings.js","url":"settings.js"} + { + "name": "bwclk.app.js", + "url": "app.js" + }, + { + "name": "bwclk.img", + "url": "app-icon.js", + "evaluate": true + }, + { + "name": "bwclk.settings.js", + "url": "settings.js" + } ] } From 8efd551ba493d47569b324525ca4c9dccf3d6bae Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:00:36 -0500 Subject: [PATCH 040/183] enabled button usage & temporarily disabled acceleration --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 15 ++++++++++++++- apps/multidice/metadata.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 2e6b8c622..ff191cf13 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -15,3 +15,4 @@ 1.13: added a delay after the buzzer stops to prevent multi-rolling 1.14: made the delay needlessly long to see if it even does anything 1.15: moved accel & vibration commands to the accelHandler function +1.16: enabled button usage & temporarily disabled acceleration diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 6dddf1e19..0893fe470 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -142,4 +142,17 @@ function random (max) { drawMenu(); Bangle.on ('touch', touchHandler); -Bangle.on ('accel', accelHandler); +//Bangle.on ('accel', accelHandler); +setWatch (function() { + + menu = false; + rollDice(); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (function() { // wait 50ms *after* the buzzing has stopped + + //Bangle.on ('accel', accelHandler); + }, 50); + }); +}, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 7eb1c1607..9b2148682 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.15", + "version":"1.16", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 20e300182e21fb2cfc413efcd8f5bc714d2a00e8 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 19:03:59 +0100 Subject: [PATCH 041/183] Change all occurrances of bwclk to bwclklite --- apps/bwclklite/README.md | 7 +++++-- apps/bwclklite/app.js | 4 ++-- apps/bwclklite/metadata.json | 12 ++++++------ apps/bwclklite/settings.js | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/bwclklite/README.md b/apps/bwclklite/README.md index 882d525f6..974411be0 100644 --- a/apps/bwclklite/README.md +++ b/apps/bwclklite/README.md @@ -1,5 +1,5 @@ -# BW Clock -A very minimalistic clock. +# BW Clock Lite +This is a fork of a very minimalistic clock. ![](screenshot.png) @@ -25,3 +25,6 @@ Note: Check out the settings to change different themes. ## Creator [David Peer](https://github.com/peerdavid) + +## Contributors +thyttan diff --git a/apps/bwclklite/app.js b/apps/bwclklite/app.js index 61a3feae1..1008eae9c 100644 --- a/apps/bwclklite/app.js +++ b/apps/bwclklite/app.js @@ -11,7 +11,7 @@ const widget_utils = require("widget_utils"); /************************************************ * Globals */ -const SETTINGS_FILE = "bwclk.setting.json"; +const SETTINGS_FILE = "bwclklite.setting.json"; const W = g.getWidth(); const H = g.getHeight(); @@ -92,7 +92,7 @@ clockInfoItems[0].items.unshift({ name : "nop", let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { - app: "bwclk", + app: "bwclklite", x : 0, y: 135, w: W, diff --git a/apps/bwclklite/metadata.json b/apps/bwclklite/metadata.json index 8c68bc40d..bab852623 100644 --- a/apps/bwclklite/metadata.json +++ b/apps/bwclklite/metadata.json @@ -1,8 +1,8 @@ { - "id": "bwclk", - "name": "BW Clock", + "id": "bwclklite", + "name": "BW Clock Lite", "version": "0.32", - "description": "A very minimalistic clock.", + "description": "A very minimalistic clock. This version of BW Clock is quicker at the cost of the custom font.", "readme": "README.md", "icon": "app.png", "screenshots": [ @@ -27,16 +27,16 @@ "allow_emulator": true, "storage": [ { - "name": "bwclk.app.js", + "name": "bwclklite.app.js", "url": "app.js" }, { - "name": "bwclk.img", + "name": "bwclklite.img", "url": "app-icon.js", "evaluate": true }, { - "name": "bwclk.settings.js", + "name": "bwclklite.settings.js", "url": "settings.js" } ] diff --git a/apps/bwclklite/settings.js b/apps/bwclklite/settings.js index 116253fda..2d3916a3d 100644 --- a/apps/bwclklite/settings.js +++ b/apps/bwclklite/settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "bwclk.setting.json"; + const SETTINGS_FILE = "bwclklite.setting.json"; // initialize with default settings... const storage = require('Storage') From 18d1425ad725d26334fb954b15b2e56da7234cd5 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:16:33 -0500 Subject: [PATCH 042/183] made changes to when accelHandler gets overwritten, temporarily disabled button usage --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 39 +++++++++++++++++------------------- apps/multidice/metadata.json | 2 +- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ff191cf13..651233c63 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -16,3 +16,4 @@ 1.14: made the delay needlessly long to see if it even does anything 1.15: moved accel & vibration commands to the accelHandler function 1.16: enabled button usage & temporarily disabled acceleration +1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 0893fe470..3789dc04b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -81,22 +81,16 @@ function touchHandler (button, xy) { function accelHandler (xyz) { - Bangle.on ('accel', voidFn); // temporarily disable more acceleration events if (xyz.diff >= 0.3) { - menu = false; - rollDice(); + Bangle.on ('accel', voidFn); // temporarily disable more acceleration events - Bangle.buzz(50, 0.5).then (() => { + menu = false; + rollDice (function() { - setTimeout (function() { // wait 50ms *after* the buzzing has stopped - - Bangle.on ('accel', accelHandler); - }, 50); + Bangle.on ('accel', accelHandler); // re-enable acceleration events }); } - - Bangle.on ('accel', accelHandler); // re-enable acceleration events } function voidFn() { @@ -104,7 +98,7 @@ function voidFn() { return; } -function rollDice() { +function rollDice (timeoutFunctionRef) { resultsArr = new Uint8Array (8); for (i = 0; i < 8; i++) { @@ -133,6 +127,16 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } + + vibrate (timeoutFunctionRef); +} + +function vibrate (timeoutFunctionRef) { + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 50); + }); } function random (max) { @@ -142,17 +146,10 @@ function random (max) { drawMenu(); Bangle.on ('touch', touchHandler); -//Bangle.on ('accel', accelHandler); -setWatch (function() { +Bangle.on ('accel', accelHandler); +/*setWatch (function() { menu = false; rollDice(); - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (function() { // wait 50ms *after* the buzzing has stopped - - //Bangle.on ('accel', accelHandler); - }, 50); - }); -}, BTN, {repeat: true, edge: "falling", debounce: 10}); +}, BTN, {repeat: true, edge: "falling", debounce: 10});*/ diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 9b2148682..8a78fe22a 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.16", + "version":"1.17", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 05146ce283ef06bed856cac08164817e75607c03 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 19:17:29 +0100 Subject: [PATCH 043/183] change screenshots --- apps/bwclklite/screenshot.png | Bin 2841 -> 2022 bytes apps/bwclklite/screenshot_3.png | Bin 3031 -> 2307 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/bwclklite/screenshot.png b/apps/bwclklite/screenshot.png index 37acf7cc07edd69a42f300923ecb8bfbec97a9cc..e5eee966040bddbe4dfaa92bf2705fec429760c1 100644 GIT binary patch literal 2022 zcmeHIdo+{@6dzxo`c#-np@_`HNTQ*qkyo=sFO8Yxo$`h4K}Iafc&p8$ z`5M_`6n&|TRIH-(klDPpLh>3Bv(wo>_pkkP&)IvZi@1t>u!+=D^GAg%fzl>`i@Ik6z6oPhS9#b6etJK67GMF$M$ zw?`7zEma*>C=P~g&Kx?fUn4o2f{pCYi(h4QuB3=hCWqJiS=0y=(=eJ1BGBFby7mbj z6_B1RQd=|n@(E)cN?qWqWhWEm2nKMvi*B1FpuU!d&j=eeLR~R%O~CeC21mau7XyUV zpRg97B=Hs%@O|vJg9b34a|D3yPL9Ro-s_&9qYqEclt0`~h3>ZbxPD#^Un@4|FH`|r zi@wvgq&4Qbt{-<#LoL^`n^@Q`#$~cta5Ya24rV>G1G)Gy@M*M*AQTK9;tyPA=Nf!~ z-t9cHMjKuvvt4-}4X>SVQCd5~s6OIWZ6*kNMeu!1a()W9csPOC8)Fi&T~aML-n`!h zGA}*65YN+U&&BjtA)#Qu>uHZ8>dBE_AlJ%gS+Qd>nzL&g?4L4r)IY2tTZCw`MK;ho z{Diy>=iNJTipAnMGzYCe@D-sriZhUk2};t{H`)*M^ti{V9=Z@V z_icZJ=8N_6W66mbjF=_-$b3>z=|uLU6>znq;V07%>oQDZu+d|HpdelJRYWbM*fM30 z6Sl#`1txQTz!O!2{D99%!|_kw%S$OOj6rmoqyloqab9p-4^g^8NL~ixrf-g$IB-BZ zXK-hUywzrQ;$U}Gr$pXbDWA-FBaPB$pA85MJn@A_5JOWIOW~k*xuw|YttBgk%VD8e z6YzcqCntSzWwlRB*Xvi8E*Vi78x+{Vx}bvly3eRKCkOI9FJj@)r<`9yOh_ z2lgSEFR~6Cucu21yu>1W)=j9su`DX~>QvNIzD51qM3a1C%d!*{GLO$nMTsS*f|muW z-`H%5`+RGxyj}wSIjk76>3HiFcDE(in)^+SVgvg(-2uI`q+YM;1E3)jGs+=4Ga|>a zJ|?y|Q~Yu^#r391fxpxkt)L)v+>tz#TaxJ}3z~U9JNnueQoY~ox%08%g&i_eNh{xq zxe>IOjw+3at#Ty+ZF|j_vTc5kbL}y3rk!Vqh6-5lAnUplh$X362M=KF{(TTJ>}l`G zIPAUN=SOuHk>Z34q~SVipmO-2*kuVDZB03 zNnY&ot&I|o?rh<0O+J(tzAS`Cml5BF^zAP@8CW-4x%PR*g$HWilM;MMQQJZ8$JwtP zvm~5kfg$OF%uecWL}C0uBW1^!nXljF(hnL3JymeepY zYY%~6Y476|H4X0h>43}b`1{Bd<=CP*P6Q3I8IH|#TJcNe!AtQsLEkqc+gxSBf4Nh79zU#j{P7ca`S1j5D)yu0&$ zOwoaH-raiHmK5_x%#2XQs-s}qEXW`99Gv1toN?pGi3-M&s|_OEj}D?L=PMT_<+jv7 zaRu_m3LrK-*L%J8?;d2e)aF~CMD)Ss!awp*SNkfA7jp3hO;p^9#_O!UEL5gfUa{$A zN$A>pMa8$%P_uPC3i8&;4N2Qq~FaLY^jVIhnv@!(eay6{%VYq1JfR%aZdjQ DNjG3t literal 2841 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 bu7T|roXdI-%T9jpy1+p%KhG+6@|Ax8FvV5G diff --git a/apps/bwclklite/screenshot_3.png b/apps/bwclklite/screenshot_3.png index d52057569b0c80df6656e22333f4347e7552411a..573675d28c55b01ddd97e99a86fd5e53b2552290 100644 GIT binary patch literal 2307 zcmdT`X;4!M5)Lmg%rRuCJ;)!^@Mb zwq?f_6bhy0cHG5B5&8czNLk^lYX3n|1f@$pWM@=mC-#dX0WUeb`9cb?pzw4Q3gWrB z9Q9>TrXENWMvgw z@0z?9jsQ^R7OsksY+}iq2#g@-0EqZ1X?r$8I8cBBvT24brU%qB&95TdPvluB6a8PP zzm%*9g)=ix8V9G{JLGA|C8nSMUf}*iv)Ii_;PkI+u7~dZ9&J@V@6ADCb_EE0Gy}=` zcs}Q`!#1GaJ0Fedbt%^On$7DRfQstc@6vJSP2OS%&X(3Xu$C;L#3WX&$Iu(|QrQOR zi5<-Pn#d~0^%dj=$v%n7u^JisIKfy;`9_9{iE z#=ZE@O!$9H1nZ{}!05-$g8b?ATi~6<}>9#|!C>_fY3}M~Co7Y-`d7V%x zp}M8@WUy`kIBnASZUiGV&DgCD=-LzNe+ZiANn6^(Ht$#NP(QUbPgVnZ>JsXSQE6GE zGd+t8+-RTefenHZXxH0Vj)<1u3$)80WFXL*wcPv|6?CPJ{$Rp9!xKAJ;9t%*%F3MPDLz?9V=eMC64(UhH>=g zh|&d(i@)K=bTXsYCfC~VrDSK&f56f!QpI)8li&w0{vl@4X z!O>JU>CysV4_ytlmxV~0e|28?)Ggd?3sM7PE~sWm>N8dN8=)^bV%(H}^n>Z$QWfvh z4QH7rrUiMUL5~()1mv%6nTk0QlJ@Gu_Aax;AXEC2nlRV-zsxq&l!58p&GA@vx0b=o z=p6(4s(N7vk}J1R>SS}<%BOXK@{GepHu)hTWJb{alc6_#CkoHrLz#)5ertH*LH|i3wUIQ zagvySC@wR;irAjY=yyTEe|5?!xq(th%q&t%38VoY1v>!f)SJ6cJV4EtDmLdMA*26P zC|O#xT@{v`Du%BXqJZ|>+xR&sfc`i0`~Tk=G73^QJj9cK5@xPv4MjJ79V?SpNO_#9 zu~fwJ5yaZKD;nC^FC2+%HVkY;^U;DOqU}cD(#p96YJy}p0AU+4Dhv*;LhW{vNqKkv zC{Op90p#|Mw!d< zE@^vf?JBoP+=LER^+G=-=YS|9;K=e#gWg^M zv(lg9z7xjeXMCkM5zC(##p^RT7*ypaWIA@u@|YicKG7w#t0ESJ zJ-M&l^4`?=Ign!g-tM{qp*%dA1enHl=vi0!&Q-mi0?w+QA%XWmO+75X?J~sXgm;=b0d^1}w)U9iuMj z{aNBBnY53~e(dyl1R^G%L&1U?&b1k^4HU1+@d@;|C$~9K%{)SDwDxGNRNslXw$ydo z%bhCsZEVZg4nMX^o}o6oQ#+BF-SeNetUb@FN;Vez@7!ouTCwl`Mqsap-ie^aaJc=6 zk>!=2&rRiwyKywD3TnG5-u2oBX79RU|6>G~SYym@LdU_49*5@$bH}eCOt(s`w*|jO zO8XvnsA?hDD0^TlyToPQRX~nfU`?lYOESKExp~%#OgyeSc}P%cyiawpqgKc80$W>n z#j(KtusB$-dUup5wiGX0<4$X?sD2dJ>B8IsTK4igoyH8JwO|^d$SX8xVgk;qDCAga zhxB-U$=S$Hckrtleua4Zo3+_xrq=_A?*n=C0t zq=Hr)ZM6LPM5j)ps29G%0Y#(|AtFVQ!A_hZr?AHN8)ZA=GV8f#f<&Ue=1$Fi+cu~R zH`|gWXduRI%{{y+ckO#=RO2srlllX|?oCZ^mh4>R1iw}`^b9LK6mX?)Po#_`?|ozS zZ2yThs~Z&mvSs9o+ViIBaqFJo3CcM|yO4=~6C?e2YZuPozH8PjXXl>9?>cb2t-QwSIQ^?Mz_Q|5+kh`+~w+0z|WfR)o uYgM~s{=uq_HmAT@PLAf3Cbg6WvUi&9?DnP0L literal 3031 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 From fd33d8445e0f346852f83fbfd0102eebfe92643f Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 19:17:42 +0100 Subject: [PATCH 044/183] weatherclock v0.06 --- apps/weatherClock/metadata.json | 4 ++-- apps/weatherClock/{weatherClock.settings.js => settings.js} | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename apps/weatherClock/{weatherClock.settings.js => settings.js} (94%) diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 38f3eccca..270591c74 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -6,7 +6,7 @@ "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "dependencies": {"weather":"app"}, - "screenshots": [{"url":"screens/screen1.png"}, {"url":"screens/screen2.png"}], + "screenshots": [{"url":"screens/screen1.png"}], "type": "clock", "tags": "clock, weather", "supports": ["BANGLEJS","BANGLEJS2"], @@ -15,7 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} + {"name":"weatherClock.settings.js","url":"settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/settings.js similarity index 94% rename from apps/weatherClock/weatherClock.settings.js rename to apps/weatherClock/settings.js index 658630696..9597e7066 100644 --- a/apps/weatherClock/weatherClock.settings.js +++ b/apps/weatherClock/settings.js @@ -25,21 +25,21 @@ E.showMenu({ '': { 'title': 'Weather Clock' }, '< Back': back, - 'Show DoW': { + 'Day Of Week': { value: !!s.day, onchange: v => { s.day = v; save(); }, }, - 'Show Date': { + 'Date': { value: !!s.date, onchange: v => { s.date = v; save(); }, }, - 'Show Wind': { + 'Wind Speed': { value: !!s.wind, onchange: v => { s.wind = v; From 137ad32d85db502a97a6c6848c31a6412f79ec41 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:19:53 +0100 Subject: [PATCH 045/183] match new screenshot for clock info --- apps/bwclklite/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/bwclklite/README.md b/apps/bwclklite/README.md index 974411be0..1ad320894 100644 --- a/apps/bwclklite/README.md +++ b/apps/bwclklite/README.md @@ -5,9 +5,9 @@ This is a fork of a very minimalistic clock. ## Features The BW clock implements features that are exposed by other apps through the `clkinfo` module. -For example, if you install the HomeAssistant app, this menu item will be shown if you first -touch the bottom of the screen and then swipe left/right to the home assistant menu. To select -sub-items simply swipe up/down. To run an action (e.g. trigger home assistant), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: +For example, if you install the Simple Timer app, this menu item will be shown if you first +touch the bottom of the screen and then swipe left/right to the Simple Timer menu. To select +sub-items simply swipe up/down. To run an action (e.g. add 5 min), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: ![](screenshot_3.png) From 3bec7ffcdb00c50168018b18322cda00c98ca2d9 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:21:41 +0100 Subject: [PATCH 046/183] Indentation --- apps/bwclklite/ChangeLog | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/bwclklite/ChangeLog b/apps/bwclklite/ChangeLog index 8b79a4c4e..c728997da 100644 --- a/apps/bwclklite/ChangeLog +++ b/apps/bwclklite/ChangeLog @@ -31,7 +31,6 @@ clkinfo.addInteractive that would cause ReferenceError. 0.29: use setItem of clockInfoMenu to change the active item 0.30: Use widget_utils 0.31: Use clock_info module as an app -0.32: Diverge from BW Clock. Change out the custom font for a standard bitmap - one to speed up loading times. Remove invertion of theme as this doesn't - work very well with fastloading. Do an quick inital fillRect on the - clock info area. +0.32: Diverge from BW Clock. Change out the custom font for a standard bitmap one to speed up loading times. + Remove invertion of theme as this doesn'twork very well with fastloading. + Do an quick inital fillRect on theclock info area. From 3a5a6f47a58322bfe8b7da6b20187db43e4d9a8b Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:27:12 -0500 Subject: [PATCH 047/183] decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 10 +++++----- apps/multidice/metadata.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 651233c63..ec0d407b8 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -17,3 +17,4 @@ 1.15: moved accel & vibration commands to the accelHandler function 1.16: enabled button usage & temporarily disabled acceleration 1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage +1.18: decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 3789dc04b..940de3eb3 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -83,12 +83,12 @@ function accelHandler (xyz) { if (xyz.diff >= 0.3) { - Bangle.on ('accel', voidFn); // temporarily disable more acceleration events + //Bangle.on ('accel', voidFn); // temporarily disable more acceleration events menu = false; rollDice (function() { - Bangle.on ('accel', accelHandler); // re-enable acceleration events + //Bangle.on ('accel', accelHandler); // re-enable acceleration events }); } } @@ -147,9 +147,9 @@ function random (max) { drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', accelHandler); -/*setWatch (function() { +setWatch (function() { menu = false; - rollDice(); + rollDice (voidFn); -}, BTN, {repeat: true, edge: "falling", debounce: 10});*/ +}, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 8a78fe22a..7b45f11eb 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.17", + "version":"1.18", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From f5211fff10e559cf4694449bc0f32621ba3221d4 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 19:30:42 +0100 Subject: [PATCH 048/183] use screenshot with widgets --- apps/bwclklite/screenshot.png | Bin 2022 -> 2489 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/bwclklite/screenshot.png b/apps/bwclklite/screenshot.png index e5eee966040bddbe4dfaa92bf2705fec429760c1..28983c9c44158b1929ef0d8a890321992dc3990f 100644 GIT binary patch literal 2489 zcmds(dpOf?8^C8KLo&xn&U+m)ksMOZLPq3#m{UJie#K}tWWPBK-%4Z-Z%C4D2^};> zV)CQDl|%HhlBOJ&L(Z9sRl;xm|Ni&>_ukj_-1qfd&wbz5bwAhhdG7m)x2KD|tcENE z0+Dw;>f|f7b-x#Un^<$WQ((a zOAH`x!FW5aaBFLJ@eapR3t2%ofLYD-E-s#tEU?v#$Z6n+hL_g9Z|Q8>>t=wHE6t>``i&G` z3(AfKcxrR31PW9<=E39IsoB@vH`ce5%;+2Hz;)5ocgGdDg*X10)|FwkZ0 zBOa9v#@ix8I^3ZR8F0oB4_>S-SZiGNM~Ym30vT)x5*z!?Tl)XO~J@f zG%IK%2HH<4ZpU%Pm%z)*`0z{$ORxJs6^n*-UvbWTH=8$Na@%sMSj$q*V+YExW+r*n zm2wVL<-m0_rv>`M2)4*CtK!md8fzm(K^oAihEcS3lTTzcnO(pGqOSNgixAh5{!Xbx zN%`}aH4Mm;$YIekvd{UK%0LSwl_kj{>Gk15rxG-fBeYB4Fd}5EoyHBo3rgEp_q4~f zVKHS(Rio!D*5z$78*}>esntQ~Z?d1-tKN-1djU*#);pi(m+9 z53zgC{QRaRwvyP6TBi_lw$GA}{0CH(KbN#*+oa5qJ6pP{ZgiG>n2W-DWSq9#6yJ z1lU`O%?g9j{?lt(39{wKZQX84lvEbMO;2Q#E`hNaMcce8O&Q>n|LG$z8^v7Wtr7k; zIfnzT-f_9*gh(9W=9_=3W&6W1A2}bgON)A2_|)PWAB8}?HmnK0v7XYR+8khe>>i)0 zW`iCNPQ$&VjW?|M#1FgMdSlr=>n` zFA>sYwjSXe|Xe8c5NuS()%J+(*0UUZ= zMt3jtsbX`|x`)#XKHL{v8zACD`vg81w#@SQWe+@Ptnhg ziy=LBtWj;SW~qAB>~Txy|Kv3tsabv06!@4rEFTWENd{G=6+tQ{oThV`=CC|NlMy23 zK~mAtn%IzGqZ5o}bDM4rDurn*;oNbhXIC#n)wVQhMwP1bB;jxhMYdd5IAUG&J#bi8 z7!a4ck;Ep5pTKx7f3{;^uVORLzaA?3=r-^#D7*|-YDI(Vl67jGJoM8+*ITY{Ga>)= zki4~(^5tp~-3kFWN(Vn4l__zB0G7l;bQuJii83G^)3+iN4Hjd31K7N>sx)8 zsc_P`HuyXrR4ebs>KOFjYgJ1Xv*)q)!}zN6bfXYehl_g1bGc$=!pS)7PDn^+O5dH$ zbetGHTlJ%a@hU7DwgY2ugEsN*=KzI2-%QiiQUIRHI9=R8ubkGAhN6V8B$^PaJKebI zYv6pYh_b6uDX-^2;SXXWQGva~n{-!glepq<7JcX%Ysl;%M}yav;Vpfy$xm+U5!D3Q z$msDRAsK8L_1^VvOI z^~JS;+n>B+oCW*tNAU(P4^&M`xLja2iA{5^G?VAqU W-{ce}`{?&9264rCI@LN7F8l*+;e2@j literal 2022 zcmeHIdo+{@6dzxo`c#-np@_`HNTQ*qkyo=sFO8Yxo$`h4K}Iafc&p8$ z`5M_`6n&|TRIH-(klDPpLh>3Bv(wo>_pkkP&)IvZi@1t>u!+=D^GAg%fzl>`i@Ik6z6oPhS9#b6etJK67GMF$M$ zw?`7zEma*>C=P~g&Kx?fUn4o2f{pCYi(h4QuB3=hCWqJiS=0y=(=eJ1BGBFby7mbj z6_B1RQd=|n@(E)cN?qWqWhWEm2nKMvi*B1FpuU!d&j=eeLR~R%O~CeC21mau7XyUV zpRg97B=Hs%@O|vJg9b34a|D3yPL9Ro-s_&9qYqEclt0`~h3>ZbxPD#^Un@4|FH`|r zi@wvgq&4Qbt{-<#LoL^`n^@Q`#$~cta5Ya24rV>G1G)Gy@M*M*AQTK9;tyPA=Nf!~ z-t9cHMjKuvvt4-}4X>SVQCd5~s6OIWZ6*kNMeu!1a()W9csPOC8)Fi&T~aML-n`!h zGA}*65YN+U&&BjtA)#Qu>uHZ8>dBE_AlJ%gS+Qd>nzL&g?4L4r)IY2tTZCw`MK;ho z{Diy>=iNJTipAnMGzYCe@D-sriZhUk2};t{H`)*M^ti{V9=Z@V z_icZJ=8N_6W66mbjF=_-$b3>z=|uLU6>znq;V07%>oQDZu+d|HpdelJRYWbM*fM30 z6Sl#`1txQTz!O!2{D99%!|_kw%S$OOj6rmoqyloqab9p-4^g^8NL~ixrf-g$IB-BZ zXK-hUywzrQ;$U}Gr$pXbDWA-FBaPB$pA85MJn@A_5JOWIOW~k*xuw|YttBgk%VD8e z6YzcqCntSzWwlRB*Xvi8E*Vi78x+{Vx}bvly3eRKCkOI9FJj@)r<`9yOh_ z2lgSEFR~6Cucu21yu>1W)=j9su`DX~>QvNIzD51qM3a1C%d!*{GLO$nMTsS*f|muW z-`H%5`+RGxyj}wSIjk76>3HiFcDE(in)^+SVgvg(-2uI`q+YM;1E3)jGs+=4Ga|>a zJ|?y|Q~Yu^#r391fxpxkt)L)v+>tz#TaxJ}3z~U9JNnueQoY~ox%08%g&i_eNh{xq zxe>IOjw+3at#Ty+ZF|j_vTc5kbL}y3rk!Vqh6-5lAnUplh$X362M=KF{(TTJ>}l`G zIPAUN=SOuHk>Z34q~SVipmO-2*kuVDZB03 zNnY&ot&I|o?rh<0O+J(tzAS`Cml5BF^zAP@8CW-4x%PR*g$HWilM;MMQQJZ8$JwtP zvm~5kfg$OF%uecWL}C0uBW1^!nXljF(hnL3JymeepY zYY%~6Y476|H4X0h>43}b`1{Bd<=CP*P6Q3I8IH|#TJcNe!AtQsLEkqc+gxSBf4Nh79zU#j{P7ca`S1j5D)yu0&$ zOwoaH-raiHmK5_x%#2XQs-s}qEXW`99Gv1toN?pGi3-M&s|_OEj}D?L=PMT_<+jv7 zaRu_m3LrK-*L%J8?;d2e)aF~CMD)Ss!awp*SNkfA7jp3hO;p^9#_O!UEL5gfUa{$A zN$A>pMa8$%P_uPC3i8&;4N2Qq~FaLY^jVIhnv@!(eay6{%VYq1JfR%aZdjQ DNjG3t From f635e37263566ed5f406f73a862f27ec6118dd05 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 19:35:00 +0100 Subject: [PATCH 049/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/metadata.json | 2 +- apps/weatherClock/weatherClock.settings.js | 50 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 apps/weatherClock/weatherClock.settings.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index ffaf87d1e..1476ffc34 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev-New settings to (un)hide day of week, date and wind speed. +0.06: Dev2-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 270591c74..0b7987ee5 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -15,7 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"settings.js"} + {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js new file mode 100644 index 000000000..9597e7066 --- /dev/null +++ b/apps/weatherClock/weatherClock.settings.js @@ -0,0 +1,50 @@ +(function(back) { + const SETTINGS_FILE = "weatherClock.json"; + + // initialize with default settings... + let s = { + 'day': true, + 'date': true, + 'wind': true + } + + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + let settings = storage.readJSON(SETTINGS_FILE, 1) || {} + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + E.showMenu({ + '': { 'title': 'Weather Clock' }, + '< Back': back, + 'Day Of Week': { + value: !!s.day, + onchange: v => { + s.day = v; + save(); + }, + }, + 'Date': { + value: !!s.date, + onchange: v => { + s.date = v; + save(); + }, + }, + 'Wind Speed': { + value: !!s.wind, + onchange: v => { + s.wind = v; + save(); + }, + } + }) +}) From c2d694cabc8a7fed4c78cfefa9f3e1a983a353fd Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:36:24 -0500 Subject: [PATCH 050/183] added longer delay before resetting accelHandler --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 6 +++--- apps/multidice/metadata.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ec0d407b8..c47d4c8ff 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -18,3 +18,4 @@ 1.16: enabled button usage & temporarily disabled acceleration 1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage 1.18: decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering +1.19: added longer delay before resetting accelHandler diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 940de3eb3..82561853e 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -83,12 +83,12 @@ function accelHandler (xyz) { if (xyz.diff >= 0.3) { - //Bangle.on ('accel', voidFn); // temporarily disable more acceleration events + Bangle.on ('accel', voidFn); // temporarily disable more acceleration events menu = false; rollDice (function() { - //Bangle.on ('accel', accelHandler); // re-enable acceleration events + Bangle.on ('accel', accelHandler); // re-enable acceleration events }); } } @@ -135,7 +135,7 @@ function vibrate (timeoutFunctionRef) { Bangle.buzz(50, 0.5).then (() => { - setTimeout (timeoutFunctionRef, 50); + setTimeout (timeoutFunctionRef, 150); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 7b45f11eb..aec4455f4 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.18", + "version":"1.19", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From d3d96e3782d7e0d24833f69580196ccf06325860 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 19:46:39 +0100 Subject: [PATCH 051/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/metadata.json | 4 +- apps/weatherClock/weatherClock.settings.js | 50 ---------------------- 3 files changed, 3 insertions(+), 53 deletions(-) delete mode 100644 apps/weatherClock/weatherClock.settings.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 1476ffc34..07ef8c118 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev2-New settings to (un)hide day of week, date and wind speed. +0.07: Dev-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 0b7987ee5..88057c8dd 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -2,7 +2,7 @@ "id": "weatherClock", "name": "Weather Clock", "shortName": "Weather Clock", - "version": "0.06", + "version": "0.07", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "dependencies": {"weather":"app"}, @@ -15,7 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} + {"name":"weatherClock.settings.js","url":"settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js deleted file mode 100644 index 9597e7066..000000000 --- a/apps/weatherClock/weatherClock.settings.js +++ /dev/null @@ -1,50 +0,0 @@ -(function(back) { - const SETTINGS_FILE = "weatherClock.json"; - - // initialize with default settings... - let s = { - 'day': true, - 'date': true, - 'wind': true - } - - // ...and overwrite them with any saved values - // This way saved values are preserved if a new version adds more settings - const storage = require('Storage') - let settings = storage.readJSON(SETTINGS_FILE, 1) || {} - const saved = settings || {} - for (const key in saved) { - s[key] = saved[key] - } - - function save() { - settings = s - storage.write(SETTINGS_FILE, settings) - } - - E.showMenu({ - '': { 'title': 'Weather Clock' }, - '< Back': back, - 'Day Of Week': { - value: !!s.day, - onchange: v => { - s.day = v; - save(); - }, - }, - 'Date': { - value: !!s.date, - onchange: v => { - s.date = v; - save(); - }, - }, - 'Wind Speed': { - value: !!s.wind, - onchange: v => { - s.wind = v; - save(); - }, - } - }) -}) From 32865ce94bdcf99b180c7bd35a7663b521086b6e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:17:21 -0500 Subject: [PATCH 052/183] Added app.js to this repository --- apps/multidice/app.js | 169 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 apps/multidice/app.js diff --git a/apps/multidice/app.js b/apps/multidice/app.js new file mode 100644 index 000000000..d0f62b8e9 --- /dev/null +++ b/apps/multidice/app.js @@ -0,0 +1,169 @@ +var menu = true; +var diceOpts = {amount: 2, selected: 5}; // TODO: grab values from settings +const DICE_ARRAY = [4, 6, 8, 10, 12, 20, 100]; // TODO: place in settings + +function drawMenu() { + + g.clear(); + g.setFont ("6x8", 2); + + g.drawString ("# of dice:", 5, 5); + g.drawString (diceOpts.amount, 137, 5); + + g.drawString ("dice:", 5, 32); + g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); +} + +function touchHandler (button, xy) { + + if (menu) { + + if (xy.y <= 26) { // selecting number of dice + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.amount > 1) + diceOpts.amount--; + } else { // right edge: increase + + if (diceOpts.amount < 6) + diceOpts.amount++; + } + + drawMenu(); + } else if (xy.y <= 53) { // selecting dice type + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.selected > 0) + diceOpts.selected--; + } else { // right edge: increase + + if (diceOpts.selected < DICE_ARRAY.length - 1) + diceOpts.selected++; + } + + drawMenu(); + } else { + + rollDice(); + } + } else { // return to menu screen + + menu = true; + drawMenu (); + } +} + +function rollDice() { + + menu = false; + if (diceOpts.amount == 1) { + + let output = random (DICE_ARRAY [diceOpts.selected]); + + g.clear(); + g.setFont ("Vector", 90); + + g.drawString ((" " + output).slice (-3), 10, 0); + } else { + + let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); + for (let i = 0; i < diceOpts.amount; i++) { + + output [i] = random (DICE_ARRAY [diceOpts.selected]); + } + + g.clear(); + g.setFont ("Vector", 40); + + for (let i = 0; i < 3; i++) { // draws all the numbers in two rows + + if (output [i * 2 + 0] == -1) { + + break; + } else if (output [i * 2 + 1] == -1) { + + + g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); + } else { + + g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); + } + } + + g.setFont ("Vector", 20); + g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); + g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); + g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); + g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); + } +} + +function random (max) { // number is always between 1 and max + + return Math.round (Math.random() * (max - 1) + 1); +} + +function max (array) { + + let max = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] > max) + max = array [i]; + } + + return max; +} + +function min (array) { + + let min = array [0]; + for (let i = 1; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] < min) + min = array [i]; + } + + return min; +} + +function total (array) { + + let total = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + total += array [i]; + } + + return total; +} + +function average (array) { + + let average = 0; + let rounds = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + average += array [i]; + rounds++; + } + + return Math.round (average / rounds); +} + +drawMenu(); +Bangle.on ('touch', touchHandler); From 457a395617c08c6a04a5b1eb60a8d0fc36ff1f85 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:28:29 -0500 Subject: [PATCH 053/183] added a one-line changelog, and filled out the metadata.json file --- apps/multidice/ChangeLog | 1 + apps/multidice/metadata.json | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 apps/multidice/ChangeLog create mode 100644 apps/multidice/metadata.json diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog new file mode 100644 index 000000000..1c7728b3d --- /dev/null +++ b/apps/multidice/ChangeLog @@ -0,0 +1 @@ +0.90: got most of the features done, lacking some polish and real-hardware testing diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json new file mode 100644 index 000000000..b42c2ba16 --- /dev/null +++ b/apps/multidice/metadata.json @@ -0,0 +1,14 @@ +{ "id": "multidice", + "name": "multiple dice roller", + "shortName":"multidice", + "version":"0.90", + "description": "roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"multidice.app.js","url":"app.js"}, + {"name":"multidice.img","url":"app-icon.js","evaluate":true} + ] +} From a8ba6e678b6446a2d296b7a885ca59f3fe546ad5 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:31:32 -0500 Subject: [PATCH 054/183] left README.md incomplete so I can emulate + add screenshots --- apps/multidice/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/multidice/README.md diff --git a/apps/multidice/README.md b/apps/multidice/README.md new file mode 100644 index 000000000..23a485d63 --- /dev/null +++ b/apps/multidice/README.md @@ -0,0 +1,25 @@ +# multiple dice roller + +roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name From 76f3fe6c0c4e00d23b6e5178cdcc8b3f96401029 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 19:57:31 -0500 Subject: [PATCH 055/183] toggled the enable emulation flag in metadata.json --- apps/multidice/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index b42c2ba16..1a41cf09f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -7,6 +7,7 @@ "tags": "", "supports" : ["BANGLEJS2"], "readme": "README.md", + "allow_emulator": true, "storage": [ {"name":"multidice.app.js","url":"app.js"}, {"name":"multidice.img","url":"app-icon.js","evaluate":true} From 0c3aad9b10739e98d1120cd4e9a91496ffd5ae04 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 20:10:09 -0500 Subject: [PATCH 056/183] forgot to switch from hard tabs to soft tabs --- apps/multidice/app.js | 278 +++++++++++++++++++++--------------------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index d0f62b8e9..d11bc99d5 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,166 +3,166 @@ var diceOpts = {amount: 2, selected: 5}; // TODO: grab values from settings const DICE_ARRAY = [4, 6, 8, 10, 12, 20, 100]; // TODO: place in settings function drawMenu() { - - g.clear(); - g.setFont ("6x8", 2); - - g.drawString ("# of dice:", 5, 5); - g.drawString (diceOpts.amount, 137, 5); - - g.drawString ("dice:", 5, 32); - g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); + + g.clear(); + g.setFont ("6x8", 2); + + g.drawString ("# of dice:", 5, 5); + g.drawString (diceOpts.amount, 137, 5); + + g.drawString ("dice:", 5, 32); + g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); } function touchHandler (button, xy) { - - if (menu) { - - if (xy.y <= 26) { // selecting number of dice - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.amount > 1) - diceOpts.amount--; - } else { // right edge: increase - - if (diceOpts.amount < 6) - diceOpts.amount++; - } - - drawMenu(); - } else if (xy.y <= 53) { // selecting dice type - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.selected > 0) - diceOpts.selected--; - } else { // right edge: increase - - if (diceOpts.selected < DICE_ARRAY.length - 1) - diceOpts.selected++; - } - - drawMenu(); - } else { - - rollDice(); - } - } else { // return to menu screen - - menu = true; - drawMenu (); - } + + if (menu) { + + if (xy.y <= 26) { // selecting number of dice + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.amount > 1) + diceOpts.amount--; + } else { // right edge: increase + + if (diceOpts.amount < 6) + diceOpts.amount++; + } + + drawMenu(); + } else if (xy.y <= 53) { // selecting dice type + + if (xy.x <= 87) { // left edge: decrease + + if (diceOpts.selected > 0) + diceOpts.selected--; + } else { // right edge: increase + + if (diceOpts.selected < DICE_ARRAY.length - 1) + diceOpts.selected++; + } + + drawMenu(); + } else { + + rollDice(); + } + } else { // return to menu screen + + menu = true; + drawMenu (); + } } function rollDice() { - - menu = false; - if (diceOpts.amount == 1) { - - let output = random (DICE_ARRAY [diceOpts.selected]); - - g.clear(); - g.setFont ("Vector", 90); - - g.drawString ((" " + output).slice (-3), 10, 0); - } else { - - let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); - for (let i = 0; i < diceOpts.amount; i++) { - - output [i] = random (DICE_ARRAY [diceOpts.selected]); - } - - g.clear(); - g.setFont ("Vector", 40); - - for (let i = 0; i < 3; i++) { // draws all the numbers in two rows - - if (output [i * 2 + 0] == -1) { - - break; - } else if (output [i * 2 + 1] == -1) { - - - g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); - } else { - - g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); - } - } - - g.setFont ("Vector", 20); - g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); - g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); - g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); - g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); - } + + menu = false; + if (diceOpts.amount == 1) { + + let output = random (DICE_ARRAY [diceOpts.selected]); + + g.clear(); + g.setFont ("Vector", 90); + + g.drawString ((" " + output).slice (-3), 10, 0); + } else { + + let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); + for (let i = 0; i < diceOpts.amount; i++) { + + output [i] = random (DICE_ARRAY [diceOpts.selected]); + } + + g.clear(); + g.setFont ("Vector", 40); + + for (let i = 0; i < 3; i++) { // draws all the numbers in two rows + + if (output [i * 2 + 0] == -1) { + + break; + } else if (output [i * 2 + 1] == -1) { + + + g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); + } else { + + g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); + } + } + + g.setFont ("Vector", 20); + g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); + g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); + g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); + g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); + } } function random (max) { // number is always between 1 and max - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } function max (array) { - - let max = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] > max) - max = array [i]; - } - - return max; + + let max = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] > max) + max = array [i]; + } + + return max; } function min (array) { - - let min = array [0]; - for (let i = 1; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] < min) - min = array [i]; - } - - return min; + + let min = array [0]; + for (let i = 1; i < 6; i++) { + + if (array [i] == -1) + break; + + if (array [i] < min) + min = array [i]; + } + + return min; } function total (array) { - - let total = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - total += array [i]; - } - - return total; + + let total = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + total += array [i]; + } + + return total; } function average (array) { - - let average = 0; - let rounds = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - average += array [i]; - rounds++; - } - - return Math.round (average / rounds); + + let average = 0; + let rounds = 0; + for (let i = 0; i < 6; i++) { + + if (array [i] == -1) + break; + + average += array [i]; + rounds++; + } + + return Math.round (average / rounds); } drawMenu(); From 2657090d4ebef0540fa495a653dc6a617d8094ca Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 20:26:04 -0500 Subject: [PATCH 057/183] filled out the README.md, and added screenshots of the app. --- apps/multidice/2d20.png | Bin 0 -> 2352 bytes apps/multidice/README.md | 19 ++++++++++++------- apps/multidice/d100.png | Bin 0 -> 1936 bytes apps/multidice/main.png | Bin 0 -> 1547 bytes apps/multidice/menuPercent.png | Bin 0 -> 1467 bytes 5 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 apps/multidice/2d20.png create mode 100644 apps/multidice/d100.png create mode 100644 apps/multidice/main.png create mode 100644 apps/multidice/menuPercent.png diff --git a/apps/multidice/2d20.png b/apps/multidice/2d20.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c52b839b07e4237582668126be172707a6309c GIT binary patch literal 2352 zcmeH}`8V5%7Qo{xOkzd_#Vcy5B{VfUlxJGCHI){nQIbY%XADt0ovNMG(W1zs_H~NX zl0=AoZ8};@#8$B{jkR7ap|Mph&->+_^ZtkV;okepz2~0u`P?6F!hLI$sEDix2m}(n zdk1NIR;<5aF{-Z(MQ)fgt;Lk*0Pb&KvpjVbcabfd_e~L(NSUyd6!68YR;(HJj)$ z7_+h+NrGAG zTfsy{Qnz-@sQ(^@J@5Cf^&jlQeHx&swW(>A!6YpDyHj%eaNNm!y!Tr&GxcGK?d?TH z0mXt5G&jC;U5`Ft&}YMid|8E3lRl;S2A5NiSOd1BxAzGvGz&@vMaJD=FxiGr4HIoT>s zns-RsQQ<@q>dM+Q}P3S=$f0x=7nDJ1_IGr+JbGgBz;f zw5J`kXTl3RQO~j?eKYTINQZ|tVRJ72MRUiN1sOm3KraX}PUVTy?>RG^79XS2_Umo0 zn1r$bF?q02S!SxvgXvczGzDc?lX(kkJP)n`ma2MhNxE(?rmquX<=*aa0K=iM1QJyK8*A=VM?Qh$P_ zOUW}{SY(c*NrtFR3^!jk>wA9R-neBiQc>y(>_BN&dSV!cFr!H5+!$D$5;xc`)RP-% zFiNAsdpy~xQCO$x+D(kVl$8PT6@06~5n6Yt)c%<{Ut=w~t4IDk>tQ48Ax=XNwyIpc zWa((*<|rr-2Lcf3s1%7QZ?Vd6UN>1m}L!xT~T@_{N<`(C^D24>hE3?p%07T7RhuQq;sJ<{oM^Hp820crGFeLi+>rdd>pTFV-Y@RT1Oe0Lx7+`6+hq7r2akhE#^3dUYCa8_fuWzFLwYKqU^3#k(*?p#iTZv~^pOUFJ#sC^Z7Mxh>z zU&A+NPmXPgDmmvNlewPO;1gxpKvod;%jmCz)_%(`gZW@g?)q#XYr^6l7)qq8Z1s`Z z1>0`mIo`^8qm#QXjhdjpIhj?mn(5dqOzu{}eNqotUKp)m{A=^8x*4vK6@YQ#EasHE z0|@#X%;u`fka+319)TX>T=X{lA})dRgwRc+lERX7(2V98d^`*9=23t;SqVvc2UBgdo#hs z-c@@?-XCi2BRY3s6F(q99 zD`CRTsLP?`gMcg*cV-3{7NX|6av6U0h!mQRy}0b;FFX@1N1D6*`x;@-`DXCS@uS@t z+ID&e!{6SS?}Xucz6(#S-9-piyG5E@I1asFMN((h&Ty^ zI82fAid#jf3dk%&VjkW8B+7JBB!@O=u~T)Zu~hiLf6Rf=UcQ?p9TM$jJ{aqDOodUp zlg(1V^vyCoXU^J*Lw$#%>yrg^$S{pB8I>+ylcK-FM!nG}8gs*YES|wN{$%n`(vQ=k zfrkTEamFpZ9?taV5vrl8QMW%y0SGxO>89V%NdiQ#Gne<$w=>UNlACg5>E1>@ zbE)a4PEn6xjv_DkYYKp!6Z3j2p-KUI=q|hkh?uqD!T8_kfy|B(&Y>3Jee>)S0^PlB KjjS?refA&Y2tz>t literal 0 HcmV?d00001 diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 23a485d63..b33365d49 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -1,25 +1,30 @@ # multiple dice roller -roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice +roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all the dice -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) +![the start-up screen](main.png) +![two rolled dice](2d20.png) +![the startup screen](menuPercent.png) +![one large dice](d100.png) ## Usage -Describe how to use it +On the menu screen: tap to the right or left of the "# of dice" option to change how many dice to roll, & tap to the left or right of the "dice" option to select a different type (currently hard-coded to only allow DnD dice). To roll the dice, simply tap anywhere else on the screen. To go back to the dice selector. + +Once you're no longer on the menu screen, tap anywhere on the screen to return to the menu (W.I.P: shaking the watch to allow rolling dice again without having to go to the menu every time) ## Features -Name the function +roll anywhere from 1-6 dice (d4, d6, d8, d10, d12, d20, & d percentile). If only one dice is selected, it simply displays the output; if two or more dice are selected it also displays basic stats such as the highest & lowest roll, the total sum, and the average of all the dice. ## Controls -Name the buttons and what they are used for +No button is used in the app, it simply uses touch controls (W.I.P: accelerometor to roll the dice & compatability with the bangle.js 1). ## Requests -Name who should be contacted for support/update requests +Le3Kat@gmail.com ## Creator -Your name +Le~Kat diff --git a/apps/multidice/d100.png b/apps/multidice/d100.png new file mode 100644 index 0000000000000000000000000000000000000000..16350db1657632de685f8c0289d84112b8334f6d GIT binary patch literal 1936 zcmeHI`%{t$6vZ#UM6wA~EK76=-;AcEtENyPCak5DDLs6xWtv7>t*fSF>_BBDRGVp; zT4vHtDr{PsDB`2(HAbeE76Q7I_yWuaqN1z+!R|~y_QSnr=AOB8XU@5IZVn|la5Zc_ z3<80yCXSF4DEK#Ztl;*NdkQDcQ2zi;$00rM9Zm3?;c*IVIt53%B+ z>yx4mKY38ka<@IL(=KK&&V&FqzsO5PHn;E4vJsS+fSCjUHs3Mc+W?G+0?jCL4qN;c zIg_&@{|)$g+&FsFDh>|{J12``)VU$%x`YWQjm^l;m4%Mq_6+(qii(=;FJ{f?-p*dW za;v!tu2W9Xx8VAW8#ebGx+YM)2rN-AxKU!}BU|TKC{r#p>p`cx>@P4FR*R9}7i*O- zy}OO?SZES*IQZqVNm`j`sil`S=HZZ%D7tTppUvW06r2yjGp{zj#Md&ey%gIh`bTy1npI(Ue_NY$HD7A?jt@TNv0&uoIJW?il+--h?Q3jh6hIUUI3__z=!}) zojH-(_PgwMn7Nv~%PZB|DL7~-RI$vjNKau)+1Q{Djo}O;_=kIJ6OXOxm#iyiH{li{A#v{dIh5Baf zZ=ybZxEs58tV1egc$p4alwuUBVl7GHo)4(e*|p`N=c}&zW=b#flb+7$ag4Raq9Qc! zM%`&wP@2i~kTC@Q;qusbfss-t0=KP*o*dWblkcFhpsPgz1WvyAdXKNB#aEL$(y@c* zm!aOnE^bdoi+bO?v?;F&<|==(!W9BkrC0Vv0WEIdJMy=)Vz0!f@f{f~$lfMrv}rCh z96j!qA9aRG-%c8O^!jH6HNEUDk-_))UGiF5~lixc@d}K~dERs%v$M%G6>bf;SZ%;2@b26mqlGDN<@l| zIN0a<)ac{zjHxWxyxbdw{x%#F-56wb3=f{Y=3%_`fCS-i>QfeMmut<3HaJCI;CP$~ zr^FE2Z?6MjR%WbRH~`!A@PL{BcE;gSK7z2FVeFX{3w2D{W&Se(>gaaw=x!4Oke$=A z6KVk3cU9z|?~2^_^gx$@dE3+7(A?V|wgGKuUO=g~KYtE*LHrfNJO`L1{uuT{#_zTu a^F~jqKDvZ8uF)=iS_nBHm{>)K`Qu-37+f|0 literal 0 HcmV?d00001 diff --git a/apps/multidice/main.png b/apps/multidice/main.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca8f963174c7da421bc8d8abfd3391a64f13492 GIT binary patch literal 1547 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v?ipf%TH7i(^Pd+}qg?%Vq@#u)Y3m zUvhi$5wnLK)#3p=?)&_2DoRgxSn~1P@Av!T{}nS$_Ir?aVDhZuoASa23C=UBnAmK# z+KJ~MFf;hdvW(|P*=}2zU#s`^-|OH0?cddJE4g?6c*I-b5Fnbdwf2F)yG?~m{>*V* zmeE%tkK4cAAw75Bo7DIJo=7tqK4{dG{P29jGR}(Jh2Gbz-&?w~2dzziZ}l$b?qi+r z>#rG}ie8)k#o}rm^YeH81?zvvK6og)L#UGdzV(8@g;%S-ty|2M)_c97K5l0JCxfb_ z+8QmJ-}85b-(?P$Kbd`d_4U#N``<_JeZP9U{`J4_9_P-z{ppDLgY}&fAD$;4S}T9^ zD(43C8}B&FzkIBVsoBHy|9{b^RSCNsL$~|5-#t`%SZeRn*Zbbj`@6UG$G5k)8s;xI z@jbA9A5%!UO1|Q}`%WR@YqIuTeZ9VWZ8tzQ?{ zh*ah7e>FLM=el?9uL9r4105#b@ovtl((uy(|h7TI^L(_^h@6Z4b`8E-gg6OeYGP`zo;b~*ju^t`%xe*F8rvdO8ACI z!Po14SHIm8x_g^*jsJm$waKqI_ozHrss89uxO%}A`493xKUXuG-FV39BVO<|c+x9z zma8+rt!u3Cx4ZM=uRoVqxYtO%$|8Gs*>-Ej66IQ)t+vEQ7cYHK!RPO!Fk5)3RbLii(d{v+0 zJ-c6XmvU{ZW~??VW>yownF5Te#?tc#-u=59Jz<&qop*PC>O05(-c)}?{aHx(gS7`@ z8Fx5wKX~`YkN?NH&EG8xzV3Oy;=8=r#N_oe3t7ANM`p4(G% z_u6u`YBrCGw_6y6pPaDx&SLgg_sE?S>+CX_*yf}NpGZ33@Y3_dD04I%hFl`3XK-^& Wv6(9Jbw99>XYh3Ob6Mw<&;$UNdjDDZGy0Y(FVSM=e(rLfL zi?^)XK5O|`tE+W;FI8W^UH#AYH}jtfQU`9gBr)jEXMETHBz$j4$n(hCakAT=3;y|g zea`>+S#SPMdHCYv>7D)a)?4i}U+!P6|Hb0J=Jx}k2N?eUo>6dxnd?FG{r`+R-Y>1n zeII`R@wP+jer4O9*Z%gI=g-0I0-*;P*4NBjUS(X&UzXo+Rr!YQk#D*#th-Nbx7v5h z?$@8IUr$#jG}OCAh?bR9zn{Hh)q|{guYP3xe(^c{x;|t7Kar%$e@_oo-{12^=g-Z3 zSDDK#udlYd9$W4DdT#pK?H6~-)VkUk-3Pjd!G8UkuZ%&Bm0yihzB;UWX34b0%Iwo= zo2!d*=BqO{Jb(FXk~Zs)Nn6it)}WNLBDP_5zIEvB=bhKR+|?OAyl9zQpTXqJz(4oK zNq_$ZUq!!##{ang>!s9z<;5qY71#>C`u=$(&T_Ti?*2!PzmG0TRmd&hH_r zvyX?{Kia$g)6K85>Vme22_JaRTJr5`5<~d;h{fCWyQ{u`J=gXr^LqTV`?uXoYulfW9ltxP#esqLrRM6#t6$Ua$1$#+SFq}F_4eaT>l8x2-?{p6+ji9eTg5L; zZ|=%J*f#IY)=3Npj@G9~?N#}DY8BIa+xu^RhgXK>f4erX@VZ^@ja~Ot-!*CnggyXj z{O_~i)aQ}|r_GbA?cJiQUH1O^v-Wyn|DN{?BmUYhsCpI?xAj-Sg3|x%|F+ff-Qjxu zf_ceTD+YhIiu*;fs*T@OH@x00@Lu}-RFw_Dq}}48&QMTN+r~bl@dXP*-@5Z37>tpV zJcGq9yTi<997>oN+^?rsG)Q*%F+6zji-+HU`64HSOzixJjA;s1j17xl8`~V<88r-4 hOpJyZdeZnKZ+?G`jqq~$%fLdJ!PC{xWt~$(696AnwY>lU literal 0 HcmV?d00001 From 71c69d9668c4f936345ad8f93918610051044dae Mon Sep 17 00:00:00 2001 From: Le-Kat <37410281+Le-Kat@users.noreply.github.com> Date: Fri, 10 Feb 2023 01:27:49 +0000 Subject: [PATCH 058/183] added spacing between two of the images --- apps/multidice/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/multidice/README.md b/apps/multidice/README.md index b33365d49..7e44600d6 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -4,6 +4,7 @@ roll anywhere from 1-6 dice at the same time, and display stats like the highest ![the start-up screen](main.png) ![two rolled dice](2d20.png) + ![the startup screen](menuPercent.png) ![one large dice](d100.png) From a82a50ff5a8194310a38ca8dec6adafcbdee1f2b Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 20:39:22 -0500 Subject: [PATCH 059/183] added app icon --- apps/multidice/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/multidice/app-icon.js diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js new file mode 100644 index 000000000..d79fe5bd2 --- /dev/null +++ b/apps/multidice/app-icon.js @@ -0,0 +1 @@ +E.toArraybuffer(atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==")) From 168d318fa9ae996bb83d88e5b675ee0e14f4f7a6 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 21:36:51 -0500 Subject: [PATCH 060/183] removed email from README b/c I don't want it getting scraped --- apps/multidice/README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 7e44600d6..06ea82075 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -21,11 +21,3 @@ roll anywhere from 1-6 dice (d4, d6, d8, d10, d12, d20, & d percentile). If only ## Controls No button is used in the app, it simply uses touch controls (W.I.P: accelerometor to roll the dice & compatability with the bangle.js 1). - -## Requests - -Le3Kat@gmail.com - -## Creator - -Le~Kat From ad28b9b387b36461a73abe2bba37084b6d8182b7 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 21:41:49 -0500 Subject: [PATCH 061/183] added app.png --- apps/multidice/app.png | Bin 0 -> 1330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/multidice/app.png diff --git a/apps/multidice/app.png b/apps/multidice/app.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee0514a953e29e618bf56a49e8526e8eac59f5 GIT binary patch literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& literal 0 HcmV?d00001 From 91eb88ef849ddf3ebed88fd3bea0dc61b571dc7e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Thu, 9 Feb 2023 22:31:50 -0500 Subject: [PATCH 062/183] added tags to metadata.json, trying to wrap my head around the sanitycheck --- apps/multidice/app-icon.js | 2 +- apps/multidice/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index d79fe5bd2..d6e931259 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -E.toArraybuffer(atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==")) +atob("MDCEAREREREREREREREREREREQAAEREREREREREREREREREREREREREREAAAARERERERERAAAAAAAAAAAAAAARERABERABEREREREQARERERERERERERAREQAREREAEREREREQARERERERERERERABEAEREREQAREREREQARERERERERERERABABERERERABEREREQAREREREREREREREQARERAAEREAEREREQAREREREREREREREAEREQAAAREQAREREQARERERERERERERABEREAERARERABEREQARERERAAAREREQAREREAERAREREAEREQAREREQAAABEREAEREREQEQAREREQAREQAREREAEREAERABEREREQAAERERERABEQAREREBEREQEQAREREREREREREREREAEQAREREBEREQEAEREQAAERERERAAAREQAQAREREBEREQABEREAEQEREREQARARERAAAREREAEREAABEREBEQAREREQERABERAAAREREQAAABEBEREBEQAREREQERABERAAARERERAAAREAEREAAAEREREQAAARERAAAREREREREREQARERABEREREREAEREQAQARERERERERERABERERERABEREREREAEQAREREREREREREAEREREQAAARERERABEQAREREREREREREQAREREAERAREREQAREQARERERERERERERABEREAERAREREAEREQARERERERERERERAAEREQEQARERABERERAAAAAAAAAAAAAAAQAREQAAEREQAQABERAAAAAAAAAAAAAAAAABEREREREAEQAAEQARERERERERERERABEAERERERABEREQEQARAAARERERERERABEQAREREQAQABEQEQAQAAABERERERERABERABEREAEAAAEQAQAQARABERERERERABEREAERABEBEQEQAQEQARABERERERERABEBEQAAAREBEQEQAREQAAABERERERERABEAABEREREAAAEQAQERAAARERERERERABEQABEREREQABEQAQERERERAAARERERABEREREQABEREREQAREREREQAAABERERABEREREAAAEREREQAQEREREQARABERERABEREREBEQEREREQAQAREREQARABERERABEREREBEQEREREQAQAREREQAAABERERABEREREAAAEREREQAQARERERAAARERERABEREREQABEREREQAQARERERERERAAARABEQABEREREQABEQAQAREREREREQAAABABEAAAEREREAAAEQAQAREREREREQARABABEBEQEREREBEQEQAQAREREREREQARABABEBEQEREREBEQEQAQAREREREREQAAABABEAAAEREREAAAEQAQARERERERERAAARABEQABEREREQABEQEQARERERERERERERABEREREREREREREQERAAEREREREREREAAAARERERERERERAAEREAAAAAAAAAAAAAEQAAAAAAAAAAAAAREQ==") diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 1a41cf09f..b7537d0b3 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -4,7 +4,7 @@ "version":"0.90", "description": "roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice", "icon": "app.png", - "tags": "", + "tags": "tool,game", "supports" : ["BANGLEJS2"], "readme": "README.md", "allow_emulator": true, From 6a39a53c740ac2cc3568c885e5dd512b3dd278fd Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Fri, 24 Feb 2023 23:39:42 -0500 Subject: [PATCH 063/183] after a rigorous field study of size n = 1, I have determined this to be a better app after this change --- apps/multidice/app.js | 230 +++++++++++++++++------------------------- 1 file changed, 94 insertions(+), 136 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index d11bc99d5..911177983 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -1,169 +1,127 @@ var menu = true; -var diceOpts = {amount: 2, selected: 5}; // TODO: grab values from settings -const DICE_ARRAY = [4, 6, 8, 10, 12, 20, 100]; // TODO: place in settings +const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; +const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + g.clear(); - g.setFont ("6x8", 2); + g.setFont ("Vector", 40); - g.drawString ("# of dice:", 5, 5); - g.drawString (diceOpts.amount, 137, 5); - - g.drawString ("dice:", 5, 32); - g.drawString (DICE_ARRAY [diceOpts.selected], 137, 32); + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - if (menu) { - - if (xy.y <= 26) { // selecting number of dice - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.amount > 1) - diceOpts.amount--; - } else { // right edge: increase - - if (diceOpts.amount < 6) - diceOpts.amount++; - } - - drawMenu(); - } else if (xy.y <= 53) { // selecting dice type - - if (xy.x <= 87) { // left edge: decrease - - if (diceOpts.selected > 0) - diceOpts.selected--; - } else { // right edge: increase - - if (diceOpts.selected < DICE_ARRAY.length - 1) - diceOpts.selected++; - } - - drawMenu(); - } else { - - rollDice(); - } - } else { // return to menu screen + if (! menu) { menu = true; - drawMenu (); + drawMenu(); + return; } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function rollDice() { - menu = false; - if (diceOpts.amount == 1) { + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { - let output = random (DICE_ARRAY [diceOpts.selected]); - - g.clear(); - g.setFont ("Vector", 90); - - g.drawString ((" " + output).slice (-3), 10, 0); - } else { - - let output = new Int8Array ([-1, -1, -1, -1, -1, -1]); - for (let i = 0; i < diceOpts.amount; i++) { + if (SELECTION_ARRAY [i] != 0) { - output [i] = random (DICE_ARRAY [diceOpts.selected]); + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { - g.clear(); - g.setFont ("Vector", 40); - - for (let i = 0; i < 3; i++) { // draws all the numbers in two rows + if (SELECTION_ARRAY [i] != 0) { - if (output [i * 2 + 0] == -1) { - - break; - } else if (output [i * 2 + 1] == -1) { - - - g.drawString ((" " + output [i * 2]).slice (-3), 5, 5 + i * 40); - } else { - - g.drawString ((" " + output [i * 2]).slice (-3) + " " + (" " + output [i * 2 + 1]).slice (-3), 5, 5 + i * 40); - } + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); } + } + + for (i = 4; i < 8; i++) { - g.setFont ("Vector", 20); - g.drawString ("H: " + (" " + max (output)).slice (-3), 5, 130); - g.drawString ("L: " + (" " + min (output)).slice (-3), 110, 130); - g.drawString ("T: " + (" " + total (output)).slice (-3), 5, 150); - g.drawString ("A: " + (" " + average (output)).slice (-3), 110, 150); + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * i); + } } } -function random (max) { // number is always between 1 and max +function random (max) { return Math.round (Math.random() * (max - 1) + 1); } -function max (array) { - - let max = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] > max) - max = array [i]; - } - - return max; -} - -function min (array) { - - let min = array [0]; - for (let i = 1; i < 6; i++) { - - if (array [i] == -1) - break; - - if (array [i] < min) - min = array [i]; - } - - return min; -} - -function total (array) { - - let total = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - total += array [i]; - } - - return total; -} - -function average (array) { - - let average = 0; - let rounds = 0; - for (let i = 0; i < 6; i++) { - - if (array [i] == -1) - break; - - average += array [i]; - rounds++; - } - - return Math.round (average / rounds); -} - drawMenu(); Bangle.on ('touch', touchHandler); +Bangle.on ('accel', function (xyz) { + + if (xyz.diff >= 0.3) { + + menu = false; + rollDice(); + } +}); From f2c900f8e13ad8f36167e82c21ea63daa1642760 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Fri, 24 Feb 2023 23:46:13 -0500 Subject: [PATCH 064/183] updated changelog, metadata, & readme. deleted outdated images --- apps/multidice/2d20.png | Bin 2352 -> 0 bytes apps/multidice/ChangeLog | 1 + apps/multidice/README.md | 16 +++++----------- apps/multidice/app.png | Bin 1330 -> 0 bytes apps/multidice/d100.png | Bin 1936 -> 0 bytes apps/multidice/main.png | Bin 1547 -> 0 bytes apps/multidice/menuPercent.png | Bin 1467 -> 0 bytes apps/multidice/metadata.json | 4 ++-- 8 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 apps/multidice/2d20.png delete mode 100644 apps/multidice/app.png delete mode 100644 apps/multidice/d100.png delete mode 100644 apps/multidice/main.png delete mode 100644 apps/multidice/menuPercent.png diff --git a/apps/multidice/2d20.png b/apps/multidice/2d20.png deleted file mode 100644 index e6c52b839b07e4237582668126be172707a6309c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmeH}`8V5%7Qo{xOkzd_#Vcy5B{VfUlxJGCHI){nQIbY%XADt0ovNMG(W1zs_H~NX zl0=AoZ8};@#8$B{jkR7ap|Mph&->+_^ZtkV;okepz2~0u`P?6F!hLI$sEDix2m}(n zdk1NIR;<5aF{-Z(MQ)fgt;Lk*0Pb&KvpjVbcabfd_e~L(NSUyd6!68YR;(HJj)$ z7_+h+NrGAG zTfsy{Qnz-@sQ(^@J@5Cf^&jlQeHx&swW(>A!6YpDyHj%eaNNm!y!Tr&GxcGK?d?TH z0mXt5G&jC;U5`Ft&}YMid|8E3lRl;S2A5NiSOd1BxAzGvGz&@vMaJD=FxiGr4HIoT>s zns-RsQQ<@q>dM+Q}P3S=$f0x=7nDJ1_IGr+JbGgBz;f zw5J`kXTl3RQO~j?eKYTINQZ|tVRJ72MRUiN1sOm3KraX}PUVTy?>RG^79XS2_Umo0 zn1r$bF?q02S!SxvgXvczGzDc?lX(kkJP)n`ma2MhNxE(?rmquX<=*aa0K=iM1QJyK8*A=VM?Qh$P_ zOUW}{SY(c*NrtFR3^!jk>wA9R-neBiQc>y(>_BN&dSV!cFr!H5+!$D$5;xc`)RP-% zFiNAsdpy~xQCO$x+D(kVl$8PT6@06~5n6Yt)c%<{Ut=w~t4IDk>tQ48Ax=XNwyIpc zWa((*<|rr-2Lcf3s1%7QZ?Vd6UN>1m}L!xT~T@_{N<`(C^D24>hE3?p%07T7RhuQq;sJ<{oM^Hp820crGFeLi+>rdd>pTFV-Y@RT1Oe0Lx7+`6+hq7r2akhE#^3dUYCa8_fuWzFLwYKqU^3#k(*?p#iTZv~^pOUFJ#sC^Z7Mxh>z zU&A+NPmXPgDmmvNlewPO;1gxpKvod;%jmCz)_%(`gZW@g?)q#XYr^6l7)qq8Z1s`Z z1>0`mIo`^8qm#QXjhdjpIhj?mn(5dqOzu{}eNqotUKp)m{A=^8x*4vK6@YQ#EasHE z0|@#X%;u`fka+319)TX>T=X{lA})dRgwRc+lERX7(2V98d^`*9=23t;SqVvc2UBgdo#hs z-c@@?-XCi2BRY3s6F(q99 zD`CRTsLP?`gMcg*cV-3{7NX|6av6U0h!mQRy}0b;FFX@1N1D6*`x;@-`DXCS@uS@t z+ID&e!{6SS?}Xucz6(#S-9-piyG5E@I1asFMN((h&Ty^ zI82fAid#jf3dk%&VjkW8B+7JBB!@O=u~T)Zu~hiLf6Rf=UcQ?p9TM$jJ{aqDOodUp zlg(1V^vyCoXU^J*Lw$#%>yrg^$S{pB8I>+ylcK-FM!nG}8gs*YES|wN{$%n`(vQ=k zfrkTEamFpZ9?taV5vrl8QMW%y0SGxO>89V%NdiQ#Gne<$w=>UNlACg5>E1>@ zbE)a4PEn6xjv_DkYYKp!6Z3j2p-KUI=q|hkh?uqD!T8_kfy|B(&Y>3Jee>)S0^PlB KjjS?refA&Y2tz>t diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 1c7728b3d..a216ea61b 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -1 +1,2 @@ 0.90: got most of the features done, lacking some polish and real-hardware testing +1.00: overhauled the whole app, made some margins larger to be easier to tap on diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 06ea82075..2d28ef33f 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -1,23 +1,17 @@ # multiple dice roller -roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all the dice +roll anywhere from 1-8 dice at the same time. -![the start-up screen](main.png) -![two rolled dice](2d20.png) - -![the startup screen](menuPercent.png) -![one large dice](d100.png) ## Usage -On the menu screen: tap to the right or left of the "# of dice" option to change how many dice to roll, & tap to the left or right of the "dice" option to select a different type (currently hard-coded to only allow DnD dice). To roll the dice, simply tap anywhere else on the screen. To go back to the dice selector. - -Once you're no longer on the menu screen, tap anywhere on the screen to return to the menu (W.I.P: shaking the watch to allow rolling dice again without having to go to the menu every time) +On the menu screen: tap on the dice to change what variant is selected, & shake the watch in order to roll those dice +On the dice screen: tap anywhere on the screen to go back to the menu, or shake to roll the dice again ## Features -roll anywhere from 1-6 dice (d4, d6, d8, d10, d12, d20, & d percentile). If only one dice is selected, it simply displays the output; if two or more dice are selected it also displays basic stats such as the highest & lowest roll, the total sum, and the average of all the dice. +roll anywhere from 1-8 dice (d4, d6, d8, d10, d12, d20, & d percentile). You can select multiple different dice at the same time ## Controls -No button is used in the app, it simply uses touch controls (W.I.P: accelerometor to roll the dice & compatability with the bangle.js 1). +No button is used in the app, it simply uses touch controls & the accelerometor diff --git a/apps/multidice/app.png b/apps/multidice/app.png deleted file mode 100644 index 75ee0514a953e29e618bf56a49e8526e8eac59f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& diff --git a/apps/multidice/d100.png b/apps/multidice/d100.png deleted file mode 100644 index 16350db1657632de685f8c0289d84112b8334f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmeHI`%{t$6vZ#UM6wA~EK76=-;AcEtENyPCak5DDLs6xWtv7>t*fSF>_BBDRGVp; zT4vHtDr{PsDB`2(HAbeE76Q7I_yWuaqN1z+!R|~y_QSnr=AOB8XU@5IZVn|la5Zc_ z3<80yCXSF4DEK#Ztl;*NdkQDcQ2zi;$00rM9Zm3?;c*IVIt53%B+ z>yx4mKY38ka<@IL(=KK&&V&FqzsO5PHn;E4vJsS+fSCjUHs3Mc+W?G+0?jCL4qN;c zIg_&@{|)$g+&FsFDh>|{J12``)VU$%x`YWQjm^l;m4%Mq_6+(qii(=;FJ{f?-p*dW za;v!tu2W9Xx8VAW8#ebGx+YM)2rN-AxKU!}BU|TKC{r#p>p`cx>@P4FR*R9}7i*O- zy}OO?SZES*IQZqVNm`j`sil`S=HZZ%D7tTppUvW06r2yjGp{zj#Md&ey%gIh`bTy1npI(Ue_NY$HD7A?jt@TNv0&uoIJW?il+--h?Q3jh6hIUUI3__z=!}) zojH-(_PgwMn7Nv~%PZB|DL7~-RI$vjNKau)+1Q{Djo}O;_=kIJ6OXOxm#iyiH{li{A#v{dIh5Baf zZ=ybZxEs58tV1egc$p4alwuUBVl7GHo)4(e*|p`N=c}&zW=b#flb+7$ag4Raq9Qc! zM%`&wP@2i~kTC@Q;qusbfss-t0=KP*o*dWblkcFhpsPgz1WvyAdXKNB#aEL$(y@c* zm!aOnE^bdoi+bO?v?;F&<|==(!W9BkrC0Vv0WEIdJMy=)Vz0!f@f{f~$lfMrv}rCh z96j!qA9aRG-%c8O^!jH6HNEUDk-_))UGiF5~lixc@d}K~dERs%v$M%G6>bf;SZ%;2@b26mqlGDN<@l| zIN0a<)ac{zjHxWxyxbdw{x%#F-56wb3=f{Y=3%_`fCS-i>QfeMmut<3HaJCI;CP$~ zr^FE2Z?6MjR%WbRH~`!A@PL{BcE;gSK7z2FVeFX{3w2D{W&Se(>gaaw=x!4Oke$=A z6KVk3cU9z|?~2^_^gx$@dE3+7(A?V|wgGKuUO=g~KYtE*LHrfNJO`L1{uuT{#_zTu a^F~jqKDvZ8uF)=iS_nBHm{>)K`Qu-37+f|0 diff --git a/apps/multidice/main.png b/apps/multidice/main.png deleted file mode 100644 index 7ca8f963174c7da421bc8d8abfd3391a64f13492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1547 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v?ipf%TH7i(^Pd+}qg?%Vq@#u)Y3m zUvhi$5wnLK)#3p=?)&_2DoRgxSn~1P@Av!T{}nS$_Ir?aVDhZuoASa23C=UBnAmK# z+KJ~MFf;hdvW(|P*=}2zU#s`^-|OH0?cddJE4g?6c*I-b5Fnbdwf2F)yG?~m{>*V* zmeE%tkK4cAAw75Bo7DIJo=7tqK4{dG{P29jGR}(Jh2Gbz-&?w~2dzziZ}l$b?qi+r z>#rG}ie8)k#o}rm^YeH81?zvvK6og)L#UGdzV(8@g;%S-ty|2M)_c97K5l0JCxfb_ z+8QmJ-}85b-(?P$Kbd`d_4U#N``<_JeZP9U{`J4_9_P-z{ppDLgY}&fAD$;4S}T9^ zD(43C8}B&FzkIBVsoBHy|9{b^RSCNsL$~|5-#t`%SZeRn*Zbbj`@6UG$G5k)8s;xI z@jbA9A5%!UO1|Q}`%WR@YqIuTeZ9VWZ8tzQ?{ zh*ah7e>FLM=el?9uL9r4105#b@ovtl((uy(|h7TI^L(_^h@6Z4b`8E-gg6OeYGP`zo;b~*ju^t`%xe*F8rvdO8ACI z!Po14SHIm8x_g^*jsJm$waKqI_ozHrss89uxO%}A`493xKUXuG-FV39BVO<|c+x9z zma8+rt!u3Cx4ZM=uRoVqxYtO%$|8Gs*>-Ej66IQ)t+vEQ7cYHK!RPO!Fk5)3RbLii(d{v+0 zJ-c6XmvU{ZW~??VW>yownF5Te#?tc#-u=59Jz<&qop*PC>O05(-c)}?{aHx(gS7`@ z8Fx5wKX~`YkN?NH&EG8xzV3Oy;=8=r#N_oe3t7ANM`p4(G% z_u6u`YBrCGw_6y6pPaDx&SLgg_sE?S>+CX_*yf}NpGZ33@Y3_dD04I%hFl`3XK-^& Wv6(9Jbw99>XYh3Ob6Mw<&;$UNdjDDZGy0Y(FVSM=e(rLfL zi?^)XK5O|`tE+W;FI8W^UH#AYH}jtfQU`9gBr)jEXMETHBz$j4$n(hCakAT=3;y|g zea`>+S#SPMdHCYv>7D)a)?4i}U+!P6|Hb0J=Jx}k2N?eUo>6dxnd?FG{r`+R-Y>1n zeII`R@wP+jer4O9*Z%gI=g-0I0-*;P*4NBjUS(X&UzXo+Rr!YQk#D*#th-Nbx7v5h z?$@8IUr$#jG}OCAh?bR9zn{Hh)q|{guYP3xe(^c{x;|t7Kar%$e@_oo-{12^=g-Z3 zSDDK#udlYd9$W4DdT#pK?H6~-)VkUk-3Pjd!G8UkuZ%&Bm0yihzB;UWX34b0%Iwo= zo2!d*=BqO{Jb(FXk~Zs)Nn6it)}WNLBDP_5zIEvB=bhKR+|?OAyl9zQpTXqJz(4oK zNq_$ZUq!!##{ang>!s9z<;5qY71#>C`u=$(&T_Ti?*2!PzmG0TRmd&hH_r zvyX?{Kia$g)6K85>Vme22_JaRTJr5`5<~d;h{fCWyQ{u`J=gXr^LqTV`?uXoYulfW9ltxP#esqLrRM6#t6$Ua$1$#+SFq}F_4eaT>l8x2-?{p6+ji9eTg5L; zZ|=%J*f#IY)=3Npj@G9~?N#}DY8BIa+xu^RhgXK>f4erX@VZ^@ja~Ot-!*CnggyXj z{O_~i)aQ}|r_GbA?cJiQUH1O^v-Wyn|DN{?BmUYhsCpI?xAj-Sg3|x%|F+ff-Qjxu zf_ceTD+YhIiu*;fs*T@OH@x00@Lu}-RFw_Dq}}48&QMTN+r~bl@dXP*-@5Z37>tpV zJcGq9yTi<997>oN+^?rsG)Q*%F+6zji-+HU`64HSOzixJjA;s1j17xl8`~V<88r-4 hOpJyZdeZnKZ+?G`jqq~$%fLdJ!PC{xWt~$(696AnwY>lU diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index b7537d0b3..1b02945b6 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,8 +1,8 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"0.90", - "description": "roll anywhere from 1-6 dice at the same time, and display stats like the highest & lowest roll, the total sum of the dice, and the average of all dice", + "version":"1.00", + "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", "supports" : ["BANGLEJS2"], From fe010d949cdd37da4f47f2296b501e27607a0660 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Fri, 24 Feb 2023 23:59:41 -0500 Subject: [PATCH 065/183] fixed bug that caused rolled dice on the right of screen to be writ off-screen --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index a216ea61b..c35862f7c 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -1,2 +1,3 @@ 0.90: got most of the features done, lacking some polish and real-hardware testing 1.00: overhauled the whole app, made some margins larger to be easier to tap on +1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 911177983..58b72e9fc 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -105,7 +105,7 @@ function rollDice() { if (SELECTION_ARRAY [i] != 0) { - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * i); + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 1b02945b6..3e82d01be 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.00", + "version":"1.01", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 678f7137224901d7253eb82b31c266ed9098f0bb Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:09:16 -0500 Subject: [PATCH 066/183] added vibration when dice is rolled --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 ++ apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index c35862f7c..ee190c200 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -1,3 +1,4 @@ 0.90: got most of the features done, lacking some polish and real-hardware testing 1.00: overhauled the whole app, made some margins larger to be easier to tap on 1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen +1.02: added vibration when dice is rolled diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 58b72e9fc..0ab98f8d0 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -108,6 +108,8 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } + + Bangle.buzz(); } function random (max) { diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 3e82d01be..ba0b5a57f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.01", + "version":"1.02", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From d82594480f36abf66c127451a87cf84c04686e72 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:18:26 -0500 Subject: [PATCH 067/183] vibration caused the accelerometer to never stop --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ee190c200..6316210e5 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -2,3 +2,4 @@ 1.00: overhauled the whole app, made some margins larger to be easier to tap on 1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen 1.02: added vibration when dice is rolled +1.03: vibration caused the accelerometer to never stop diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 0ab98f8d0..8bf2ca662 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -121,7 +121,7 @@ drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', function (xyz) { - if (xyz.diff >= 0.3) { + if (xyz.diff >= 0.5) { menu = false; rollDice(); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ba0b5a57f..6612cc999 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.02", + "version":"1.03", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 7af12fd68e25647ed7b048dcb3a2cedf1ccafc73 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:23:15 -0500 Subject: [PATCH 068/183] accidentally deleted app icon LMAO --- apps/multidice/app.png | Bin 0 -> 1330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/multidice/app.png diff --git a/apps/multidice/app.png b/apps/multidice/app.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee0514a953e29e618bf56a49e8526e8eac59f5 GIT binary patch literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& literal 0 HcmV?d00001 From d64609aa92785c826970e966d3a1c4f0817de5a5 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 00:25:33 -0500 Subject: [PATCH 069/183] decreased vibration strength --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 4 ++-- apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 6316210e5..9bc00d9be 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -3,3 +3,4 @@ 1.01: fixed bug that caused rolled dice on the right of screen to be writ off-screen 1.02: added vibration when dice is rolled 1.03: vibration caused the accelerometer to never stop +1.04: decreased vibration strength diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 8bf2ca662..ef16ca2de 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -109,7 +109,7 @@ function rollDice() { } } - Bangle.buzz(); + Bangle.buzz (200, 0.1); } function random (max) { @@ -121,7 +121,7 @@ drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', function (xyz) { - if (xyz.diff >= 0.5) { + if (xyz.diff >= 0.4) { menu = false; rollDice(); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 6612cc999..ef5841877 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.03", + "version":"1.04", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 1e46b479e25260cbc73ccda2fc412d60da3585cf Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 07:52:26 -0500 Subject: [PATCH 070/183] toggled the acceleration handler to prevent infinite buzz loop --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 236 +++++++++++++++++++---------------- apps/multidice/metadata.json | 2 +- 3 files changed, 127 insertions(+), 112 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 9bc00d9be..fc6479e98 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -4,3 +4,4 @@ 1.02: added vibration when dice is rolled 1.03: vibration caused the accelerometer to never stop 1.04: decreased vibration strength +1.05: toggled the acceleration handler to prevent infinite buzz loop diff --git a/apps/multidice/app.js b/apps/multidice/app.js index ef16ca2de..15d9564bc 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,127 +3,141 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); +} + +function accelHandler (xyz) { + + if (xyz.diff >= 0.4) { + + menu = false; + rollDice(); + } +} + +function voidFn() { + + return; } function rollDice() { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - Bangle.buzz (200, 0.1); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); +} + +function vibrate() { + + Bangle.on ('accel', voidFn); + Bangle.buzz (200, 0.1).then( + + Bangle.on ('accel', accelHandler) + ); } drawMenu(); Bangle.on ('touch', touchHandler); -Bangle.on ('accel', function (xyz) { - - if (xyz.diff >= 0.4) { - - menu = false; - rollDice(); - } -}); +Bangle.on ('accel', accelHandler); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ef5841877..82af0ef8b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.04", + "version":"1.05", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 959fa4183cca78cdbb9c7855a827d80f41a65f49 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 07:55:52 -0500 Subject: [PATCH 071/183] increased vibration again --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index fc6479e98..b5de3ea67 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -5,3 +5,4 @@ 1.03: vibration caused the accelerometer to never stop 1.04: decreased vibration strength 1.05: toggled the acceleration handler to prevent infinite buzz loop +1.06: increased vibration again diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 15d9564bc..04e23e22a 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz (200, 0.1).then( + Bangle.buzz (200, 1).then( Bangle.on ('accel', accelHandler) ); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 82af0ef8b..36c0d9c1f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.05", + "version":"1.06", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 463c3fec238f531ac19accad0766f0264ee40332 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 08:05:35 -0500 Subject: [PATCH 072/183] IDK how to use promises properly --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index b5de3ea67..445dd4d68 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -6,3 +6,4 @@ 1.04: decreased vibration strength 1.05: toggled the acceleration handler to prevent infinite buzz loop 1.06: increased vibration again +1.07: IDK how to use promises properly diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 04e23e22a..e99e785c3 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz (200, 1).then( + Bangle.buzz (200, 1).then ((value) => Bangle.on ('accel', accelHandler) ); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 36c0d9c1f..743cb79ae 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.06", + "version":"1.07", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 1872f264d1cdd939ba08191ce60bdfa828110a5d Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 08:21:42 -0500 Subject: [PATCH 073/183] still trying to fix the lack of vibrations --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 445dd4d68..a9fc055c0 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -7,3 +7,4 @@ 1.05: toggled the acceleration handler to prevent infinite buzz loop 1.06: increased vibration again 1.07: IDK how to use promises properly +1.08: still trying to fix the lack of vibrations diff --git a/apps/multidice/app.js b/apps/multidice/app.js index e99e785c3..789cf26bd 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz (200, 1).then ((value) => + Bangle.buzz().then ((value) => Bangle.on ('accel', accelHandler) ); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 743cb79ae..effb1c57b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.07", + "version":"1.08", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 13c5b41aef1ed3743243d743bcec72485e6b545c Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 08:35:18 -0500 Subject: [PATCH 074/183] hopefully now it's fixed? --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 4 ++-- apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index a9fc055c0..ce7632d7c 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -8,3 +8,4 @@ 1.06: increased vibration again 1.07: IDK how to use promises properly 1.08: still trying to fix the lack of vibrations +1.09: hopefully now it's fixed? diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 789cf26bd..8f027c47a 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,10 +132,10 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz().then ((value) => + Bangle.buzz().then ((value) => { Bangle.on ('accel', accelHandler) - ); + }); } drawMenu(); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index effb1c57b..95071c67b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.08", + "version":"1.09", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 1499a524d950b523befbba2be24156852d1c686e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 10:06:52 -0500 Subject: [PATCH 075/183] not having web bluetooth to debug is a PAIN --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 13 ++++++++++++- apps/multidice/metadata.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ce7632d7c..ca48267be 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -9,3 +9,4 @@ 1.07: IDK how to use promises properly 1.08: still trying to fix the lack of vibrations 1.09: hopefully now it's fixed? +1.10: not having web bluetooth to debug is a PAIN diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 8f027c47a..98a43eef8 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -35,6 +35,9 @@ function touchHandler (button, xy) { return; } + rollDice(); + return; + if (xy.x <= 87) { // left if (xy.y <= 43) { @@ -122,6 +125,13 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } + + Bangle.on ('accel', voidFn); + console.log ("before"); + Bangle.buzz().then(()=>{ + Bangle.on ('accel', accelHandler); + }); + console.log ("after"); } function random (max) { @@ -134,7 +144,8 @@ function vibrate() { Bangle.on ('accel', voidFn); Bangle.buzz().then ((value) => { - Bangle.on ('accel', accelHandler) + console.log ("I ran."); + Bangle.on ('accel', accelHandler); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 95071c67b..37adcac91 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.09", + "version":"1.10", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 3001618e0f0b00b77e3588de746f62550c83dec6 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 10:20:26 -0500 Subject: [PATCH 076/183] decreased vibration time, decreased accel requirement --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 12 +++--------- apps/multidice/metadata.json | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ca48267be..68ada4870 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -10,3 +10,4 @@ 1.08: still trying to fix the lack of vibrations 1.09: hopefully now it's fixed? 1.10: not having web bluetooth to debug is a PAIN +1.11: decreased vibration time, decreased accel requirement diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 98a43eef8..5469b495b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -84,7 +84,7 @@ function touchHandler (button, xy) { function accelHandler (xyz) { - if (xyz.diff >= 0.4) { + if (xyz.diff >= 0.3) { menu = false; rollDice(); @@ -126,12 +126,7 @@ function rollDice() { } } - Bangle.on ('accel', voidFn); - console.log ("before"); - Bangle.buzz().then(()=>{ - Bangle.on ('accel', accelHandler); - }); - console.log ("after"); + vibrate(); } function random (max) { @@ -142,9 +137,8 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz().then ((value) => { + Bangle.buzz(50, 1).then ((value) => { - console.log ("I ran."); Bangle.on ('accel', accelHandler); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 37adcac91..ca5ec991f 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.10", + "version":"1.11", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From f9c338d90db08c85f676bc2ceb81db9584b66c3a Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:17:09 -0500 Subject: [PATCH 077/183] issue with app calling roll function too many times at startup --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 68ada4870..29da3bf24 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -11,3 +11,4 @@ 1.09: hopefully now it's fixed? 1.10: not having web bluetooth to debug is a PAIN 1.11: decreased vibration time, decreased accel requirement +1.12: issue with app calling roll function too many times at startup diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 5469b495b..6295c7a9b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -137,7 +137,7 @@ function random (max) { function vibrate() { Bangle.on ('accel', voidFn); - Bangle.buzz(50, 1).then ((value) => { + Bangle.buzz(50, 0.5).then ((value) => { Bangle.on ('accel', accelHandler); }); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ca5ec991f..177b8a32a 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.11", + "version":"1.12", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From a89f6cb4df1e74aa77fcc454ea69b923d6941c70 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:27:24 -0500 Subject: [PATCH 078/183] added a delay after the buzzer stops to prevent multi-rolling --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 18 ++++++++---------- apps/multidice/metadata.json | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 29da3bf24..7eb5f605c 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -12,3 +12,4 @@ 1.10: not having web bluetooth to debug is a PAIN 1.11: decreased vibration time, decreased accel requirement 1.12: issue with app calling roll function too many times at startup +1.13: added a delay after the buzzer stops to prevent multi-rolling diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 6295c7a9b..0d4b57a6c 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -126,7 +126,14 @@ function rollDice() { } } - vibrate(); + Bangle.on ('accel', voidFn); + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (function() { // wait 50ms *after* the buzzing has stopped + + Bangle.on ('accel', accelHandler); + }, 50); + }); } function random (max) { @@ -134,15 +141,6 @@ function random (max) { return Math.round (Math.random() * (max - 1) + 1); } -function vibrate() { - - Bangle.on ('accel', voidFn); - Bangle.buzz(50, 0.5).then ((value) => { - - Bangle.on ('accel', accelHandler); - }); -} - drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', accelHandler); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 177b8a32a..a6cbf46b9 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.12", + "version":"1.13", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 47caa9cd79716c4957cf7034981395de696298ee Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:35:36 -0500 Subject: [PATCH 079/183] made the delay needlessly long to see if it even does anything --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 7eb5f605c..d8a684575 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -13,3 +13,4 @@ 1.11: decreased vibration time, decreased accel requirement 1.12: issue with app calling roll function too many times at startup 1.13: added a delay after the buzzer stops to prevent multi-rolling +1.14: made the delay needlessly long to see if it even does anything diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 0d4b57a6c..271b7bad3 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -132,7 +132,7 @@ function rollDice() { setTimeout (function() { // wait 50ms *after* the buzzing has stopped Bangle.on ('accel', accelHandler); - }, 50); + }, 1000); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index a6cbf46b9..2bcf4d2eb 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.13", + "version":"1.14", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From b3cc27a391e82afe582d49f776fcd3ea688ac6c3 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 12:48:47 -0500 Subject: [PATCH 080/183] moved accel & vibration commands to the accelHandler function --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 23 +++++++++++------------ apps/multidice/metadata.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index d8a684575..2e6b8c622 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -14,3 +14,4 @@ 1.12: issue with app calling roll function too many times at startup 1.13: added a delay after the buzzer stops to prevent multi-rolling 1.14: made the delay needlessly long to see if it even does anything +1.15: moved accel & vibration commands to the accelHandler function diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 271b7bad3..6dddf1e19 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -35,9 +35,6 @@ function touchHandler (button, xy) { return; } - rollDice(); - return; - if (xy.x <= 87) { // left if (xy.y <= 43) { @@ -84,11 +81,22 @@ function touchHandler (button, xy) { function accelHandler (xyz) { + Bangle.on ('accel', voidFn); // temporarily disable more acceleration events if (xyz.diff >= 0.3) { menu = false; rollDice(); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (function() { // wait 50ms *after* the buzzing has stopped + + Bangle.on ('accel', accelHandler); + }, 50); + }); } + + Bangle.on ('accel', accelHandler); // re-enable acceleration events } function voidFn() { @@ -125,15 +133,6 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } - - Bangle.on ('accel', voidFn); - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (function() { // wait 50ms *after* the buzzing has stopped - - Bangle.on ('accel', accelHandler); - }, 1000); - }); } function random (max) { diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 2bcf4d2eb..7eb1c1607 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.14", + "version":"1.15", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From ef8b26c4901c320f805de926dd976eb22a6b3a2e Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:00:36 -0500 Subject: [PATCH 081/183] enabled button usage & temporarily disabled acceleration --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 15 ++++++++++++++- apps/multidice/metadata.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 2e6b8c622..ff191cf13 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -15,3 +15,4 @@ 1.13: added a delay after the buzzer stops to prevent multi-rolling 1.14: made the delay needlessly long to see if it even does anything 1.15: moved accel & vibration commands to the accelHandler function +1.16: enabled button usage & temporarily disabled acceleration diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 6dddf1e19..0893fe470 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -142,4 +142,17 @@ function random (max) { drawMenu(); Bangle.on ('touch', touchHandler); -Bangle.on ('accel', accelHandler); +//Bangle.on ('accel', accelHandler); +setWatch (function() { + + menu = false; + rollDice(); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (function() { // wait 50ms *after* the buzzing has stopped + + //Bangle.on ('accel', accelHandler); + }, 50); + }); +}, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 7eb1c1607..9b2148682 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.15", + "version":"1.16", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 64bff4303f508954f42b33530c9bdfaf336fe321 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:16:33 -0500 Subject: [PATCH 082/183] made changes to when accelHandler gets overwritten, temporarily disabled button usage --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 39 +++++++++++++++++------------------- apps/multidice/metadata.json | 2 +- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ff191cf13..651233c63 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -16,3 +16,4 @@ 1.14: made the delay needlessly long to see if it even does anything 1.15: moved accel & vibration commands to the accelHandler function 1.16: enabled button usage & temporarily disabled acceleration +1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 0893fe470..3789dc04b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -81,22 +81,16 @@ function touchHandler (button, xy) { function accelHandler (xyz) { - Bangle.on ('accel', voidFn); // temporarily disable more acceleration events if (xyz.diff >= 0.3) { - menu = false; - rollDice(); + Bangle.on ('accel', voidFn); // temporarily disable more acceleration events - Bangle.buzz(50, 0.5).then (() => { + menu = false; + rollDice (function() { - setTimeout (function() { // wait 50ms *after* the buzzing has stopped - - Bangle.on ('accel', accelHandler); - }, 50); + Bangle.on ('accel', accelHandler); // re-enable acceleration events }); } - - Bangle.on ('accel', accelHandler); // re-enable acceleration events } function voidFn() { @@ -104,7 +98,7 @@ function voidFn() { return; } -function rollDice() { +function rollDice (timeoutFunctionRef) { resultsArr = new Uint8Array (8); for (i = 0; i < 8; i++) { @@ -133,6 +127,16 @@ function rollDice() { g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); } } + + vibrate (timeoutFunctionRef); +} + +function vibrate (timeoutFunctionRef) { + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 50); + }); } function random (max) { @@ -142,17 +146,10 @@ function random (max) { drawMenu(); Bangle.on ('touch', touchHandler); -//Bangle.on ('accel', accelHandler); -setWatch (function() { +Bangle.on ('accel', accelHandler); +/*setWatch (function() { menu = false; rollDice(); - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (function() { // wait 50ms *after* the buzzing has stopped - - //Bangle.on ('accel', accelHandler); - }, 50); - }); -}, BTN, {repeat: true, edge: "falling", debounce: 10}); +}, BTN, {repeat: true, edge: "falling", debounce: 10});*/ diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 9b2148682..8a78fe22a 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.16", + "version":"1.17", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 4d379345562cc70111421dd8b559bca586143237 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:27:12 -0500 Subject: [PATCH 083/183] decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 10 +++++----- apps/multidice/metadata.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 651233c63..ec0d407b8 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -17,3 +17,4 @@ 1.15: moved accel & vibration commands to the accelHandler function 1.16: enabled button usage & temporarily disabled acceleration 1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage +1.18: decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 3789dc04b..940de3eb3 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -83,12 +83,12 @@ function accelHandler (xyz) { if (xyz.diff >= 0.3) { - Bangle.on ('accel', voidFn); // temporarily disable more acceleration events + //Bangle.on ('accel', voidFn); // temporarily disable more acceleration events menu = false; rollDice (function() { - Bangle.on ('accel', accelHandler); // re-enable acceleration events + //Bangle.on ('accel', accelHandler); // re-enable acceleration events }); } } @@ -147,9 +147,9 @@ function random (max) { drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', accelHandler); -/*setWatch (function() { +setWatch (function() { menu = false; - rollDice(); + rollDice (voidFn); -}, BTN, {repeat: true, edge: "falling", debounce: 10});*/ +}, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 8a78fe22a..7b45f11eb 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.17", + "version":"1.18", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 479a2da3ab390c27891fd0024258e47d0740dc71 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:36:24 -0500 Subject: [PATCH 084/183] added longer delay before resetting accelHandler --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 6 +++--- apps/multidice/metadata.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ec0d407b8..c47d4c8ff 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -18,3 +18,4 @@ 1.16: enabled button usage & temporarily disabled acceleration 1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage 1.18: decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering +1.19: added longer delay before resetting accelHandler diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 940de3eb3..82561853e 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -83,12 +83,12 @@ function accelHandler (xyz) { if (xyz.diff >= 0.3) { - //Bangle.on ('accel', voidFn); // temporarily disable more acceleration events + Bangle.on ('accel', voidFn); // temporarily disable more acceleration events menu = false; rollDice (function() { - //Bangle.on ('accel', accelHandler); // re-enable acceleration events + Bangle.on ('accel', accelHandler); // re-enable acceleration events }); } } @@ -135,7 +135,7 @@ function vibrate (timeoutFunctionRef) { Bangle.buzz(50, 0.5).then (() => { - setTimeout (timeoutFunctionRef, 50); + setTimeout (timeoutFunctionRef, 150); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 7b45f11eb..aec4455f4 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.18", + "version":"1.19", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 79fbaf52a304528fe003aab9210f7271991abb26 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 13:49:04 -0500 Subject: [PATCH 085/183] merged from upstream --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 0d02ff376..893c2dbbe 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 0d02ff3763783d166ff84906af038420736aabfc +Subproject commit 893c2dbbe5a93fbb80d035a695663b4f4cca8875 From 69140a58d51d146658ae2a178f7044ea38359726 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 14:03:32 -0500 Subject: [PATCH 086/183] gave up on acceleration, changed from hard tabs to double spaced, updated README.md --- apps/multidice/ChangeLog | 1 + apps/multidice/README.md | 7 +- apps/multidice/app.js | 243 ++++++++++++++++++--------------------- 3 files changed, 119 insertions(+), 132 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index c47d4c8ff..ba0f62269 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -19,3 +19,4 @@ 1.17: made changes to when accelHandler gets overwritten, temporarily disabled button usage 1.18: decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering 1.19: added longer delay before resetting accelHandler +1.20: removed all traces of accel b/c I've given up diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 2d28ef33f..d80ed7ef1 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -5,8 +5,8 @@ roll anywhere from 1-8 dice at the same time. ## Usage -On the menu screen: tap on the dice to change what variant is selected, & shake the watch in order to roll those dice -On the dice screen: tap anywhere on the screen to go back to the menu, or shake to roll the dice again +On the menu screen: tap on the dice to change what variant is selected, & press the button to roll the dice +On the dice screen: tap anywhere on the screen to go back to the menu, or press the button to roll the dice ## Features @@ -14,4 +14,5 @@ roll anywhere from 1-8 dice (d4, d6, d8, d10, d12, d20, & d percentile). You can ## Controls -No button is used in the app, it simply uses touch controls & the accelerometor +App uses touchscreen to cycle through different dice, and BTN to roll them +(W.I.P. using acceleration to roll dice) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 82561853e..01f39751d 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,153 +3,138 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); -} - -function accelHandler (xyz) { - - if (xyz.diff >= 0.3) { - - Bangle.on ('accel', voidFn); // temporarily disable more acceleration events - - menu = false; - rollDice (function() { - - Bangle.on ('accel', accelHandler); // re-enable acceleration events - }); - } + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function voidFn() { - - return; + + return; } function rollDice (timeoutFunctionRef) { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - vibrate (timeoutFunctionRef); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + vibrate (timeoutFunctionRef); } function vibrate (timeoutFunctionRef) { - - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (timeoutFunctionRef, 150); - }); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 150); + }); } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); -Bangle.on ('accel', accelHandler); setWatch (function() { - - menu = false; - rollDice (voidFn); - + + menu = false; + rollDice (voidFn); + }, BTN, {repeat: true, edge: "falling", debounce: 10}); From 6e7910254121abe98eaeb8d0c35dbf1aef4bd6ac Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 14:10:57 -0500 Subject: [PATCH 087/183] dumb theory ab the automated testing --- apps/multidice/app.js | 228 +++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 114 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 01f39751d..f93250c7b 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,138 +3,138 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function voidFn() { - - return; + + return; } function rollDice (timeoutFunctionRef) { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - vibrate (timeoutFunctionRef); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + vibrate (timeoutFunctionRef); } function vibrate (timeoutFunctionRef) { - - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (timeoutFunctionRef, 150); - }); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 150); + }); } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); setWatch (function() { - - menu = false; - rollDice (voidFn); - + + menu = false; + rollDice (voidFn); + }, BTN, {repeat: true, edge: "falling", debounce: 10}); From f17c270353c698dacdbcd675b974e23969b717d1 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 14:17:09 -0500 Subject: [PATCH 088/183] maby I should read the logs instead of guessing why it failed --- apps/multidice/app.js | 228 +++++++++++++++++------------------ apps/multidice/metadata.json | 2 +- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index f93250c7b..01f39751d 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,138 +3,138 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function voidFn() { - - return; + + return; } function rollDice (timeoutFunctionRef) { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - vibrate (timeoutFunctionRef); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + vibrate (timeoutFunctionRef); } function vibrate (timeoutFunctionRef) { - - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (timeoutFunctionRef, 150); - }); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 150); + }); } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); setWatch (function() { - - menu = false; - rollDice (voidFn); - + + menu = false; + rollDice (voidFn); + }, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index aec4455f4..ce84df4b2 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.19", + "version":"1.20", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 85692d5476d2714ef225f75010c96ae4023b16c8 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 22:33:52 +0100 Subject: [PATCH 089/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 07ef8c118..c8a31f7e0 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.07: Dev-New settings to (un)hide day of week, date and wind speed. +0.06: Dev1-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 1fc5f5de5..2a42365cb 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -2,7 +2,6 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; -let settings; // weather icons from https://icons8.com/icon/set/weather/color var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); @@ -20,12 +19,10 @@ var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmY // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); -function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; - settings.day = (settings.day === undefined ? true : settings.day); - settings.date = (settings.date === undefined ? true : settings.date); - settings.wind = (settings.wind === undefined ? true : settings.wind); -} +var settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; +settings.day = (settings.day === undefined ? true : settings.day); +settings.date = (settings.date === undefined ? true : settings.date); +settings.wind = (settings.wind === undefined ? true : settings.wind); /** Choose weather icon to display based on condition. @@ -92,6 +89,8 @@ function getWeather() { return jsonWeather; } +let fontTemp = settings.wind ? "10%" : "20%"; +let fontWind = settings.wind ? "10%" : "0%"; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, @@ -104,10 +103,10 @@ var clockLayout = new Layout( { {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, {type: "v", fillx:1, c: [ {type: "h", c: [ - {type: "txt", font: "10%", id: "temp", label: "000 °C"}, + {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, ]}, {type: "h", c: [ - {type: "txt", font: "10%", id: "wind", label: "00 km/h"}, + {type: "txt", font: fontWind, id: "wind", label: "00 km/h"}, ]} ] }, @@ -156,8 +155,6 @@ function draw() { queueDraw(); } -loadSettings(); - g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); From a66e433ebe40e82a87bc0db67b1ce2495129fb2a Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 22:52:01 +0100 Subject: [PATCH 090/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index c8a31f7e0..6ea37b64e 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev1-New settings to (un)hide day of week, date and wind speed. +0.07: Dev2-New settings to hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 2a42365cb..16da02af6 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -76,7 +76,7 @@ function chooseIconByCode(code) { case 800: return sunIcon; case 801: return partSunIcon; default: return cloudIcon; - } + } break; default: return cloudIcon; } } @@ -91,18 +91,22 @@ function getWeather() { let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; +let labelDay = settings.day ? "THU" : ""; +let labelDate = settings.date ? "01/01/1970" : ""; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, {type: "h", fillx: 1, c: [ - {type:"txt", font:"10%", label:"THU", id:"dow" }, - {type:"txt", font:"10%", label:"01/01/1970", id:"date" } + {type: "h", c: [ + {type:"txt", font:"10%", label:labelDay, id:"dow" }, + {type:"txt", font:"10%", label:labelDate, id:"date" } + ]}, ] }, {type: "h", valign : 1, fillx:1, c: [ {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, {type: "v", fillx:1, c: [ - {type: "h", c: [ + {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, ]}, {type: "h", c: [ From a52a2caaed0dd3c6c97b9f065904f7fca1720a48 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 22:55:54 +0100 Subject: [PATCH 091/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 6ea37b64e..aa3f9c970 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.07: Dev2-New settings to hide day of week, date and wind speed. +0.06: Dev3-New settings to hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 16da02af6..cbe63f84c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -76,7 +76,7 @@ function chooseIconByCode(code) { case 800: return sunIcon; case 801: return partSunIcon; default: return cloudIcon; - } break; + } default: return cloudIcon; } } @@ -97,7 +97,7 @@ var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, {type: "h", fillx: 1, c: [ - {type: "h", c: [ + {type: "h", c: [ {type:"txt", font:"10%", label:labelDay, id:"dow" }, {type:"txt", font:"10%", label:labelDate, id:"date" } ]}, @@ -106,7 +106,7 @@ var clockLayout = new Layout( { {type: "h", valign : 1, fillx:1, c: [ {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, {type: "v", fillx:1, c: [ - {type: "h", c: [ + {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, ]}, {type: "h", c: [ From b19dd38dbb218eb1f1237c3d7f1e9a22c7162de0 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Fri, 13 Jan 2023 22:11:09 +0000 Subject: [PATCH 092/183] widlockunlock: handle widget tap to lock --- apps/widlockunlock/ChangeLog | 1 + apps/widlockunlock/metadata.json | 4 +-- apps/widlockunlock/widget.js | 45 ++++++++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/apps/widlockunlock/ChangeLog b/apps/widlockunlock/ChangeLog index b4d1ae593..b5efcaa86 100644 --- a/apps/widlockunlock/ChangeLog +++ b/apps/widlockunlock/ChangeLog @@ -1 +1,2 @@ 0.01: First commit +0.02: Add tap-to-lock functionality diff --git a/apps/widlockunlock/metadata.json b/apps/widlockunlock/metadata.json index d701279b9..cc4fa76cd 100644 --- a/apps/widlockunlock/metadata.json +++ b/apps/widlockunlock/metadata.json @@ -1,8 +1,8 @@ { "id": "widlockunlock", "name": "Lock/Unlock Widget", - "version": "0.01", - "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked, or an unlock icon otherwise", + "version": "0.02", + "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked, or an unlock icon otherwise. Tap to lock the lcd", "icon": "widget.png", "type": "widget", "tags": "widget,lock", diff --git a/apps/widlockunlock/widget.js b/apps/widlockunlock/widget.js index 0716a9edf..21461b4a5 100644 --- a/apps/widlockunlock/widget.js +++ b/apps/widlockunlock/widget.js @@ -1,6 +1,41 @@ -Bangle.on("lockunlock", function() { - Bangle.drawWidgets(); +WIDGETS["lockunlock"] = { + area: "tl", + sortorder: 10, + width: 14, + draw: w => { + g.reset() + .drawImage( + atob(Bangle.isLocked() + ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" + : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), + w.x + 1, + w.y + 3 + ); + }, +}; +Bangle.on("lock", () => Bangle.drawWidgets()); + +Bangle.on('touch', (_btn, xy) => { + const oversize = 5; + + const w = WIDGETS.lockunlock; + + const x = xy.x; + const y = xy.y; + + if(w.x - oversize <= x && x < w.x + 14 + oversize + && w.y - oversize <= y && y < w.y + 24 + oversize) + { + Bangle.setLocked(true); + + const backlightTimeout = Bangle.getOptions().backlightTimeout; // ms + + // seems to be a race/if we don't give the firmware enough time, + // it won't timeout the backlight and we'll restore it in our setTimeout below + Bangle.setOptions({ backlightTimeout: 100 }); + + setTimeout(() => { + Bangle.setOptions({ backlightTimeout }); + }, 300); + } }); -WIDGETS["lockunlock"]={area:"tl",sortorder:10,width:14,draw:function(w) { - g.reset().drawImage(atob(Bangle.isLocked() ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), w.x+1, w.y+3); -}}; From c84d3fa2c0a063e79a5a353d84e81a786938e6d2 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 25 Feb 2023 21:56:34 +0000 Subject: [PATCH 093/183] widlockunlock: setting for location --- apps/widlockunlock/metadata.json | 3 ++- apps/widlockunlock/settings.js | 29 ++++++++++++++++++++++++ apps/widlockunlock/settings.ts | 39 ++++++++++++++++++++++++++++++++ apps/widlockunlock/widget.js | 6 ++++- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 apps/widlockunlock/settings.js create mode 100644 apps/widlockunlock/settings.ts diff --git a/apps/widlockunlock/metadata.json b/apps/widlockunlock/metadata.json index cc4fa76cd..daeefbc69 100644 --- a/apps/widlockunlock/metadata.json +++ b/apps/widlockunlock/metadata.json @@ -8,6 +8,7 @@ "tags": "widget,lock", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"widlockunlock.wid.js","url":"widget.js"} + {"name":"widlockunlock.wid.js","url":"widget.js"}, + {"name":"widlockunlock.settings.js","url":"settings.js"} ] } diff --git a/apps/widlockunlock/settings.js b/apps/widlockunlock/settings.js new file mode 100644 index 000000000..0c3a82c39 --- /dev/null +++ b/apps/widlockunlock/settings.js @@ -0,0 +1,29 @@ +"use strict"; +(function (back) { + var storage = require('Storage'); + var filename = 'lockunlock.settings.json'; + var settings = Object.assign(storage.readJSON(filename, true) || {}, { location: "tl" }); + var save = function () { + return storage.writeJSON(filename, settings); + }; + var locations = ["tl", "tr"]; + var menu = { + '': { 'title': 'Lock/Unlock' }, + '< Back': back, + 'Location': { + value: (function () { + var i = locations.indexOf(settings.location); + return i < 0 ? 0 : i; + })(), + min: 0, + max: locations.length - 1, + wrap: true, + format: function (v) { return locations[v]; }, + onchange: function (v) { + settings.location = locations[v]; + save(); + }, + }, + }; + E.showMenu(menu); +}); diff --git a/apps/widlockunlock/settings.ts b/apps/widlockunlock/settings.ts new file mode 100644 index 000000000..b2b1dc02e --- /dev/null +++ b/apps/widlockunlock/settings.ts @@ -0,0 +1,39 @@ +((back: () => void) => { + type Location = "tl" | "tr"; + type Settings = { + location: Location; + }; + + const storage = require('Storage'); + + const filename = 'lockunlock.settings.json'; + const settings: Settings = Object.assign( + storage.readJSON(filename, true) || {}, + { location: "tl" } + ); + + const save = () => + storage.writeJSON(filename, settings); + + const locations: Array = [ "tl", "tr" ]; + + const menu = { + '': { 'title': 'Lock/Unlock' }, + '< Back': back, + 'Location': { + value: (() => { + const i = locations.indexOf(settings.location); + return i < 0 ? 0 : i; + })(), + min: 0, + max: locations.length - 1, + wrap: true, + format: (v: number) => locations[v]!, + onchange: (v: number) => { + settings.location = locations[v]!; + save(); + }, + }, + }; + E.showMenu(menu); +}); diff --git a/apps/widlockunlock/widget.js b/apps/widlockunlock/widget.js index 21461b4a5..f7f872a5e 100644 --- a/apps/widlockunlock/widget.js +++ b/apps/widlockunlock/widget.js @@ -1,5 +1,9 @@ WIDGETS["lockunlock"] = { - area: "tl", + area: (() => { + const settings = require("Storage") + .readJSON("lockunlock.settings.json", true) || {}; + return settings.location || "tl"; + })(), sortorder: 10, width: 14, draw: w => { From 92fd9133fbea07217c45e4f4e6ab181182e5eb23 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 25 Feb 2023 21:58:53 +0000 Subject: [PATCH 094/183] Regenerate main.d.ts - Widget types --- apps/widChargingStatus/widget.ts | 4 ++-- typescript/types/main.d.ts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/widChargingStatus/widget.ts b/apps/widChargingStatus/widget.ts index 02f3cd8d4..a161d5408 100644 --- a/apps/widChargingStatus/widget.ts +++ b/apps/widChargingStatus/widget.ts @@ -6,11 +6,11 @@ ); const iconWidth = 18; - function draw(this: { x: number; y: number }) { + function draw(this: { x?: number; y?: number }) { g.reset(); if (Bangle.isCharging()) { g.setColor('#FD0'); - g.drawImage(icon, this.x + 1, this.y + 1, { + g.drawImage(icon, this.x! + 1, this.y! + 1, { scale: 0.6875, }); } diff --git a/typescript/types/main.d.ts b/typescript/types/main.d.ts index 1505c6f5a..d33c905d0 100644 --- a/typescript/types/main.d.ts +++ b/typescript/types/main.d.ts @@ -83,7 +83,10 @@ type WidgetArea = "tl" | "tr" | "bl" | "br"; type Widget = { area: WidgetArea; width: number; - draw: (this: { x: number; y: number }) => void; + sortorder?: number; + draw: (this: Widget, w: Widget) => void; + x?: number; + y?: number; }; declare const WIDGETS: { [key: string]: Widget }; From 6a21608322d2a605e273b8b74cf7227129d152ee Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 25 Feb 2023 21:58:12 +0000 Subject: [PATCH 095/183] widlockunlock: convert to typescript --- apps/widlockunlock/widget.js | 73 +++++++++++++++--------------------- apps/widlockunlock/widget.ts | 46 +++++++++++++++++++++++ 2 files changed, 77 insertions(+), 42 deletions(-) create mode 100644 apps/widlockunlock/widget.ts diff --git a/apps/widlockunlock/widget.js b/apps/widlockunlock/widget.js index f7f872a5e..e4569f511 100644 --- a/apps/widlockunlock/widget.js +++ b/apps/widlockunlock/widget.js @@ -1,45 +1,34 @@ +"use strict"; WIDGETS["lockunlock"] = { - area: (() => { - const settings = require("Storage") - .readJSON("lockunlock.settings.json", true) || {}; - return settings.location || "tl"; - })(), - sortorder: 10, - width: 14, - draw: w => { - g.reset() - .drawImage( - atob(Bangle.isLocked() - ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" - : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), - w.x + 1, - w.y + 3 - ); - }, + area: (function () { + var _a; + var settings = require("Storage") + .readJSON("lockunlock.settings.json", true) || {}; + return (_a = settings.location) !== null && _a !== void 0 ? _a : "tl"; + })(), + sortorder: 10, + width: 14, + draw: function (w) { + g.reset() + .drawImage(atob(Bangle.isLocked() + ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" + : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), w.x + 1, w.y + 3); + }, }; -Bangle.on("lock", () => Bangle.drawWidgets()); - -Bangle.on('touch', (_btn, xy) => { - const oversize = 5; - - const w = WIDGETS.lockunlock; - - const x = xy.x; - const y = xy.y; - - if(w.x - oversize <= x && x < w.x + 14 + oversize - && w.y - oversize <= y && y < w.y + 24 + oversize) - { - Bangle.setLocked(true); - - const backlightTimeout = Bangle.getOptions().backlightTimeout; // ms - - // seems to be a race/if we don't give the firmware enough time, - // it won't timeout the backlight and we'll restore it in our setTimeout below - Bangle.setOptions({ backlightTimeout: 100 }); - - setTimeout(() => { - Bangle.setOptions({ backlightTimeout }); - }, 300); - } +Bangle.on("lock", function () { return Bangle.drawWidgets(); }); +Bangle.on("touch", function (_btn, e) { + var oversize = 5; + if (!e) + return; + var x = e.x, y = e.y; + var w = WIDGETS["lockunlock"]; + if (w.x - oversize <= x && x < w.x + 14 + oversize + && w.y - oversize <= y && y < w.y + 24 + oversize) { + Bangle.setLocked(true); + var backlightTimeout_1 = Bangle.getOptions().backlightTimeout; + Bangle.setOptions({ backlightTimeout: 100 }); + setTimeout(function () { + Bangle.setOptions({ backlightTimeout: backlightTimeout_1 }); + }, 300); + } }); diff --git a/apps/widlockunlock/widget.ts b/apps/widlockunlock/widget.ts new file mode 100644 index 000000000..5dd1c93e9 --- /dev/null +++ b/apps/widlockunlock/widget.ts @@ -0,0 +1,46 @@ +WIDGETS["lockunlock"] = { + area: (() => { + const settings = require("Storage") + .readJSON("lockunlock.settings.json", true) || {}; + return settings.location ?? "tl"; + })(), + sortorder: 10, + width: 14, + draw: w => { + g.reset() + .drawImage( + atob(Bangle.isLocked() + ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" + : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), + w.x! + 1, + w.y! + 3 + ); + }, +}; + +Bangle.on("lock", () => Bangle.drawWidgets()); + +Bangle.on("touch", (_btn, e) => { + const oversize = 5; + + if (!e) return; + const { x, y } = e; + + const w = WIDGETS["lockunlock"]!; + + if(w.x! - oversize <= x && x < w.x! + 14 + oversize + && w.y! - oversize <= y && y < w.y! + 24 + oversize) + { + Bangle.setLocked(true); + + const { backlightTimeout } = Bangle.getOptions(); // ms + + // seems to be a race/if we don't give the firmware enough time, + // it won't timeout the backlight and we'll restore it in our setTimeout below + Bangle.setOptions({ backlightTimeout: 100 }); + + setTimeout(() => { + Bangle.setOptions({ backlightTimeout }); + }, 300); + } +}); From ac22a2a2cf95b103c894b5f56e44949eeb3a69ea Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 20:50:45 -0500 Subject: [PATCH 096/183] added a drawWidgets command to see if I have the padding right --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 229 ++++++++++++++++++----------------- apps/multidice/metadata.json | 2 +- 3 files changed, 117 insertions(+), 115 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index ba0f62269..9fd5f3935 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -20,3 +20,4 @@ 1.18: decided to keep around the button even while testing, disabled all safety round the accelHandler self-triggering 1.19: added longer delay before resetting accelHandler 1.20: removed all traces of accel b/c I've given up +1.21: added a drawWidgets command to see if I have the padding right diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 01f39751d..2c2c36c58 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,138 +3,139 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + Bangle.drawWidgets(); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function voidFn() { - - return; + + return; } function rollDice (timeoutFunctionRef) { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - vibrate (timeoutFunctionRef); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + vibrate (timeoutFunctionRef); } function vibrate (timeoutFunctionRef) { - - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (timeoutFunctionRef, 150); - }); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 150); + }); } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); setWatch (function() { - - menu = false; - rollDice (voidFn); - + + menu = false; + rollDice (voidFn); + }, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index ce84df4b2..e8b2c4393 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.20", + "version":"1.21", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 560a784be83f1e9b03af12c83d450fcf3580de76 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 20:51:07 -0500 Subject: [PATCH 097/183] tabs, again --- apps/multidice/app.js | 230 +++++++++++++++++++++--------------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 2c2c36c58..95732f16f 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,139 +3,139 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - Bangle.drawWidgets(); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + Bangle.drawWidgets(); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function voidFn() { - - return; + + return; } function rollDice (timeoutFunctionRef) { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - vibrate (timeoutFunctionRef); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + vibrate (timeoutFunctionRef); } function vibrate (timeoutFunctionRef) { - - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (timeoutFunctionRef, 150); - }); + + Bangle.buzz(50, 0.5).then (() => { + + setTimeout (timeoutFunctionRef, 150); + }); } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); setWatch (function() { - - menu = false; - rollDice (voidFn); - + + menu = false; + rollDice (voidFn); + }, BTN, {repeat: true, edge: "falling", debounce: 10}); From 9d42114acb0eda95d6abb14fd0cee6180e6122a3 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 22:44:11 -0500 Subject: [PATCH 098/183] ok the buzzing *might* work now --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 259 +++++++++++++++++++---------------- apps/multidice/metadata.json | 2 +- 3 files changed, 144 insertions(+), 118 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 9fd5f3935..72ff0367f 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -21,3 +21,4 @@ 1.19: added longer delay before resetting accelHandler 1.20: removed all traces of accel b/c I've given up 1.21: added a drawWidgets command to see if I have the padding right +1.22: ok the buzzing *might* work now diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 95732f16f..5f8e8712d 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -3,139 +3,164 @@ const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } - } - - g.clear(); - g.setFont ("Vector", 40); - Bangle.drawWidgets(); - - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } + } + + g.clear(); + g.setFont ("Vector", 40); + + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } function touchHandler (button, xy) { - - if (! menu) { - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { - - selection = 0; - } else if (xy.y <= 87) { - - selection = 1; - } else if (xy.y <= 131) { - - selection = 2; - } else { - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { - - selection = 4; - } else if (xy.y <= 87) { - - selection = 5; - } else if (xy.y <= 131) { - - selection = 6; - } else { - - selection = 7; - } - } - - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { + + selection = 0; + } else if (xy.y <= 87) { + + selection = 1; + } else if (xy.y <= 131) { + + selection = 2; + } else { + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { + + selection = 4; + } else if (xy.y <= 87) { + + selection = 5; + } else if (xy.y <= 131) { + + selection = 6; + } else { + + selection = 7; + } + } + + // increment SELECTION_ARRAY [selection] + if (SELECTION_ARRAY [selection] == 7) { + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); +} + +function accelHandler (xyz) { + + if (xyz.diff >= 0.3) { + + menu = false; + //rollDice(); + //mutex (rollDice); + } +} + +let lock = false; +function mutex (functionRef) { + + if (lock) { + + return Promise.reject (new Error ("mutex is busy")); + } + + lock = true; + return new Promise (() => { + + functionRef.then (() => { + + lock = false; + }); + }); } function voidFn() { - - return; + + return; } -function rollDice (timeoutFunctionRef) { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - vibrate (timeoutFunctionRef); +function rollDice() { + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + return vibrate(); } -function vibrate (timeoutFunctionRef) { - - Bangle.buzz(50, 0.5).then (() => { - - setTimeout (timeoutFunctionRef, 150); - }); +function vibrate() { + + return Bangle.buzz(50, 0.5); } function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); +Bangle.on ('accel', accelHandler); setWatch (function() { - - menu = false; - rollDice (voidFn); - + + menu = false; + //rollDice(); + mutex (rollDice); }, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index e8b2c4393..acbca320b 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.21", + "version":"1.22", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 4ffaf9bb3237db00e982269b2a26e51a072a4398 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 22:50:34 -0500 Subject: [PATCH 099/183] forgot to resolve the promise --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 3 ++- apps/multidice/metadata.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 72ff0367f..9f1d05d5e 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -22,3 +22,4 @@ 1.20: removed all traces of accel b/c I've given up 1.21: added a drawWidgets command to see if I have the padding right 1.22: ok the buzzing *might* work now +1.23: forgot to resolve the promise diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 5f8e8712d..892e88d41 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -100,9 +100,10 @@ function mutex (functionRef) { lock = true; return new Promise (() => { - functionRef.then (() => { + functionRef.then ((result) => { lock = false; + resolve (result); }); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index acbca320b..5ca785724 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.22", + "version":"1.23", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 635d8be5078b41c00d6d38fa5686a11f65a346dd Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 22:58:41 -0500 Subject: [PATCH 100/183] fixed dumb errors --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 8 ++++++-- apps/multidice/metadata.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 9f1d05d5e..08981ebfc 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -23,3 +23,4 @@ 1.21: added a drawWidgets command to see if I have the padding right 1.22: ok the buzzing *might* work now 1.23: forgot to resolve the promise +1.24: fixed dumb errors diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 892e88d41..03380ee39 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -98,12 +98,16 @@ function mutex (functionRef) { } lock = true; - return new Promise (() => { + return new Promise ((resolve, reject) => { - functionRef.then ((result) => { + functionRef().then ((result) => { lock = false; resolve (result); + }).catch ((error) => { + + lock = false; + reject (error); }); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 5ca785724..999446eac 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.23", + "version":"1.24", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 09b2d9259fd907b1f5e4c7e97e48c400af0205d2 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 23:02:33 -0500 Subject: [PATCH 101/183] god I hope this works --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 4 +--- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 08981ebfc..84b20801f 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -24,3 +24,4 @@ 1.22: ok the buzzing *might* work now 1.23: forgot to resolve the promise 1.24: fixed dumb errors +1.25: god I hope this works diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 03380ee39..9f74b1a09 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -84,8 +84,7 @@ function accelHandler (xyz) { if (xyz.diff >= 0.3) { menu = false; - //rollDice(); - //mutex (rollDice); + mutex (rollDice); } } @@ -166,6 +165,5 @@ Bangle.on ('accel', accelHandler); setWatch (function() { menu = false; - //rollDice(); mutex (rollDice); }, BTN, {repeat: true, edge: "falling", debounce: 10}); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index 999446eac..a6de27ac1 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.24", + "version":"1.25", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 2e92b04af553ca952c2ac14502241aa122b843fb Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 23:21:47 -0500 Subject: [PATCH 102/183] trying to add timeout after it's done buzzing... again --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 18 +++++++++++------- apps/multidice/metadata.json | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 84b20801f..d139f16c5 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -25,3 +25,4 @@ 1.23: forgot to resolve the promise 1.24: fixed dumb errors 1.25: god I hope this works +1.26: trying to add timeout after it's done buzzing... again diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 9f74b1a09..c4597cdaf 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -81,7 +81,7 @@ function touchHandler (button, xy) { function accelHandler (xyz) { - if (xyz.diff >= 0.3) { + if (xyz.diff >= 0.4) { menu = false; mutex (rollDice); @@ -111,11 +111,6 @@ function mutex (functionRef) { }); } -function voidFn() { - - return; -} - function rollDice() { resultsArr = new Uint8Array (8); @@ -151,7 +146,16 @@ function rollDice() { function vibrate() { - return Bangle.buzz(50, 0.5); + return new Promise ((resolve, reject) => { + + return Bangle.buzz (50, 0.5).then ((value) => { + + setTimeout (() => { + + resolve (value); + }, 150); + }); + }); } function random (max) { diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index a6de27ac1..e5d555fa8 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.25", + "version":"1.26", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 16bcc2ca6cad44e8f7a3f9008a7abdc065b339c8 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sat, 25 Feb 2023 23:28:28 -0500 Subject: [PATCH 103/183] OH GOD IT FINALLY F*CKING WORKS --- apps/multidice/ChangeLog | 1 + apps/multidice/README.md | 7 +++---- apps/multidice/app.js | 3 ++- apps/multidice/metadata.json | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index d139f16c5..55ed99b4f 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -26,3 +26,4 @@ 1.24: fixed dumb errors 1.25: god I hope this works 1.26: trying to add timeout after it's done buzzing... again +1.27: OH GOD IT FINALLY WORKS diff --git a/apps/multidice/README.md b/apps/multidice/README.md index d80ed7ef1..43c3fb0b3 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -5,8 +5,8 @@ roll anywhere from 1-8 dice at the same time. ## Usage -On the menu screen: tap on the dice to change what variant is selected, & press the button to roll the dice -On the dice screen: tap anywhere on the screen to go back to the menu, or press the button to roll the dice +On the menu screen: tap on the dice to change what variant is selected, & shake/or press BTN to roll the dice +On the dice screen: tap anywhere on the screen to go back to the menu, or shake/or press BTN to roll the dice ## Features @@ -14,5 +14,4 @@ roll anywhere from 1-8 dice (d4, d6, d8, d10, d12, d20, & d percentile). You can ## Controls -App uses touchscreen to cycle through different dice, and BTN to roll them -(W.I.P. using acceleration to roll dice) +App uses touchscreen to cycle through different dice, and accelerometer/BTN to roll them diff --git a/apps/multidice/app.js b/apps/multidice/app.js index c4597cdaf..474d8fb7c 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -81,7 +81,7 @@ function touchHandler (button, xy) { function accelHandler (xyz) { - if (xyz.diff >= 0.4) { + if (xyz.diff >= 0.3) { menu = false; mutex (rollDice); @@ -158,6 +158,7 @@ function vibrate() { }); } +// returns a integer [1, max] function random (max) { return Math.round (Math.random() * (max - 1) + 1); diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index e5d555fa8..f77e5fab8 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.26", + "version":"1.27", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 774372dfa96d14865246ea633a442fdeefdfa909 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 2 Jan 2023 22:05:14 +0000 Subject: [PATCH 104/183] settings app: preserve whitelist when disabled --- apps/boot/bootupdate.js | 2 +- apps/setting/ChangeLog | 1 + apps/setting/metadata.json | 2 +- apps/setting/settings.js | 37 +++++++++++++++++++++++++--------- apps/setting/settings.min.json | 2 +- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index d929b26a0..39c34e50b 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -79,7 +79,7 @@ if (global.save) boot += `global.save = function() { throw new Error("You can't if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`; if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`; if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${E.toJS(s.passkey.toString())}, mitm:1, display:1});\n`; -if (s.whitelist) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.includes(addr)) NRF.disconnect(); });\n`; +if (s.whitelist && !s.whitelist.disabled) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.macs.includes(addr)) NRF.disconnect(); });\n`; if (s.rotate) boot+=`g.setRotation(${s.rotate&3},${s.rotate>>2});\n` // screen rotation // ================================================== FIXING OLDER FIRMWARES if (FWVERSION<215.068) // 2v15.68 and before had compass heading inverted. diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 8f14d0419..971162691 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -64,3 +64,4 @@ of 'Select Clock' 0.57: Settings.log = 0,1,2,3 for off,display,log,both 0.58: On/Off settings items now use checkboxes +0.59: Preserve BLE whitelist even when disabled diff --git a/apps/setting/metadata.json b/apps/setting/metadata.json index ab029f1e5..e62479604 100644 --- a/apps/setting/metadata.json +++ b/apps/setting/metadata.json @@ -1,7 +1,7 @@ { "id": "setting", "name": "Settings", - "version": "0.58", + "version": "0.59", "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 db3e476b7..fac5ea181 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -43,6 +43,10 @@ function resetSettings() { "12hour" : false, // 12 or 24 hour clock? firstDayOfWeek: 0, // 0 -> Sunday (default), 1 -> Monday brightness: 1, // LCD brightness from 0 to 1 + whitelist: { // Bluetooth whitelist + macs: [], + disabled: true, + }, // welcomed : undefined/true (whether welcome app should show) options: { wakeOnBTN1: true, @@ -191,7 +195,14 @@ function showBLEMenu() { onchange: () => setTimeout(showPasskeyMenu) // graphical_menu redraws after the call }, /*LANG*/'Whitelist': { - value: settings.whitelist?(settings.whitelist.length+/*LANG*/" devs"):/*LANG*/"off", + value: + ( + settings.whitelist.disabled ? /*LANG*/"off" : /*LANG*/"on" + ) + ( + settings.whitelist.macs + ? " (" + settings.whitelist.macs.length + ")" + : "" + ), onchange: () => setTimeout(showWhitelistMenu) // graphical_menu redraws after the call } }); @@ -341,17 +352,26 @@ function showPasskeyMenu() { function showWhitelistMenu() { var menu = { "< Back" : ()=>showBLEMenu(), - /*LANG*/"Disable" : () => { - settings.whitelist = undefined; + }; + if (settings.whitelist.disabled) { + menu[/*LANG*/"Enable"] = () => { + delete settings.whitelist.disabled; updateSettings(); showBLEMenu(); - } - }; - if (settings.whitelist) settings.whitelist.forEach(function(d){ + }; + } else { + menu[/*LANG*/"Disable"] = () => { + settings.whitelist.disabled = true; + updateSettings(); + showBLEMenu(); + }; + } + + if (settings.whitelist.macs) settings.whitelist.macs.forEach(function(d){ menu[d.substr(0,17)] = function() { E.showPrompt(/*LANG*/'Remove\n'+d).then((v) => { if (v) { - settings.whitelist.splice(settings.whitelist.indexOf(d),1); + settings.whitelist.macs.splice(settings.whitelist.macs.indexOf(d),1); updateSettings(); } setTimeout(showWhitelistMenu, 50); @@ -365,8 +385,7 @@ function showWhitelistMenu() { }); NRF.removeAllListeners('connect'); NRF.on('connect', function(addr) { - if (!settings.whitelist) settings.whitelist=[]; - settings.whitelist.push(addr); + settings.whitelist.macs.push(addr); updateSettings(); NRF.removeAllListeners('connect'); showWhitelistMenu(); diff --git a/apps/setting/settings.min.json b/apps/setting/settings.min.json index 984054c11..d4ea23a8e 100644 --- a/apps/setting/settings.min.json +++ b/apps/setting/settings.min.json @@ -1 +1 @@ -{"ble":true,"blerepl":true,"log":false,"timeout":10,"vibrate":true,"beep":"vib","timezone":0,"HID":false,"clock":null,"12hour":false,"brightness":1,"options":{"wakeOnBTN1":true,"wakeOnBTN2":true,"wakeOnBTN3":true,"wakeOnFaceUp":false,"wakeOnTouch":false,"wakeOnTwist":true,"twistThreshold":819.2,"twistMaxY":-800,"twistTimeout":1000}} \ No newline at end of file +{"ble":true,"blerepl":true,"log":false,"timeout":10,"vibrate":true,"beep":"vib","timezone":0,"HID":false,"clock":null,"12hour":false,"brightness":1,"options":{"wakeOnBTN1":true,"wakeOnBTN2":true,"wakeOnBTN3":true,"wakeOnFaceUp":false,"wakeOnTouch":false,"wakeOnTwist":true,"twistThreshold":819.2,"twistMaxY":-800,"twistTimeout":1000},"whitelist":{"disabled":true}} From f3a28b2b4ca29352bace011ffec67f58db0e9e4a Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 14:24:49 +0100 Subject: [PATCH 105/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 77 ++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index aa3f9c970..5607abade 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev3-New settings to hide day of week, date and wind speed. +0.06: Dev4-New settings to hide the day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index cbe63f84c..90f73b6d7 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -2,28 +2,18 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; +let settings; // weather icons from https://icons8.com/icon/set/weather/color var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); - var partSunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AY6AWVhvdC6vd7owUFwIABFiYAFGR4Xa93u9oXTCwIYDC6HeC4fuC56MBC4ySOIwpIQXYQXHmYABRpwXECwQYKF5HjC4kwL5gQCAYYwO7wqFAAowK7wWKJBgXLJBPd6YX/AAoVMAAM/Cw0DC5yRHCx5JGFyAwGCyIwFC/4XyR4inXa64wRFwowQCw4A/AH4AkA")); - var cloudIcon = require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4AtgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAH4A/AH4A/ADg=")); - var snowIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AhxGAC9YUBC4QZRhAVBAIWIC6QAEI6IYEI5cIBgwWOC64NCKohHPNox3RBgqnQEo7XPHpKONR5AXYAH4ASLa4XWXILiBC6r5LDBgWWDBRrKC5hsCEacIHawvMCIwvQC5QvQFAROEfZ5ADLJ4YGCywvVI7CPGC9IA/AH4AF")); - var rainIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAGeIBJEIwAVJhGIC5AJBC5QMJEJQMEC44JBC6QSCC54FHLxgNBBgYSEDgKpPMhQXneSwuUAH4A/AA4=")); - var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); - // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); -var settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; -settings.day = (settings.day === undefined ? true : settings.day); -settings.date = (settings.date === undefined ? true : settings.date); -settings.wind = (settings.wind === undefined ? true : settings.wind); - /** Choose weather icon to display based on condition. Based on function from the Bangle weather app so it should handle all of the conditions @@ -89,34 +79,6 @@ function getWeather() { return jsonWeather; } -let fontTemp = settings.wind ? "10%" : "20%"; -let fontWind = settings.wind ? "10%" : "0%"; -let labelDay = settings.day ? "THU" : ""; -let labelDate = settings.date ? "01/01/1970" : ""; -var clockLayout = new Layout( { - type:"v", c: [ - {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, - {type: "h", fillx: 1, c: [ - {type: "h", c: [ - {type:"txt", font:"10%", label:labelDay, id:"dow" }, - {type:"txt", font:"10%", label:labelDate, id:"date" } - ]}, - ] - }, - {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, - {type: "v", fillx:1, c: [ - {type: "h", c: [ - {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, - ]}, - {type: "h", c: [ - {type: "txt", font: fontWind, id: "wind", label: "00 km/h"}, - ]} - ] - }, - ]}] -}); - // timeout used to update every minute var drawTimeout; @@ -159,6 +121,43 @@ function draw() { queueDraw(); } +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.day = (settings.day === undefined ? true : settings.day); + settings.date = (settings.date === undefined ? true : settings.date); + settings.wind = (settings.wind === undefined ? true : settings.wind); +} + +loadSettings(); + +let fontTemp = settings.wind ? "10%" : "20%"; +let fontWind = settings.wind ? "10%" : "0%"; +let labelDay = settings.day ? "THU" : ""; +let labelDate = settings.date ? "01/01/1970" : ""; +var clockLayout = new Layout( { + type:"v", c: [ + {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, + {type: "h", fillx: 1, c: [ + {type: "h", c: [ + {type:"txt", font:"10%", label:labelDay, id:"dow" }, + {type:"txt", font:"10%", label:labelDate, id:"date" } + ]}, + ] + }, + {type: "h", valign : 1, fillx:1, c: [ + {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, + {type: "v", fillx:1, c: [ + {type: "h", c: [ + {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, + ]}, + {type: "h", c: [ + {type: "txt", font: fontWind, id: "wind", label: "00 km/h"}, + ]} + ] + }, + ]}] +}); + g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); From 35b4611a9cdf87c78c9cc5f5ddd34ad43097c0c5 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 14:37:16 +0100 Subject: [PATCH 106/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 3 ++- apps/weatherClock/settings.js | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 5607abade..ace827ede 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev4-New settings to hide the day of week, date and/or wind speed. +0.06: Dev5-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 90f73b6d7..d5cff8459 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -134,6 +134,7 @@ let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; let labelDate = settings.date ? "01/01/1970" : ""; +let srcWeather = settings.icon ? sunIcon : ""; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, @@ -145,7 +146,7 @@ var clockLayout = new Layout( { ] }, {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, + {type: "img", filly: 1, id: "weatherIcon", src: srcWeather}, {type: "v", fillx:1, c: [ {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index 9597e7066..ee68df4fd 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -3,6 +3,7 @@ // initialize with default settings... let s = { + 'icon': true, 'day': true, 'date': true, 'wind': true @@ -25,6 +26,13 @@ E.showMenu({ '': { 'title': 'Weather Clock' }, '< Back': back, + 'Weather Icon': { + value: !!s.icon, + onchange: v => { + s.icon = v; + save(); + }, + }, 'Day Of Week': { value: !!s.day, onchange: v => { From 822b56a6fdff6aba0dbff8ba16c9f3332db1310f Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 14:53:19 +0100 Subject: [PATCH 107/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 3 ++- apps/weatherClock/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index ace827ede..956ba394b 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev5-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev6-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index d5cff8459..0876f7fe3 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -13,6 +13,7 @@ var rainIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmc var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); +var dummyIcon = require("heatshrink").decompress(atob("gMBwMAwA")); /** Choose weather icon to display based on condition. @@ -134,7 +135,7 @@ let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; let labelDate = settings.date ? "01/01/1970" : ""; -let srcWeather = settings.icon ? sunIcon : ""; +let srcWeather = settings.icon ? sunIcon : dummyIcon; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 88057c8dd..270591c74 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -2,7 +2,7 @@ "id": "weatherClock", "name": "Weather Clock", "shortName": "Weather Clock", - "version": "0.07", + "version": "0.06", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "dependencies": {"weather":"app"}, From 7d2159efa18b05c6b30e8f2edc3a1dbfe3a659c9 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 15:19:40 +0100 Subject: [PATCH 108/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 956ba394b..c7af13ffa 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev6-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev7-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 0876f7fe3..7a356559c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -104,9 +104,9 @@ function draw() { clockLayout.temp.label = temp[1] + " " + temp[2]; const code = currentWeather.code || -1; if (code > 0) { - clockLayout.weatherIcon.src = chooseIconByCode(code); + clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : dummyIcon; } else { - clockLayout.weatherIcon.src = chooseIcon(currentWeather.txt); + clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : dummyIcon; } const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); @@ -114,7 +114,7 @@ function draw() { else{ clockLayout.temp.label = "Err"; clockLayout.wind.label = "No Data"; - clockLayout.weatherIcon.src = errIcon; + clockLayout.weatherIcon.src = settings.icon ? errIcon : dummyIcon; } clockLayout.clear(); clockLayout.render(); @@ -124,6 +124,7 @@ function draw() { function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.icon = (settings.icon === undefined ? true : settings.icon); settings.day = (settings.day === undefined ? true : settings.day); settings.date = (settings.date === undefined ? true : settings.date); settings.wind = (settings.wind === undefined ? true : settings.wind); @@ -131,11 +132,11 @@ function loadSettings() { loadSettings(); +let srcWeather = settings.icon ? sunIcon : dummyIcon; let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; let labelDate = settings.date ? "01/01/1970" : ""; -let srcWeather = settings.icon ? sunIcon : dummyIcon; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, From 4dc02a5a3217d4ceb2b26eb0a24126fd1dab99a6 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:31:56 +0100 Subject: [PATCH 109/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 80 ++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index c7af13ffa..c2c0b76e3 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev7-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev8-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 7a356559c..50649569c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -5,15 +5,31 @@ const SETTINGS_FILE = "weatherClock.json"; let settings; // weather icons from https://icons8.com/icon/set/weather/color -var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); -var partSunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AY6AWVhvdC6vd7owUFwIABFiYAFGR4Xa93u9oXTCwIYDC6HeC4fuC56MBC4ySOIwpIQXYQXHmYABRpwXECwQYKF5HjC4kwL5gQCAYYwO7wqFAAowK7wWKJBgXLJBPd6YX/AAoVMAAM/Cw0DC5yRHCx5JGFyAwGCyIwFC/4XyR4inXa64wRFwowQCw4A/AH4AkA")); -var cloudIcon = require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4AtgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAH4A/AH4A/ADg=")); -var snowIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AhxGAC9YUBC4QZRhAVBAIWIC6QAEI6IYEI5cIBgwWOC64NCKohHPNox3RBgqnQEo7XPHpKONR5AXYAH4ASLa4XWXILiBC6r5LDBgWWDBRrKC5hsCEacIHawvMCIwvQC5QvQFAROEfZ5ADLJ4YGCywvVI7CPGC9IA/AH4AF")); -var rainIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAGeIBJEIwAVJhGIC5AJBC5QMJEJQMEC44JBC6QSCC54FHLxgNBBgYSEDgKpPMhQXneSwuUAH4A/AA4=")); -var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); +function getSun() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); +} +function getPartSun() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AY6AWVhvdC6vd7owUFwIABFiYAFGR4Xa93u9oXTCwIYDC6HeC4fuC56MBC4ySOIwpIQXYQXHmYABRpwXECwQYKF5HjC4kwL5gQCAYYwO7wqFAAowK7wWKJBgXLJBPd6YX/AAoVMAAM/Cw0DC5yRHCx5JGFyAwGCyIwFC/4XyR4inXa64wRFwowQCw4A/AH4AkA")); +} +function getCloud() { + return require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4AtgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAH4A/AH4A/ADg=")); +} +function getSnow() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AhxGAC9YUBC4QZRhAVBAIWIC6QAEI6IYEI5cIBgwWOC64NCKohHPNox3RBgqnQEo7XPHpKONR5AXYAH4ASLa4XWXILiBC6r5LDBgWWDBRrKC5hsCEacIHawvMCIwvQC5QvQFAROEfZ5ADLJ4YGCywvVI7CPGC9IA/AH4AF")); +} +function getRain() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAGeIBJEIwAVJhGIC5AJBC5QMJEJQMEC44JBC6QSCC54FHLxgNBBgYSEDgKpPMhQXneSwuUAH4A/AA4=")); +} +function getStorm() { + return require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); +} // err icon - https://icons8.com/icons/set/error -var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); -var dummyIcon = require("heatshrink").decompress(atob("gMBwMAwA")); +function getErr() { + return require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); +} +function getDummy() { + return require("heatshrink").decompress(atob("gMBwMAwA")); +} /** Choose weather icon to display based on condition. @@ -22,20 +38,20 @@ sent from gadget bridge. */ function chooseIcon(condition) { condition = condition.toLowerCase(); - if (condition.includes("thunderstorm")) return stormIcon; + if (condition.includes("thunderstorm")) return getStorm; if (condition.includes("freezing")||condition.includes("snow")|| condition.includes("sleet")) { - return snowIcon; + return getSnow; } if (condition.includes("drizzle")|| condition.includes("shower")) { - return rainIcon; + return getRain; } - if (condition.includes("rain")) return rainIcon; - if (condition.includes("clear")) return sunIcon; - if (condition.includes("few clouds")) return partSunIcon; - if (condition.includes("scattered clouds")) return cloudIcon; - if (condition.includes("clouds")) return cloudIcon; + if (condition.includes("rain")) return getRain; + if (condition.includes("clear")) return getSun; + if (condition.includes("few clouds")) return getPartSun; + if (condition.includes("scattered clouds")) return getCloud; + if (condition.includes("clouds")) return getCloud; if (condition.includes("mist") || condition.includes("smoke") || condition.includes("haze") || @@ -45,9 +61,9 @@ function chooseIcon(condition) { condition.includes("ash") || condition.includes("squalls") || condition.includes("tornado")) { - return cloudIcon; + return getCloud; } - return cloudIcon; + return getCloud; } /* @@ -57,18 +73,18 @@ function chooseIcon(condition) { function chooseIconByCode(code) { const codeGroup = Math.round(code / 100); switch (codeGroup) { - case 2: return stormIcon; - case 3: return rainIcon; - case 5: return rainIcon; - case 6: return snowIcon; - case 7: return cloudIcon; + case 2: return getStorm; + case 3: return getRain; + case 5: return getRain; + case 6: return getSnow; + case 7: return getCloud; case 8: switch (code) { - case 800: return sunIcon; - case 801: return partSunIcon; - default: return cloudIcon; + case 800: return getSun; + case 801: return getPartSun; + default: return getCloud; } - default: return cloudIcon; + default: return getCloud; } } @@ -104,9 +120,9 @@ function draw() { clockLayout.temp.label = temp[1] + " " + temp[2]; const code = currentWeather.code || -1; if (code > 0) { - clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : dummyIcon; + clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : getDummy; } else { - clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : dummyIcon; + clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : getDummy; } const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); @@ -114,7 +130,7 @@ function draw() { else{ clockLayout.temp.label = "Err"; clockLayout.wind.label = "No Data"; - clockLayout.weatherIcon.src = settings.icon ? errIcon : dummyIcon; + clockLayout.weatherIcon.src = settings.icon ? getErr : getDummy; } clockLayout.clear(); clockLayout.render(); @@ -132,7 +148,7 @@ function loadSettings() { loadSettings(); -let srcWeather = settings.icon ? sunIcon : dummyIcon; +let srcWeather = settings.icon ? getSun : getDummy; let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; @@ -144,7 +160,7 @@ var clockLayout = new Layout( { {type: "h", c: [ {type:"txt", font:"10%", label:labelDay, id:"dow" }, {type:"txt", font:"10%", label:labelDate, id:"date" } - ]}, + ]}, ] }, {type: "h", valign : 1, fillx:1, c: [ From b7222c485b14cf7b7f4efefd7b7cdee6f3e46602 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:46:02 +0100 Subject: [PATCH 110/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/settings.js | 20 ++++++-------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index c2c0b76e3..37891568d 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev8-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev9-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index ee68df4fd..f8925d86a 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -1,22 +1,14 @@ (function(back) { const SETTINGS_FILE = "weatherClock.json"; - // initialize with default settings... - let s = { - 'icon': true, - 'day': true, - 'date': true, - 'wind': true - } - - // ...and overwrite them with any saved values - // This way saved values are preserved if a new version adds more settings + // Load setings file const storage = require('Storage') let settings = storage.readJSON(SETTINGS_FILE, 1) || {} - const saved = settings || {} - for (const key in saved) { - s[key] = saved[key] - } + let s; + s.icon = (settings.icon === undefined ? true : settings.icon); + s.day = (settings.day === undefined ? true : settings.day); + s.date = (settings.date === undefined ? true : settings.date); + s.wind = (settings.wind === undefined ? true : settings.wind); function save() { settings = s From 7809129ddf1990f1c00a3d2aaf10a773f5e471d7 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:59:43 +0100 Subject: [PATCH 111/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/README.md | 4 +++- apps/weatherClock/app.js | 2 +- apps/weatherClock/settings.js | 12 ++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 37891568d..22f9fc5d2 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev9-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev9-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/README.md b/apps/weatherClock/README.md index f1f146440..c72a575ec 100644 --- a/apps/weatherClock/README.md +++ b/apps/weatherClock/README.md @@ -1,6 +1,8 @@ # Weather Clock -A clock which displays the current weather conditions. Temperature, wind speed, and an icon indicating the weather conditions are displayed. +A clock which displays the current weather conditions. Time, day of week, date, temperature, wind speed, and an icon indicating the weather conditions are displayed. + +As of Weather Clock v0.06 the day of week, date, temperature and/or wind speed can be hidden using settings. Standard widgets are displayed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 50649569c..8747620d8 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -139,7 +139,7 @@ function draw() { } function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings = storage.readJSON(SETTINGS_FILE,1)||{}; settings.icon = (settings.icon === undefined ? true : settings.icon); settings.day = (settings.day === undefined ? true : settings.day); settings.date = (settings.date === undefined ? true : settings.date); diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index f8925d86a..cd6a46970 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -1,10 +1,10 @@ (function(back) { const SETTINGS_FILE = "weatherClock.json"; - // Load setings file - const storage = require('Storage') - let settings = storage.readJSON(SETTINGS_FILE, 1) || {} - let s; + // Load settings file + const storage = require('Storage'); + let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; + let s = {}; s.icon = (settings.icon === undefined ? true : settings.icon); s.day = (settings.day === undefined ? true : settings.day); s.date = (settings.date === undefined ? true : settings.date); @@ -46,5 +46,5 @@ save(); }, } - }) -}) + }); +}); From a6805a304fabd49c8d857d5b10cfa325e668e1cb Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:59:59 +0100 Subject: [PATCH 112/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 22f9fc5d2..b15f34d47 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev9-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev10-New settings to optionally hide elements. Images placed into functions for performance. From c3f5fbbd28ddc54c2842ae73bc990aadbf7cede5 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Sun, 26 Feb 2023 15:51:03 -0500 Subject: [PATCH 113/183] increased vibration strength, added some comments, & some QOL --- apps/multidice/ChangeLog | 1 + apps/multidice/app.js | 43 ++++++++++++++++++++++-------------- apps/multidice/metadata.json | 2 +- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 55ed99b4f..6b773d96b 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -27,3 +27,4 @@ 1.25: god I hope this works 1.26: trying to add timeout after it's done buzzing... again 1.27: OH GOD IT FINALLY WORKS +1.28: increased vibration strength, added some comments, & some QOL diff --git a/apps/multidice/app.js b/apps/multidice/app.js index 474d8fb7c..d0f13ae7c 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -1,7 +1,8 @@ -var menu = true; -const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; +var menu = true; // default to have the selection menu open +const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; // 0 means nothing selected const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20 +// function to draw the selection menu function drawMenu() { stringArr = new Array ("", "", "", "", "", "", "", ""); @@ -10,12 +11,16 @@ function drawMenu() { if (SELECTION_ARRAY [i] != 0) { stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } else { + + stringArr [i] = " . "; // more clearly defines where the user can tap } } g.clear(); g.setFont ("Vector", 40); + // " ".slice(-3) left-pads all numbers with spaces g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); @@ -26,9 +31,10 @@ function drawMenu() { g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } +// function to change what dice is selected in the menu function touchHandler (button, xy) { - if (! menu) { + if (! menu) { // if menu isn't open, open it & return menu = true; drawMenu(); @@ -37,38 +43,37 @@ function touchHandler (button, xy) { if (xy.x <= 87) { // left - if (xy.y <= 43) { + if (xy.y <= 43) { // first selection = 0; - } else if (xy.y <= 87) { + } else if (xy.y <= 87) { // second selection = 1; - } else if (xy.y <= 131) { + } else if (xy.y <= 131) { // third selection = 2; - } else { + } else { // fourth selection = 3; } } else { // right - if (xy.y <= 43) { + if (xy.y <= 43) { // first selection = 4; - } else if (xy.y <= 87) { + } else if (xy.y <= 87) { // second selection = 5; - } else if (xy.y <= 131) { + } else if (xy.y <= 131) { // third selection = 6; - } else { + } else { // fourth selection = 7; } } - // increment SELECTION_ARRAY [selection] - if (SELECTION_ARRAY [selection] == 7) { + if (SELECTION_ARRAY [selection] == SELECTION_ARRAY.length - 1) { // if last dice is selected, go back to first SELECTION_ARRAY [selection] = 0; } else { @@ -84,10 +89,14 @@ function accelHandler (xyz) { if (xyz.diff >= 0.3) { menu = false; - mutex (rollDice); + mutex (rollDice).catch (() => { + + return; // not necessary, but prevents spamming the logs + }); } } +// returns a resolved promise if no other mutex call is active, all further ones return a rejected one let lock = false; function mutex (functionRef) { @@ -111,6 +120,7 @@ function mutex (functionRef) { }); } +// function to roll all selected dice, and display them function rollDice() { resultsArr = new Uint8Array (8); @@ -144,16 +154,17 @@ function rollDice() { return vibrate(); } +// triggers the vibration, then pauses before returning function vibrate() { return new Promise ((resolve, reject) => { - return Bangle.buzz (50, 0.5).then ((value) => { + return Bangle.buzz (50, 1).then ((value) => { setTimeout (() => { resolve (value); - }, 150); + }, 200); }); }); } diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index f77e5fab8..c3c144890 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.27", + "version":"1.28", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From aa5ed45c26823dfc91ce26ff119e437a5e6e2da6 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 01:14:25 +0100 Subject: [PATCH 114/183] weatherclock v0.06 --- apps/weatherClock/app.js | 47 ++++++++++++++++++++++------------- apps/weatherClock/settings.js | 8 ++++++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 8747620d8..aa9b6939c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -3,6 +3,7 @@ const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; let settings; +const weather = require('weather'); // weather icons from https://icons8.com/icon/set/weather/color function getSun() { @@ -111,21 +112,22 @@ function queueDraw() { function draw() { var date = new Date(); clockLayout.time.label = locale.time(date, 1); - clockLayout.date.label = (settings.date) ? locale.date(date, 1).toUpperCase() : ""; - clockLayout.dow.label = (settings.day) ? locale.dow(date, 1).toUpperCase() + " " : ""; - var weatherJson = getWeather(); - if(weatherJson && weatherJson.weather){ - var currentWeather = weatherJson.weather; - const temp = locale.temp(currentWeather.temp-273.15).match(/^(\D*\d*)(.*)$/); + clockLayout.date.label = settings.date ? locale.date(date, 1).toUpperCase() : ""; + clockLayout.dow.label = settings.day ? locale.dow(date, 1).toUpperCase() + " " : ""; + let current = weather.get(); + if(current){ + const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); clockLayout.temp.label = temp[1] + " " + temp[2]; - const code = currentWeather.code || -1; + const code = current.code || -1; if (code > 0) { - clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : getDummy; + let srcIconsCode = settings.src ? weatherIcon(current.code) : chooseIconByCode(current.code); + clockLayout.weatherIcon.src = settings.icon ? srcIconsCode : getDummy; } else { - clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : getDummy; + let srcIconsTxt = settings.src ? weatherIcon(current.txt) : chooseIcon(current.txt); + clockLayout.weatherIcon.src = settings.icon ? srcIconsTxt : getDummy; } - const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); - clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); + const wind = locale.speed(current.wind).match(/^(\D*\d*)(.*)$/); + clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (current.wrose||'').toUpperCase(); } else{ clockLayout.temp.label = "Err"; @@ -140,15 +142,26 @@ function draw() { function loadSettings() { settings = storage.readJSON(SETTINGS_FILE,1)||{}; - settings.icon = (settings.icon === undefined ? true : settings.icon); - settings.day = (settings.day === undefined ? true : settings.day); - settings.date = (settings.date === undefined ? true : settings.date); - settings.wind = (settings.wind === undefined ? true : settings.wind); + settings.src = settings.src === undefined ? false : settings.src; + settings.icon = settings.icon === undefined ? true : settings.icon; + settings.day = settings.day === undefined ? true : settings.day; + settings.date = settings.date === undefined ? true : settings.date; + settings.wind = settings.wind === undefined ? true : settings.wind; } loadSettings(); -let srcWeather = settings.icon ? getSun : getDummy; +function weatherIcon(code) { + var ovr = Graphics.createArrayBuffer(48,56,1,{msb:true}); + if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); + if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); + var img = ovr.asImage(); + img.transparent = 0; + return img; +} + +let srcIcons = settings.src ? weatherIcon(800) : getSun; +let srcWeather = settings.icon ? srcIcons : getDummy; let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; @@ -164,7 +177,7 @@ var clockLayout = new Layout( { ] }, {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: srcWeather}, + {type: "img", filly: 1, pad: 8, id: "weatherIcon", src: srcWeather}, {type: "v", fillx:1, c: [ {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index cd6a46970..bc4544b31 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -5,6 +5,7 @@ const storage = require('Storage'); let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; let s = {}; + s.src = (settings.src === undefined ? false : settings.src); s.icon = (settings.icon === undefined ? true : settings.icon); s.day = (settings.day === undefined ? true : settings.day); s.date = (settings.date === undefined ? true : settings.date); @@ -45,6 +46,13 @@ s.wind = v; save(); }, + }, + 'Icons from weather app': { + value: !!s.src, + onchange: v => { + s.src = v; + save(); + }, } }); }); From a3addeebb28fc0e5bc463f79cc9ec6dccff48357 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 27 Feb 2023 19:43:42 +0100 Subject: [PATCH 115/183] widalarmeta: Fix when no alarms are present --- apps/widalarmeta/ChangeLog | 1 + apps/widalarmeta/metadata.json | 2 +- apps/widalarmeta/widget.js | 16 +++++++++------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/widalarmeta/ChangeLog b/apps/widalarmeta/ChangeLog index 4bcf6ec69..2b74766c8 100644 --- a/apps/widalarmeta/ChangeLog +++ b/apps/widalarmeta/ChangeLog @@ -8,3 +8,4 @@ 0.05: Convert Yes/No On/Off in settings to checkboxes 0.06: Remember next alarm to reduce calculation amount Redraw only every hour when no alarm in next 24h +0.07: Fix when no alarms are present diff --git a/apps/widalarmeta/metadata.json b/apps/widalarmeta/metadata.json index a3d2e8adb..6b3d8978b 100644 --- a/apps/widalarmeta/metadata.json +++ b/apps/widalarmeta/metadata.json @@ -2,7 +2,7 @@ "id": "widalarmeta", "name": "Alarm & Timer ETA", "shortName": "Alarm ETA", - "version": "0.06", + "version": "0.07", "description": "A widget that displays the time to the next Alarm or Timer in hours and minutes, maximum 24h (configurable).", "icon": "widget.png", "type": "widget", diff --git a/apps/widalarmeta/widget.js b/apps/widalarmeta/widget.js index 750ae5d98..0104eb3b1 100644 --- a/apps/widalarmeta/widget.js +++ b/apps/widalarmeta/widget.js @@ -9,13 +9,15 @@ function getNextAlarm(date) { const alarms = (require("Storage").readJSON("sched.json",1) || []).filter(alarm => alarm.on && alarm.hidden !== true); WIDGETS["widalarmeta"].numActiveAlarms = alarms.length; - const times = alarms.map(alarm => require("sched").getTimeToAlarm(alarm, date) || Number.POSITIVE_INFINITY); - const eta = times.length > 0 ? Math.min.apply(null, times) : 0; - if (eta !== Number.POSITIVE_INFINITY) { - const idx = times.indexOf(eta); - const alarm = alarms[idx]; - delete alarm.msg; delete alarm.id; delete alarm.data; // free some memory - return alarm; + if (alarms.length > 0) { + const times = alarms.map(alarm => require("sched").getTimeToAlarm(alarm, date) || Number.POSITIVE_INFINITY); + const eta = Math.min.apply(null, times); + if (eta !== Number.POSITIVE_INFINITY) { + const idx = times.indexOf(eta); + const alarm = alarms[idx]; + delete alarm.msg; delete alarm.id; delete alarm.data; // free some memory + return alarm; + } } } // getNextAlarm From 483503dc36f3cb99becaece7d0841757f7dc4919 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 20:06:14 +0100 Subject: [PATCH 116/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 4 +- apps/weatherClock/lib.js | 399 ++++++++++++++++++++++++++++++++ apps/weatherClock/metadata.json | 3 +- 4 files changed, 404 insertions(+), 4 deletions(-) create mode 100644 apps/weatherClock/lib.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index b15f34d47..4f66ce437 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev10-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev11-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index aa9b6939c..f57d0fd80 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -3,7 +3,7 @@ const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; let settings; -const weather = require('weather'); +const weather = require('weatherClock'); // weather icons from https://icons8.com/icon/set/weather/color function getSun() { @@ -152,7 +152,7 @@ function loadSettings() { loadSettings(); function weatherIcon(code) { - var ovr = Graphics.createArrayBuffer(48,56,1,{msb:true}); + var ovr = Graphics.createArrayBuffer(50,50,1,{msb:true}); if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); var img = ovr.asImage(); diff --git a/apps/weatherClock/lib.js b/apps/weatherClock/lib.js new file mode 100644 index 000000000..14ca77ec6 --- /dev/null +++ b/apps/weatherClock/lib.js @@ -0,0 +1,399 @@ +const storage = require('Storage'); +const B2 = process.env.HWVERSION===2; + +let expiryTimeout; +function scheduleExpiry(json) { + if (expiryTimeout) { + clearTimeout(expiryTimeout); + expiryTimeout = undefined; + } + let expiry = "expiry" in json ? json.expiry : 2*3600000; + if (json.weather && json.weather.time && expiry) { + let t = json.weather.time + expiry - Date.now(); + expiryTimeout = setTimeout(update, t); + } +} + +function update(weatherEvent) { + let json = storage.readJSON('weather.json')||{}; + + if (weatherEvent) { + let weather = weatherEvent.clone(); + delete weather.t; + weather.time = Date.now(); + if (weather.wdir != null) { + // Convert numeric direction into human-readable label + let deg = weather.wdir; + while (deg<0 || deg>360) { + deg = (deg+360)%360; + } + weather.wrose = ['n','ne','e','se','s','sw','w','nw','n'][Math.floor((deg+22.5)/45)]; + } + + json.weather = weather; + } + else { + delete json.weather; + } + + storage.write('weather.json', json); + scheduleExpiry(json); + exports.emit("update", json.weather); +} + +const _GB = global.GB; +global.GB = (event) => { + if (event.t==="weather") update(event); + if (_GB) setTimeout(_GB, 0, event); +}; + +exports.get = function() { + return (storage.readJSON('weather.json')||{}).weather; +} + +scheduleExpiry(storage.readJSON('weather.json')||{}); + +function getPalette(monochrome, ovr) { + var palette; + if(monochrome) { + palette = { + sun: '#FFF', + cloud: '#FFF', + bgCloud: '#FFF', + rain: '#FFF', + lightning: '#FFF', + snow: '#FFF', + mist: '#FFF', + background: '#000' + }; + } else { + if (B2) { + if (ovr.theme.dark) { + palette = { + sun: '#FF0', + cloud: '#FFF', + bgCloud: '#777', // dithers on B2, but that's ok + rain: '#0FF', + lightning: '#FF0', + snow: '#FFF', + mist: '#FFF' + }; + } else { + palette = { + sun: '#FF0', + cloud: '#777', // dithers on B2, but that's ok + bgCloud: '#000', + rain: '#00F', + lightning: '#FF0', + snow: '#0FF', + mist: '#0FF' + }; + } + } else { + if (ovr.theme.dark) { + palette = { + sun: '#FE0', + cloud: '#BBB', + bgCloud: '#777', + rain: '#0CF', + lightning: '#FE0', + snow: '#FFF', + mist: '#FFF' + }; + } else { + palette = { + sun: '#FC0', + cloud: '#000', + bgCloud: '#777', + rain: '#07F', + lightning: '#FC0', + snow: '#CCC', + mist: '#CCC' + }; + } + } + } + return palette; +} + +exports.getColor = function(code) { + const codeGroup = Math.round(code / 100); + const palette = getPalette(0, g); + const cloud = g.blendColor(palette.cloud, palette.bgCloud, .5); //theme independent + switch (codeGroup) { + case 2: return g.blendColor(cloud, palette.lightning, .5); + case 3: return palette.rain; + case 5: + switch (code) { + case 511: return palette.snow; + case 520: return g.blendColor(palette.rain, palette.sun, .5); + case 521: return g.blendColor(palette.rain, palette.sun, .5); + case 522: return g.blendColor(palette.rain, palette.sun, .5); + case 531: return g.blendColor(palette.rain, palette.sun, .5); + default: return palette.rain; + } + case 6: return palette.snow; + case 7: return palette.mist; + case 8: + switch (code) { + case 800: return palette.sun; + case 801: return palette.sun; + case 802: return cloud; + default: return cloud; + } + default: return cloud; + } +} + +/** + * + * @param cond Weather condition, as one of: + * {number} code: (Preferred form) https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + * {string} weather description (in English: breaks for other languages!) + * {object} use cond.code if present, or fall back to cond.txt + * @param x Left + * @param y Top + * @param r Icon Size + * @param ovr Graphics instance (or undefined for g) + */ +exports.drawIcon = function(cond, x, y, r, ovr) { + var palette; + var monochrome=1; + if(!ovr) { + ovr = g; + monochrome=0; + } + + palette = getPalette(monochrome, ovr); + + function drawSun(x, y, r) { + ovr.setColor(palette.sun); + ovr.fillCircle(x, y, r); + } + + function drawCloud(x, y, r, c) { + const u = r/12; + if (c==null) c = palette.cloud; + ovr.setColor(c); + ovr.fillCircle(x-8*u, y+3*u, 4*u); + ovr.fillCircle(x-4*u, y-2*u, 5*u); + ovr.fillCircle(x+4*u, y+0*u, 4*u); + ovr.fillCircle(x+9*u, y+4*u, 3*u); + ovr.fillPoly([ + x-8*u, y+7*u, + x-8*u, y+3*u, + x-4*u, y-2*u, + x+4*u, y+0*u, + x+9*u, y+4*u, + x+9*u, y+7*u, + ]); + } + + function drawBrokenClouds(x, y, r) { + drawCloud(x+1/8*r, y-1/8*r, 7/8*r, palette.bgCloud); + if(monochrome) + drawCloud(x-1/8*r, y+2/16*r, r, palette.background); + drawCloud(x-1/8*r, y+1/8*r, 7/8*r); + } + + function drawFewClouds(x, y, r) { + drawSun(x+3/8*r, y-1/8*r, 5/8*r); + if(monochrome) + drawCloud(x-1/8*r, y+2/16*r, r, palette.background); + drawCloud(x-1/8*r, y+1/8*r, 7/8*r); + } + + function drawRainLines(x, y, r) { + ovr.setColor(palette.rain); + const y1 = y+1/2*r; + const y2 = y+1*r; + const poly = ovr.fillPolyAA ? p => ovr.fillPolyAA(p) : p => ovr.fillPoly(p); + poly([ + x-6/12*r, y1, + x-8/12*r, y2, + x-7/12*r, y2, + x-5/12*r, y1, + ]); + poly([ + x-2/12*r, y1, + x-4/12*r, y2, + x-3/12*r, y2, + x-1/12*r, y1, + ]); + poly([ + x+2/12*r, y1, + x+0/12*r, y2, + x+1/12*r, y2, + x+3/12*r, y1, + ]); + } + + function drawShowerRain(x, y, r) { + drawFewClouds(x, y-1/3*r, r); + drawRainLines(x, y, r); + } + + function drawRain(x, y, r) { + drawBrokenClouds(x, y-1/3*r, r); + drawRainLines(x, y, r); + } + + function drawThunderstorm(x, y, r) { + function drawLightning(x, y, r) { + ovr.setColor(palette.lightning); + ovr.fillPoly([ + x-2/6*r, y-r, + x-4/6*r, y+1/6*r, + x-1/6*r, y+1/6*r, + x-3/6*r, y+1*r, + x+3/6*r, y-1/6*r, + x+0/6*r, y-1/6*r, + x+3/6*r, y-r, + ]); + } + + if(monochrome) drawBrokenClouds(x, y-1/3*r, r); + drawLightning(x-1/12*r, y+1/2*r, 1/2*r); + drawBrokenClouds(x, y-1/3*r, r); + } + + function drawSnow(x, y, r) { + function rotatePoints(points, pivotX, pivotY, angle) { + for(let i = 0; i {}; + txt = txt.toLowerCase(); + if (txt.includes("thunderstorm")) return drawThunderstorm; + if (txt.includes("freezing")||txt.includes("snow")|| + txt.includes("sleet")) { + return drawSnow; + } + if (txt.includes("drizzle")|| + txt.includes("shower")) { + return drawRain; + } + if (txt.includes("rain")) return drawShowerRain; + if (txt.includes("clear")) return drawSun; + if (txt.includes("few clouds")) return drawFewClouds; + if (txt.includes("scattered clouds")) return drawCloud; + if (txt.includes("clouds")) return drawBrokenClouds; + if (txt.includes("mist") || + txt.includes("smoke") || + txt.includes("haze") || + txt.includes("sand") || + txt.includes("dust") || + txt.includes("fog") || + txt.includes("ash") || + txt.includes("squalls") || + txt.includes("tornado")) { + return drawMist; + } + return drawUnknown; + } + + /* + * Choose weather icon to display based on weather conditition code + * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + */ + function chooseIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: return drawThunderstorm; + case 3: return drawRain; + case 5: + switch (code) { + case 511: return drawSnow; + case 520: return drawShowerRain; + case 521: return drawShowerRain; + case 522: return drawShowerRain; + case 531: return drawShowerRain; + default: return drawRain; + } + case 6: return drawSnow; + case 7: return drawMist; + case 8: + switch (code) { + case 800: return drawSun; + case 801: return drawFewClouds; + case 802: return drawCloud; + default: return drawBrokenClouds; + } + default: return drawUnknown; + } + } + + function chooseIcon(cond) { + if (typeof (cond)==="object") { + if ("code" in cond) return chooseIconByCode(cond.code); + if ("txt" in cond) return chooseIconByTxt(cond.txt); + } else if (typeof (cond)==="number") { + return chooseIconByCode(cond.code); + } else if (typeof (cond)==="string") { + return chooseIconByTxt(cond.txt); + } + return drawUnknown; + } + chooseIcon(cond)(x, y, r); + +}; diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 270591c74..4addc67ac 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -15,7 +15,8 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"settings.js"} + {"name":"weatherClock.settings.js","url":"settings.js"}, + {"name":"weatherClock","url":"lib.js"} ], "data": [{"name":"weatherClock.json"}] } From fb88b185af5de12ab07e7388082f015096cb0c2d Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 20:16:44 +0100 Subject: [PATCH 117/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/lib.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 4f66ce437..37ce11ab7 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev11-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev12-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/lib.js b/apps/weatherClock/lib.js index 14ca77ec6..48a290824 100644 --- a/apps/weatherClock/lib.js +++ b/apps/weatherClock/lib.js @@ -158,7 +158,7 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome=1; + var monochrome=0; if(!ovr) { ovr = g; monochrome=0; From 97a6beab55fd1937dbe51f775da61662838d4e6b Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 20:18:19 +0100 Subject: [PATCH 118/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 37ce11ab7..ceb5a7e1c 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev12-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev13-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index f57d0fd80..e7bfe5220 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -152,7 +152,7 @@ function loadSettings() { loadSettings(); function weatherIcon(code) { - var ovr = Graphics.createArrayBuffer(50,50,1,{msb:true}); + var ovr = Graphics.createArrayBuffer(50,50,8,{msb:true}); if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); var img = ovr.asImage(); From 63711f6a0ccfe003deb712ff5708f56e1aebf7db Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 27 Feb 2023 20:13:57 +0000 Subject: [PATCH 119/183] Revert "widlockunlock: convert to typescript" This reverts commit 6a21608322d2a605e273b8b74cf7227129d152ee. --- apps/widlockunlock/widget.js | 73 +++++++++++++++++++++--------------- apps/widlockunlock/widget.ts | 46 ----------------------- 2 files changed, 42 insertions(+), 77 deletions(-) delete mode 100644 apps/widlockunlock/widget.ts diff --git a/apps/widlockunlock/widget.js b/apps/widlockunlock/widget.js index e4569f511..f7f872a5e 100644 --- a/apps/widlockunlock/widget.js +++ b/apps/widlockunlock/widget.js @@ -1,34 +1,45 @@ -"use strict"; WIDGETS["lockunlock"] = { - area: (function () { - var _a; - var settings = require("Storage") - .readJSON("lockunlock.settings.json", true) || {}; - return (_a = settings.location) !== null && _a !== void 0 ? _a : "tl"; - })(), - sortorder: 10, - width: 14, - draw: function (w) { - g.reset() - .drawImage(atob(Bangle.isLocked() - ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" - : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), w.x + 1, w.y + 3); - }, + area: (() => { + const settings = require("Storage") + .readJSON("lockunlock.settings.json", true) || {}; + return settings.location || "tl"; + })(), + sortorder: 10, + width: 14, + draw: w => { + g.reset() + .drawImage( + atob(Bangle.isLocked() + ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" + : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), + w.x + 1, + w.y + 3 + ); + }, }; -Bangle.on("lock", function () { return Bangle.drawWidgets(); }); -Bangle.on("touch", function (_btn, e) { - var oversize = 5; - if (!e) - return; - var x = e.x, y = e.y; - var w = WIDGETS["lockunlock"]; - if (w.x - oversize <= x && x < w.x + 14 + oversize - && w.y - oversize <= y && y < w.y + 24 + oversize) { - Bangle.setLocked(true); - var backlightTimeout_1 = Bangle.getOptions().backlightTimeout; - Bangle.setOptions({ backlightTimeout: 100 }); - setTimeout(function () { - Bangle.setOptions({ backlightTimeout: backlightTimeout_1 }); - }, 300); - } +Bangle.on("lock", () => Bangle.drawWidgets()); + +Bangle.on('touch', (_btn, xy) => { + const oversize = 5; + + const w = WIDGETS.lockunlock; + + const x = xy.x; + const y = xy.y; + + if(w.x - oversize <= x && x < w.x + 14 + oversize + && w.y - oversize <= y && y < w.y + 24 + oversize) + { + Bangle.setLocked(true); + + const backlightTimeout = Bangle.getOptions().backlightTimeout; // ms + + // seems to be a race/if we don't give the firmware enough time, + // it won't timeout the backlight and we'll restore it in our setTimeout below + Bangle.setOptions({ backlightTimeout: 100 }); + + setTimeout(() => { + Bangle.setOptions({ backlightTimeout }); + }, 300); + } }); diff --git a/apps/widlockunlock/widget.ts b/apps/widlockunlock/widget.ts deleted file mode 100644 index 5dd1c93e9..000000000 --- a/apps/widlockunlock/widget.ts +++ /dev/null @@ -1,46 +0,0 @@ -WIDGETS["lockunlock"] = { - area: (() => { - const settings = require("Storage") - .readJSON("lockunlock.settings.json", true) || {}; - return settings.location ?? "tl"; - })(), - sortorder: 10, - width: 14, - draw: w => { - g.reset() - .drawImage( - atob(Bangle.isLocked() - ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" - : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), - w.x! + 1, - w.y! + 3 - ); - }, -}; - -Bangle.on("lock", () => Bangle.drawWidgets()); - -Bangle.on("touch", (_btn, e) => { - const oversize = 5; - - if (!e) return; - const { x, y } = e; - - const w = WIDGETS["lockunlock"]!; - - if(w.x! - oversize <= x && x < w.x! + 14 + oversize - && w.y! - oversize <= y && y < w.y! + 24 + oversize) - { - Bangle.setLocked(true); - - const { backlightTimeout } = Bangle.getOptions(); // ms - - // seems to be a race/if we don't give the firmware enough time, - // it won't timeout the backlight and we'll restore it in our setTimeout below - Bangle.setOptions({ backlightTimeout: 100 }); - - setTimeout(() => { - Bangle.setOptions({ backlightTimeout }); - }, 300); - } -}); From c4d571347134dfa9821362985567b184e47ef771 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 27 Feb 2023 20:16:36 +0000 Subject: [PATCH 120/183] Revert "widlockunlock: setting for location" This reverts commit c84d3fa2c0a063e79a5a353d84e81a786938e6d2. --- apps/widlockunlock/metadata.json | 3 +-- apps/widlockunlock/settings.js | 29 ------------------------ apps/widlockunlock/settings.ts | 39 -------------------------------- apps/widlockunlock/widget.js | 6 +---- 4 files changed, 2 insertions(+), 75 deletions(-) delete mode 100644 apps/widlockunlock/settings.js delete mode 100644 apps/widlockunlock/settings.ts diff --git a/apps/widlockunlock/metadata.json b/apps/widlockunlock/metadata.json index daeefbc69..cc4fa76cd 100644 --- a/apps/widlockunlock/metadata.json +++ b/apps/widlockunlock/metadata.json @@ -8,7 +8,6 @@ "tags": "widget,lock", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"widlockunlock.wid.js","url":"widget.js"}, - {"name":"widlockunlock.settings.js","url":"settings.js"} + {"name":"widlockunlock.wid.js","url":"widget.js"} ] } diff --git a/apps/widlockunlock/settings.js b/apps/widlockunlock/settings.js deleted file mode 100644 index 0c3a82c39..000000000 --- a/apps/widlockunlock/settings.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -(function (back) { - var storage = require('Storage'); - var filename = 'lockunlock.settings.json'; - var settings = Object.assign(storage.readJSON(filename, true) || {}, { location: "tl" }); - var save = function () { - return storage.writeJSON(filename, settings); - }; - var locations = ["tl", "tr"]; - var menu = { - '': { 'title': 'Lock/Unlock' }, - '< Back': back, - 'Location': { - value: (function () { - var i = locations.indexOf(settings.location); - return i < 0 ? 0 : i; - })(), - min: 0, - max: locations.length - 1, - wrap: true, - format: function (v) { return locations[v]; }, - onchange: function (v) { - settings.location = locations[v]; - save(); - }, - }, - }; - E.showMenu(menu); -}); diff --git a/apps/widlockunlock/settings.ts b/apps/widlockunlock/settings.ts deleted file mode 100644 index b2b1dc02e..000000000 --- a/apps/widlockunlock/settings.ts +++ /dev/null @@ -1,39 +0,0 @@ -((back: () => void) => { - type Location = "tl" | "tr"; - type Settings = { - location: Location; - }; - - const storage = require('Storage'); - - const filename = 'lockunlock.settings.json'; - const settings: Settings = Object.assign( - storage.readJSON(filename, true) || {}, - { location: "tl" } - ); - - const save = () => - storage.writeJSON(filename, settings); - - const locations: Array = [ "tl", "tr" ]; - - const menu = { - '': { 'title': 'Lock/Unlock' }, - '< Back': back, - 'Location': { - value: (() => { - const i = locations.indexOf(settings.location); - return i < 0 ? 0 : i; - })(), - min: 0, - max: locations.length - 1, - wrap: true, - format: (v: number) => locations[v]!, - onchange: (v: number) => { - settings.location = locations[v]!; - save(); - }, - }, - }; - E.showMenu(menu); -}); diff --git a/apps/widlockunlock/widget.js b/apps/widlockunlock/widget.js index f7f872a5e..21461b4a5 100644 --- a/apps/widlockunlock/widget.js +++ b/apps/widlockunlock/widget.js @@ -1,9 +1,5 @@ WIDGETS["lockunlock"] = { - area: (() => { - const settings = require("Storage") - .readJSON("lockunlock.settings.json", true) || {}; - return settings.location || "tl"; - })(), + area: "tl", sortorder: 10, width: 14, draw: w => { From 96b8e9a3e83593ba0cbc78317d66152bdf2544bf Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 27 Feb 2023 20:19:47 +0000 Subject: [PATCH 121/183] Restore original widlockunlock object --- apps/widlockunlock/widget.js | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/apps/widlockunlock/widget.js b/apps/widlockunlock/widget.js index 21461b4a5..cfbbc87a3 100644 --- a/apps/widlockunlock/widget.js +++ b/apps/widlockunlock/widget.js @@ -1,18 +1,3 @@ -WIDGETS["lockunlock"] = { - area: "tl", - sortorder: 10, - width: 14, - draw: w => { - g.reset() - .drawImage( - atob(Bangle.isLocked() - ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" - : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), - w.x + 1, - w.y + 3 - ); - }, -}; Bangle.on("lock", () => Bangle.drawWidgets()); Bangle.on('touch', (_btn, xy) => { @@ -39,3 +24,6 @@ Bangle.on('touch', (_btn, xy) => { }, 300); } }); +WIDGETS["lockunlock"]={area:"tl",sortorder:10,width:14,draw:function(w) { + g.reset().drawImage(atob(Bangle.isLocked() ? "DBGBAAAA8DnDDCBCBP////////n/n/n//////z/A" : "DBGBAAAA8BnDDCBABP///8A8A8Y8Y8Y8A8A//z/A"), w.x+1, w.y+3); +}}; From e24b8283b10d3b8d5ec729dc92fecc040b1ca66d Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 27 Feb 2023 20:34:12 +0000 Subject: [PATCH 122/183] Simplify toggling whitelist --- apps/boot/bootupdate.js | 2 +- apps/setting/settings.js | 24 +++++++++++------------- apps/setting/settings.min.json | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index 39c34e50b..626171490 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -79,7 +79,7 @@ if (global.save) boot += `global.save = function() { throw new Error("You can't if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`; if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`; if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${E.toJS(s.passkey.toString())}, mitm:1, display:1});\n`; -if (s.whitelist && !s.whitelist.disabled) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.macs.includes(addr)) NRF.disconnect(); });\n`; +if (s.whitelist && !s.whitelist_disabled) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.includes(addr)) NRF.disconnect(); });\n`; if (s.rotate) boot+=`g.setRotation(${s.rotate&3},${s.rotate>>2});\n` // screen rotation // ================================================== FIXING OLDER FIRMWARES if (FWVERSION<215.068) // 2v15.68 and before had compass heading inverted. diff --git a/apps/setting/settings.js b/apps/setting/settings.js index fac5ea181..5d2a5f7c6 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -43,10 +43,6 @@ function resetSettings() { "12hour" : false, // 12 or 24 hour clock? firstDayOfWeek: 0, // 0 -> Sunday (default), 1 -> Monday brightness: 1, // LCD brightness from 0 to 1 - whitelist: { // Bluetooth whitelist - macs: [], - disabled: true, - }, // welcomed : undefined/true (whether welcome app should show) options: { wakeOnBTN1: true, @@ -197,10 +193,10 @@ function showBLEMenu() { /*LANG*/'Whitelist': { value: ( - settings.whitelist.disabled ? /*LANG*/"off" : /*LANG*/"on" + settings.whitelist_disabled ? /*LANG*/"off" : /*LANG*/"on" ) + ( - settings.whitelist.macs - ? " (" + settings.whitelist.macs.length + ")" + settings.whitelist + ? " (" + settings.whitelist.length + ")" : "" ), onchange: () => setTimeout(showWhitelistMenu) // graphical_menu redraws after the call @@ -353,25 +349,25 @@ function showWhitelistMenu() { var menu = { "< Back" : ()=>showBLEMenu(), }; - if (settings.whitelist.disabled) { + if (settings.whitelist_disabled) { menu[/*LANG*/"Enable"] = () => { - delete settings.whitelist.disabled; + delete settings.whitelist_disabled; updateSettings(); showBLEMenu(); }; } else { menu[/*LANG*/"Disable"] = () => { - settings.whitelist.disabled = true; + settings.whitelist_disabled = true; updateSettings(); showBLEMenu(); }; } - if (settings.whitelist.macs) settings.whitelist.macs.forEach(function(d){ + if (settings.whitelist) settings.whitelist.forEach(function(d){ menu[d.substr(0,17)] = function() { E.showPrompt(/*LANG*/'Remove\n'+d).then((v) => { if (v) { - settings.whitelist.macs.splice(settings.whitelist.macs.indexOf(d),1); + settings.whitelist.splice(settings.whitelist.indexOf(d),1); updateSettings(); } setTimeout(showWhitelistMenu, 50); @@ -385,7 +381,9 @@ function showWhitelistMenu() { }); NRF.removeAllListeners('connect'); NRF.on('connect', function(addr) { - settings.whitelist.macs.push(addr); + if (!settings.whitelist) settings.whitelist=[]; + delete settings.whitelist_disabled; + settings.whitelist.push(addr); updateSettings(); NRF.removeAllListeners('connect'); showWhitelistMenu(); diff --git a/apps/setting/settings.min.json b/apps/setting/settings.min.json index d4ea23a8e..984054c11 100644 --- a/apps/setting/settings.min.json +++ b/apps/setting/settings.min.json @@ -1 +1 @@ -{"ble":true,"blerepl":true,"log":false,"timeout":10,"vibrate":true,"beep":"vib","timezone":0,"HID":false,"clock":null,"12hour":false,"brightness":1,"options":{"wakeOnBTN1":true,"wakeOnBTN2":true,"wakeOnBTN3":true,"wakeOnFaceUp":false,"wakeOnTouch":false,"wakeOnTwist":true,"twistThreshold":819.2,"twistMaxY":-800,"twistTimeout":1000},"whitelist":{"disabled":true}} +{"ble":true,"blerepl":true,"log":false,"timeout":10,"vibrate":true,"beep":"vib","timezone":0,"HID":false,"clock":null,"12hour":false,"brightness":1,"options":{"wakeOnBTN1":true,"wakeOnBTN2":true,"wakeOnBTN3":true,"wakeOnFaceUp":false,"wakeOnTouch":false,"wakeOnTwist":true,"twistThreshold":819.2,"twistMaxY":-800,"twistTimeout":1000}} \ No newline at end of file From 5ca69aa0a44f33664b0f437b50b5c1c9f74da20a Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 21:38:14 +0100 Subject: [PATCH 123/183] weatherclock v0.06 --- apps/weather/lib.js | 4 +- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 124 +++++----- apps/weatherClock/lib.js | 399 -------------------------------- apps/weatherClock/metadata.json | 3 +- apps/weatherClock/settings.js | 40 ++-- 6 files changed, 87 insertions(+), 485 deletions(-) delete mode 100644 apps/weatherClock/lib.js diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 14ca77ec6..3d5fe44fd 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -158,10 +158,10 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome=1; + var monochrome = B2 ? 0 : 1; if(!ovr) { ovr = g; - monochrome=0; + monochrome = 0; } palette = getPalette(monochrome, ovr); diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index ceb5a7e1c..4c32f4a6c 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev13-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev15-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index e7bfe5220..ff467cc53 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -2,8 +2,8 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; -let settings; -const weather = require('weatherClock'); +let s; +const w = require('weather'); // weather icons from https://icons8.com/icon/set/weather/color function getSun() { @@ -39,30 +39,28 @@ sent from gadget bridge. */ function chooseIcon(condition) { condition = condition.toLowerCase(); - if (condition.includes("thunderstorm")) return getStorm; + if (condition.includes("thunderstorm")|| + condition.includes("squalls")|| + condition.includes("tornado")) return getStorm; if (condition.includes("freezing")||condition.includes("snow")|| condition.includes("sleet")) { return getSnow; } if (condition.includes("drizzle")|| - condition.includes("shower")) { - return getRain; - } - if (condition.includes("rain")) return getRain; + condition.includes("shower")|| + condition.includes("rain")) return getRain; if (condition.includes("clear")) return getSun; - if (condition.includes("few clouds")) return getPartSun; - if (condition.includes("scattered clouds")) return getCloud; if (condition.includes("clouds")) return getCloud; - if (condition.includes("mist") || - condition.includes("smoke") || - condition.includes("haze") || - condition.includes("sand") || - condition.includes("dust") || - condition.includes("fog") || - condition.includes("ash") || - condition.includes("squalls") || - condition.includes("tornado")) { - return getCloud; + if (condition.includes("few clouds")|| + condition.includes("scattered clouds")|| + condition.includes("mist")|| + condition.includes("smoke")|| + condition.includes("haze")|| + condition.includes("sand")|| + condition.includes("dust")|| + condition.includes("fog")|| + condition.includes("ash")) { + return getPartSun; } return getCloud; } @@ -76,14 +74,18 @@ function chooseIconByCode(code) { switch (codeGroup) { case 2: return getStorm; case 3: return getRain; - case 5: return getRain; + case 5: + switch (code) { + case 511: return getSnow; + default: return getRain; + } case 6: return getSnow; - case 7: return getCloud; + case 7: return getPartSun; case 8: switch (code) { - case 800: return getSun; - case 801: return getPartSun; - default: return getCloud; + case 800: return getSun; + case 804: return getCloud; + default: return getPartSun; } default: return getCloud; } @@ -111,62 +113,62 @@ function queueDraw() { function draw() { var date = new Date(); - clockLayout.time.label = locale.time(date, 1); - clockLayout.date.label = settings.date ? locale.date(date, 1).toUpperCase() : ""; - clockLayout.dow.label = settings.day ? locale.dow(date, 1).toUpperCase() + " " : ""; - let current = weather.get(); - if(current){ - const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); - clockLayout.temp.label = temp[1] + " " + temp[2]; - const code = current.code || -1; + cLayout.time.label = locale.time(date, 1); + cLayout.dow.label = s.day ? locale.dow(date, 1).toUpperCase() + " " : ""; + cLayout.date.label = s.date ? locale.date(date, 1).toUpperCase() : ""; + let curr = w.get(); // Get weather from weather app. + if(curr){ + const temp = locale.temp(curr.temp-273.15).match(/^(\D*\d*)(.*)$/); + cLayout.temp.label = temp[1] + " " + temp[2]; + const code = curr.code || -1; if (code > 0) { - let srcIconsCode = settings.src ? weatherIcon(current.code) : chooseIconByCode(current.code); - clockLayout.weatherIcon.src = settings.icon ? srcIconsCode : getDummy; + let showIconC = s.src ? wDrawIcon(curr.code) : chooseIconByCode(curr.code); + cLayout.wIcon.src = s.icon ? showIconC : getDummy; } else { - let srcIconsTxt = settings.src ? weatherIcon(current.txt) : chooseIcon(current.txt); - clockLayout.weatherIcon.src = settings.icon ? srcIconsTxt : getDummy; + let showIconT = s.src ? wDrawIcon(curr.txt) : chooseIcon(curr.txt); + cLayout.wIcon.src = s.icon ? showIconT : getDummy; } - const wind = locale.speed(current.wind).match(/^(\D*\d*)(.*)$/); - clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (current.wrose||'').toUpperCase(); + const wind = locale.speed(curr.wind).match(/^(\D*\d*)(.*)$/); + cLayout.wind.label = wind[1] + " " + wind[2] + " " + (curr.wrose||'').toUpperCase(); } else{ - clockLayout.temp.label = "Err"; - clockLayout.wind.label = "No Data"; - clockLayout.weatherIcon.src = settings.icon ? getErr : getDummy; + cLayout.temp.label = "Err"; + cLayout.wind.label = "No Data"; + cLayout.wIcon.src = s.icon ? getErr : getDummy; } - clockLayout.clear(); - clockLayout.render(); + cLayout.clear(); + cLayout.render(); // queue draw in one minute queueDraw(); } function loadSettings() { - settings = storage.readJSON(SETTINGS_FILE,1)||{}; - settings.src = settings.src === undefined ? false : settings.src; - settings.icon = settings.icon === undefined ? true : settings.icon; - settings.day = settings.day === undefined ? true : settings.day; - settings.date = settings.date === undefined ? true : settings.date; - settings.wind = settings.wind === undefined ? true : settings.wind; + s = storage.readJSON(SETTINGS_FILE,1)||{}; + s.src = s.src === undefined ? false : s.src; + s.icon = s.icon === undefined ? true : s.icon; + s.day = s.day === undefined ? true : s.day; + s.date = s.date === undefined ? true : s.date; + s.wind = s.wind === undefined ? true : s.wind; } loadSettings(); -function weatherIcon(code) { +function wDrawIcon(code) { var ovr = Graphics.createArrayBuffer(50,50,8,{msb:true}); - if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); - if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); + if (typeof code == "number") w.drawIcon({code:code},24,24,24,ovr); + if (typeof code == "string") w.drawIcon({txt:code},24,24,24,ovr); var img = ovr.asImage(); img.transparent = 0; return img; } -let srcIcons = settings.src ? weatherIcon(800) : getSun; -let srcWeather = settings.icon ? srcIcons : getDummy; -let fontTemp = settings.wind ? "10%" : "20%"; -let fontWind = settings.wind ? "10%" : "0%"; -let labelDay = settings.day ? "THU" : ""; -let labelDate = settings.date ? "01/01/1970" : ""; -var clockLayout = new Layout( { +let srcIcons = s.src ? wDrawIcon(800) : getSun; +let srcWeather = s.icon ? srcIcons : getDummy; +let fontTemp = s.wind ? "10%" : "20%"; +let fontWind = s.wind ? "10%" : "0%"; +let labelDay = s.day ? "THU" : ""; +let labelDate = s.date ? "01/01/1970" : ""; +var cLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, {type: "h", fillx: 1, c: [ @@ -177,7 +179,7 @@ var clockLayout = new Layout( { ] }, {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, pad: 8, id: "weatherIcon", src: srcWeather}, + {type: "img", filly: 1, pad: 8, id: "wIcon", src: srcWeather}, {type: "v", fillx:1, c: [ {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, @@ -194,5 +196,5 @@ g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); Bangle.drawWidgets(); -clockLayout.render(); +cLayout.render(); draw(); diff --git a/apps/weatherClock/lib.js b/apps/weatherClock/lib.js deleted file mode 100644 index 48a290824..000000000 --- a/apps/weatherClock/lib.js +++ /dev/null @@ -1,399 +0,0 @@ -const storage = require('Storage'); -const B2 = process.env.HWVERSION===2; - -let expiryTimeout; -function scheduleExpiry(json) { - if (expiryTimeout) { - clearTimeout(expiryTimeout); - expiryTimeout = undefined; - } - let expiry = "expiry" in json ? json.expiry : 2*3600000; - if (json.weather && json.weather.time && expiry) { - let t = json.weather.time + expiry - Date.now(); - expiryTimeout = setTimeout(update, t); - } -} - -function update(weatherEvent) { - let json = storage.readJSON('weather.json')||{}; - - if (weatherEvent) { - let weather = weatherEvent.clone(); - delete weather.t; - weather.time = Date.now(); - if (weather.wdir != null) { - // Convert numeric direction into human-readable label - let deg = weather.wdir; - while (deg<0 || deg>360) { - deg = (deg+360)%360; - } - weather.wrose = ['n','ne','e','se','s','sw','w','nw','n'][Math.floor((deg+22.5)/45)]; - } - - json.weather = weather; - } - else { - delete json.weather; - } - - storage.write('weather.json', json); - scheduleExpiry(json); - exports.emit("update", json.weather); -} - -const _GB = global.GB; -global.GB = (event) => { - if (event.t==="weather") update(event); - if (_GB) setTimeout(_GB, 0, event); -}; - -exports.get = function() { - return (storage.readJSON('weather.json')||{}).weather; -} - -scheduleExpiry(storage.readJSON('weather.json')||{}); - -function getPalette(monochrome, ovr) { - var palette; - if(monochrome) { - palette = { - sun: '#FFF', - cloud: '#FFF', - bgCloud: '#FFF', - rain: '#FFF', - lightning: '#FFF', - snow: '#FFF', - mist: '#FFF', - background: '#000' - }; - } else { - if (B2) { - if (ovr.theme.dark) { - palette = { - sun: '#FF0', - cloud: '#FFF', - bgCloud: '#777', // dithers on B2, but that's ok - rain: '#0FF', - lightning: '#FF0', - snow: '#FFF', - mist: '#FFF' - }; - } else { - palette = { - sun: '#FF0', - cloud: '#777', // dithers on B2, but that's ok - bgCloud: '#000', - rain: '#00F', - lightning: '#FF0', - snow: '#0FF', - mist: '#0FF' - }; - } - } else { - if (ovr.theme.dark) { - palette = { - sun: '#FE0', - cloud: '#BBB', - bgCloud: '#777', - rain: '#0CF', - lightning: '#FE0', - snow: '#FFF', - mist: '#FFF' - }; - } else { - palette = { - sun: '#FC0', - cloud: '#000', - bgCloud: '#777', - rain: '#07F', - lightning: '#FC0', - snow: '#CCC', - mist: '#CCC' - }; - } - } - } - return palette; -} - -exports.getColor = function(code) { - const codeGroup = Math.round(code / 100); - const palette = getPalette(0, g); - const cloud = g.blendColor(palette.cloud, palette.bgCloud, .5); //theme independent - switch (codeGroup) { - case 2: return g.blendColor(cloud, palette.lightning, .5); - case 3: return palette.rain; - case 5: - switch (code) { - case 511: return palette.snow; - case 520: return g.blendColor(palette.rain, palette.sun, .5); - case 521: return g.blendColor(palette.rain, palette.sun, .5); - case 522: return g.blendColor(palette.rain, palette.sun, .5); - case 531: return g.blendColor(palette.rain, palette.sun, .5); - default: return palette.rain; - } - case 6: return palette.snow; - case 7: return palette.mist; - case 8: - switch (code) { - case 800: return palette.sun; - case 801: return palette.sun; - case 802: return cloud; - default: return cloud; - } - default: return cloud; - } -} - -/** - * - * @param cond Weather condition, as one of: - * {number} code: (Preferred form) https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 - * {string} weather description (in English: breaks for other languages!) - * {object} use cond.code if present, or fall back to cond.txt - * @param x Left - * @param y Top - * @param r Icon Size - * @param ovr Graphics instance (or undefined for g) - */ -exports.drawIcon = function(cond, x, y, r, ovr) { - var palette; - var monochrome=0; - if(!ovr) { - ovr = g; - monochrome=0; - } - - palette = getPalette(monochrome, ovr); - - function drawSun(x, y, r) { - ovr.setColor(palette.sun); - ovr.fillCircle(x, y, r); - } - - function drawCloud(x, y, r, c) { - const u = r/12; - if (c==null) c = palette.cloud; - ovr.setColor(c); - ovr.fillCircle(x-8*u, y+3*u, 4*u); - ovr.fillCircle(x-4*u, y-2*u, 5*u); - ovr.fillCircle(x+4*u, y+0*u, 4*u); - ovr.fillCircle(x+9*u, y+4*u, 3*u); - ovr.fillPoly([ - x-8*u, y+7*u, - x-8*u, y+3*u, - x-4*u, y-2*u, - x+4*u, y+0*u, - x+9*u, y+4*u, - x+9*u, y+7*u, - ]); - } - - function drawBrokenClouds(x, y, r) { - drawCloud(x+1/8*r, y-1/8*r, 7/8*r, palette.bgCloud); - if(monochrome) - drawCloud(x-1/8*r, y+2/16*r, r, palette.background); - drawCloud(x-1/8*r, y+1/8*r, 7/8*r); - } - - function drawFewClouds(x, y, r) { - drawSun(x+3/8*r, y-1/8*r, 5/8*r); - if(monochrome) - drawCloud(x-1/8*r, y+2/16*r, r, palette.background); - drawCloud(x-1/8*r, y+1/8*r, 7/8*r); - } - - function drawRainLines(x, y, r) { - ovr.setColor(palette.rain); - const y1 = y+1/2*r; - const y2 = y+1*r; - const poly = ovr.fillPolyAA ? p => ovr.fillPolyAA(p) : p => ovr.fillPoly(p); - poly([ - x-6/12*r, y1, - x-8/12*r, y2, - x-7/12*r, y2, - x-5/12*r, y1, - ]); - poly([ - x-2/12*r, y1, - x-4/12*r, y2, - x-3/12*r, y2, - x-1/12*r, y1, - ]); - poly([ - x+2/12*r, y1, - x+0/12*r, y2, - x+1/12*r, y2, - x+3/12*r, y1, - ]); - } - - function drawShowerRain(x, y, r) { - drawFewClouds(x, y-1/3*r, r); - drawRainLines(x, y, r); - } - - function drawRain(x, y, r) { - drawBrokenClouds(x, y-1/3*r, r); - drawRainLines(x, y, r); - } - - function drawThunderstorm(x, y, r) { - function drawLightning(x, y, r) { - ovr.setColor(palette.lightning); - ovr.fillPoly([ - x-2/6*r, y-r, - x-4/6*r, y+1/6*r, - x-1/6*r, y+1/6*r, - x-3/6*r, y+1*r, - x+3/6*r, y-1/6*r, - x+0/6*r, y-1/6*r, - x+3/6*r, y-r, - ]); - } - - if(monochrome) drawBrokenClouds(x, y-1/3*r, r); - drawLightning(x-1/12*r, y+1/2*r, 1/2*r); - drawBrokenClouds(x, y-1/3*r, r); - } - - function drawSnow(x, y, r) { - function rotatePoints(points, pivotX, pivotY, angle) { - for(let i = 0; i {}; - txt = txt.toLowerCase(); - if (txt.includes("thunderstorm")) return drawThunderstorm; - if (txt.includes("freezing")||txt.includes("snow")|| - txt.includes("sleet")) { - return drawSnow; - } - if (txt.includes("drizzle")|| - txt.includes("shower")) { - return drawRain; - } - if (txt.includes("rain")) return drawShowerRain; - if (txt.includes("clear")) return drawSun; - if (txt.includes("few clouds")) return drawFewClouds; - if (txt.includes("scattered clouds")) return drawCloud; - if (txt.includes("clouds")) return drawBrokenClouds; - if (txt.includes("mist") || - txt.includes("smoke") || - txt.includes("haze") || - txt.includes("sand") || - txt.includes("dust") || - txt.includes("fog") || - txt.includes("ash") || - txt.includes("squalls") || - txt.includes("tornado")) { - return drawMist; - } - return drawUnknown; - } - - /* - * Choose weather icon to display based on weather conditition code - * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 - */ - function chooseIconByCode(code) { - const codeGroup = Math.round(code / 100); - switch (codeGroup) { - case 2: return drawThunderstorm; - case 3: return drawRain; - case 5: - switch (code) { - case 511: return drawSnow; - case 520: return drawShowerRain; - case 521: return drawShowerRain; - case 522: return drawShowerRain; - case 531: return drawShowerRain; - default: return drawRain; - } - case 6: return drawSnow; - case 7: return drawMist; - case 8: - switch (code) { - case 800: return drawSun; - case 801: return drawFewClouds; - case 802: return drawCloud; - default: return drawBrokenClouds; - } - default: return drawUnknown; - } - } - - function chooseIcon(cond) { - if (typeof (cond)==="object") { - if ("code" in cond) return chooseIconByCode(cond.code); - if ("txt" in cond) return chooseIconByTxt(cond.txt); - } else if (typeof (cond)==="number") { - return chooseIconByCode(cond.code); - } else if (typeof (cond)==="string") { - return chooseIconByTxt(cond.txt); - } - return drawUnknown; - } - chooseIcon(cond)(x, y, r); - -}; diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 4addc67ac..270591c74 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -15,8 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"settings.js"}, - {"name":"weatherClock","url":"lib.js"} + {"name":"weatherClock.settings.js","url":"settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index bc4544b31..0aa7330c1 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -5,11 +5,11 @@ const storage = require('Storage'); let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; let s = {}; - s.src = (settings.src === undefined ? false : settings.src); - s.icon = (settings.icon === undefined ? true : settings.icon); - s.day = (settings.day === undefined ? true : settings.day); s.date = (settings.date === undefined ? true : settings.date); + s.day = (settings.day === undefined ? true : settings.day); + s.icon = (settings.icon === undefined ? true : settings.icon); s.wind = (settings.wind === undefined ? true : settings.wind); + s.src = (settings.src === undefined ? false : settings.src); function save() { settings = s @@ -19,35 +19,35 @@ E.showMenu({ '': { 'title': 'Weather Clock' }, '< Back': back, - 'Weather Icon': { - value: !!s.icon, - onchange: v => { - s.icon = v; - save(); - }, - }, - 'Day Of Week': { - value: !!s.day, - onchange: v => { - s.day = v; - save(); - }, - }, - 'Date': { + 'Show date': { value: !!s.date, onchange: v => { s.date = v; save(); }, }, - 'Wind Speed': { + 'Show day Of Week': { + value: !!s.day, + onchange: v => { + s.day = v; + save(); + }, + }, + 'Show weather Icon': { + value: !!s.icon, + onchange: v => { + s.icon = v; + save(); + }, + }, + 'Show wind Speed': { value: !!s.wind, onchange: v => { s.wind = v; save(); }, }, - 'Icons from weather app': { + 'Use weather app icons': { value: !!s.src, onchange: v => { s.src = v; From f8766bcd8411340df81f732e0d7ee8e3df3eb659 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 21:43:20 +0100 Subject: [PATCH 124/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 14 +++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 4c32f4a6c..98e4b4522 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev15-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev16-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index ff467cc53..8396b19a8 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -48,7 +48,7 @@ function chooseIcon(condition) { } if (condition.includes("drizzle")|| condition.includes("shower")|| - condition.includes("rain")) return getRain; + condition.includes("rain")) return getRain; if (condition.includes("clear")) return getSun; if (condition.includes("clouds")) return getCloud; if (condition.includes("few clouds")|| @@ -75,7 +75,7 @@ function chooseIconByCode(code) { case 2: return getStorm; case 3: return getRain; case 5: - switch (code) { + switch (code) { case 511: return getSnow; default: return getRain; } @@ -83,7 +83,7 @@ function chooseIconByCode(code) { case 7: return getPartSun; case 8: switch (code) { - case 800: return getSun; + case 800: return getSun; case 804: return getCloud; default: return getPartSun; } @@ -91,14 +91,6 @@ function chooseIconByCode(code) { } } -/** -Get weather stored in json file by weather app. -*/ -function getWeather() { - let jsonWeather = storage.readJSON('weather.json'); - return jsonWeather; -} - // timeout used to update every minute var drawTimeout; From da4113467843423cda49f2224966252c1af70af4 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 22:21:09 +0100 Subject: [PATCH 125/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/README.md | 6 +++--- apps/weatherClock/app.js | 17 +++++++---------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 98e4b4522..31b1d4993 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev16-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. diff --git a/apps/weatherClock/README.md b/apps/weatherClock/README.md index c72a575ec..a7f44f7f7 100644 --- a/apps/weatherClock/README.md +++ b/apps/weatherClock/README.md @@ -1,14 +1,14 @@ # Weather Clock -A clock which displays the current weather conditions. Time, day of week, date, temperature, wind speed, and an icon indicating the weather conditions are displayed. +A clock which displays the current weather conditions. Time, day of week, date, temperature, wind speed, and an icon indicating the weather condition are displayed. -As of Weather Clock v0.06 the day of week, date, temperature and/or wind speed can be hidden using settings. +As of Weather Clock v0.06 the date, day of week, temperature, weather icon and/or wind speed can be hidden in Settings. The icons can be changed to those of the Weather app. Standard widgets are displayed. ## Requirements -**This clock requires Gadgetbridge and the weather app in order to get weather data!** +**This clock requires Gadgetbridge and the Weather app in order to get weather data!** See the [Bangle.js Gadgetbridge documentation](https://www.espruino.com/Gadgetbridge) for instructions on setting up Gadgetbridge and weather. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 8396b19a8..116fa3140 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -134,16 +134,13 @@ function draw() { queueDraw(); } -function loadSettings() { - s = storage.readJSON(SETTINGS_FILE,1)||{}; - s.src = s.src === undefined ? false : s.src; - s.icon = s.icon === undefined ? true : s.icon; - s.day = s.day === undefined ? true : s.day; - s.date = s.date === undefined ? true : s.date; - s.wind = s.wind === undefined ? true : s.wind; -} - -loadSettings(); +// Load settings from file +s = storage.readJSON(SETTINGS_FILE,1)||{}; +s.src = s.src === undefined ? false : s.src; +s.icon = s.icon === undefined ? true : s.icon; +s.day = s.day === undefined ? true : s.day; +s.date = s.date === undefined ? true : s.date; +s.wind = s.wind === undefined ? true : s.wind; function wDrawIcon(code) { var ovr = Graphics.createArrayBuffer(50,50,8,{msb:true}); From 43448e42c9a6bb636bca29b5f87cec3e9df7f61e Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 27 Feb 2023 23:31:10 +0100 Subject: [PATCH 126/183] messagesoverlay - Fix handlers being restored incorrectly if message removed --- apps/messagesoverlay/ChangeLog | 3 ++- apps/messagesoverlay/lib.js | 35 ++++++++++-------------------- apps/messagesoverlay/metadata.json | 2 +- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/apps/messagesoverlay/ChangeLog b/apps/messagesoverlay/ChangeLog index da98bfbce..d557bc5e1 100644 --- a/apps/messagesoverlay/ChangeLog +++ b/apps/messagesoverlay/ChangeLog @@ -1 +1,2 @@ -0.01: Initial fork from messages_light \ No newline at end of file +0.01: Initial fork from messages_light +0.02: Fix touch/drag/swipe handlers not being restored correctly if a message is removed diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index cc6b63176..5c0f50f1c 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -389,19 +389,17 @@ let getTouchHandler = function(ovr){ }; }; -let touchHandler; -let swipeHandler; - let restoreHandler = function(event){ - if (backup[event]){ - Bangle["#on" + event]=backup[event]; - backup[event] = undefined; - } + LOG("Restore", event, backup[event]); + Bangle.removeAllListeners(event); + Bangle["#on" + event]=backup[event]; + backup[event] = undefined; }; let backupHandler = function(event){ - if (eventQueue.length > 1 && ovr) return; // do not backup, overlay is already up + if (backupDone) return; // do not backup, overlay is already up backup[event] = Bangle["#on" + event]; + LOG("Backed up", backup[event]); Bangle.removeAllListeners(event); }; @@ -414,21 +412,16 @@ let cleanup = function(){ restoreHandler("swipe"); restoreHandler("drag"); - if (touchHandler) { - Bangle.removeListener("touch", touchHandler); - touchHandler = undefined; - } - if (swipeHandler) { - Bangle.removeListener("swipe", swipeHandler); - swipeHandler = undefined; - } Bangle.setLCDOverlay(); + backupDone = false; ovr = undefined; quiet = undefined; }; let backup = {}; +let backupDone = false; + let main = function(ovr, event) { LOG("Main", event, settings); @@ -441,13 +434,9 @@ let main = function(ovr, event) { backupHandler("touch"); backupHandler("swipe"); backupHandler("drag"); - - if (touchHandler) Bangle.removeListener("touch",touchHandler); - if (swipeHandler) Bangle.removeListener("swipe",swipeHandler); - touchHandler = getTouchHandler(ovr); - swipeHandler = getSwipeHandler(ovr); - Bangle.on('touch', touchHandler); - Bangle.on('swipe', swipeHandler); + backupDone=true; + Bangle.on('touch', getTouchHandler(ovr)); + Bangle.on('swipe', getSwipeHandler(ovr)); if (event !== undefined){ drawBorder(ovr); diff --git a/apps/messagesoverlay/metadata.json b/apps/messagesoverlay/metadata.json index 9efe95d26..9fe5befe5 100644 --- a/apps/messagesoverlay/metadata.json +++ b/apps/messagesoverlay/metadata.json @@ -1,7 +1,7 @@ { "id": "messagesoverlay", "name": "Messages Overlay", - "version": "0.01", + "version": "0.02", "description": "An overlay based implementation of a messages UI (display notifications from iOS and Gadgetbridge/Android)", "icon": "app.png", "type": "bootloader", From c440a5d143d93c4659009ca875faaec602c57ccd Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 27 Feb 2023 23:33:47 +0100 Subject: [PATCH 127/183] messagesoverlay - Remove unused files --- apps/messagesoverlay/app-icon.png | Bin 2841 -> 0 bytes apps/messagesoverlay/metadata.json | 1 - apps/messagesoverlay/settings.js | 1 - 3 files changed, 2 deletions(-) delete mode 100644 apps/messagesoverlay/app-icon.png delete mode 100644 apps/messagesoverlay/settings.js diff --git a/apps/messagesoverlay/app-icon.png b/apps/messagesoverlay/app-icon.png deleted file mode 100644 index c9b4b62ac2eadee63a98380856f9337d0050578a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2841 zcmbVO2~<;O8VwW_P{0MW6~X6o5Ja<*9YV;4CXfY@e4Qhfi(JV|afbZ2e!VsnszzUX}CO1gXY%Dh4h$iL7 zCnNb9gr|aqQBb6X4-)85lM=G%w0eSX5y1U<`QY02m3=m`@Pj6CM$a-ReBZCwr5F=(VVYnW$WmIP3 zW|II0o!Tkr49>KAVn8M!7}cUQQ0Ww!jgkW>m;W_Xr*onSQzH7h-?t_vlJg8GH4!Cn zvk^f7e1fACVUp#576-__N3bjh)tj8*D#RIUFdMb~GN}+Mszr4GMgUfHXP<^_+=LU^ z_&Y>!zIIAs;7g3C(u5n6aa`+|a)KiZ#9&YuP^bdatMFW6l8w+n04i0QPyq}^4u(x9 z)49oXCO@3Zr*kLM=zJQ@4wd67Or7^OC~yZo{0%7Zn@VX?z7JR~=TFlUCZ!%hr%44c zXo`YiDn1iIkW7TmA}iH24w=hha>-mSM@>c$6`O&mG8sIcvcE47FU1kFO+H7w3dGCU zY;KH`$76t4KxYBnsu*a(2$(}2F zXDrp(Oe{tK$K(yH=_GXFz?BvQy#cTDm56P93SdGBdWHuczOCW+8<{<6ZZ-;1zUjC( zY-EQKxZ0GfG@_y`Fy8;|XnPQnt<-0sV85ioHkwr1&SK|9wd?|pq|Ft7J zg26UxyL9gF;Kun2f$9NGBiR4XM8;txk{eh8qU7wQe{MP-m#*+@65?a0HjNV*cDUTG zu8Ll^eoD!3&%e#y-nwGQ_^@xM?-@pm2%gLlk5XD3^-Qgq zbl1=CRB7zKZ7l~co#GY?ZywEiP+$&g9vyTfqVu0b<2BynwncYmNlU7R&fV*o?myps z=NQ}3>`^!P$OkXod|Yat@FII(_|)wV^~xG2FN@vYG#(a~$HpG;6%FqiIeaSo#q?#w zF_%8C$mww6Y_ae=2V%^I)-9L%qE#DmEWF#7j;I76{rd zTOh@mj9XBWUuiUykz-uBa^;Lw@)C_an89F7dA!G3GNtMCX)kwo_vO!SUca7@mR3=> zBi?Ixahrbh!7BlpT(h~nsbft-=-Q9Jvs&Xc8qL|4cUr@{?%Y}NeM*X)&pCbOO#P;L zKit5=T;t;63Z6YIH*i;+QzHu&bf=$S357E;tm~_Vfq{XSfB7Z&p^#1&6&5y*r|fe3 zRm&EC`SYP1?%0*zpZw!KZ;_wBzkg)@I&OID)vGHaqJn04X5)BMN6+dFqj=Se^7FY- zQ7c;`A|jg49X;}3%jV4={=3j<+`d)3b?GD*y*0r4d!S~1pQ5U=@@yTel-dz95mxYI z-qgY2v?C=OHg3#&^>T4RNKQoV-K$^j-5YkG?T@nb{Vhvw%|5=m==tM&-`3W~%$++o zeGxQl+u_5Nt*xy@eGx~QuQYb)4QTRW=p+BnT;9vvMW zCbPMwuC5FWEF+_6`SRtHM>cp!TsOyu#P3e}y}T{xdCbI+ke;UnGiJ_AN=!WQiSM}k z`A1c1^_-JW+ON*$F655YYPCT4<`XAeN$0l;n>rt?*|J4<%CGVpRX~bg>DOPAA3b_x z>1lT-`HqWX%A+a*&#(13vgAc&Z?8Er$amkqeGhwkYZ@93v=&+{n~onB`S|#>|7NvX zz3-)NkRJOp=hDTC;+!0IT3T9NI%Qr%LHU*2s9t|J@zt6&!;@2F`{2a%bZsA#vo=2D zvllNG=k<24zuwt71nTYWWw2QOag9|~RbN$Cho)H<=5>2M=?sInix1b=2XisTK=yRXNJ5D7X{LV7^N%3Vxr#PB-UlF8y-@3E}la zmq?2vZ~5i=%S3SR)A?n|E3TB5bwT74 Date: Mon, 27 Feb 2023 18:40:15 -0500 Subject: [PATCH 128/183] removed an extra newline --- apps/multidice/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 43c3fb0b3..056e5a7eb 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -2,7 +2,6 @@ roll anywhere from 1-8 dice at the same time. - ## Usage On the menu screen: tap on the dice to change what variant is selected, & shake/or press BTN to roll the dice From a40d7cee5c7f23dc5292e5f59b6cbd4aa98ae94d Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Mon, 27 Feb 2023 18:41:10 -0500 Subject: [PATCH 129/183] tabs, since app is p. much finalized --- apps/multidice/app.js | 296 +++++++++++++++++++++--------------------- 1 file changed, 148 insertions(+), 148 deletions(-) diff --git a/apps/multidice/app.js b/apps/multidice/app.js index d0f13ae7c..53f67e21e 100644 --- a/apps/multidice/app.js +++ b/apps/multidice/app.js @@ -4,182 +4,182 @@ const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a sing // function to draw the selection menu function drawMenu() { - - stringArr = new Array ("", "", "", "", "", "", "", ""); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; - } else { - - stringArr [i] = " . "; // more clearly defines where the user can tap - } - } - - g.clear(); - g.setFont ("Vector", 40); - - // " ".slice(-3) left-pads all numbers with spaces - g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); - g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); - g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); - g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); - g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); - g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); - g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); - g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); + + stringArr = new Array ("", "", "", "", "", "", "", ""); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]]; + } else { + + stringArr [i] = " . "; // more clearly defines where the user can tap + } + } + + g.clear(); + g.setFont ("Vector", 40); + + // " ".slice(-3) left-pads all numbers with spaces + g.drawString ((" " + stringArr [0]).slice (-3), 5, 10); + g.drawString ((" " + stringArr [1]).slice (-3), 5, 50); + g.drawString ((" " + stringArr [2]).slice (-3), 5, 90); + g.drawString ((" " + stringArr [3]).slice (-3), 5, 130); + g.drawString ((" " + stringArr [4]).slice (-3), 96, 10); + g.drawString ((" " + stringArr [5]).slice (-3), 96, 50); + g.drawString ((" " + stringArr [6]).slice (-3), 96, 90); + g.drawString ((" " + stringArr [7]).slice (-3), 96, 130); } // function to change what dice is selected in the menu function touchHandler (button, xy) { - - if (! menu) { // if menu isn't open, open it & return - - menu = true; - drawMenu(); - return; - } - - if (xy.x <= 87) { // left - - if (xy.y <= 43) { // first - - selection = 0; - } else if (xy.y <= 87) { // second - - selection = 1; - } else if (xy.y <= 131) { // third - - selection = 2; - } else { // fourth - - selection = 3; - } - } else { // right - - if (xy.y <= 43) { // first - - selection = 4; - } else if (xy.y <= 87) { // second - - selection = 5; - } else if (xy.y <= 131) { // third - - selection = 6; - } else { // fourth - - selection = 7; - } - } - - if (SELECTION_ARRAY [selection] == SELECTION_ARRAY.length - 1) { // if last dice is selected, go back to first - - SELECTION_ARRAY [selection] = 0; - } else { - - SELECTION_ARRAY [selection] += 1; - } - - drawMenu(); + + if (! menu) { // if menu isn't open, open it & return + + menu = true; + drawMenu(); + return; + } + + if (xy.x <= 87) { // left + + if (xy.y <= 43) { // first + + selection = 0; + } else if (xy.y <= 87) { // second + + selection = 1; + } else if (xy.y <= 131) { // third + + selection = 2; + } else { // fourth + + selection = 3; + } + } else { // right + + if (xy.y <= 43) { // first + + selection = 4; + } else if (xy.y <= 87) { // second + + selection = 5; + } else if (xy.y <= 131) { // third + + selection = 6; + } else { // fourth + + selection = 7; + } + } + + if (SELECTION_ARRAY [selection] == SELECTION_ARRAY.length - 1) { // if last dice is selected, go back to first + + SELECTION_ARRAY [selection] = 0; + } else { + + SELECTION_ARRAY [selection] += 1; + } + + drawMenu(); } function accelHandler (xyz) { - - if (xyz.diff >= 0.3) { - - menu = false; - mutex (rollDice).catch (() => { - - return; // not necessary, but prevents spamming the logs - }); - } + + if (xyz.diff >= 0.3) { + + menu = false; + mutex (rollDice).catch (() => { + + return; // not necessary, but prevents spamming the logs + }); + } } // returns a resolved promise if no other mutex call is active, all further ones return a rejected one let lock = false; function mutex (functionRef) { - - if (lock) { - - return Promise.reject (new Error ("mutex is busy")); - } - - lock = true; - return new Promise ((resolve, reject) => { - - functionRef().then ((result) => { - - lock = false; - resolve (result); - }).catch ((error) => { - - lock = false; - reject (error); - }); - }); + + if (lock) { + + return Promise.reject (new Error ("mutex is busy")); + } + + lock = true; + return new Promise ((resolve, reject) => { + + functionRef().then ((result) => { + + lock = false; + resolve (result); + }).catch ((error) => { + + lock = false; + reject (error); + }); + }); } // function to roll all selected dice, and display them function rollDice() { - - resultsArr = new Uint8Array (8); - for (i = 0; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); - } - } - - g.clear(); - g.setFont ("Vector", 40); - - for (i = 0; i < 4; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); - } - } - - for (i = 4; i < 8; i++) { - - if (SELECTION_ARRAY [i] != 0) { - - g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); - } - } - - return vibrate(); + + resultsArr = new Uint8Array (8); + for (i = 0; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]); + } + } + + g.clear(); + g.setFont ("Vector", 40); + + for (i = 0; i < 4; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i); + } + } + + for (i = 4; i < 8; i++) { + + if (SELECTION_ARRAY [i] != 0) { + + g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4)); + } + } + + return vibrate(); } // triggers the vibration, then pauses before returning function vibrate() { - - return new Promise ((resolve, reject) => { - - return Bangle.buzz (50, 1).then ((value) => { - - setTimeout (() => { - - resolve (value); - }, 200); - }); - }); + + return new Promise ((resolve, reject) => { + + return Bangle.buzz (50, 1).then ((value) => { + + setTimeout (() => { + + resolve (value); + }, 200); + }); + }); } // returns a integer [1, max] function random (max) { - - return Math.round (Math.random() * (max - 1) + 1); + + return Math.round (Math.random() * (max - 1) + 1); } drawMenu(); Bangle.on ('touch', touchHandler); Bangle.on ('accel', accelHandler); setWatch (function() { - - menu = false; - mutex (rollDice); + + menu = false; + mutex (rollDice); }, BTN, {repeat: true, edge: "falling", debounce: 10}); From aacf2e3c1a753b0f45c9ef853b93babfba69b5e2 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 28 Feb 2023 07:57:06 +0100 Subject: [PATCH 130/183] messagesoverlay - Only add listeners once --- apps/messagesoverlay/lib.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 5c0f50f1c..2d5feae94 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -434,9 +434,11 @@ let main = function(ovr, event) { backupHandler("touch"); backupHandler("swipe"); backupHandler("drag"); + if (!backupDone){ + Bangle.on('touch', getTouchHandler(ovr)); + Bangle.on('swipe', getSwipeHandler(ovr)); + } backupDone=true; - Bangle.on('touch', getTouchHandler(ovr)); - Bangle.on('swipe', getSwipeHandler(ovr)); if (event !== undefined){ drawBorder(ovr); From 6e4f6c69c06b92194cc3259b8fb18f60557c0bb6 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Tue, 28 Feb 2023 08:36:37 +0100 Subject: [PATCH 131/183] weatherclock v0.06 --- apps/weather/lib.js | 2 +- apps/weatherClock/ChangeLog | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 3d5fe44fd..9bc8e0291 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -158,7 +158,7 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome = B2 ? 0 : 1; + var monochrome = 1; if(!ovr) { ovr = g; monochrome = 0; diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 31b1d4993..75f1edfa4 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. +0.06: Dev-Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. From b163721777ede23efe417a9f7a295584577935e4 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Tue, 28 Feb 2023 17:57:51 +0100 Subject: [PATCH 132/183] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 75f1edfa4..f31e15729 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev-Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. +0.06: WeatherClock icons now reflect weather conditions better. Add settings menu to hide elements and to use weather icons of Weather app. Images placed into functions for performance. \ No newline at end of file diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 116fa3140..4896a9f49 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -1,11 +1,11 @@ const Layout = require("Layout"); -const storage = require('Storage'); +const storage = require("Storage"); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; let s; -const w = require('weather'); +const w = require("weather"); -// weather icons from https://icons8.com/icon/set/weather/color +// Weather icons from https://icons8.com/icon/set/weather/color function getSun() { return require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); } @@ -91,10 +91,10 @@ function chooseIconByCode(code) { } } -// timeout used to update every minute +// Timeout used to update every minute var drawTimeout; -// schedule a draw for the next minute +// Schedule a draw for the next minute function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { @@ -121,7 +121,7 @@ function draw() { cLayout.wIcon.src = s.icon ? showIconT : getDummy; } const wind = locale.speed(curr.wind).match(/^(\D*\d*)(.*)$/); - cLayout.wind.label = wind[1] + " " + wind[2] + " " + (curr.wrose||'').toUpperCase(); + cLayout.wind.label = wind[1] + " " + wind[2] + " " + (curr.wrose||"").toUpperCase(); } else{ cLayout.temp.label = "Err"; @@ -130,7 +130,7 @@ function draw() { } cLayout.clear(); cLayout.render(); - // queue draw in one minute + // Queue draw in one minute queueDraw(); } From f7e8cc46e79ea3b0f268dbad83bf42b58cf1c382 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Tue, 28 Feb 2023 18:32:14 +0100 Subject: [PATCH 133/183] weatherclock v0.06 --- apps/weather/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 9bc8e0291..14ca77ec6 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -158,10 +158,10 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome = 1; + var monochrome=1; if(!ovr) { ovr = g; - monochrome = 0; + monochrome=0; } palette = getPalette(monochrome, ovr); From 92378a3137cec323096ad313ae799b3728959851 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Tue, 28 Feb 2023 19:00:41 +0100 Subject: [PATCH 134/183] messages_light update -> new management of events implemented --- apps/messages_light/ChangeLog | 3 +- apps/messages_light/messages_light.app.js | 166 +++--------------- apps/messages_light/messages_light.boot.js | 36 +--- .../messages_light/messages_light.listener.js | 43 +++++ .../messages_light.messagesProxy.js | 57 ------ apps/messages_light/messages_light.music.js | 7 - .../messages_light/messages_light.settings.js | 7 - apps/messages_light/metadata.json | 7 +- 8 files changed, 84 insertions(+), 242 deletions(-) create mode 100644 apps/messages_light/messages_light.listener.js delete mode 100644 apps/messages_light/messages_light.messagesProxy.js delete mode 100644 apps/messages_light/messages_light.music.js diff --git a/apps/messages_light/ChangeLog b/apps/messages_light/ChangeLog index 328e2a120..9c3acf0f2 100644 --- a/apps/messages_light/ChangeLog +++ b/apps/messages_light/ChangeLog @@ -4,4 +4,5 @@ settings now points to message settings implemented use of the "messageicons" library removed lib no longer used -1.3: icon changed \ No newline at end of file +1.3: icon changed +1.4: new management of events implemented; removed code no longer used (from now the music will be managed by the Messagesgui app) \ No newline at end of file diff --git a/apps/messages_light/messages_light.app.js b/apps/messages_light/messages_light.app.js index 6dcde08b1..94f619259 100644 --- a/apps/messages_light/messages_light.app.js +++ b/apps/messages_light/messages_light.app.js @@ -12,33 +12,27 @@ -//TODO: quando apro l'app dal menu principale ( quindi non c'è niente nella queue) -//visualizzo l'interfaccia per la musica ( o un settings che mi sceglie di aprire la musica? ) let LOG=function(){ //print.apply(null, arguments); } -let settings= (()=>{ - let tmp={}; - tmp.NewEventFileName="messages_light.NewEvent.json"; - - tmp.fontSmall = "6x8"; - tmp.fontMedium = g.getFonts().includes("Vector")?"Vector:16":"6x8:2"; - tmp.fontBig = g.getFonts().includes("12x20")?"12x20":"6x8:2"; - tmp.fontLarge = g.getFonts().includes("6x15")?"6x15:2":"6x8:4"; +let settings= { + NewEventFileName:"messages_light.NewEvent.json", + fontSmall : "6x8", + fontMedium : "Vector:16", + fontBig : "Vector:20", + fontLarge : "Vector:30", + colHeadBg : g.theme.dark ? "#141":"#4f4", - tmp.colHeadBg = g.theme.dark ? "#141":"#4f4"; - tmp.colBg = g.theme.dark ? "#000":"#fff"; - tmp.colLock = g.theme.dark ? "#ff0000":"#ff0000"; + colBg : g.theme.dark ? "#000":"#fff", + colLock : g.theme.dark ? "#ff0000":"#ff0000", - tmp.quiet=!!((require('Storage').readJSON("setting.json", true) || {}).quiet); - tmp.timeOut=(require('Storage').readJSON("messages_light.settings.json", true) || {}).timeOut || "Off"; - - return tmp; -})(); + quiet:!!((require('Storage').readJSON('setting.json', 1) || {}).quiet), + timeOut:(require('Storage').readJSON("messages_light.settings.json", true) || {}).timeOut || "Off", +}; @@ -46,15 +40,6 @@ let settings= (()=>{ let EventQueue=[]; //in posizione 0, c'è quello attualmente visualizzato let callInProgress=false; -//TODO: implemento il resto ( nel template ) -var music=undefined; -//se definita, vuol dire che è arrivata una richiesta di musica -> dopo aver fino la queue di messaggi, ri-visualizza la schermata di musica -//se premo "back" in quella di musica -> esco dall'app -//template qua sotto -/*{ - artist:"", - track:"", -}*/ let justOpened=true; @@ -72,60 +57,7 @@ var manageEvent = function(event) { showCall(event); } else if( event.id=="music"){ - - - /* - //DEBUG -> save the event into file - let musicLogFile="music_log"; - let logMusic = require('Storage').readJSON(musicLogFile, true) || []; - logMusic.push(event); - require('Storage').writeJSON(musicLogFile, logMusic); - */ - - - //se c'è qualcosa nella queue, quindi app già aperta, - //se musicRunngin==true, vuol dire che c'è già della musica in ascolto prima - // quindi non mostro nulla - - //se prima era musicRunngin == false - //NON DOVREBBE NEANCHE ARRIVA QUA ( da codice nel proxy ) - - - - //LOGICA DA QUA-> - //aggiorno i dati della musica - - - - LOG("old music",music) - LOG("music event",event) - if( music==undefined) music={}; - Object.assign(music,event); - //tolgo tutto quello che non mi serve salvare ( non lo faccio prima perchè non so se l'event verrà usato da altri) - delete music.t; - delete music.id; - delete music.title; - delete music.new; - LOG("joined",music) - - - - //quindi se mi arriva la notifica vuol dire che: - //l'app l'ho appena aperta -> visualizzo la schermata di musica - //oppure - //l'app era già stata aperta in modalità musica -> non faccio nulla ( avendo già aggiornato i dati della musica ) - - //POI - //se c'è roba nella queue -> NON visualizzo la schermata di musica ( quando finirà la queue, la next visualizzerà la musica ) - //se non c'è roba nella queue -> aggiorno la visualizzazione - - - // ho unito le due condizioni di prima - - if( justOpened || EventQueue.length==0) - showMusic(); - - + //la musica non la gestisco più ( uso l'app standard o un altra app) } else{ @@ -170,7 +102,12 @@ var manageEvent = function(event) { if(element.id != event.id) newEventQueue.push(element); }); - EventQueue=newEventQueue; + + //non sovrascrivo, cosi uso lo stesso oggetto in memoria e dovrei avere meno problemi di memory leak + EventQueue.length=0; + newEventQueue.forEach(element => { + EventQueue.push(element); + }); } } //----------------- @@ -334,17 +271,6 @@ let showCall = function(msg) -let musicCode=undefined; -//visualizza cioè che c'è nella variabile music ( se undefined, richiama la next) -let showMusic=function(){ - if( music===undefined) next(); //TOCHECK: controllo rimuovibile? - - //carico dinamicamente il codice per la musica ( non mi serve sempre ) - if(musicCode===undefined) musicCode = require("messages_light.music.js") //eval(require("Storage").read("messages_light.music.js")); - - musicCode.show(); - -} @@ -360,19 +286,11 @@ let next=function(){ EventQueue.shift(); //passa al messaggio successivo, se presente - tolgo il primo callInProgress=false; + LOG(EventQueue.length); if( EventQueue.length == 0) { - LOG("no element in queue - closing") - if( music!==undefined) - { - LOG("opened/received music -> show music"); - showMusic(); - } - else - { - LOG("no music -> close") - setTimeout(_ => load()); - } + LOG("no element in queue - closing"); + setTimeout(_ => load()); return; } @@ -383,32 +301,12 @@ let next=function(){ - - - - - - - - -let showMap=function(msg) { - - g.clearRect(Bangle.appRect); - PrintMessageStrings({body:"Not implemented!"}); - -} - - - - - - -let CallBuzzTimer=null; +let CallBuzzTimer=undefined; let StopBuzzCall=function() { if (CallBuzzTimer){ clearInterval(CallBuzzTimer); - CallBuzzTimer=null; + CallBuzzTimer=undefined; } } let DrawTriangleUp=function() @@ -546,7 +444,7 @@ let doubleTapUnlock=function(data) { Bangle.setLCDPower(1); } } -let toushScroll=function(button, xy) { +let toushScroll=function(_, xy) { updateTimeout(); let height=176; //g.getHeight(); -> 176 B2 @@ -581,15 +479,6 @@ const removeTimeout=function(){ } -//not currently used -> for fast load? -let unsetApp=function(){ - delete(music); - delete(manageEvent); - removeTimeout(); -} - - - let main = function(){ LOG("Main"); @@ -611,9 +500,8 @@ let main = function(){ manageEvent(eventToShow); else { - LOG("file event not found! -> Open in music mode"); - music={}; //imposto un oggetto nella variabile music, cosi non viene chiuso il programma dalla showMusic - setTimeout(_ => showMusic(), 0); + LOG("file event not found! -> ?? open debug text"); + setTimeout(_=>{ GB({"t":"notify","id":15754117198411,"src":"Hangouts","title":"A Name","body":"Debug notification \nmessage contents demo demo demo demo"}) },0); } justOpened=false; diff --git a/apps/messages_light/messages_light.boot.js b/apps/messages_light/messages_light.boot.js index db93615ac..f28e50661 100644 --- a/apps/messages_light/messages_light.boot.js +++ b/apps/messages_light/messages_light.boot.js @@ -1,31 +1,13 @@ -/* -//OLD CODE -> backup purpose - -let messageBootManager=function(type,event){ - //se l'app non è aperta - if ("undefined"==typeof manageEvent) - { - if(event.t=="remove") return; //l'app non è aperta, non c'è nessun messaggio da rimuovere dalla queue -> non lancio l'app - - //la apro - require("Storage").writeJSON("messages_light.NewEvent.json",{"event":event,"type":type}); - load("messages_light.app.js"); - } - else - { - //altrimenti gli dico di gestire il messaggio - manageEvent(type,event); - } -} -Bangle.on("message", messageBootManager); -Bangle.on("call", messageBootManager);*/ - - - +//OLD Code //override require to filter require("message") -global.require_real=global.require; +/*global.require_real=global.require; global.require = (_require => file => { if (file==="messages") file = "messagesProxy"; return _require(file); -})(require); - +})(require);*/ + +//the file on the device is called "boot_messages_light.boot.js" +//it's NOT an error! +//it's for the boot order + +Bangle.on("message", (type, msg) => require("messages_light.listener.js").listener(type, msg)); diff --git a/apps/messages_light/messages_light.listener.js b/apps/messages_light/messages_light.listener.js new file mode 100644 index 000000000..9b1158b1c --- /dev/null +++ b/apps/messages_light/messages_light.listener.js @@ -0,0 +1,43 @@ +exports.listener = function(type, event) { + + /* + //salva gli eventi che arrivano su file + events=require("Storage").readJSON("events_log",true) || []; + events.push ( event) + require("Storage").writeJSON("events_log",events);*/ + + //if (event.handled) return; // already handled/app open + if( type=="music" || event.id=="music") return; //lo lascio gestire a qualcun altro + + //se arrivo qua gestisco io + //non mi preoccupo di salvare ( a meno di problemi a mantenere tanti messaggi in queue nella ram...) + event.handled=true; + + + + let callApp; + //se l'app non è aperta + if ("undefined"==typeof manageEvent) + { + if(event.t=="remove") return; //l'app non è aperta, non c'è nessun messaggio da rimuovere dalla queue -> non lancio l'app + + //chiamo la load dell'app + callApp=function(event){ + require("Storage").writeJSON("messages_light.NewEvent.json",event); + load("messages_light.app.js"); + } + } + else + { + //dico all'app di gestire l'evento + callApp=function(event){ + manageEvent(event); + } + } + + + callApp(event); + +} + + diff --git a/apps/messages_light/messages_light.messagesProxy.js b/apps/messages_light/messages_light.messagesProxy.js deleted file mode 100644 index 8d159bfad..000000000 --- a/apps/messages_light/messages_light.messagesProxy.js +++ /dev/null @@ -1,57 +0,0 @@ - - -let openMusic = function() { - // only read settings file for first music message - if ("undefined"==typeof exports._openMusic) { - const SETTINGS_FILE_NAME="messages_light.settings.json"; - exports._openMusic = !!((require('Storage').readJSON(SETTINGS_FILE_NAME, true) || {}).openMusic); - } - return exports._openMusic; -} - -//gestisco il messaggio a modo mio -exports.pushMessage = function(event) { - - //TODO: rimuovere questa riga per far funzionare la musica tramite l'app "message_light" - if( event.id=="music") return require_real("messages").pushMessage(event); - - - let callApp; - //se l'app non è aperta - if ("undefined"==typeof manageEvent) - { - if(event.t=="remove") return; //l'app non è aperta, non c'è nessun messaggio da rimuovere dalla queue -> non lancio l'app - - //chiamo la load dell'app - callApp=function(event){ - require_real("Storage").writeJSON("messages_light.NewEvent.json",event); - load("messages_light.app.js"); - } - } - else - { - //dico all'app di gestire l'evento - callApp=function(event){ - manageEvent(event); - } - } - - - //se il messaggio è una notifica -> gestisco l'evento - //oppure - //se music è definita ( vuol dire che l'app è aperta e mi è arrivata prima una richiesta di apertura in modalità "musica" via notifica o via launcher ) -> gestisco l'evento - //oppure - //se se è una notifica di musica ( definito dal primo controllo ) e nei settings ho salvato di aprire l'app in musica -> gestisco l'evento - - if( event.id!="music" || typeof music !== "undefined" || openMusic()) - callApp(event); - -} - - -//Call original message library -exports.clearAll = function() { return require_real("messages").clearAll()} -exports.getMessages = function() { return require_real("messages").getMessages()} -exports.status = function() { return require_real("messages").status()} -exports.buzz = function() { return require_real("messages").buzz(msgSrc)} -exports.stopBuzz = function() { return require_real("messages").stopBuzz()} \ No newline at end of file diff --git a/apps/messages_light/messages_light.music.js b/apps/messages_light/messages_light.music.js deleted file mode 100644 index a9599784e..000000000 --- a/apps/messages_light/messages_light.music.js +++ /dev/null @@ -1,7 +0,0 @@ -//TODO: -//codice che verrà evalutato dall'app per caricare l'interfaccia della musica - - -exports.show = function() { - g.drawString("music",20,20); -} \ No newline at end of file diff --git a/apps/messages_light/messages_light.settings.js b/apps/messages_light/messages_light.settings.js index 2143dee80..cd813d928 100644 --- a/apps/messages_light/messages_light.settings.js +++ b/apps/messages_light/messages_light.settings.js @@ -1,10 +1,7 @@ -//eval(require("Storage").read("messages.settings.js")); (function(back) { const SETTINGS_FILE_NAME="messages_light.settings.json"; let settings = function() { let settings = require('Storage').readJSON(SETTINGS_FILE_NAME, true) || {}; - settings.openMusic=!!settings.openMusic; - //settings.unlockWatch=!!settings.unlockWatch; return settings; } function updateSetting(setting, value) { @@ -16,10 +13,6 @@ var mainmenu = { "" : { "title" : /*LANG*/"Messages Light" }, "< Back" : back, - /*LANG*/'Auto-Open Music': { - value: !!settings().openMusic, - onchange: v => updateSetting("openMusic", v) - }, /*LANG*/'Time Out': { value: timeOutChoices.indexOf(settings.timeOut), min: 0, max: timeOutChoices.length-1, diff --git a/apps/messages_light/metadata.json b/apps/messages_light/metadata.json index 30b6cb288..5ec1f5a37 100644 --- a/apps/messages_light/metadata.json +++ b/apps/messages_light/metadata.json @@ -1,7 +1,7 @@ { "id": "messages_light", "name": "Messages Light", - "version": "1.3", + "version": "1.4", "description": "A light implementation of messages App (display notifications from iOS and Gadgetbridge/Android)", "icon": "app.png", "type": "app", @@ -13,9 +13,8 @@ {"name":"messages_light.app.js","url":"messages_light.app.js"}, {"name":"messages_light.settings.js","url":"messages_light.settings.js"}, {"name":"messages_light.img","url":"app-icon.js","evaluate":true}, - {"name":"messagesProxy","url":"messages_light.messagesProxy.js"}, - {"name":"messages_light.boot.js","url":"messages_light.boot.js"}, - {"name":"messages_light.music.js","url":"messages_light.music.js"} + {"name":"boot_messages_light.boot.js","url":"messages_light.boot.js"}, + {"name":"messages_light.listener.js","url":"messages_light.listener.js"} ], "data": [{"name":"messages_light.settings.json"},{"name":"messages_light.NewMessage.json"}], "screenshots": [{"url":"screenshot-notify.png"} ,{"url":"screenshot-long-text1.png"},{"url":"screenshot-long-text2.png"}, {"url":"screenshot-call.png"} ] From 6596d44c2924192efcd6afd491cfeb5b3e065f5e Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Tue, 28 Feb 2023 19:14:20 +0100 Subject: [PATCH 135/183] readme updated --- apps/messages_light/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/messages_light/README.md b/apps/messages_light/README.md index 00fe39bd0..2bc162cb8 100644 --- a/apps/messages_light/README.md +++ b/apps/messages_light/README.md @@ -5,7 +5,17 @@ This app handles the display of messages and message notifications. It is a GUI replacement for the `messages` apps. +To work, you must install: +- Messages +- Messages UI +- Messages Light (obviously) + +The Messages UI is recalled for the management of the "Music" notification (up to implementing a dedicated app) + + ## Creator Rarder44 +Thanks to @halemmerich for having "reviewed" the code. I applied some of your changes. + From fe3d5df5f3497b94ec880dd43bdec03e622fa6ed Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 28 Feb 2023 20:40:19 +0100 Subject: [PATCH 136/183] add README.md to metadata --- apps/quicklaunch/metadata.json | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index a0ff9fa9d..e52b979a6 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -6,11 +6,27 @@ "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.", "type": "bootloader", "tags": "tools, system", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"quicklaunch.settings.js","url":"settings.js"}, - {"name":"quicklaunch.boot.js","url":"boot.js"}, - {"name":"quicklaunch.app.js","url":"app.js"} + "readme": "README.md", + "supports": [ + "BANGLEJS2" ], - "data": [{"name":"quicklaunch.json"}] + "storage": [ + { + "name": "quicklaunch.settings.js", + "url": "settings.js" + }, + { + "name": "quicklaunch.boot.js", + "url": "boot.js" + }, + { + "name": "quicklaunch.app.js", + "url": "app.js" + } + ], + "data": [ + { + "name": "quicklaunch.json" + } + ] } From cd618434fa27dab1ae9b71f71d888491ebdfa849 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Tue, 28 Feb 2023 20:43:31 +0100 Subject: [PATCH 137/183] back to the usual formatting --- apps/quicklaunch/metadata.json | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index e52b979a6..e38d25d09 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -7,26 +7,11 @@ "type": "bootloader", "tags": "tools, system", "readme": "README.md", - "supports": [ - "BANGLEJS2" - ], + "supports": ["BANGLEJS2"], "storage": [ - { - "name": "quicklaunch.settings.js", - "url": "settings.js" - }, - { - "name": "quicklaunch.boot.js", - "url": "boot.js" - }, - { - "name": "quicklaunch.app.js", - "url": "app.js" - } + {"name": "quicklaunch.settings.js", "url": "settings.js"}, + {"name": "quicklaunch.boot.js", "url": "boot.js"}, + {"name": "quicklaunch.app.js", "url": "app.js"} ], - "data": [ - { - "name": "quicklaunch.json" - } - ] + "data": [{"name": "quicklaunch.json"}] } From 97c3b66c5a005e0ae4bd09effcda8559dc34f99b Mon Sep 17 00:00:00 2001 From: Jeremy Ketterer Date: Tue, 28 Feb 2023 17:03:10 -0500 Subject: [PATCH 138/183] Convert to 12h time according to system setting revert formatting changes remove comments --- apps/notanalog/notanalog.app.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 29fb1730f..b37c34721 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -13,6 +13,9 @@ let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { settings[key] = saved_settings[key] } +const is12Hour = (require("Storage").readJSON("setting.json", 1) || {})[ + "12hour" +]; /* * Set some important constants such as width, height and center @@ -199,6 +202,9 @@ function drawTime(){ // Hour var h = state.currentDate.getHours(); + if (is12Hour && h > 12) { + h = h - 12; + } var h1 = parseInt(h / 10); var h2 = h < 10 ? h : h - h1*10; drawTextCleared(h1, cx, posY+8); From cdbdb20bde497943c6137e98fbdf650e370d1830 Mon Sep 17 00:00:00 2001 From: Jeremy Ketterer Date: Tue, 28 Feb 2023 17:04:06 -0500 Subject: [PATCH 139/183] Bump version and add to changelog --- apps/notanalog/ChangeLog | 1 + apps/notanalog/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 094125f52..e011c4ae1 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -4,3 +4,4 @@ 0.04: Use alarm for timer instead of own alarm implementation. 0.05: Use internal step counter if no widget is available. 0.06: Use widget_utils. +0.07: Respect system setting for 12h or 24h time diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 319d396a9..851e95ec8 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -3,7 +3,7 @@ "name": "Not Analog", "shortName":"Not Analog", "icon": "notanalog.png", - "version":"0.06", + "version":"0.07", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", From 50d43e917615a95ffbba6948f332bc126dcc8437 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 19:00:25 -0500 Subject: [PATCH 140/183] reverted to before image manipulation --- apps/multidice/app-icon.js | 2 +- apps/multidice/app.png | Bin 1330 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 apps/multidice/app.png diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index d6e931259..88feb83cd 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -atob("MDCEAREREREREREREREREREREQAAEREREREREREREREREREREREREREREAAAARERERERERAAAAAAAAAAAAAAARERABERABEREREREQARERERERERERERAREQAREREAEREREREQARERERERERERERABEAEREREQAREREREQARERERERERERERABABERERERABEREREQAREREREREREREREQARERAAEREAEREREQAREREREREREREREAEREQAAAREQAREREQARERERERERERERABEREAERARERABEREQARERERAAAREREQAREREAERAREREAEREQAREREQAAABEREAEREREQEQAREREQAREQAREREAEREAERABEREREQAAERERERABEQAREREBEREQEQAREREREREREREREREAEQAREREBEREQEAEREQAAERERERAAAREQAQAREREBEREQABEREAEQEREREQARARERAAAREREAEREAABEREBEQAREREQERABERAAAREREQAAABEBEREBEQAREREQERABERAAARERERAAAREAEREAAAEREREQAAARERAAAREREREREREQARERABEREREREAEREQAQARERERERERERABERERERABEREREREAEQAREREREREREREAEREREQAAARERERABEQAREREREREREREQAREREAERAREREQAREQARERERERERERERABEREAERAREREAEREQARERERERERERERAAEREQEQARERABERERAAAAAAAAAAAAAAAQAREQAAEREQAQABERAAAAAAAAAAAAAAAAABEREREREAEQAAEQARERERERERERERABEAERERERABEREQEQARAAARERERERERABEQAREREQAQABEQEQAQAAABERERERERABERABEREAEAAAEQAQAQARABERERERERABEREAERABEBEQEQAQEQARABERERERERABEBEQAAAREBEQEQAREQAAABERERERERABEAABEREREAAAEQAQERAAARERERERERABEQABEREREQABEQAQERERERAAARERERABEREREQABEREREQAREREREQAAABERERABEREREAAAEREREQAQEREREQARABERERABEREREBEQEREREQAQAREREQARABERERABEREREBEQEREREQAQAREREQAAABERERABEREREAAAEREREQAQARERERAAARERERABEREREQABEREREQAQARERERERERAAARABEQABEREREQABEQAQAREREREREQAAABABEAAAEREREAAAEQAQAREREREREQARABABEBEQEREREBEQEQAQAREREREREQARABABEBEQEREREBEQEQAQAREREREREQAAABABEAAAEREREAAAEQAQARERERERERAAARABEQABEREREQABEQEQARERERERERERERABEREREREREREREQERAAEREREREREREAAAARERERERERERAAEREAAAAAAAAAAAAAEQAAAAAAAAAAAAAREQ==") +atob("MDABAAAAA8AAAAAAB+AAf//+DDAAwAACGBgAwAADMAwAwAADYAYAgAAAwYMAgAABg+GAgAADBiDAgDwGBiBggH4MAmAwgMMYA8AYgIEwAAAMgIFg8AeGgIHBkAyDgMNBGAjDgH5BGAjDgDxh8A+DgAAwYAMGgAAYAYAMgAAMA+AYwAAGBiAwwAADBiBgwAADgmDAf//+w8Gwf///4AM8wAADMAYEzwADGA3En4ABDBvkmYABBjIkmYABI+IkH4ABPAPkjwABHAHEgDwBAHAEAH4BAPgEgGYBAIgEgGYBAIgEgH4BAPgEgDwBAHAEgADxHAHEgAH5PgPkgAGZIgIkgAGZIgIkgAH5PgPkwADzHAHEwAADAAAEcAAPwAAcP//8///w") diff --git a/apps/multidice/app.png b/apps/multidice/app.png deleted file mode 100644 index 75ee0514a953e29e618bf56a49e8526e8eac59f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& From b0f729eb1e918964787d623d05f0589a007292b3 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 19:02:49 -0500 Subject: [PATCH 141/183] 4th try --- apps/multidice/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index 88feb83cd..62233cfee 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -atob("MDABAAAAA8AAAAAAB+AAf//+DDAAwAACGBgAwAADMAwAwAADYAYAgAAAwYMAgAABg+GAgAADBiDAgDwGBiBggH4MAmAwgMMYA8AYgIEwAAAMgIFg8AeGgIHBkAyDgMNBGAjDgH5BGAjDgDxh8A+DgAAwYAMGgAAYAYAMgAAMA+AYwAAGBiAwwAADBiBgwAADgmDAf//+w8Gwf///4AM8wAADMAYEzwADGA3En4ABDBvkmYABBjIkmYABI+IkH4ABPAPkjwABHAHEgDwBAHAEAH4BAPgEgGYBAIgEgGYBAIgEgH4BAPgEgDwBAHAEgADxHAHEgAH5PgPkgAGZIgIkgAGZIgIkgAH5PgPkwADzHAHEwAADAAAEcAAPwAAcP//8///w") +atob("MDAB/////D//////+B//gAAB88//P//95+f/P//8z/P/P//8n/n/P///Pjz/P//+fB5/P//8+d8/P8P5+d+fP4Hz/Z/PPzzn/D/nP37P///zP36fD/h5P34+b/M8Pzw+5/c8P4G+5/c8P8OeD/B8P//Pn/z5P//n/n/zP//z/B/nP//5+d/PP//8+d+fP//8fZ8/gAABPD5HgAAAH/zDP//8z/n7MP/85/I7IH/88+QZJn/8+c3ZZn/83B3Z4H/8w/wZcP/84/45f8P8/4/5/4H8/wf5f5n8/3f5P5n8/3f5P4H8/wf5P8P8/4/5P/8M4/45P/4EwfwZP/5k3f3ZP/5k3f3ZP/4EwfwZP/8M4/47P//8///7j//wP//jwAADAAAP") From 3bbcb6522eed8af1e4b2783af649a59f2f001d17 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 19:05:37 -0500 Subject: [PATCH 142/183] didn't add the file I meant to --- apps/multidice/app.png | Bin 0 -> 1330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/multidice/app.png diff --git a/apps/multidice/app.png b/apps/multidice/app.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee0514a953e29e618bf56a49e8526e8eac59f5 GIT binary patch literal 1330 zcmV-21iCYS(1OJaP25k$Q;U-Cc6Fq}DO z&f~^^GU+{YX6AhVneRCO{|_z%wga=k3E*Skx~hw=0yfvshP74*4PYP80`>qe0f&IU zfwg4>?*QHb=4)F)$4fq%-7cwW2lxIR!7w#Jawd^RBbJpr|vEJNZr zu$TJrE^sVT_(~*NI)%ECoNTP{E{TaEBurmNX%Di5Uk2;>QW1~>|Q zp_6*g8xu{U9R%{!X1DC4q2~>f$m3>z>*jeSp+ugy@h%ooqG4A zlCd=5?*@K#c6!`%mua{Y_}Q8BK5#(_2~*))>NtT{^!E|(eU}88QF1pdy?=@@8o*D$ z0U7p2;9uamlv6#Vjmsp^Ej{1w=(=wMqgulRcCk|Zw>f>&+Px4~XpR|ng3lEze7vad z=X#<06m%?SdQI)P`qnt7wA7n-rTT}Q&6rd44dF7)+2owaQ5n1s%iq3>Az-*3_)x{i z@4yF&riLEi5ACk$r;Bl^&6J84vy=XuZ|%{XX$8A8DKTe_#%zrxkcUBehDnda0_nU3 zuGfKO5o>iQPJ9Bq0bJ|7AJ9hZON_g&RAOy_Lrs$IA%cj(Q-5#BK@SrRPoB$R$OEM}|^&MV3cm!b|2>rMTQE;SDe76ozW5i7!!f zZb_+e#w8zuCNa;}9%g-4eBbsKIaz5><%D~+st>260#(qhHRt8iABgl$F={j97eA+T z&6fm`tx6Rva&A#y8En^wF4l7li2+CW)r!U^W$;Pl?{YTgoH#Hh=_bP{zDa7oziF4c}c>Zwgrb1(Ihyk;5!%cl<`h61e!VCCWN3H4Pmy;1p3-dpp18lA<&!SZE7P>#yb@; z;;DeQsf|Dx@8lCG>TUWn#@9w5%R9LQih7%#vbj)EWO*l-Kv8egERqXVAuwBzK&-cE z7RiOG5XkaQX}M6Wx9KgC3!Qcfnxe?^PDw%2DCuqb1LMyrXp)lB{TG<3u(ghOm%DXg zgVwz@=~$*>;)pE1>VNjwrnOG#wxgwDe5B&KBTi9o7h`APYTz?{wCZ(=tzq|_cB5=p oHg@l1bwC|gHFnkhjC-x}A5s&T=P#0nHvj+t07*qoM6N<$g6g++LI3~& literal 0 HcmV?d00001 From 07952c23b5516421030426efe12a4f3a5b1dd0fb Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 22:07:17 -0500 Subject: [PATCH 143/183] 5th try --- apps/multidice/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index 62233cfee..524f27d52 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -atob("MDAB/////D//////+B//gAAB88//P//95+f/P//8z/P/P//8n/n/P///Pjz/P//+fB5/P//8+d8/P8P5+d+fP4Hz/Z/PPzzn/D/nP37P///zP36fD/h5P34+b/M8Pzw+5/c8P4G+5/c8P8OeD/B8P//Pn/z5P//n/n/zP//z/B/nP//5+d/PP//8+d+fP//8fZ8/gAABPD5HgAAAH/zDP//8z/n7MP/85/I7IH/88+QZJn/8+c3ZZn/83B3Z4H/8w/wZcP/84/45f8P8/4/5/4H8/wf5f5n8/3f5P5n8/3f5P4H8/wf5P8P8/4/5P/8M4/45P/4EwfwZP/5k3f3ZP/5k3f3ZP/4EwfwZP/8M4/47P//8///7j//wP//jwAADAAAP") +atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==") From 1f64a1736b5ff0847e5677908266fb8653973ea8 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 22:10:48 -0500 Subject: [PATCH 144/183] I think that fixed the icon --- apps/multidice/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index 524f27d52..88feb83cd 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==") +atob("MDABAAAAA8AAAAAAB+AAf//+DDAAwAACGBgAwAADMAwAwAADYAYAgAAAwYMAgAABg+GAgAADBiDAgDwGBiBggH4MAmAwgMMYA8AYgIEwAAAMgIFg8AeGgIHBkAyDgMNBGAjDgH5BGAjDgDxh8A+DgAAwYAMGgAAYAYAMgAAMA+AYwAAGBiAwwAADBiBgwAADgmDAf//+w8Gwf///4AM8wAADMAYEzwADGA3En4ABDBvkmYABBjIkmYABI+IkH4ABPAPkjwABHAHEgDwBAHAEAH4BAPgEgGYBAIgEgGYBAIgEgH4BAPgEgDwBAHAEgADxHAHEgAH5PgPkgAGZIgIkgAGZIgIkgAH5PgPkwADzHAHEwAADAAAEcAAPwAAcP//8///w") From 52bb9f1ca88a0e01182f31f429cbb3a054921cfa Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 22:17:17 -0500 Subject: [PATCH 145/183] checking if I need to increase version for image to change --- apps/multidice/ChangeLog | 1 + apps/multidice/app-icon.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 6b773d96b..6c9836e94 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -28,3 +28,4 @@ 1.26: trying to add timeout after it's done buzzing... again 1.27: OH GOD IT FINALLY WORKS 1.28: increased vibration strength, added some comments, & some QOL +1.29: changed image diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index 88feb83cd..524f27d52 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -atob("MDABAAAAA8AAAAAAB+AAf//+DDAAwAACGBgAwAADMAwAwAADYAYAgAAAwYMAgAABg+GAgAADBiDAgDwGBiBggH4MAmAwgMMYA8AYgIEwAAAMgIFg8AeGgIHBkAyDgMNBGAjDgH5BGAjDgDxh8A+DgAAwYAMGgAAYAYAMgAAMA+AYwAAGBiAwwAADBiBgwAADgmDAf//+w8Gwf///4AM8wAADMAYEzwADGA3En4ABDBvkmYABBjIkmYABI+IkH4ABPAPkjwABHAHEgDwBAHAEAH4BAPgEgGYBAIgEgGYBAIgEgH4BAPgEgDwBAHAEgADxHAHEgAH5PgPkgAGZIgIkgAGZIgIkgAH5PgPkwADzHAHEwAADAAAEcAAPwAAcP//8///w") +atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==") diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index c3c144890..a754ef8b2 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.28", + "version":"1.29", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From 8e609ff281fa1e935cdd0ac60c983d09c7f25d2b Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 22:20:53 -0500 Subject: [PATCH 146/183] if this doesn't work I'm reverting & giving up --- apps/multidice/ChangeLog | 1 + apps/multidice/app-icon.js | 2 +- apps/multidice/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/multidice/ChangeLog b/apps/multidice/ChangeLog index 6c9836e94..cb0cce2aa 100644 --- a/apps/multidice/ChangeLog +++ b/apps/multidice/ChangeLog @@ -29,3 +29,4 @@ 1.27: OH GOD IT FINALLY WORKS 1.28: increased vibration strength, added some comments, & some QOL 1.29: changed image +1.30: changed image, again diff --git a/apps/multidice/app-icon.js b/apps/multidice/app-icon.js index 524f27d52..88feb83cd 100644 --- a/apps/multidice/app-icon.js +++ b/apps/multidice/app-icon.js @@ -1 +1 @@ -atob("MDCBAf////w///////gf/4AAAfPP/z///efn/z///M/z/z///J/5/z///z48/z///nwefz///PnfPz/D+fnfnz+B8/2fzz885/w/5z9+z///8z9+nw/4eT9+Pm/zfD88Puf3PD+Bvuf3PD/Dng/wfD//z5/8+T//5/5/8z//8/wf5z//+fnfzz///Pnfnz///H2fP4AAATw+R4AAAB/8wz///M/5+zD//OfyOyB//PPkGSZ//PnN2WZ//Nwd2eB//MP8GXD//OP+OX/D/P+P+f+B/P8H+X+Z/P93+T+Z/P93+T+B/P8H+T/D/P+P+T//DOP+OT/+BMH8GT/+ZN392T/+ZN392T/+BMH8GT//DOP+Oz///P//+4//8D//48AAAwAADw==") +atob("MDABAAAAA8AAAAAAB+AAf//+DDAAwAACGBgAwAADMAwAwAADYAYAgAAAwYMAgAABg+GAgAADBiDAgDwGBiBggH4MAmAwgMMYA8AYgIEwAAAMgIFg8AeGgIHBkAyDgMNBGAjDgH5BGAjDgDxh8A+DgAAwYAMGgAAYAYAMgAAMA+AYwAAGBiAwwAADBiBgwAADgmDAf//+w8Gwf///4AM8wAADMAYEzwADGA3En4ABDBvkmYABBjIkmYABI+IkH4ABPAPkjwABHAHEgDwBAHAEAH4BAPgEgGYBAIgEgGYBAIgEgH4BAPgEgDwBAHAEgADxHAHEgAH5PgPkgAGZIgIkgAGZIgIkgAH5PgPkwADzHAHEwAADAAAEcAAPwAAcP//8///w") diff --git a/apps/multidice/metadata.json b/apps/multidice/metadata.json index a754ef8b2..304c789e4 100644 --- a/apps/multidice/metadata.json +++ b/apps/multidice/metadata.json @@ -1,7 +1,7 @@ { "id": "multidice", "name": "multiple dice roller", "shortName":"multidice", - "version":"1.29", + "version":"1.30", "description": "roll anywhere from 1-8 dice at the same time", "icon": "app.png", "tags": "tool,game", From f9e3463964af3cdb3404148666a6b358211f5f80 Mon Sep 17 00:00:00 2001 From: Le~Kat Date: Tue, 28 Feb 2023 22:44:27 -0500 Subject: [PATCH 147/183] added images to README.md --- apps/multidice/README.md | 4 ++++ apps/multidice/many_rolled.png | Bin 0 -> 2192 bytes apps/multidice/many_selected.png | Bin 0 -> 2520 bytes apps/multidice/single_rolled.png | Bin 0 -> 1283 bytes apps/multidice/startup.png | Bin 0 -> 1565 bytes 5 files changed, 4 insertions(+) create mode 100644 apps/multidice/many_rolled.png create mode 100644 apps/multidice/many_selected.png create mode 100644 apps/multidice/single_rolled.png create mode 100644 apps/multidice/startup.png diff --git a/apps/multidice/README.md b/apps/multidice/README.md index 056e5a7eb..72a2d8af5 100644 --- a/apps/multidice/README.md +++ b/apps/multidice/README.md @@ -4,12 +4,16 @@ roll anywhere from 1-8 dice at the same time. ## Usage +![startup.png](startup.png) On the menu screen: tap on the dice to change what variant is selected, & shake/or press BTN to roll the dice +![single_rolled.png](single_rolled.png) On the dice screen: tap anywhere on the screen to go back to the menu, or shake/or press BTN to roll the dice ## Features roll anywhere from 1-8 dice (d4, d6, d8, d10, d12, d20, & d percentile). You can select multiple different dice at the same time +![many_selected.png](many_selected.png) +![many_rolled.png](many_rolled.png) ## Controls diff --git a/apps/multidice/many_rolled.png b/apps/multidice/many_rolled.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf34e9c7da3eefbe05ecd61c6e3d3aee8d7f444 GIT binary patch literal 2192 zcma);dpy&N8^^a9mP^?xM93)F-0wvf+9s)Va@&R($^9pC+g!?o+#+g=P@P;lvDjQf zOy5o#T^ha>#CJevnLtq;=|lu8|a>N!G}qAJwW4R%fNzl!*ukJUOr6ISreL{S`~(j(fp!ENoh5Q+?wqAEvj1c-LEM$JoESS7^=3b zWtz`8zNu!|oWELWzbh`Pa54uEn!O0#>VUaV|7>Q)iy>^uT9}N6MMsgis+P|c%A~&GBW=5Ap(@og zh}MoXmh~c>QjT>Hr^&ukFS!7s4Q1ZIQchMbB+fQ#4lePu#yTC25AIx+4khV<>2yk~ zn@Ck#eaX$MS+o@|++OmG>XL}NEYMe>h>X9auaV}pYSNlk+R-KECsFKLp!k)6%7%M!PIh1$s+iCr{R49i91nCX z$o1|HU#CdBI%L7-eqB|Ur^SQd{I;MN6Ud)(8m#Pr6@TcOI*zQS?-)^)#CuC|L_p&; zKe`o=3abk&^pB3uJGYv5yD5y$ZR7M0hwjPjZTkA?po`KiAS)2}xaaNwct|lFz+JLc zgjkXfCnH&VBeGi~NLoI&7CV5GLd4*PFE(U(!R8XMN1;9r>PJ|MLH)M?d+|q z&k~=E4WMrFwPLZnKFB&KURMPn{k)iCA(fePyx zY(95k|1bG?G(!^mC!&2P?r96GQiGDO-ualO&=aA!|gW(ElISojKZ58UPa?#?aa zK=ygbmz3YrZYB5S<;hU9&(|Y12uc`Ljp;$1{DKKxaoo5eB$gD?8K?xaDr2~HCjv!R z*INkRxzS~HBL)>f&8x-hJ%H;IqsJXlhJ&c3H&+;~9ac7Ykoq#;O`2v&#bx;;uULK> z3Bmgo^UK9RFU?4{=P-}a;m5;45t z$Y6;e=vH;czlF!@6(J77hu}z?FS(AsEJ3-LABb-9FPlCBvmTx&I}EjVDC_j$Bm?=U zzneU7ylggGDjvc);r-og;YdTqYBgk3JfaYB+<4@Dj2&$eT3$SocYe{Ab05&nvwcqq zZiky^tQtY;$FakPUsY?Iyg5k#Jt6B;$>jNdyuI{rV*aY3i(?&|;Cz+C1gwn4cg1N1 z5onvaf8edFd@DL*j?ot9B&g>mD)0Y{>I#p{g}5%jR5zs9{RDlj(CmE?^WlMvu7cZ} z{ybP`#~u4^IevJo(v^xcrlb@MK9UzfK5n35(L{Gzlp3`1t#mD_^O1Z+Fqq^a69D2W oa>yJ4%S8O$RsU$Ue}vm&BC9@okiRE-=hFb$VJ~7TZODm#0Z2~n+a literal 0 HcmV?d00001 diff --git a/apps/multidice/many_selected.png b/apps/multidice/many_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..137e2c3639764bd81c59f572bf4ead346241371b GIT binary patch literal 2520 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 literal 0 HcmV?d00001 From b6b6ce1e8d7d1e40457dd2a016e9c880a12370db Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 1 Mar 2023 08:15:01 +0000 Subject: [PATCH 148/183] Bump bootloader version --- apps/boot/ChangeLog | 1 + apps/boot/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog index a63a54eaf..82e55fa91 100644 --- a/apps/boot/ChangeLog +++ b/apps/boot/ChangeLog @@ -65,3 +65,4 @@ Only add boot info comments if settings.bootDebug was set If settings.bootDebug is set, output timing for each section of .boot0 0.56: Settings.log = 0,1,2,3 for off,display, log, both +0.57: Handle the whitelist being disabled diff --git a/apps/boot/metadata.json b/apps/boot/metadata.json index 9f64b672b..c652f6136 100644 --- a/apps/boot/metadata.json +++ b/apps/boot/metadata.json @@ -1,7 +1,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.56", + "version": "0.57", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", From 77aeee9462c230439bc790fa0104ffab19d9718b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 1 Mar 2023 08:40:56 +0000 Subject: [PATCH 149/183] Revert core change --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 23854083e..0d02ff376 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 23854083e0c3f83c649073a2d85e8079efc471d3 +Subproject commit 0d02ff3763783d166ff84906af038420736aabfc From 59d252de8fe53b79ef671b3c511703fd7064badd Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Wed, 1 Mar 2023 12:01:13 +0100 Subject: [PATCH 150/183] runplus - Fix typo in variable name preventing starting a run --- apps/runplus/ChangeLog | 1 + apps/runplus/app.js | 2 +- apps/runplus/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/runplus/ChangeLog b/apps/runplus/ChangeLog index 0e19b5559..bd8d83fe9 100644 --- a/apps/runplus/ChangeLog +++ b/apps/runplus/ChangeLog @@ -17,3 +17,4 @@ Keep run state between runs (allowing you to exit and restart the app) 0.16: Don't clear zone 2b indicator segment when updating HRM reading. Write to correct settings file, fixing settings not working. +0.17: Fix typo in variable name preventing starting a run diff --git a/apps/runplus/app.js b/apps/runplus/app.js index 9d7010e6c..86627b607 100644 --- a/apps/runplus/app.js +++ b/apps/runplus/app.js @@ -124,7 +124,7 @@ lc.push({ type:"h", filly:1, c:[ // Now calculate the layout let layout = new Layout( { type:"v", c: lc -},{lazy:true, btns:[{ label:"---", cb: ()=>{if (karvonnenActive) {stopKarvonnenUI();run();} onStartStop();}, id:"button"}]}); +},{lazy:true, btns:[{ label:"---", cb: (()=>{if (karvonenActive) {stopKarvonnenUI();run();} onStartStop();}), id:"button"}]}); delete lc; setStatus(exs.state.active); layout.render(); diff --git a/apps/runplus/metadata.json b/apps/runplus/metadata.json index 017a52ac3..c67e06d44 100644 --- a/apps/runplus/metadata.json +++ b/apps/runplus/metadata.json @@ -1,7 +1,7 @@ { "id": "runplus", "name": "Run+", - "version": "0.16", + "version": "0.17", "description": "Displays distance, time, steps, cadence, pace and more for runners. Based on the Run app, but extended with additional screen for heart rate interval training.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps,karvonen,karvonnen", From 487ee7443b7a0f846e8b6ec9c2a33c0d9b170031 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 28 Feb 2023 20:02:47 +0100 Subject: [PATCH 151/183] scroll six lines per swipe, on Bangle2 this leaves the previous first/last line visible so the user know they got to see all text --- apps/messagesoverlay/lib.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 2d5feae94..5587fce19 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -279,6 +279,8 @@ let drawTriangleDown = function(ovr) { ovr.fillPoly([ovr.getWidth()-9, ovr.getHeight()-6, ovr.getWidth()-14, ovr.getHeight()-16, ovr.getWidth()-4, ovr.getHeight()-16]); }; +let linesScroll = 6; + let scrollUp = function(ovr) { msg = eventQueue[0]; LOG("up", msg); @@ -289,7 +291,7 @@ let scrollUp = function(ovr) { if (!msg.CanscrollUp) return; - msg.FirstLine = msg.FirstLine > 0 ? msg.FirstLine - 1 : 0; + msg.FirstLine = msg.FirstLine > 0 ? msg.FirstLine - linesScroll : 0; drawMessage(ovr, msg); }; @@ -304,7 +306,7 @@ let scrollDown = function(ovr) { if (!msg.CanscrollDown) return; - msg.FirstLine = msg.FirstLine + 1; + msg.FirstLine = msg.FirstLine + linesScroll; drawMessage(ovr, msg); }; @@ -483,4 +485,4 @@ exports.clearAll = function() { return require_real("messages").clearAll();}; exports.getMessages = function() { return require_real("messages").getMessages();}; exports.status = function() { return require_real("messages").status();}; exports.buzz = function() { return require_real("messages").buzz(msgSrc);}; -exports.stopBuzz = function() { return require_real("messages").stopBuzz();}; \ No newline at end of file +exports.stopBuzz = function() { return require_real("messages").stopBuzz();}; From 32d1cecb6fa1bc66e269d7d9b96c3c84448b02b4 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Wed, 1 Mar 2023 15:40:14 +0100 Subject: [PATCH 152/183] bump version --- apps/messagesoverlay/ChangeLog | 1 + apps/messagesoverlay/metadata.json | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/apps/messagesoverlay/ChangeLog b/apps/messagesoverlay/ChangeLog index d557bc5e1..0a2cf27b0 100644 --- a/apps/messagesoverlay/ChangeLog +++ b/apps/messagesoverlay/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial fork from messages_light 0.02: Fix touch/drag/swipe handlers not being restored correctly if a message is removed +0.03: Scroll six lines per swipe, leaving the previous top/bottom row visible. diff --git a/apps/messagesoverlay/metadata.json b/apps/messagesoverlay/metadata.json index 2877b0cf1..6a3f953d8 100644 --- a/apps/messagesoverlay/metadata.json +++ b/apps/messagesoverlay/metadata.json @@ -1,17 +1,35 @@ { "id": "messagesoverlay", "name": "Messages Overlay", - "version": "0.02", + "version": "0.03", "description": "An overlay based implementation of a messages UI (display notifications from iOS and Gadgetbridge/Android)", "icon": "app.png", "type": "bootloader", "tags": "tool,system", - "supports": ["BANGLEJS2"], - "dependencies" : { "messageicons":"module","messages":"app" }, + "supports": [ + "BANGLEJS2" + ], + "dependencies": { + "messageicons": "module", + "messages": "app" + }, "readme": "README.md", "storage": [ - {"name":"messagesoverlay","url":"lib.js"}, - {"name":"messagesoverlay.boot.js","url":"boot.js"} + { + "name": "messagesoverlay", + "url": "lib.js" + }, + { + "name": "messagesoverlay.boot.js", + "url": "boot.js" + } ], - "screenshots": [{"url":"screen_call.png"} ,{"url":"screen_message.png"} ] + "screenshots": [ + { + "url": "screen_call.png" + }, + { + "url": "screen_message.png" + } + ] } From d5c85f16542fa86c739d202af2641cd2f40464b2 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 28 Feb 2023 20:20:16 +0100 Subject: [PATCH 153/183] tweak and align HRM min/max defaults, change allowed min/max interval in settings --- apps/runplus/app.js | 4 ++-- apps/runplus/settings.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/runplus/app.js b/apps/runplus/app.js index 86627b607..2beb7e2ab 100644 --- a/apps/runplus/app.js +++ b/apps/runplus/app.js @@ -44,8 +44,8 @@ let settings = Object.assign({ }, }, HRM: { - min: 65, - max: 170, + min: 55, + max: 185, }, }, require("Storage").readJSON("runplus.json", 1) || {}); let statIDs = [settings.B1,settings.B2,settings.B3,settings.B4,settings.B5,settings.B6].filter(s=>s!==""); diff --git a/apps/runplus/settings.js b/apps/runplus/settings.js index cd72022be..539391a27 100644 --- a/apps/runplus/settings.js +++ b/apps/runplus/settings.js @@ -32,8 +32,8 @@ }, }, HRM: { - min: 65, - max: 165, + min: 55, + max: 185, }, }, storage.readJSON(SETTINGS_FILE, 1) || {}); function saveSettings() { @@ -145,7 +145,7 @@ }, } hrmMenu[/*LANG*/"max"] = { - min: 120, max: 190, + min: 101, max: 220, value: settings.HRM.max, format: v => v, onchange: v => { From b365159f2b5ab505e6fdacfb5dd2451d616a3ad7 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Wed, 1 Mar 2023 15:49:23 +0100 Subject: [PATCH 154/183] bump version, fix typo --- apps/runplus/ChangeLog | 4 +++- apps/runplus/app.js | 2 +- apps/runplus/metadata.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/runplus/ChangeLog b/apps/runplus/ChangeLog index bd8d83fe9..d920a3eca 100644 --- a/apps/runplus/ChangeLog +++ b/apps/runplus/ChangeLog @@ -17,4 +17,6 @@ Keep run state between runs (allowing you to exit and restart the app) 0.16: Don't clear zone 2b indicator segment when updating HRM reading. Write to correct settings file, fixing settings not working. -0.17: Fix typo in variable name preventing starting a run +0.17: Fix typo in variable name preventing starting a run. +0.18: Tweak HRM min/max defaults. Extend min/max intervals in settings. Fix + another typo. diff --git a/apps/runplus/app.js b/apps/runplus/app.js index 2beb7e2ab..7cb5d4381 100644 --- a/apps/runplus/app.js +++ b/apps/runplus/app.js @@ -124,7 +124,7 @@ lc.push({ type:"h", filly:1, c:[ // Now calculate the layout let layout = new Layout( { type:"v", c: lc -},{lazy:true, btns:[{ label:"---", cb: (()=>{if (karvonenActive) {stopKarvonnenUI();run();} onStartStop();}), id:"button"}]}); +},{lazy:true, btns:[{ label:"---", cb: (()=>{if (karvonenActive) {stopKarvonenUI();run();} onStartStop();}), id:"button"}]}); delete lc; setStatus(exs.state.active); layout.render(); diff --git a/apps/runplus/metadata.json b/apps/runplus/metadata.json index c67e06d44..c605c438d 100644 --- a/apps/runplus/metadata.json +++ b/apps/runplus/metadata.json @@ -1,7 +1,7 @@ { "id": "runplus", "name": "Run+", - "version": "0.17", + "version": "0.18", "description": "Displays distance, time, steps, cadence, pace and more for runners. Based on the Run app, but extended with additional screen for heart rate interval training.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps,karvonen,karvonnen", From e79c95022abfe0a6fc7f0daad221b5f5ac1d3774 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Thu, 2 Mar 2023 00:26:50 +0100 Subject: [PATCH 155/183] openstmap: display waypoints If waypoints module is available, display the waypoints on the map. Also update the documentation and fix some english in the documentation. --- apps/openstmap/README.md | 12 ++++++------ apps/openstmap/app.js | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/apps/openstmap/README.md b/apps/openstmap/README.md index f19b13bd1..bf247c7b7 100644 --- a/apps/openstmap/README.md +++ b/apps/openstmap/README.md @@ -17,20 +17,20 @@ To add a map: * Scroll and zoom to the area of interest or use the Search button in the top left * Now choose the size you want to upload (Small/Medium/etc) * On Bangle.js 1 you can choose if you want a 3 bits per pixel map (this is lower -quality but uploads faster and takes less space). On Bangle.js 2 you only have a 3bpp -display so can only use 3bpp. +quality, but uploads faster and takes less space). Bangle.js 2 is limited to 3bpp. * Click `Get Map`, and a preview will be displayed. If you need to adjust the area you can change settings, move the map around, and click `Get Map` again. * When you're ready, click `Upload` ## Bangle.js App -The Bangle.js app allows you to view a map - it also turns the GPS on and marks -the path that you've been travelling (if enabled). +The Bangle.js app allows you to view a map. It also turns the GPS on +and marks the path that you've been travelling (if enabled), and +displays waypoints in the watch (if dependencies exist). * Drag on the screen to move the map -* Press the button to bring up a menu, where you can zoom, go to GPS location -, put the map back in its default location, or choose whether to draw the currently +* Press the button to bring up a menu, where you can zoom, go to GPS location, +put the map back in its default location, or choose whether to draw the currently recording GPS track (from the `Recorder` app). **Note:** If enabled, drawing the currently recorded GPS track can take a second diff --git a/apps/openstmap/app.js b/apps/openstmap/app.js index 89e2d2ddb..e7629f2e1 100644 --- a/apps/openstmap/app.js +++ b/apps/openstmap/app.js @@ -10,6 +10,7 @@ var settings = require("Storage").readJSON("openstmap.json",1)||{}; function redraw() { g.setClipRect(R.x,R.y,R.x2,R.y2); m.draw(); + drawPOI(); drawMarker(); // if track drawing is enabled... if (settings.drawTrack) { @@ -25,6 +26,23 @@ function redraw() { g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1); } +// Draw the POIs +function drawPOI() { + var waypoints = require("waypoints").load(); + if (!waypoints) + return; + g.setFont("Vector", 18); + waypoints.forEach((wp, idx) => { + var p = m.latLonToXY(wp.lat, wp.lon); + var sz = 2; + g.setColor(0,0,0); + g.fillRect(p.x-sz, p.y-sz, p.x+sz, p.y+sz); + g.setColor(0,0,0); + g.drawString(wp.name, p.x, p.y); + print(wp.name); + }) +} + // Draw the marker for where we are function drawMarker() { if (!fix.fix) return; From a1116e3c811036ded68fa89d4c7dc8ec4dbb831b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Mar 2023 01:18:02 +0000 Subject: [PATCH 156/183] Bump core from `893c2db` to `0d02ff3` Bumps [core](https://github.com/espruino/EspruinoAppLoaderCore) from `893c2db` to `0d02ff3`. - [Release notes](https://github.com/espruino/EspruinoAppLoaderCore/releases) - [Commits](https://github.com/espruino/EspruinoAppLoaderCore/compare/893c2dbbe5a93fbb80d035a695663b4f4cca8875...0d02ff3763783d166ff84906af038420736aabfc) --- updated-dependencies: - dependency-name: core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 893c2dbbe..0d02ff376 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 893c2dbbe5a93fbb80d035a695663b4f4cca8875 +Subproject commit 0d02ff3763783d166ff84906af038420736aabfc From f027b65e8e9667255e441bd398d7cd348ac009a0 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Thu, 2 Mar 2023 20:11:34 +0100 Subject: [PATCH 157/183] fix fullscreen with oneClickExit --- apps/iconlaunch/ChangeLog | 1 + apps/iconlaunch/app.js | 28 ++++++++++++++++++++++------ apps/iconlaunch/metadata.json | 2 +- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/apps/iconlaunch/ChangeLog b/apps/iconlaunch/ChangeLog index 6f0e8194c..8bad496bf 100644 --- a/apps/iconlaunch/ChangeLog +++ b/apps/iconlaunch/ChangeLog @@ -21,3 +21,4 @@ 0.15: Ensure that we hide widgets if in fullscreen mode (So that widgets are still hidden if launcher is fast-loaded) 0.16: Use firmware provided E.showScroller method +0.17: fix fullscreen with oneClickExit diff --git a/apps/iconlaunch/app.js b/apps/iconlaunch/app.js index 8d155c73e..9f8cedb0f 100644 --- a/apps/iconlaunch/app.js +++ b/apps/iconlaunch/app.js @@ -9,6 +9,7 @@ timeOut:"Off" }, s.readJSON("iconlaunch.json", true) || {}); + if (!settings.fullscreen) { Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -103,15 +104,12 @@ }; const itemsN = Math.ceil(launchCache.apps.length / appsN); - let back = ()=>{}; - if (settings.oneClickExit) back = Bangle.showClock; - + let idWatch = null; let options = { h: itemSize, c: itemsN, draw: drawItem, select: selectItem, - back: back, remove: function() { if (timeout) clearTimeout(timeout); Bangle.removeListener("drag", updateTimeout); @@ -120,8 +118,26 @@ if (settings.fullscreen) { // for fast-load, if we hid widgets then we should show them again require("widget_utils").show(); } - } + if(idWatch) clearWatch(idWatch); + }, + btn:Bangle.showClock }; + + //work both the fullscreen and the oneClickExit + if( settings.fullscreen && settings.oneClickExit) + { + idWatch=setWatch(function(e) { + Bangle.showClock(); + }, BTN, {repeat:false, edge:'rising' }); + + } + else if( settings.oneClickExit ) + { + options.back=Bangle.showClock; + } + + + let scroller = E.showScroller(options); @@ -141,4 +157,4 @@ Bangle.on("touch", updateTimeout); updateTimeout(); -} +} \ No newline at end of file diff --git a/apps/iconlaunch/metadata.json b/apps/iconlaunch/metadata.json index 435a29b39..35a7907bd 100644 --- a/apps/iconlaunch/metadata.json +++ b/apps/iconlaunch/metadata.json @@ -2,7 +2,7 @@ "id": "iconlaunch", "name": "Icon Launcher", "shortName" : "Icon launcher", - "version": "0.16", + "version": "0.17", "icon": "app.png", "description": "A launcher inspired by smartphones, with an icon-only scrollable menu.", "tags": "tool,system,launcher", From 2767c57cbae989d968d9e30c2641640eb6e88615 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 3 Mar 2023 10:25:02 +0000 Subject: [PATCH 158/183] 0.06: Lower chunk size to 1024 (from 2048) to make firmware updates more reliable --- apps/fwupdate/ChangeLog | 1 + apps/fwupdate/custom.html | 2 +- apps/fwupdate/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/fwupdate/ChangeLog b/apps/fwupdate/ChangeLog index ea0b48eb9..a9673f6de 100644 --- a/apps/fwupdate/ChangeLog +++ b/apps/fwupdate/ChangeLog @@ -6,3 +6,4 @@ Add CRC checks for common bootloaders that we know don't work 0.04: Include a precompiled bootloader for easy bootloader updates 0.05: Rename Bootloader->DFU and add explanation to avoid confusion with Bootloader app +0.06: Lower chunk size to 1024 (from 2048) to make firmware updates more reliable diff --git a/apps/fwupdate/custom.html b/apps/fwupdate/custom.html index 31eb4a256..9e86a1c0f 100644 --- a/apps/fwupdate/custom.html +++ b/apps/fwupdate/custom.html @@ -317,7 +317,7 @@ function createJS_app(binary, startAddress, endAddress) { hexJS += `\x10if (E.CRC32(E.memoryArea(0xF7000,0x7000))==1207580954) { print("DFU 2v10.236 needs update"); load();}\n`; hexJS += '\x10var s = require("Storage");\n'; hexJS += '\x10s.erase(".firmware");\n'; - var CHUNKSIZE = 2048; + var CHUNKSIZE = 1024; for (var i=0;iCHUNKSIZE) l=CHUNKSIZE; diff --git a/apps/fwupdate/metadata.json b/apps/fwupdate/metadata.json index 372f6850c..e3294f316 100644 --- a/apps/fwupdate/metadata.json +++ b/apps/fwupdate/metadata.json @@ -1,7 +1,7 @@ { "id": "fwupdate", "name": "Firmware Update", - "version": "0.05", + "version": "0.06", "description": "Uploads new Espruino firmwares to Bangle.js 2", "icon": "app.png", "type": "RAM", From 1a3f338a17285415e0b645133db58a55f8225bf6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 3 Mar 2023 10:25:23 +0000 Subject: [PATCH 159/183] Add short name for QR codes --- apps/qrcode/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/qrcode/metadata.json b/apps/qrcode/metadata.json index 24af7b813..89c859a0c 100644 --- a/apps/qrcode/metadata.json +++ b/apps/qrcode/metadata.json @@ -1,6 +1,7 @@ { "id": "qrcode", "name": "Custom QR Code", + "shortName": "QR Code", "version": "0.06", "description": "Use this to upload a customised QR code to Bangle.js", "icon": "app.png", From 4433d2cef54149db0744b5d8a68ff5bacad4fc85 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 3 Mar 2023 16:30:13 +0000 Subject: [PATCH 160/183] 2v16 bootloader hash --- apps/fwupdate/custom.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/fwupdate/custom.html b/apps/fwupdate/custom.html index 9e86a1c0f..de972b0e8 100644 --- a/apps/fwupdate/custom.html +++ b/apps/fwupdate/custom.html @@ -98,6 +98,7 @@ function onInit(device) { if (crc==4056371285) version = "2v13"; if (crc==1038322422) version = "2v14"; if (crc==2560806221) version = "2v15"; + if (crc==2886730689) version = "2v16"; if (!ok) { version += `(⚠ update required)`; } From c18d1d4a42f5eb8882e12b0797c5c5605b1989f1 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Mar 2023 17:50:48 +0100 Subject: [PATCH 161/183] openstmap: fix operation without waypoints, increase version --- apps/openstmap/ChangeLog | 1 + apps/openstmap/app.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/openstmap/ChangeLog b/apps/openstmap/ChangeLog index 7f788c139..a256b459c 100644 --- a/apps/openstmap/ChangeLog +++ b/apps/openstmap/ChangeLog @@ -16,3 +16,4 @@ Support for zooming in on map Satellite count moved to widget bar to leave more room for the map 0.15: Make track drawing an option (default off) +0.16: Draw waypoints, too. diff --git a/apps/openstmap/app.js b/apps/openstmap/app.js index e7629f2e1..a5130d23e 100644 --- a/apps/openstmap/app.js +++ b/apps/openstmap/app.js @@ -28,9 +28,12 @@ function redraw() { // Draw the POIs function drawPOI() { - var waypoints = require("waypoints").load(); - if (!waypoints) + try { + var waypoints = require("waypoints").load(); + } catch (ex) { + // Waypoints module not available. return; + } g.setFont("Vector", 18); waypoints.forEach((wp, idx) => { var p = m.latLonToXY(wp.lat, wp.lon); From 2f53b732bc8384beb6c8f2787d514891f71c21e0 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Mar 2023 17:54:53 +0100 Subject: [PATCH 162/183] openstmap: We updated changelog, so increase version. --- apps/openstmap/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openstmap/metadata.json b/apps/openstmap/metadata.json index 819dc4122..4419cd411 100644 --- a/apps/openstmap/metadata.json +++ b/apps/openstmap/metadata.json @@ -2,7 +2,7 @@ "id": "openstmap", "name": "OpenStreetMap", "shortName": "OpenStMap", - "version": "0.15", + "version": "0.16", "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", "readme": "README.md", "icon": "app.png", From 783686866e23bf8b11ea7d70a47f97ecfa96521d Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Mar 2023 18:46:46 +0100 Subject: [PATCH 163/183] altimeter: Display sea-level pressure, too, and allow calibration Add display of sea-level pressure and temperature, and allow calibration by setting the altitude. That way, you can get precise altitude if you already know sea-level pressure (from example from forecast), or you can calibrate using known altitude and have precise readings for a while. --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app.js | 55 +++++++++++++++++++++++++++++++----- apps/altimeter/metadata.json | 2 +- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog index 29388520e..8d21cf797 100644 --- a/apps/altimeter/ChangeLog +++ b/apps/altimeter/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Actually upload correct code +0.03: Display sea-level pressure, too, and allow calibration diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js index cac4e80fd..de664af39 100644 --- a/apps/altimeter/app.js +++ b/apps/altimeter/app.js @@ -1,4 +1,4 @@ -Bangle.setBarometerPower(true, "app"); +Bangle.setBarometerPower(true, "altimeter"); g.clear(1); Bangle.loadWidgets(); @@ -10,21 +10,62 @@ var MEDIANLENGTH = 20; var avr = [], median; var value = 0; +function getStandardPressure(altitude) { + const P0 = 1013.25; // standard pressure at sea level in hPa + const T0 = 288.15; // standard temperature at sea level in K + const g0 = 9.80665; // standard gravitational acceleration in m/s^2 + const R = 8.31432; // gas constant in J/(mol*K) + const M = 0.0289644; // molar mass of air in kg/mol + const L = -0.0065; // temperature lapse rate in K/m + + const temperature = T0 + L * altitude; // temperature at the given altitude + const pressure = P0 * Math.pow((temperature / T0), (-g0 * M) / (R * L)); // pressure at the given altitude + + return pressure; +} + +function convertToSeaLevelPressure(pressure, altitude) { + return 1013.25 * (pressure / getStandardPressure(altitude)); +} + Bangle.on('pressure', function(e) { while (avr.length>MEDIANLENGTH) avr.pop(); avr.unshift(e.altitude); median = avr.slice().sort(); - g.reset().clearRect(0,y-30,g.getWidth()-10,y+30); + g.reset().clearRect(0,y-30,g.getWidth()-10,R.h); if (median.length>10) { var mid = median.length>>1; value = E.sum(median.slice(mid-4,mid+5)) / 9; - g.setFont("Vector",50).setFontAlign(0,0).drawString((value-zero).toFixed(1), g.getWidth()/2, y); + t = value-zero; + if ((t > -100) && (t < 1000)) + t = t.toFixed(1); + else + t = t.toFixed(0); + g.setFont("Vector",50).setFontAlign(0,0).drawString(t, g.getWidth()/2, y); + sea = convertToSeaLevelPressure(e.pressure, value-zero); + t = sea.toFixed(1) + " " + e.temperature.toFixed(1); + if (0) { + print("alt raw:", value.toFixed(1)); + print("temperature:", e.temperature); + print("pressure:", e.pressure); + print("sea pressure:", sea); + print("std pressure:", getStandardPressure(value-zero)); + } + g.setFont("Vector",25).setFontAlign(-1,0).drawString(t, + 10, R.y+R.h - 35); } }); +print(g.getFonts()); g.reset(); -g.setFont("6x8").setFontAlign(0,0).drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40); +g.setFont("Vector:15"); +g.setFontAlign(0,0); +g.drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40); +g.drawString(/*LANG*/"SEA L (hPa) TEMP (C)", g.getWidth()/2, y+62); +g.flip(); g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"ZERO", g.getWidth()-5, g.getHeight()/2); -setWatch(function() { - zero = value; -}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); +Bangle.setUI("updown", btn=> { + if (!btn) zero=value; + if (btn<0) zero-=5; + if (btn>0) zero+=5; +}); diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json index 8bdbf3022..8bf3772ed 100644 --- a/apps/altimeter/metadata.json +++ b/apps/altimeter/metadata.json @@ -1,6 +1,6 @@ { "id": "altimeter", "name": "Altimeter", - "version":"0.02", + "version":"0.03", "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", "icon": "app.png", "tags": "tool,outdoors", From 81fb1dafb04db2c81dd3ba9d72f21b1754d8759c Mon Sep 17 00:00:00 2001 From: Gabriele Monaco Date: Sat, 4 Mar 2023 15:56:50 +0100 Subject: [PATCH 164/183] weather: added monochrome parameter to `drawIcon` --- apps/weather/ChangeLog | 1 + apps/weather/clkinfo.js | 2 +- apps/weather/lib.js | 9 +++------ apps/weather/metadata.json | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index 0010a58fd..50c033600 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -21,3 +21,4 @@ 0.22: Automatic translation of strings, some left untranslated. 0.23: Update clock_info to avoid a redraw 0.24: Redraw clock_info on update and provide color field for condition +0.25: Added monochrome parameter to drawIcon in lib diff --git a/apps/weather/clkinfo.js b/apps/weather/clkinfo.js index ef3b7d139..4e526b977 100644 --- a/apps/weather/clkinfo.js +++ b/apps/weather/clkinfo.js @@ -22,7 +22,7 @@ function weatherIcon(code) { var ovr = Graphics.createArrayBuffer(24,24,1,{msb:true}); - weatherLib.drawIcon({code:code},12,12,12,ovr); + weatherLib.drawIcon({code:code},12,12,12,ovr,true); var img = ovr.asImage(); img.transparent = 0; return img; diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 14ca77ec6..af6aa4d7e 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -155,14 +155,11 @@ exports.getColor = function(code) { * @param y Top * @param r Icon Size * @param ovr Graphics instance (or undefined for g) + * @param monochrome If true, produce a monochromatic icon */ -exports.drawIcon = function(cond, x, y, r, ovr) { +exports.drawIcon = function(cond, x, y, r, ovr, monochrome) { var palette; - var monochrome=1; - if(!ovr) { - ovr = g; - monochrome=0; - } + if(!ovr) ovr = g; palette = getPalette(monochrome, ovr); diff --git a/apps/weather/metadata.json b/apps/weather/metadata.json index bcb2fe109..55c2973b0 100644 --- a/apps/weather/metadata.json +++ b/apps/weather/metadata.json @@ -1,7 +1,7 @@ { "id": "weather", "name": "Weather", - "version": "0.24", + "version": "0.25", "description": "Show Gadgetbridge weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], From e67264fa4670c84ddd9103430bfe39ee55d82cbb Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sat, 4 Mar 2023 12:35:13 -0500 Subject: [PATCH 165/183] [draguboard] Create draguboard app from dragboard --- apps/draguboard/ChangeLog | 1 + apps/draguboard/README.md | 8 ++ apps/draguboard/app.png | Bin 0 -> 9180 bytes apps/draguboard/lib.js | 147 +++++++++++++++++++++++++++++++++ apps/draguboard/metadata.json | 15 ++++ apps/draguboard/screenshot.png | Bin 0 -> 16421 bytes apps/draguboard/settings.js | 44 ++++++++++ 7 files changed, 215 insertions(+) create mode 100644 apps/draguboard/ChangeLog create mode 100644 apps/draguboard/README.md create mode 100644 apps/draguboard/app.png create mode 100644 apps/draguboard/lib.js create mode 100644 apps/draguboard/metadata.json create mode 100644 apps/draguboard/screenshot.png create mode 100644 apps/draguboard/settings.js diff --git a/apps/draguboard/ChangeLog b/apps/draguboard/ChangeLog new file mode 100644 index 000000000..a228aab54 --- /dev/null +++ b/apps/draguboard/ChangeLog @@ -0,0 +1 @@ +0.01: New App based on dragboard, but with a U shaped drag area diff --git a/apps/draguboard/README.md b/apps/draguboard/README.md new file mode 100644 index 000000000..2386c7658 --- /dev/null +++ b/apps/draguboard/README.md @@ -0,0 +1,8 @@ +Swipe along the drag bars and release to select a letter, number or punctuation. + +Tap on left for backspace or right for space. + +Settings: +- ABC Color: color of the characters row +- Num Color: color of the digits and symbols row +- Highlight Color: color of the currently shown character diff --git a/apps/draguboard/app.png b/apps/draguboard/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7262b47746c2bc8db95e4067eec233a15a8702 GIT binary patch literal 9180 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 g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); + var BGCOLOR = g.theme.bg; + var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; + var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; + var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; + var BIGFONT = '6x8:3'; + var SMALLFONT = '6x8:1'; + + var LEFT = "IJKLMNOPQ"; + var MIDDLE = "ABCDEFGH"; + var RIGHT = "RSTUVWXYZ"; + var MIDPADDING = 35; + + var NUM = ' 1234567890!?,.-@'; + var NUMPADDING = ((R.x2)-6*NUM.length)/2; + var showCharY = (R.y2)/3; + var rectHeight = 40; + var vLength = LEFT.length; + var middleWidth; + var middleStart; + var topStart = R.y+12; + + g.setFontAlign(-1, -1, 0); + + function drawAbcRow() { + g.clear(); + try { // Draw widgets if they are present in the current app. + if (WIDGETS) Bangle.drawWidgets(); + } catch (_) {} + g.setColor(ABCCOLOR); + g.setFont('6x8:2x1'); + g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); + g.drawString(LEFT.split("").join("\n\n"), 22, topStart); + g.setFont('6x8:1x2'); + var spaced = MIDDLE.split("").join(" "); + middleWidth = g.stringWidth(spaced); + middleStart = (R.x2-middleWidth)/2; + g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); + g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); + g.fillRect(0, R.y, 12, R.y2); + g.fillRect(R.x2, R.y, R.x2-12, R.y2); + } + + function drawNumRow() { + g.setFont('6x8:1x2'); + g.setColor(NUMCOLOR); + g.drawString(NUM, NUMPADDING, (R.y2)/4); + g.drawString("<-", NUMPADDING+10, showCharY+5); + g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); + + g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); + } + + function updateTopString() { + g.setFont(SMALLFONT); + g.setColor(BGCOLOR); + g.fillRect(0,4+20,176,13+20); + var rectLen = text.length<27? text.length*6:27*6; + g.setColor(0.7,0,0); + //cursor position + g.fillRect(rectLen+5,4+20,rectLen+10,13+20); + g.setColor(HLCOLOR); + g.drawString(text.length<=27? text.substr(-27, 27) : '<- '+text.substr(-24,24), 5, 5+20); + } + + var charPos; + var char; + var prevChar; + + function showChars(char) { + "ram"; + + // clear large character + g.setColor(BGCOLOR); + g.fillRect(65,showCharY,R.y2-65,showCharY+28); + + // show new large character + g.setColor(HLCOLOR); + g.setFont(BIGFONT); + g.drawString(char, (R.x2)/2 - g.stringWidth(char)/2, showCharY +4); + } + + function moveCharPos(list, select, posPixels) { + charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); + char = list.charAt(charPos); + + if (char != prevChar) showChars(char); + prevChar = char; + + if (select) { + text += char; + updateTopString(); + } + } + + drawAbcRow(); + drawNumRow(); + updateTopString(); + + return new Promise((resolve,reject) => { + // Interpret touch input + Bangle.setUI({ + mode: 'custom', + back: ()=>{ + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }, + drag: function(event) { + "ram"; + + // drag on middle bottom rectangle + if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { + moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); + } + // drag on left or right rectangle + else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { + moveCharPos(event.x ( (R.y2) - 52 ))) { + moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); + } + // Make a space or backspace by tapping right or left on screen above green rectangle + else if (event.y > R.y && event.b == 0) { + if (event.x < (R.x2)/2) { + showChars('<-'); + text = text.slice(0, -1); + } else { + //show space sign + showChars('->'); + text += ' '; + } + prevChar = null; + updateTopString(); + } + } + }); + }); + }; diff --git a/apps/draguboard/metadata.json b/apps/draguboard/metadata.json new file mode 100644 index 000000000..926e36807 --- /dev/null +++ b/apps/draguboard/metadata.json @@ -0,0 +1,15 @@ +{ "id": "draguboard", + "name": "DragUboard", + "version":"0.01", + "description": "A library for text input via swiping U-shaped keyboard.", + "icon": "app.png", + "type":"textinput", + "tags": "keyboard", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"textinput","url":"lib.js"}, + {"name":"draguboard.settings.js","url":"settings.js"} + ] +} diff --git a/apps/draguboard/screenshot.png b/apps/draguboard/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cb91717924b3fa94afa9a81de13c122b91b320 GIT binary patch literal 16421 zcmeHubx>SQ_vXOh?!kk*!{F}j4#5YP!3plcT@u{godgIFoZu4No!}lMOWx0Gw`%KG zwfo;UbMKw$)8{;W&eNxRZr|#OR8^KiMIuB3005|RvXbhrpLKsu1i060ZR?H^0Kl;3 zt*Ps#Zt6(}adEP=u?Lg6y@!Cwz+N_%0D#w0ah8<_Rclh%Z*yEH#B)o&y8Z8HmJe6& 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 require('Storage').write('draguboard.json', settings); + function colorMenu(key) { + let menu = {'': {title: key}, '< Back': () => E.showMenu(appMenu)}; + Object.keys(colors).forEach(color => { + var label = colors[color]; + menu[label] = { + value: settings[key] == color, + onchange: () => { + if (color >= 0) { + settings[key] = color; + } else { + delete settings[key]; + } + save(); + setTimeout(E.showMenu, 10, appMenu); + } + }; + }); + return menu; + } + + const appMenu = { + '': {title: 'draguboard'}, '< Back': back, + /*LANG*/'ABC Color': () => E.showMenu(colorMenu("ABC")), + /*LANG*/'Num Color': () => E.showMenu(colorMenu("Num")), + /*LANG*/'Highlight Color': () => E.showMenu(colorMenu("Highlight")) + }; + + E.showMenu(appMenu); +}); \ No newline at end of file From 211f3c3113af0cbd25c22434fd8a1e5aedd0c46b Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sat, 4 Mar 2023 23:06:13 -0500 Subject: [PATCH 166/183] [draguboard] fix initialization of appRect --- apps/draguboard/lib.js | 288 +++++++++++++++++++++-------------------- 1 file changed, 147 insertions(+), 141 deletions(-) diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index 8bc9a76a8..e1dbcfc2c 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -1,147 +1,153 @@ exports.input = function(options) { - options = options||{}; - var text = options.text; - if ("string"!=typeof text) text=""; - let settings = require('Storage').readJSON('draguboard.json',1)||{} - - var R = Bangle.appRect; - const paramToColor = (param) => g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); - var BGCOLOR = g.theme.bg; - var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; - var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; - var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; - var BIGFONT = '6x8:3'; - var SMALLFONT = '6x8:1'; - - var LEFT = "IJKLMNOPQ"; - var MIDDLE = "ABCDEFGH"; - var RIGHT = "RSTUVWXYZ"; - var MIDPADDING = 35; - - var NUM = ' 1234567890!?,.-@'; - var NUMPADDING = ((R.x2)-6*NUM.length)/2; - var showCharY = (R.y2)/3; - var rectHeight = 40; - var vLength = LEFT.length; - var middleWidth; - var middleStart; - var topStart = R.y+12; - - g.setFontAlign(-1, -1, 0); - - function drawAbcRow() { - g.clear(); - try { // Draw widgets if they are present in the current app. - if (WIDGETS) Bangle.drawWidgets(); - } catch (_) {} - g.setColor(ABCCOLOR); - g.setFont('6x8:2x1'); - g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); - g.drawString(LEFT.split("").join("\n\n"), 22, topStart); - g.setFont('6x8:1x2'); - var spaced = MIDDLE.split("").join(" "); - middleWidth = g.stringWidth(spaced); - middleStart = (R.x2-middleWidth)/2; - g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); - g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); - g.fillRect(0, R.y, 12, R.y2); - g.fillRect(R.x2, R.y, R.x2-12, R.y2); + options = options||{}; + var text = options.text; + if ("string"!=typeof text) text=""; + let settings = require('Storage').readJSON('draguboard.json',1)||{}; + + var R; + const paramToColor = (param) => g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); + var BGCOLOR = g.theme.bg; + var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; + var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; + var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; + var BIGFONT = '6x8:3'; + var SMALLFONT = '6x8:1'; + + var LEFT = "IJKLMNOPQ"; + var MIDDLE = "ABCDEFGH"; + var RIGHT = "RSTUVWXYZ"; + + var NUM = ' 1234567890!?,.-@'; + var rectHeight = 40; + var vLength = LEFT.length; + var MIDPADDING; + var NUMPADDING; + var showCharY; + var middleWidth; + var middleStart; + var topStart; + g.setFontAlign(-1, -1, 0); + + function drawAbcRow() { + g.clear(); + try { // Draw widgets if they are present in the current app. + if (WIDGETS) Bangle.drawWidgets(); + } catch (_) {} + g.setColor(ABCCOLOR); + g.setFont('6x8:2x1'); + g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); + g.drawString(LEFT.split("").join("\n\n"), R.x+22, topStart); + g.setFont('6x8:1x2'); + var spaced = MIDDLE.split("").join(" "); + middleWidth = g.stringWidth(spaced); + middleStart = (R.x2-middleWidth)/2; + g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); + g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); + // Draw left and right drag rectangles + g.fillRect(R.x, R.y, 12, R.y2); + g.fillRect(R.x2, R.y, R.x2-12, R.y2); + } + + function drawNumRow() { + g.setFont('6x8:1x2'); + g.setColor(NUMCOLOR); + NUMPADDING = (R.x2-g.stringWidth(NUM))/2; + g.drawString(NUM, NUMPADDING, (R.y2)/4); + g.drawString("<-", NUMPADDING+10, showCharY+5); + g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); + + g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); + } + + function updateTopString() { + g.setFont(SMALLFONT); + g.setColor(BGCOLOR); + g.fillRect(R.x,R.y,R.x2,R.y+9); + var rectLen = text.length<27? text.length*6:27*6; + g.setColor(0.7,0,0); + //draw cursor at end of text + g.fillRect(R.x+rectLen+5,R.y,R.x+rectLen+10,R.y+9); + g.setColor(HLCOLOR); + g.drawString(text.length<=27? text : '<- '+text.substr(-24,24), R.x+5, R.y+1); + } + + function showChars(chars) { + "ram"; + + // clear large character + g.setColor(BGCOLOR); + g.fillRect(R.x+65,showCharY,R.x2-65,showCharY+28); + + // show new large character + g.setColor(HLCOLOR); + g.setFont(BIGFONT); + g.drawString(chars, (R.x2 - g.stringWidth(chars))/2, showCharY+4); + } + + var charPos; + var char; + var prevChar; + + function moveCharPos(list, select, posPixels) { + charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); + char = list.charAt(charPos); + + if (char != prevChar) showChars(char); + prevChar = char; + + if (select) { + text += char; + updateTopString(); } - - function drawNumRow() { - g.setFont('6x8:1x2'); - g.setColor(NUMCOLOR); - g.drawString(NUM, NUMPADDING, (R.y2)/4); - g.drawString("<-", NUMPADDING+10, showCharY+5); - g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); - - g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); - } - - function updateTopString() { - g.setFont(SMALLFONT); - g.setColor(BGCOLOR); - g.fillRect(0,4+20,176,13+20); - var rectLen = text.length<27? text.length*6:27*6; - g.setColor(0.7,0,0); - //cursor position - g.fillRect(rectLen+5,4+20,rectLen+10,13+20); - g.setColor(HLCOLOR); - g.drawString(text.length<=27? text.substr(-27, 27) : '<- '+text.substr(-24,24), 5, 5+20); - } - - var charPos; - var char; - var prevChar; - - function showChars(char) { - "ram"; - - // clear large character - g.setColor(BGCOLOR); - g.fillRect(65,showCharY,R.y2-65,showCharY+28); - - // show new large character - g.setColor(HLCOLOR); - g.setFont(BIGFONT); - g.drawString(char, (R.x2)/2 - g.stringWidth(char)/2, showCharY +4); - } - - function moveCharPos(list, select, posPixels) { - charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); - char = list.charAt(charPos); - - if (char != prevChar) showChars(char); - prevChar = char; - - if (select) { - text += char; - updateTopString(); + } + + return new Promise((resolve,reject) => { + // Interpret touch input + Bangle.setUI({ + mode: 'custom', + back: ()=>{ + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }, + drag: function(event) { + "ram"; + + // drag on middle bottom rectangle + if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { + moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); + } + // drag on left or right rectangle + else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { + moveCharPos(event.x ( (R.y2) - 52 ))) { + moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); + } + // Make a space or backspace by tapping right or left on screen above green rectangle + else if (event.y > R.y && event.b == 0) { + if (event.x < (R.x2)/2) { + showChars('<-'); + text = text.slice(0, -1); + } else { + //show space sign + showChars('->'); + text += ' '; + } + prevChar = null; + updateTopString(); + } } - } - + }); + + R = Bangle.appRect; + MIDPADDING = R.x + 35; + showCharY = (R.y2)/3; + topStart = R.y+12; + drawAbcRow(); drawNumRow(); updateTopString(); - - return new Promise((resolve,reject) => { - // Interpret touch input - Bangle.setUI({ - mode: 'custom', - back: ()=>{ - Bangle.setUI(); - g.clearRect(Bangle.appRect); - resolve(text); - }, - drag: function(event) { - "ram"; - - // drag on middle bottom rectangle - if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { - moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); - } - // drag on left or right rectangle - else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { - moveCharPos(event.x ( (R.y2) - 52 ))) { - moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); - } - // Make a space or backspace by tapping right or left on screen above green rectangle - else if (event.y > R.y && event.b == 0) { - if (event.x < (R.x2)/2) { - showChars('<-'); - text = text.slice(0, -1); - } else { - //show space sign - showChars('->'); - text += ' '; - } - prevChar = null; - updateTopString(); - } - } - }); - }); - }; + }); +}; From ec171c81d44f12f9e436b91c55184c73ddc23b09 Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sun, 5 Mar 2023 22:39:37 -0500 Subject: [PATCH 167/183] [draguboard] setFontAlign at the last minute --- apps/draguboard/lib.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index e1dbcfc2c..258f8b02d 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -26,7 +26,6 @@ exports.input = function(options) { var middleWidth; var middleStart; var topStart; - g.setFontAlign(-1, -1, 0); function drawAbcRow() { g.clear(); @@ -35,6 +34,7 @@ exports.input = function(options) { } catch (_) {} g.setColor(ABCCOLOR); g.setFont('6x8:2x1'); + g.setFontAlign(-1, -1, 0); g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); g.drawString(LEFT.split("").join("\n\n"), R.x+22, topStart); g.setFont('6x8:1x2'); @@ -52,6 +52,7 @@ exports.input = function(options) { g.setFont('6x8:1x2'); g.setColor(NUMCOLOR); NUMPADDING = (R.x2-g.stringWidth(NUM))/2; + g.setFontAlign(-1, -1, 0); g.drawString(NUM, NUMPADDING, (R.y2)/4); g.drawString("<-", NUMPADDING+10, showCharY+5); g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); @@ -68,6 +69,7 @@ exports.input = function(options) { //draw cursor at end of text g.fillRect(R.x+rectLen+5,R.y,R.x+rectLen+10,R.y+9); g.setColor(HLCOLOR); + g.setFontAlign(-1, -1, 0); g.drawString(text.length<=27? text : '<- '+text.substr(-24,24), R.x+5, R.y+1); } @@ -81,6 +83,7 @@ exports.input = function(options) { // show new large character g.setColor(HLCOLOR); g.setFont(BIGFONT); + g.setFontAlign(-1, -1, 0); g.drawString(chars, (R.x2 - g.stringWidth(chars))/2, showCharY+4); } From 326afaf72eaef69906dc8aeda12e851ec078e42f Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 29 Dec 2022 21:59:23 +0000 Subject: [PATCH 168/183] New widget: bt2 --- apps/widbt2/metadata.json | 14 ++++++++ apps/widbt2/widget.js | 65 ++++++++++++++++++++++++++++++++++++++ apps/widbt2/widget.png | Bin 0 -> 1119 bytes 3 files changed, 79 insertions(+) create mode 100644 apps/widbt2/metadata.json create mode 100644 apps/widbt2/widget.js create mode 100644 apps/widbt2/widget.png diff --git a/apps/widbt2/metadata.json b/apps/widbt2/metadata.json new file mode 100644 index 000000000..af7728958 --- /dev/null +++ b/apps/widbt2/metadata.json @@ -0,0 +1,14 @@ +{ + "id": "widbt2", + "name": "Bluetooth Widget 2", + "version": "0.01", + "description": "If active, shows a white bluetooth icon, if connected, a blue one", + "icon": "widget.png", + "type": "widget", + "tags": "widget,bluetooth,clkinfo", + "provides_widgets" : ["bluetooth"], + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbt2.wid.js","url":"widget.js"} + ] +} diff --git a/apps/widbt2/widget.js b/apps/widbt2/widget.js new file mode 100644 index 000000000..8b1fc3ede --- /dev/null +++ b/apps/widbt2/widget.js @@ -0,0 +1,65 @@ +(function(){ + "ram"; + + // 0: asleep, 1: active, 2: connected + let state = NRF.getSecurityStatus().connected + ? 2 + : 0; // could be active, assuming not here + + const width = () => state > 0 ? 15 : 0; + + const update = (newState) => { + state = newState; + WIDGETS.bluetooth.width = width(); + setTimeout(Bangle.drawWidgets, 50); // no need for .bind() + }; + + // { {key: State]: { boolean: string } } + // ^ dark theme + const colours = { + 1: { // active: white + false: "#fff", + true: "#fff", + }, + 2: { // connected: blue + false: "#0ff", + true: "#00f", + }, + }; + + WIDGETS.bluetooth = { + area: "tl", + sortorder: -1, + draw: function() { + if (state == 0) + return; + + g.reset(); + + g.setColor(colours[state][g.theme.dark]); + + g.drawImage( + atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), + this.x + 2, + this.y + 2 + ); + }, + width: width(), + }; + + NRF.on("connect", update.bind(null, 2)); + NRF.on("disconnect", update.bind(null, 1)); + + let origWake = NRF.wake; + let origSleep = NRF.sleep; + + NRF.wake = function() { + update(1); + return origWake.apply(this, arguments); + }; + + NRF.sleep = function() { + update(0); + return origSleep.apply(this, arguments); + }; +})(); diff --git a/apps/widbt2/widget.png b/apps/widbt2/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..1a884a62c1029ae43243f8f58ef9dc3a3327e437 GIT binary patch literal 1119 zcmV-l1fctgP)cE5(396`@Dz$wLqIPzYppJ*B(brZX|I zHChYW;Hm1lL~9feUi^283bm!!Ka0DG`v(zZvk8h?W%2@c?XT zES*ZPJU3a{7h{cB0RRrPTh=dGr*a^!0&xQX?DMczGEQwQ4)Y`c0EQJR_Oa?r)W%5x z0HhI_x1HK2pc0j7k^sKW*iQXQ=2YX6D9n-q_%qO+(!1;R%(3!ggBm9SkZ!j|fYm^E zR%O?(qZ5_=gLo$b@WZ#`wXJ`4=)@t~Y>Yv)Y!7y;OB zeO8rs?l*_RK!7NCKLhRU0}||esEhzCyx)O;I=Y5XtC(@B$NTljy45^tT?SHJ10ruX zOS$(<@@!=?P@`0+S)vnkL!=bB)DOg{Q*}L+GO)XAK;&$g@DSo22n#XlR9!)?07D(! zDxz;SOSunBbNCAVm!5U2c~9jVx@WU3=u3)pJ!ur3cu;sm-)NQ!pM}i;0{{TnZpA^Z ztASvff%b#?JdoF$<=hv8)Q159pyx{LBoBD4SyIzhb(HlW;>}!J+1=AqCDO_A6&XN}=e)0!pcibn z_HtD9d_@BAknp}zDCb9=>MK#y^fmCZ_8GoYkv>KTT7e$nHy?0mXP*UpX*>1PgVgRc z3#Fdn#d~2}5mATky^{qxZ#%U!Ve5AonQN!;&C-!_@cJGbKmk6^xYakqWbkDSU>e?6 zF9=onXw<2mHO=A62q0{DUp*iYB(+@Ja7a-n2aQU$C-1do)^M)j_l7Z`m-DHf;N2WNgeIsEr6@kFmJ z8_YbwGn3bL?QPY+LOBr_TDRcEMmfJ|;s=HR0IQ!ry9xAti1(G5Y&@#1^&${_&Hfi+ z9c`2jUpMuHhg{we{KebpwXs3NLqaRiAr)b6sg!$n>kZxDN)lj0k<-mm?qZatNdeqJ z)Lky+8&Ml40dUjvB)_tlzY&Ld+&A&{bh~wEWib~^c!+ZagoS&X-t=l^d_A@r#J2*U lKABp3ezkHW*6{xc{R@3@kib`1LqGrk002ovPDHLkV1l684mkh- literal 0 HcmV?d00001 From 3808b0bc3cd11337406e955bd8e0746a17524024 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 25 Feb 2023 23:04:41 +0000 Subject: [PATCH 169/183] widbt2: convert to typescript --- apps/widbt2/widget.js | 111 ++++++++++++++++++------------------------ apps/widbt2/widget.ts | 73 +++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 64 deletions(-) create mode 100644 apps/widbt2/widget.ts diff --git a/apps/widbt2/widget.js b/apps/widbt2/widget.js index 8b1fc3ede..441a0a099 100644 --- a/apps/widbt2/widget.js +++ b/apps/widbt2/widget.js @@ -1,65 +1,48 @@ -(function(){ - "ram"; - - // 0: asleep, 1: active, 2: connected - let state = NRF.getSecurityStatus().connected - ? 2 - : 0; // could be active, assuming not here - - const width = () => state > 0 ? 15 : 0; - - const update = (newState) => { - state = newState; - WIDGETS.bluetooth.width = width(); - setTimeout(Bangle.drawWidgets, 50); // no need for .bind() - }; - - // { {key: State]: { boolean: string } } - // ^ dark theme - const colours = { - 1: { // active: white - false: "#fff", - true: "#fff", - }, - 2: { // connected: blue - false: "#0ff", - true: "#00f", - }, - }; - - WIDGETS.bluetooth = { - area: "tl", - sortorder: -1, - draw: function() { - if (state == 0) - return; - - g.reset(); - - g.setColor(colours[state][g.theme.dark]); - - g.drawImage( - atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), - this.x + 2, - this.y + 2 - ); - }, - width: width(), - }; - - NRF.on("connect", update.bind(null, 2)); - NRF.on("disconnect", update.bind(null, 1)); - - let origWake = NRF.wake; - let origSleep = NRF.sleep; - - NRF.wake = function() { - update(1); - return origWake.apply(this, arguments); - }; - - NRF.sleep = function() { - update(0); - return origSleep.apply(this, arguments); - }; +"use strict"; +(function () { + "ram"; + var _a; + var state = NRF.getSecurityStatus().connected + ? 2 + : 0; + var width = function () { return state > 0 ? 15 : 0; }; + var update = function (newState) { + state = newState; + WIDGETS["bluetooth"].width = width(); + setTimeout(Bangle.drawWidgets, 50); + }; + var colours = (_a = {}, + _a[1] = { + false: "#fff", + true: "#fff", + }, + _a[2] = { + false: "#0ff", + true: "#00f", + }, + _a); + WIDGETS["bluetooth"] = { + area: "tl", + sortorder: -1, + draw: function () { + if (state == 0) + return; + g.reset(); + g.setColor(colours[state]["".concat(g.theme.dark)]); + g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), this.x + 2, this.y + 2); + }, + width: width(), + }; + NRF.on("connect", update.bind(null, 2)); + NRF.on("disconnect", update.bind(null, 1)); + var origWake = NRF.wake; + var origSleep = NRF.sleep; + NRF.wake = function () { + update(1); + return origWake.apply(this, arguments); + }; + NRF.sleep = function () { + update(0); + return origSleep.apply(this, arguments); + }; })(); diff --git a/apps/widbt2/widget.ts b/apps/widbt2/widget.ts new file mode 100644 index 000000000..c63d187a5 --- /dev/null +++ b/apps/widbt2/widget.ts @@ -0,0 +1,73 @@ +(() => { + "ram"; + + const enum State { + Asleep, + Active, + Connected + } + + let state: State = NRF.getSecurityStatus().connected + ? State.Connected + : State.Asleep; // could be active, assuming not here + + const width = () => state > State.Asleep ? 15 : 0; + + const update = (newState: State) => { + state = newState; + WIDGETS["bluetooth"]!.width = width(); + setTimeout(Bangle.drawWidgets, 50); // no need for .bind() + }; + + type DarkTheme = `${boolean}`; + const colours: { + [key in State.Active | State.Connected]: { + [key in DarkTheme]: ColorResolvable + } + } = { + [State.Active]: { + false: "#fff", + true: "#fff", + }, + [State.Connected]: { + false: "#0ff", + true: "#00f", + }, + }; + + WIDGETS["bluetooth"] = { + area: "tl", + sortorder: -1, + draw: function() { + if (state == State.Asleep) + return; + + g.reset(); + + g.setColor(colours[state][`${g.theme.dark}`]); + + g.drawImage( + atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), + this.x + 2, + this.y + 2 + ); + }, + width: width(), + }; + + NRF.on("connect", update.bind(null, State.Connected)); + NRF.on("disconnect", update.bind(null, State.Active)); + + const origWake = NRF.wake; + const origSleep = NRF.sleep; + + NRF.wake = function() { + update(State.Active); + return origWake.apply(this, arguments); + }; + + NRF.sleep = function() { + update(State.Asleep); + return origSleep.apply(this, arguments); + }; +})(); From d9dc729abd4c1c25e7489f9de6abac498312abd2 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 6 Mar 2023 11:44:27 +0000 Subject: [PATCH 170/183] Regenerate types - NRF.getSecurityStatus() --- apps/widbt2/widget.ts | 4 ++-- typescript/types/main.d.ts | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/widbt2/widget.ts b/apps/widbt2/widget.ts index c63d187a5..d2585f1fb 100644 --- a/apps/widbt2/widget.ts +++ b/apps/widbt2/widget.ts @@ -48,8 +48,8 @@ g.drawImage( atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="), - this.x + 2, - this.y + 2 + this.x! + 2, + this.y! + 2 ); }, width: width(), diff --git a/typescript/types/main.d.ts b/typescript/types/main.d.ts index 1223f527d..944d55326 100644 --- a/typescript/types/main.d.ts +++ b/typescript/types/main.d.ts @@ -183,6 +183,23 @@ type NRFFilters = { manufacturerData?: object; }; +type NRFSecurityStatus = { + advertising: boolean, +} & ( + { + connected: true, + encrypted: boolean, + mitm_protected: boolean, + bonded: boolean, + connected_addr?: string, + } | { + connected: false, + encrypted: false, + mitm_protected: false, + bonded: false, + } +); + type ImageObject = { width: number; height: number; @@ -721,7 +738,7 @@ declare class NRF { * @returns {any} An object * @url http://www.espruino.com/Reference#l_NRF_getSecurityStatus */ - static getSecurityStatus(): any; + static getSecurityStatus(): NRFSecurityStatus; /** * @returns {any} An object @@ -1898,6 +1915,7 @@ declare class NRF { * encrypted // Communication on this link is encrypted. * mitm_protected // The encrypted communication is also protected against man-in-the-middle attacks. * bonded // The peer is bonded with us + * advertising // Are we currently advertising? * connected_addr // If connected=true, the MAC address of the currently connected device * } * ``` @@ -1906,7 +1924,7 @@ declare class NRF { * @returns {any} An object * @url http://www.espruino.com/Reference#l_NRF_getSecurityStatus */ - static getSecurityStatus(): any; + static getSecurityStatus(): NRFSecurityStatus; /** * @@ -4553,7 +4571,7 @@ declare class BluetoothRemoteGATTServer { * @returns {any} An object * @url http://www.espruino.com/Reference#l_BluetoothRemoteGATTServer_getSecurityStatus */ - getSecurityStatus(): any; + getSecurityStatus(): NRFSecurityStatus; /** * See `NRF.connect` for usage examples. From 832ec7a7a5eccab3c0e027d42ae7ea7a630c1624 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 6 Mar 2023 12:04:58 +0000 Subject: [PATCH 171/183] Use NRF.getSecurityStatus().advertising for initial state --- apps/widbt2/widget.js | 11 ++++++++--- apps/widbt2/widget.ts | 10 +++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/widbt2/widget.js b/apps/widbt2/widget.js index 441a0a099..1d32e1bc4 100644 --- a/apps/widbt2/widget.js +++ b/apps/widbt2/widget.js @@ -2,9 +2,14 @@ (function () { "ram"; var _a; - var state = NRF.getSecurityStatus().connected - ? 2 - : 0; + var state = (function () { + var status = NRF.getSecurityStatus(); + if (status.connected) + return 2; + if (status.advertising) + return 1; + return 0; + })(); var width = function () { return state > 0 ? 15 : 0; }; var update = function (newState) { state = newState; diff --git a/apps/widbt2/widget.ts b/apps/widbt2/widget.ts index d2585f1fb..8f02c1b8c 100644 --- a/apps/widbt2/widget.ts +++ b/apps/widbt2/widget.ts @@ -7,9 +7,13 @@ Connected } - let state: State = NRF.getSecurityStatus().connected - ? State.Connected - : State.Asleep; // could be active, assuming not here + let state: State = (() => { + const status = NRF.getSecurityStatus(); + + if (status.connected) return State.Connected; + if (status.advertising) return State.Active; + return State.Asleep; + })(); const width = () => state > State.Asleep ? 15 : 0; From c0194f260f99142159d35962ae480427ff026e9e Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 6 Mar 2023 12:14:56 +0000 Subject: [PATCH 172/183] Rename -> widbtstates --- apps/{widbt2 => widbtstates}/metadata.json | 8 ++++---- apps/{widbt2 => widbtstates}/widget.js | 0 apps/{widbt2 => widbtstates}/widget.png | Bin apps/{widbt2 => widbtstates}/widget.ts | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename apps/{widbt2 => widbtstates}/metadata.json (64%) rename apps/{widbt2 => widbtstates}/widget.js (100%) rename apps/{widbt2 => widbtstates}/widget.png (100%) rename apps/{widbt2 => widbtstates}/widget.ts (100%) diff --git a/apps/widbt2/metadata.json b/apps/widbtstates/metadata.json similarity index 64% rename from apps/widbt2/metadata.json rename to apps/widbtstates/metadata.json index af7728958..ada530e1b 100644 --- a/apps/widbt2/metadata.json +++ b/apps/widbtstates/metadata.json @@ -1,14 +1,14 @@ { - "id": "widbt2", - "name": "Bluetooth Widget 2", + "id": "widbtstates", + "name": "Bluetooth States", "version": "0.01", - "description": "If active, shows a white bluetooth icon, if connected, a blue one", + "description": "If active, shows a white bluetooth icon, if connected, a blue one (nothing if sleeping)", "icon": "widget.png", "type": "widget", "tags": "widget,bluetooth,clkinfo", "provides_widgets" : ["bluetooth"], "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"widbt2.wid.js","url":"widget.js"} + {"name":"widbtstates.wid.js","url":"widget.js"} ] } diff --git a/apps/widbt2/widget.js b/apps/widbtstates/widget.js similarity index 100% rename from apps/widbt2/widget.js rename to apps/widbtstates/widget.js diff --git a/apps/widbt2/widget.png b/apps/widbtstates/widget.png similarity index 100% rename from apps/widbt2/widget.png rename to apps/widbtstates/widget.png diff --git a/apps/widbt2/widget.ts b/apps/widbtstates/widget.ts similarity index 100% rename from apps/widbt2/widget.ts rename to apps/widbtstates/widget.ts From a135ba497f6d19f23a788f0a873446c42a5c0547 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 6 Mar 2023 12:15:04 +0000 Subject: [PATCH 173/183] ChangeLog --- apps/widbtstates/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/widbtstates/ChangeLog diff --git a/apps/widbtstates/ChangeLog b/apps/widbtstates/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/widbtstates/ChangeLog @@ -0,0 +1 @@ +0.01: New App! From 8a3cb4480d51b90d22d0e39036833af435ef86a4 Mon Sep 17 00:00:00 2001 From: Christian Meichle Date: Mon, 6 Mar 2023 15:40:11 +0100 Subject: [PATCH 174/183] fixed typo in settings.js for DRAGDOWN that did cause the setting to not be saved correctly and hence wasn't settable --- apps/clockcal/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/clockcal/settings.js b/apps/clockcal/settings.js index 4d8be6fbd..a406f3cf7 100644 --- a/apps/clockcal/settings.js +++ b/apps/clockcal/settings.js @@ -93,7 +93,7 @@ value: actions.indexOf(settings.DRAGDOWN), format: v => actions[v], onchange: v => { - settings.DRGDOWN = actions[v]; + settings.DRAGDOWN = actions[v]; writeSettings(); } }, From b1726ea33c3205093ebc5b0400b38884c75801db Mon Sep 17 00:00:00 2001 From: Christian Meichle Date: Mon, 6 Mar 2023 15:40:11 +0100 Subject: [PATCH 175/183] fixed typo in settings.js for DRAGDOWN that did cause the setting to not be saved correctly and hence wasn't settable --- apps/clockcal/ChangeLog | 1 + apps/clockcal/metadata.json | 2 +- apps/clockcal/settings.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/clockcal/ChangeLog b/apps/clockcal/ChangeLog index 4c8c13366..5657bf26d 100644 --- a/apps/clockcal/ChangeLog +++ b/apps/clockcal/ChangeLog @@ -5,3 +5,4 @@ 0.05: Improved colors (connected vs disconnected) 0.06: Tell clock widgets to hide. 0.07: Convert Yes/No On/Off in settings to checkboxes +0.08: Fixed typo in settings.js for DRAGDOWN to make option work \ No newline at end of file diff --git a/apps/clockcal/metadata.json b/apps/clockcal/metadata.json index 03f5c3df2..998115827 100644 --- a/apps/clockcal/metadata.json +++ b/apps/clockcal/metadata.json @@ -1,7 +1,7 @@ { "id": "clockcal", "name": "Clock & Calendar", - "version": "0.07", + "version": "0.08", "description": "Clock with Calendar", "readme":"README.md", "icon": "app.png", diff --git a/apps/clockcal/settings.js b/apps/clockcal/settings.js index 4d8be6fbd..a406f3cf7 100644 --- a/apps/clockcal/settings.js +++ b/apps/clockcal/settings.js @@ -93,7 +93,7 @@ value: actions.indexOf(settings.DRAGDOWN), format: v => actions[v], onchange: v => { - settings.DRGDOWN = actions[v]; + settings.DRAGDOWN = actions[v]; writeSettings(); } }, From ff534827ada5a497173e7532316717e978fd78d3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 09:59:17 +0000 Subject: [PATCH 176/183] Fix "App Install Failed, Undefined", fix https://github.com/espruino/BangleApps/issues/2636 --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 0d02ff376..96d7ec120 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 0d02ff3763783d166ff84906af038420736aabfc +Subproject commit 96d7ec120740726b2fdc63d8c9ce760b38b3edd3 From 53b704232dc455235575eeb717e255273d51efc1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 11:28:15 +0000 Subject: [PATCH 177/183] Update metadata.json bump version after merge --- apps/alarm/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 28d48daab..8522b07c0 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.38", + "version": "0.39", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", From 871566ed0bd7475eff170677698258782e0ae027 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 11:37:35 +0000 Subject: [PATCH 178/183] Revert changes that took out localisation of the date --- apps/alarm/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 1807ce6a8..c0ae17f00 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -46,7 +46,7 @@ function getLabel(e) { const dateStr = e.date && require("locale").date(new Date(e.date), 1); return (e.timer ? require("time_utils").formatDuration(e.timer) - : (e.date ? `${e.date.substring(5,10)}${e.rp?"*":""} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeRepeat(e)}` : "")) + : (dateStr ? `${dateStr}${e.rp?"*":""} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeRepeat(e)}` : "")) ) + (e.msg ? ` ${e.msg}` : ""); } From e87e3f137b0022540b748b802199f90c916a5ea6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 11:41:21 +0000 Subject: [PATCH 179/183] Added handling for 'rp:true' and also debug message in case of invalid repeat type --- apps/sched/sched.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 57876ff69..ea4c43443 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -84,6 +84,9 @@ function showAlarm(alarm) { let date = new Date(alarm.date); let rp = alarm.rp; switch(rp.interval) { + case true: + date.setDate(date.getDate() + 1); + break; case "day": date.setDate(date.getDate() + rp.num); break; @@ -100,6 +103,9 @@ function showAlarm(alarm) { date = new Date(date.getFullYear() + rp.num, date.getMonth(), alarm.od); if (date.getDate() != alarm.od) date.setDate(0); break; + default: + console.log(`sched: unknown repeat '${JSON.stringify(rp)}'`); + break; } alarm.date = date.toLocalISOString().slice(0,10); } From 781d7b96fd647fd4b1fcc8da3093de5f0725174c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 14:58:07 +0000 Subject: [PATCH 180/183] fix device ID setting so tools for Bangle.js 1 use the right ID --- bin/lib/apploader.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/lib/apploader.js b/bin/lib/apploader.js index 329ece7b7..c1aaa5389 100644 --- a/bin/lib/apploader.js +++ b/bin/lib/apploader.js @@ -26,8 +26,10 @@ var device = { id : DEVICEID, appsInstalled : [] }; // call with {DEVICEID:"BANGLEJS/BANGLEJS2"} exports.init = function(options) { - if (options.DEVICEID) + if (options.DEVICEID) { DEVICEID = options.DEVICEID; + device.id = options.DEVICEID; + } // Load app metadata var dirs = require("fs").readdirSync(APPSDIR, {withFileTypes: true}); dirs.forEach(dir => { From 8ca9a89dd0dc04ba6fd781da5ac2bc8a9102dead Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 15:14:40 +0000 Subject: [PATCH 181/183] new tools.js --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 96d7ec120..2bb1e55d3 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 96d7ec120740726b2fdc63d8c9ce760b38b3edd3 +Subproject commit 2bb1e55d32d640312fe08cf54de1cd9c498cd31e From 1ca96bca9033cdee35f3f147ccc70f5905762197 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Tue, 7 Mar 2023 16:23:49 +0100 Subject: [PATCH 182/183] Fix graphic bug; View via popup while there are other open apps --- apps/messages_light/ChangeLog | 3 +- apps/messages_light/messages_light.app.js | 2 +- .../messages_light/messages_light.listener.js | 127 ++++++++++++++---- apps/messages_light/metadata.json | 2 +- 4 files changed, 107 insertions(+), 27 deletions(-) diff --git a/apps/messages_light/ChangeLog b/apps/messages_light/ChangeLog index 9c3acf0f2..23d9ba053 100644 --- a/apps/messages_light/ChangeLog +++ b/apps/messages_light/ChangeLog @@ -5,4 +5,5 @@ implemented use of the "messageicons" library removed lib no longer used 1.3: icon changed -1.4: new management of events implemented; removed code no longer used (from now the music will be managed by the Messagesgui app) \ No newline at end of file +1.4: new management of events implemented; removed code no longer used (from now the music will be managed by the Messagesgui app) +1.5: Fix graphic bug; View via popup while there are other open apps \ No newline at end of file diff --git a/apps/messages_light/messages_light.app.js b/apps/messages_light/messages_light.app.js index 94f619259..40f94dd0f 100644 --- a/apps/messages_light/messages_light.app.js +++ b/apps/messages_light/messages_light.app.js @@ -493,7 +493,7 @@ let main = function(){ Bangle.on('tap', doubleTapUnlock); Bangle.on('touch', toushScroll); - //quando apro quest'app, do per scontato che c'è un messaggio da leggere posto in un file particolare ( NewMessage.json ) + //quando apro quest'app, do per scontato che c'è un messaggio da leggere posto in un file particolare ( messages_light.NewEvent.json ) let eventToShow = require('Storage').readJSON(settings.NewEventFileName, true); require("Storage").erase(settings.NewEventFileName) if( eventToShow!==undefined) diff --git a/apps/messages_light/messages_light.listener.js b/apps/messages_light/messages_light.listener.js index 9b1158b1c..2525a52bd 100644 --- a/apps/messages_light/messages_light.listener.js +++ b/apps/messages_light/messages_light.listener.js @@ -1,42 +1,121 @@ + +let overlayTimeout=undefined; exports.listener = function(type, event) { - /* + //salva gli eventi che arrivano su file - events=require("Storage").readJSON("events_log",true) || []; + /* events=require("Storage").readJSON("events_log",true) || []; events.push ( event) - require("Storage").writeJSON("events_log",events);*/ - + require("Storage").writeJSON("events_log",events); + */ //if (event.handled) return; // already handled/app open - if( type=="music" || event.id=="music") return; //lo lascio gestire a qualcun altro + if( type=="clearAll" || type=="music" || event.id=="music") return; //lo lascio gestire a qualcun altro //se arrivo qua gestisco io //non mi preoccupo di salvare ( a meno di problemi a mantenere tanti messaggi in queue nella ram...) event.handled=true; + if( Bangle.CLOCK || global.__FILE__ === undefined || global.__FILE__ === ".bootcde" || global.__FILE__.startsWith("messages_light.")) + { + //se non ci sono app aperte ( clock oppure c'è messages_light) + //continuo con la visualizzazione dell messaggio - let callApp; - //se l'app non è aperta - if ("undefined"==typeof manageEvent) - { - if(event.t=="remove") return; //l'app non è aperta, non c'è nessun messaggio da rimuovere dalla queue -> non lancio l'app - - //chiamo la load dell'app - callApp=function(event){ - require("Storage").writeJSON("messages_light.NewEvent.json",event); - load("messages_light.app.js"); + let callApp; + //se l'app non è aperta + if ("undefined"==typeof manageEvent) + { + if(event.t=="remove") return; //l'app non è aperta, non c'è nessun messaggio da rimuovere dalla queue -> non lancio l'app + + //chiamo la load dell'app + callApp=function(event){ + require("Storage").writeJSON("messages_light.NewEvent.json",event); + load("messages_light.app.js"); + } } - } - else - { - //dico all'app di gestire l'evento - callApp=function(event){ - manageEvent(event); + else + { + //dico all'app di gestire l'evento + callApp=function(event){ + manageEvent(event); + } } - } + - - callApp(event); + callApp(event); + + + } + else{ + //TODO: BHOO!!! + //vibro e basta? + //faccio comparire un overlay veloce? + //uso l'overlay sempre? ( gestione di tutti gli eventi smadonnosa... ) + //salvo lo stato dell'app attuale( NON SO COME ), lancio la mia app e alla chiusura torno allo stato precedente? + + console.log(event); + let ovr=undefined; + let palette; + let timeout; + + if(event.id=="call" && event.t!="remove") + { + let count=3; + let idInter= setInterval(()=>{ + if(--count<=0) + clearInterval(idInter); + + Bangle.buzz(100,1); + },200); + + ovr = Graphics.createArrayBuffer(136,136,2,{msb:true}); + ovr.setColor(1).fillRect({x:0,y:0,w:135,h:135,r:8}); + ovr.setColor(2).setFont("Vector:30").setFontAlign(0,0).drawString("Call",68,20); + var lines=ovr.wrapString(event.title,136); + for(let i=0;i< lines.length;i++) + ovr.setColor(2).setFont("Vector:20").setFontAlign(0,0).drawString(lines[i],68,50+i*15); + + palette=[0,g.toColor("#141"),g.toColor("#fff"),g.toColor("#FFF")]; + timeout=4000; + } + else if(event.t=="add" || event.t=="modify") + { + Bangle.buzz(); + ovr = Graphics.createArrayBuffer(136,136,2,{msb:true}); + ovr.setColor(1).fillRect({x:0,y:0,w:135,h:135,r:8}); + ovr.setColor(2).setFont("Vector:20").setFontAlign(0,0).drawString(event.src,68,15); + ovr.setColor(2).setFont("Vector:15").setFontAlign(0,0).drawString(event.title,68,35); + var lines=ovr.wrapString(event.body,136); + for(let i=0;i< lines.length;i++) + ovr.setColor(2).setFont("Vector:15").setFontAlign(0,0).drawString(lines[i],68,60+i*15); + + + palette=[0,g.toColor("#09c"),g.toColor("#fff"),g.toColor("#FFF")]; + timeout=5000; + } + + + if(ovr===undefined) + return; + + + Bangle.setLCDPower(true); + + Bangle.setLCDOverlay({ + width:ovr.getWidth(), height:ovr.getHeight(), + bpp:2, transparent:0, + palette:new Uint16Array(palette), + buffer:ovr.buffer + },20,20); + + Bangle.setLCDPower(true); + + if(overlayTimeout) clearTimeout(overlayTimeout); + overlayTimeout=setTimeout(()=>{ + Bangle.setLCDOverlay(); + overlayTimeout=undefined; + },timeout); + } } diff --git a/apps/messages_light/metadata.json b/apps/messages_light/metadata.json index 5ec1f5a37..eeab7d9f4 100644 --- a/apps/messages_light/metadata.json +++ b/apps/messages_light/metadata.json @@ -1,7 +1,7 @@ { "id": "messages_light", "name": "Messages Light", - "version": "1.4", + "version": "1.5", "description": "A light implementation of messages App (display notifications from iOS and Gadgetbridge/Android)", "icon": "app.png", "type": "app", From 96ee2a52c8bf409a6d9d8ac0fcb08239ded91080 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 15:44:37 +0000 Subject: [PATCH 183/183] add 2v17 firmware --- apps/fwupdate/custom.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/fwupdate/custom.html b/apps/fwupdate/custom.html index de972b0e8..a648030c1 100644 --- a/apps/fwupdate/custom.html +++ b/apps/fwupdate/custom.html @@ -99,6 +99,7 @@ function onInit(device) { if (crc==1038322422) version = "2v14"; if (crc==2560806221) version = "2v15"; if (crc==2886730689) version = "2v16"; + if (crc==156320890) version = "2v17"; if (!ok) { version += `(⚠ update required)`; }