From 1a97923c47bb71b15cad7ca5c991c4a02907cf28 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Fri, 8 May 2020 15:59:19 +0200 Subject: [PATCH 001/148] Tidy up the code and adding comments --- apps/rclock/rclock.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index a22f6e2b7..0217b31f1 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -26,8 +26,8 @@ color: '#f0af00', shadow: '#CF7500', font: 'Vector', - size: 60, - middle: screen.middle - 30, + size: 50, + middle: screen.middle - 20, center: screen.center, }, date: { From 8c0c0b5a53334221c94096483dbe087898d33a25 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 13:34:39 +0100 Subject: [PATCH 002/148] starting planetarium --- apps.json | 14 +++ apps/planetarium/README.md | 1 + apps/planetarium/planetarium-icon.js | 1 + apps/planetarium/planetarium.app.csv | 30 +++++ apps/planetarium/planetarium.js | 167 +++++++++++++++++++++++++++ apps/planetarium/planetarium.png | Bin 0 -> 2930 bytes 6 files changed, 213 insertions(+) create mode 100644 apps/planetarium/README.md create mode 100644 apps/planetarium/planetarium-icon.js create mode 100644 apps/planetarium/planetarium.app.csv create mode 100644 apps/planetarium/planetarium.js create mode 100644 apps/planetarium/planetarium.png diff --git a/apps.json b/apps.json index 71cd4d041..ce523ded8 100644 --- a/apps.json +++ b/apps.json @@ -2674,4 +2674,18 @@ {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} ] } +, +{ "id": "planetarium", + "name": "Planetarium", + "shortName":"planetarium", + "icon": "planetarium.png", + "version":"0.01", + "description": "Planetarium.", + "tags": "", + "storage": [ + {"name":"planetarium.app.js","url":"planetarium.app.js"}, + {"name":"planetarium.app.csv","url":"planetarium.app.csv"}, + {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} + ] +} ] diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md new file mode 100644 index 000000000..2e07794e9 --- /dev/null +++ b/apps/planetarium/README.md @@ -0,0 +1 @@ +# Planetarium \ No newline at end of file diff --git a/apps/planetarium/planetarium-icon.js b/apps/planetarium/planetarium-icon.js new file mode 100644 index 000000000..d901489c2 --- /dev/null +++ b/apps/planetarium/planetarium-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg96xAWVhGIwAuWGCoXrCIZfFDZkJyAKTAAOZBaojEzIADGBoOChITEAgIUCGBAhCCwIlFA4YwIhIjCDQYtDAoIMBQhgUCzJMDR5xYGFwSPMHwYRED4KPMCQcIxKtHWApoCEYczmYXCPgYAEGgZGCAgMDC4pEGA4gVBGwIWCF6GqhWgC4kqBYYAGGgegC4QWCC4kKI4oQBC4guEC4wJDC4gtBGoIXDmWqBoQMBBQUwIAQXJKopSDJooXGmQRBBwYLBFgR2EC4QAEC4RIDToRQDC56pESYhHDAAYFBA4YvMD4oOEL5bMGaJIQFC5ZiEAoxRCC5I1KJoIXVBYJ4FEYgAGPAwwHSYIAGJAwwHEA5+HB5AvMZI4XKBwu72ELAQIHCAoQCBchQMCAQIADDgIfEDBYRBAAI5DCxYUDAxYYMAAgWPDIoVSAFAA==")) \ No newline at end of file diff --git a/apps/planetarium/planetarium.app.csv b/apps/planetarium/planetarium.app.csv new file mode 100644 index 000000000..0f3938e81 --- /dev/null +++ b/apps/planetarium/planetarium.app.csv @@ -0,0 +1,30 @@ +1.76779,-0.29175,-1.5,AL CMA +1.67531,-0.91971,-0.7,AL CAR +3.73352,0.33480,-0.0,AL BOO +3.83799,-1.06178,-0.0,AL1 CEN +4.87356,0.67690,0.0,AL LYR +1.38181,0.80282,0.1,AL AUR +1.37243,-0.14315,0.1,BE ORI +2.00408,0.09119,0.4,AL CMI +0.42636,-0.99897,0.5,AL ERI +1.54973,0.12928,0.5,AL ORI +3.68187,-1.05370,0.6,BE CEN +5.19577,0.15478,0.8,AL AQL +1.20393,0.28814,0.8,AL TAU +4.31710,-0.46132,1.0,AL SCO +3.51331,-0.19480,1.0,AL VIR +2.03032,0.48915,1.1,BE GEM +6.01113,-0.51701,1.2,AL PSA +3.34982,-1.04176,1.2,BE CRU +5.41676,0.79029,1.2,AL CYG +3.83799,-1.06178,1.3,AL2 CEN +2.65452,0.20887,1.4,AL LEO +1.82660,-0.50566,1.5,EP CMA +1.98356,0.55656,1.6,AL GEM +3.25765,-1.10128,1.6,AL1 CRU +1.98356,0.55656,1.6,AL GEM +3.27758,-0.99681,1.6,GA CRU +4.59723,-0.64758,1.6,LA SCO +1.41865,0.11082,1.6,GA ORI +1.42372,0.49930,1.6,BE TAU +2.41380,-1.21680,1.7,BE CAR \ No newline at end of file diff --git a/apps/planetarium/planetarium.js b/apps/planetarium/planetarium.js new file mode 100644 index 000000000..da436b104 --- /dev/null +++ b/apps/planetarium/planetarium.js @@ -0,0 +1,167 @@ +var counter; +var counterInterval; + +var settings; + +var work=false; //true if training false if resting +var prep=true; //true if we are in prep phase (at the beginning of the session +var setNum; + +var paused; + +function endPart() { + g.clear(); + if (prep){ + prep=false; + work = true; + counter = settings.workseg+settings.workmin*60; + startCounter(); + }else if (work){ + work = false; + counter = settings.restseg+settings.restmin*60; + startCounter(); + } + else{ + if (setNum>1) + { + setNum--; + work = true; + counter = settings.workseg+settings.workmin*60; + startCounter(); + } + else + { + //End session + setWatch(showMenu, BTN2); + E.showMessage("Press BTN2 for\ngoing back\nto the menu","Well done!"); + } + } +} + +function printCounter(counter){ + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + let minutes = Math.floor(counter/60); + let segs = counter % 60; + let textMinutes = minutes.toString().padStart(2, "0"); + let textSegs = segs.toString().padStart(2,"0"); + g.clearRect(0,80,239,160); + g.setFont("Vector",30); + if (prep) + g.setColor(125,125,0); + else if (work) + g.setColor(255,0,0); + else + g.setColor(0,255,0); + g.drawString(setNum,120,50); + if (prep) + g.drawString("PREPARATION",120,190); + else if (work) + g.drawString("WORK",120,190); + else + g.drawString("REST",120,190); + g.setFont("Vector",10); + g.drawString("Touch to pause",120,215); + g.setFont("Vector",80); + g.drawString(textMinutes+":"+textSegs,120,120); +} + +function signal_to_user(le){ + if (settings.buzz) + Bangle.buzz(le); + else + Bangle.beep(le,4000); +} + +function countDown() { + counter--; + if (counter<4 && counter>0) + signal_to_user(200); + if (counter==0) + signal_to_user(600); + + if (counter<0) { + clearInterval(counterInterval); + counterInterval = undefined; + endPart(); + } + else + { + printCounter(counter); + } + g.flip(); +} + +function startCounter(){ + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +function pause() +{ + if (!paused) + { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(resume,BTN4); + setWatch(resume,BTN5); + paused=true; + g.clear(); + g.setFont("Vector",60); + g.drawString("PAUSED",120,120); + g.setFont("Vector",20); + g.drawString("Touch to continue",120,180); + } +} + +function resume(){ + if (paused) + { + g.clear(); + counterInterval = setInterval(countDown, 1000); + setWatch(pause,BTN4); + setWatch(pause,BTN5); + paused=false; + } +} + +function startSession() { + E.showMenu(); + paused=false; + setWatch(pause,BTN4); + setWatch(pause,BTN5); + require('Storage').write('intervals.settings.json',settings); + setNum = settings.sets; + counter = 5;//prep time + prep=true; + work=false; + startCounter(); +} + +function showMenu() +{ + settings = require('Storage').readJSON('intervals.settings.json',1)|| + { sets:1,workseg:10,workmin:0,restseg:5,restmin:0,buzz:true}; + + var mainmenu = { + "" : { "title" : "-- Main Menu --" }, + "START" : function() { startSession(); }, + "Sets" : { value : settings.sets,min:0,max:20,step:1,onchange : v => { settings.sets=v; } }, + "Work minutes" : { value : settings.workmin,min:0,max:59,step:1,onchange : v => { settings.workmin=v; } }, + "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, + "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, + "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, + "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} + }; + + E.showMenu(mainmenu); +} + +showMenu(); + + + + + + diff --git a/apps/planetarium/planetarium.png b/apps/planetarium/planetarium.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ca9ff41f50a570bb66426bc4e93bdc73a4aba0 GIT binary patch literal 2930 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 Date: Thu, 28 Jan 2021 18:07:39 +0100 Subject: [PATCH 003/148] planetarium --- apps.json | 2 +- apps/intervals/intervals.app.js | 312 +++++++++++------------ apps/planetarium/planetarium-icon.js | 2 +- apps/planetarium/planetarium.app.csv | 30 --- apps/planetarium/planetarium.app.js | 141 +++++++++++ apps/planetarium/planetarium.data.csv | 343 ++++++++++++++++++++++++++ apps/planetarium/planetarium.js | 167 ------------- apps/planetarium/planetarium.png | Bin 2930 -> 1920 bytes 8 files changed, 645 insertions(+), 352 deletions(-) delete mode 100644 apps/planetarium/planetarium.app.csv create mode 100644 apps/planetarium/planetarium.app.js create mode 100644 apps/planetarium/planetarium.data.csv delete mode 100644 apps/planetarium/planetarium.js diff --git a/apps.json b/apps.json index ce523ded8..f4546d95f 100644 --- a/apps.json +++ b/apps.json @@ -2684,7 +2684,7 @@ "tags": "", "storage": [ {"name":"planetarium.app.js","url":"planetarium.app.js"}, - {"name":"planetarium.app.csv","url":"planetarium.app.csv"}, + {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} ] } diff --git a/apps/intervals/intervals.app.js b/apps/intervals/intervals.app.js index da436b104..a158ca967 100644 --- a/apps/intervals/intervals.app.js +++ b/apps/intervals/intervals.app.js @@ -1,164 +1,170 @@ -var counter; -var counterInterval; - -var settings; - -var work=false; //true if training false if resting -var prep=true; //true if we are in prep phase (at the beginning of the session -var setNum; - -var paused; - -function endPart() { - g.clear(); - if (prep){ - prep=false; - work = true; - counter = settings.workseg+settings.workmin*60; - startCounter(); - }else if (work){ - work = false; - counter = settings.restseg+settings.restmin*60; - startCounter(); - } - else{ - if (setNum>1) - { - setNum--; - work = true; - counter = settings.workseg+settings.workmin*60; - startCounter(); - } - else - { - //End session - setWatch(showMenu, BTN2); - E.showMessage("Press BTN2 for\ngoing back\nto the menu","Well done!"); - } - } -} - -function printCounter(counter){ - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - let minutes = Math.floor(counter/60); - let segs = counter % 60; - let textMinutes = minutes.toString().padStart(2, "0"); - let textSegs = segs.toString().padStart(2,"0"); - g.clearRect(0,80,239,160); - g.setFont("Vector",30); - if (prep) - g.setColor(125,125,0); - else if (work) - g.setColor(255,0,0); - else - g.setColor(0,255,0); - g.drawString(setNum,120,50); - if (prep) - g.drawString("PREPARATION",120,190); - else if (work) - g.drawString("WORK",120,190); - else - g.drawString("REST",120,190); - g.setFont("Vector",10); - g.drawString("Touch to pause",120,215); - g.setFont("Vector",80); - g.drawString(textMinutes+":"+textSegs,120,120); -} - -function signal_to_user(le){ - if (settings.buzz) - Bangle.buzz(le); - else - Bangle.beep(le,4000); -} - -function countDown() { - counter--; - if (counter<4 && counter>0) - signal_to_user(200); - if (counter==0) - signal_to_user(600); - - if (counter<0) { - clearInterval(counterInterval); - counterInterval = undefined; - endPart(); - } - else - { - printCounter(counter); - } - g.flip(); -} - -function startCounter(){ - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -function pause() +/* + * Degrees to radians + */ +function toRadians(degrees) { - if (!paused) - { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(resume,BTN4); - setWatch(resume,BTN5); - paused=true; - g.clear(); - g.setFont("Vector",60); - g.drawString("PAUSED",120,120); - g.setFont("Vector",20); - g.drawString("Touch to continue",120,180); - } + return Math.PI * degrees / 180; } -function resume(){ - if (paused) - { - g.clear(); - counterInterval = setInterval(countDown, 1000); - setWatch(pause,BTN4); - setWatch(pause,BTN5); - paused=false; - } -} - -function startSession() { - E.showMenu(); - paused=false; - setWatch(pause,BTN4); - setWatch(pause,BTN5); - require('Storage').write('intervals.settings.json',settings); - setNum = settings.sets; - counter = 5;//prep time - prep=true; - work=false; - startCounter(); -} - -function showMenu() +/* + * Julian day number + * Assumes a proleptic gregorian calendar where the year 1 is preceded by the + * year 0. + */ +function toJulianDay(year, month, day, hours, minutes, seconds) { - settings = require('Storage').readJSON('intervals.settings.json',1)|| - { sets:1,workseg:10,workmin:0,restseg:5,restmin:0,buzz:true}; + day += hours / 24 + minutes / 1440 + seconds / 86400; + + if(month <= 2) + { + year -= 1; + month += 12; + } + + var A = Math.floor(year / 100); + var B = 2 - A + Math.floor(A / 4); + return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5; +} - var mainmenu = { - "" : { "title" : "-- Main Menu --" }, - "START" : function() { startSession(); }, - "Sets" : { value : settings.sets,min:0,max:20,step:1,onchange : v => { settings.sets=v; } }, - "Work minutes" : { value : settings.workmin,min:0,max:59,step:1,onchange : v => { settings.workmin=v; } }, - "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, - "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, - "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, - "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} - }; +/* + * Sidereal time in Greenwich + */ +function siderealTime(julianDay) +{ + var T = (julianDay - 2451545.0) / 36525; + return toRadians(280.46061837 + 360.98564736629 * (julianDay - 2451545.0) + 0.000387933 * T * T - T * T * T / 38710000); +} + +function binary_search(a, value) { + var lo = 0, hi = a.length - 1, mid; + while (lo <= hi) { + mid = Math.floor((lo+hi)/2); + if (a[mid] > value) + hi = mid - 1; + else if (a[mid] < value) + lo = mid + 1; + else + return mid; + } + return null; +} + +function drawStars(lat,lon){ + var longitude = toRadians(-lon); + var latitude = toRadians(lat); - E.showMenu(mainmenu); + date = new Date(); + + var julianDay = toJulianDay(date.getFullYear(), date.getMonth()+1,date.getDate(), + date.getHours() + date.getTimezoneOffset() / 60, + date.getMinutes(), date.getSeconds()); + var size = 240; + + storage = require('Storage'); + f=storage.read("planetarium.csv","r"); + linestart=0; + g.clear(); + + //Common calculations based only on time + var t = (julianDay - 2451545.0) / 36525; + var zeta = toRadians((2306.2181 * t + 0.30188 * t * t + 0.017998 * t * t * t) / 3600); + var theta = toRadians((2004.3109 * t - 0.42665 * t * t - 0.041833 * t * t * t) / 3600); + var z = toRadians((2306.2181 * t + 1.09468 * t * t + 0.018203 * t * t * t) / 3600); + + + let starNumber = 0; + //Each star has a number (the position on the file (line number)). These are the lines + //joining each star in the constellations. + constelation_lines=[/*Orion*/[7,68],[10,53],[53,56],[28,68],/*Taurus*/[13,172],[13,340],[293,340],[29,293], + /*canis menor*/[155,8]]; + var starPositions = {}; + + for (i=0;i= 0) + { + //Compute azimuth + var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); + var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); + var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); + starPositions[starNumber] = [x,y]; + var magnitude = starMag<1.5?2:1; + g.fillCircle(x, y, magnitude); + if (starMag<1) + g.drawString(starInfo[3],x,y+2); + g.flip(); + + } + } + } + + for (i=0;iprevSats || prevSats===0){ + prevSats = gp.satellites; + g.clearRect(0,150,240,180); + g.drawString("Got "+gp.satellites+" satellites",120,160); + } + g.flip(); + } +}); + diff --git a/apps/planetarium/planetarium-icon.js b/apps/planetarium/planetarium-icon.js index d901489c2..215c5aa38 100644 --- a/apps/planetarium/planetarium-icon.js +++ b/apps/planetarium/planetarium-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwg96xAWVhGIwAuWGCoXrCIZfFDZkJyAKTAAOZBaojEzIADGBoOChITEAgIUCGBAhCCwIlFA4YwIhIjCDQYtDAoIMBQhgUCzJMDR5xYGFwSPMHwYRED4KPMCQcIxKtHWApoCEYczmYXCPgYAEGgZGCAgMDC4pEGA4gVBGwIWCF6GqhWgC4kqBYYAGGgegC4QWCC4kKI4oQBC4guEC4wJDC4gtBGoIXDmWqBoQMBBQUwIAQXJKopSDJooXGmQRBBwYLBFgR2EC4QAEC4RIDToRQDC56pESYhHDAAYFBA4YvMD4oOEL5bMGaJIQFC5ZiEAoxRCC5I1KJoIXVBYJ4FEYgAGPAwwHSYIAGJAwwHEA5+HB5AvMZI4XKBwu72ELAQIHCAoQCBchQMCAQIADDgIfEDBYRBAAI5DCxYUDAxYYMAAgWPDIoVSAFAA==")) \ No newline at end of file +require("heatshrink").decompress(atob("AEGIAAgVPhAWFAAOACyoYNCxQYMCxZjKFxgwKB42ClAwNFw+O9AwNH48u8RhMLpHu9xhMLg0ipwXBokiMQwXKCoIADC5JGHlwWDMI5ICC44wEVI4XCZxBfC8jzKBRAuCC66oIC4K9IwPuoUk90YYJAXIwVCSYR3HC5WBAgYvPCggAFDQoXGwhAIwVIC5cuBoohDeQoXGpwNFEIbDFC4uCaJL1BKQgXDiVEdQdCB4WCYIIACokhC4uEBgYABC4YJII4kuBgZhEBJAXEEwi3EBIhgDwEABwYuHGAoHDgAXDwIXJRwIXKHoaoGC4ZHDC4JgCC4MoUAIXF91CBgReDC4iwCkh3EwNCZwQXFPAgAPCwQXYYIYAOIwYwTCwgwRFwowRCwwwPFw4wPCxAwNFxIYMCxYYKCxpjICp4AQ")) \ No newline at end of file diff --git a/apps/planetarium/planetarium.app.csv b/apps/planetarium/planetarium.app.csv deleted file mode 100644 index 0f3938e81..000000000 --- a/apps/planetarium/planetarium.app.csv +++ /dev/null @@ -1,30 +0,0 @@ -1.76779,-0.29175,-1.5,AL CMA -1.67531,-0.91971,-0.7,AL CAR -3.73352,0.33480,-0.0,AL BOO -3.83799,-1.06178,-0.0,AL1 CEN -4.87356,0.67690,0.0,AL LYR -1.38181,0.80282,0.1,AL AUR -1.37243,-0.14315,0.1,BE ORI -2.00408,0.09119,0.4,AL CMI -0.42636,-0.99897,0.5,AL ERI -1.54973,0.12928,0.5,AL ORI -3.68187,-1.05370,0.6,BE CEN -5.19577,0.15478,0.8,AL AQL -1.20393,0.28814,0.8,AL TAU -4.31710,-0.46132,1.0,AL SCO -3.51331,-0.19480,1.0,AL VIR -2.03032,0.48915,1.1,BE GEM -6.01113,-0.51701,1.2,AL PSA -3.34982,-1.04176,1.2,BE CRU -5.41676,0.79029,1.2,AL CYG -3.83799,-1.06178,1.3,AL2 CEN -2.65452,0.20887,1.4,AL LEO -1.82660,-0.50566,1.5,EP CMA -1.98356,0.55656,1.6,AL GEM -3.25765,-1.10128,1.6,AL1 CRU -1.98356,0.55656,1.6,AL GEM -3.27758,-0.99681,1.6,GA CRU -4.59723,-0.64758,1.6,LA SCO -1.41865,0.11082,1.6,GA ORI -1.42372,0.49930,1.6,BE TAU -2.41380,-1.21680,1.7,BE CAR \ No newline at end of file diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js new file mode 100644 index 000000000..3f4c00297 --- /dev/null +++ b/apps/planetarium/planetarium.app.js @@ -0,0 +1,141 @@ +/* + * Degrees to radians + */ +function toRadians(degrees) +{ + return Math.PI * degrees / 180; +} + +/* + * Julian day number + * Assumes a proleptic gregorian calendar where the year 1 is preceded by the + * year 0. + */ +function toJulianDay(year, month, day, hours, minutes, seconds) +{ + day += hours / 24 + minutes / 1440 + seconds / 86400; + + if(month <= 2) + { + year -= 1; + month += 12; + } + + var A = Math.floor(year / 100); + var B = 2 - A + Math.floor(A / 4); + return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5; +} + +/* + * Sidereal time in Greenwich + */ +function siderealTime(julianDay) +{ + var T = (julianDay - 2451545.0) / 36525; + return toRadians(280.46061837 + 360.98564736629 * (julianDay - 2451545.0) + 0.000387933 * T * T - T * T * T / 38710000); +} + +function binary_search(a, value) { + var lo = 0, hi = a.length - 1, mid; + while (lo <= hi) { + mid = Math.floor((lo+hi)/2); + if (a[mid] > value) + hi = mid - 1; + else if (a[mid] < value) + lo = mid + 1; + else + return mid; + } + return null; +} + +var longitudeSign = 1; //1 for west and -1 for east; +var longitudeDegrees = 5; +var longitudeMinutes = 37; +var longitudeSeconds = 27.4; +var longitude = toRadians(longitudeSign * (longitudeDegrees + longitudeMinutes / 60 + longitudeSeconds / 3600)); +var latitudeSign = 1; //1 for north -1 for south; +var latitudeDegrees = 43; +var latitudeMinutes = 25; +var latitudeSeconds = 0.9; +var latitude = toRadians(latitudeSign * (latitudeDegrees + latitudeMinutes / 60 + latitudeSeconds / 3600)); +var year = 2020; +var month = 1; +var day = 27; +var hours = 22; +var minutes = 0; +var seconds = 0; +var timeZone = 1; +var julianDay = toJulianDay(year, month, day, hours - timeZone, minutes, seconds); +var size = 240; + +storage = require('Storage'); +f=storage.read("planetarium.data.csv","r"); +linestart=0; +g.clearRect(0, 0, 240, 240); + +//Common calculations based only on time +var t = (julianDay - 2451545.0) / 36525; +var zeta = toRadians((2306.2181 * t + 0.30188 * t * t + 0.017998 * t * t * t) / 3600); +var theta = toRadians((2004.3109 * t - 0.42665 * t * t - 0.041833 * t * t * t) / 3600); +var z = toRadians((2306.2181 * t + 1.09468 * t * t + 0.018203 * t * t * t) / 3600); + + +let starNumber = 0; +//Each star has a number (the position on the file (line number)). These are the lines +//joining each star in the constellations. +constelation_lines=[/*Orion*/[7,68],[10,53],[53,56],[28,68],/*Taurus*/[13,172],[13,340],[293,340],[29,293], + /*canis menor*/[155,8]]; +var starPositions = {}; + +for (i=0;i= 0) + { + //Compute azimuth + var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); + var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); + var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); + starPositions[starNumber] = [x,y]; + var magnitude = starMag<1.5?2:1; + g.fillCircle(x, y, magnitude); + if (starMag<1) + g.drawString(starInfo[3],x,y+2); + g.flip(); + + } + } +} + +for (i=0;i1) - { - setNum--; - work = true; - counter = settings.workseg+settings.workmin*60; - startCounter(); - } - else - { - //End session - setWatch(showMenu, BTN2); - E.showMessage("Press BTN2 for\ngoing back\nto the menu","Well done!"); - } - } -} - -function printCounter(counter){ - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - let minutes = Math.floor(counter/60); - let segs = counter % 60; - let textMinutes = minutes.toString().padStart(2, "0"); - let textSegs = segs.toString().padStart(2,"0"); - g.clearRect(0,80,239,160); - g.setFont("Vector",30); - if (prep) - g.setColor(125,125,0); - else if (work) - g.setColor(255,0,0); - else - g.setColor(0,255,0); - g.drawString(setNum,120,50); - if (prep) - g.drawString("PREPARATION",120,190); - else if (work) - g.drawString("WORK",120,190); - else - g.drawString("REST",120,190); - g.setFont("Vector",10); - g.drawString("Touch to pause",120,215); - g.setFont("Vector",80); - g.drawString(textMinutes+":"+textSegs,120,120); -} - -function signal_to_user(le){ - if (settings.buzz) - Bangle.buzz(le); - else - Bangle.beep(le,4000); -} - -function countDown() { - counter--; - if (counter<4 && counter>0) - signal_to_user(200); - if (counter==0) - signal_to_user(600); - - if (counter<0) { - clearInterval(counterInterval); - counterInterval = undefined; - endPart(); - } - else - { - printCounter(counter); - } - g.flip(); -} - -function startCounter(){ - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -function pause() -{ - if (!paused) - { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(resume,BTN4); - setWatch(resume,BTN5); - paused=true; - g.clear(); - g.setFont("Vector",60); - g.drawString("PAUSED",120,120); - g.setFont("Vector",20); - g.drawString("Touch to continue",120,180); - } -} - -function resume(){ - if (paused) - { - g.clear(); - counterInterval = setInterval(countDown, 1000); - setWatch(pause,BTN4); - setWatch(pause,BTN5); - paused=false; - } -} - -function startSession() { - E.showMenu(); - paused=false; - setWatch(pause,BTN4); - setWatch(pause,BTN5); - require('Storage').write('intervals.settings.json',settings); - setNum = settings.sets; - counter = 5;//prep time - prep=true; - work=false; - startCounter(); -} - -function showMenu() -{ - settings = require('Storage').readJSON('intervals.settings.json',1)|| - { sets:1,workseg:10,workmin:0,restseg:5,restmin:0,buzz:true}; - - var mainmenu = { - "" : { "title" : "-- Main Menu --" }, - "START" : function() { startSession(); }, - "Sets" : { value : settings.sets,min:0,max:20,step:1,onchange : v => { settings.sets=v; } }, - "Work minutes" : { value : settings.workmin,min:0,max:59,step:1,onchange : v => { settings.workmin=v; } }, - "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, - "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, - "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, - "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} - }; - - E.showMenu(mainmenu); -} - -showMenu(); - - - - - - diff --git a/apps/planetarium/planetarium.png b/apps/planetarium/planetarium.png index f6ca9ff41f50a570bb66426bc4e93bdc73a4aba0..c40606009a0d707283ec458dc4e249b0f681e8b6 100644 GIT binary patch delta 1888 zcmV-m2cP)z7Jv_sHGc;+Nklkg*IWqV{m)NFqM_R)j1D@f~0lU{lc^1#WS#e*Bfwlw=|7tx!nf=C0+G92`ViZ zARjOMmo98^1MEyUd=~&rNbx%k*FPFbI5z?3@kIoKh94UMiwIEp@ZYC?znXInCAtIH zN>IGR>u)B93(Rv=&E})P3ay^aBFH*NANjUH^6i7Hv<>pLgg&yZ!&5qs*ax`u&69lU zUP6Z_jem~O3_3h%T=P7n=h4a|Fn$<#Vdmm&>)QH_2+@MheZFqR8LA#`)?o|46P1XKH1#`wybdp~le>dX#kk6({9v~=1MDha3 zviN&?C;&L9JC&(m4y5X}{LSk3cp|w=uYZ{;o=v;X8@YeeZy5BaD)>!_dTcf(b+aX< zgPQE~`U9$BV_3LW+5m z!lWJwlX~d)CeUL_83BZ2-CIDh54L0yMIdP9iP*V zPT^43X8tp({W$r|lfm&G^|Ja?_Yz#)3r#L%GfXC689xK4*1-uTFPZV`lfIRDc8&?G zcHCB#<=KW78i={^D(7G_ftO!)Bjumfv=xxhYceoIZD<~A(KI=hpLvj-RDTVY5UTM9eGU%Xe43m~m8`w`B25G9kO)T$E$e*qAMRPXSADusWY9@JzGz0R9 zUx2uwna%$Wo%pBI8LGnD2@>nDPRC? zkr)LjQuL-^ybMsK1++yf0#?fHlolyPY{d#iNcfOI5X*Ng6bUHMQd7Yo6fM{y(kfpf z#gN>4_U#|{UP;2eA&Ja%I@4!nXU^GuclUXA&%V3w9{4~0yMK_&+1NFYYCj+tdtLI6 zIZ|>t+fRhcCZPQo9j34d_DB36cXc|~8OwH` z$B!;o`^j+G1Q<&jpXHs>kVHyD5-}cojit@yYCmbe^)>7|N}HBl#d$(v6P5dv%?cwr zkJ54gl;Nr*Uw;E3b-ErSt?ak*c|%E8N4;hsYm7Ft9i~8y=6w)N zX4!4H4n|mxusa3%?N}&h8^OPB0iA>D_q$Q@2*F)-kbmzwN?V%qT;qaY9MtnTljicz z(n9$(S)JR4>tKQ9z;4HBoQR|Xa)auxfb|Hss}Ov1QBCqWqqODu^V|>IEzlddDoIoS zQ23K0taXG9wFTV~)WIrI5!N(ZL_z_%LG_0h&^IRV97>`3_+@FK#P-m?YO$=|utE;x4$(|km<9|(_zNC+B`f3*K>wk7 zzrq|G`j)&b`x_+yqO-7RiJSu%5YTLKSPyts32rEs-wzzBoz?OT&=0V{c9gfo;eAye z1Ah=@whHYKdZY9ry63F1FnPlYIWTaD-m6Lh-~#uoTOoh0-FKq}#4#wK-37J)$JFKS z^cH+{;xx}Hi~&vqGd!1<*DjZ1@jBlM=vIK=t&~3Tyn7$iRw)rip*#+>27Yz=I1|6p zhHJ#K5ojY0cfA@D(GVmR5D4hiC}k*TaDV6>i4Zm}uK-^cm}63yx@?)8zNp>CaqdrJ@ln4aWbv=pzpCj}OLq!_w zR7*P%@{3m0bgAQaYo>|fp)-2;4ar;k5uu#Q7TlpmVYYV z96DGJB_pd45n*1@Dp_5pfRr#}1bPAwR{A)c8fG2P!Ft@YY^`jK+dZ{IZ*pKdRon{* z3TJ(wN%mi3DF99??5S0B4CRs|FK|6j03;WX-%nfkl%D{v6|Rw@;RAIlLO&HAURsU( z^zHgM5oQuygcrnHh$IuBv_yEWaDTOgE=4vGh7ZyZ%G4Td);4Nt7_FACsPNRtfqIpr zOb}(|{B^P*Zu9HcbruoEC+Z|cp(^2d6^!LmAo%bA?bR3oc(fzxJib6Jzpdh09x;~J z7p#@HeI8Sd#Z{OXw^*=QAMsnp`z<6&J`YS10j|ezqlAr;V-zt8^-L106MuF+M${OT z>MxHCpqpCSBZQvFRsVSd@m#rOXL4tu~Kph<~^d3XfFK!vbpASKFY*CuE?9YdP@37CGrC1C4T`MK;?2 zii_3tTZZ^ONR-TH@cst)_fgbXZhInE7ftA|SJv*(3Z=$!%4hlBgkJJVW+kDFN=TG4 zE15DbM?MzIXk$5PUAEUL!1d_pQ}zS+EM1Jpflw@jyt)b5eoO0w-+%q*uzLmG@%N~3 zEH4>lsZs8C!|a-vqb;lV@qCF?`ji>2W#FV-%@5@A^UNw9&8Xs3Mis=;sfI*l=tFg%_DS3Hu@jE4dKtgQSO+rNk%=hSsw9O z`WQ=wA$m5dj?`ZK(tl@JV>}9eoWtmz-{d#xE?4bX$kI1nqM&C5>AeQ>;*a|>)@La& zmepxJ6R*7*M~P4$4Wm30DwQdrJ{qP0LBBYZPu(J&YqhrrdeelzgJ12dOU!zm#DWJ7Asy%bOuID zzeAguG)BY(Uw?#}Yrt~IC>>(Y2aToUrN{&P=ndIoER&7Lkkl%UrdDy(Sn_<936o2u zw6=Y5KwYh1nd@<%&tvqYZFHHuU1qqJ64z2PdArP*w4Gagma)b%h;zIgLK9vA)mQ_w zd+A)1yfZs#-6ESOMVJ;2lkw!A^HG+nGH(1X`Bj|)=JeDdsubbS&G9&Ah5Z7LKe|hvtB-*CU|v`CRi$uP zq3rv+WKezT%*ocZD%_G%N&D}XNw|7hjcG|!HW`mf6Jf~MKgt24>~k$6lTBY^U|sGs zmW&jbTYuj=#xmDGHhN~ZEB*2xlS3~snZiQ1TJJ53kG)A zw@wq~PsT#3M^^2!i$cmp-8I`PDbv#DC=mpXIBn>=Yp!;Pu0(Qx#N;9sOwJTKu+n+o6eJj#t_;lVu&xZxHaQh3#?pr|-ohc;G(v9tu9 z8@i`)5n0hK8iJY;S<+jHS8mqtDZB_w3+$CC#hrDu2)_o(Rk=U!ooI~E5UjjePXeE+ zHh*pgL}&-J3hb3D;(1BE%L995u4|d^TAp5Ylm0O89eL4s-0NDdHOkw+>!eQ?XVw31 ze_dB?>RPtBmUc$z;ZyKMV~5*}l4GECJTF;tE$_LuW<*x!#a3}Z-L(C@418OJSFg;oiSP_U0631aTpiX|D%_Qc8}T+T=EA;2z9z=@hr*@fE}*O!*`dhB5+h1vUY%;!*mILmZL>zm)#aL2neHza#WlxSi-_@Jq%Ly5nzOZeMAz zfH=0b*G$J@R4f2#8_WJ&;IM^%3sa~-^O)am8Y}-mg~fO*`1&FF@XHd9<4gak-`Q4g z5JPX28x%5CXeAa!I3sXGg#)hTjUI>Py-T Date: Thu, 28 Jan 2021 18:19:17 +0100 Subject: [PATCH 004/148] planetarium --- apps/planetarium/planetarium.app.js | 191 ++++++++++++++++------------ 1 file changed, 110 insertions(+), 81 deletions(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 3f4c00297..f24e5d7c2 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -49,93 +49,122 @@ function binary_search(a, value) { return null; } -var longitudeSign = 1; //1 for west and -1 for east; -var longitudeDegrees = 5; -var longitudeMinutes = 37; -var longitudeSeconds = 27.4; -var longitude = toRadians(longitudeSign * (longitudeDegrees + longitudeMinutes / 60 + longitudeSeconds / 3600)); -var latitudeSign = 1; //1 for north -1 for south; -var latitudeDegrees = 43; -var latitudeMinutes = 25; -var latitudeSeconds = 0.9; -var latitude = toRadians(latitudeSign * (latitudeDegrees + latitudeMinutes / 60 + latitudeSeconds / 3600)); -var year = 2020; -var month = 1; -var day = 27; -var hours = 22; -var minutes = 0; -var seconds = 0; -var timeZone = 1; -var julianDay = toJulianDay(year, month, day, hours - timeZone, minutes, seconds); -var size = 240; +function drawStars(lat,lon,date){ + var longitude = toRadians(-lon); + var latitude = toRadians(lat); + + + -storage = require('Storage'); -f=storage.read("planetarium.data.csv","r"); -linestart=0; -g.clearRect(0, 0, 240, 240); + var julianDay = toJulianDay(date.getFullYear(), date.getMonth()+1,date.getDate(), + date.getHours() + date.getTimezoneOffset() / 60, + date.getMinutes(), date.getSeconds()); + var size = 240; -//Common calculations based only on time -var t = (julianDay - 2451545.0) / 36525; -var zeta = toRadians((2306.2181 * t + 0.30188 * t * t + 0.017998 * t * t * t) / 3600); -var theta = toRadians((2004.3109 * t - 0.42665 * t * t - 0.041833 * t * t * t) / 3600); -var z = toRadians((2306.2181 * t + 1.09468 * t * t + 0.018203 * t * t * t) / 3600); + storage = require('Storage'); + f=storage.read("planetarium.csv","r"); + linestart=0; + g.clear(); + + //Common calculations based only on time + var t = (julianDay - 2451545.0) / 36525; + var zeta = toRadians((2306.2181 * t + 0.30188 * t * t + 0.017998 * t * t * t) / 3600); + var theta = toRadians((2004.3109 * t - 0.42665 * t * t - 0.041833 * t * t * t) / 3600); + var z = toRadians((2306.2181 * t + 1.09468 * t * t + 0.018203 * t * t * t) / 3600); -let starNumber = 0; -//Each star has a number (the position on the file (line number)). These are the lines -//joining each star in the constellations. -constelation_lines=[/*Orion*/[7,68],[10,53],[53,56],[28,68],/*Taurus*/[13,172],[13,340],[293,340],[29,293], - /*canis menor*/[155,8]]; -var starPositions = {}; + let starNumber = 0; + //Each star has a number (the position on the file (line number)). These are the lines + //joining each star in the constellations. + constelation_lines=[/*Orion*/[7,68],[10,53],[53,56],[28,68],/*Taurus*/[13,172],[13,340],[293,340],[29,293], + /*canis menor*/[155,8]]; + var starPositions = {}; -for (i=0;i= 0) - { - //Compute azimuth - var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); - var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); - var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); - starPositions[starNumber] = [x,y]; - var magnitude = starMag<1.5?2:1; - g.fillCircle(x, y, magnitude); - if (starMag<1) - g.drawString(starInfo[3],x,y+2); - g.flip(); - + for (i=0;i= 0) + { + //Compute azimuth + var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); + var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); + var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); + starPositions[starNumber] = [x,y]; + var magnitude = starMag<1.5?2:1; + g.fillCircle(x, y, magnitude); + if (starMag<1) + g.drawString(starInfo[3],x,y+2); + g.flip(); + + } } } + + for (i=0;iprevSats || prevSats===0){ + prevSats = gp.satellites; + g.clearRect(0,150,240,180); + g.drawString("Got "+gp.satellites+" satellites",120,160); + } + g.clearRect(0,180,240,220); + g.drawString("GMT:"+(date.getHours()+date.getTimezoneOffset() / 60)+":"+date.getMinutes()+":"+date.getSeconds(),120,200); + g.drawString(date.getDate()+'/'+date.getMonth()+1+"/"+date.getFullYear(),120,215); + g.flip(); + } +}); \ No newline at end of file From 19fac8a36f83c0ee873996d9f1cb3adc2e2288aa Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 18:23:49 +0100 Subject: [PATCH 005/148] planetarium --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f4546d95f..ca773b529 100644 --- a/apps.json +++ b/apps.json @@ -2677,10 +2677,10 @@ , { "id": "planetarium", "name": "Planetarium", - "shortName":"planetarium", + "shortName":"Planetarium", "icon": "planetarium.png", "version":"0.01", - "description": "Planetarium.", + "description": "Planetarium showing up to 350 stars using the watch location and time", "tags": "", "storage": [ {"name":"planetarium.app.js","url":"planetarium.app.js"}, From d052f3d6652ac586ba33939230848ae20520b004 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 18:37:33 +0100 Subject: [PATCH 006/148] fixing a bug with file name --- apps/planetarium/planetarium.app.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index f24e5d7c2..11d1bbde3 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -83,7 +83,6 @@ function drawStars(lat,lon,date){ for (i=0;i= 0) @@ -136,7 +133,6 @@ function drawStars(lat,lon,date){ Bangle.setGPSPower(1); var gps = { fix : 0}; -var gpsCount = 0; var prevSats = 0; g.clear(); @@ -147,7 +143,6 @@ g.setFontAlign(0,0); Bangle.on('GPS',function(gp) { date = new Date(); gps = gp; - gpsCount++; if (gp.fix) { lat = gp.lat; lon = gp.lon; From 3f15f8eb5ef6c0196e5779fc4d39f5e9741ff16b Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 18:47:59 +0100 Subject: [PATCH 007/148] updating readme --- apps/planetarium/README.md | 12 +++++++++++- apps/planetarium/planetarium.app.js | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 2e07794e9..ff2178888 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -1 +1,11 @@ -# Planetarium \ No newline at end of file +# Planetarium + +This planetarium takes your position and time and plots the sky as it is. + +No planets, or moon, only stars. It can show the 350 most brilliant stars in the sky. + +Plan is to show also constellations, but this is work in progress. Now it shows Taurus and Orion as examples. + +I think code is quite optimized already. It runs as fast as I could make it run. If someone has some ideas to speed it up, I could plot more stars. + +Basic equations to compute declination and right ascension for stars where taken from this [github repo](https://github.com/Michi83/planetarium). \ No newline at end of file diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 11d1bbde3..1fc2615a7 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -62,7 +62,7 @@ function drawStars(lat,lon,date){ var size = 240; storage = require('Storage'); - f=storage.read("planetarium.csv","r"); + f=storage.read("planetarium.data.csv","r"); linestart=0; g.clear(); From 033819e0966fcdcb14fbdef4c961ac93e596782c Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 20:05:25 +0100 Subject: [PATCH 008/148] adding settings --- apps.json | 4 ++++ apps/planetarium/settings.js | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 apps/planetarium/settings.js diff --git a/apps.json b/apps.json index ca773b529..4e6f83c9c 100644 --- a/apps.json +++ b/apps.json @@ -2685,7 +2685,11 @@ "storage": [ {"name":"planetarium.app.js","url":"planetarium.app.js"}, {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, + {"name":"planetarium.settings.js","url":"settings.js"}, {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} + ], + "data":[ + {"name":"planetarium.json"} ] } ] diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js new file mode 100644 index 000000000..a586de296 --- /dev/null +++ b/apps/planetarium/settings.js @@ -0,0 +1,21 @@ +// make sure to enclose the function in parentheses +(function(back) { + let settings = require('Storage').readJSON('planetarium.json',1)||{}; + function save(key, value) { + settings[key] = value; + require('Storage').write('planetarium.json',settings); + } + const appMenu = { + '': {'title': 'Planetarium Settings'}, + '< Back': back, + 'Show star names': { + value: settings.showstarnames||false, + onchange: (m) => {save('showstarnames', m)} + }, + 'Show constellations': { + value: settings.showcons||true, + onchange: (m) => {save('showcons', m)} + } + }; + E.showMenu(appMenu) + }) \ No newline at end of file From 5a91bc5611f7680c21e6c15468796308efc6e3a1 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 20:32:12 +0100 Subject: [PATCH 009/148] adding settings --- apps/intervals/intervals.app.js | 302 ++++++++++++++-------------- apps/planetarium/planetarium.app.js | 44 ++-- apps/planetarium/settings.js | 20 +- 3 files changed, 172 insertions(+), 194 deletions(-) diff --git a/apps/intervals/intervals.app.js b/apps/intervals/intervals.app.js index a158ca967..da436b104 100644 --- a/apps/intervals/intervals.app.js +++ b/apps/intervals/intervals.app.js @@ -1,170 +1,164 @@ -/* - * Degrees to radians - */ -function toRadians(degrees) -{ - return Math.PI * degrees / 180; -} +var counter; +var counterInterval; -/* - * Julian day number - * Assumes a proleptic gregorian calendar where the year 1 is preceded by the - * year 0. - */ -function toJulianDay(year, month, day, hours, minutes, seconds) -{ - day += hours / 24 + minutes / 1440 + seconds / 86400; - - if(month <= 2) - { - year -= 1; - month += 12; - } - - var A = Math.floor(year / 100); - var B = 2 - A + Math.floor(A / 4); - return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5; -} +var settings; -/* - * Sidereal time in Greenwich - */ -function siderealTime(julianDay) -{ - var T = (julianDay - 2451545.0) / 36525; - return toRadians(280.46061837 + 360.98564736629 * (julianDay - 2451545.0) + 0.000387933 * T * T - T * T * T / 38710000); -} +var work=false; //true if training false if resting +var prep=true; //true if we are in prep phase (at the beginning of the session +var setNum; -function binary_search(a, value) { - var lo = 0, hi = a.length - 1, mid; - while (lo <= hi) { - mid = Math.floor((lo+hi)/2); - if (a[mid] > value) - hi = mid - 1; - else if (a[mid] < value) - lo = mid + 1; - else - return mid; - } - return null; -} +var paused; -function drawStars(lat,lon){ - var longitude = toRadians(-lon); - var latitude = toRadians(lat); - - date = new Date(); - - var julianDay = toJulianDay(date.getFullYear(), date.getMonth()+1,date.getDate(), - date.getHours() + date.getTimezoneOffset() / 60, - date.getMinutes(), date.getSeconds()); - var size = 240; - - storage = require('Storage'); - f=storage.read("planetarium.csv","r"); - linestart=0; +function endPart() { g.clear(); - - //Common calculations based only on time - var t = (julianDay - 2451545.0) / 36525; - var zeta = toRadians((2306.2181 * t + 0.30188 * t * t + 0.017998 * t * t * t) / 3600); - var theta = toRadians((2004.3109 * t - 0.42665 * t * t - 0.041833 * t * t * t) / 3600); - var z = toRadians((2306.2181 * t + 1.09468 * t * t + 0.018203 * t * t * t) / 3600); - - - let starNumber = 0; - //Each star has a number (the position on the file (line number)). These are the lines - //joining each star in the constellations. - constelation_lines=[/*Orion*/[7,68],[10,53],[53,56],[28,68],/*Taurus*/[13,172],[13,340],[293,340],[29,293], - /*canis menor*/[155,8]]; - var starPositions = {}; - - for (i=0;i= 0) - { - //Compute azimuth - var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); - var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); - var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); - starPositions[starNumber] = [x,y]; - var magnitude = starMag<1.5?2:1; - g.fillCircle(x, y, magnitude); - if (starMag<1) - g.drawString(starInfo[3],x,y+2); - g.flip(); - - } - } + if (prep){ + prep=false; + work = true; + counter = settings.workseg+settings.workmin*60; + startCounter(); + }else if (work){ + work = false; + counter = settings.restseg+settings.restmin*60; + startCounter(); } - - for (i=0;i1) + { + setNum--; + work = true; + counter = settings.workseg+settings.workmin*60; + startCounter(); + } + else + { + //End session + setWatch(showMenu, BTN2); + E.showMessage("Press BTN2 for\ngoing back\nto the menu","Well done!"); + } } } -Bangle.setGPSPower(1); +function printCounter(counter){ + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + let minutes = Math.floor(counter/60); + let segs = counter % 60; + let textMinutes = minutes.toString().padStart(2, "0"); + let textSegs = segs.toString().padStart(2,"0"); + g.clearRect(0,80,239,160); + g.setFont("Vector",30); + if (prep) + g.setColor(125,125,0); + else if (work) + g.setColor(255,0,0); + else + g.setColor(0,255,0); + g.drawString(setNum,120,50); + if (prep) + g.drawString("PREPARATION",120,190); + else if (work) + g.drawString("WORK",120,190); + else + g.drawString("REST",120,190); + g.setFont("Vector",10); + g.drawString("Touch to pause",120,215); + g.setFont("Vector",80); + g.drawString(textMinutes+":"+textSegs,120,120); +} -var gps = { fix : 0}; -var gpsCount = 0; -var prevSats = 0; -g.clear(); +function signal_to_user(le){ + if (settings.buzz) + Bangle.buzz(le); + else + Bangle.beep(le,4000); +} +function countDown() { + counter--; + if (counter<4 && counter>0) + signal_to_user(200); + if (counter==0) + signal_to_user(600); - -g.setFontAlign(0,0); - -Bangle.on('GPS',function(gp) { - gps = gp; - gpsCount++; - var msg; - if (gp.fix) { - lat = gp.lat; - lon = gp.lon; - Bangle.setGPSPower(0); - drawStars(lat,lon); - } else { - g.setFont("Vector",20); - g.drawString("Waiting for position",120,120); - g.setFont("Vector",15); - if (gp.satellites>prevSats || prevSats===0){ - prevSats = gp.satellites; - g.clearRect(0,150,240,180); - g.drawString("Got "+gp.satellites+" satellites",120,160); - } - g.flip(); + if (counter<0) { + clearInterval(counterInterval); + counterInterval = undefined; + endPart(); } -}); - + else + { + printCounter(counter); + } + g.flip(); +} + +function startCounter(){ + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +function pause() +{ + if (!paused) + { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(resume,BTN4); + setWatch(resume,BTN5); + paused=true; + g.clear(); + g.setFont("Vector",60); + g.drawString("PAUSED",120,120); + g.setFont("Vector",20); + g.drawString("Touch to continue",120,180); + } +} + +function resume(){ + if (paused) + { + g.clear(); + counterInterval = setInterval(countDown, 1000); + setWatch(pause,BTN4); + setWatch(pause,BTN5); + paused=false; + } +} + +function startSession() { + E.showMenu(); + paused=false; + setWatch(pause,BTN4); + setWatch(pause,BTN5); + require('Storage').write('intervals.settings.json',settings); + setNum = settings.sets; + counter = 5;//prep time + prep=true; + work=false; + startCounter(); +} + +function showMenu() +{ + settings = require('Storage').readJSON('intervals.settings.json',1)|| + { sets:1,workseg:10,workmin:0,restseg:5,restmin:0,buzz:true}; + + var mainmenu = { + "" : { "title" : "-- Main Menu --" }, + "START" : function() { startSession(); }, + "Sets" : { value : settings.sets,min:0,max:20,step:1,onchange : v => { settings.sets=v; } }, + "Work minutes" : { value : settings.workmin,min:0,max:59,step:1,onchange : v => { settings.workmin=v; } }, + "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, + "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, + "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, + "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} + }; + + E.showMenu(mainmenu); +} + +showMenu(); diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 1fc2615a7..b3e82500d 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -35,26 +35,9 @@ function siderealTime(julianDay) return toRadians(280.46061837 + 360.98564736629 * (julianDay - 2451545.0) + 0.000387933 * T * T - T * T * T / 38710000); } -function binary_search(a, value) { - var lo = 0, hi = a.length - 1, mid; - while (lo <= hi) { - mid = Math.floor((lo+hi)/2); - if (a[mid] > value) - hi = mid - 1; - else if (a[mid] < value) - lo = mid + 1; - else - return mid; - } - return null; -} - function drawStars(lat,lon,date){ var longitude = toRadians(-lon); var latitude = toRadians(lat); - - - var julianDay = toJulianDay(date.getFullYear(), date.getMonth()+1,date.getDate(), date.getHours() + date.getTimezoneOffset() / 60, @@ -109,7 +92,7 @@ function drawStars(lat,lon,date){ starPositions[starNumber] = [x,y]; var magnitude = starMag<1.5?2:1; g.fillCircle(x, y, magnitude); - if (starMag<1) + if (starMag<1 && settings.starnames) g.drawString(starInfo[3],x,y+2); g.flip(); @@ -117,16 +100,18 @@ function drawStars(lat,lon,date){ } } - for (i=0;i {save('showstarnames', m)} + 'Star names': { + value: !settings.starnames, + format: v => v ? 'Yes' : 'No', + onchange: v => require('Storage').write('planetarium.json', {starnames: !v}), }, - 'Show constellations': { - value: settings.showcons||true, - onchange: (m) => {save('showcons', m)} - } + 'Constellations': { + value: !settings.constellations, + format: v => v ? 'Yes' : 'No', + onchange: v => require('Storage').write('planetarium.json', {constellations: !v}), + } }; E.showMenu(appMenu) }) \ No newline at end of file From f883fab51e839a5ca50561326fa12e58a2c4cf52 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 20:41:12 +0100 Subject: [PATCH 010/148] bug in settings. fixing --- apps/planetarium/settings.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index 0f716b33a..c82a7ca59 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -1,18 +1,22 @@ // make sure to enclose the function in parentheses (function(back) { let settings = require('Storage').readJSON('planetarium.json',1)||{}; + function save(key, value) { + settings[key] = value; + require('Storage').write('planetarium.json',settings); + } const appMenu = { '': {'title': 'Planetarium Settings'}, '< Back': back, 'Star names': { - value: !settings.starnames, + value: settings.starnames, format: v => v ? 'Yes' : 'No', - onchange: v => require('Storage').write('planetarium.json', {starnames: !v}), + onchange: (v) => {save('starnames', v)} }, 'Constellations': { - value: !settings.constellations, + value: settings.constellations, format: v => v ? 'Yes' : 'No', - onchange: v => require('Storage').write('planetarium.json', {constellations: !v}), + onchange: (v) => {save('constellations', v)} } }; E.showMenu(appMenu) From d50380958812e64ef55ccccc21445d881dfb81da Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 21:16:34 +0100 Subject: [PATCH 011/148] bug in settings. fixing --- apps/planetarium/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index c82a7ca59..34b14009c 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -11,12 +11,12 @@ 'Star names': { value: settings.starnames, format: v => v ? 'Yes' : 'No', - onchange: (v) => {save('starnames', v)} + onchange: (v) => {save('starnames', !settings.starnames)} }, 'Constellations': { value: settings.constellations, format: v => v ? 'Yes' : 'No', - onchange: (v) => {save('constellations', v)} + onchange: (v) => {save('constellations', !settings.constellations)} } }; E.showMenu(appMenu) From 1ee1134a4047d34f4e897e84b246be5383ec3ce8 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 21:24:52 +0100 Subject: [PATCH 012/148] bug in settings. fixing --- apps/planetarium/settings.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index 34b14009c..0a3cd71bf 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -8,16 +8,8 @@ const appMenu = { '': {'title': 'Planetarium Settings'}, '< Back': back, - 'Star names': { - value: settings.starnames, - format: v => v ? 'Yes' : 'No', - onchange: (v) => {save('starnames', !settings.starnames)} - }, - 'Constellations': { - value: settings.constellations, - format: v => v ? 'Yes' : 'No', - onchange: (v) => {save('constellations', !settings.constellations)} - } + "Star names" : { value : settings.starnames,format : v => v?"Show":"Hide",onchange : v => { save('starnames',v); }}, + "Constellations" : { value : settings.constellations,format : v => v?"Show":"Hide",onchange : v => { save('constellations',v); }}, }; E.showMenu(appMenu) }) \ No newline at end of file From 2061a85205e1f5ad05d9908f2e1c3f7e73d16302 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 21:32:51 +0100 Subject: [PATCH 013/148] bug in settings. fixing --- apps/planetarium/settings.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index 0a3cd71bf..21dd36f6b 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -8,8 +8,18 @@ const appMenu = { '': {'title': 'Planetarium Settings'}, '< Back': back, - "Star names" : { value : settings.starnames,format : v => v?"Show":"Hide",onchange : v => { save('starnames',v); }}, - "Constellations" : { value : settings.constellations,format : v => v?"Show":"Hide",onchange : v => { save('constellations',v); }}, - }; + 'Star names': { + value: !!settings.starnames, + format: v =>v?'On':'Off', + onchange: v => { + save('starnames',v); + }}, + 'Constellations': { + value: !!settings.constellations, + format: v =>v?'On':'Off', + onchange: v => { + save('constellations',v); + } + }}; E.showMenu(appMenu) }) \ No newline at end of file From d0d1cbea2c79c80e3915154027c9f57695f28c20 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Thu, 28 Jan 2021 21:43:34 +0100 Subject: [PATCH 014/148] bug in settings. fixing --- apps/planetarium/planetarium.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index b3e82500d..104280631 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -121,7 +121,7 @@ var gps = { fix : 0}; var prevSats = 0; g.clear(); -var settings = require('Storage').readJSON('planetarium.settings.json',1)|| +var settings = require('Storage').readJSON('planetarium.json',1)|| { starnames:false,constellations:true}; g.setFontAlign(0,0); From 41777c29b8ceec231645a5939e438ce693969b61 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 28 Jan 2021 20:53:39 +0000 Subject: [PATCH 015/148] added hide settings for line1/line2 in activepedom widget --- apps.json | 2 +- apps/activepedom/ChangeLog | 1 + apps/activepedom/README.md | 1 + apps/activepedom/settings.js | 4 ++-- apps/activepedom/widget.js | 4 ++++ 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 7ec25b67f..b83bb02c8 100644 --- a/apps.json +++ b/apps.json @@ -1341,7 +1341,7 @@ "name": "Active Pedometer", "shortName":"Active Pedometer", "icon": "app.png", - "version":"0.06", + "version":"0.07", "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", "tags": "outdoors,widget", "readme": "README.md", diff --git a/apps/activepedom/ChangeLog b/apps/activepedom/ChangeLog index 9dc698827..fd2b2c2e2 100644 --- a/apps/activepedom/ChangeLog +++ b/apps/activepedom/ChangeLog @@ -4,3 +4,4 @@ 0.04: Steps are set to 0 in log on new day 0.05: Fix default step/distance display if it hasn't been set up first 0.06: Added WIDGETS.activepedom.getSteps() +0.07: Added settings to be able to hide line1 and line2 so there is no visible widget diff --git a/apps/activepedom/README.md b/apps/activepedom/README.md index a2a351a12..ac32a1dd6 100644 --- a/apps/activepedom/README.md +++ b/apps/activepedom/README.md @@ -31,6 +31,7 @@ Steps are saved to a datafile every 5 minutes. You can watch a graph using the a * Step detection sensitivity from firmware can be configured * Steps are saved to a file and read-in at start (to not lose step progress) * Settings can be changed in Settings - App/widget settings - Active Pedometer +* Can hide the widget display if required using settings ## Features App diff --git a/apps/activepedom/settings.js b/apps/activepedom/settings.js index 94ae435d2..3b64d8735 100644 --- a/apps/activepedom/settings.js +++ b/apps/activepedom/settings.js @@ -4,7 +4,7 @@ */ (function(back) { const SETTINGS_FILE = 'activepedom.settings.json'; - const LINES = ['Steps', 'Distance']; + const LINES = ['Steps', 'Distance', 'Hide']; // initialize with default settings... let s = { @@ -109,4 +109,4 @@ }, }; E.showMenu(menu); -}); \ No newline at end of file +}); diff --git a/apps/activepedom/widget.js b/apps/activepedom/widget.js index f67017014..f42e18fd5 100644 --- a/apps/activepedom/widget.js +++ b/apps/activepedom/widget.js @@ -141,6 +141,10 @@ function draw() { var height = 23; //width is deined globally + // not everyone likes a widget + if (setting('lineOne') == 'Hide' && setting('lineTwo') == 'Hide') + return; + distance = (stepsCounted * setting('stepLength')) / 100 /1000; //distance in km //Check if same day From e3939c894157e98fb448d296eaff528090eb8f76 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 29 Jan 2021 09:08:26 +0000 Subject: [PATCH 016/148] remove theme file and add to gitignore --- .gitignore | 1 + _config.yml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 _config.yml diff --git a/.gitignore b/.gitignore index a454fec09..2d418b7c8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ package-lock.json appdates.csv .vscode .idea/ +_config.yml diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c74188174..000000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-slate \ No newline at end of file From 4e76486fc82f5925cbfec17dfa9d920295f97378 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 29 Jan 2021 09:13:55 +0000 Subject: [PATCH 017/148] Change icon to black+white (from transparent) and 48px --- apps/cliock/app-icon.js | 2 +- apps/cliock/app.png | Bin 305 -> 348 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cliock/app-icon.js b/apps/cliock/app-icon.js index fab023339..7312a1308 100644 --- a/apps/cliock/app-icon.js +++ b/apps/cliock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("kEgwkBiIA/ACBhLB6gqKB6g//B6I4DiDqCB40QB4MBAoIXDB40BAIIPNG44PLAoQvMB5RPEB5JvEBAav1f7wA/ABoA==")) +require("heatshrink").decompress(atob("mEwgRC/AH4Ae/4AEBaPwAgcPBaIvvBZkL8ED6ALHl/4+XgBY89vnw+ALHngDB+gLK3AjKng7JBwJTJgEfO76/iAH4A/ADAA=")) diff --git a/apps/cliock/app.png b/apps/cliock/app.png index 4ad2d056daeb21b44ea8e6de6a57e7995bdf0b33..ed1fa7014be3082e799301b6ce8074dcb6adcf26 100644 GIT binary patch delta 338 zcmdnUbcac?Gr-TCmrII^fq{Y7)59eQNE?7K2OE$KXZqPbQBky>v%n*=n1O*?7=#%a zX3dcRO0t)D`ns||Wt8O<;6LzalMYbmrKgKyNXEUl(+&BW90XkFADa+S$#_0NzfA7H zrDN3<%r1OMi7y##TG9j7tbM~{=A3jU>54!Z=YQ3fvndik{z#fN2sm*lwq)q;wO^;{ zRJE+`wycE7o4ES7=gMw1DzPxmVm#|`J$i*6qu>O_a0T|D?!CpE!e;&uiM9Au`ddi9 zzgM|F_w}38yLvfK=$f%6ML+NRWB7sL9N+i7TtA*Zb3Z-zy5fQ30`K4K;mTw?CDzqA zbFIGUPvr-EcN!8kbf;LgS^S)^fBOw15ypv~C*Gb_7oC4`QtMTV77e8X(Xnrj{E~mM hiy7oTfkj7c7Pk!>1((6zR*GgvSrMAl`MU*o=H!{lR_{g@pRz~N|_o<@tC+_PWv zW`zt4_jKJUgSNAs?m*qM0Cc(qGVah^k9I7%<1&s~iN3?Fh{SP=Ct@8xb W4N^h763|ru0000 Date: Fri, 29 Jan 2021 11:05:21 +0100 Subject: [PATCH 018/148] adding a few more constellations --- apps/planetarium/planetarium-icon.js | 2 +- apps/planetarium/planetarium.app.js | 36 +++++++++++++++++---------- apps/planetarium/planetarium.data.csv | 4 +-- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/apps/planetarium/planetarium-icon.js b/apps/planetarium/planetarium-icon.js index 215c5aa38..b1644b98b 100644 --- a/apps/planetarium/planetarium-icon.js +++ b/apps/planetarium/planetarium-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AEGIAAgVPhAWFAAOACyoYNCxQYMCxZjKFxgwKB42ClAwNFw+O9AwNH48u8RhMLpHu9xhMLg0ipwXBokiMQwXKCoIADC5JGHlwWDMI5ICC44wEVI4XCZxBfC8jzKBRAuCC66oIC4K9IwPuoUk90YYJAXIwVCSYR3HC5WBAgYvPCggAFDQoXGwhAIwVIC5cuBoohDeQoXGpwNFEIbDFC4uCaJL1BKQgXDiVEdQdCB4WCYIIACokhC4uEBgYABC4YJII4kuBgZhEBJAXEEwi3EBIhgDwEABwYuHGAoHDgAXDwIXJRwIXKHoaoGC4ZHDC4JgCC4MoUAIXF91CBgReDC4iwCkh3EwNCZwQXFPAgAPCwQXYYIYAOIwYwTCwgwRFwowRCwwwPFw4wPCxAwNFxIYMCxYYKCxpjICp4AQ")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwgkhiIAECp8BCwoABiAWVDBoWKDBgWLMZQuMGBQWNGBAuHjtBGBomHjvRGBhdI7vUMJgLGilE7vdohJHC5MUCoIADDAxGKpoWDJI5ICC44wESJS1IGAR4IJAQXgI4YXJXpAXBoJiBBhEQC5JzCigXTABgXeIBJODC5MdaA4hB6IXLpoNFEIbDFC4zRJboIXJojRC6lEBwdEegXdBIYXDZwIAEeY4ABNgQvEEgfdMIkdBIZTDC4gwELwouGC4MABoyQGHQSCEgAXHSAxSDC7pgDKQJiBL4xcBBIZeBC4cUNIUUC4oJGC4RIEAB4WCC7BgDABxGDGCYWEGCIuFGCIWGGB4uHGB4WIGBouJDBgWLDBQWNMZAVPACAA==")) \ No newline at end of file diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 104280631..bd36bf4b7 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -57,10 +57,6 @@ function drawStars(lat,lon,date){ let starNumber = 0; - //Each star has a number (the position on the file (line number)). These are the lines - //joining each star in the constellations. - constelation_lines=[/*Orion*/[7,68],[10,53],[53,56],[28,68],/*Taurus*/[13,172],[13,340],[293,340],[29,293], - /*canis menor*/[155,8]]; var starPositions = {}; for (i=0;i Date: Fri, 29 Jan 2021 13:25:34 +0100 Subject: [PATCH 019/148] speed improvements --- apps/planetarium/README.md | 10 ++++- apps/planetarium/planetarium.app.js | 67 ++++++++++++++--------------- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index ff2178888..206fa5b50 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -8,4 +8,12 @@ Plan is to show also constellations, but this is work in progress. Now it shows I think code is quite optimized already. It runs as fast as I could make it run. If someone has some ideas to speed it up, I could plot more stars. -Basic equations to compute declination and right ascension for stars where taken from this [github repo](https://github.com/Michi83/planetarium). \ No newline at end of file +Basic equations to compute declination and right ascension for stars where taken from this [github repo](https://github.com/Michi83/planetarium). Thanks! + +## How to use +The planetarium plots the stars as if you are looking to the sky (with your watch screen pointing downwards). This means, if you have the watch in your wrist, you have to look south to see the stars matching. If you want to look north, just take out the watch from your wrist and make a 180º turn. + +## Improvements +I plan to add more constellations as soon as I have time. I am adding the constellations that I know of, but the plan is to add all the main ones (at least for North Hemisphere). + +Please note that the watch hardware is limited and computing the stars positions is a quite intensive task for this little processor. This is why it plots only stars and no planets or the moon. For plotting the planets, storage will be a limiting factor as well as computing the position for planets needs more initial data compared with stars. \ No newline at end of file diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index bd36bf4b7..e860345a8 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -46,7 +46,6 @@ function drawStars(lat,lon,date){ storage = require('Storage'); f=storage.read("planetarium.data.csv","r"); - linestart=0; g.clear(); //Common calculations based only on time @@ -59,42 +58,42 @@ function drawStars(lat,lon,date){ let starNumber = 0; var starPositions = {}; - for (i=0;i= 0) - { - //Compute azimuth - var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); - var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); - var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); - starPositions[starNumber] = [x,y]; - var magnitude = starMag<1.5?2:1; - g.fillCircle(x, y, magnitude); - if (starMag<1 && settings.starnames) - g.drawString(starInfo[3],x,y+2); - g.flip(); + var line,linestart = 0; + lineend = f.indexOf("\n"); + while (lineend>=0) { + line = f.substring(linestart,lineend); + starNumber++; + //console.log(line); + //Process the star + starInfo = line.split(','); + //console.log(starInfo[0]); + starRA = parseFloat(starInfo[0]); + starDE = parseFloat(starInfo[1]); + starMag = parseFloat(starInfo[2]); + //var start = new Date().getTime(); + var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); + var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; + var H = siderealTime(julianDay) - longitude - ascen; + //Compute altitude + var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H)); + if(alt >= 0) + { + //Compute azimuth + var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); + var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); + var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); + starPositions[starNumber] = [x,y]; + var magnitude = starMag<1.5?2:1; + g.fillCircle(x, y, magnitude); + if (starMag<1 && settings.starnames) + g.drawString(starInfo[3],x,y+2); + g.flip(); - } } + linestart = lineend+1; + lineend = f.indexOf("\n",linestart); } + if (settings.constellations){ //Each star has a number (the position on the file (line number)). These are the lines From 189d2cde36b6fe2e7187fe21666b289b32f06f33 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 29 Jan 2021 13:33:17 +0100 Subject: [PATCH 020/148] adding more stars --- apps/planetarium/ChangeLog | 2 + apps/planetarium/planetarium.data.csv | 159 +++++++++++++++++++++++++- 2 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 apps/planetarium/ChangeLog diff --git a/apps/planetarium/ChangeLog b/apps/planetarium/ChangeLog new file mode 100644 index 000000000..9d28d3d8d --- /dev/null +++ b/apps/planetarium/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App! +0.02: Major speed improvement \ No newline at end of file diff --git a/apps/planetarium/planetarium.data.csv b/apps/planetarium/planetarium.data.csv index 7b178c767..99c943239 100644 --- a/apps/planetarium/planetarium.data.csv +++ b/apps/planetarium/planetarium.data.csv @@ -340,4 +340,161 @@ 1.134,0.273,3.6,GA TAU 3.323,-0.025,3.6,GA VIR 3.684,1.124,3.6,AL DRA -5.475,-1.020,3.6,BE IND \ No newline at end of file +5.475,-1.020,3.6,BE IND +0.161,0.941,3.7,ZE CAS +1.462,0.173,3.7,LA ORI +4.096,-0.520,3.7,TA LIB +4.741,-0.874,3.7,TH ARA +6.063,-0.370,3.7,88 AQR +2.494,1.101,3.7,23 UMA +4.129,0.269,3.7,BE SER +2.285,-0.579,3.7,AL PYX +3.323,-0.025,3.7,GA VIR +4.048,0.508,3.7,BE CRB +5.673,-0.291,3.7,GA CAP +0.871,-0.380,3.7,TA4 ERI +1.271,0.098,3.7,PI4 ORI +2.554,-1.091,3.7,_ +6.096,0.057,3.7,GA PSC +0.506,-0.901,3.7,CH ERI +0.981,0.421,3.7,17 TAU +4.703,0.510,3.7,XI HER +1.555,-0.247,3.7,ET LEP +3.081,0.834,3.7,CH UMA +4.149,0.078,3.7,EP SER +5.216,0.112,3.7,BE AQL +1.284,0.043,3.7,PI5 ORI +1.569,0.947,3.7,DE AUR +3.867,0.033,3.7,109 VIR +5.519,0.767,3.7,XI CYG +5.562,0.664,3.7,TA CYG +0.486,-0.180,3.7,ZE CET +0.929,-0.165,3.7,EP ERI +2.060,-0.708,3.7,_ +4.744,0.167,3.7,72 OPH +0.904,0.170,3.7,XI TAU +5.614,-0.391,3.7,ZE CAP +5.989,-0.132,3.7,LA AQR +1.320,0.717,3.8,ZE AUR +2.374,-0.822,3.8,_ +4.284,0.334,3.8,GA HER +4.660,0.047,3.8,GA OPH +4.684,0.993,3.8,XI DRA +5.887,1.020,3.8,DE CEP +0.745,0.976,3.8,ET PER +1.147,0.306,3.8,DE1 TAU +1.456,-1.091,3.8,BE DOR +4.406,-1.030,3.8,ET ARA +5.679,-1.351,3.8,NY OCT +5.790,0.442,3.8,JO PEG +0.983,0.743,3.8,NY PER +2.207,-1.154,3.8,BE VOL +4.995,-0.379,3.8,OK SGR +5.049,0.931,3.8,KA CYG +5.409,0.278,3.8,AL DEL +5.444,-0.166,3.8,EP AQR +5.896,0.878,3.8,AL LAC +1.871,-1.230,3.8,GA2 VOL +2.851,-1.027,3.8,_ +1.851,0.359,3.8,ZE GEM +1.945,0.485,3.8,JO GEM +5.104,0.903,3.8,JO2 CYG +5.295,0.816,3.8,31 CYG +0.827,0.783,4.8,KA PER +2.579,1.030,4.8,YP UMA +2.705,0.346,4.8,GA2 LEO +4.079,0.184,4.8,DE SER +4.079,0.184,4.8,DE SER +4.623,0.803,4.8,JO HER +1.478,-0.045,4.8,SI ORI +1.533,-0.364,4.8,DE LEP +2.732,-0.294,4.8,MY HYA +1.202,-0.533,4.8,YP2 ERI +2.438,0.642,4.8,38 LYN +2.740,-1.025,4.8,_ +4.324,0.035,4.8,LA OPH +5.181,0.323,4.8,DE SGE +6.185,0.811,4.8,LA AND +0.979,0.564,4.8,OK PER +2.851,0.597,4.8,46 LMI +3.658,-0.735,4.8,PH CEN +3.874,-1.380,4.8,AL APS +4.745,0.502,4.8,OK HER +5.184,1.226,4.8,EP DRA +1.172,0.279,4.8,TH1 TAU +2.272,-0.814,4.8,_ +2.335,-1.058,4.8,_ +2.781,-0.842,4.8,_ +3.017,1.210,4.8,LA DRA +4.113,0.459,4.8,GA CRB +4.816,0.380,4.8,109 HER +5.854,-0.024,4.8,GA AQR +0.978,-1.131,4.8,BE RET +1.515,-0.891,4.8,BE PIC +1.667,-0.584,4.8,DE COL +1.897,-0.467,4.8,OM CMA +2.682,-0.735,4.8,_ +2.761,0.162,4.8,RH LEO +4.173,0.273,4.8,GA SER +4.256,-1.112,4.8,DE TRA +4.866,-0.144,4.8,AL SCT +1.108,-0.738,4.9,AL HOR +3.306,-0.847,4.9,TA CEN +4.696,0.650,4.9,TH HER +4.772,-0.368,4.9,MY SGR +0.248,0.672,4.9,MY AND +0.838,-0.506,4.9,AL FOR +0.985,0.425,4.9,20 TAU +1.214,-0.250,4.9,53 ERI +1.445,-0.619,4.9,EP COL +1.807,-0.422,4.9,OK1 CMA +3.283,-1.259,3.9,GA MUS +3.288,1.218,3.9,KA DRA +3.659,-0.782,3.9,YP1 CEN +3.979,-0.851,3.9,KA1 LUP +0.041,-0.798,3.9,EP PHE +2.419,0.040,3.9,TH HYA +2.586,0.454,3.9,MY LEO +3.539,-0.688,3.9,_ +3.853,-0.099,3.9,MY VIR +4.175,-0.510,3.9,RH SCO +0.770,-0.155,3.9,ET ERI +2.971,-0.951,3.9,PI CEN +3.228,-0.012,3.9,ET VIR +4.275,0.808,3.9,TA HER +4.335,-1.377,3.9,GA APS +5.220,0.612,3.9,ET CYG +2.206,-0.068,3.9,_ +5.203,0.018,3.9,ET AQL +6.067,-0.790,3.9,JO GRU +1.061,0.105,3.9,NY TAU +2.295,-0.804,3.9,_ +2.530,-0.020,3.9,JO HYA +2.917,-1.029,3.9,_ +3.264,-0.877,3.9,SI CEN +4.082,-0.258,3.9,GA LIB +0.298,-0.964,3.9,ZE PHE +4.452,0.540,3.9,EP HER +5.567,0.092,3.9,AL EQU +1.206,-0.059,3.9,NY ERI +2.013,-0.167,3.9,AL MON +5.069,-0.311,3.9,RH1 SGR +0.114,-0.762,3.9,KA PHE +2.289,0.317,3.9,DE CNC +2.984,0.184,3.9,JO LEO +5.485,0.719,3.9,NY CYG +0.398,-0.856,4.0,DE PHE +0.760,0.921,4.0,TA PER +1.731,-0.336,4.0,NY2 CMA +2.015,-1.267,4.0,ZE VOL +3.508,0.959,4.0,ZE UMA +4.149,-0.587,4.0,CH LUP +5.963,0.411,4.0,LA PEG +1.152,-0.594,4.0,43 ERI +1.567,-0.747,4.0,ET COL +1.788,-0.567,4.0,KA CMA +2.024,-0.505,4.0,3 PUP +3.192,-0.914,4.0,RH CEN +4.218,-0.361,4.0,OM1 SCO +5.239,-1.273,4.0,EP PAV +1.534,0.683,4.0,NY AUR \ No newline at end of file From eb58e84d4f80db49073ecfa857eaae785c8e26fd Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 29 Jan 2021 13:36:12 +0100 Subject: [PATCH 021/148] updating readme and changelog --- apps/planetarium/ChangeLog | 2 +- apps/planetarium/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/planetarium/ChangeLog b/apps/planetarium/ChangeLog index 9d28d3d8d..5ff3fde91 100644 --- a/apps/planetarium/ChangeLog +++ b/apps/planetarium/ChangeLog @@ -1,2 +1,2 @@ 0.01: New App! -0.02: Major speed improvement \ No newline at end of file +0.02: Major speed improvement. Added more stars. Up to 500! \ No newline at end of file diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 206fa5b50..56dc66be9 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -2,7 +2,7 @@ This planetarium takes your position and time and plots the sky as it is. -No planets, or moon, only stars. It can show the 350 most brilliant stars in the sky. +No planets, or moon, only stars. It can show the 500 most brilliant stars in the sky. Plan is to show also constellations, but this is work in progress. Now it shows Taurus and Orion as examples. From 565b621f2ea873d46047bd221ea8eacff27e93a0 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 29 Jan 2021 13:36:57 +0100 Subject: [PATCH 022/148] updating readme and changelog --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 4e6f83c9c..9f7a67534 100644 --- a/apps.json +++ b/apps.json @@ -2679,7 +2679,7 @@ "name": "Planetarium", "shortName":"Planetarium", "icon": "planetarium.png", - "version":"0.01", + "version":"0.02", "description": "Planetarium showing up to 350 stars using the watch location and time", "tags": "", "storage": [ From b661679c19fc492d68fea9a2943f4e959f22e0ac Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 29 Jan 2021 13:37:44 +0100 Subject: [PATCH 023/148] updating app.js --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 9f7a67534..b42942e58 100644 --- a/apps.json +++ b/apps.json @@ -2680,7 +2680,7 @@ "shortName":"Planetarium", "icon": "planetarium.png", "version":"0.02", - "description": "Planetarium showing up to 350 stars using the watch location and time", + "description": "Planetarium showing up to 500 stars using the watch location and time", "tags": "", "storage": [ {"name":"planetarium.app.js","url":"planetarium.app.js"}, From 3c76559fce30d76ae4ef8ae9ecfccb349bdee40d Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 29 Jan 2021 20:19:34 +0100 Subject: [PATCH 024/148] adding a few more stars --- apps/planetarium/planetarium.app.js | 18 ++++- apps/planetarium/planetarium.data.csv | 98 +++++++++++++-------------- 2 files changed, 65 insertions(+), 51 deletions(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index e860345a8..d750771a3 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -83,7 +83,21 @@ function drawStars(lat,lon,date){ var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); starPositions[starNumber] = [x,y]; - var magnitude = starMag<1.5?2:1; + var magnitude = starMag<1?2:1; + //Stars between 1.5 and 4 magnitude should get a different colour + var col=1; + if (starMag<=1.5) + col=1; + else if (starMag>1.5 && starMag<2) + col=0.9; + else if (starMag>=2 && starMag<3) + col=0.7; + else if (starMag>=3 && starMag<3.5) + col=0.5; + else + col=0.3; + + g.setColor(col,col,col); g.fillCircle(x, y, magnitude); if (starMag<1 && settings.starnames) g.drawString(starInfo[3],x,y+2); @@ -99,7 +113,7 @@ function drawStars(lat,lon,date){ //Each star has a number (the position on the file (line number)). These are the lines //joining each star in the constellations. constelations=[[[7,68],[10,53],[53,56],[28,68],"Orion"],[[13,172],[13,340],[293,340],[29,293],"Taurus"], - [[155,8],"Canis Menor"],[[36,81],[87,81],[235,87],[33,235],[33,75],[75,40],"Ursa Major"],[[67,91],[74,67],[91,110],[110,252],"Cassiopeia"],[[23,166],[16,294],[294,44],[166,149],[230,149],[16,23],"Gemini"]]; + [[155,8],"Canis Menor"],[[36,81],[87,81],[235,87],[33,235],[33,75],[75,40],"Ursa Major"],[[67,91],[74,67],[91,110],[110,252],"Cassiopeia"],[[23,166],[16,294],[294,44],[166,149],[230,149],[16,23],"Gemini"],[[88,218],[215,292],[218,292],[245,88],[292,245],[215,218],"Cepheus"],[[150,62],[150,175],[175,35],[403,62],[487,158],[384,487],[384,158],[35,158],[487,403],"Perseus"],[[19,65],[65,90],[65,147],[466,65],[466,189],[147,401],[213,90],"Cygnus"],[[6,42],[168,6],[168,113],[113,29],[104,29],[104,42],"Auriga"]]; g.setColor(0,255,0); for (i=0;i Date: Fri, 29 Jan 2021 20:28:56 +0100 Subject: [PATCH 025/148] settings for the constellations names --- apps/planetarium/planetarium.app.js | 4 ++-- apps/planetarium/settings.js | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index d750771a3..f9200c9a1 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -132,7 +132,7 @@ function drawStars(lat,lon,date){ g.flip(); } //Write the name - if (constelationShowing) + if (constelationShowing && settings.consnames) g.drawString(constelations[i][constelations[i].length-1],positionStar2[0]+10,positionStar2[1]); } } @@ -145,7 +145,7 @@ var prevSats = 0; g.clear(); var settings = require('Storage').readJSON('planetarium.json',1)|| - { starnames:false,constellations:true}; + { starnames:false,constellations:true,consnames:false}; g.setFontAlign(0,0); diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index 21dd36f6b..d2351e0db 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -19,7 +19,13 @@ format: v =>v?'On':'Off', onchange: v => { save('constellations',v); - } - }}; + }}, + 'Const. names': { + value: !!settings.consnames, + format: v =>v?'On':'Off', + onchange: v => { + save('consnames',v); + }}, + }; E.showMenu(appMenu) }) \ No newline at end of file From 6018356f907e3eeb2ad820e1f7b6587dc815381e Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 20:27:53 +0000 Subject: [PATCH 026/148] created tapelauncher app --- apps/tapelauncher/ChangeLog | 2 + apps/tapelauncher/README.md | 17 ++++++ apps/tapelauncher/app.js | 87 +++++++++++++++++++++++++++++++ apps/tapelauncher/icon.js | 1 + apps/tapelauncher/icon.png | Bin 0 -> 1385 bytes apps/tapelauncher/screenshot.jpg | Bin 0 -> 100861 bytes 6 files changed, 107 insertions(+) create mode 100644 apps/tapelauncher/ChangeLog create mode 100644 apps/tapelauncher/README.md create mode 100644 apps/tapelauncher/app.js create mode 100644 apps/tapelauncher/icon.js create mode 100644 apps/tapelauncher/icon.png create mode 100644 apps/tapelauncher/screenshot.jpg diff --git a/apps/tapelauncher/ChangeLog b/apps/tapelauncher/ChangeLog new file mode 100644 index 000000000..918e4a9ac --- /dev/null +++ b/apps/tapelauncher/ChangeLog @@ -0,0 +1,2 @@ +0.01: Initial version + diff --git a/apps/tapelauncher/README.md b/apps/tapelauncher/README.md new file mode 100644 index 000000000..2296dc357 --- /dev/null +++ b/apps/tapelauncher/README.md @@ -0,0 +1,17 @@ +# The Tape App Launcher + +Reminiscent of a Telegram or Turing machine tape. + +![](screenshot.jpg) + +## Controls + +**BTN1** - move backward to the previous app icon + +**BTN2** - run the selected app + +**BTN3** - move forward to the next app icon + +**Swipe Left** - move forward to the next app icon + +**Swipe Right** - move backwards (to the left) to the previous app diff --git a/apps/tapelauncher/app.js b/apps/tapelauncher/app.js new file mode 100644 index 000000000..c1211c032 --- /dev/null +++ b/apps/tapelauncher/app.js @@ -0,0 +1,87 @@ +/* + * Tape Launcher + * + */ + +var s = require("Storage"); +var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,icon:a.icon,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="clock" || !app.type)); +apps.sort((a,b)=>{ + var n=(0|a.sortorder)-(0|b.sortorder); + if (n) return n; // do sortorder first + if (a.nameb.name) return 1; + return 0; +}); + +var Napps = apps.length; +var selected = 1; // assumes we have at least 2 apps + +function draw_icon(pos, id, select) { + var x = ((pos % 3)*80) + 2; + var y = 80; + + if (select) { + //g.setColor(0.3,0.3,0.3).fillRect(x,y,x+79,y+99); // bigger than icon + } else { + // some icons will vanish on a black background, so draw a box smaller than the icon to sit on + //g.setColor(0.3,0.3,0.3).fillRect(x+5,y+11,x+73,y+73); + } + + g.setColor(-1); + g.drawImage(s.read(apps[id].icon),x+2,y+11,{scale:1.625}); + + if (select) { + // white bounding box + g.setColor(1,1,1).drawRect(x,y,x+79,y+99); + } +} + +function draw() { + g.setColor(0,0,0).fillRect(0,0,239,239); + + if (selected -1 > -1) + draw_icon(0, selected -1, false); + + draw_icon(1, selected, true); + + if (selected + 1 < Napps) + draw_icon(2, selected + 1, false); + + g.setColor(-1).setFontAlign(0,-1,0).setFont("6x8",3); + + if (apps[selected].name.length <= 12) { + g.drawString(apps[selected].name, 120, 40, true); + } else { + // some app names are too long for one line + var name = apps[selected].name; + var first = name.substring(0, name.lastIndexOf(" ")); + var last = name.substring(name.lastIndexOf(" ") + 1, name.length); + g.drawString(first, 120, 40, true); + g.drawString(last, 120, 200, true); + } +} + +Bangle.on("swipe",(dir)=>{ + (dir<0) ? nextapp(1) : nextapp(-1); +}); + +function nextapp(dir){ + selected += dir; + + if (selected > Napps - 1) { + selected = Napps - 1; + } else if (selected < 0) { + selected = 0; + } + draw(); +} + +function doselect(){ + load(apps[selected].src); +} + +setWatch(nextapp.bind(null,-1), BTN1, {repeat:true,edge:"falling"}); +setWatch(doselect, BTN2, {repeat:true,edge:"falling"}); +setWatch(nextapp.bind(null,1), BTN3, {repeat:true,edge:"falling"}); + +draw(); diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js new file mode 100644 index 000000000..b5c7afd6c --- /dev/null +++ b/apps/tapelauncher/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA=="); diff --git a/apps/tapelauncher/icon.png b/apps/tapelauncher/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db4e42fabfcf74a30513e373fdf3d4e2baa44a39 GIT binary patch literal 1385 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 ZeV zo;^xS3U%CK{ow8cnR3A?Hk06K69!4{3QnM2y)^STqvRXL>{>Mj6jPo1D$fzjxKmwBRY4k>k`~n_CZ>d;>C|&&xb#~0Y4{A$ zG%bGZ<>YEJnna{9e543Ofo&s)ds^E$mZ3cQF>Ri`j@_6}ZRZ!AIsjfVV&6+l@(_az z=liSl_WV*aJ>d69p8KI|R027o33WOaRE&UT!O6~M%i)gf?_gmBqN#V`Nx^{nxg`J) zN<)at7E8{ThCQFJiQ*I~gaocN`Ka5^3r7P;F-ek664ts%e5@H7jGb&Ru`#Uc<$<9p zsu~v~A-P~*_ijgGj1N$6ucSt8upYDUcKVZpo3iwNRKO&_tW{u!D@~5kXt(6qo!S8u zV~BfJD=tNXdu7rV4!8((n%UYgrhElL;0lOolq~>D=jj-x=NN>Jz#zHK#%f}IpyTy{ z;eQT*DZldSl@UH2y`iX2uhOlC_}~97ST@(Gm4P(+ndk3{yxgr2SV@=j#&Sj7X@%r; zQS8Km2uPiS4&=Q#fyX@RTE+KyH`mSb?A`?O_t@8F- zT(>vhOzt6C$(2uLwss3qSsi&cT+IP_Wz+gat`iA*|EKNDd{bXZSp?(Rq1V$|yIAG!v5{Kt}_1+0lT0#wePF z2|os@m$54?;cRNCFH4i|+#*7fXg7$Jdv?PXsnGgiY-K*VYV}Kb*58WmUNQaqXmcI0 zaBS}TB*$-zeXTeFL_JAQuG!Ir>P_QK0FM1*(c)jtvIy;hccrdj%WtTQqEpVlYuwpF zs3@z!Z5rRBkOuZQwN_&zsjr`WAH?MGP*mSd{&3WPgeCvf#`5se7!7~w{ZJT&$=WC% zHJIrv+Ai!ZzGE?Pn9P*6EoW_Dea3ELIZo0|(LqU$kn!$(S96_-sjFDT0x3|qeUS(d zh<-A-fi$M9*iAEf>=sB8WN))=tALaBCOOCWZOgc{@)|49(kYWv<_T3yl81}kf;1Ao z5RYHOl~5$rAYmOXu>C1=N#w9d<&qoYrbkao`Gu6H+1Cr-CV^7|D_Hd(Qvk3iEf#s| zGv*B|80VzDj3+N&`27RS-=@5;#Ftua<>NMrm+Q_@F+dXHewYPSIo>48J@4~XXEYT}xIo zWNN`!Ip8V9_~DpVuuRgrOj(`4`=Y9G&LV>F@*R72cR?O7Nd&fTjyj}4@ft=k8~bQ@ zxi7GX?5z2>I)h<4j_IdF70tk_V@EgU1&73rTnO%;!dgs^z-3Sjw{U=XAb+caZGrOo zU@L5%KTnCA#v!g8N;F6%1}Iam#ECcE6|0DgGuc+-VFj9bz01S&k|HdzS1=?7nuA=R zXfwq(nj)25TP2aVUnPA%6KcP!bTabzY&Itk`jE}4j+GYN%T)~p*_Plh2*8cc=zg!! z5gX_#+v|7{t8Ycg!&gcr))x6XN*06>7n+rf`Rnz8i?Ey$Zo;7kcExDh#aTDCiiM6FuiU>3j7)>^?((wbS?!Sp8xCg%Z{YVMKTIkr_^GhO#d1XVdUG_r3mz zaQcewG1x&UtBs)J;vStOe~T2izD`(vc5!H$Tp+c3#!O+86ieW59{j#;PM3F#qRD0p zf9iPFA+gZAOp*=rGqq9pWfS(7CKsA^|JOIJnP<3C<1+mi?xnZpSQmBjvWsE!1b?(V zz-!DJ9$J*!*jqm=-42~e^#XU%x+nbuu(U709@C<6%!<`nQr!Myu)!as?5sGOc|H%9 zC#8g6DwnM?eaz-ejl>1(HYM&ncnel;n|1Q*I5g zK!?1dk~i5;R}eiz6NgLTbD}GHia~BCH7vwR+&2!8(Bv-)=o`7+p?l+<5&_~w?cyuL zzT&)(i%zs_(VfCQc}$1zD(S>|IhZ;V>#HJFh+_t)w4HwO(P-b+y-FVvEqK(jVG(g5 z6~dp;oMLfSaYfOiQ2m`Il!Xb=y$9EqjAH^TGkjam{K#N6d-=qEaLL-i=a+gD3+rRl zfTWAkHMU1T2Fg|a&hgQsgv63|cQoY&I}bFIA?p>(I?ftSKSLw%VzxGYocfPFKM555T@0H8i@9mdWuP(FKtmJl(4nSjOVc>5DhU87 z!lH6;b#sQZKMkG|!)8d!4*yiAA=VL6_>1Hg$t;0RiTMJgC`cU`HZh)G6D)DpiEZQW0mu=Pa}qIdKgLLv5&D&oN_V0*SSKKo62kRR ziZ43Km?n8(=%zwQm&z`3<>@TsXdCn1fG*1rB{RGlZBysWK6Bjc`fF3Mok`}7mG!T0 zx-ON?!=?_li!sC2@s<^AmS#64_Z+Vz_lC-LUg+ZLZZD60+%GHU{V@-&i>(B@5TEdI z3OD_I(hrRzYb12$h}s?ngOXBBq4uIfkz=?I&H&sLKqDA$j`~}~C-p)tCMz2$e zUYWI0dn*~fy_lm)>jVTHH0G4LOB59G3-6{5Yj?)v%m9cwD5!R*#9kUlHAE1yE>sOPON~Z*|H;=nIuJXW?s1grqfsIu#CvzK z@9+H&P~}P&blW!)T_c;76Mtbhf+eI(mU?HO?aywDCC}sNP_gdJEXx-!sPU4RPsbTY zQ5%_6=1jYyBkj10RwOA;hbIZ0K>KPN*Q9UQovCg-+xXc03)J5GySo@Y9bYP*f055s zd5l2QW}#utguC9YSeepVq}w0eqxrO`Jqf|=owU(o5Wz-%BkAz$tOKwqk5M)zGr_xDk{oS?%V&9^PI zAJp0Eq`vN>ls4LrDF-p6j{hn;N=!^W`!?i^TNX4wXFOe?mN=(3$}AU(RUss;e#Ac? z$>43MsF?eRgMIpD`=kM1{DEog_IahNRL)=G>iTANwvp!V>hBWeibtrTstqn_$@?R{ za-(*XX`5;(vE&X_?M<^~t6o*@+3ZXrCtdg*CPU&bv+i+3h-cLR5IYM4{eEJ2@l6BI zm))AO(GM19!^Y!3p7Zu$xdwRt{S<#@p9GB#M|wX`G4Dwz8KGQx$m32XBf_U-;deob z$jTFSB%A|56w_JMZpy8Q=Po*xV(bAQ`kxy^Jgdp<8DN)cBE4)p;)h0V(T%1T10qcn3 zdL4Xs$lKRA`-ffEr@5twT_;5~TTu)#VO*>8C;F&Vy%8unbf$9s-=eh}!S>}?)^c01 zqo8&2!cJgp&tg)gS_6VJE7=K3#+o{XU(OGSf`rei7<@0)*$BDU^UC_%c5WDu;0IX* zGhUOwkI|R%f{)cFzg0*yl=)}{bFbRI%*&VJawf9F8Tx(G|O)6UwFt{@UZFTPT*CasU9uU5qG ze8XNYvqcw;+lkbkM`lSFW+#Vj$b=V(8B%bjHVW>fxm-v|LP7c)L~ANU9o-cEi(cV! zS5>tGw-~DV5aX=lr^SHeTk6)rz_^8~Z;6}h!^RM`j48l+Vu=HUuf{day64qn0=>}} zC4<=zb}bI7KVtBBDrv+-u1FJof#OWvtO8(1XGao2}mX#1m9h zSAUIY`&@H$(#`%93;H)J;E5h1NFL5C4=r+OQ~U?mO=Nc8zyM6?S?Q!i@%7_avj^`< zXgas9s#hm-cxFSXt8dy(is^H^p(*@%%yPdT*RirBkdEPgQ7x_)?_xDJ zkzFlalka_|LhdWUJ_*_G@g(~YoKZ;wv`ynzQ^m~7vtu-0#2p&J!s3Zf)d?Kt!lM?o1MPZ zgy^JPjCgtJ=%)_R0L(82(-fVh5r$VZ`;JGOt*hhEe zq4K-y?d#lUIH*>2Ctfz>tg@;2D&H#c=JSnS%)ju#X-pj7$9ngP#ak)0=HPq^uE(z; z&J$a(;_>a*L?2I+w;>v&JCah*sO*dZG&EIPA*Son-%YOe)85c0B~*M&=(_dsp#Eit zZ6Z(Qu#A*PT9_SrpD140xjgX{&q|e4|nzA*WTfP|m-Z4<*a3NPz zAcDd+NLBd|DD2#|9}P5fyW)Z*O>#Vm@&S=D&`8^&$>ps%PfHAFkxi zp5`2>+`Q$5m1Djm(QRt}NMz-8y3ldDfyE&iQSC-cTe#P1MSLmupVeJXEq38?pAEsM z6Y+#am&s2T5tZ)7?wP9rwHMt;hd>Vi0I_vpAxiX?LU_bZV$YQ>{yKJnSPa{3X@uE|lV#j7z6UYoR&} z`CY}2i?(_7b#X4>1)dnb=#-CbFICER4SRbEx(FzIo>?}gEPJBoQ926Eq8j`!{Btcn zqp0_sI<>0&1-_F~!1op2PV~Ang?ljD4f=))(>rEoZM$tZRn5*VnEe|yRo@73pfo1M z(9>6#rTXwFU<6hT_$3i$jbjZMBN~E3uLk=DKnj$VXQ8@4%f#U|5Zz}n&MF|yu9k#< z(!aE^ds}UJ>0t3~Uz;^Iwt-w8FvnFixEyzmmjPlIz~?9vG~RWs4siD@QJoP#symf$ zSRTPC<~_MM>q*HFR^*x1v&O(|GJF(^>sVOQ49CDGAdE*2+sASI=W|3POe-|(LgyVr zI`Ix|o@Z!KU*B#~VyWCOff#%$d%>n(P{5=LRs;;Vo;G^X|O=Yty6SPbc%Zeo(|-mBd-b@Vm+DYoxa zVGLU!#W-g?X3YlHLHo|oIL%-hY_rdFDRfeLX;G zn2t;2_}{=*#g_}w=IhTlSUgsW4xVe^6yIv>zh3eAOpOU@zm8|N|Em5IoDep2q(H>m zK)x+|P*>FRaCnQ|^e2RP{^;R)_O9-dbeu74XwBQ&c0G|JS2%~*e8^ty1tr@{5Bi6t zW+{p{Vrye?hV{*^=wlelo>&3n3X_BW<^f~?Lau80@9L4tE5-OF6S=#&lv>1Ig)xIe zR8-5I!p6`@B~PowCYHhdjol$oU5X?qwQ98QPqR!hR_`k`#fa4m)Z`)jB?TZ7CyK1h zji(OgyOqK>Ho%R6qA_FtW)04HivxVyuts(dIUC%KRJk|?-{WbN{R6y^sV3jO3e7H) z2lW?XIsxIjWlIS6@tLAi($r7Ui<>{680a2t%6s-PC{&8bL4zM~bqK&i`w?OB8c>7L z$I28|J4j}+3)|WU6=v*=C4vN)mYn^?AJW$hPa!1{%z^ZP+*0fmfgbUxO@wcqQnp$y zio(q3V~3pe5T{bTF5epmonnEVsTm9>6viX&bY}F$-CP~jPb9R=7w}`JT|^(iBfKPP z#_}~RtN6eJSr@2}37%x)i)>I6`ahw;=lm-4ne;HwBj^J*#JO|Ze|&WKvwFQ6^RYN` z#P3O-3!_K=!nHQjMdejo2EFUo1@x}%eySOc=or5q9m$=OvzO!V)gf7YoLAtBGeVS! zXyNxN|5d)nKfV-|xE6E}_I}FC6DT3{wXd|Q5|m_+uSosdiquUcAIgeWzpF`nodU}k zL@i;`7XaFN;uWopnF29C3EGz;In7=swlgl3IZGKY(~!Xmt=Z%3fz15bsy|aq?hcO) z)dsp&ZkaPEZG}YF16FfrkH`5m0$v51%4OQ~M`khaf&Lb&{%n_tf6gTQ_{YOL0TlGD zQXabsA6gBim$Ss3^Rd6;1{=9rH465&!TWZ<81jaJhxMppe0qLowbW(Xgft5RQz7is z?L>Y!fAhDTIfnnQ+#BfuQJj&J`;XD(KTffYZ4xD@ljhq%_$?~$zLhwXJL#%biNu54 zm^G#VX(YW|$9tYrzq+eF{W@}V&+idxqSD#PG+sf8q{7_IzNll}Ib-t<87Sy3Wypgj zuqvNo^1Ra%bC)h(2nk^>b~z)e4vGzjqG_0Bs`S3hj45ttqTckk`OEwS|KpjDGb0mo zXPXOSSz&eW7}Z>V$w9vwj~tN6{mr|kfb59l?(LBr3Tx#wxN=_6j`cdt? z!&|AQu7i(f7#5=!w~D3$;%aOJylR06*ZsB4c~UXL)Roval|nYDxV-4CBwQTR+Bt3X zO{#jKbGl>KGuli_`(Tv2c>BmGpI@XYM6Poy?F7KJC8Ys4{XDkTT zp!#`ed`SlOh8u=gksoKgt8mIVOW6KR>*60k^sDnXK|yu%-=nBENmX=$PhhVVr3+G{_c@EP`|VKvAvskc~x+f=OvW^7n@$osOq>)p^_UR)8pNlm*^1 zf@&#i71B{XOED)0N{0XMib*HAL+GafYAFODv&4bIHDaY9r5upsgdn6oH)VZe!DF4t9{d$bT3iEt zA>WEAQ>T8}6FiX_|M~YDz&h4q(lH_C6raIBx04|6#M=&JORywiG`ZfNF>P*IaQfc;x$hFDer9-x#Qv& zwJ3Z?y^c^{Yt+=aMBOz;5N!4;(GZR5P44Qc&%3$u#e_(WhQt)kEbxr=9W3h92HCeD zvYz*+ME?MzyCrx<+P>Y?`r=?CIrt4asOipEpVeMqc96t{%Og+xY^Y=$OfiL#sMvIE z1SCOPF5BGgMBO~wrZ;Ty@CUcS0qwmR#iB}44ZXSk!pB1`s_zyzMaTB)&;%`len!8l znjfluc5jSs$RP$wTxELJ=_wxHb|zGXXRx+D*$9KXzito~nMx=~oZ=(;DnVYVNeLBl z=Y_pLm$3wTSiaws3tu&~Pkg&d;=PM4$Z6?h6MzmDpa|kvqfw3GC>@FZbZ4R{%Ew#X zX7)}r{;6+ZX$t{U$0gQDgz)nrx((#Y&8^p=oz_zpt~S3I^%iPnNgfm&A3RGPTf^cf z2vU+>W$L^Q4avk&z;P5h9J@fH{%!}59E9h(7L3;aX}5TPo9~=o{8~)pB`Q)R>6O^5 zMOXlDIng#K-Q!2K0uH2i$E<~~vp()ZnSeo^Z6;~w6)JFWk0N(tL0BXye7S73aL3sq zh;y~hBbe=167J|sVXQq@^QTwGG-|0_H(NpX!S{Zw*y@5r*l)4Wo& zB7ytkEfL5O-}y74pXZADG6$uK?pTWTPg;Qkc-N)cNJ}+7#ldgxo(AjAZ9w$;D`#6Ay{r==18%uqL50Cm>W|*&U^0K3yBN2rJ^z1E-0a;r||O6aGFn zy2Lezl6hDJ>p}xJc4S zAHpmwdDWtzS|zz?!(xOvuMt}a0TUeVt}yN@PsDrNt~b)$;yVOLGs;Pd-zSGfN}NtM zW-wR)nj+5g{0lcTdd^-L$#tJT%c{y@A!j8=9Fb%H{@5$Q-9Sr>zaG*4=qtBxm+hNp zY5^yqhpo=%E~~24smVCG(I6g29W(aOJcB>t+?01YAF?|v0U}g-K?S6*k6}e!LLy<< z?1M|Km#=-KKPN8wa1}%gNgeSbJcf0Fa|*2T5L>+N7#JN!+xz{)ib0M`he{;8Q@gUX zw4i3<+jk;5C$@NOM5{WZLVnB@D^>FEDQV+~9e2iR;j{Lg6Ip3)1Hll@m?w{p4ZzWc z45tF~KQhGsvQnTfpD{W5M>AmY!i{$fb7^gie$NYcO#d_hSA$#DdXkt1=}BW9f8@yY zY|6Zo%_-l_C$h4=%^`nWdAK+t;HR~xC<%!@>~7^YDN6f!%Bv7XoY+10+gbMQ{@%>S zOYg-`rSk$sy!l1gfPuH;09LT~&ih~v{_iqe3J z;YatNOafH{F5g;RAXOx5%1);i#=t~-%sUCofaSUk^CmKXKK78Z`Uk*y`ZitoWyWV_ z<;aQ45Hz>yQge_u`7f4raeY|?*$eCis@P&#WQmO{MWC$t&28y!OcY~}Ng_gZ`=E}z zp{KsRQ%8p(utmmXdLz+Nr+n4^A3)RBZz#DamC!WXl#bluU%f;Z4wrJ08YhgiXk9p`?2i_`RRX<$~=Nh zhXx(y9WQtDR>mz>=0uNS0mNc)BB>*MN=;t@im;HQ+Tdtb2t_U1c=|7#CE36E&DgPN z0|3xI~kmkCtRCJ#s7fPMiVyrQ>KkuywwCPhZMlS#aI zZR7kAJFlp&FV4`H!S&v_onfTWLbbq=<;0S^gaPNGzqgstLMsOVl>%ms4!>SP5q;Vrxvw~|} z_9}dT1!Ejw2%CJpWi|@O1R;#)5J1Aor@~n7-`uHjHlM$W_+j!sO@BH3uj6gqB{%oU z^uuxCL88#SN^;##x*X${p4Xu9*XM7kI!lXfXj!QMf6HnmPUzyxx#VYg%L&Z3D8hlo zk5NX~%n|$5io@2VPl<*_?*UJ(L=?`EfRPN+)zA&#qxLn4sYbuo`f$s z*a%YFNee~4o(}+3Q1Rpre;`5(U@Hco#_!xL58P;f$o~NL`Ah!*Bkv%Du?FT-W|%Re zYyhP2JbAA_7r^mVLSGItyp?RUG?+^O^ruyuy`ftnN_S<$icdt(`~Sn0A1SmlxNl-%B; zfK|X`6bgbo{EF~G2`1#8X{vkMx^9&RZ)2qTbQv;3i?~h#!yzaf0$F2cB<;IrVi}1Q zb<^4e3S*W3kOZx@VM2pv_tzZ+ z19XFPl8$!2aq4=K$D`-ZB>2$A*%7~}%Q0fa?UGM-s-QO23_YqSdFcp8X&SD6Pje=Z zk(H4)nYwDid04@k+G8_PHc%8z3v?t08o-PP%IRI?F4+N zJraHKM4f$`_NQGVP5%JJ`g3Y}&R#_GUR96;+h;C@{{VigN%9cBvgSRhBFd}@=DSI zZ9yCWJOBqB5_L{s6{enP(^u`Rb^QjZ>L;y=h8WaiDvFDc#H@f4NxCXPH^H;ehcH1s x*M~u literal 0 HcmV?d00001 From 12009d1b8138898f1b2009c5107c3195303c3e38 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 20:33:33 +0000 Subject: [PATCH 027/148] added tape launcher --- apps.json | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 09462a8ba..06e80f5f3 100644 --- a/apps.json +++ b/apps.json @@ -2692,8 +2692,7 @@ {"name":"intervals.app.js","url":"intervals.app.js"}, {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} ] -} -, +}, { "id": "planetarium", "name": "Planetarium", "shortName":"Planetarium", @@ -2710,5 +2709,19 @@ "data":[ {"name":"planetarium.json"} ] +}, +{ "id": "tapelaunch", + "name": "Tape Launcher", + "icon": "icon.png", + "version":"0.01", + "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", + "readme": "README.md", + "tags": "tool,system,launcher", + "type":"launch", + "storage": [ + {"name":"tapelaunch.app.js","url":"app.js"}, + {"name":"tapelaunch.img","url":"icon.js","evaluate":true} + ] } + ] From 57a92ec16eaa4da4bb5852c8cbb227ed12155716 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 20:36:32 +0000 Subject: [PATCH 028/148] bumped cliock version and change log after icon update --- apps.json | 2 +- apps/cliock/ChangeLog | 1 + apps/cliock/app.js | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 06e80f5f3..1478893ec 100644 --- a/apps.json +++ b/apps.json @@ -1153,7 +1153,7 @@ "name": "Commandline-Clock", "shortName":"CLI-Clock", "icon": "app.png", - "version":"0.09", + "version":"0.10", "description": "Simple CLI-Styled Clock", "tags": "clock,cli,command,bash,shell", "type":"clock", diff --git a/apps/cliock/ChangeLog b/apps/cliock/ChangeLog index d5ae8efdf..d2427a2c1 100644 --- a/apps/cliock/ChangeLog +++ b/apps/cliock/ChangeLog @@ -1,3 +1,4 @@ 0.07: Submitted to App Loader 0.08: Fixes issue where face would redraw on wake leading to all memory being used and watch crashing. 0.09: Add BTN1 status line with ID,Fw ver, mem %, battery % +0.10: Icon fixed for transparency diff --git a/apps/cliock/app.js b/apps/cliock/app.js index 30c057c5d..15584cae7 100644 --- a/apps/cliock/app.js +++ b/apps/cliock/app.js @@ -10,7 +10,11 @@ const ID_MODE = "id"; const VER_MODE = "ver"; const BATT_MODE = "batt"; const MEM_MODE = "mem"; +const STEP_MODE = "step"; +const HRT_MODE = "hrt"; + let infoMode = NONE_MODE; +let functionMode = NONE_MODE; function drawAll(){ updateTime(); @@ -102,6 +106,20 @@ function changeInfoMode() { } } +function changeFunctionMode() { + switch(functionMode) { + case NONE_MODE: + functionMode = STEP_MODE; + break; + case STEP_MODE: + functionMode = HRT_MODE; + break; + case HRT_MODE: + default: + functionMode = NONE_MODE; + } +} + g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -113,3 +131,4 @@ Bangle.on('lcdPower',function(on) { var click = setInterval(updateTime, 1000); setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"}); setWatch(() => { changeInfoMode(); drawAll(); }, BTN1, {repeat: true}); +setWatch(() => { changeFunctionMode(); drawAll(); }, BTN2, {repeat: true}); From 6c564a9872c8e1880e6c5df55583216e735bbe57 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 21:11:49 +0000 Subject: [PATCH 029/148] fixed icon.js file, dropped a ) --- apps/tapelauncher/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js index b5c7afd6c..5ee284db2 100644 --- a/apps/tapelauncher/icon.js +++ b/apps/tapelauncher/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA=="); +require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")); From c6f00741369d2e00ddacbe593b5e50db1f52cfaa Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 22:16:23 +0000 Subject: [PATCH 030/148] use dtlaucher icon.js for now --- apps/tapelauncher/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js index 5ee284db2..a49bb0af4 100644 --- a/apps/tapelauncher/icon.js +++ b/apps/tapelauncher/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")); +require("heatshrink").decompress(atob("mEwwhC/AH4ATxAAQC+2N7vd7AX/C/6/7a/4X/a/4X/C/4X/C/4Xfl3iC6vu9wXtI653WAH4A/ABg")) \ No newline at end of file From c2ddd7cc588080671c63510c2c963e48eebe35fd Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 22:57:53 +0000 Subject: [PATCH 031/148] restored icon.js and changed to split on first word when App name is longer than 12 chars --- apps/tapelauncher/app.js | 14 +++----------- apps/tapelauncher/icon.js | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/apps/tapelauncher/app.js b/apps/tapelauncher/app.js index c1211c032..91b53ae11 100644 --- a/apps/tapelauncher/app.js +++ b/apps/tapelauncher/app.js @@ -20,19 +20,11 @@ function draw_icon(pos, id, select) { var x = ((pos % 3)*80) + 2; var y = 80; - if (select) { - //g.setColor(0.3,0.3,0.3).fillRect(x,y,x+79,y+99); // bigger than icon - } else { - // some icons will vanish on a black background, so draw a box smaller than the icon to sit on - //g.setColor(0.3,0.3,0.3).fillRect(x+5,y+11,x+73,y+73); - } - g.setColor(-1); g.drawImage(s.read(apps[id].icon),x+2,y+11,{scale:1.625}); if (select) { - // white bounding box - g.setColor(1,1,1).drawRect(x,y,x+79,y+99); + g.setColor(1,1,1).drawRect(x,y,x+79,y+99); // white bounding box } } @@ -54,8 +46,8 @@ function draw() { } else { // some app names are too long for one line var name = apps[selected].name; - var first = name.substring(0, name.lastIndexOf(" ")); - var last = name.substring(name.lastIndexOf(" ") + 1, name.length); + var first = name.substring(0, name.indexOf(" ")); + var last = name.substring(name.indexOf(" ") + 1, name.length); g.drawString(first, 120, 40, true); g.drawString(last, 120, 200, true); } diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js index a49bb0af4..5ee284db2 100644 --- a/apps/tapelauncher/icon.js +++ b/apps/tapelauncher/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwhC/AH4ATxAAQC+2N7vd7AX/C/6/7a/4X/a/4X/C/4X/C/4Xfl3iC6vu9wXtI653WAH4A/ABg")) \ No newline at end of file +require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")); From be086908e8b19e14f4ff1684deffb31d44d64a3b Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 29 Jan 2021 23:37:03 +0000 Subject: [PATCH 032/148] adjusted id from tapelaunch to tapelauncher - the src directory must match the id --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 1478893ec..a77ceb32d 100644 --- a/apps.json +++ b/apps.json @@ -2710,7 +2710,7 @@ {"name":"planetarium.json"} ] }, -{ "id": "tapelaunch", +{ "id": "tapelauncher", "name": "Tape Launcher", "icon": "icon.png", "version":"0.01", From f04f3d139e4326a9843a5072cf95e0ba9714bdda Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 30 Jan 2021 18:28:30 +0000 Subject: [PATCH 033/148] Added display of steps and ability to switch on heart rate monitor --- apps/cliock/README.md | 10 ++++- apps/cliock/app.js | 86 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 11 deletions(-) diff --git a/apps/cliock/README.md b/apps/cliock/README.md index 23b878f26..45ed8e644 100644 --- a/apps/cliock/README.md +++ b/apps/cliock/README.md @@ -9,6 +9,14 @@ A retro VT100 command line style clock ### With BTN1 pressed -* Successive presses of BTN1 will show id, FW version, battery %, memory % +* Successive presses of BTN1 will show Heart rate, Steps, id, FW version, battery %, memory % ![](cli_clock_with_id.jpg) + +* BTN2 shows a functional menu that enables the Heart rate monitor to be turned on / off using BTN1 + +Once the heart rate monitor is ON, you can cycle through the displays to show the heart rate. + +## Future Enhancements +* Ability to turn on the GPS and show, lat long, grid ref +* Maybe a simple stopwatch capability diff --git a/apps/cliock/app.js b/apps/cliock/app.js index 15584cae7..77c07b3f7 100644 --- a/apps/cliock/app.js +++ b/apps/cliock/app.js @@ -4,17 +4,21 @@ var marginTop = 40; var flag = false; var WeekDays = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]; +var hrtOn = false; +var hrtStr = "Hrt: ??? bpm"; const NONE_MODE = "none"; const ID_MODE = "id"; const VER_MODE = "ver"; const BATT_MODE = "batt"; const MEM_MODE = "mem"; -const STEP_MODE = "step"; +const STEPS_MODE = "step"; const HRT_MODE = "hrt"; +const NONE_FN_MODE = "no_fn"; +const HRT_FN_MODE = "fn_hrt"; let infoMode = NONE_MODE; -let functionMode = NONE_MODE; +let functionMode = NONE_FN_MODE; function drawAll(){ updateTime(); @@ -58,11 +62,29 @@ function drawInfo(line) { let str = ""; let col = 0x07E0; // green + console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); + + switch(functionMode) { + case NONE_FN_MODE: + break; + case HRT_FN_MODE: + col = 0x07FF; // cyan + str = "HRM: " + (hrtOn ? "ON" : "OFF"); + drawModeLine(line,str,col); + return; + } + switch(infoMode) { case NONE_MODE: col = 0x0000; str = ""; break; + case HRT_MODE: + str = hrtStr; + break; + case STEPS_MODE: + str = "Steps: " + stepsWidget().getSteps(); + break; case ID_MODE: val = NRF.getAddress().split(":"); str = "Id: " + val[4] + val[5]; @@ -79,6 +101,10 @@ function drawInfo(line) { str = "Battery: " + E.getBattery() + "%"; } + drawModeLine(line,str,col); +} + +function drawModeLine(line, str, col) { g.setColor(col); g.fillRect(0, marginTop-3+line*30, 239, marginTop+25+line*30); g.setColor(0,0,0); @@ -87,8 +113,31 @@ function drawInfo(line) { } function changeInfoMode() { + switch(functionMode) { + case NONE_FN_MODE: + break; + case HRT_FN_MODE: + hrtOn = !hrtOn; + Bangle.buzz(); + Bangle.setHRMPower(hrtOn ? 1 : 0); + if (hrtOn) infoMode = HRT_MODE; + return; + } + switch(infoMode) { case NONE_MODE: + if (stepsWidget() !== undefined) + infoMode = hrtOn ? HRT_MODE : STEPS_MODE; + else + infoMode = VER_MODE; + break; + case HRT_MODE: + if (stepsWidget() !== undefined) + infoMode = STEPS_MODE; + else + infoMode = VER_MODE; + break; + case STEPS_MODE: infoMode = ID_MODE; break; case ID_MODE: @@ -107,19 +156,36 @@ function changeInfoMode() { } function changeFunctionMode() { + console.log("changeFunctionMode()"); switch(functionMode) { - case NONE_MODE: - functionMode = STEP_MODE; + case NONE_FN_MODE: + functionMode = HRT_FN_MODE; break; - case STEP_MODE: - functionMode = HRT_MODE; - break; - case HRT_MODE: + case HRT_FN_MODE: default: - functionMode = NONE_MODE; + functionMode = NONE_FN_MODE; } + console.log(functionMode); + } +function stepsWidget() { + if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom; + } else if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom; + } + return undefined; +} + +Bangle.on('HRM', function(hrm) { + if(hrm.confidence > 90){ + hrtStr = "Hrt: " + hrm.bpm + " bpm"; + } else { + hrtStr = "Hrt: ??? bpm"; + } +}); + g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -131,4 +197,4 @@ Bangle.on('lcdPower',function(on) { var click = setInterval(updateTime, 1000); setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"}); setWatch(() => { changeInfoMode(); drawAll(); }, BTN1, {repeat: true}); -setWatch(() => { changeFunctionMode(); drawAll(); }, BTN2, {repeat: true}); +setWatch(() => { changeFunctionMode(); drawAll(); }, BTN3, {repeat: true}); From 5cafc41dcf5994894cc70ea35e40d2dab74ef664 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Sun, 31 Jan 2021 16:15:00 +0100 Subject: [PATCH 034/148] adding a few constelations --- apps/planetarium/planetarium.app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index f9200c9a1..925a2c0dc 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -113,7 +113,7 @@ function drawStars(lat,lon,date){ //Each star has a number (the position on the file (line number)). These are the lines //joining each star in the constellations. constelations=[[[7,68],[10,53],[53,56],[28,68],"Orion"],[[13,172],[13,340],[293,340],[29,293],"Taurus"], - [[155,8],"Canis Menor"],[[36,81],[87,81],[235,87],[33,235],[33,75],[75,40],"Ursa Major"],[[67,91],[74,67],[91,110],[110,252],"Cassiopeia"],[[23,166],[16,294],[294,44],[166,149],[230,149],[16,23],"Gemini"],[[88,218],[215,292],[218,292],[245,88],[292,245],[215,218],"Cepheus"],[[150,62],[150,175],[175,35],[403,62],[487,158],[384,487],[384,158],[35,158],[487,403],"Perseus"],[[19,65],[65,90],[65,147],[466,65],[466,189],[147,401],[213,90],"Cygnus"],[[6,42],[168,6],[168,113],[113,29],[104,29],[104,42],"Auriga"]]; + [[155,8],"Canis Menor"],[[36,81],[87,81],[235,87],[33,235],[33,75],[75,40],[36,235],"Ursa Major"],[[67,91],[74,67],[91,110],[110,252],"Cassiopeia"],[[23,166],[16,294],[294,44],[166,149],[230,149],[16,23],"Gemini"],[[88,218],[215,292],[218,292],[245,88],[292,245],[215,218],"Cepheus"],[[150,62],[150,175],[175,35],[403,62],[487,158],[384,487],[384,158],[35,158],[487,403],"Perseus"],[[19,65],[65,90],[65,147],[466,65],[466,189],[147,401],[213,90],"Cygnus"],[[6,42],[168,6],[168,113],[113,29],[104,29],[104,42],"Auriga"],[[1,47],[1,37],[37,22],[22,178],[37,89],"Can Maior"],[[3,118],[118,279],[279,286],[286,180],[180,316],[316,3],"Bootes"]]; g.setColor(0,255,0); for (i=0;i Date: Sun, 31 Jan 2021 20:33:30 +0000 Subject: [PATCH 035/148] commented out console.log() calls --- apps/cliock/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/cliock/app.js b/apps/cliock/app.js index 77c07b3f7..ca48bb26f 100644 --- a/apps/cliock/app.js +++ b/apps/cliock/app.js @@ -62,7 +62,7 @@ function drawInfo(line) { let str = ""; let col = 0x07E0; // green - console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); + //console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); switch(functionMode) { case NONE_FN_MODE: @@ -156,7 +156,7 @@ function changeInfoMode() { } function changeFunctionMode() { - console.log("changeFunctionMode()"); + //console.log("changeFunctionMode()"); switch(functionMode) { case NONE_FN_MODE: functionMode = HRT_FN_MODE; @@ -165,7 +165,7 @@ function changeFunctionMode() { default: functionMode = NONE_FN_MODE; } - console.log(functionMode); + //console.log(functionMode); } From 565aa5a37dfed7862fa10ddf23ade67747d55c9a Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 31 Jan 2021 21:02:27 +0000 Subject: [PATCH 036/148] updated change log of cliock, for heart rate display --- apps/cliock/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/cliock/ChangeLog b/apps/cliock/ChangeLog index d2427a2c1..07b38e189 100644 --- a/apps/cliock/ChangeLog +++ b/apps/cliock/ChangeLog @@ -2,3 +2,4 @@ 0.08: Fixes issue where face would redraw on wake leading to all memory being used and watch crashing. 0.09: Add BTN1 status line with ID,Fw ver, mem %, battery % 0.10: Icon fixed for transparency +0.11: added Heart Rate Monitor status and ability to turn on/off From a93fc46c4093ecc582f08432798711984c6523ed Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 31 Jan 2021 21:03:24 +0000 Subject: [PATCH 037/148] bumped version of cliock --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a77ceb32d..b6f151480 100644 --- a/apps.json +++ b/apps.json @@ -1153,7 +1153,7 @@ "name": "Commandline-Clock", "shortName":"CLI-Clock", "icon": "app.png", - "version":"0.10", + "version":"0.11", "description": "Simple CLI-Styled Clock", "tags": "clock,cli,command,bash,shell", "type":"clock", From 20dc1ccf96bad77513ee55d3c7c4b89fcb415e99 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 1 Feb 2021 08:56:10 +0000 Subject: [PATCH 038/148] Fixing 'npm test' errors shown up in committed apps --- apps/speedalt/ChangeLog | 14 +++++++------- apps/tapelauncher/icon.js | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/speedalt/ChangeLog b/apps/speedalt/ChangeLog index 258b5051a..f969e904c 100644 --- a/apps/speedalt/ChangeLog +++ b/apps/speedalt/ChangeLog @@ -1,7 +1,7 @@ -0.01 : Initial import. -0.02 : Misc development. -0.03 : Enable screen off. -0.04 : Vibrate once on no fix, twice on fix. -0.05 : Add setting to turn vibrate on/off. -0.06 : Tweaks to vibration settings. -0.07 : Switch to BTN1 for Max toggle and reset function. +0.01: Initial import. +0.02: Misc development. +0.03: Enable screen off. +0.04: Vibrate once on no fix, twice on fix. +0.05: Add setting to turn vibrate on/off. +0.06: Tweaks to vibration settings. +0.07: Switch to BTN1 for Max toggle and reset function. diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js index 5ee284db2..bf323e5bf 100644 --- a/apps/tapelauncher/icon.js +++ b/apps/tapelauncher/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")); +require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")) From 38d3adc026f7033654e9c4d4acd517d7adcdae50 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 1 Feb 2021 15:31:36 +0000 Subject: [PATCH 039/148] gpsservice 0.04: Only turn GPS off if it was previously on (stops other apps/widgets that use GPS getting broken) --- apps.json | 4 ++-- apps/gpsservice/ChangeLog | 1 + apps/gpsservice/widget.js | 48 +++++++++++++++++++++------------------ 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/apps.json b/apps.json index 812167473..9792983fa 100644 --- a/apps.json +++ b/apps.json @@ -2655,7 +2655,7 @@ "name": "Low power GPS Service", "shortName":"GPS Service", "icon": "gpsservice.png", - "version":"0.03", + "version":"0.04", "description": "low power GPS widget", "tags": "gps outdoors navigation", "readme": "README.md", @@ -2723,5 +2723,5 @@ {"name":"tapelaunch.img","url":"icon.js","evaluate":true} ] } - + ] diff --git a/apps/gpsservice/ChangeLog b/apps/gpsservice/ChangeLog index 8e62936ea..9b415e6a7 100644 --- a/apps/gpsservice/ChangeLog +++ b/apps/gpsservice/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App 0.02: Restore to SuperE mode on power off. 0.03: dont reset to SuperE mode on power, as it prevents its general use +0.04: Only turn GPS off if it was previously on (stops other apps/widgets that use GPS getting broken) diff --git a/apps/gpsservice/widget.js b/apps/gpsservice/widget.js index 22a589484..ae51a50eb 100644 --- a/apps/gpsservice/widget.js +++ b/apps/gpsservice/widget.js @@ -3,7 +3,8 @@ var fixToggle = false; // toggles once for each reading var have_fix = false; var debug = false; - + var gpsPowerEnabled = false; + var last_fix = { fix: 0, alt: 0, @@ -25,7 +26,7 @@ function gps_set_debug(v) { debug = v; } - + // Called by the GPS widget settings to reload settings and decide what to do function reload() { settings = gps_get_settings(); @@ -38,7 +39,7 @@ gps_power_off(); } } - + // retrieve the settings from Storage, can be called by external apps function gps_get_settings() { var sets = require("Storage").readJSON("gpsservice.settings.json",1)||{}; @@ -48,7 +49,7 @@ sets.power_mode = sets.power_mode||"SuperE"; return sets; } - + // pass in the required settings, can be called by external apps function gps_set_settings(sets) { settings.gpsservice = sets.gpsservice||false; @@ -68,7 +69,10 @@ function gps_power_off() { //setupSuperE(); // return to expected setup for other apps - Bangle.setGPSPower(0); + if (gpsPowerEnabled) { + gpsPowerEnabled = false; + Bangle.setGPSPower(0); + } have_fix = false; fixToggle = false; last_fix.fix = 0; @@ -86,6 +90,7 @@ function setupGPS() { Bangle.setGPSPower(1); + gpsPowerEnabled = true; if (settings.power_mode === "PSMOO") { setupPSMOO(); @@ -99,13 +104,13 @@ log_debug("setupGPS() PSMOO"); UBX_CFG_RESET(); wait(100); - + UBX_CFG_PM2(settings.update, settings.search); wait(20); - + UBX_CFG_RXM(); wait(20); - + UBX_CFG_SAVE(); wait(20); } @@ -114,14 +119,14 @@ log_debug("setupGPS() Super-E"); UBX_CFG_RESET(); wait(100); - + UBX_CFG_PMS(); wait(20); UBX_CFG_SAVE(); wait(20); } - + function writeGPScmd(cmd) { var d = [0xB5,0x62]; // sync chars d = d.concat(cmd); @@ -133,12 +138,12 @@ d.push(a&255,b&255); Serial1.write(d); } - + // UBX-CFG-PMS - enable power management - Super-E function UBX_CFG_PMS() { writeGPScmd([0x06,0x86, // msg class + type 8,0,//length - 0x00,0x03, 0,0, 0,0, 0,0]); + 0x00,0x03, 0,0, 0,0, 0,0]); } // convert an integer to an array of bytes @@ -149,13 +154,13 @@ bytes[--i] = x & (255); x = x>>8; } while (i); - + return bytes; } /* - * Extended Power Management + * Extended Power Management * update and search are in milli seconds * settings are loaded little endian, lsb first * @@ -181,7 +186,7 @@ 0x00, 0x00, 0x00, 0x00, /* reserved 8,9,10 */ 0x00, 0x00, 0x00, 0x00]); /* reserved 11 */ } - + // enable power saving mode, after configured with PM2 function UBX_CFG_RXM() { writeGPScmd([0x06, 0x11, /* UBX-CFG-RXM */ @@ -208,14 +213,14 @@ * https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control */ function UBX_CFG_RESET() { - writeGPScmd([0x06, 0x09, // class id + writeGPScmd([0x06, 0x09, // class id 0x0D, 0x00, 0xFF, 0xFB, 0x00, 0x00, // clear mask 0x00, 0x00, 0x00, 0x00, // save mask 0xFF, 0xFF, 0x00, 0x00, // load mask 0x17]); } - + // draw the widget function draw() { if (!settings.gpsservice) return; @@ -229,7 +234,7 @@ if (fixToggle) g.setFont("6x8").drawString("?",this.x,this.y+14); } } - + function onGPS(fix) { fixToggle = !fixToggle; WIDGETS.gpsservice.draw(); @@ -252,12 +257,12 @@ last_fix.time = fix.time; } } - + // redraw when the LCD turns on Bangle.on('lcdPower', function(on) { if (on) WIDGETS.gpsservice.draw(); }); - + // add the widget WIDGETS.gpsservice = { area:"tl", @@ -278,6 +283,5 @@ // load settings, set correct widget width reload(); - -})(); +})(); From 457ccb1d9949f20679a604c22980be425a1d19ea Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 1 Feb 2021 15:33:42 +0000 Subject: [PATCH 040/148] about 0.07: Pressing a button now exits immediately (fix #618) --- apps.json | 2 +- apps/about/ChangeLog | 1 + apps/about/app.js | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 9792983fa..9ce865507 100644 --- a/apps.json +++ b/apps.json @@ -53,7 +53,7 @@ { "id": "about", "name": "About", "icon": "app.png", - "version":"0.06", + "version":"0.07", "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", "tags": "tool,system", "allow_emulator":true, diff --git a/apps/about/ChangeLog b/apps/about/ChangeLog index 2a050c91e..22409a4ec 100644 --- a/apps/about/ChangeLog +++ b/apps/about/ChangeLog @@ -4,3 +4,4 @@ 0.04: Actual pixels as of 9 Mar 2020 0.05: Actual pixels as of 27 Apr 2020 0.06: Actual pixels as of 12 Jun 2020 +0.07: Pressing a button now exits immediately (fix #618) diff --git a/apps/about/app.js b/apps/about/app.js index 4b4589262..a9c6854d9 100644 --- a/apps/about/app.js +++ b/apps/about/app.js @@ -31,3 +31,7 @@ g.flip(); // Pixel chooser image g.drawImage(require("heatshrink").decompress(atob("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")),0,135); g.flip(); + +setWatch(_=>load(), BTN1); +setWatch(_=>load(), BTN2); +setWatch(_=>load(), BTN3); From 4e095172dd62503dbe288ca6ad76bc35f80b7ea2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 1 Feb 2021 15:46:33 +0000 Subject: [PATCH 041/148] banglerun 0.08: Fix issue with GPS coordinates being wrong after the first one --- apps.json | 2 +- apps/banglerun/ChangeLog | 1 + apps/banglerun/app-icon.js | 2 +- apps/banglerun/app.js | 2 +- apps/banglerun/src/gps.ts | 8 +++++--- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps.json b/apps.json index 9ce865507..1ff316814 100644 --- a/apps.json +++ b/apps.json @@ -1553,7 +1553,7 @@ "name": "BangleRun", "shortName": "BangleRun", "icon": "banglerun.png", - "version": "0.07", + "version": "0.08", "interface": "interface.html", "description": "An app for running sessions. Displays info and logs your run for later viewing.", "tags": "run,running,fitness,outdoors", diff --git a/apps/banglerun/ChangeLog b/apps/banglerun/ChangeLog index 57d1f0c5d..221b3d468 100755 --- a/apps/banglerun/ChangeLog +++ b/apps/banglerun/ChangeLog @@ -5,3 +5,4 @@ 0.05: Complete rewrite. New UI, GPS & HRM Kalman filters, activity logging 0.06: Reading HDOP directly from the GPS event (needs Espruino 2v07 or above) 0.07: Fixed GPS update, added guards against NaN values +0.08: Fix issue with GPS coordinates being wrong after the first one diff --git a/apps/banglerun/app-icon.js b/apps/banglerun/app-icon.js index 0ccbedab4..9eeaced6e 100644 --- a/apps/banglerun/app-icon.js +++ b/apps/banglerun/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/4ACx4ED/0DApP8AqAXB84GDg/DAgXj/+DCAUABgIFB4EAv4FCwEAj0PAoJPBgwFEgEfDgMOAoM/AoMegFAAoP8jkA8F/AoM8gP4DgP4nBvD/F4KQfwuAFE+A/CAoPgAofx8A/CKYRwELIIFDLII6BAoZSBLIYeC/0BwAFDgfAGAQFBHgf8g4BBIIUH/wFBSYMPAoXwAog/Bj4FEv4FDDQQCBQoQFCZYYFi/6KE/+P/4A=")) +require("heatshrink").decompress(atob("mEwwIHEuAEDgP8ApMDAqAXBjAGD/E8AgUcgF8CAX/BgIFBn//wAFCv//8PwAoP///5Aon/8AcB+IFB4AFB8P/34FBgfj/8fwAFB4f+g4cBg/H/w/Cg+HKQcPx4FEh4/CAoMfAocOj4/CKYRwELIIFDLII6BAoZSBLIYeCgP+v4FD/k/GAQFBHgcD/ABBIIX4gIFBSYPwAoUPAog/B8AFEwAFDDQQCBQoQFCZYYFigCKEgFwgAA==")) diff --git a/apps/banglerun/app.js b/apps/banglerun/app.js index 764d6526b..8ad8809b6 100644 --- a/apps/banglerun/app.js +++ b/apps/banglerun/app.js @@ -1 +1 @@ -!function(){"use strict";const t={STOP:63488,PAUSE:65504,RUN:2016};function n(t,n,r){g.setColor(0),g.fillRect(n-60,r,n+60,r+30),g.setColor(65535),g.drawString(t,n,r)}function r(r){var e;g.setFontVector(30),g.setFontAlign(0,-1,0),n((r.distance/1e3).toFixed(2),60,55),n(function(t){const n=Math.round(t),r=Math.floor(n/3600),e=Math.floor(n/60)%60,o=n%60;return(r?r+":":"")+("0"+e).substr(-2)+":"+("0"+o).substr(-2)}(r.duration),180,55),n(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),r=Math.floor(n/60),e=n%60;return("0"+r).substr(-2)+"'"+("0"+e).substr(-2)+'"'}(r.speed),60,115),n(r.hr.toFixed(0),180,115),n(r.steps.toFixed(0),60,175),n(r.cadence.toFixed(0),180,175),g.setFont("6x8",2),g.setColor(r.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(e=new Date).getHours()).substr(-2)+":"+("0"+e.getMinutes()).substr(-2),120,220),g.setColor(t[r.status]),g.fillRect(160,216,240,240),g.setColor(0),g.drawString(r.status,200,220)}function e(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),r(t),Bangle.drawWidgets()}var o;function a(t){t.status===o.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),r=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(r,"w"),t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n")}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Running,r(t)}!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(o||(o={}));const s={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,v:NaN,t:NaN,dt:NaN,pError:NaN,vError:NaN,hr:60,hrError:100,file:null,drawing:!1,status:o.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var i;i=s,Bangle.on("GPS",t=>function(t,n){t.lat=n.lat,t.lon=n.lon,t.alt=n.alt,t.vel=n.speed/3.6,t.fix=n.fix,t.dop=n.hdop,t.gpsValid=t.fix>0&&t.dop<=5,function(t){const n=Date.now(),r=(n-t.t)/1e3;if(t.t=n,t.dt+=r,t.status===o.Running&&(t.duration+=r),!t.gpsValid)return;const e=6371008.8+t.alt,a=e*Math.cos(t.lat)*Math.cos(t.lon),s=e*Math.cos(t.lat)*Math.sin(t.lon),i=e*Math.sin(t.lat),d=t.vel;if(!t.x)return t.x=a,t.y=s,t.z=i,t.v=d,t.pError=2.5*t.dop,void(t.vError=.05*t.dop);const u=a-t.x,g=s-t.y,l=i-t.z,c=d-t.v,p=Math.sqrt(u*u+g*g+l*l),f=Math.abs(c);t.pError+=t.v*t.dt,t.dt=0;const N=p+2.5*t.dop,h=f+.05*t.dop,S=t.pError/(t.pError+N)||0,x=t.vError/(t.vError+h)||0;t.x+=u*S,t.y+=g*S,t.z+=l*S,t.v+=c*x,t.pError+=(N-t.pError)*S,t.vError+=(h-t.vError)*x;const E=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);t.lat=180*Math.asin(t.z/E)/Math.PI||0,t.lon=180*Math.atan2(t.y,t.x)/Math.PI||0,t.alt=E-6371008.8,t.status===o.Running&&(t.distance+=p*S,t.speed=t.distance/t.duration||0,t.cadence=60*t.steps/t.duration||0)}(t),r(t),t.gpsValid&&t.status===o.Running&&function(t){t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(t)}(i,t)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const r=n.bpm-t.hr,e=Math.abs(r)+101-n.confidence,o=t.hrError/(t.hrError+e)||0;t.hr+=r*o,t.hrError+=(e-t.hrError)*o}(t,n)),Bangle.setHRMPower(1)}(s),function(t){Bangle.on("step",()=>function(t){t.status===o.Running&&(t.steps+=1)}(t))}(s),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&e(t)}),e(t)}(s),setWatch(()=>a(s),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(t){t.status===o.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Stopped,r(t)}(s),BTN3,{repeat:!0,edge:"falling"})}(); +!function(){"use strict";const t={STOP:63488,PAUSE:65504,RUN:2016};function n(t,n,r){g.setColor(0),g.fillRect(n-60,r,n+60,r+30),g.setColor(65535),g.drawString(t,n,r)}function r(r){var e;g.setFontVector(30),g.setFontAlign(0,-1,0),n((r.distance/1e3).toFixed(2),60,55),n(function(t){const n=Math.round(t),r=Math.floor(n/3600),e=Math.floor(n/60)%60,o=n%60;return(r?r+":":"")+("0"+e).substr(-2)+":"+("0"+o).substr(-2)}(r.duration),180,55),n(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),r=Math.floor(n/60),e=n%60;return("0"+r).substr(-2)+"'"+("0"+e).substr(-2)+'"'}(r.speed),60,115),n(r.hr.toFixed(0),180,115),n(r.steps.toFixed(0),60,175),n(r.cadence.toFixed(0),180,175),g.setFont("6x8",2),g.setColor(r.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(e=new Date).getHours()).substr(-2)+":"+("0"+e.getMinutes()).substr(-2),120,220),g.setColor(t[r.status]),g.fillRect(160,216,240,240),g.setColor(0),g.drawString(r.status,200,220)}function e(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),r(t),Bangle.drawWidgets()}var o;function a(t){t.status===o.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),r=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(r,"w"),t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n")}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Running,r(t)}!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(o||(o={}));const s={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,v:NaN,t:NaN,dt:NaN,pError:NaN,vError:NaN,hr:60,hrError:100,file:null,drawing:!1,status:o.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var i;i=s,Bangle.on("GPS",t=>function(t,n){t.lat=n.lat,t.lon=n.lon,t.alt=n.alt,t.vel=n.speed/3.6,t.fix=n.fix,t.dop=n.hdop,t.gpsValid=t.fix>0&&t.dop<=5,function(t){const n=Date.now(),r=(n-t.t)/1e3;if(t.t=n,t.dt+=r,t.status===o.Running&&(t.duration+=r),!t.gpsValid)return;const e=6371008.8+t.alt,a=t.lat*Math.PI/180,s=t.lon*Math.PI/180,i=e*Math.cos(a)*Math.cos(s),d=e*Math.cos(a)*Math.sin(s),u=e*Math.sin(a),g=t.vel;if(!t.x)return t.x=i,t.y=d,t.z=u,t.v=g,t.pError=2.5*t.dop,void(t.vError=.05*t.dop);const l=i-t.x,c=d-t.y,p=u-t.z,f=g-t.v,h=Math.sqrt(l*l+c*c+p*p),N=Math.abs(f);t.pError+=t.v*t.dt,t.dt=0;const S=h+2.5*t.dop,x=N+.05*t.dop,E=t.pError/(t.pError+S)||0,M=t.vError/(t.vError+x)||0;t.x+=l*E,t.y+=c*E,t.z+=p*E,t.v+=f*M,t.pError+=(S-t.pError)*E,t.vError+=(x-t.vError)*M;const w=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);t.lat=180*Math.asin(t.z/w)/Math.PI||0,t.lon=180*Math.atan2(t.y,t.x)/Math.PI||0,t.alt=w-6371008.8,t.status===o.Running&&(t.distance+=h*E,t.speed=t.distance/t.duration||0,t.cadence=60*t.steps/t.duration||0)}(t),r(t),t.gpsValid&&t.status===o.Running&&function(t){t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(t)}(i,t)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const r=n.bpm-t.hr,e=Math.abs(r)+101-n.confidence,o=t.hrError/(t.hrError+e)||0;t.hr+=r*o,t.hrError+=(e-t.hrError)*o}(t,n)),Bangle.setHRMPower(1)}(s),function(t){Bangle.on("step",()=>function(t){t.status===o.Running&&(t.steps+=1)}(t))}(s),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&e(t)}),e(t)}(s),setWatch(()=>a(s),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(t){t.status===o.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Stopped,r(t)}(s),BTN3,{repeat:!0,edge:"falling"})}(); diff --git a/apps/banglerun/src/gps.ts b/apps/banglerun/src/gps.ts index d3f599eec..65f0c4e72 100644 --- a/apps/banglerun/src/gps.ts +++ b/apps/banglerun/src/gps.ts @@ -63,9 +63,11 @@ function updateGps(state: AppState): void { } const r = EARTH_RADIUS + state.alt; - const x = r * Math.cos(state.lat) * Math.cos(state.lon); - const y = r * Math.cos(state.lat) * Math.sin(state.lon); - const z = r * Math.sin(state.lat); + const lat = state.lat * Math.PI / 180; + const lon = state.lon * Math.PI / 180; + const x = r * Math.cos(lat) * Math.cos(lon); + const y = r * Math.cos(lat) * Math.sin(lon); + const z = r * Math.sin(lat); const v = state.vel; if (!state.x) { From d8aceffa51e6420dc56b3aef9d0f3e27b3582e95 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 1 Feb 2021 15:51:56 +0000 Subject: [PATCH 042/148] remove unused fn --- apps/banglerun/src/gps.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/apps/banglerun/src/gps.ts b/apps/banglerun/src/gps.ts index 65f0c4e72..8ca0a9531 100644 --- a/apps/banglerun/src/gps.ts +++ b/apps/banglerun/src/gps.ts @@ -22,13 +22,6 @@ function initGps(state: AppState): void { Bangle.setGPSPower(1); } -function parseCoordinate(coordinate: string): number { - const pivot = coordinate.indexOf('.') - 2; - const degrees = parseInt(coordinate.substr(0, pivot)); - const minutes = parseFloat(coordinate.substr(pivot)) / 60; - return (degrees + minutes) * Math.PI / 180; -} - function readGps(state: AppState, gps: GpsEvent): void { state.lat = gps.lat; state.lon = gps.lon; @@ -116,4 +109,4 @@ function updateGps(state: AppState): void { } } -export { initGps, parseCoordinate, readGps, updateGps }; +export { initGps, readGps, updateGps }; From d387fc83e458a6483b70fe66f990ee8a9799e212 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 1 Feb 2021 16:03:27 +0000 Subject: [PATCH 043/148] Handle case where there is no data --- apps/banglerun/interface.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/banglerun/interface.html b/apps/banglerun/interface.html index 177904077..f9aa2fa1a 100644 --- a/apps/banglerun/interface.html +++ b/apps/banglerun/interface.html @@ -111,6 +111,7 @@ function trackLineToObject(l, hasFileName) { var t = l.trim().split(","); var n = hasFileName ? 1 : 0; var o = { + invalid : t.length < 8, date : new Date(parseInt(t[n+0])), lat : parseFloat(t[n+1]), lon : parseFloat(t[n+2]), @@ -149,9 +150,9 @@ function getTrackList() {
Track ${track.filename}
-
${track.date.toString().substr(0,24)}
+
${track.invalid ? "No Data":track.date.toString().substr(0,24)}
-
+ ${track.invalid?``:`
-
- From 83b88e0d80343d006461c0507195da322bfff5ee Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 2 Feb 2021 09:58:40 +0000 Subject: [PATCH 044/148] banglerun 0.09: Another GPS fix (log raw coordinates - not filtered ones) --- apps.json | 2 +- apps/banglerun/ChangeLog | 1 + apps/banglerun/app.js | 2 +- apps/banglerun/src/gps.ts | 7 +++++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 1ff316814..b752e330d 100644 --- a/apps.json +++ b/apps.json @@ -1553,7 +1553,7 @@ "name": "BangleRun", "shortName": "BangleRun", "icon": "banglerun.png", - "version": "0.08", + "version": "0.09", "interface": "interface.html", "description": "An app for running sessions. Displays info and logs your run for later viewing.", "tags": "run,running,fitness,outdoors", diff --git a/apps/banglerun/ChangeLog b/apps/banglerun/ChangeLog index 221b3d468..5820f9fbf 100755 --- a/apps/banglerun/ChangeLog +++ b/apps/banglerun/ChangeLog @@ -6,3 +6,4 @@ 0.06: Reading HDOP directly from the GPS event (needs Espruino 2v07 or above) 0.07: Fixed GPS update, added guards against NaN values 0.08: Fix issue with GPS coordinates being wrong after the first one +0.09: Another GPS fix (log raw coordinates - not filtered ones) diff --git a/apps/banglerun/app.js b/apps/banglerun/app.js index 8ad8809b6..878532b66 100644 --- a/apps/banglerun/app.js +++ b/apps/banglerun/app.js @@ -1 +1 @@ -!function(){"use strict";const t={STOP:63488,PAUSE:65504,RUN:2016};function n(t,n,r){g.setColor(0),g.fillRect(n-60,r,n+60,r+30),g.setColor(65535),g.drawString(t,n,r)}function r(r){var e;g.setFontVector(30),g.setFontAlign(0,-1,0),n((r.distance/1e3).toFixed(2),60,55),n(function(t){const n=Math.round(t),r=Math.floor(n/3600),e=Math.floor(n/60)%60,o=n%60;return(r?r+":":"")+("0"+e).substr(-2)+":"+("0"+o).substr(-2)}(r.duration),180,55),n(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),r=Math.floor(n/60),e=n%60;return("0"+r).substr(-2)+"'"+("0"+e).substr(-2)+'"'}(r.speed),60,115),n(r.hr.toFixed(0),180,115),n(r.steps.toFixed(0),60,175),n(r.cadence.toFixed(0),180,175),g.setFont("6x8",2),g.setColor(r.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(e=new Date).getHours()).substr(-2)+":"+("0"+e.getMinutes()).substr(-2),120,220),g.setColor(t[r.status]),g.fillRect(160,216,240,240),g.setColor(0),g.drawString(r.status,200,220)}function e(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),r(t),Bangle.drawWidgets()}var o;function a(t){t.status===o.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),r=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(r,"w"),t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n")}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Running,r(t)}!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(o||(o={}));const s={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,v:NaN,t:NaN,dt:NaN,pError:NaN,vError:NaN,hr:60,hrError:100,file:null,drawing:!1,status:o.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var i;i=s,Bangle.on("GPS",t=>function(t,n){t.lat=n.lat,t.lon=n.lon,t.alt=n.alt,t.vel=n.speed/3.6,t.fix=n.fix,t.dop=n.hdop,t.gpsValid=t.fix>0&&t.dop<=5,function(t){const n=Date.now(),r=(n-t.t)/1e3;if(t.t=n,t.dt+=r,t.status===o.Running&&(t.duration+=r),!t.gpsValid)return;const e=6371008.8+t.alt,a=t.lat*Math.PI/180,s=t.lon*Math.PI/180,i=e*Math.cos(a)*Math.cos(s),d=e*Math.cos(a)*Math.sin(s),u=e*Math.sin(a),g=t.vel;if(!t.x)return t.x=i,t.y=d,t.z=u,t.v=g,t.pError=2.5*t.dop,void(t.vError=.05*t.dop);const l=i-t.x,c=d-t.y,p=u-t.z,f=g-t.v,h=Math.sqrt(l*l+c*c+p*p),N=Math.abs(f);t.pError+=t.v*t.dt,t.dt=0;const S=h+2.5*t.dop,x=N+.05*t.dop,E=t.pError/(t.pError+S)||0,M=t.vError/(t.vError+x)||0;t.x+=l*E,t.y+=c*E,t.z+=p*E,t.v+=f*M,t.pError+=(S-t.pError)*E,t.vError+=(x-t.vError)*M;const w=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);t.lat=180*Math.asin(t.z/w)/Math.PI||0,t.lon=180*Math.atan2(t.y,t.x)/Math.PI||0,t.alt=w-6371008.8,t.status===o.Running&&(t.distance+=h*E,t.speed=t.distance/t.duration||0,t.cadence=60*t.steps/t.duration||0)}(t),r(t),t.gpsValid&&t.status===o.Running&&function(t){t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(t)}(i,t)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const r=n.bpm-t.hr,e=Math.abs(r)+101-n.confidence,o=t.hrError/(t.hrError+e)||0;t.hr+=r*o,t.hrError+=(e-t.hrError)*o}(t,n)),Bangle.setHRMPower(1)}(s),function(t){Bangle.on("step",()=>function(t){t.status===o.Running&&(t.steps+=1)}(t))}(s),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&e(t)}),e(t)}(s),setWatch(()=>a(s),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(t){t.status===o.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Stopped,r(t)}(s),BTN3,{repeat:!0,edge:"falling"})}(); +!function(){"use strict";const t={STOP:63488,PAUSE:65504,RUN:2016};function n(t,n,r){g.setColor(0),g.fillRect(n-60,r,n+60,r+30),g.setColor(65535),g.drawString(t,n,r)}function r(r){var e;g.setFontVector(30),g.setFontAlign(0,-1,0),n((r.distance/1e3).toFixed(2),60,55),n(function(t){const n=Math.round(t),r=Math.floor(n/3600),e=Math.floor(n/60)%60,o=n%60;return(r?r+":":"")+("0"+e).substr(-2)+":"+("0"+o).substr(-2)}(r.duration),180,55),n(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),r=Math.floor(n/60),e=n%60;return("0"+r).substr(-2)+"'"+("0"+e).substr(-2)+'"'}(r.speed),60,115),n(r.hr.toFixed(0),180,115),n(r.steps.toFixed(0),60,175),n(r.cadence.toFixed(0),180,175),g.setFont("6x8",2),g.setColor(r.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(e=new Date).getHours()).substr(-2)+":"+("0"+e.getMinutes()).substr(-2),120,220),g.setColor(t[r.status]),g.fillRect(160,216,240,240),g.setColor(0),g.drawString(r.status,200,220)}function e(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),r(t),Bangle.drawWidgets()}var o;function a(t){t.status===o.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),r=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(r,"w"),t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n")}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Running,r(t)}!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(o||(o={}));const s={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,v:NaN,t:NaN,dt:NaN,pError:NaN,vError:NaN,hr:60,hrError:100,file:null,drawing:!1,status:o.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var i;i=s,Bangle.on("GPS",t=>function(t,n){t.lat=n.lat,t.lon=n.lon,t.alt=n.alt,t.vel=n.speed/3.6,t.fix=n.fix,t.dop=n.hdop,t.gpsValid=t.fix>0&&t.dop<=5,function(t){const n=Date.now(),r=(n-t.t)/1e3;if(t.t=n,t.dt+=r,t.status===o.Running&&(t.duration+=r),!t.gpsValid)return;const e=6371008.8+t.alt,a=t.lat*Math.PI/180,s=t.lon*Math.PI/180,i=e*Math.cos(a)*Math.cos(s),d=e*Math.cos(a)*Math.sin(s),u=e*Math.sin(a),g=t.vel;if(!t.x)return t.x=i,t.y=d,t.z=u,t.v=g,t.pError=2.5*t.dop,void(t.vError=.05*t.dop);const l=i-t.x,c=d-t.y,p=u-t.z,f=g-t.v,N=Math.sqrt(l*l+c*c+p*p),h=Math.abs(f);t.pError+=t.v*t.dt,t.dt=0;const S=N+2.5*t.dop,E=h+.05*t.dop,w=t.pError/(t.pError+S)||0,x=t.vError/(t.vError+E)||0;t.x+=l*w,t.y+=c*w,t.z+=p*w,t.v+=f*x,t.pError+=(S-t.pError)*w,t.vError+=(E-t.vError)*x,t.status===o.Running&&(t.distance+=N*w,t.speed=t.distance/t.duration||0,t.cadence=60*t.steps/t.duration||0)}(t),r(t),t.gpsValid&&t.status===o.Running&&function(t){t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(t)}(i,t)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const r=n.bpm-t.hr,e=Math.abs(r)+101-n.confidence,o=t.hrError/(t.hrError+e)||0;t.hr+=r*o,t.hrError+=(e-t.hrError)*o}(t,n)),Bangle.setHRMPower(1)}(s),function(t){Bangle.on("step",()=>function(t){t.status===o.Running&&(t.steps+=1)}(t))}(s),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&e(t)}),e(t)}(s),setWatch(()=>a(s),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(t){t.status===o.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Stopped,r(t)}(s),BTN3,{repeat:!0,edge:"falling"})}(); diff --git a/apps/banglerun/src/gps.ts b/apps/banglerun/src/gps.ts index 8ca0a9531..5e6925ca9 100644 --- a/apps/banglerun/src/gps.ts +++ b/apps/banglerun/src/gps.ts @@ -96,11 +96,14 @@ function updateGps(state: AppState): void { state.pError += (pError - state.pError) * pGain; state.vError += (vError - state.vError) * vGain; +/*// we're not currently updating lat/lon with the kalman filter + // as it seems not to update them correctly at the moment + // and we only use them for logging (where it makes sense to use + // raw GPS coordinates) const pMag = Math.sqrt(state.x * state.x + state.y * state.y + state.z * state.z); - state.lat = (Math.asin(state.z / pMag) * 180 / Math.PI) || 0; state.lon = (Math.atan2(state.y, state.x) * 180 / Math.PI) || 0; - state.alt = pMag - EARTH_RADIUS; + state.alt = pMag - EARTH_RADIUS;*/ if (state.status === ActivityStatus.Running) { state.distance += dpMag * pGain; From 15be69ba0ba452ae550c812fe812e49bbd3b2fb5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 2 Feb 2021 10:10:18 +0000 Subject: [PATCH 045/148] gpsrec 0.17: Disable recording if storage is full (fix #574) --- apps.json | 2 +- apps/gpsrec/ChangeLog | 1 + apps/gpsrec/widget.js | 21 +++++++++++++++------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index b752e330d..4c06827d6 100644 --- a/apps.json +++ b/apps.json @@ -363,7 +363,7 @@ { "id": "gpsrec", "name": "GPS Recorder", "icon": "app.png", - "version":"0.16", + "version":"0.17", "interface": "interface.html", "description": "Application that allows you to record a GPS track. Can run in background", "tags": "tool,outdoors,gps,widget", diff --git a/apps/gpsrec/ChangeLog b/apps/gpsrec/ChangeLog index b06264159..9974e1a64 100644 --- a/apps/gpsrec/ChangeLog +++ b/apps/gpsrec/ChangeLog @@ -18,3 +18,4 @@ 0.14: Now use the openstmap lib for map plotting 0.15: Add plotTrack method to allow current track to be plotted on a map (#395) 0.16: Add gpsrec app to Settings menu +0.17: Disable recording if storage is full (fix #574) diff --git a/apps/gpsrec/widget.js b/apps/gpsrec/widget.js index 9ad1754c6..4ddd0e669 100644 --- a/apps/gpsrec/widget.js +++ b/apps/gpsrec/widget.js @@ -29,12 +29,21 @@ periodCtr--; if (periodCtr<=0) { periodCtr = settings.period; - if (gpsTrack) gpsTrack.write([ - fix.time.getTime(), - fix.lat.toFixed(6), - fix.lon.toFixed(6), - fix.alt - ].join(",")+"\n"); + try { + if (gpsTrack) gpsTrack.write([ + fix.time.getTime(), + fix.lat.toFixed(6), + fix.lon.toFixed(6), + fix.alt + ].join(",")+"\n"); + } catch(e) { + // If storage.write caused an error, disable + // GPS recording so we don't keep getting errors! + console.log("gpsrec: write error", e); + settings.recording = false; + require("Storage").write("gpsrec.json", settings); + reload(); + } } } } From 6e14194541a34cd394e2c56066fb8bcd4e545329 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 2 Feb 2021 10:36:13 +0000 Subject: [PATCH 046/148] Tweak to avoid NaN durations! --- apps/banglerun/app.js | 2 +- apps/banglerun/src/gps.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/banglerun/app.js b/apps/banglerun/app.js index 878532b66..97287e61b 100644 --- a/apps/banglerun/app.js +++ b/apps/banglerun/app.js @@ -1 +1 @@ -!function(){"use strict";const t={STOP:63488,PAUSE:65504,RUN:2016};function n(t,n,r){g.setColor(0),g.fillRect(n-60,r,n+60,r+30),g.setColor(65535),g.drawString(t,n,r)}function r(r){var e;g.setFontVector(30),g.setFontAlign(0,-1,0),n((r.distance/1e3).toFixed(2),60,55),n(function(t){const n=Math.round(t),r=Math.floor(n/3600),e=Math.floor(n/60)%60,o=n%60;return(r?r+":":"")+("0"+e).substr(-2)+":"+("0"+o).substr(-2)}(r.duration),180,55),n(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),r=Math.floor(n/60),e=n%60;return("0"+r).substr(-2)+"'"+("0"+e).substr(-2)+'"'}(r.speed),60,115),n(r.hr.toFixed(0),180,115),n(r.steps.toFixed(0),60,175),n(r.cadence.toFixed(0),180,175),g.setFont("6x8",2),g.setColor(r.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(e=new Date).getHours()).substr(-2)+":"+("0"+e.getMinutes()).substr(-2),120,220),g.setColor(t[r.status]),g.fillRect(160,216,240,240),g.setColor(0),g.drawString(r.status,200,220)}function e(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),r(t),Bangle.drawWidgets()}var o;function a(t){t.status===o.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),r=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(r,"w"),t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n")}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Running,r(t)}!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(o||(o={}));const s={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,v:NaN,t:NaN,dt:NaN,pError:NaN,vError:NaN,hr:60,hrError:100,file:null,drawing:!1,status:o.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var i;i=s,Bangle.on("GPS",t=>function(t,n){t.lat=n.lat,t.lon=n.lon,t.alt=n.alt,t.vel=n.speed/3.6,t.fix=n.fix,t.dop=n.hdop,t.gpsValid=t.fix>0&&t.dop<=5,function(t){const n=Date.now(),r=(n-t.t)/1e3;if(t.t=n,t.dt+=r,t.status===o.Running&&(t.duration+=r),!t.gpsValid)return;const e=6371008.8+t.alt,a=t.lat*Math.PI/180,s=t.lon*Math.PI/180,i=e*Math.cos(a)*Math.cos(s),d=e*Math.cos(a)*Math.sin(s),u=e*Math.sin(a),g=t.vel;if(!t.x)return t.x=i,t.y=d,t.z=u,t.v=g,t.pError=2.5*t.dop,void(t.vError=.05*t.dop);const l=i-t.x,c=d-t.y,p=u-t.z,f=g-t.v,N=Math.sqrt(l*l+c*c+p*p),h=Math.abs(f);t.pError+=t.v*t.dt,t.dt=0;const S=N+2.5*t.dop,E=h+.05*t.dop,w=t.pError/(t.pError+S)||0,x=t.vError/(t.vError+E)||0;t.x+=l*w,t.y+=c*w,t.z+=p*w,t.v+=f*x,t.pError+=(S-t.pError)*w,t.vError+=(E-t.vError)*x,t.status===o.Running&&(t.distance+=N*w,t.speed=t.distance/t.duration||0,t.cadence=60*t.steps/t.duration||0)}(t),r(t),t.gpsValid&&t.status===o.Running&&function(t){t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(t)}(i,t)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const r=n.bpm-t.hr,e=Math.abs(r)+101-n.confidence,o=t.hrError/(t.hrError+e)||0;t.hr+=r*o,t.hrError+=(e-t.hrError)*o}(t,n)),Bangle.setHRMPower(1)}(s),function(t){Bangle.on("step",()=>function(t){t.status===o.Running&&(t.steps+=1)}(t))}(s),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&e(t)}),e(t)}(s),setWatch(()=>a(s),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(t){t.status===o.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Stopped,r(t)}(s),BTN3,{repeat:!0,edge:"falling"})}(); +!function(){"use strict";const t={STOP:63488,PAUSE:65504,RUN:2016};function n(t,n,r){g.setColor(0),g.fillRect(n-60,r,n+60,r+30),g.setColor(65535),g.drawString(t,n,r)}function r(r){var e;g.setFontVector(30),g.setFontAlign(0,-1,0),n((r.distance/1e3).toFixed(2),60,55),n(function(t){const n=Math.round(t),r=Math.floor(n/3600),e=Math.floor(n/60)%60,o=n%60;return(r?r+":":"")+("0"+e).substr(-2)+":"+("0"+o).substr(-2)}(r.duration),180,55),n(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),r=Math.floor(n/60),e=n%60;return("0"+r).substr(-2)+"'"+("0"+e).substr(-2)+'"'}(r.speed),60,115),n(r.hr.toFixed(0),180,115),n(r.steps.toFixed(0),60,175),n(r.cadence.toFixed(0),180,175),g.setFont("6x8",2),g.setColor(r.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(e=new Date).getHours()).substr(-2)+":"+("0"+e.getMinutes()).substr(-2),120,220),g.setColor(t[r.status]),g.fillRect(160,216,240,240),g.setColor(0),g.drawString(r.status,200,220)}function e(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),r(t),Bangle.drawWidgets()}var o;function a(t){t.status===o.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),r=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(r,"w"),t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n")}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Running,r(t)}!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(o||(o={}));const s={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,v:NaN,t:NaN,dt:NaN,pError:NaN,vError:NaN,hr:60,hrError:100,file:null,drawing:!1,status:o.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var i;i=s,Bangle.on("GPS",t=>function(t,n){t.lat=n.lat,t.lon=n.lon,t.alt=n.alt,t.vel=n.speed/3.6,t.fix=n.fix,t.dop=n.hdop,t.gpsValid=t.fix>0&&t.dop<=5,function(t){const n=Date.now();let r=(n-t.t)/1e3;if(isFinite(r)||(r=0),t.t=n,t.dt+=r,t.status===o.Running&&(t.duration+=r),!t.gpsValid)return;const e=6371008.8+t.alt,a=t.lat*Math.PI/180,s=t.lon*Math.PI/180,i=e*Math.cos(a)*Math.cos(s),d=e*Math.cos(a)*Math.sin(s),u=e*Math.sin(a),g=t.vel;if(!t.x)return t.x=i,t.y=d,t.z=u,t.v=g,t.pError=2.5*t.dop,void(t.vError=.05*t.dop);const l=i-t.x,c=d-t.y,p=u-t.z,f=g-t.v,N=Math.sqrt(l*l+c*c+p*p),h=Math.abs(f);t.pError+=t.v*t.dt,t.dt=0;const S=N+2.5*t.dop,E=h+.05*t.dop,w=t.pError/(t.pError+S)||0,x=t.vError/(t.vError+E)||0;t.x+=l*w,t.y+=c*w,t.z+=p*w,t.v+=f*x,t.pError+=(S-t.pError)*w,t.vError+=(E-t.vError)*x,t.status===o.Running&&(t.distance+=N*w,t.speed=t.distance/t.duration||0,t.cadence=60*t.steps/t.duration||0)}(t),r(t),t.gpsValid&&t.status===o.Running&&function(t){t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(t)}(i,t)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const r=n.bpm-t.hr,e=Math.abs(r)+101-n.confidence,o=t.hrError/(t.hrError+e)||0;t.hr+=r*o,t.hrError+=(e-t.hrError)*o}(t,n)),Bangle.setHRMPower(1)}(s),function(t){Bangle.on("step",()=>function(t){t.status===o.Running&&(t.steps+=1)}(t))}(s),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&e(t)}),e(t)}(s),setWatch(()=>a(s),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(t){t.status===o.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(t),t.status===o.Running?t.status=o.Paused:t.status=o.Stopped,r(t)}(s),BTN3,{repeat:!0,edge:"falling"})}(); diff --git a/apps/banglerun/src/gps.ts b/apps/banglerun/src/gps.ts index 5e6925ca9..3cab561a7 100644 --- a/apps/banglerun/src/gps.ts +++ b/apps/banglerun/src/gps.ts @@ -42,7 +42,8 @@ function readGps(state: AppState, gps: GpsEvent): void { function updateGps(state: AppState): void { const t = Date.now(); - const dt = (t - state.t) / 1000; + let dt = (t - state.t) / 1000; + if (!isFinite(dt)) dt=0; state.t = t; state.dt += dt; From 75fe5ced02b16897766d17c505450728bca66867 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 2 Feb 2021 21:19:11 +0000 Subject: [PATCH 047/148] fixed activepedom widget, only exit after lastupdate has been recorded --- apps/activepedom/widget.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/activepedom/widget.js b/apps/activepedom/widget.js index f42e18fd5..62c2d857a 100644 --- a/apps/activepedom/widget.js +++ b/apps/activepedom/widget.js @@ -141,9 +141,6 @@ function draw() { var height = 23; //width is deined globally - // not everyone likes a widget - if (setting('lineOne') == 'Hide' && setting('lineTwo') == 'Hide') - return; distance = (stepsCounted * setting('stepLength')) / 100 /1000; //distance in km @@ -158,6 +155,12 @@ stepsOutsideTime = 0; } lastUpdate = date; + + // not everyone likes a widget, having refreshed lastUpdate we can exit + if (setting('lineOne') == 'Hide' && setting('lineTwo') == 'Hide') { + settings = 0; //reset settings to save memory + return; + } g.reset(); g.clearRect(this.x, this.y, this.x+width, this.y+height); From 1dc1fde7a5e696a0854db510661e408beb2f5a21 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 2 Feb 2021 22:07:18 +0000 Subject: [PATCH 048/148] prettied up the user interface to the activepedom app, decluttered the graphs --- apps/activepedom/app.js | 82 ++++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 17 deletions(-) diff --git a/apps/activepedom/app.js b/apps/activepedom/app.js index ec9b1237f..12969a0a0 100644 --- a/apps/activepedom/app.js +++ b/apps/activepedom/app.js @@ -88,28 +88,40 @@ times = undefined; //steps - var csvFile = storage.open(filename, "r"); + csvFile = storage.open(filename, "r"); steps = getArrayFromCSV(csvFile, 1); first = first + " " + steps[0] + "/" + setting('stepGoal'); last = last + " " + steps[steps.length-1] + "/" + setting('stepGoal'); //define y-axis grid labels stepsLastEntry = steps[steps.length-1]; - if (stepsLastEntry < 1000) gridyValue = 100; - if (stepsLastEntry >= 1000 && stepsLastEntry < 10000) gridyValue = 1000; - if (stepsLastEntry > 10000) gridyValue = 5000; + // the labels on the y axis are fairly unreadable so minimise them + if (stepsLastEntry < 1000) gridyValue = 500; + if (stepsLastEntry >= 1000 && stepsLastEntry < 2000) gridyValue = 1000; + if (stepsLastEntry >= 2000 && stepsLastEntry < 5000) gridyValue = 2000; + if (stepsLastEntry >= 5000 && stepsLastEntry < 10000) gridyValue = 5000; + if (stepsLastEntry >= 10000 && stepsLastEntry < 20000) gridyValue = 10000; + if (stepsLastEntry > 20000) gridyValue = 20000; - //draw - drawMenu(); - g.drawString("First: " + first, 10, 30); - g.drawString(" Last: " + last, 10, 40); + // draw the chart + g.clear(); + g.setFont("6x8", 2); + g.setColor(1,1,1); require("graph").drawLine(g, steps, { - //title: "Steps Counted", + //title: "Steps", axes : true, gridy : gridyValue, y : 60, //offset on screen x : 5, //offset on screen }); + + // show steps and duration of the chart + g.setFont("6x8", 2); + g.setColor(0,1,0); + g.drawString("steps", 30, 24); + g.drawString(stepsLastEntry, 30, 44); + g.drawString((history/3600000) + " hrs", 30, 64); + //free memory from big variables allData = undefined; allDataFile = undefined; @@ -117,13 +129,48 @@ times = undefined; } - function drawMenu () { - g.clear(); - g.setFont("6x8", 1); - g.drawString("BTN1:Timespan | BTN2:Draw", 20, 10); - g.drawString("Timespan: " + history/1000/60/60 + " hours", 20, 20); + function getImage() { + return require("heatshrink").decompress(atob("mEwwIGDvAEDgP+ApMD/4FVEZY1FABcP8AFDn/wAod/AocB//4AoUHAokPAokf5/8AocfAoc+j5HDvgFEvEf7+AAoP4AoJCC+E/54qCsE/wYkDn+AAos8AohZDj/AAohrEp4FEs5xEuJfDgF5Aon4GgYFBGgZOBnyJD+EeYgfgj4FEh6VD4AFDh+AAIJMCBoIFFLQQtBgYFCHIIFDjA3BC4I=")); } + function drawMenu() { + var x = 100; + var y = 24; + var stps ="-"; + var y_inc = 25; + + g.clear(); + g.setColor(1,1,1); + g.drawImage(getImage(),0 ,60 , {scale:2} ); + g.setFont("6x8",2); + + // timespan + g.setColor('#7f8c8d'); + g.setFontAlign(-1,0); + g.drawString("Timespan", x, y, true); + y += y_inc; + g.setColor('#bdc3c7'); + g.drawString(history/1000/60/60 + " hrs" , x, y, true); + + // BTN1 info + y += 2*y_inc; + g.setColor('#7f8c8d'); + g.setFontAlign(-1,0); + g.drawString("BTN1", x, y, true); + y += y_inc; + g.setColor('#bdc3c7'); + g.drawString("Timespan", x, y, true); + + // BTN2 info + y += 2*y_inc; + g.setColor('#7f8c8d'); + g.setFontAlign(-1,0); + g.drawString("BTN2", x, y, true); + y += y_inc; + g.setColor('#bdc3c7'); + g.drawString("Draw", x, y, true); + } + setWatch(function() { //BTN1 switch(history) { case 3600000 : //1h @@ -140,7 +187,9 @@ }, BTN1, {edge:"rising", debounce:50, repeat:true}); setWatch(function() { //BTN2 - g.setFont("6x8", 2); + g.clear(); + g.setColor(1,1,1); + g.setFont("6x8", 3); g.drawString ("Drawing...",30,60); drawGraph(); }, BTN2, {edge:"rising", debounce:50, repeat:true}); @@ -161,5 +210,4 @@ } drawMenu(); - -})(); \ No newline at end of file +})(); From f34fa816006bfbd5047844b7c6280d2f44133920 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 3 Feb 2021 08:25:41 +0000 Subject: [PATCH 049/148] update version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 4c06827d6..99f9aa0ea 100644 --- a/apps.json +++ b/apps.json @@ -1341,7 +1341,7 @@ "name": "Active Pedometer", "shortName":"Active Pedometer", "icon": "app.png", - "version":"0.07", + "version":"0.08", "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", "tags": "outdoors,widget", "readme": "README.md", From 55a3fb08d313ff86a4e5722d6e14bd5cec86ef2b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 3 Feb 2021 10:06:00 +0000 Subject: [PATCH 050/148] add acceleration logger --- apps.json | 17 +++++ apps/accellog/ChangeLog | 1 + apps/accellog/README.md | 25 +++++++ apps/accellog/app-icon.js | 1 + apps/accellog/app.js | 132 +++++++++++++++++++++++++++++++++++ apps/accellog/app.png | Bin 0 -> 1390 bytes apps/accellog/interface.html | 107 ++++++++++++++++++++++++++++ 7 files changed, 283 insertions(+) create mode 100644 apps/accellog/ChangeLog create mode 100644 apps/accellog/README.md create mode 100644 apps/accellog/app-icon.js create mode 100644 apps/accellog/app.js create mode 100644 apps/accellog/app.png create mode 100644 apps/accellog/interface.html diff --git a/apps.json b/apps.json index 99f9aa0ea..8e2423bfd 100644 --- a/apps.json +++ b/apps.json @@ -2189,6 +2189,23 @@ {"wildcard":"accelrec.?.csv" } ] }, + { "id": "accellog", + "name": "Acceleration Logger", + "shortName":"Accel Log", + "icon": "app.png", + "version":"0.01", + "interface": "interface.html", + "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", + "tags": "outdoor", + "readme": "README.md", + "storage": [ + {"name":"accellog.app.js","url":"app.js"}, + {"name":"accellog.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"wildcard":"accellog.?.csv" } + ] + }, { "id": "cprassist", "name":"CPR Assist", diff --git a/apps/accellog/ChangeLog b/apps/accellog/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/accellog/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/accellog/README.md b/apps/accellog/README.md new file mode 100644 index 000000000..d053ecfe5 --- /dev/null +++ b/apps/accellog/README.md @@ -0,0 +1,25 @@ +# Acceleration Logger + +Logs XYZ acceleration data (at the normal 12.5Hz) to a CSV file that can be downloaded to your PC. + + + +## 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 diff --git a/apps/accellog/app-icon.js b/apps/accellog/app-icon.js new file mode 100644 index 000000000..994ffd076 --- /dev/null +++ b/apps/accellog/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("oFAwhC/AH4A2xAedhGIwA+dAAI+dAAJAcEAJ/fD/4f5hAJIYSo6JIihaKxBATxAACC4YnBAAQ+TD7o/CFRJfTP5a/eb6pEOD/7JFwczAA0ybgwfUkUjD4QaDD6syiMSD4ZABCIa8JD547BCIY/ZHQQ+LD6Z/cHZYf/f6E4D6uCD4gACD6wgBkQACBAYfWABYf/D/4fPwf/ABgf/D6czABBf/P/5f/P/5f/D+WIABwfuAH4A/ADo=")) diff --git a/apps/accellog/app.js b/apps/accellog/app.js new file mode 100644 index 000000000..cd52309ab --- /dev/null +++ b/apps/accellog/app.js @@ -0,0 +1,132 @@ +var fileNumber = 0; +var MAXLOGS = 9; + +function getFileName(n) { + return "accellog."+n+".csv"; +} + +function showMenu() { + var menu = { + "" : { title : "Accel Logger" }, + "File No" : { + value : fileNumber, + min : 0, + max : MAXLOGS, + onchange : v => { fileNumber=v; } + }, + "Start" : function() { + E.showMenu(); + startRecord(); + }, + "View Logs" : function() { + viewLogs(); + }, + "Exit" : function() { + load(); + }, + }; + E.showMenu(menu); +} + +function viewLog(n) { + E.showMessage("Loading..."); + var f = require("Storage").open(getFileName(n), "r"); + var records = 0, l = "", ll=""; + while (l=f.readLine()) {records++;ll=l}; + var length = 0; + if (ll) length = (ll.split(",")[0]|0)/1000; + + var menu = { + "" : { title : "Log "+n } + }; + menu[records+" Records"] = ""; + menu[length+" Seconds"] = ""; + menu["DELETE"] = function() { + E.showPrompt("Delete Log "+n).then(ok=>{ + if (ok) { + E.showMessage("Erasing..."); + f.erase(); + viewLogs(); + } else viewLog(n); + }); + }; + menu["< Back"] = function() { + viewLogs(); + }; + + E.showMenu(menu); +} + +function viewLogs() { + var menu = { + "" : { title : "Logs" } + }; + + var hadLogs = false; + for (var i=0;i<=MAXLOGS;i++) { + var f = require("Storage").open(getFileName(i), "r"); + if (f.readLine()!==undefined) { + (function(i) { + menu["Log "+i] = () => viewLog(i); + })(i); + hadLogs = true; + } + } + if (!hadLogs) + menu["No Logs Found"] = function(){}; + menu["< Back"] = function() { showMenu(); }; + E.showMenu(menu); +} + +function startRecord(force) { + if (!force) { + // check for existing file + var f = require("Storage").open(getFileName(fileNumber), "r"); + if (f.readLine()!==undefined) + return E.showPrompt("Overwrite Log "+fileNumber+"?").then(ok=>{ + if (ok) startRecord(true); else showMenu(); + }); + } + // display + g.clear(1); + Bangle.drawWidgets(); + var w = g.getWidth(); + var h = g.getHeight(); + g.setColor("#ff0000").fillRect(0,h-48,w,h); + g.setColor("#ffffff").setFont("6x8",2).setFontAlign(0,0).drawString("RECORDING", w/2,h-24); + g.setFont("6x8").drawString("Samples:",w/2,h/3 - 20); + g.setFont("6x8").drawString("Time:",w/2,h*2/3 - 20); + g.setFont("6x8",2).setFontAlign(0,0,1).drawString("STOP",w-10,h/2); + + // now start writing + f = require("Storage").open(getFileName(fileNumber), "w"); + f.write("Time (ms),X,Y,Z\n"); + var start = getTime(); + var sampleCount = 0; + + function accelHandler(accel) { + var t = getTime()-start; + f.write([ + t*1000, + accel.x*8192, + accel.y*8192, + accel.z*8192].map(n=>Math.round(n)).join(",")+"\n"); + + sampleCount++; + g.reset().setFont("6x8",2).setFontAlign(0,0); + g.drawString(" "+sampleCount+" ",w/2,h/3,true); + g.drawString(" "+Math.round(t)+"s ",w/2,h*2/3,true); + } + + Bangle.setPollInterval(80); // 12.5 Hz + Bangle.on('accel', accelHandler); + setWatch(()=>{ + Bangle.removeListener('accel', accelHandler); + showMenu(); + }, BTN2); +} + + +Bangle.loadWidgets(); +Bangle.drawWidgets(); +showMenu(); diff --git a/apps/accellog/app.png b/apps/accellog/app.png new file mode 100644 index 0000000000000000000000000000000000000000..4908b2473e62ffa4c32ae7f0d4da76e464d5a3f1 GIT binary patch literal 1390 zcmV-!1(EuRP)0grfO5#GjYx7w0s)m!4>V510jWK; zPzi(t98gi?B)5o4K_D&^32{WCNCi$63ZgXBA!-torr7DO6UW}&;Sf7=Vtc)tjJ<2& zPqLJqnSJx-&&-=QV*@Q(v}n;p^v$MwS=!@R8ml+Tj5cf-{BKG^`0LqLu z3`zLVstqCJBNN;hG0Dr8#{9yF-DF8{;A7n=Zgm_XUs|GK5i-0q*`S5ev?yBn8xD!uNBOi)Rv?*q6@2${P- z9(wbr_F~iOD`Z#5pF}A;diQ*%TCJ@ow!vgvz5?I_#%5~{-gCsRZ@y?%uOuGdP!g)H zB-C}Qc74~?fq|*@kexnV-v&!rnhgJJRZj`w2?dWDelJeS3wHY~GxWmjYLGLuE&$MV zP1dt|Sz7sQ#5^7#rf9bl(dWxVf@OgUe`?ah)vPZI04bfUEWX`eF;LZ$G66W6IYT*e z69CM-0eve~_R?T~07}@&5jAF;7(Oy}4T70W28)aL z_CD!UxtK*L=unWCz8jcYu(ftsQP&udOy0-mb8~yoFO7`i%-OS5+n0#2Hxpvh>RW{3 zQlY^Ug{EO8q5f5P>((>t^7$XG68$hfdSV+a<={+M8kc7Q%mX+Hpg23Y!t#gN`&lC zhzZPSsu@rZEN1{AmG#M+_KbIT_u%z6&h0&Sb#?8l&zbHYMlA*4{Xvk70BY>tWp1zL za555rP{aRlIE?2`pRQQkGrwv&ETJ_dM(|9uc_3E;K^Zc{S`1brNY z2Fax5%!UU>O92MEgSa;KWW%nG?>)-lwXc`aNDVCix4p;2hTfa^cZd+U#wJIO&H_8R zJaofg>Oepe!Ex?|B1ZzOZTyS0%J#~xzvn5m1R!rZ~ls0Deh?zv54gnitC?d@0R#&#%SuW*&Nj&%>58;MU(6jNVv+RO|Ye w5f3wZLyy9MjU}+Lb?7f%TeN7=qJ`J_4^+#d`2s8izyJUM07*qoM6N<$f=!`=IsgCw literal 0 HcmV?d00001 diff --git a/apps/accellog/interface.html b/apps/accellog/interface.html new file mode 100644 index 000000000..9f50c3953 --- /dev/null +++ b/apps/accellog/interface.html @@ -0,0 +1,107 @@ + + + + + +
+ + + + + From 01214f6b1b6bda31b2d7699e9f6993bea60149a0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 3 Feb 2021 10:06:05 +0000 Subject: [PATCH 051/148] docs --- apps/accelrec/README.md | 5 +++-- apps/activepedom/ChangeLog | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/accelrec/README.md b/apps/accelrec/README.md index 40d981b6a..c9d91df38 100644 --- a/apps/accelrec/README.md +++ b/apps/accelrec/README.md @@ -1,7 +1,8 @@ # Acceleration Recorder -This app records a short period of acceleration data from the accelerometer -and +This app records a short period of acceleration data from the accelerometer at +100Hz (starting when acceleration happens) and graphs it, working out max acceleration +and max velocity. Data can also be downloaded to your PC. ## Usage diff --git a/apps/activepedom/ChangeLog b/apps/activepedom/ChangeLog index fd2b2c2e2..7926ca3e1 100644 --- a/apps/activepedom/ChangeLog +++ b/apps/activepedom/ChangeLog @@ -5,3 +5,4 @@ 0.05: Fix default step/distance display if it hasn't been set up first 0.06: Added WIDGETS.activepedom.getSteps() 0.07: Added settings to be able to hide line1 and line2 so there is no visible widget +0.08: Fixed zero steps issue caused by 0.07 From 3c72f3674ab9b6e61cfdb15823c5a9b31914e937 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 3 Feb 2021 10:11:47 +0000 Subject: [PATCH 052/148] docs --- apps/accellog/README.md | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/apps/accellog/README.md b/apps/accellog/README.md index d053ecfe5..56f74ae6c 100644 --- a/apps/accellog/README.md +++ b/apps/accellog/README.md @@ -2,24 +2,18 @@ Logs XYZ acceleration data (at the normal 12.5Hz) to a CSV file that can be downloaded to your PC. - - ## Usage -Describe how to use it +* Run the app 'Accel Log' from Bangle.js menu +* Optionally choose a file number if you want to record to multiple different files. +* Choose `Start` +* Acceleration data will now be recording +* When you're done, press `BTN2` -## Features +## Downloading Data -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 +* Go to the Bangle.js App Loader +* Connect to your Bangle +* Under `My Apps` look for `Acceleration Logger` +* You'll see a download arrow next to it - click that +* You can now choose to Save or Delete each track you have recorded From 440af3ab054738041ef4a7a02aa68e341adb982d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 3 Feb 2021 10:27:48 +0000 Subject: [PATCH 053/148] fix lint warning --- apps/accellog/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/accellog/app.js b/apps/accellog/app.js index cd52309ab..045b9eba0 100644 --- a/apps/accellog/app.js +++ b/apps/accellog/app.js @@ -32,7 +32,7 @@ function viewLog(n) { E.showMessage("Loading..."); var f = require("Storage").open(getFileName(n), "r"); var records = 0, l = "", ll=""; - while (l=f.readLine()) {records++;ll=l}; + while ((l=f.readLine())!==undefined) {records++;ll=l;} var length = 0; if (ll) length = (ll.split(",")[0]|0)/1000; From 016ac760b9139e57838deeba22fc2d43ca6bb8fd Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Mon, 1 Feb 2021 16:05:41 +0100 Subject: [PATCH 054/148] modify how to load the constellations --- apps.json | 1 + apps/planetarium/planetarium.app.js | 120 ++++++++++++++----------- apps/planetarium/planetarium.const.csv | 24 +++++ 3 files changed, 95 insertions(+), 50 deletions(-) create mode 100644 apps/planetarium/planetarium.const.csv diff --git a/apps.json b/apps.json index 8e2423bfd..3e982e174 100644 --- a/apps.json +++ b/apps.json @@ -2720,6 +2720,7 @@ "storage": [ {"name":"planetarium.app.js","url":"planetarium.app.js"}, {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, + {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, {"name":"planetarium.settings.js","url":"settings.js"}, {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} ], diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 925a2c0dc..9d90e6e1e 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -35,14 +35,56 @@ function siderealTime(julianDay) return toRadians(280.46061837 + 360.98564736629 * (julianDay - 2451545.0) + 0.000387933 * T * T - T * T * T / 38710000); } -function drawStars(lat,lon,date){ +/* +* Draws a single star in the sky. +* starPositions is a dictionary that gets modified and it is used later for ploting the constelations +*/ +function drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions){ + var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); + var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; + var H = siderealTime(julianDay) - longitude - ascen; + //Compute altitude + var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H)); + if(alt >= 0) + { + //Compute azimuth + var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); + var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); + var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); + starPositions[starNumber] = [x,y]; + var magnitude = starMag<1?2:1; + //Stars between 1.5 and 4 magnitude should get a different colour + var col=1; + if (starMag<=1.5) + col=1; + else if (starMag>1.5 && starMag<2) + col=0.9; + else if (starMag>=2 && starMag<3) + col=0.7; + else if (starMag>=3 && starMag<3.5) + col=0.5; + else + col=0.3; + + g.setColor(col,col,col); + g.fillCircle(x, y, magnitude); + if (starMag<1 && settings.starnames) + g.drawString(starInfo[3],x,y+2); + g.flip(); + + } +} + + + +function plotSky(lat,lon,date){ var longitude = toRadians(-lon); var latitude = toRadians(lat); var julianDay = toJulianDay(date.getFullYear(), date.getMonth()+1,date.getDate(), date.getHours() + date.getTimezoneOffset() / 60, date.getMinutes(), date.getSeconds()); - var size = 240; + storage = require('Storage'); f=storage.read("planetarium.data.csv","r"); @@ -63,64 +105,40 @@ function drawStars(lat,lon,date){ while (lineend>=0) { line = f.substring(linestart,lineend); starNumber++; - //console.log(line); //Process the star starInfo = line.split(','); //console.log(starInfo[0]); starRA = parseFloat(starInfo[0]); starDE = parseFloat(starInfo[1]); starMag = parseFloat(starInfo[2]); - //var start = new Date().getTime(); - var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); - var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; - var H = siderealTime(julianDay) - longitude - ascen; - //Compute altitude - var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H)); - if(alt >= 0) - { - //Compute azimuth - var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); - var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); - var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); - starPositions[starNumber] = [x,y]; - var magnitude = starMag<1?2:1; - //Stars between 1.5 and 4 magnitude should get a different colour - var col=1; - if (starMag<=1.5) - col=1; - else if (starMag>1.5 && starMag<2) - col=0.9; - else if (starMag>=2 && starMag<3) - col=0.7; - else if (starMag>=3 && starMag<3.5) - col=0.5; - else - col=0.3; - - g.setColor(col,col,col); - g.fillCircle(x, y, magnitude); - if (starMag<1 && settings.starnames) - g.drawString(starInfo[3],x,y+2); - g.flip(); - - } + drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions); linestart = lineend+1; lineend = f.indexOf("\n",linestart); } if (settings.constellations){ - //Each star has a number (the position on the file (line number)). These are the lines - //joining each star in the constellations. - constelations=[[[7,68],[10,53],[53,56],[28,68],"Orion"],[[13,172],[13,340],[293,340],[29,293],"Taurus"], - [[155,8],"Canis Menor"],[[36,81],[87,81],[235,87],[33,235],[33,75],[75,40],[36,235],"Ursa Major"],[[67,91],[74,67],[91,110],[110,252],"Cassiopeia"],[[23,166],[16,294],[294,44],[166,149],[230,149],[16,23],"Gemini"],[[88,218],[215,292],[218,292],[245,88],[292,245],[215,218],"Cepheus"],[[150,62],[150,175],[175,35],[403,62],[487,158],[384,487],[384,158],[35,158],[487,403],"Perseus"],[[19,65],[65,90],[65,147],[466,65],[466,189],[147,401],[213,90],"Cygnus"],[[6,42],[168,6],[168,113],[113,29],[104,29],[104,42],"Auriga"],[[1,47],[1,37],[37,22],[22,178],[37,89],"Can Maior"],[[3,118],[118,279],[279,286],[286,180],[180,316],[316,3],"Bootes"]]; - g.setColor(0,255,0); - for (i=0;i=0) { + linenum++; + //In this file, each constelation are two lines. The first one the name, the second the lines joining stars + var name = fc.substring(linestart,lineend); + linestart = lineend+1; + lineend = fc.indexOf("\n",linestart); + var lines = fc.substring(linestart,lineend).split(','); + linestart = lineend+1; + lineend = fc.indexOf("\n",linestart); + g.setColor(0,255,0); + if (linenum>11) + break; constelationShowing=false; - for (j=0;j Date: Mon, 1 Feb 2021 16:19:36 +0100 Subject: [PATCH 055/148] fixing a small bug --- apps/planetarium/planetarium.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 9d90e6e1e..aae309941 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -150,7 +150,7 @@ function plotSky(lat,lon,date){ g.flip(); } //Write the name - if (constelationShowing && true) + if (constelationShowing && settings.consnames) g.drawString(name,positionStar2[0]+10,positionStar2[1]); } } From ef5010925a745890a3b46f55b26470f2bc05dd79 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Mon, 1 Feb 2021 16:26:24 +0100 Subject: [PATCH 056/148] updating readme --- apps/planetarium/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 56dc66be9..fbeebe89c 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -16,4 +16,11 @@ The planetarium plots the stars as if you are looking to the sky (with your watc ## Improvements I plan to add more constellations as soon as I have time. I am adding the constellations that I know of, but the plan is to add all the main ones (at least for North Hemisphere). -Please note that the watch hardware is limited and computing the stars positions is a quite intensive task for this little processor. This is why it plots only stars and no planets or the moon. For plotting the planets, storage will be a limiting factor as well as computing the position for planets needs more initial data compared with stars. \ No newline at end of file +Please note that the watch hardware is limited and computing the stars positions is a quite intensive task for this little processor. This is why it plots only stars and no planets or the moon. For plotting the planets, storage will be a limiting factor as well as computing the position for planets needs more initial data compared with stars. + +## Do you want to contribute? +Maybe you want to add some more constellations to the planetarium. As you can see I didn't cover constellations in the south hemisphere. How to do it? It is a bit tedious but it can be done and you will learn the constellations pretty well at the end of it. Steps: +- Open the file `plantearium.data.csv`. There you have the 500 stars that we have in the planetarium. The number of each star is the line number. For isntance for Sirius, the star number will be 1. +- Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). +- Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). +- Do not forget to add a break line after the last constellation. From 8f49cf7a48ae918f6ea4dc6dadef41526efbab36 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Mon, 1 Feb 2021 16:28:40 +0100 Subject: [PATCH 057/148] updating readme --- apps/planetarium/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index fbeebe89c..030d25779 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -24,3 +24,4 @@ Maybe you want to add some more constellations to the planetarium. As you can se - Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). - Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). - Do not forget to add a break line after the last constellation. +- Upload the new `planetarium.const.csv` to your bangle (or emualator) and test it out. From c9c2dbb2eacf2bb4d4e77f7d16957a1ffe632391 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Wed, 3 Feb 2021 15:30:13 +0100 Subject: [PATCH 058/148] adding extra stars to constellations --- apps.json | 1 + apps/planetarium/README.md | 4 +- apps/planetarium/planetarium.app.js | 36 +- apps/planetarium/planetarium.const.csv | 2 + apps/planetarium/planetarium.extra.csv | 2 + .../starinfo/planetarium.stars.csv | 9095 ++++++++++++++++ .../planetarium/starinfo/process_star_file.py | 38 + apps/planetarium/starinfo/starsoriginal.csv | 9096 +++++++++++++++++ 8 files changed, 18262 insertions(+), 12 deletions(-) create mode 100644 apps/planetarium/planetarium.extra.csv create mode 100644 apps/planetarium/starinfo/planetarium.stars.csv create mode 100644 apps/planetarium/starinfo/process_star_file.py create mode 100644 apps/planetarium/starinfo/starsoriginal.csv diff --git a/apps.json b/apps.json index 3e982e174..e70d5cec3 100644 --- a/apps.json +++ b/apps.json @@ -2721,6 +2721,7 @@ {"name":"planetarium.app.js","url":"planetarium.app.js"}, {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, + {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, {"name":"planetarium.settings.js","url":"settings.js"}, {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} ], diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 030d25779..e922c55ac 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -24,4 +24,6 @@ Maybe you want to add some more constellations to the planetarium. As you can se - Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). - Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). - Do not forget to add a break line after the last constellation. -- Upload the new `planetarium.const.csv` to your bangle (or emualator) and test it out. +- Upload the new `planetarium.const.csv` to your bangle (or emulator) and test it out. + +What is a constellation star is not in the 500 star list in `planetarium.data.csv`? If you need another star to draw the constellation you can find that star in the full star list (`starinfo/planetarium.stars.csv`) and put it in `planetarium.extra.csv`. That stars will be loaded only when constellations are shown. In order to refer to these extra stars in the `planetarium.const.csv` you have to use the code `e_linenumber`, in order to differenciate them from the stars in the normal file. For instance, to refer to the first star in the file `planetarium.extra.csv`, you will refer it as `e_1`. Do not forget to add an extra line at the end as in the other files. diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index aae309941..4763efb82 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -39,7 +39,10 @@ function siderealTime(julianDay) * Draws a single star in the sky. * starPositions is a dictionary that gets modified and it is used later for ploting the constelations */ -function drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions){ +function drawStar(zeta,theta,z,julianDay,latitude,longitude,starInfo,starNumber,starPositions){ + let starRA = parseFloat(starInfo[0]); + let starDE = parseFloat(starInfo[1]); + let starMag = parseFloat(starInfo[2]); var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; var H = siderealTime(julianDay) - longitude - ascen; @@ -107,17 +110,28 @@ function plotSky(lat,lon,date){ starNumber++; //Process the star starInfo = line.split(','); - //console.log(starInfo[0]); - starRA = parseFloat(starInfo[0]); - starDE = parseFloat(starInfo[1]); - starMag = parseFloat(starInfo[2]); - drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions); + drawStar(zeta,theta,z,julianDay,latitude,longitude,starInfo,starNumber,starPositions); linestart = lineend+1; lineend = f.indexOf("\n",linestart); } if (settings.constellations){ + //First plot the extra stars for the constellations + fe=storage.read("planetarium.extra.csv","r"); + linenum=linestart = 0; + lineend = fe.indexOf("\n"); + let starNumber = 0; + while (lineend>=0) { + line = fe.substring(linestart,lineend); + starNumber++; + starInfo = line.split(','); + drawStar(zeta,theta,z,julianDay,latitude,longitude,starInfo,"e_"+starNumber,starPositions); + linestart = lineend+1; + lineend = fe.indexOf("\n",linestart); + } + //End of ploting extra stars + linenum=linestart = 0; fc=storage.read("planetarium.const.csv","r"); lineend = fc.indexOf("\n"); @@ -131,14 +145,13 @@ function plotSky(lat,lon,date){ linestart = lineend+1; lineend = fc.indexOf("\n",linestart); g.setColor(0,255,0); - if (linenum>11) - break; + constelationShowing=false; for (j=0;j Date: Wed, 3 Feb 2021 23:55:42 +0100 Subject: [PATCH 059/148] adding leo --- apps/planetarium/planetarium.const.csv | 8 +++++--- apps/planetarium/planetarium.data.csv | 2 +- apps/planetarium/planetarium.extra.csv | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/planetarium/planetarium.const.csv b/apps/planetarium/planetarium.const.csv index 8a4b0a980..c3c9104d9 100644 --- a/apps/planetarium/planetarium.const.csv +++ b/apps/planetarium/planetarium.const.csv @@ -1,7 +1,7 @@ Orion 7 68,10 53,53 56,28 68 Taurus -13 172,13 340,293 340,29 293 +13 172,13 340,293 340,29 293,340 276 Canis Menor 155 8 Ursa Major @@ -9,11 +9,11 @@ Ursa Major Cassiopeia 67 91,74 67,91 110,110 252 Gemini -23 166,16 294,294,44,166 149,230 149,16 23 +23 166,16 294,294 44,166 149,230 149,16 23 Cepheus 88 218,215 292,218 292,245 88,292 245,215 218 Perseus -150 62,150 175,175 35,403 62,487 158,384 487,384 158,35 158,487 403 +150 62,150 175,175 35,403 62,487 158,384 487,384 158,35 158,487 e_3,e_3 403 Cygnus 19 65,65 90,65 147,466 65,466 189,147 401,213 90 Auriga @@ -24,3 +24,5 @@ Bootes 3 118,118 279,279 286,286 180,180 316,316 3 Lupus 140 210,322 140,322 410,410 98,98 234,234 210,98 302,302 362,234 e_1,234 e_2 +Leo +21 291,102 270,102 291,96 63,63 241,241 96,96 102,21 241,457 270,457 167 diff --git a/apps/planetarium/planetarium.data.csv b/apps/planetarium/planetarium.data.csv index ce509695b..a576d37af 100644 --- a/apps/planetarium/planetarium.data.csv +++ b/apps/planetarium/planetarium.data.csv @@ -421,7 +421,7 @@ 3.874,-1.380,3.8,AL APS 4.745,0.502,3.8,OK HER 5.184,1.226,3.8,EP DRA -1.172,0.279,43.8,TH1 TAU +1.172,0.279,3.8,TH1 TAU 2.272,-0.814,3.8,_ 2.335,-1.058,3.8,_ 2.781,-0.842,3.8,_ diff --git a/apps/planetarium/planetarium.extra.csv b/apps/planetarium/planetarium.extra.csv index f05f71d3e..bd6a3d318 100644 --- a/apps/planetarium/planetarium.extra.csv +++ b/apps/planetarium/planetarium.extra.csv @@ -1,2 +1,3 @@ 1.394,-0.230,4.3,LA LEP 1.367,-0.226,4.4,KA LEP +0.825,0.866,4.0,JO PER From d48a3392581e389a7f3c22de75cd2758bf683f5b Mon Sep 17 00:00:00 2001 From: Sam McAlilly <38969506+smcalilly@users.noreply.github.com> Date: Wed, 3 Feb 2021 22:17:44 -0600 Subject: [PATCH 060/148] Create app.js --- apps/obliquestrategies/app.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 apps/obliquestrategies/app.js diff --git a/apps/obliquestrategies/app.js b/apps/obliquestrategies/app.js new file mode 100644 index 000000000..515a6e778 --- /dev/null +++ b/apps/obliquestrategies/app.js @@ -0,0 +1,29 @@ +const strategies = ['Abandon normal instruments', 'Accept advice', 'Accretion', 'A line has two sides', 'Allow an easement (an easement is the abandonment of a stricture)', 'Are there sections? Consider transitions', 'Ask people to work against their better judgement', 'Ask your body', 'Assemble some of the instruments in a group and treat the group', 'Balance the consistency principle with the inconsistency principle', 'Be dirty', 'Breathe more deeply', 'Bridges -build -burn', 'Cascades', 'Change instrument roles', 'Change nothing and continue with immaculate consistency', "Children's voices -speaking -singing", 'Cluster analysis', 'Consider different fading systems', 'Consult other sources -promising -unpromising', 'Convert a melodic element into a rhythmic element', 'Courage!', 'Cut a vital connection', 'Decorate, decorate', "Define an area as `safe' and use it as an anchor", 'Destroy -nothing -the most important thing', 'Discard an axiom', 'Disconnect from desire', 'Discover the recipes you are using and abandon them', 'Distorting time', 'Do nothing for as long as possible', "Don't be afraid of things because they're easy to do", "Don't be frightened of cliches", "Don't be frightened to display your talents", "Don't break the silence", "Don't stress one thing more than another", 'Do something boring', 'Do the washing up', 'Do the words need changing?', 'Do we need holes?', 'Emphasize differences', 'Emphasize repetitions', 'Emphasize the flaws', 'Faced with a choice, do both (given by Dieter Rot)', 'Feedback recordings into an acoustic situation', 'Fill every beat with something', 'Get your neck massaged', 'Ghost echoes', 'Give the game away', 'Give way to your worst impulse', 'Go slowly all the way round the outside', 'Honor thy error as a hidden intention', 'How would you have done it?', 'Humanize something free of error', 'Imagine the music as a moving chain or caterpillar', 'Imagine the music as a set of disconnected events', 'Infinitesimal gradations', 'Intentions -credibility of -nobility of -humility of', 'Into the impossible', 'Is it finished?', 'Is there something missing?', 'Is the tuning appropriate?', 'Just carry on', 'Left channel, right channel, centre channel', 'Listen in total darkness, or in a very large room, very quietly', 'Listen to the quiet voice', 'Look at a very small object, look at its centre', 'Look at the order in which you do things', 'Look closely at the most embarrassing details and amplify them', 'Lowest common denominator check -single beat -single note -single', 'riff', 'Make a blank valuable by putting it in an exquisite frame', 'Make an exhaustive list of everything you might do and do the last', 'thing on the list', 'Make a sudden, destructive unpredictable action; incorporate', 'Mechanicalize something idiosyncratic', 'Mute and continue', 'Only one element of each kind', '(Organic) machinery', 'Overtly resist change', 'Put in earplugs', 'Remember those quiet evenings', 'Remove ambiguities and convert to specifics', 'Remove specifics and convert to ambiguities', 'Repetition is a form of change', 'Reverse', 'Short circuit (example: a man eating peas with the idea that they will', 'improve his virility shovels them straight into his lap)', 'Shut the door and listen from outside', 'Simple subtraction', 'Spectrum analysis', 'Take a break', 'Take away the elements in order of apparent non-importance', 'Tape your mouth (given by Ritva Saarikko)', 'The inconsistency principle', 'The tape is now the music', 'Think of the radio', 'Tidy up', 'Trust in the you of now', 'Turn it upside down', 'Twist the spine', 'Use an old idea', 'Use an unacceptable color', 'Use fewer notes', 'Use filters', 'Use "unqualified" people', 'Water', 'What are you really thinking about just now? Incorporate', 'What is the reality of the situation?', 'What mistakes did you make last time?', 'What would your closest friend do?', "What wouldn't you do?", 'Work at a different speed', 'You are an engineer', 'You can only make one dot at a time', "You don't have to be ashamed of using your own ideas", '[blank white card]'] + +const spentStrategies = [] + +function chooseObliqueness() { + const strategy = strategies[Math.floor(Math.random() * strategies.length)]; + spentStrategies.push(strategy); + return strategy +} + +// app intro +E.showMessage('oblique strategies\n\ncopied from\nbrian eno\n\nclick btn2'); + +setWatch(() => { + // beep! + Bangle.beep(); + + // get the strategy + const strategy = chooseObliqueness(); + + // configure font + g.setFontAlign(0,0); + + // show the oblique strategy + E.showMessage(strategy.replace(/\s/g, '\n')); + + // clear the screen + setTimeout(() => g.clear(), 10000); +}, BTN2, { repeat: true }); From 57cd1176255025720ac588fe2bf33cd9270e5b41 Mon Sep 17 00:00:00 2001 From: Sam McAlilly <38969506+smcalilly@users.noreply.github.com> Date: Wed, 3 Feb 2021 22:20:04 -0600 Subject: [PATCH 061/148] Create app-icon.js --- apps/obliquestrategies/app-icon.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/obliquestrategies/app-icon.js diff --git a/apps/obliquestrategies/app-icon.js b/apps/obliquestrategies/app-icon.js new file mode 100644 index 000000000..c513aa80b --- /dev/null +++ b/apps/obliquestrategies/app-icon.js @@ -0,0 +1,2 @@ +require("heatshrink").decompress(atob("/4Ac+4CB8EAj4FC+AFK/AFH+YFE/YFB/gFB+IFHEYXwg41DAoPD7AFCh0AAoZoBAoovCAoMIAodAjF8AoXMvgFC/HP/k8AoXHAof/+f83gFC+H8hAFC/F8jALDjkcOIXwhgpCBYMPMoRdBh/MAocAnAFC4AFDCgMAFIX+AoILCAoRfCCIMDAoqPCDoQABL4IFGhgFIDQJYBAo7/VAAI=")) +} From b9e5be7004e52e7590cf9eeab321f946dd71a9bf Mon Sep 17 00:00:00 2001 From: Sam McAlilly <38969506+smcalilly@users.noreply.github.com> Date: Wed, 3 Feb 2021 22:23:17 -0600 Subject: [PATCH 062/148] Update apps.json --- apps.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps.json b/apps.json index 8e2423bfd..e448fb3f0 100644 --- a/apps.json +++ b/apps.json @@ -2739,6 +2739,17 @@ {"name":"tapelaunch.app.js","url":"app.js"}, {"name":"tapelaunch.img","url":"icon.js","evaluate":true} ] +}, +{ "id": "oblique", + "name": "Oblique Strategies", + "icon": "eno.png", + "version":"0.01", + "description": "Oblique Strategies for creative vigor. Copied from Brian Eno.", + "tags": "tool", + "storage": [ + {"name":"obliquestrategies.app.js","url":"app.js"}, + {"name":"eno.img","url":"app-icon.js","evaluate":true} + ] } ] From f5444623280c4060fec3fbe58b27816b3964cab9 Mon Sep 17 00:00:00 2001 From: Sam McAlilly <38969506+smcalilly@users.noreply.github.com> Date: Wed, 3 Feb 2021 22:25:21 -0600 Subject: [PATCH 063/148] Add files via upload --- apps/obliquestrategies/eno.png | Bin 0 -> 3601 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/obliquestrategies/eno.png diff --git a/apps/obliquestrategies/eno.png b/apps/obliquestrategies/eno.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3418cc9a5eb99e2c666983c5aa4b9335caa8a8 GIT binary patch literal 3601 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 Date: Wed, 3 Feb 2021 22:30:18 -0600 Subject: [PATCH 064/148] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e448fb3f0..11472d964 100644 --- a/apps.json +++ b/apps.json @@ -2740,7 +2740,7 @@ {"name":"tapelaunch.img","url":"icon.js","evaluate":true} ] }, -{ "id": "oblique", +{ "id": "obliquestrategies", "name": "Oblique Strategies", "icon": "eno.png", "version":"0.01", From 81bd42f14bd83038f342b37c4ff920156d6099ea Mon Sep 17 00:00:00 2001 From: Sam McAlilly <38969506+smcalilly@users.noreply.github.com> Date: Wed, 3 Feb 2021 22:34:10 -0600 Subject: [PATCH 065/148] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 11472d964..5699c3537 100644 --- a/apps.json +++ b/apps.json @@ -2744,7 +2744,7 @@ "name": "Oblique Strategies", "icon": "eno.png", "version":"0.01", - "description": "Oblique Strategies for creative vigor. Copied from Brian Eno.", + "description": "Oblique Strategies for creativity. Copied from Brian Eno.", "tags": "tool", "storage": [ {"name":"obliquestrategies.app.js","url":"app.js"}, From 9938b25a2428ac41c21939ae3da6a5abaf87475b Mon Sep 17 00:00:00 2001 From: Sam McAlilly Date: Wed, 3 Feb 2021 22:56:23 -0600 Subject: [PATCH 066/148] add oblique strategies to the app loader --- apps.json | 8 ++++---- apps/{obliquestrategies => oblique}/app.js | 0 apps/{obliquestrategies => oblique}/eno.png | Bin .../app-icon.js => oblique/icon.js} | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) rename apps/{obliquestrategies => oblique}/app.js (100%) rename apps/{obliquestrategies => oblique}/eno.png (100%) rename apps/{obliquestrategies/app-icon.js => oblique/icon.js} (74%) diff --git a/apps.json b/apps.json index 5699c3537..04c8b1580 100644 --- a/apps.json +++ b/apps.json @@ -2740,15 +2740,15 @@ {"name":"tapelaunch.img","url":"icon.js","evaluate":true} ] }, -{ "id": "obliquestrategies", +{ "id": "oblique", "name": "Oblique Strategies", "icon": "eno.png", - "version":"0.01", + "version": "0.01", "description": "Oblique Strategies for creativity. Copied from Brian Eno.", "tags": "tool", "storage": [ - {"name":"obliquestrategies.app.js","url":"app.js"}, - {"name":"eno.img","url":"app-icon.js","evaluate":true} + {"name":"oblique.app.js","url":"app.js"}, + {"name":"eno.img","url":"icon.js","evaluate":true} ] } diff --git a/apps/obliquestrategies/app.js b/apps/oblique/app.js similarity index 100% rename from apps/obliquestrategies/app.js rename to apps/oblique/app.js diff --git a/apps/obliquestrategies/eno.png b/apps/oblique/eno.png similarity index 100% rename from apps/obliquestrategies/eno.png rename to apps/oblique/eno.png diff --git a/apps/obliquestrategies/app-icon.js b/apps/oblique/icon.js similarity index 74% rename from apps/obliquestrategies/app-icon.js rename to apps/oblique/icon.js index c513aa80b..747879509 100644 --- a/apps/obliquestrategies/app-icon.js +++ b/apps/oblique/icon.js @@ -1,2 +1 @@ -require("heatshrink").decompress(atob("/4Ac+4CB8EAj4FC+AFK/AFH+YFE/YFB/gFB+IFHEYXwg41DAoPD7AFCh0AAoZoBAoovCAoMIAodAjF8AoXMvgFC/HP/k8AoXHAof/+f83gFC+H8hAFC/F8jALDjkcOIXwhgpCBYMPMoRdBh/MAocAnAFC4AFDCgMAFIX+AoILCAoRfCCIMDAoqPCDoQABL4IFGhgFIDQJYBAo7/VAAI=")) -} +require("heatshrink").decompress(atob("/4Ac+4CB8EAj4FC+AFK/AFH+YFE/YFB/gFB+IFHEYXwg41DAoPD7AFCh0AAoZoBAoovCAoMIAodAjF8AoXMvgFC/HP/k8AoXHAof/+f83gFC+H8hAFC/F8jALDjkcOIXwhgpCBYMPMoRdBh/MAocAnAFC4AFDCgMAFIX+AoILCAoRfCCIMDAoqPCDoQABL4IFGhgFIDQJYBAo7/VAAI=")) \ No newline at end of file From b1ed54ef86ba00dc0f4dcad06fc58cd6c361a80e Mon Sep 17 00:00:00 2001 From: Sam McAlilly Date: Wed, 3 Feb 2021 23:01:56 -0600 Subject: [PATCH 067/148] change oblique image --- apps/oblique/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/oblique/icon.js b/apps/oblique/icon.js index 747879509..4410b1581 100644 --- a/apps/oblique/icon.js +++ b/apps/oblique/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("/4Ac+4CB8EAj4FC+AFK/AFH+YFE/YFB/gFB+IFHEYXwg41DAoPD7AFCh0AAoZoBAoovCAoMIAodAjF8AoXMvgFC/HP/k8AoXHAof/+f83gFC+H8hAFC/F8jALDjkcOIXwhgpCBYMPMoRdBh/MAocAnAFC4AFDCgMAFIX+AoILCAoRfCCIMDAoqPCDoQABL4IFGhgFIDQJYBAo7/VAAI=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgP/ADn3AQPggEfAoXwApX4Ao/zAon7AoP8AoPxAo4jC+EHGoYFB4fYAoUOgAFDNYIFFF4QFBhAFDoEYvgFC5l8AoX45/8ngFC44FD//z/m8AoXw/kIAoX4vkYBYccjhxC+EMFIQLBh5lCLoMP5gFDgE4AoXAAoYUBgApC/wFBBYQFCL4QRBgYFFR4QdCAAJfBAo0MApAaBLAIFHf6oABA")) \ No newline at end of file From e7f330490479eae2f29c835a73143cc3239381ed Mon Sep 17 00:00:00 2001 From: Sam McAlilly Date: Wed, 3 Feb 2021 23:06:41 -0600 Subject: [PATCH 068/148] change oblique image --- apps/oblique/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/oblique/icon.js b/apps/oblique/icon.js index 4410b1581..681cc6d10 100644 --- a/apps/oblique/icon.js +++ b/apps/oblique/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/ADn3AQPggEfAoXwApX4Ao/zAon7AoP8AoPxAo4jC+EHGoYFB4fYAoUOgAFDNYIFFF4QFBhAFDoEYvgFC5l8AoX45/8ngFC44FD//z/m8AoXw/kIAoX4vkYBYccjhxC+EMFIQLBh5lCLoMP5gFDgE4AoXAAoYUBgApC/wFBBYQFCL4QRBgYFFR4QdCAAJfBAo0MApAaBLAIFHf6oABA")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwkE/4A///zmfzn4fbDhQqBAAQMHj4XJ+SQGh4MDl4vKgMRAAgXEF5X/iAXWkEQIoQ0BC4kTC5UwC4cAC4sSC5XxgIXJkJwDPBAXJiCQCmbEGC5kTn7PBC4vzkMRC5UQgUikYuFmILBC5SwCVYMikMSmf/gaPLEYMBMQMwW4fzgUyL5YwCkQLBAATKBmJfMiIlBB4Q1BBYPwC5oZCiMSOgKUB+RHMkQlBN4MjCYMDC50jiMzgMiYgMBgQXMTYMziM/a4QXBgLvM+MBmcSiYIDkAXBHgQXI+cj+ciOQQABkMibIIXKAAMzmYqBDAUBkEAkRHKLQcgiBJB+bBBgZTBC5MvC4apBU4UAl53Lj4XCbYUCCYIzCC5RsBWwakCQYYXKAAUxBwMRYYUykUyC5swLwMBiESUQM/O5a/COwQYBAIIyBmAXLZ4IsBBoYABgUwBAYXHmUABogFCl4XL/8yiINESIMjNAIvLLoYWDQAYXLLoh1Ckc//7fBC5LUCC4gCBgUQBQoXFWYp1BRwIsBQAoXNn5JBNAgXHdgIAEiH/C4QAGC4kgEgsD+YHFAAYXEEY0v+QuIiMfa4gAh+cz/8z+c/AIIXQAQIVBAwQYQABI=")) \ No newline at end of file From 2eef8fc019e2809a9c18091081a727fb101f3dc6 Mon Sep 17 00:00:00 2001 From: Sam McAlilly Date: Wed, 3 Feb 2021 23:13:00 -0600 Subject: [PATCH 069/148] fix oblique js icon --- apps.json | 2 +- apps/oblique/{icon.js => app-icon.js} | 0 package.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename apps/oblique/{icon.js => app-icon.js} (100%) diff --git a/apps.json b/apps.json index 04c8b1580..0c011f038 100644 --- a/apps.json +++ b/apps.json @@ -2748,7 +2748,7 @@ "tags": "tool", "storage": [ {"name":"oblique.app.js","url":"app.js"}, - {"name":"eno.img","url":"icon.js","evaluate":true} + {"name":"oblique.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/oblique/icon.js b/apps/oblique/app-icon.js similarity index 100% rename from apps/oblique/icon.js rename to apps/oblique/app-icon.js diff --git a/package.json b/package.json index b796044c9..386730a81 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "start": "npx http-server -c-1" }, "dependencies": { - "acorn": "^7.2.0" + "acorn": "^7.4.1" } } From 3837586da13263b25b024817106b388a0cd0deab Mon Sep 17 00:00:00 2001 From: Sam McAlilly Date: Wed, 3 Feb 2021 23:16:20 -0600 Subject: [PATCH 070/148] revert package.json update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 386730a81..b796044c9 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "start": "npx http-server -c-1" }, "dependencies": { - "acorn": "^7.4.1" + "acorn": "^7.2.0" } } From 27bdf73f6bbf6539ab051f8e7a0c92c2fc6541f1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 4 Feb 2021 08:10:42 +0000 Subject: [PATCH 071/148] fileman 0.03: Update RegExp use (Was using backreference instead of character code) --- apps.json | 2 +- apps/fileman/ChangeLog | 1 + apps/fileman/fileman.app.js | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 8e2423bfd..d63e7954e 100644 --- a/apps.json +++ b/apps.json @@ -2315,7 +2315,7 @@ "name": "File manager", "shortName":"FileManager", "icon": "icons8-filing-cabinet-48.png", - "version":"0.02", + "version":"0.03", "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files", "tags": "tools", "readme": "README.md", diff --git a/apps/fileman/ChangeLog b/apps/fileman/ChangeLog index 72ee0b566..f5af86229 100644 --- a/apps/fileman/ChangeLog +++ b/apps/fileman/ChangeLog @@ -1,2 +1,3 @@ 0.01: New app! 0.02: Improve handling of large amounts of files (fix #579) +0.03: Update RegExp use (Was using backreference instead of character code) diff --git a/apps/fileman/fileman.app.js b/apps/fileman/fileman.app.js index 03e135cb2..6a3c5598d 100644 --- a/apps/fileman/fileman.app.js +++ b/apps/fileman/fileman.app.js @@ -91,8 +91,8 @@ function drawMenu() { function get_pruned_file_list() { // get storagefile list - var sf = STOR.list(/\1$/).map(s=>s.slice(0,-1)); - var sffilter = f=>!sf.includes(f.slice(0,-1)) || f.endsWith("\1"); + var sf = STOR.list(/\x01$/).map(s=>s.slice(0,-1)); + var sffilter = f=>!sf.includes(f.slice(0,-1)) || f.endsWith("\x01"); // get files - put '.' last var fl = STOR.list(/^[^\.]/).filter(sffilter); fl.sort(); From 09e207ac3dab64ea759adf46305cb6de1251f562 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 4 Feb 2021 08:11:21 +0000 Subject: [PATCH 072/148] Update banglerun interface's use of RegExp char code (was actually a backreference) --- apps/banglerun/interface.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/banglerun/interface.html b/apps/banglerun/interface.html index f9aa2fa1a..403f28258 100644 --- a/apps/banglerun/interface.html +++ b/apps/banglerun/interface.html @@ -141,7 +141,7 @@ function downloadTrack(trackid, callback) { function getTrackList() { Util.showModal("Loading Tracks..."); domTracks.innerHTML = ""; - Puck.eval(`require("Storage").list(/banglerun_.*\\1/).map(fn=>{fn=fn.slice(0,-1);var f=require("Storage").open(fn,"r");f.readLine();return fn+","+f.readLine()})`,trackLines=>{ + Puck.eval(`require("Storage").list(/banglerun_.*\\x01/).map(fn=>{fn=fn.slice(0,-1);var f=require("Storage").open(fn,"r");f.readLine();return fn+","+f.readLine()})`,trackLines=>{ var html = `

\n`; trackLines.forEach(l => { From 28c9dc67c67f6ccc6d656cd9086a251e4f3fa01f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 4 Feb 2021 08:56:49 +0000 Subject: [PATCH 073/148] fix regex complaint --- apps/.eslintrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/.eslintrc.json b/apps/.eslintrc.json index f1726032a..9d4f8a4aa 100644 --- a/apps/.eslintrc.json +++ b/apps/.eslintrc.json @@ -155,6 +155,7 @@ // TODO: "no-undef": "warn", "no-undef": "off", "no-unused-vars": "off", - "no-useless-escape": "off" + "no-useless-escape": "off", + "no-control-regex" : "off" } } From 472a0d0ea82edaee958ae1da4ae7861837a40876 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 4 Feb 2021 19:47:27 +0000 Subject: [PATCH 074/148] bumped activepedom Changelog and version number --- apps.json | 2 +- apps/activepedom/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8e2423bfd..0363653b8 100644 --- a/apps.json +++ b/apps.json @@ -1341,7 +1341,7 @@ "name": "Active Pedometer", "shortName":"Active Pedometer", "icon": "app.png", - "version":"0.08", + "version":"0.09", "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", "tags": "outdoors,widget", "readme": "README.md", diff --git a/apps/activepedom/ChangeLog b/apps/activepedom/ChangeLog index 7926ca3e1..66a1e8df9 100644 --- a/apps/activepedom/ChangeLog +++ b/apps/activepedom/ChangeLog @@ -6,3 +6,4 @@ 0.06: Added WIDGETS.activepedom.getSteps() 0.07: Added settings to be able to hide line1 and line2 so there is no visible widget 0.08: Fixed zero steps issue caused by 0.07 +0.09: Prettied up user interface, decluttered graphs From 3d74663dfb89cab84ee6711203ba6bdad1193980 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 5 Feb 2021 16:40:29 +0100 Subject: [PATCH 075/148] adding readme to main page --- apps.json | 1 + apps/planetarium/README.md | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps.json b/apps.json index e70d5cec3..c7738d2ca 100644 --- a/apps.json +++ b/apps.json @@ -2714,6 +2714,7 @@ "name": "Planetarium", "shortName":"Planetarium", "icon": "planetarium.png", + "readme": "README.md", "version":"0.02", "description": "Planetarium showing up to 500 stars using the watch location and time", "tags": "", diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index e922c55ac..69ccd5334 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -27,3 +27,6 @@ Maybe you want to add some more constellations to the planetarium. As you can se - Upload the new `planetarium.const.csv` to your bangle (or emulator) and test it out. What is a constellation star is not in the 500 star list in `planetarium.data.csv`? If you need another star to draw the constellation you can find that star in the full star list (`starinfo/planetarium.stars.csv`) and put it in `planetarium.extra.csv`. That stars will be loaded only when constellations are shown. In order to refer to these extra stars in the `planetarium.const.csv` you have to use the code `e_linenumber`, in order to differenciate them from the stars in the normal file. For instance, to refer to the first star in the file `planetarium.extra.csv`, you will refer it as `e_1`. Do not forget to add an extra line at the end as in the other files. + +## Development version +Please check the latest development version [here](https://github.com/pglez82/BangleApps) From 14b639f862bcae49e626c1c995b1e3ffe951f94a Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 5 Feb 2021 18:16:16 +0100 Subject: [PATCH 076/148] adding a few constellations more --- apps/planetarium/planetarium.const.csv | 10 ++++++++++ apps/planetarium/planetarium.extra.csv | 14 ++++++++++++++ apps/planetarium/settings.js | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.const.csv b/apps/planetarium/planetarium.const.csv index c3c9104d9..c97df6295 100644 --- a/apps/planetarium/planetarium.const.csv +++ b/apps/planetarium/planetarium.const.csv @@ -26,3 +26,13 @@ Lupus 140 210,322 140,322 410,410 98,98 234,234 210,98 302,302 362,234 e_1,234 e_2 Leo 21 291,102 270,102 291,96 63,63 241,241 96,96 102,21 241,457 270,457 167 +Lyra +5 e_4,e_4 e_5,e_5 221,221 274,274 e_4 +Corona Borealis +69 353,353 e_6,69 429,429 e_7,e_7 e_8,e_8 e_9 +Herculis +296 135,135 477,477 203,203 296,443 203,443 408,135 127,127 380,e_10 477,464 296,265 e_10,e_10 202 +Ursa Minor +50 e_11,e_11 e_14,e_14 e_13,e_13 e_12,e_12 186,186 58,58 e_13 +Draco +e_15 131,131 70,70 382,382 e_15,382 187,187 423,423 e_16,e_16 207,207 122,122 e_17,e_17 232,232 342,342 452,452 428 diff --git a/apps/planetarium/planetarium.extra.csv b/apps/planetarium/planetarium.extra.csv index bd6a3d318..66be33d12 100644 --- a/apps/planetarium/planetarium.extra.csv +++ b/apps/planetarium/planetarium.extra.csv @@ -1,3 +1,17 @@ 1.394,-0.230,4.3,LA LEP 1.367,-0.226,4.4,KA LEP 0.825,0.866,4.0,JO PER +4.950,0.644,4.3,DE2 LYR +5.046,0.666,4.4,TH LYR +4.071,0.547,4.1,TH CRB +4.143,0.455,4.6,DE CRB +4.178,0.469,4.2,EP CRB +4.195,0.521,5.0,JO CRB +4.585,0.456,4.4,LA HER +4.591,1.511,4.4,DE UMI +4.265,1.322,5.0,ET UMI +4.119,1.358,4.3,ZE UMI +4.389,1.432,4.2,EP UMI +4.591,0.963,4.9,NY2 DRA +5.042,1.280,4.5,TA DRA +4.197,1.022,4.0,TH DRA diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index d2351e0db..caadb4016 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -1,6 +1,6 @@ // make sure to enclose the function in parentheses (function(back) { - let settings = require('Storage').readJSON('planetarium.json',1)||{}; + let settings = require('Storage').readJSON('planetarium.json',1)||{"starnames":false,"constellations":true,"consnames":false}; function save(key, value) { settings[key] = value; require('Storage').write('planetarium.json',settings); From 8fa2bb143266b0a6bd595ce5e268d4f1f75be5aa Mon Sep 17 00:00:00 2001 From: dapgo Date: Fri, 5 Feb 2021 21:06:26 +0100 Subject: [PATCH 077/148] new app to test the input My very basic app to test bangle.js the input interfaces --- apps/test_UserInput/Changelog | 0 apps/test_UserInput/README.md | 33 ++++++ apps/test_UserInput/test_userInput.app.js | 132 ++++++++++++++++++++++ apps/test_UserInput/test_userInput.img | 1 + apps/test_UserInput/test_userInput.info | 1 + 5 files changed, 167 insertions(+) create mode 100644 apps/test_UserInput/Changelog create mode 100644 apps/test_UserInput/README.md create mode 100644 apps/test_UserInput/test_userInput.app.js create mode 100644 apps/test_UserInput/test_userInput.img create mode 100644 apps/test_UserInput/test_userInput.info diff --git a/apps/test_UserInput/Changelog b/apps/test_UserInput/Changelog new file mode 100644 index 000000000..e69de29bb diff --git a/apps/test_UserInput/README.md b/apps/test_UserInput/README.md new file mode 100644 index 000000000..d2ecf898b --- /dev/null +++ b/apps/test_UserInput/README.md @@ -0,0 +1,33 @@ +# App Name + +test UserInput app + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Warnings/pending tasks +add sliding gestures + +## Usage + +open and see a "help" screen +interact to print the event or leave the app + +## Features + +Colours, font, user input + + + +## Controls + +finger touch +button 1 and 3 + + +## Requests + +This simple app has not support + +## Creator + +Daniel Perez \ No newline at end of file diff --git a/apps/test_UserInput/test_userInput.app.js b/apps/test_UserInput/test_userInput.app.js new file mode 100644 index 000000000..accde69b0 --- /dev/null +++ b/apps/test_UserInput/test_userInput.app.js @@ -0,0 +1,132 @@ +/* Testing input dapgo2021 +*/ + var colbackg='#111111'; + //var coldarkred='#CC3333'; + var colorange='#e56e06'; + var colgrey='#51504f'; + var v_font1size='16'; + var v_clicks='0' + console.log("*** Testing basic UserInput - dapgo***"); + + function ClearActiveArea(){ + //all except widget area + g.setColor(colbackg); //white + g.fillRect(0,32,239,239); //fill all screen except widget area + g.flip(); +} +function ClearBannerArea(){ + //all except widget area + g.setColor(colgrey); //white + g.fillRect(50,32,190,85); //fill an specific area + g.flip(); +} + + +function PrintUserInput(boton){ + console.log("Pressed touch/BTN",boton); + if (v_clicks=='0') PrintAreas(); + + ClearBannerArea(); + //Bangle.drawWidgets(); //not paint if not removed + + g.setColor(colorange); + g.setFontVector(32).drawString(boton, 50, 65); + g.flip(); + v_clicks++; + +} +function PrintBtn1(boton){ + console.log("Pressed BTN1"); + if (v_clicks=='0') PrintAreas(); + PrintUserInput("Button1") + //delay + v_clicks++; +} + +function PrintBtn2(boton){ + console.log("Pressed BTN2"); + if (v_clicks=='0') PrintAreas(); + PrintUserInput("Button2") + //delay + v_clicks++; +} + + +function PrintHelp(){ + console.log("********************************"); + console.log("Log: *** Print help in screen"); + ClearActiveArea(); + g.setColor(0,1,0); //green + g.setFontVector(v_font1size).drawString("To test the input, try :", 30, 90); + g.setFontVector(v_font1size).drawString("Swipe right -->", 30, 115); + g.setFontVector(v_font1size).drawString("Swipe left <--", 30, 130); + g.setFontVector(v_font1size).drawString("Click Left area", 30, 145); + g.setFontVector(v_font1size).drawString("Click Right area", 30,160); + g.setFontVector(v_font1size).drawString("Click Middle area", 30,175); + g.setFontVector(v_font1size).drawString("Press Button1 ", 30,190); + g.setFontVector(v_font1size).drawString("Press Button2 ", 30,205); + g.setFontVector(v_font1size).drawString("Press Button3 to Quit", 30,220); + g.flip(); +}; + +function PrintAreas(){ + console.log("********************************"); + console.log("Log: *** Print Areas in screen"); + ClearActiveArea(); + + g.setColor(0,1,0); //green + g.drawLine(1, 140, 1, 200);//side border + g.drawLine(239, 140, 239, 200);//side border + g.drawLine(120, 140, 120, 200);//middle of areas + g.setFontVector(v_font1size).drawString("BTN1", 195,45); + g.setFontVector(v_font1size).drawString("BTN2", 195,125); + g.setFontVector(v_font1size).drawString("Quit<--", 130,225); + g.setFontVector(v_font1size).drawString("BTN3", 195,225); + g.setFontVector(v_font1size).drawString("Middle area", 80,120); + g.setFontVector(v_font1size).drawString("Left area", 15, 165); + g.setFontVector(v_font1size).drawString("Right area", 140,165); + + + g.flip(); +}; + + +function UserInput(){ + Bangle.on('touch', function(button){ + switch(button){ + case 1: + PrintUserInput("Touch 1");//left + break; + case 2: + PrintUserInput("Touch 2");//right + break; + case 3: + PrintUserInput("Touch 3");//center + break; + } + }); + //only the name of the function + setWatch(PrintBtn1, BTN1, { repeat: true }); + setWatch(PrintBtn2, BTN2, { repeat: true }); + setWatch(Bangle.showLauncher, BTN3, { repeat: true }); + Bangle.on('swipe', dir => { + if(dir == 1) PrintUserInput(" --->"); //func load to quit + else PrintUserInput(" <---"); + }); + console.log("Log: Input conditions loaded"); +}; //end of UserInput + +//Main code +//Call Once + + Bangle.loadWidgets(); + Bangle.drawWidgets(); + g.setColor(0,1,0); //green + g.drawLine(60, 30, 180, 30); //line below widgets check if deleted + g.flip(); + + PrintHelp(); + //printhelp clear the full screen + + UserInput(); + diff --git a/apps/test_UserInput/test_userInput.img b/apps/test_UserInput/test_userInput.img new file mode 100644 index 000000000..173f74796 --- /dev/null +++ b/apps/test_UserInput/test_userInput.img @@ -0,0 +1 @@ +00]]]]]]]]]]]]]]WWWWWW׳WWW]׬׬]WVV׬ά׳VVVV׬ά׬VVVV׬ͬ׬VVVV׬ͬ׬VVVVͬVVVVͬVVVV]ͬ]VVVVVVVVV22V͢ǣǣ \ No newline at end of file diff --git a/apps/test_UserInput/test_userInput.info b/apps/test_UserInput/test_userInput.info new file mode 100644 index 000000000..0141577c8 --- /dev/null +++ b/apps/test_UserInput/test_userInput.info @@ -0,0 +1 @@ +{"id":"test_userInput","name":"User Input","src":"test_userInput.app.js","icon":"test_userInput.img","version":"0.02","files":"test_userInput.info,test_userInput.app.js,test_userInput.img"} \ No newline at end of file From c2cb14c15eb85c68677178303c0e7f4c5fcf45c6 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:23:48 +0100 Subject: [PATCH 078/148] Aligning text --- apps/rclock/ChangeLog | 1 + apps/rclock/rclock.app.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/rclock/ChangeLog b/apps/rclock/ChangeLog index fa62e12fb..378680dd4 100644 --- a/apps/rclock/ChangeLog +++ b/apps/rclock/ChangeLog @@ -1,3 +1,4 @@ 0.01: First published version of app 0.02: Added support for locale and 12H clock 0.03: Added HR indication to clock +0.04: Update font and alignment \ No newline at end of file diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index b478ef6e2..9455922cb 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -27,7 +27,7 @@ shadow: '#CF7500', font: 'Vector', size: 50, - middle: screen.middle - 20, + middle: screen.middle, center: screen.center, }, date: { @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height - 20, // at bottom of screen + middle: screen.height, // at bottom of screen center: screen.center, }, circle: { From b902bb4bd067767e7f81f3337a53307c2c34e68e Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:25:31 +0100 Subject: [PATCH 079/148] Update app.json config --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5a19eabf1..e4d03000b 100644 --- a/apps.json +++ b/apps.json @@ -1638,7 +1638,7 @@ "name": "Round clock with seconds, minutes and date", "shortName":"Round Clock", "icon": "app.png", - "version":"0.03", + "version":"0.04", "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", "tags": "clock", "type": "clock", From a9cfa0a9d5e293d1002e724df07af2e0d3c17637 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:27:25 +0100 Subject: [PATCH 080/148] Move data up --- apps/rclock/rclock.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 9455922cb..1a42c902b 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height, // at bottom of screen + middle: screen.height-15, // at bottom of screen center: screen.center, }, circle: { From 2997ddc47ca27769df1fcfd98b6f6eda03ba8cac Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:28:36 +0100 Subject: [PATCH 081/148] A little more up --- apps/rclock/rclock.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 1a42c902b..ce84efabe 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height-15, // at bottom of screen + middle: screen.height-19, // at bottom of screen center: screen.center, }, circle: { From dd96f4c818b66472fdc081ee82e3f99a4cb0073e Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:30:22 +0100 Subject: [PATCH 082/148] Fixes to alignment --- apps/rclock/rclock.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index ce84efabe..685b72038 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -26,7 +26,7 @@ color: '#f0af00', shadow: '#CF7500', font: 'Vector', - size: 50, + size: 55, middle: screen.middle, center: screen.center, }, @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height-19, // at bottom of screen + middle: screen.height-25, // at bottom of screen center: screen.center, }, circle: { From a50f3dd9f437a6f355d2cb3889db5e459232099a Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:34:46 +0100 Subject: [PATCH 083/148] Test new placement --- apps/rclock/rclock.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 685b72038..b1ef3e986 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -26,7 +26,7 @@ color: '#f0af00', shadow: '#CF7500', font: 'Vector', - size: 55, + size: 60, middle: screen.middle, center: screen.center, }, @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height-25, // at bottom of screen + middle: screen.height-35, // at bottom of screen center: screen.center, }, circle: { From 779b64f82a5339b100234ba86032e8eb18cba0c4 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:37:54 +0100 Subject: [PATCH 084/148] Moving date --- apps/rclock/rclock.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index b1ef3e986..0c3ad88c6 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height-35, // at bottom of screen + middle: screen.height-19, // at bottom of screen center: screen.center, }, circle: { From 61331350dbe5be59a9e28f9ef53134c3355e9b0c Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:42:09 +0100 Subject: [PATCH 085/148] Update readme and data placing --- apps/rclock/ChangeLog | 2 +- apps/rclock/rclock.app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/rclock/ChangeLog b/apps/rclock/ChangeLog index 378680dd4..3ac5530cd 100644 --- a/apps/rclock/ChangeLog +++ b/apps/rclock/ChangeLog @@ -1,4 +1,4 @@ 0.01: First published version of app 0.02: Added support for locale and 12H clock 0.03: Added HR indication to clock -0.04: Update font and alignment \ No newline at end of file +0.04: Update font size and alignment \ No newline at end of file diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 0c3ad88c6..6f7c9c68a 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height-19, // at bottom of screen + middle: screen.height-20, // at bottom of screen center: screen.center, }, circle: { From c6860e453ff672f02c22b5cdf93dbf17de7e61c3 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:53:02 +0100 Subject: [PATCH 086/148] Testing colors --- apps/rclock/rclock.app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 6f7c9c68a..05f2d32a0 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -23,7 +23,7 @@ // Ssettings const settings = { time: { - color: '#f0af00', + color: '#D6ED17', shadow: '#CF7500', font: 'Vector', size: 60, @@ -31,7 +31,7 @@ center: screen.center, }, date: { - color: '#f0af00', + color: '#D6ED17, shadow: '#CF7500', font: 'Vector', size: 15, @@ -39,8 +39,8 @@ center: screen.center, }, circle: { - colormin: '#eeeeee', - colorsec: '#bbbbbb', + colormin: '#606060', + colorsec: '#656565', width: 10, middle: screen.middle, center: screen.center, From 6f5a44625ab4c955ec62d5a3f6db43b0cfb1c6f8 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:57:40 +0100 Subject: [PATCH 087/148] Fix error --- apps/rclock/rclock.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 05f2d32a0..12a15f96a 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -31,7 +31,7 @@ center: screen.center, }, date: { - color: '#D6ED17, + color: '#D6ED17', shadow: '#CF7500', font: 'Vector', size: 15, From 82ed79ed761a8cde54e8e8e083027e56e09fdc23 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 16:59:49 +0100 Subject: [PATCH 088/148] Move date --- apps/rclock/rclock.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 12a15f96a..d6b92ac31 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -35,7 +35,7 @@ shadow: '#CF7500', font: 'Vector', size: 15, - middle: screen.height-20, // at bottom of screen + middle: screen.height-17, // at bottom of screen center: screen.center, }, circle: { From 0c97a285bf4772d509c25f61e11c5d602ab725ef Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 17:06:06 +0100 Subject: [PATCH 089/148] Color changes --- apps/rclock/rclock.app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index d6b92ac31..d4f86e573 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -23,7 +23,7 @@ // Ssettings const settings = { time: { - color: '#D6ED17', + color: 0xD6ED17, shadow: '#CF7500', font: 'Vector', size: 60, @@ -31,7 +31,7 @@ center: screen.center, }, date: { - color: '#D6ED17', + color: 0xD6ED17, shadow: '#CF7500', font: 'Vector', size: 15, @@ -39,15 +39,15 @@ center: screen.center, }, circle: { - colormin: '#606060', - colorsec: '#656565', + colormin: 0x606060, + colorsec: 0x656565, width: 10, middle: screen.middle, center: screen.center, height: screen.height }, hr: { - color: '#333333', + color: 0x333333, size: 10, x: screen.center, y: screen.middle + 45 From 026214847438982f804fc917f1931e3da4c44314 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 17:20:22 +0100 Subject: [PATCH 090/148] Color update --- apps/rclock/rclock.app.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index d4f86e573..662c2092a 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -23,16 +23,14 @@ // Ssettings const settings = { time: { - color: 0xD6ED17, - shadow: '#CF7500', + color: 0xFEE715, font: 'Vector', size: 60, middle: screen.middle, center: screen.center, }, date: { - color: 0xD6ED17, - shadow: '#CF7500', + color: 0xFEE715, font: 'Vector', size: 15, middle: screen.height-17, // at bottom of screen From 7e8073251b1dedfd2e4933f31029ba691f897d3f Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 17:22:51 +0100 Subject: [PATCH 091/148] Revert "Color update" This reverts commit 026214847438982f804fc917f1931e3da4c44314. --- apps/rclock/rclock.app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index 662c2092a..d4f86e573 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -23,14 +23,16 @@ // Ssettings const settings = { time: { - color: 0xFEE715, + color: 0xD6ED17, + shadow: '#CF7500', font: 'Vector', size: 60, middle: screen.middle, center: screen.center, }, date: { - color: 0xFEE715, + color: 0xD6ED17, + shadow: '#CF7500', font: 'Vector', size: 15, middle: screen.height-17, // at bottom of screen From 8b0ba7244215be17b55240f143024b6bcaa48bb7 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Sat, 6 Feb 2021 17:24:17 +0100 Subject: [PATCH 092/148] Remove shadow --- apps/rclock/rclock.app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/rclock/rclock.app.js b/apps/rclock/rclock.app.js index d4f86e573..f8b27c4fb 100644 --- a/apps/rclock/rclock.app.js +++ b/apps/rclock/rclock.app.js @@ -24,7 +24,6 @@ const settings = { time: { color: 0xD6ED17, - shadow: '#CF7500', font: 'Vector', size: 60, middle: screen.middle, @@ -32,7 +31,6 @@ }, date: { color: 0xD6ED17, - shadow: '#CF7500', font: 'Vector', size: 15, middle: screen.height-17, // at bottom of screen From 8e30a377f542e2ffae387f08c908403ad5a5c490 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Sat, 6 Feb 2021 20:06:42 +0100 Subject: [PATCH 093/148] adding pegasus --- apps/planetarium/planetarium.const.csv | 4 +++- apps/planetarium/planetarium.extra.csv | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.const.csv b/apps/planetarium/planetarium.const.csv index c97df6295..972e4faff 100644 --- a/apps/planetarium/planetarium.const.csv +++ b/apps/planetarium/planetarium.const.csv @@ -19,7 +19,7 @@ Cygnus Auriga 6 42,168 6,168 113,113 29,104 29,104 42 Can Maior -1 47,1 37,37 22,22 178,37 89 +1 37,22 178,37 435,435 89,1 e_18,e_18 e_19,e_19 e_20,e_20 e_18,37 277,277 22,450 488,277 488,488 47,1 488,e_21 488,22 495 Bootes 3 118,118 279,279 286,286 180,180 316,316 3 Lupus @@ -36,3 +36,5 @@ Ursa Minor 50 e_11,e_11 e_14,e_14 e_13,e_13 e_12,e_12 186,186 58,58 e_13 Draco e_15 131,131 70,70 382,382 e_15,382 187,187 423,423 e_16,e_16 207,207 122,122 e_17,e_17 232,232 342,342 452,452 428 +Pegasus +92 85,138 54,54 85,138 92,283 85,283 389,160 85,92 258,258 297,297 83 diff --git a/apps/planetarium/planetarium.extra.csv b/apps/planetarium/planetarium.extra.csv index 66be33d12..7d66b86c9 100644 --- a/apps/planetarium/planetarium.extra.csv +++ b/apps/planetarium/planetarium.extra.csv @@ -15,3 +15,7 @@ 4.591,0.963,4.9,NY2 DRA 5.042,1.280,4.5,TA DRA 4.197,1.022,4.0,TH DRA +1.816,-0.298,4.4,JO CMA +1.849,-0.273,4.1,GA CMA +1.807,-0.210,4.1,TH CMA +1.724,-0.401,4.5,XI2 CMA From 360ebcf70243e9250f1af396a01a7482a0a310e6 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Mon, 1 Feb 2021 16:05:41 +0100 Subject: [PATCH 094/148] modify how to load the constellations --- apps.json | 1 + apps/planetarium/planetarium.app.js | 120 ++++++++++++++----------- apps/planetarium/planetarium.const.csv | 24 +++++ 3 files changed, 95 insertions(+), 50 deletions(-) create mode 100644 apps/planetarium/planetarium.const.csv diff --git a/apps.json b/apps.json index 5a19eabf1..81abdbfa1 100644 --- a/apps.json +++ b/apps.json @@ -2720,6 +2720,7 @@ "storage": [ {"name":"planetarium.app.js","url":"planetarium.app.js"}, {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, + {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, {"name":"planetarium.settings.js","url":"settings.js"}, {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} ], diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 925a2c0dc..9d90e6e1e 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -35,14 +35,56 @@ function siderealTime(julianDay) return toRadians(280.46061837 + 360.98564736629 * (julianDay - 2451545.0) + 0.000387933 * T * T - T * T * T / 38710000); } -function drawStars(lat,lon,date){ +/* +* Draws a single star in the sky. +* starPositions is a dictionary that gets modified and it is used later for ploting the constelations +*/ +function drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions){ + var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); + var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; + var H = siderealTime(julianDay) - longitude - ascen; + //Compute altitude + var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H)); + if(alt >= 0) + { + //Compute azimuth + var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); + var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); + var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); + starPositions[starNumber] = [x,y]; + var magnitude = starMag<1?2:1; + //Stars between 1.5 and 4 magnitude should get a different colour + var col=1; + if (starMag<=1.5) + col=1; + else if (starMag>1.5 && starMag<2) + col=0.9; + else if (starMag>=2 && starMag<3) + col=0.7; + else if (starMag>=3 && starMag<3.5) + col=0.5; + else + col=0.3; + + g.setColor(col,col,col); + g.fillCircle(x, y, magnitude); + if (starMag<1 && settings.starnames) + g.drawString(starInfo[3],x,y+2); + g.flip(); + + } +} + + + +function plotSky(lat,lon,date){ var longitude = toRadians(-lon); var latitude = toRadians(lat); var julianDay = toJulianDay(date.getFullYear(), date.getMonth()+1,date.getDate(), date.getHours() + date.getTimezoneOffset() / 60, date.getMinutes(), date.getSeconds()); - var size = 240; + storage = require('Storage'); f=storage.read("planetarium.data.csv","r"); @@ -63,64 +105,40 @@ function drawStars(lat,lon,date){ while (lineend>=0) { line = f.substring(linestart,lineend); starNumber++; - //console.log(line); //Process the star starInfo = line.split(','); //console.log(starInfo[0]); starRA = parseFloat(starInfo[0]); starDE = parseFloat(starInfo[1]); starMag = parseFloat(starInfo[2]); - //var start = new Date().getTime(); - var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); - var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; - var H = siderealTime(julianDay) - longitude - ascen; - //Compute altitude - var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H)); - if(alt >= 0) - { - //Compute azimuth - var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude)); - var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi); - var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi); - starPositions[starNumber] = [x,y]; - var magnitude = starMag<1?2:1; - //Stars between 1.5 and 4 magnitude should get a different colour - var col=1; - if (starMag<=1.5) - col=1; - else if (starMag>1.5 && starMag<2) - col=0.9; - else if (starMag>=2 && starMag<3) - col=0.7; - else if (starMag>=3 && starMag<3.5) - col=0.5; - else - col=0.3; - - g.setColor(col,col,col); - g.fillCircle(x, y, magnitude); - if (starMag<1 && settings.starnames) - g.drawString(starInfo[3],x,y+2); - g.flip(); - - } + drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions); linestart = lineend+1; lineend = f.indexOf("\n",linestart); } if (settings.constellations){ - //Each star has a number (the position on the file (line number)). These are the lines - //joining each star in the constellations. - constelations=[[[7,68],[10,53],[53,56],[28,68],"Orion"],[[13,172],[13,340],[293,340],[29,293],"Taurus"], - [[155,8],"Canis Menor"],[[36,81],[87,81],[235,87],[33,235],[33,75],[75,40],[36,235],"Ursa Major"],[[67,91],[74,67],[91,110],[110,252],"Cassiopeia"],[[23,166],[16,294],[294,44],[166,149],[230,149],[16,23],"Gemini"],[[88,218],[215,292],[218,292],[245,88],[292,245],[215,218],"Cepheus"],[[150,62],[150,175],[175,35],[403,62],[487,158],[384,487],[384,158],[35,158],[487,403],"Perseus"],[[19,65],[65,90],[65,147],[466,65],[466,189],[147,401],[213,90],"Cygnus"],[[6,42],[168,6],[168,113],[113,29],[104,29],[104,42],"Auriga"],[[1,47],[1,37],[37,22],[22,178],[37,89],"Can Maior"],[[3,118],[118,279],[279,286],[286,180],[180,316],[316,3],"Bootes"]]; - g.setColor(0,255,0); - for (i=0;i=0) { + linenum++; + //In this file, each constelation are two lines. The first one the name, the second the lines joining stars + var name = fc.substring(linestart,lineend); + linestart = lineend+1; + lineend = fc.indexOf("\n",linestart); + var lines = fc.substring(linestart,lineend).split(','); + linestart = lineend+1; + lineend = fc.indexOf("\n",linestart); + g.setColor(0,255,0); + if (linenum>11) + break; constelationShowing=false; - for (j=0;j Date: Mon, 1 Feb 2021 16:19:36 +0100 Subject: [PATCH 095/148] fixing a small bug --- apps/planetarium/planetarium.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index 9d90e6e1e..aae309941 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -150,7 +150,7 @@ function plotSky(lat,lon,date){ g.flip(); } //Write the name - if (constelationShowing && true) + if (constelationShowing && settings.consnames) g.drawString(name,positionStar2[0]+10,positionStar2[1]); } } From 6d22a9b69dfdf7543cce880da31fa231bd408888 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Mon, 1 Feb 2021 16:26:24 +0100 Subject: [PATCH 096/148] updating readme --- apps/planetarium/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 56dc66be9..fbeebe89c 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -16,4 +16,11 @@ The planetarium plots the stars as if you are looking to the sky (with your watc ## Improvements I plan to add more constellations as soon as I have time. I am adding the constellations that I know of, but the plan is to add all the main ones (at least for North Hemisphere). -Please note that the watch hardware is limited and computing the stars positions is a quite intensive task for this little processor. This is why it plots only stars and no planets or the moon. For plotting the planets, storage will be a limiting factor as well as computing the position for planets needs more initial data compared with stars. \ No newline at end of file +Please note that the watch hardware is limited and computing the stars positions is a quite intensive task for this little processor. This is why it plots only stars and no planets or the moon. For plotting the planets, storage will be a limiting factor as well as computing the position for planets needs more initial data compared with stars. + +## Do you want to contribute? +Maybe you want to add some more constellations to the planetarium. As you can see I didn't cover constellations in the south hemisphere. How to do it? It is a bit tedious but it can be done and you will learn the constellations pretty well at the end of it. Steps: +- Open the file `plantearium.data.csv`. There you have the 500 stars that we have in the planetarium. The number of each star is the line number. For isntance for Sirius, the star number will be 1. +- Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). +- Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). +- Do not forget to add a break line after the last constellation. From e233f51dd9c6a627d7f6b8268651dc7cf44e95b6 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Mon, 1 Feb 2021 16:28:40 +0100 Subject: [PATCH 097/148] updating readme --- apps/planetarium/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index fbeebe89c..030d25779 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -24,3 +24,4 @@ Maybe you want to add some more constellations to the planetarium. As you can se - Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). - Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). - Do not forget to add a break line after the last constellation. +- Upload the new `planetarium.const.csv` to your bangle (or emualator) and test it out. From 6fa61caaa62f42929f759f5a5b147509efe0145d Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Wed, 3 Feb 2021 15:30:13 +0100 Subject: [PATCH 098/148] adding extra stars to constellations --- apps.json | 1 + apps/planetarium/README.md | 4 +- apps/planetarium/planetarium.app.js | 36 +- apps/planetarium/planetarium.const.csv | 2 + apps/planetarium/planetarium.extra.csv | 2 + .../starinfo/planetarium.stars.csv | 9095 ++++++++++++++++ .../planetarium/starinfo/process_star_file.py | 38 + apps/planetarium/starinfo/starsoriginal.csv | 9096 +++++++++++++++++ 8 files changed, 18262 insertions(+), 12 deletions(-) create mode 100644 apps/planetarium/planetarium.extra.csv create mode 100644 apps/planetarium/starinfo/planetarium.stars.csv create mode 100644 apps/planetarium/starinfo/process_star_file.py create mode 100644 apps/planetarium/starinfo/starsoriginal.csv diff --git a/apps.json b/apps.json index 81abdbfa1..8515fd153 100644 --- a/apps.json +++ b/apps.json @@ -2721,6 +2721,7 @@ {"name":"planetarium.app.js","url":"planetarium.app.js"}, {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, + {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, {"name":"planetarium.settings.js","url":"settings.js"}, {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} ], diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 030d25779..e922c55ac 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -24,4 +24,6 @@ Maybe you want to add some more constellations to the planetarium. As you can se - Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). - Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). - Do not forget to add a break line after the last constellation. -- Upload the new `planetarium.const.csv` to your bangle (or emualator) and test it out. +- Upload the new `planetarium.const.csv` to your bangle (or emulator) and test it out. + +What is a constellation star is not in the 500 star list in `planetarium.data.csv`? If you need another star to draw the constellation you can find that star in the full star list (`starinfo/planetarium.stars.csv`) and put it in `planetarium.extra.csv`. That stars will be loaded only when constellations are shown. In order to refer to these extra stars in the `planetarium.const.csv` you have to use the code `e_linenumber`, in order to differenciate them from the stars in the normal file. For instance, to refer to the first star in the file `planetarium.extra.csv`, you will refer it as `e_1`. Do not forget to add an extra line at the end as in the other files. diff --git a/apps/planetarium/planetarium.app.js b/apps/planetarium/planetarium.app.js index aae309941..4763efb82 100644 --- a/apps/planetarium/planetarium.app.js +++ b/apps/planetarium/planetarium.app.js @@ -39,7 +39,10 @@ function siderealTime(julianDay) * Draws a single star in the sky. * starPositions is a dictionary that gets modified and it is used later for ploting the constelations */ -function drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions){ +function drawStar(zeta,theta,z,julianDay,latitude,longitude,starInfo,starNumber,starPositions){ + let starRA = parseFloat(starInfo[0]); + let starDE = parseFloat(starInfo[1]); + let starMag = parseFloat(starInfo[2]); var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE)); var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z; var H = siderealTime(julianDay) - longitude - ascen; @@ -107,17 +110,28 @@ function plotSky(lat,lon,date){ starNumber++; //Process the star starInfo = line.split(','); - //console.log(starInfo[0]); - starRA = parseFloat(starInfo[0]); - starDE = parseFloat(starInfo[1]); - starMag = parseFloat(starInfo[2]); - drawStar(zeta,theta,z,julianDay,latitude,longitude,starDE,starRA,starMag,starNumber,starPositions); + drawStar(zeta,theta,z,julianDay,latitude,longitude,starInfo,starNumber,starPositions); linestart = lineend+1; lineend = f.indexOf("\n",linestart); } if (settings.constellations){ + //First plot the extra stars for the constellations + fe=storage.read("planetarium.extra.csv","r"); + linenum=linestart = 0; + lineend = fe.indexOf("\n"); + let starNumber = 0; + while (lineend>=0) { + line = fe.substring(linestart,lineend); + starNumber++; + starInfo = line.split(','); + drawStar(zeta,theta,z,julianDay,latitude,longitude,starInfo,"e_"+starNumber,starPositions); + linestart = lineend+1; + lineend = fe.indexOf("\n",linestart); + } + //End of ploting extra stars + linenum=linestart = 0; fc=storage.read("planetarium.const.csv","r"); lineend = fc.indexOf("\n"); @@ -131,14 +145,13 @@ function plotSky(lat,lon,date){ linestart = lineend+1; lineend = fc.indexOf("\n",linestart); g.setColor(0,255,0); - if (linenum>11) - break; + constelationShowing=false; for (j=0;j Date: Wed, 3 Feb 2021 23:55:42 +0100 Subject: [PATCH 099/148] adding leo --- apps/planetarium/planetarium.const.csv | 8 +++++--- apps/planetarium/planetarium.data.csv | 2 +- apps/planetarium/planetarium.extra.csv | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/planetarium/planetarium.const.csv b/apps/planetarium/planetarium.const.csv index 8a4b0a980..c3c9104d9 100644 --- a/apps/planetarium/planetarium.const.csv +++ b/apps/planetarium/planetarium.const.csv @@ -1,7 +1,7 @@ Orion 7 68,10 53,53 56,28 68 Taurus -13 172,13 340,293 340,29 293 +13 172,13 340,293 340,29 293,340 276 Canis Menor 155 8 Ursa Major @@ -9,11 +9,11 @@ Ursa Major Cassiopeia 67 91,74 67,91 110,110 252 Gemini -23 166,16 294,294,44,166 149,230 149,16 23 +23 166,16 294,294 44,166 149,230 149,16 23 Cepheus 88 218,215 292,218 292,245 88,292 245,215 218 Perseus -150 62,150 175,175 35,403 62,487 158,384 487,384 158,35 158,487 403 +150 62,150 175,175 35,403 62,487 158,384 487,384 158,35 158,487 e_3,e_3 403 Cygnus 19 65,65 90,65 147,466 65,466 189,147 401,213 90 Auriga @@ -24,3 +24,5 @@ Bootes 3 118,118 279,279 286,286 180,180 316,316 3 Lupus 140 210,322 140,322 410,410 98,98 234,234 210,98 302,302 362,234 e_1,234 e_2 +Leo +21 291,102 270,102 291,96 63,63 241,241 96,96 102,21 241,457 270,457 167 diff --git a/apps/planetarium/planetarium.data.csv b/apps/planetarium/planetarium.data.csv index ce509695b..a576d37af 100644 --- a/apps/planetarium/planetarium.data.csv +++ b/apps/planetarium/planetarium.data.csv @@ -421,7 +421,7 @@ 3.874,-1.380,3.8,AL APS 4.745,0.502,3.8,OK HER 5.184,1.226,3.8,EP DRA -1.172,0.279,43.8,TH1 TAU +1.172,0.279,3.8,TH1 TAU 2.272,-0.814,3.8,_ 2.335,-1.058,3.8,_ 2.781,-0.842,3.8,_ diff --git a/apps/planetarium/planetarium.extra.csv b/apps/planetarium/planetarium.extra.csv index f05f71d3e..bd6a3d318 100644 --- a/apps/planetarium/planetarium.extra.csv +++ b/apps/planetarium/planetarium.extra.csv @@ -1,2 +1,3 @@ 1.394,-0.230,4.3,LA LEP 1.367,-0.226,4.4,KA LEP +0.825,0.866,4.0,JO PER From 58bc22b1e65125d0629075125c619a85e753cd50 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 5 Feb 2021 16:40:29 +0100 Subject: [PATCH 100/148] adding readme to main page --- apps.json | 1 + apps/planetarium/README.md | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps.json b/apps.json index 8515fd153..25a6cbaa1 100644 --- a/apps.json +++ b/apps.json @@ -2714,6 +2714,7 @@ "name": "Planetarium", "shortName":"Planetarium", "icon": "planetarium.png", + "readme": "README.md", "version":"0.02", "description": "Planetarium showing up to 500 stars using the watch location and time", "tags": "", diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index e922c55ac..69ccd5334 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -27,3 +27,6 @@ Maybe you want to add some more constellations to the planetarium. As you can se - Upload the new `planetarium.const.csv` to your bangle (or emulator) and test it out. What is a constellation star is not in the 500 star list in `planetarium.data.csv`? If you need another star to draw the constellation you can find that star in the full star list (`starinfo/planetarium.stars.csv`) and put it in `planetarium.extra.csv`. That stars will be loaded only when constellations are shown. In order to refer to these extra stars in the `planetarium.const.csv` you have to use the code `e_linenumber`, in order to differenciate them from the stars in the normal file. For instance, to refer to the first star in the file `planetarium.extra.csv`, you will refer it as `e_1`. Do not forget to add an extra line at the end as in the other files. + +## Development version +Please check the latest development version [here](https://github.com/pglez82/BangleApps) From 21f49061414708b9a01c6c50176f517d33e3ea46 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Fri, 5 Feb 2021 18:16:16 +0100 Subject: [PATCH 101/148] adding a few constellations more --- apps/planetarium/planetarium.const.csv | 10 ++++++++++ apps/planetarium/planetarium.extra.csv | 14 ++++++++++++++ apps/planetarium/settings.js | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.const.csv b/apps/planetarium/planetarium.const.csv index c3c9104d9..c97df6295 100644 --- a/apps/planetarium/planetarium.const.csv +++ b/apps/planetarium/planetarium.const.csv @@ -26,3 +26,13 @@ Lupus 140 210,322 140,322 410,410 98,98 234,234 210,98 302,302 362,234 e_1,234 e_2 Leo 21 291,102 270,102 291,96 63,63 241,241 96,96 102,21 241,457 270,457 167 +Lyra +5 e_4,e_4 e_5,e_5 221,221 274,274 e_4 +Corona Borealis +69 353,353 e_6,69 429,429 e_7,e_7 e_8,e_8 e_9 +Herculis +296 135,135 477,477 203,203 296,443 203,443 408,135 127,127 380,e_10 477,464 296,265 e_10,e_10 202 +Ursa Minor +50 e_11,e_11 e_14,e_14 e_13,e_13 e_12,e_12 186,186 58,58 e_13 +Draco +e_15 131,131 70,70 382,382 e_15,382 187,187 423,423 e_16,e_16 207,207 122,122 e_17,e_17 232,232 342,342 452,452 428 diff --git a/apps/planetarium/planetarium.extra.csv b/apps/planetarium/planetarium.extra.csv index bd6a3d318..66be33d12 100644 --- a/apps/planetarium/planetarium.extra.csv +++ b/apps/planetarium/planetarium.extra.csv @@ -1,3 +1,17 @@ 1.394,-0.230,4.3,LA LEP 1.367,-0.226,4.4,KA LEP 0.825,0.866,4.0,JO PER +4.950,0.644,4.3,DE2 LYR +5.046,0.666,4.4,TH LYR +4.071,0.547,4.1,TH CRB +4.143,0.455,4.6,DE CRB +4.178,0.469,4.2,EP CRB +4.195,0.521,5.0,JO CRB +4.585,0.456,4.4,LA HER +4.591,1.511,4.4,DE UMI +4.265,1.322,5.0,ET UMI +4.119,1.358,4.3,ZE UMI +4.389,1.432,4.2,EP UMI +4.591,0.963,4.9,NY2 DRA +5.042,1.280,4.5,TA DRA +4.197,1.022,4.0,TH DRA diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index d2351e0db..caadb4016 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -1,6 +1,6 @@ // make sure to enclose the function in parentheses (function(back) { - let settings = require('Storage').readJSON('planetarium.json',1)||{}; + let settings = require('Storage').readJSON('planetarium.json',1)||{"starnames":false,"constellations":true,"consnames":false}; function save(key, value) { settings[key] = value; require('Storage').write('planetarium.json',settings); From 3e5396a451728dddd095f5975e385cf589233ca5 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Sat, 6 Feb 2021 20:06:42 +0100 Subject: [PATCH 102/148] adding pegasus --- apps/planetarium/planetarium.const.csv | 4 +++- apps/planetarium/planetarium.extra.csv | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/planetarium/planetarium.const.csv b/apps/planetarium/planetarium.const.csv index c97df6295..972e4faff 100644 --- a/apps/planetarium/planetarium.const.csv +++ b/apps/planetarium/planetarium.const.csv @@ -19,7 +19,7 @@ Cygnus Auriga 6 42,168 6,168 113,113 29,104 29,104 42 Can Maior -1 47,1 37,37 22,22 178,37 89 +1 37,22 178,37 435,435 89,1 e_18,e_18 e_19,e_19 e_20,e_20 e_18,37 277,277 22,450 488,277 488,488 47,1 488,e_21 488,22 495 Bootes 3 118,118 279,279 286,286 180,180 316,316 3 Lupus @@ -36,3 +36,5 @@ Ursa Minor 50 e_11,e_11 e_14,e_14 e_13,e_13 e_12,e_12 186,186 58,58 e_13 Draco e_15 131,131 70,70 382,382 e_15,382 187,187 423,423 e_16,e_16 207,207 122,122 e_17,e_17 232,232 342,342 452,452 428 +Pegasus +92 85,138 54,54 85,138 92,283 85,283 389,160 85,92 258,258 297,297 83 diff --git a/apps/planetarium/planetarium.extra.csv b/apps/planetarium/planetarium.extra.csv index 66be33d12..7d66b86c9 100644 --- a/apps/planetarium/planetarium.extra.csv +++ b/apps/planetarium/planetarium.extra.csv @@ -15,3 +15,7 @@ 4.591,0.963,4.9,NY2 DRA 5.042,1.280,4.5,TA DRA 4.197,1.022,4.0,TH DRA +1.816,-0.298,4.4,JO CMA +1.849,-0.273,4.1,GA CMA +1.807,-0.210,4.1,TH CMA +1.724,-0.401,4.5,XI2 CMA From 03105fe3f7a9feedbf9eefe5dcbe70d004a01bf7 Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Sat, 6 Feb 2021 20:23:00 +0100 Subject: [PATCH 103/148] updating version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 25a6cbaa1..7a5a8a8b5 100644 --- a/apps.json +++ b/apps.json @@ -2715,7 +2715,7 @@ "shortName":"Planetarium", "icon": "planetarium.png", "readme": "README.md", - "version":"0.02", + "version":"0.03", "description": "Planetarium showing up to 500 stars using the watch location and time", "tags": "", "storage": [ From 34c2967c03872a1b70b53070c8c48568bc25600e Mon Sep 17 00:00:00 2001 From: Pablo Gonzalez Date: Sat, 6 Feb 2021 20:25:02 +0100 Subject: [PATCH 104/148] readme and status --- apps/planetarium/ChangeLog | 3 ++- apps/planetarium/README.md | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/planetarium/ChangeLog b/apps/planetarium/ChangeLog index 5ff3fde91..78288f646 100644 --- a/apps/planetarium/ChangeLog +++ b/apps/planetarium/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! -0.02: Major speed improvement. Added more stars. Up to 500! \ No newline at end of file +0.02: Major speed improvement. Added more stars. Up to 500! +0.03: Added more stars and constellations. Now it shows 20 constellations. \ No newline at end of file diff --git a/apps/planetarium/README.md b/apps/planetarium/README.md index 69ccd5334..991fdffd2 100644 --- a/apps/planetarium/README.md +++ b/apps/planetarium/README.md @@ -4,7 +4,7 @@ This planetarium takes your position and time and plots the sky as it is. No planets, or moon, only stars. It can show the 500 most brilliant stars in the sky. -Plan is to show also constellations, but this is work in progress. Now it shows Taurus and Orion as examples. +It shows also constellations. Now it has 20 constellations but this is work in progress. Only northern hemisphere covered now. I think code is quite optimized already. It runs as fast as I could make it run. If someone has some ideas to speed it up, I could plot more stars. @@ -20,13 +20,13 @@ Please note that the watch hardware is limited and computing the stars positions ## Do you want to contribute? Maybe you want to add some more constellations to the planetarium. As you can see I didn't cover constellations in the south hemisphere. How to do it? It is a bit tedious but it can be done and you will learn the constellations pretty well at the end of it. Steps: -- Open the file `plantearium.data.csv`. There you have the 500 stars that we have in the planetarium. The number of each star is the line number. For isntance for Sirius, the star number will be 1. +- Open the file `plantearium.data.csv`. There you have the 500 stars that we have in the planetarium. The number of each star is the line number. For instance for Sirius, the star number will be 1. - Find the two stars that you want to join in your constellation (a constellation line). For identifying a star you have to have a look at the name, usually something like `AL UMA` (alpha star of constellation ursa major). Lets say that you want to join stars 155 and 8 (this is constellation canis menor, that only has a line joining two stars). - Go to file `planetarium.const.csv` and add two lines for your new constellation. The first one will be the name of the constellation, the second one the pair of stars that you want to join, separated by coma (see the file for examples). - Do not forget to add a break line after the last constellation. - Upload the new `planetarium.const.csv` to your bangle (or emulator) and test it out. -What is a constellation star is not in the 500 star list in `planetarium.data.csv`? If you need another star to draw the constellation you can find that star in the full star list (`starinfo/planetarium.stars.csv`) and put it in `planetarium.extra.csv`. That stars will be loaded only when constellations are shown. In order to refer to these extra stars in the `planetarium.const.csv` you have to use the code `e_linenumber`, in order to differenciate them from the stars in the normal file. For instance, to refer to the first star in the file `planetarium.extra.csv`, you will refer it as `e_1`. Do not forget to add an extra line at the end as in the other files. +What is a constellation star is not in the 500 star list in `planetarium.data.csv`? If you need another star to draw the constellation you can find that star in the full star list (`starinfo/planetarium.stars.csv`) and put it in `planetarium.extra.csv`. That stars will be loaded only when constellations are shown. In order to refer to these extra stars in the `planetarium.const.csv` you have to use the code `e_linenumber`, in order to differentiate them from the stars in the normal file. For instance, to refer to the first star in the file `planetarium.extra.csv`, you will refer it as `e_1`. Do not forget to add an extra line at the end as in the other files. ## Development version Please check the latest development version [here](https://github.com/pglez82/BangleApps) From 5af6641f3730ebecdcdf0f62c91f3d478f739534 Mon Sep 17 00:00:00 2001 From: dapgo Date: Sat, 6 Feb 2021 22:38:59 +0100 Subject: [PATCH 105/148] Test user Input v002. App improved, removed warnings, and added screenshots to README --- apps/test_UserInput/Changelog | 1 + apps/test_UserInput/README.md | 43 ++++++---- apps/test_UserInput/testUserInput_ss0.png | Bin 0 -> 82961 bytes apps/test_UserInput/testUserInput_ss1.png | Bin 0 -> 103257 bytes apps/test_UserInput/testUserInput_ss2.png | Bin 0 -> 88076 bytes apps/test_UserInput/testUserInput_ss3.png | Bin 0 -> 86750 bytes apps/test_UserInput/test_userInput.app.js | 96 +++++++++++----------- 7 files changed, 76 insertions(+), 64 deletions(-) create mode 100644 apps/test_UserInput/testUserInput_ss0.png create mode 100644 apps/test_UserInput/testUserInput_ss1.png create mode 100644 apps/test_UserInput/testUserInput_ss2.png create mode 100644 apps/test_UserInput/testUserInput_ss3.png diff --git a/apps/test_UserInput/Changelog b/apps/test_UserInput/Changelog index e69de29bb..84f50a78b 100644 --- a/apps/test_UserInput/Changelog +++ b/apps/test_UserInput/Changelog @@ -0,0 +1 @@ +0.02: app to test the bangle.js Input interface \ No newline at end of file diff --git a/apps/test_UserInput/README.md b/apps/test_UserInput/README.md index d2ecf898b..5fc5f3864 100644 --- a/apps/test_UserInput/README.md +++ b/apps/test_UserInput/README.md @@ -1,33 +1,40 @@ -# App Name +# Test User Input -test UserInput app +This very basic app, allows to *test the bangle.js input interface*, and displays the result in text or a switch on/off image. -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) -## Warnings/pending tasks -add sliding gestures +Launcher icon +![](testUserInput_ss0.png) +1st screen - Help/Intro +![](testUserInput_ss1.png) +2nd screen - interface and a result +![](testUserInput_ss2.png) +3rd screen - interface and a result +![](testUserInput_ss3.png) + ## Usage -open and see a "help" screen -interact to print the event or leave the app +Open and see a "help" screen +Interact with buttons or touch screen to print the event or leave the app ## Features -Colours, font, user input - +Colours, font, user input, image, load widgets ## Controls - -finger touch -button 1 and 3 +Press left area - Prints Touch1 +Press righ area - Prints Touch2 +Press center area - Prints Touch3 +Swipe Left - Displays Switch OFF image +Swipe Right - Displays Switch ON image +BTN1 - Prints Button1 +BTN2 - Prints Button2 +BTN3 - Quit to Launcher -## Requests +## Support -This simple app has not support - -## Creator - -Daniel Perez \ No newline at end of file +This app is so basic that probably the easiest is to just edit the code +Otherwise you can contact me [here](https://github.com/dapgo) \ No newline at end of file diff --git a/apps/test_UserInput/testUserInput_ss0.png b/apps/test_UserInput/testUserInput_ss0.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c1a2cec610da9834f117790c4d928e7900f3df GIT binary patch literal 82961 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�Fc)0m8L?ALqH&oa5`gQRv^8 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 IYoW=dDoK6 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%0Aakco#hyinpq4LW0w9oX|W;fu=$}s}Th6We_+} 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 N=r(m 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 C3;CP? literal 0 HcmV?d00001 diff --git a/apps/walkersclock/gps_speed.jpg b/apps/walkersclock/gps_speed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c021b128e837cc19b54d4fe5b3c2b1edb82eb73 GIT binary patch literal 44988 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 literal 0 HcmV?d00001 diff --git a/apps/walkersclock/icon.js b/apps/walkersclock/icon.js new file mode 100644 index 000000000..7312a1308 --- /dev/null +++ b/apps/walkersclock/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgRC/AH4Ae/4AEBaPwAgcPBaIvvBZkL8ED6ALHl/4+XgBY89vnw+ALHngDB+gLK3AjKng7JBwJTJgEfO76/iAH4A/ADAA=")) diff --git a/apps/walkersclock/walkersclock48.png b/apps/walkersclock/walkersclock48.png new file mode 100644 index 0000000000000000000000000000000000000000..492af0c617dc848ce203e5bdf94a2b7973092d5b GIT binary patch literal 1861 zcmV-L2fFx)P)W4^0B9;0jN}EcJ`XQ>+iWU(GlUCTo*u=r8tq2fIAqGEqIbdUB z*Xy;7y=(8xoPO}G?>+bY&wpp{IcI0!0q!qUq8*l(@5-1Y^rTWG zYr5m~v19LaC7NR<5-OmyqVh+GdILxa519yW`|f1^yz>z3NPwlMyI->Ri zZeS9)3nZi1lAIb?a{bEX#zb+=gqA2rVyagGC8!fl)06YW7m70x`E7W5Pf1Dj(nN91 zM8X6B8vrzAzFA*?U}WFEeWp{AUJK88a2e|o$Tbbydtk?oZ>NW}V0Lsz>KXtdyF_t1 z*7!__!#&n?xz zPM@TAaA4M$D8B!GUCp2D2w2!FAgDaGK$`WYq}lOn8!l~rCfA_A?s{8UX!lDm#1Ycs zu)XBV-RSK`H}rY7Vk+AmtYsZ2t*BfrLc!cRuxdpC1XW!G7|x9-_E#wIxx{U_Y&0S4j4Fc=EHG85kMj!u1YJ(+o#4RR=_q;ilSm&n84b z1SJ(!Ta|FauG4tnaykj=I!f_cV_nU@c-O~lr%TJKH!AoQ@F>8}9VO^fgc#u><#xMB zOHCyy$rJU^G>wq1qiKqz>FMNTXR>MI=kWVS2n2%wd8^j0yLGLztvwzAmUp0}tn!;m zslNiQ$k?l|ygWUBw4sTMt?fKkyq5Cq+boGLwzhM$p^2qS)7bsPPwUE?Z~c+r#Kg>i ze%E-k=4W;VMBT(+tEkRXO8psdd6GQS<11I@;q`h+NlC%!oGRo_r<0VF6wAZonew5O zA}J|p9$%!@5cp|ndG#}P1w?HnoF=($Mg3uWe^`1Vm6; zUUe4OlHpC~>C&%|os}66&om6fpu4+=Kp@D)OC8)9@BxfDO;uE1e`p}q`niZHVDsje zT$#&#zX16zs5Ox_nol-J^DXV7;ugww5fq}WYTl15s#1BV8|fN-X93$h^@F*ibgWMt~TPv-f`*xh0pzmgg@R0*)CiwLbYCB~ zBpMo+DpNM zL(p|;_VcpI2_bMd9Jj~~`{CP3qve&q2el_2r;CN4T88>Ez7$UywY&oWzP_xVXXW~C zi|`yUtNbb?M^I@B85NXe6;+TXkOQKFx;bY$fbb99;oKYV`{aAdGNt8}-x1UwG{uh_ z>uL^I*>2lWydx&oNB>uFN~00000NkvXXu0mjf3E`z) literal 0 HcmV?d00001 From eafdb5c776671dcd2bc9b2a1aa390c6489d13bdc Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 11 Feb 2021 20:34:51 +0000 Subject: [PATCH 137/148] added walkers clock to apps.json --- apps.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 89428e841..b05265cd2 100644 --- a/apps.json +++ b/apps.json @@ -2139,7 +2139,7 @@ { "id": "multiclock", "name": "Multi Clock", "icon": "multiclock.png", - "version":"0.11", + "version":"0.12", "description": "Clock with multiple faces - Big, Analogue, Digital, Text, Time-Date.\n Switch between faces with BTN1 & BTN3", "readme": "README.md", "tags": "clock", @@ -2153,8 +2153,6 @@ {"name":"txt.face.js","url":"txt.js"}, {"name":"timdat.face.js","url":"timdat.js"}, {"name":"ped.face.js","url":"ped.js"}, - {"name":"gps.face.js","url":"gps.js"}, - {"name":"osref.face.js","url":"osref.js"}, {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} ] }, @@ -2782,5 +2780,18 @@ {"name":"gpssetup.app.js","url":"app.js"}, {"name":"gpssetup.img","url":"icon.js","evaluate":true} ] +}, +{ "id": "walkersclock", + "name": "Walkers Clock", + "shortName":"Walkers Clock", + "icon": "walkersclock48.png", + "version":"0.01", + "description": "A larg font watch, displays steps, can switch GPS on/off, displays grid reference", + "tags": "gps, tools, outdoors", + "readme": "README.md", + "storage": [ + {"name":"walkersclock.app.js","url":"app.js"}, + {"name":"walkersclock.img","url":"icon.js","evaluate":true} + ] } ] From 4fdba2ac9058aea229428f324b5fe4fca1b1c614 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 11 Feb 2021 20:36:52 +0000 Subject: [PATCH 138/148] removed osref.js and gps.js from multiclock, superceded by GPSsetup and Walkers Clock --- apps/multiclock/ChangeLog | 1 + apps/multiclock/apps_entry.json | 2 - apps/multiclock/gps.js | 95 --------------- apps/multiclock/osref.js | 202 -------------------------------- 4 files changed, 1 insertion(+), 299 deletions(-) delete mode 100644 apps/multiclock/gps.js delete mode 100644 apps/multiclock/osref.js diff --git a/apps/multiclock/ChangeLog b/apps/multiclock/ChangeLog index 3ed2ed6b4..c02e390b2 100644 --- a/apps/multiclock/ChangeLog +++ b/apps/multiclock/ChangeLog @@ -9,3 +9,4 @@ 0.09: Added Pedometer clock 0.10: Added GPS and Grid Ref clock faces 0.11: Updated Pedometer clock to retrieve steps from either wpedom or activepedom +0.12: Removed GPS and Grid Ref clock faces, superceded by GPS setup and Walkers Clock diff --git a/apps/multiclock/apps_entry.json b/apps/multiclock/apps_entry.json index 19b6bc43d..6383609c1 100644 --- a/apps/multiclock/apps_entry.json +++ b/apps/multiclock/apps_entry.json @@ -14,8 +14,6 @@ {"name":"digi.face.js","url":"digi.min.js"}, {"name":"txt.face.js","url":"txt.min.js"}, {"name":"ped.face.js","url":"ped.js"}, - {"name":"osref.face.js","url":"osref.js"}, - {"name":"gps.face.js","url":"pgs.js"}, {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} ] }, diff --git a/apps/multiclock/gps.js b/apps/multiclock/gps.js deleted file mode 100644 index 3e756fc5e..000000000 --- a/apps/multiclock/gps.js +++ /dev/null @@ -1,95 +0,0 @@ -(() => { - - function getFace(){ - - //var img = require("heatshrink").decompress(atob("mEwghC/AH4AKg9wC6t3u4uVC6wWBI6t3uJeVuMQCqcBLisAi4XLxAABFxAXKgc4DBAuBRhQXEDAq7MmYXEwBHEXZYXFGAOqAAKDMmczC4mIC62CC50PC4JIBkQABiIvRmURAAUSjQXSFwMoxGKC6CRFwUSVYgXLPIgXXwMYegoXLJAYXCGBnzGA0hPQIwMgYwGC6gwCC4ZIMC4gYBC604C4ZISmcRVgapQAAMhC6GIJIwXCMBcIxGDDBAuLC4IwGAARGMAAQWGmAXPJQoWMC4pwCCpoXJAB4XXAH4A/ABQA=")); - var nofix = 0; - - function formatTime(now) { - var fd = now.toUTCString().split(" "); - return fd[4]; - } - - - function timeSince(t) { - var hms = t.split(":"); - var now = new Date(); - - var sn = 3600*(now.getHours()) + 60*(now.getMinutes()) + 1*(now.getSeconds()); - var st = 3600*(hms[0]) + 60*(hms[1]) + 1*(hms[2]); - - return (sn - st); - } - - function draw() { - var gps_on = false; - - var fix = { - fix: 0, - alt: 0, - lat: 0, - lon: 0, - speed: 0, - time: 0, - satellites: 0 - }; - - var y_line = 26; - var y_start = 46; - var x_start = 10; - - // only attempt to get gps fix if gpsservuce is loaded - if (WIDGETS.gpsservice !== undefined) { - fix = WIDGETS.gpsservice.gps_get_fix(); - gps_on = WIDGETS.gpsservice.gps_get_status(); - } - - g.reset(); - g.clearRect(0,24,239,239); - - if (fix.fix) { - var time = formatTime(fix.time); - var age = timeSince(time); - - g.setFontAlign(-1, -1); - g.setFont("6x8"); - g.setFontVector(22); - g.drawString("Alt: " + fix.alt +" m", x_start, y_start, true); - g.drawString("Lat: "+ fix.lat, x_start, y_start + y_line, true); - g.drawString("Lon: " + fix.lon, x_start, y_start + 2*y_line, true); - g.drawString("Time: " + time, x_start, y_start + 3*y_line, true); - g.drawString("Age(s): " + age, x_start, y_start + 4*y_line, true); - g.drawString("Satellites: " + fix.satellites, x_start, y_start + 5*y_line, true); - - } else if (gps_on) { - - g.setFontAlign(0, 1); - g.setFont("6x8", 2); - g.drawString("GPS Watch", 120, 60); - g.drawString("Waiting for GPS", 120, 80); - nofix = (nofix+1) % 4; - g.drawString(".".repeat(nofix) + " ".repeat(4-nofix), 120, 120); - g.setFontAlign(0,0); - g.drawString(fix.satellites + " satellites", 120, 100); - - } else if (!gps_on) { - - g.setFontAlign(0, 0); - g.setFont("6x8", 3); - g.drawString("GPS Watch", 120, 80); - g.drawString("GPS is off",120, 160); - - } - } - - function onSecond(){ - var t = new Date(); - if ((t.getSeconds() % 5) === 0) draw(); - } - - return {init:draw, tick:onSecond}; - } - - return getFace; - -})(); diff --git a/apps/multiclock/osref.js b/apps/multiclock/osref.js deleted file mode 100644 index c98b73134..000000000 --- a/apps/multiclock/osref.js +++ /dev/null @@ -1,202 +0,0 @@ -(() => { - - function getFace(){ - var nofix = 0; - - function formatTime(now) { - var fd = now.toUTCString().split(" "); - return fd[4]; - } - - function timeSince(t) { - var hms = t.split(":"); - var now = new Date(); - - var sn = 3600*(now.getHours()) + 60*(now.getMinutes()) + 1*(now.getSeconds()); - var st = 3600*(hms[0]) + 60*(hms[1]) + 1*(hms[2]); - - return (sn - st); - } - - - Number.prototype.toRad = function() { return this*Math.PI/180; }; - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - /* Ordnance Survey Grid Reference functions (c) Chris Veness 2005-2014 */ - /* - www.movable-type.co.uk/scripts/gridref.js */ - /* - www.movable-type.co.uk/scripts/latlon-gridref.html */ - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - function OsGridRef(easting, northing) { - this.easting = 0|easting; - this.northing = 0|northing; - } - OsGridRef.latLongToOsGrid = function(point) { - var lat = point.lat.toRad(); - var lon = point.lon.toRad(); - - var a = 6377563.396, b = 6356256.909; // Airy 1830 major & minor semi-axes - var F0 = 0.9996012717; // NatGrid scale factor on central meridian - var lat0 = (49).toRad(), lon0 = (-2).toRad(); // NatGrid true origin is 49�N,2�W - var N0 = -100000, E0 = 400000; // northing & easting of true origin, metres - var e2 = 1 - (b*b)/(a*a); // eccentricity squared - var n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n; - - var cosLat = Math.cos(lat), sinLat = Math.sin(lat); - var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat); // transverse radius of curvature - var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5); // meridional radius of curvature - var eta2 = nu/rho-1; - - var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0); - var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0); - var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0)); - var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0)); - var M = b * F0 * (Ma - Mb + Mc - Md); // meridional arc - - var cos3lat = cosLat*cosLat*cosLat; - var cos5lat = cos3lat*cosLat*cosLat; - var tan2lat = Math.tan(lat)*Math.tan(lat); - var tan4lat = tan2lat*tan2lat; - - var I = M + N0; - var II = (nu/2)*sinLat*cosLat; - var III = (nu/24)*sinLat*cos3lat*(5-tan2lat+9*eta2); - var IIIA = (nu/720)*sinLat*cos5lat*(61-58*tan2lat+tan4lat); - var IV = nu*cosLat; - var V = (nu/6)*cos3lat*(nu/rho-tan2lat); - var VI = (nu/120) * cos5lat * (5 - 18*tan2lat + tan4lat + 14*eta2 - 58*tan2lat*eta2); - - var dLon = lon-lon0; - var dLon2 = dLon*dLon, dLon3 = dLon2*dLon, dLon4 = dLon3*dLon, dLon5 = dLon4*dLon, dLon6 = dLon5*dLon; - - var N = I + II*dLon2 + III*dLon4 + IIIA*dLon6; - var E = E0 + IV*dLon + V*dLon3 + VI*dLon5; - - return new OsGridRef(E, N); - }; - - - /* - * converts northing, easting to standard OS grid reference. - * - * [digits=10] - precision (10 digits = metres) - * to_map_ref(8, 651409, 313177); => 'TG 5140 1317' - * to_map_ref(0, 651409, 313177); => '651409,313177' - * - */ - function to_map_ref(digits, easting, northing) { - if (![ 0,2,4,6,8,10,12,14,16 ].includes(Number(digits))) throw new RangeError(`invalid precision '${digits}'`); // eslint-disable-line comma-spacing - - let e = easting; - let n = northing; - - // use digits = 0 to return numeric format (in metres) - note northing may be >= 1e7 - if (digits == 0) { - const format = { useGrouping: false, minimumIntegerDigits: 6, maximumFractionDigits: 3 }; - const ePad = e.toLocaleString('en', format); - const nPad = n.toLocaleString('en', format); - return `${ePad},${nPad}`; - } - - // get the 100km-grid indices - const e100km = Math.floor(e / 100000), n100km = Math.floor(n / 100000); - - // translate those into numeric equivalents of the grid letters - let l1 = (19 - n100km) - (19 - n100km) % 5 + Math.floor((e100km + 10) / 5); - let l2 = (19 - n100km) * 5 % 25 + e100km % 5; - - // compensate for skipped 'I' and build grid letter-pairs - if (l1 > 7) l1++; - if (l2 > 7) l2++; - const letterPair = String.fromCharCode(l1 + 'A'.charCodeAt(0), l2 + 'A'.charCodeAt(0)); - - // strip 100km-grid indices from easting & northing, and reduce precision - e = Math.floor((e % 100000) / Math.pow(10, 5 - digits / 2)); - n = Math.floor((n % 100000) / Math.pow(10, 5 - digits / 2)); - - // pad eastings & northings with leading zeros - e = e.toString().padStart(digits/2, '0'); - n = n.toString().padStart(digits/2, '0'); - - return `${letterPair} ${e} ${n}`; - } - - function draw() { - var gps_on = false; - - var fix = { - fix: 0, - alt: 0, - lat: 0, - lon: 0, - speed: 0, - time: 0, - satellites: 0 - }; - - var y_line = 26; - var y_start = 46; - var x_start = 10; - - // only attempt to get gps fix if gpsservuce is loaded - if (WIDGETS.gpsservice !== undefined) { - fix = WIDGETS.gpsservice.gps_get_fix(); - gps_on = WIDGETS.gpsservice.gps_get_status(); - } - - g.reset(); - g.clearRect(0,24,239,239); - - if (fix.fix) { - var time = formatTime(fix.time); - var age = timeSince(time); - var os = OsGridRef.latLongToOsGrid(fix); - var ref = to_map_ref(6, os.easting, os.northing); - age = age >=0 ? age : 0; // avoid -1 etc - - g.reset(); - g.clearRect(0,24,239,239); - g.setFontAlign(0,0); - g.setFont("Vector"); - g.setColor(1,1,1); - g.setFontVector(40); - g.drawString(time, 120, 80); - - g.setFontVector(40); - g.setColor(0xFFC0); - g.drawString(ref, 120,140, true); - - g.setFont("6x8",2); - g.setColor(1,1,1); - g.drawString(age, 120, 194); - - } else if (gps_on) { - - g.setFontAlign(0, 1); - g.setFont("6x8", 2); - g.drawString("Gridref Watch", 120, 60); - g.drawString("Waiting for GPS", 120, 80); - nofix = (nofix+1) % 4; - g.drawString(".".repeat(nofix) + " ".repeat(4-nofix), 120, 120); - g.setFontAlign(0,0); - g.drawString(fix.satellites + " satellites", 120, 100); - - } else if (!gps_on) { - - g.setFontAlign(0, 0); - g.setFont("6x8", 3); - g.drawString("Gridref Watch", 120, 80); - g.drawString("GPS is off", 120, 160); - - } - } - - function onSecond(){ - var t = new Date(); - if ((t.getSeconds() % 5) === 0) draw(); - } - - return {init:draw, tick:onSecond}; - } - - return getFace; - -})(); From cd2b95f3ba74f7f47e7966c0b59abbaaca70a90f Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 11 Feb 2021 21:06:29 +0000 Subject: [PATCH 139/148] fixed icon for walkerswatch --- apps/walkersclock/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/walkersclock/icon.js b/apps/walkersclock/icon.js index 7312a1308..5a48c6cc9 100644 --- a/apps/walkersclock/icon.js +++ b/apps/walkersclock/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgRC/AH4Ae/4AEBaPwAgcPBaIvvBZkL8ED6ALHl/4+XgBY89vnw+ALHngDB+gLK3AjKng7JBwJTJgEfO76/iAH4A/ADAA=")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AEcsAAYuuGFIqEF9gFJF/62SACAvvGCgYEwIASqwxVF4mmACQvEGCJcCF65iDF/4vbqwvVd4YeBJgIECAAulq4KDmS/XAAVXJwgvHOAIKCOoQuTGQ1WvYvCvYAGBQdWLwYtUMQwAQGAQuYXgJPCmQEBAAwKDCQKNZlmsAAKECAoQAEX4QQESKh4EDwVXegIvPSKgbBDwMs64ABAoOBAoQAE1gvGTAQwQCINXF4olBFw4KCAAYvCDIQvZABgv/F/4vqCoYvpGAMyF7ICBF6QADEIeBABQuCF4QACFyAwFDwRlCABNWHoUyFyoxEwOIxGBPoIAJMYYvCFyrzEGAIALFwS7TYRYACmQAGSxAtcACaNWwGArizBAwIAININWrgTCF6+GAAYvCA4gACwAKGCQIv/F+qqBAAQvCA4gACXAIKFF67cBAAQvCAwYKFmQGFF6wAZF6YxaFyo1HIBYpcAH4A/AAoA==")); From 7dde9a4d23dd1e1b65e67b04b8ff108b135985ee Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 11 Feb 2021 21:24:59 +0000 Subject: [PATCH 140/148] added type=clock for walkers clock in apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b05265cd2..d5dcc9b3e 100644 --- a/apps.json +++ b/apps.json @@ -2787,7 +2787,8 @@ "icon": "walkersclock48.png", "version":"0.01", "description": "A larg font watch, displays steps, can switch GPS on/off, displays grid reference", - "tags": "gps, tools, outdoors", + "type":"clock", + "tags": "clock, gps, tools, outdoors", "readme": "README.md", "storage": [ {"name":"walkersclock.app.js","url":"app.js"}, From c81091e8b846c9e2571652bf4e3b5cff336a692f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 12 Feb 2021 09:14:52 +0000 Subject: [PATCH 141/148] fix walkersclock icon --- apps/walkersclock/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/walkersclock/icon.js b/apps/walkersclock/icon.js index 5a48c6cc9..cc1b8b8da 100644 --- a/apps/walkersclock/icon.js +++ b/apps/walkersclock/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AEcsAAYuuGFIqEF9gFJF/62SACAvvGCgYEwIASqwxVF4mmACQvEGCJcCF65iDF/4vbqwvVd4YeBJgIECAAulq4KDmS/XAAVXJwgvHOAIKCOoQuTGQ1WvYvCvYAGBQdWLwYtUMQwAQGAQuYXgJPCmQEBAAwKDCQKNZlmsAAKECAoQAEX4QQESKh4EDwVXegIvPSKgbBDwMs64ABAoOBAoQAE1gvGTAQwQCINXF4olBFw4KCAAYvCDIQvZABgv/F/4vqCoYvpGAMyF7ICBF6QADEIeBABQuCF4QACFyAwFDwRlCABNWHoUyFyoxEwOIxGBPoIAJMYYvCFyrzEGAIALFwS7TYRYACmQAGSxAtcACaNWwGArizBAwIAININWrgTCF6+GAAYvCA4gACwAKGCQIv/F+qqBAAQvCA4gACXAIKFF67cBAAQvCAwYKFmQGFF6wAZF6YxaFyo1HIBYpcAH4A/AAoA==")); +require("heatshrink").decompress(atob("mEwxH+AH4A/AEcsAAYuuGFIqEF9gFJF/62SACAvvGCgYEwIASqwxVF4mmACQvEGCJcCF65iDF/4vbqwvVd4YeBJgIECAAulq4KDmS/XAAVXJwgvHOAIKCOoQuTGQ1WvYvCvYAGBQdWLwYtUMQwAQGAQuYXgJPCmQEBAAwKDCQKNZlmsAAKECAoQAEX4QQESKh4EDwVXegIvPSKgbBDwMs64ABAoOBAoQAE1gvGTAQwQCINXF4olBFw4KCAAYvCDIQvZABgv/F/4vqCoYvpGAMyF7ICBF6QADEIeBABQuCF4QACFyAwFDwRlCABNWHoUyFyoxEwOIxGBPoIAJMYYvCFyrzEGAIALFwS7TYRYACmQAGSxAtcACaNWwGArizBAwIAININWrgTCF6+GAAYvCA4gACwAKGCQIv/F+qqBAAQvCA4gACXAIKFF67cBAAQvCAwYKFmQGFF6wAZF6YxaFyo1HIBYpcAH4A/AAoA==")) From 56500622ee7e1cd37af70223bbb7a3be17d1108d Mon Sep 17 00:00:00 2001 From: nujw Date: Sat, 13 Feb 2021 09:07:07 +1300 Subject: [PATCH 142/148] Delete waypoints.json --- apps/speedalt/waypoints.json | 66 ------------------------------------ 1 file changed, 66 deletions(-) delete mode 100644 apps/speedalt/waypoints.json diff --git a/apps/speedalt/waypoints.json b/apps/speedalt/waypoints.json deleted file mode 100644 index b117bc5c2..000000000 --- a/apps/speedalt/waypoints.json +++ /dev/null @@ -1,66 +0,0 @@ -[ - { - "name":"NONE" - }, - { - "name":"Omori", - "lat":-38.9058670, - "lon":175.7613350 - }, - { - "name":"DeltaW", - "lat":-38.9438550, - "lon":175.7676930 - }, - { - "name":"DeltaE", - "lat":-38.9395240, - "lon":175.7814420 - }, - { - "name":"BtClub", - "lat":-38.9446020, - "lon":175.8475720 - }, - { - "name":"Hapua", - "lat":-38.8177750, - "lon":175.8088720 - }, - { - "name":"MotuTa", - "lat":-38.85454, - "lon":175.94199 - }, - { - "name":"Nook", - "lat":-38.7848090, - "lon":175.7839440 - }, - { - "name":"ChryBy", - "lat":-38.7975050, - "lon":175.7551960 - }, - { - "name":"Waiha", - "lat":-38.7219630, - "lon":175.7481520 - }, - { - "name":"KwaKwa", - "lat":-38.6632310, - "lon":175.8670320 - }, - { - "name":"Hatepe", - "lat":-38.8547420, - "lon":176.0089124 - }, - { - "name":"Kinloc", - "lat":-38.6614442, - "lon":175.9161607 - } - -] From 5a98eda2d090d6060b94091a0cb1afd15367154e Mon Sep 17 00:00:00 2001 From: nujw Date: Sat, 13 Feb 2021 09:17:55 +1300 Subject: [PATCH 143/148] Delete _config.yml --- _config.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 _config.yml diff --git a/_config.yml b/_config.yml deleted file mode 100644 index b84971359..000000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-leap-day \ No newline at end of file From 97b47087f482cbbcccbd20e0cfe8b102c649ac40 Mon Sep 17 00:00:00 2001 From: nujw Date: Sat, 13 Feb 2021 09:24:00 +1300 Subject: [PATCH 144/148] Update ChangeLog --- apps/speedalt/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt/ChangeLog b/apps/speedalt/ChangeLog index 2c77ccafa..1020a8eec 100644 --- a/apps/speedalt/ChangeLog +++ b/apps/speedalt/ChangeLog @@ -5,4 +5,4 @@ 0.05 : Add setting to turn vibrate on/off. 0.06 : Tweaks to vibration settings. 0.07 : Switch to BTN1 for Max toggle and reset function. -1.00 : New features. Added waypoints file and distance to selected waypoint display. Added integration with Low Power GPS service. Save display settings and restore when app restarted. +1.00 : New features. Added waypoints file and distance to selected waypoint display. Added integration with GPS Setup module to switch GPS to low power mode when screen off. Save display settings and restore when app restarted. From 1ab10da07b3df8c23fd84891feb60c771bc23a49 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 15 Feb 2021 08:27:40 +1300 Subject: [PATCH 145/148] Update ChangeLog --- apps/speedalt/ChangeLog | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/speedalt/ChangeLog b/apps/speedalt/ChangeLog index 1020a8eec..e87c903bb 100644 --- a/apps/speedalt/ChangeLog +++ b/apps/speedalt/ChangeLog @@ -1,8 +1,8 @@ -0.01 : Initial import. -0.02 : Misc development. -0.03 : Enable screen off. -0.04 : Vibrate once on no fix, twice on fix. -0.05 : Add setting to turn vibrate on/off. -0.06 : Tweaks to vibration settings. -0.07 : Switch to BTN1 for Max toggle and reset function. -1.00 : New features. Added waypoints file and distance to selected waypoint display. Added integration with GPS Setup module to switch GPS to low power mode when screen off. Save display settings and restore when app restarted. +0.01: Initial import. +0.02: Misc development. +0.03: Enable screen off. +0.04: Vibrate once on no fix, twice on fix. +0.05: Add setting to turn vibrate on/off. +0.06: Tweaks to vibration settings. +0.07: Switch to BTN1 for Max toggle and reset function. +1.00: New features. Added waypoints file and distance to selected waypoint display. Added integration with GPS Setup module to switch GPS to low power mode when screen off. Save display settings and restore when app restarted. From dec45dca82d453c223430c21f5bf143f1946eaac Mon Sep 17 00:00:00 2001 From: nujw Date: Tue, 16 Feb 2021 16:52:47 +1300 Subject: [PATCH 146/148] Add en_NZ Locale data for New Zealand --- apps/locale/locales.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 0861bc907..14d0f43c5 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -245,6 +245,24 @@ var locales = { day: "söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag", trans: { yes: "ja", Yes: "Ja", no: "nej", No: "Nej", ok: "ok", on: "on", off: "off" } }, + "en_NZ": { + lang: "en_NZ", + decimal_point: ".", + thousands_sep: ",", + currency_symbol: "$", + int_curr_symbol: "NZD", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "am", 1: "pm" }, + timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, + datePattern: { 0: "%A, %B %d, %Y", "1": "%d/%m/%y" }, // Sunday, 1 March 2020 // 1/3/20 + abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", + month: "January,February,March,April,May,June,July,August,September,October,November,December", + abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat", + day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", + // No translation for english... + }, "en_AU": { lang: "en_AU", decimal_point: ".", From 7f89aec5e3931f30c4f10d84b79264bc1c18e01a Mon Sep 17 00:00:00 2001 From: nujw Date: Tue, 16 Feb 2021 16:55:28 +1300 Subject: [PATCH 147/148] Update locales.js --- apps/locale/locales.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 14d0f43c5..bad920b44 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -251,7 +251,7 @@ var locales = { thousands_sep: ",", currency_symbol: "$", int_curr_symbol: "NZD", - speed: "kmh", + speed: "kph", distance: { 0: "m", 1: "km" }, temperature: "°C", ampm: { 0: "am", 1: "pm" }, From b5d84df06edca8b0e4160cd4ded49001530e98cc Mon Sep 17 00:00:00 2001 From: nujw Date: Tue, 16 Feb 2021 16:59:48 +1300 Subject: [PATCH 148/148] Added New Zealand en_NZ --- apps/locale/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index c6779bf27..3d64cf8d7 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -8,3 +8,4 @@ Ensure 'on' is always supplied for translations 0.07: Improve handling of non-ASCII characters (fix #469) 0.08: Added Mavigation units and en_NAV +0.09: Added New Zealand en_NZ

@)P{8d24R;W(VrPT1-XdGIp6f&JS^s?&SnwliIw^Yajh&6^t ziZeM_ASLe*e9+MCsChi9Lrb|CV~VBs&k$}SJ<5fXE8=jNxoQ%DxzOZ8IoWjxOI4-# zPe;8T5k-j{vlBBzh@^ZgQc5Yt;A#avs%owZil59UTSqa?&Qw*kYGzJQXOb9s0#z(v zg(GW6?q;MS3~~dM0Qg-WeE<3FeB!&`8$7>oVYK|i!+Wm1{`D(Ky%HYU6JPwwp^vr*!JV(HGl=^DyERJd5na$t4*#!%_S6GqQ8*g?rx6s|nN9Mu(Zx z)cymF+qBg^?zB7H=6cR6l)ZSC2(U~oxd3sgwI4%2*U8Aj?9lvzj z_?Z_^-}gZGWAFEFJ$m-Jsi)5PGp80$pG(*6Yxi#LuP)Nj3;NP&>h^rOACH7GCd~?X zeZ{`~p4V^m&_dA;=z+%vPoMNBUgaHAvw!e@+R|Z1%9fV<3xDy&-S^%;K5~EnQ|YWX z!>>HK^vQ3dU#^L^*-M(Vu*>BS1WIwqBb%ISJ@_3?EQS^=t{`N9Q>rZfbWBSnYr<29 zq`2XME>Uq})=@qoStV7bI=x@RR(Vy|g?dBS)@q(54PQC6_`r``y42*#iIk&sk)f7V_U@U!;-I2O zc@S?uL9Mw-QN8zEkDH_()0k-f5EtlC02$O8%ufy2l`ymC>J4wz6=XxHZRm9D0+}^1 zI(c#ZD-WZuz9Y%Xdb@WfUpT+?)raVXWvnZEa*J&d)2qajqL1}8y4Cd`Qo-L2J3H5aW*iEFW1xgD3nskvH9A|cykPG#Ff zU=qvz_?NzBo#`v@e)I5(Yuw@5o_*z+=l=BX;ZXCsZ?dtzckA3>Fnsv_f4KIIcWgU! z&7!X*hc{r(Ow=$EhQo1 zx4N)=iQE-D7jj~WpWFcm67k4dTs&9joP{cunWg?92j(RBP(bVMLMB2LK&eH0ZUt)t zADZXLJWW`9=1$a}ICtv*`gHe}E9T#Q`{=T5>H4cX2M$(=R=)M<`Ty__)xn)M-EHcs zKW_6+UOxZ)#pF9vf)$76wkqEZEgfoTAiSpfEr&`jwtQ+#ofQaaNFlB;j&!6K0(d z+(IW_u7eYjUBRXZqu@Yu3L*w4%9|7)z>Hw6wr+Xy>L6nBY?eIksgvOl97tMtHtawi zkHG{XBAYC^IUA}f<=B{)f>+#6T9!C}i#tW|iY0|1l{}W283ayAh)k8vu08psFJx(H z-%b-xqv7*^_gTNV9=MVA)P-k1{pGj5{{yKRwa*?MUwQ5NuCPu=fpdG+((ndfT9jo0Sg2lM*U+Si_1dGxri4M_xQ zDBWI6J{$}{GGk$N{K)gOZ@GEBCp2igCoZo2({~4_*8IW{TXzrlzV_$36m|SZ|&=*SNw7nXuZD)jnAg6|@pfSjfSno4onsT}n~sE9JcC-~n8h z+KBt)Q-w(uxl#)W3iVp;EBbCG+`Rr7Y=Fnh*+!cCh=@UyaB=b}; ztL0EngkL?Vd@Lz;lvciEo0T*-w|GF9NgTFQN*3@z^NL7aeO%U26znzyjonYIJ@<*v zV>&sBn_<0AIn;8U3#@Kaxxs-Az-EyG!=rgzd;eoPBz3?!6hsDiPzq+>T#TGyq|e0|IGyN1{8 zpZRYNb@v}y_~S3a0+eNu)+o%Ou@N#xEwAT|i$7j}=!tE=aOd3o7V4V~oW!j^WG!(C zPXuZ_YkX{}F;_6NMWuT4=2z$$P9!8=Sdzp9iA71tY-kITIMWyJmKVBO{E9Muo~)5s z#FSzy2XYFOM+)7ExcX+QPID$^)5t$TO-)UtA`qJgTAbqa?4`UIEBE;E^CY)4;Utln zmD7(TS7W0xQHdL3IbjeHSvCZKsxWgHlNCek!oie48ZQo4r6d|p2zLm%L)9el<{)r0 z<75-VkQ7q6mZ_iFL@g^sqQRZuAViZ1gB?s zx4BF_8ejgx15?kwVi#9@WkmhF{@HKYxkcYL-C6VQ;&8x33cI+RfBbBB*Vg93s<$mv zL4p&@YoGk;_W$zT&1E}NuNT$-vhX6CEWZq9on8g&rqB$3)%jQ8P9@LsA zXLJJyCHNNH0*`cR@Zv?Pn7GA5H})Fl8Cs#_{UhNKpk6Cv!pO=^W_FWZPeCNRyPJyC zE@$kd|AjyY87l-hyDhF}7#VZajU;v%=sR^vY8I)VCor zXdF!gWth`iyY#pJ>{X(R>u3zZo+>uBqZbzc!++-KX*;(;p2D>;$;+2w9`wsanp+hkZDdL1UC29G`kTYLoHdVYpap=&E5V#{o8%F-$vaT z;odIU&Qmj;t9Ea<-r1*~;p+}v@t$|u*50`%o|w7&j*Zt|KG*9le&@$-RMxvOYqSj4 z<-t;Q^VM?)_l}=Eo{uijphY&AGm?jGymeO#xdbJ>;otwx&iB7XPo5uMSYc<6yqg-0 z#%Q!K$xWysZxoGT+>!&rNJKMTQpef`l$Z#;DnKb%8sY3ZmIq`BPKZ<3CeaHF16YWq z1TWPK!+ethtN<7s+Y=|}63;gfgdxy~9MPtuI?}?Jz{Cop3+2B!*$2l+BwpnSj&gbo z28*OiScZQV|qqj%HBj1oU2dd4(2IwW!5;%6vFX#Vqvsy zKn9thirayLn1u=hoH%aN%m7Ieb%z8hTg^-=VIaF#m9*pzLpNP{?_GVO%6w_{?9uz~ z=e6;Xd+zRCb$Ms+yaTz%OFpb1-s<8{pPOz6`sxyifW$2@S5EFOLIx}@D=brulwj>< z8QyYR$cQ$X9>RS~XXS=ntNUkr?|coOeA%)W+z*$Lu6vv~GfALT+y(HKI#S(vwGh%&Z<;gn$vB?$Y3uwK}9 zIg?AAU<-=Qf{qandp7_{NValp+FimnxC7s-?u{o>H=03bC3kP%qhIV`7`t zT>|R5ZkmQbrphUXdc~L4W@Q#mk?SHuhzv^lyCj)d%p6>v+y#FrrLvXUcErvgsS|qv zQF^TG;mj<=m03LR9dN{~#{kkeYy@XmVa%}%WoI{2W=cZwCkbJ6>Ld5u-JhEpFI_zT z#jlQk@&Z(!J+U~oa~GXm1SP5~g^4!gI(+EK;e(GaZZs5u0vM?ivy(V81V{o0LsTd~HU=}749b1g*I6w?>aVz^yMxdAp=AOurooeCiitrA_|NHD-nW+nz zx-k#{Xl1f!mr=@XCJ@+(V^?0D-jS0HZH~K3s|I?c9Iqo14PZFAtwQMlYWQQSMS^RGk_XAV#|B5Xzgu0upw1WT#FIrht^VIfZCZ zm^hW(Oe%~CcneM-A}FMa1g5(ep%!;ZSew?t1ok$U_oOf^dnTF)*g1)1lT;ZZ9=3TZ z*koUDK~u+(WHVt01`N>27$uS$WaPr)s(`77Zenrjd@H^6@uvKllUl5B__B8 zyxkQ+nvEo^h`T3F#7RAf?=jLNGv$h0GsmUW5##h+&W7SJf)Kl+0mP@fi`8%!ZSAe( zVdL!Nc?=2;r#LcdUbc-b+&Wq3vfayDySjVIdp>{H8~lTBTHdy&K`WPS-#T7j{p!P@ zY+{WyaGQVko&8_Bt(u$LJ2!junNPV{jMd{D8;fWLCDcGNFO#*Hf;qCVr^Ea9{`R}f zF?V6~^xx7w99jSXAOJ~3K~#SZM4)Qdd+s>bv6k8{xAkze@ydz0s}422uENIB%HC~u za>H1m6o38`Lb!p6l2L7#aX^jCQ^n@q7-ho@yD*H_P}uN!6nD2M}=u2N^kAnBgtw7*@KuFh`(GLm(e9CFZtmosdm~K~oO-Ol~OnB~Z=^ z7^ehyF4e=3{cvuxPt@R(&PyqMQ*50G4o^WXkLqt?&X`EVV`Nk63s6H!p_HqPw6#px zs!r{ND{ss~W(6^h$;`=Hp(=Z3Budr7U@=YA8hikRW>hE6hboSQjW(XGi>bZX_UhQG z8?U_TH~x!-G`#T0gIf<=>3g?rd+*zOjhsKbP(fO6W^TJ$Uwf1GYCQVPOMmfYHb(5j zK&}qTM9Ce(;k7g8M1tT=Iypi4>dSWi_a8cU`L0CuiVo+d-nIJ4`+ch0-hMbwO^GqC zJ<_}CT3Z{=zy9WhtM(H*oy!hv`yYR+{nAg){P}%Qg?U(yA%u93PxH(huiyQVdpD@f z?Wosc{h8-i9(r{Dd)|>dsj=)swNvL;zxg9KMFUizxo+>;LnAgGHTl$8Y$(R=aOsjw z8AwSOR6)tbXjvIavt4SwSmDzG<{C?Dc2y#$IK?`}0FEX&xxn%gSEdROlaz4W&wy;< zu$)PlNaA`F)C*yTnZZiKY67oeE?8&=LnsD_rOQ1DEyu>q4U?52<*Zzsu)q1XD}-cRy$U`J@ocFo_+3UZq~U<1h=+f6KASLdQvCn0P-kIK{V4_ z>NQnM?ZeMptX`Zta>a-fR@cR;L*2E?{f?W}blW2@p8NP$v5{>ORGdujlT*Br4N!Qd zIx5V7J0+I6smuR|k1QORYfhhZsde9u&RedZ&w1(Fj|^TpEeCd0soJqTl>TVQ+`qUc z*}OtF9l?FJ6Y2(NIKG@haLY|~%QdtA>g^}?&U&Wp~+pcXJki1g4=Ib+qMn7}vwV43s`> zq}=0JLQ-Ig6vH>TODYVVI9CW5W|5qSuv!4pSWP*JsgZ9&_Yvn1B3IRv63nw^7A~PY z7>R*|SX?ul3vSNh^aSQ0D1ivBp4=f4IV}%oTE*PBfj~l<8%7lZLXGpcE2m^_jszy$ zqY$3rfKMhOq3bheM|eXRu2BE!cfYaiy?5)?`wsu!uRiyue{UOuoBqXz$9uP){fBR? zJ@ZORl?Lt-7;-c4m7E%4%0TN4Hb&Dmw@)9}jnVknDY^DQ>tj!qP0e=BUp)Wm`{`oe zH3+i~l(VgCrn(NBPd3;D~2Vij_kke-+lDVRtFrBj$eIq{^dK)&s7z<_p0vOUr$+w zpZON=nxFffcQ)4^?pD27o<5&9Y&YTDX@B@BG=^~iG-V>YE^BSLlkjFTFYxEsWQa2; zF*FDlrr9UcyZDTR58EtjNqA~@%T$V^@tjCziU~M|nWG!KDV~gZb7_xHLiF);FK>zX z2p3*iY}#2Q#lkKK{N|QOS{+A$B~JaI$rGy(%@MVli6;b!B*Fp$ipC0S;g681S0WmP zVkQIk6IpT0;)FKw%rY_}t6ayzAZ}b=MAGcjOQMU1QDJ zDeU0s*&D7}eg3FRQZSprz2@FD&#n(z>knnvEZ5q(!e;*dL$E!57~6R+)D)aXJ1)Ac5>>y zztGvgKQp|`2I~-3UOY;Vz0$e+4manfMKXTt4QXx{))q#~CprfYrFv@i-Zw9vKDXue zo0hLTnEU7CkyrJ#H|fmGvPer|$q*oKX1imgQU0VYVbk^liB1(f6N_81rFsw@!a-9| zhl#k*O2d5$BsV7xLjpF}G0|z-H1e3nCZ()4Y*GP^bBhNYX;LfjGJXy%wTVbn1cGOj zbKVT)F>#w)H&09!N7PF`0@!4L5oG~pRyATuL}F2(751#mAaEOLhsYjE;6;f``>LGV zm`L52Ip)J=E=8;imvXSGQw4^afs?C^Pn>(?uRgi`mc#RJyrnxe*X0UkCtrFhzk1e* zjVxnaDL_@lX`1TVWaZ`4r@#2Ex%d6t?7Q!+94mRfdFth*hacf9_At>@TQA=KFy4HJ zzUBIz!(Y4j$6s&(atM(Po2HR&#~C1*d+lM`v9lVtIv8U(UU~e5Jlv><&Fb`8^Wsa@ z;yT9G4lf>ASF_bcM6Lt`F4_Uy%_jovT4 z6{%yUNF{YwMsQKaHH#(*OA+4)CsTDqQ4ek!*thQ6acD0CW;U~wQc7vU{^BU%f~!y! zftXV5Z3DQ}Dd!yPyhuU@yWHGUj(;s+doej8XGk_i;7UPEoJ2xqM&1^rDaZGLh}6x5 zB`TAuYD`XS)(XUl%+=d0t>op6!4IAuzIy!P)6cO;r<&@edhOV&8&AJPPW|VPEk5x5 zPJcv@mB*h>`&ZM&6%4)k!BZoud-uH267^1=IrEqQL>JaO^YgQVc8l}I@ztec|Gein z-#7cVTen@vFaAHDkG)T!6*CBsR%a+J1H&T+aP1*?)x^_|nd|p1{qd)lKK1qK-+YH1 zxk?;UXI3x%;oqJ;xq?PXm>eA!k4YJeH+l5zv2?{gIk;=)WA9t~>+g)0j|FWBMK4as z8N+sZsOwtZ9y?|)BU=LElR8me`vf%YlMaiOveu*(yvdRz zq8M1aDIg%S98v(}tg-Qq?Mw(#IL@f2Cg!Nd7$AT6(J030{bJBs)8aNLItO8hm`qcTC&XN<8EPVD`XR{+a zk6>BXA9!^Aktb=a7`Is3u&kpOPMrPUKYhVikDh_^g+KY+)V{rRe95y<+WaBeV3_;j z>hQtm=C0U-DzjI0T@8}8tXo@J9<=$1qy0~RYyQ{Y!M*8unHuu!V7TOtN@-`CMx4f) z22BfcYOHu=n<<(_wrwb>vY zlDRq>hcmll)SAPyc~*i!)B0mC&FtN~fMv&Qtp4Jn0Ii#LBtf+MA{mj;tTC8Yoh#SdAyHO18AVLXhr!@BA< zXsWfgb@Q=coM{CP@+L#U5L)f)3$L0oD_N8EnbT{J9mAM6143{MwyJ}z-!6Xgt3F$y zRwMzjtFrpW+7Rkk8RQ>7fARP^>h>tqb0wmDeBtb$f0^cH?1d9Va8nvIdTcQ- z{y1IiclPi0SI&YMsjS&!LG2LqTl?-$2Ta`$-P_D`6U%mV`?w*B8LX}%d&+fh-4xfE{!YmaP?Jh3YEfAAEUp=l`-bt|Xj7uNi& z4qiOpH^WBj#1N;%ZVrWKCsjAcI*lIq>A4dZd~V9g)=Yf3j)k?=kAJP+GM%44%|kQt zlCD(8dLDl9p_#r_hYqoh_~o-c7`q8CtT+Go&@4~+HQhF4(L`hG4jd$*J|RiS8le?; zNI;|Eah~SHa0wquZga`0{tW1_G^^a<>dp{}`l@*W6gfc1q?=`L)XKfiP~SL^dTc3gMo&kvqDarVIOS>w=u7ZfC@lx6J9bsX$j# z3Ydn4=fVl2LtFFf4|T7YufF+%yt0f4%DN$Y>FURY#)yD=&$g@ox8FI_fl*s!>Z&zQ z9=-5qpL1bqW!KHuP5t_t_00O|Pu`a^M>B|w9Rzi!ikRk(9PI3!ADmiPKXaDGh~yfz zAahENxhZePw2_@FcZCtPO(e5Su#X284Y6`OJn^Cok=Z7-s-KKfLgT2T%)* zGOY|TR!U^dbZ-6Pr@nr1_93`K5)HGzat2LtIh(dZqLjkAqt*~r1<6%auFi>Fv)iQj zw27+>aCDVIAf>Gmdo)0VD>8R8XJty}!V*I_=W;wP1V@$$Dv31^AD}ak#66M< z0F0TzoV7KxIB!g-cFJ4@;*{JcmqKyNrm*bsEfp$H<_XxYI0Z_`%urGzW>7~#Vuu$X z7AT=)bqaz>2rG=>@!1WyG=U@;kyB=3kXf*PlMqZ;m?*pV4(++=gYWCR4%W||f9$ar zzW!}A%@yyxciYZA-DsQ(M5ycJ=EwfyKUP&&&Rz&nJqVtdjolQfCefzL4LcHLC=z+A z=n&;NYY;3ve-5z0bf!Mnlht0D%T=c{waES6n{V0O()o{n*3A3!9Y1maSGL{n?caF( zIk17r$-qFT0~T1GdG~GUo?B*)FK+xVf9Z=G)MP-MoMDIm?T3bMyD>d`^4K5#onL4R z!B8C_G=!{#ws=^H$jCelJDX;;*k~$-h`;dwN5Em3EO`T*>*M^8+}#BkSOqB{;+{8~ z-=%F%CG^Zp=EkXZZ_S)3yH2EUJTaq7WVMZmQq?h6&qk>-&%_X6%|?O}XpYNYz&t&N zi`GmFv&G4BgYt+hzBw}kOCXsnnlGCxZz47%A`>Yo{rEV!1>`IVgE*U!8^c9J;~N{A zB6y6Q0#q*XhGdv}io-aOOKe6{GE%q;Cm~MY!rR~g_6VHG6`-6mi7>OFHHQ#~6->>T z%pD4^Qev)@+ni|B07ZSh^RSX@Rt*p*;Zco(pkw>SYwiiWCeddu1z1ak6L%ZN2@@sW3G z4GL&>B3KKnLPbTXhFffR!(Azf4T;R+5$xv5Edj*I&B0a(=OuTHpDFga2#3%%M#X`w zNLB6d=+6>SoGc=w2~$Vw=2X`JQ-r@GnB{OP1kms$6A`kj8;79BomiNKo!Z=TN|rOT zNX5~LVj|1RR8$+9bE!gbjF(B3;07rgUYG|&h`4Y$jG4jE*3EOgy3Mk5YBMEbh?%pI zPa@iJ2N4EKLH%=VpxlkznP84uQe34$lv0ImciZ$X@AqGL=ts6Orm?DK(-s2u1XE){ zjJ>+Gzw7qSOq%VVU-{Ng4!rh;>RoSaUUP`qM&Et({KvoM8jHTdTgP1Qy8rH@(wjT~ zAHRCx`_GiotWBl>Rjo;!SWMfO7usizx5rO(|Mh!TcFw2mGcco-{`mgypBp!JVL))y zjLM--$&fN-cR^-xVkM)pAD?v8uh);Jk5{=Up&-HA1=+Vw+cvc7lM2dLDQC%Aa zfVs%VogGyop^|R4cot?*SjfGgN~3UO=B*J7iJd@Fm0p}Oh8fPBn1prQf?TR(t;K24 zCiLFIas!#>ViOFjp%%liYG!8U%1xb1)Dtm6XEtc~HHx~SCW@#hIk=R%g+;9i45DXu zLaGv{f^2cXR82F8B~?Tv*A)vIW~M03PLz@$F*IsgZoMr`Or%nE*Ah`ujc%foP>P|6 zh(xOOl4*kD7-{AiDj?%1?V@E%8kf@vFv^Q_8AP7A1aGq{voMDei&>a}8H<@2w*Ufz92bK~VRL)qwQ_10T=w|?&LzLF|Y0;yro z^uZ6k@644ux@T7F?OVJ`80)6Dj3j|8fiOJ$yxecM?%Y1qCOMLkiSD}dHPgTM&UB%F z_J94){S#+s+w?WR|KZ`bEp2vdwY#)&`cq%=hkQym8CcL38_o${8LG(dI5N|?aR)(=7>OZ3 zP%>CB&LD@l3!&ojidT3hg4xjAn#5JAJMDPvW-Q^GQcC2xus%&SrW1vei=Qp6Qpt8l zrNhD}4I*Yw2BSjvisd#jq8X4Q$z*1(t+Pj5U)>EZ1XBZ^g?UbsEUCLe zq^t?Oe7D1kqH#5v=zE$?@msVVmE-Y^MC1}Xo^oR(_be#^oWK&=QgAr!vt_Po07R;; z#rPJ)h`6sAS~q5>n}|eoU07IztJKefxoYdy`R$7*FCsfbtOm%S49{C~m#wpwvpWe_ zWAm1rUwdV~<;s;)$4`9z+t=Rvi>v#mXWw$0Ei8_tc2sNPGaq}`+W!5WqbJw?@uA^& zo<>F~b$fs#oGcC|-iXfJ_1fN5hle+8AMc)sLMT z%D?}c`0juwcobEt8DhORT(kS5?-sm{SNjnK%Y>uE?9SVpWmaG+%P}5IhQ!?q()QT%8GkSn$$` zBbXU$+}M7Hmng^?W)4_g)lD-N7MMe!YEfs5r9A->13r)AA?+a;)D1JalQ;(;2Ou)jsDLuDR6t}o7^ckZW`>r%!@y8S-HoQ|kEZ5!Uh^-1 zRsZZCR-S#yt90ndb;}nQN2e~d!c|qzr){e(kO~x>Oh?Jh+ih)UEl{#%!A}PNOW{a?i zhjSp@Af~Er?&3jgs1h4oh)o0}>T226jvqhsorhod-d|gso!$A{@7((E<(k_AzjXJN zut)#sZ`)%hMjcz@zO%!;Wm9r;Orx5msS%TTd*i)#uhmYY@rlp;vkOL~ZeUPFK0JB~ zgG^wM7Pa$c5tWF#RSRW!@8o$>(C+z6y87d%u(S?NLdfJJG7yit)u;A%9{jTfVD=(AVuV4Q5BU^62nr_+BoPme)Uxu@zf1h55rAUlXd{ly0S4G=E1J{>6@>bf6Hx4U--_} zU%I{dKGz)0x8Sub+1BfBe3xyKU;Dcdx$ga96fm5KG*3o!Pj4r*G?FV~lKY z({@NE6ZZ2ZfO7Q2N7oQM-8F|HtqSX=~RSJtb!ld1@7EOrh)|VTLwCZ!(k&M3qA+D~8-W_EN`mg$845 zZ7}XQ%ri{<+#(j2;*lHxMZyFi-j$^~ZJ}v7xj6o(Z~AjbJD!NEaMsWJbXr&$edZhV zx<`SoYr_e ztXov%RpLmHQi=$rPpC4*!FtIA?w1u9^+da1?|k2Zmw0 z`t;Gq|KzV1zWjinI(OmB$zvB^KDT({+55h>_VNjDRF~Jbw7k^>QhA%VI(J?4<%JWU zy>I^#_8+>b)9cBrXWM`J;l|@HBuN0xw5k7@Z}}6)M>k!*@Ap3s&E*5L-qKIXQy zu`7^UrmD(>(U>E#=&g}*-3k13T#o&cCI?iBaINl^GuLUnzB<#;_NGH1jjMT9x-c01 z-T!y)|NPv=2Oftpr?v#Hvo zP;v>b6}VoW0P=h@ph4v%jOe8Lgh(LFRaF;6K}0;gz?LXZkHna)NeG!!Nn-HNC;?Jb z2P`;bMZ6hwDgl+7BQ^s}94yofv!=;TEQyK5U7ehqAi`wqDe^DboGU@R{|vggPHVpK zzz-H4eGG|+oLaTzbs1$SPJQ`1`oQ@%5aaJod7FW!rUESDkA0 z$rqO%eVUX8Prp3BZ+mxnuy(G$_=)=t{Kl`$9Xy!cdfTgCe9$2!x-}6__gdPkQ*b#E z3HNjW03ZNKL_t)hJR0TUHy^Q{^nUqG+y2#iSO2Ij8+&tdU;h3Ny4$*X!_~I`@-;ZQ zu2AD`PHbu}*)be*laqVRo!nYBTm9Y>z02p?Jv+Dm>-P`7^4RiyKPl%sBd~LZrv&3_ zt$$%oWY>=BbvM;FAMSLzygu@Ac1I@jHrv@HT5Y|tD2s2gF41&=H%~@#jf`v%{aq)7jo1$Qr3zCqhHs|rCOJEha1;^3)|8UutRyU6RyIuB z+E}Uz03x&DaPr7vB;lBls~6I+yC)c_I!Pp{7zRj!#S6zewX|*K35Ey6T!W3&l!UX# zs42Sia3Uiz^IB4bIt*^DQvzqG3$^Y5jT&zimR%c|W0XOON!rsFc|lQkDZ4)OOrEe> zY~1#L_-y~j&mj{4R|oUx=~o6Xox(`5Vpv){^@pE0Id)tadWn=5xhl*(WAz7*kNJa4xTwa^}{`Lp4NwY**ouAsW_iJX4`hq%$7|wW#|0H z>_I}GHio$#VRoogd!w|TZTQHOBDD3x@8}=iKYd$&<^IPY>=x|aQi<~mtEd0+i`)Or z`}#K>5$DEzjdJE8)Igk!d2GDV`Z%5pZk1kq;E}DD&H2pK)<*JR>HH5L%1<8kk!`v2 zmh@URwq4i1hK}s7=J$-EXs-&h=u=tH6k01$IuzJDCR)EqOsRl!Mc6KlK8Uyjv*1sd z`=oc`PEc3CS;Vrrc!5(!=Y||>36MET|5)l#twoDeYVz9T3da;^eaujwq6E31I0#hOb1ZJk3 z1a79z5}8=i*sT;&s~3})x7AEHPxBi-@_|E#Z`x>^Q67&rF8uH>|5nee1LIph@J`#e zedT*kpL_YGz3;lWIe+2o*B1+2c-}4yGE@PwLfBD#{Km1~vnas}~q13Wb(FdMdwK8?lZhv{jb9NWHU>zfP zQ5q$C;>7YFe|_%bZ}&}enPF6DP;+0Wmxi;Oz}h-d$mO?@ zH}S6ivEz&1eTE0V{@q6>s5~byTDjlK7&tZS4su5!s-%@l(J@#kBtRD0 zOjmO#36qJVsFwJQH{3+81JMjgut+yZbYaYzd|&gCAM-otLP@r%>AJ{*zPh^nCB5y)L#x)aICnAt$C$`=+S z082|!t2x(mv~#pE%7UAjwyQ$}vj8BQMkQSv|1vQXx4E>*s&wu9-u{|@@y}_`*7MVr zW~X$j>sx2%FWr6qp{LZe{ee4HZoIgYWaZ4MiI2adT(vX5a9U5V{x@lKawgSF{^`3n z|HixLc5Yw(@l&)>Ba^E)P^<`Z5`#fWNNDz&eRJ=6b()PFUMdoa=r2NBY8X-^g@s&DLww1~Xq<*TqF2X4jf5Ln~ie8$Nq< z{i&lqbeN3Ke6g!ASRsS0tPdZ3VesHn^-rFzfBekozNhW@`Th$hmL7e+_wXS0`DF}g!oQmhn3Wb6xXG@EdOIMdJRf8w9oLSPv};YgF3 zh=@om=TnH(2xHXE7%0ay-jv2|A0lFAWDd8)RQem1>+vntg_|u4k3-qf$RXxr6goB| zrpDM9PXlpPC1%P+86q4W4Q-g$Aal|N#Gyg(S0J$zH6~{!NT@nFT$uB_=lXjlMw8;! zT04B`(dVAuIx~0kYv0t_exS8=b3Sz%(%Qn)E2=&$dg#PVw=*1AP0haEC2kVT&dOMu ztOnCvY@I+Q5P^Z19Yi_0p9IhF+&E~$u~w+6Rh~iV7~h0ALH)FsA7mk1J?i|ipH=v2F14^h6F1euWQFA5^8K#xODUI!lF^tA|BgYoP)qso= zNfH2wBu*U>BvMnqpbZciBMnrHS%ihvw0XoEOMwY_DH+TSWY-#KQzBA^sgn?cTwR3C zJqbtA)0isrFayN%YTRsYNzDjijYOeC~VY{PKx*YxMMs?N(J**FtN%nPz$;^0Vj8{K5Z+qB2TMVyGL@fitm~ z1MO6|xFmF{gbJP-_MTAEQhp{4afQK!v@07-X?l9Yp`?$$POk;PGRP( zoh5AGuqI_gaPQX`DVB!-T#bxrpq33J(Nv;FL{oV*Vp+)GZdwYMV=5U5^B@G#&!C$n zehIM#jIpCPDj#B2;R_09HjJ5z%nl`qUaS#_IFXa8a!Le?Q6VRx=BwUZ4Fh1nL5^-_ z+s$P%c4N*YDKYub6fjtBG`s{OikzLgv2Yoy=u@2N3F01PzD!Nme0&=w^|-@QaL?FW zgNT_3E@Hvib7!uUoI&2~=fmql4)eCu(^X<>FZGZ9)z@%rRf>DwICt{A!@M}UKFL*G zMy1l(efux{S2$%l)FOD|NQ?GyG3*RXVYv@!+oS{PIIm=9U@8wsn zoLgLb?l=j-I0~R}kQsnNlE6J=-99mY%k_&(KT6%%`FGxao;k7Cu2iu2_4})*U(&P7 zzBIzh2&s*BLWfZaAjRP&gP0g-3%b={f=H1vS(g_oRdP?6QnPf2v=9S-Ggl&~!1}W` zAN^?YIu%GLe-u$xwVxgTn|!^AmnMZ5olr9O7UC;QwR$d|1JdW?=YmMpCRyRZ}J>1|fi5fO90j9bh&yY1R-BVrEuvL@EK1wm5zY zX^Aea1>=(dQ%zOnVZLadb(R=?2oYFw?XGBi1Y<4TxVvHIoFWrKRbmh&bsL{y`~qx& zLB*|Tsj8@+Q=G{g*8v4_A(*mF&^kuiv4ydSCpN5VqY6yP+iA^4dD!=rKC8ECsG<&Y zlmM`))Sci;M!GTAKDTqGJ3V1rCb6+{`NuypxcQRdM71r=?Vjr%`+q)fbxtHLR8Z%+ ziCu5HbLM@o-8RIF|K@L29(dN9EGC1+p=8E{mZuGjygQvt#D?8dP|T5gwQQtARQ8f()ev=7WFAg2_#-ZArNMH zLS|QoBvh+sfrf-&LI$9e?4}?BCs>&28ciV@2`4Vp z2t%sb)C5UH%{Z=8;A{$%fG)+sCC2s9yo@7%c*U7Q-{t~ngD?fg_%W`84PBM(X>PS& z!wZo|0MfM(S44zF11g)OVguSTpn8f}Te$3#AFXbxcf} zPhHrofPBllUynDvYO(0XmwvGJ{L8@~b~EQjLK*8||9?a}Qm#@PGepXMTRu+isJ$-P%vILF1}%OL!v99o)a^6Yp4O8Mf^l z_oisYD|pqoNj*W@_4KQ*XkWhHOIbT~B0qD)dWH)WB|J1aWD(RfQ@+Wex%- zj0{=10+Klk6RgulRv*BI)6#rBrG#*hmm1{GKeFEGWDBi%?H8ZCG8*tDf-JQW9ZY>s41|~68k>u_&?pgg@ z#E&AsL2wshiuF1- z`XCqwMGXX1g}W6MlElfI+B00OxU$EB27nq!3tTP36nXRhgV*2s3s2nr{h}272v0HI zN(SxOV8n%pDPx?6X2q*|gfyLXrD+t==4>6<@X z`O3Z2QwKG2ps}feDAd%22g8lts5`S~c+H-*eLFW*GYc<0qE~f63Q|wNrO$L6P8lEDaEdx;-^<&|cmq`Q9M7Jcul*RR;^ zlr}Gy#XtJO=)ptC)J#i*y{iTR5hy{f+qv&kzcifaw%s|y&n}+&yRYrI>-Mr^s||)# zhHnfOzWw0v@F@_3jat}q%MI&Xw+fv?aLhXs4V9E(jv@`#pS>}H zkLNGM>=uIeW==d-f0LVwBrP?8s7fH1#$iU_9OM-zBMLclBQ|bmT8%1AV$&|IWW_I- zDCp;?0f7>`@ZDhMsQEE5%uEf9=*WnKqv8;*p>fwHB74!MXO_e)#4aEkyQ?A$1#)gU zy*v&DG;@}K*D)tf4Kp=4xhu05&4`x~Aj}MI)U?9KpLzD_Lyul{$<^0>@LlV}wO8){ z;kHZmAAIj!{UfKJ`0Q7~oi2B?p%f#M7FD&aVpM9vc1&%oDNZd7zVXmNM{7f)!Ls;G8&a5rB>TpRWB{x_oMlDY+gHXu?kg(Po(o3LaBsn zhgk_VvhUn%Z@JBh2Y26_CTDlv@!GRet7b~Axlg`#ak^8Uc)nY8%Qbt!?IazT6Imix zx1F!L*?#f1{>58)u|JsU3}+{H{ImC*$^Tg2dx$ZP1VP}0QoPcM8!p}b-~ZyN-4mUv z)5g@Qj%4ek?VMk`Xnx|VD@L4a&{T~*`*$Dx<1ggrPm`9-ciq~4=N+?qcFm`Wxu>6b z=`a4Py>cFk*0$M$zxww2)t9wB`6zd5UVP};V}JT}AJt93mjd;vG`{mS(NK}``1R+Q zfC0r*H0yAqVEaJv)6lVl8cZN{YD2hEzTnFR*T5@*t zBoZ7CPGWAt(onohEi6_FC^zIm<;jj)>5CF`H7rD~q#!1v_Ml8x6LsZ$<=%__=a239H@|V?zx;&EcU6Q9_1b!} zwCTF5($>us#iMXJ1e%dON=K=x3P6?kv#*Sn7F*qk+0LXNI!Z?t-8C*@h1{t`N8eN0 zq8&QBzIxC7ONU?1ta-G7iie3?PJH-O|Lgbop`&e+YziVHt_i4kY5U~x;2xE#Z~as> z8?9`gn|sgg5c6Edv14!CP2K9i|M)AzUEBEZiTc4Ot5Q!;u=Xdu}efHl-03QID?PJN1co(B8SuMVq@Hx_$MQgWEdWr)IZf^XAU3 zJxlv%F`43+&g||@)(!x?P$XRmZn1!Ez8>)>8!wV`z`rl7>&6ODRn4aAX66MbEFg}A z9T6mIHY{Z7iIcDd;mDy%g_0Bdc#78~rJ6oJe0+aZizl>^eulkUJrPOcc8*bm6|;uC zP8!5*B0^Jt7Yz^@bCnVk2~ja+7BvN!IgUyY1;dnFAi=5Cg22JENO1J1VdX*@T)PkG zf$x8B;^k+qf7@N%x!HpUx2)IoTD^YesTU|Ea`ZT7Th~_A@=j%`XBi_q_QmhmTz7QS z{@piSsmz;4dgjsZdu=3eLjTN}a`^0~H{H4Yw?BCD-~Kf{d$LJCh6c(BDaE~hL>a8K zTrYk0d;5O#{rUL9xgS5zm+y2+(1JVyv4i1~oLa!LWDG`IF1vCxTLDDW0&&Hy%BT7e zbUQ{+FO)OPgeo&p7+M5EhdQ=x_Y6&n$;gKp?iE7_R$xx-9z&^iwbG?pY;=CL{{BxK zz|Ge<7h>{Gt1o%9c)oo3N9V7gWM&sA;=wbZ zCiPS`jzo%(x0~fAEhK5oqK+^L9G+6_l_&!!xz_o~(bAYZ@$A&loxw;9=kcxu=V#)|hq8cFv|Lv+$im!M~NrRjgq{%1^ zI}3rCsHiEKvq)63!0fQ(C`C!&U{V@AcWQ9z+#`#t6Faw9#ktL0)3aZ@Pgi>0PUZ2J zvA4&kmxgB+arkuA?_qs}^^Fss`_`_HypwnDD(D^ghaV5`ezdF(X8X)4(!;5*-M`@N zJ$Jo+$G`sMGyltJ#VniC6r_gROVpIjXqcwZ%Xk=iz#P@=U*fQ72upyE?eDzGQFBB$D9V#0fHW zG?8PNH_FjdtA(pf9i;hF{UuKB!$xruFG3=!suUeUFI82UxFBaAfGm+PrJT)=EiJ!z z&r;4<9EK`$B3HX7w)$neTFzaj4PEbJ#8TRxr!p3fpE>{B3*BFyn%=sX;mCn?ByLg< zMqr`}Ot2aba02;wuEq^NNtMFS=?0cK^qU)d0P@VK5pfV{U9%A;@P4u*%J zLYg2H8Qhap7VVTVXr|d)f;?8eAdxm);aW`HgXcud45nNc2O!NT|AInEgp-lEl94(y z!0slJqL$-s3TFDRb z%@1v-Q>%1lwDb@6c30{ds-)clLR0O{l!uIv{K)yaQ|okofVF~^IzM&7rSN2Dvd=pQ z-L*VWvN64+xthrE zHP57&o!&llPo-qT1)xm4Wl6|P$17_P_-6tZqH#kHMi!TUFtbPicL_QkDaXq=uJTR@ z>QDjPtgs}+3&j8;Zu$Te6X9lW+7OtVz*NZKN|-z)gh@mx5qs!~iAi$_a-X@gyD%Gp z6O%w|^~QwgrkdrHa2#RnmF z3OrUJ!d0)i%`e$0?rZf%e`ABz*B767iARo+lbJer)oG&+=oU8m5?GsTq}lol%?7+U zJKRuSI%_YVLcdUP8uU*7^|wxL)EMQlsi{#5kh5h!`|XF%JoKa&qot8^g_tFIwfv*U z)=!*PQae99{e|yWySMgVKJ7#HQ)_4c=9_bGxGha~cv8e=?qq*s&Fs*r^}qV&*7v`q z%ufz4_FdxakU>=+5rxFD&(aX^7gJbqR%K3k3IE zj{L<}wtedTbk!9#%)HYgCLbafAyFgGz{rsmwZXutTDbqoa@o#$W@4)942Q!b5C3%W zk;m!O+T@MbZh2knOyx7zT{F9H@AfShb<*V7f>A*Tb;vpPCL1o<8iOLS{5{eev|t(XYE3lJ!w7=ONX`&gId=r;mLO(_OTM9DZ(< zR@P7ahtK)kl%G6DBemnpE1&;CdhBqolFrE$S{+^(goO;{0s(XUwm!TKY3?+ z%WNWLk}~SE@!V>j+1&2;<&|N^$YJd2KGe}e&o4~3wtnO;-oAC#TI~K*1Y$_ zCy#HM-u(VI_)V{3so-q^w~aPnKPU3z06sMv0ykn&Q~H^I6U0nRmPf=@q=G|4+jO-e zkC6vs(rEAz!|Bx;$9BmTu1;(WCMFRvbvKJYaY{mvQc8pTjO7Sm!P^HUC3ojknJd8< z+G_D|taUR-45ytVnnZ35e9F|_Etwm|;l&^hput6iB_Gvw_GXKoaBjF}oU?QNkFaloAM}w(aW6y05!xRR>%< z4U}_Udguu~eGUp&N3Gs3fsJ)l_|PeZV-Uv|Xrl5~8zbX>cFWd3hchbxya<`uOQ-VD z1$_;84B|QXSWT*3un&%{%0{afl5GxqI~xJ@pE62iFrM}M(d86q2vZ= z@j`yj3rm^m%P$`C)Zm5VSjs+fcZ|ONNYC5zx83C3){3lCu10c6i()2`)H^&2;#{Q|I|_2ZO-^& zR$vSevVsF0ByL2-h`qmei@oKBHOU=sZALp=p1$qkwLkhhKeFznVRSVmASEDCm>`So zeDCY4H{O6F3&;QJOV(3lo8Gl+`$z8T_twt*!@YKPjhr!3vx4G6qWm+eV6!HS7qk|X ziUx*Z4+}%I2q+??no(!1H+Y@2?@%ITsKW#xTl4zvr4#A0iL2APIHVWOmKy8M*~ zR_=bxr`lkl0y?$is{=$)#l!p?~prc5BN%s~<7NFg%RvB-$bRMnFRMYxoBERs`}L@_MZ@CB_D&BM7X$t$l!^a z*lS=)7(_{CC#K0=)P23S-tyre{qRluem!+2(85jcd+XYCHJ2;f81~PdefCE`hI-&r z3w&z#{07y!vYrT*8LsY56}uLa45~PrCxRtU%o-dp0-P+lfrgv-UUj7e%?}wKl?Ey@+>y6V zF281wV{^mV<`jAXm!}qBf&AOd)}h%lD;z9z6HT zsjvLV3PFjKTn#})E{0+8tOS5-cSAAC1}c=2!$z03ZNKL_t(1 zwnC^_s$97#8caR( znZG>o@KZ^uqM0^N9QgDH1{1AagYNTx{`rlgClD;MHed1Kcdbk&TIrqr`n|TC0YROc zY>6pSA~4LU;vwlwUzh&=Zmg_z?z+`)z1gn1Waf>xES~%>xl^SsgskDBiRlEm=md_- zpi^a^keCf*@==mjrn)1ZoHBsoL`Y1MV2q?b8lldV7_F+2s*V33k%qhIeRmD-yarpg zjZjAOg6}?vWup@INFisakvothfk04?>_csUQq_S9YISxZP;m?d)`ZUDJ<4(c?9D{x zUWAi55sMWEl}3yriKXG}s~X5HULuhS`_|ZpI`;&J0sy617o$3LKOmuBv5B1dgjeLE{+1lnmL7i)B#s zXDn<6JNv80|Ia_)ID86Sz4#OFU%l&9?aiC3QN8P` zJ*WPUzxAA(ntqc=8B@YYRAfc_H0XO>&&1UT8_$hPi z;@96X9QMyV@X++O9oB6XrjdA>p42uGiFX-D$xJB|MjjUtcQn!=vc_?$sGQm!sWF#k z7vXB#-uGsD)2pkB7gkSip52+4S4GYbL zx|hNvu!!Ktw>R+hM3gitj9$pd6EiWVL>#g5xZZP+xPoFEKg0-Nz{o{;{K|83YBI-U zFfEajmhpRENnrMV)k(V5Poib+F-RCfDL(VDnw4OqTFglZ-AIZn26e`&Bej8 zee1q8>-WmWQ}^9{YX{2&z>DkPHw*RpkKNJXU-n@^oLhpd#P5rd+JQT z#Z#}odj2gpFMr`jW4>er6xEqoDsLwvrn#A|pZ@5mgjeeZc| zwg1wifBx0s(y~vtum04BdTq8||I`^ZvKovAVeph7U5Y_LrW1#+HX*C_z0h zKlr2_*oxV04HekUU7N;|$3RJ;WU#32HnWpvBv^u$$*HAgj7TpS8Wu%h5+eqojfo*p zn(_Xo=DNlyMGw5;^SZn0_;uLe6G@oH)FFy_6bCY#%{4YKfdw-gIdOCVEEa)GDW!NO zBNZKiKPFf-)7{2~O=)7c@REy@1zz9+qk|AfPUs zoCwUOS(@ICGc(30_~NP-mezPd)!PPp|i}I`Em)s=5V>AG``GUa$@;EhK91;LT;b+5BcJ zy7H5UZDk4V79G5(y=g~puxNFEx<{)^YyDx*TM5Iu+4LBVqgGOh6mzfI_55TDJO?3A zn%#S3cps+HMjIM!ToGzltF7YDjh0U>47?tWM99!n_*}=5Xm`F%Z6YdjQ=_Z**!EfI z`qtn2<;80+X}6}^;EQ+eJocH-my@T~Uwgn_eWd^`@PwzCr(Zn$|9%$d*3aMbP<8rT zIdgXEQ|}fBt2OjgN^l{D7mG@t8xtGUpvEH2q!uBjP?)RbW_IeLVYhGaGE5{Ob&D~x z2KLq))mk-nu|+l+;|`~hh?Pw24vA@r11#dr0c33I6n8IXCX(DV!kR1z-pK1qDZ&DZ zK>`s|SmmN<7+n^H#_^$5wLoZ;gE181L}u@t5Gz;)Qj8dzg^0&t+TE0^ ziit&}zzOVXB8kT_KW}OQuEjj^=CM^Lu1%R@038qoC3hx`2bbH2EK z{43v``;~XK)XqNgVE5(Kyt=aUU;kR~vVFY1PUjalF4;PJ#lB6Sdhfz#zBJ&{CE2y! zl0m9$1Rj-wIgjkFW4j+j!At1E?&z?v&ySoeZ< zC#;P@EAU{^L=Yk-p+sO)Bcf8mn~g;5;VyHih1U%*S5qg?R$`=?OOBac7+Ye@XRzXB zdzxL(!{yw=TAfB#6{TDls9K!?_wR|8rSd+4AZeu6pBJ^Ww^h#~)ZIE3K_NZ~Ej%s+p-hH(lGgWZ%ZwlV_fIWT-vb zzx}4){#bYO44NW-6NQOAF1Lh$xthxTkLJ67s$c!V;)6dvt&8=h>CvXCW#5W;TaCgLn| z0iH<-j^ciS@x|e?Bog8j%S6>eka!W(^O5PjZ(9N z;Prrye&hbqmfdf@bN>yOje5QIx9%M*ETQn|_=0WTx$m-9Z6~c!&aa+a{D*I4FG!Wm zOtmI2-af2mWq!riR!^Oqn4aD^v)l;6R3YRVhB^Q~Y|F&W*U|bgS2S_+^{XP?Q9VWN zwzbxrhFUP)-v2A_JJ#;3V#s8uDWU3UWiZkVE3VEaE#@^IaW5;gw<{xOGR?{Z3|~4i zy5=e_VBsu0N7FQr(JM=5zJ2ff72Eq|eLXb|D{y5l9ZNkZrG$zxbeMt^U_x@WCYTZR zHzR<@Ti-ZnyX$x{8D|1gFJMV-Zg3(oFQAyLh?_yiI7e#sf=vLkaWvrq6pwz`51cQ;oFLGp_3=F=)porOmh-e2XhOOgt?g}yIG^j;Kt43PQsoo3>)SIH;0i> zaZ@eCQq&w!ky5e@`I&Fr^Yjny!+Nh%wXGC}z{F8f_Gdr))yb*J;VWk+s#XNQG*eZ3 zS=>1Bjr&@q#hbPz)wDd~ks<5x&wcyY0}mhg@Vi=@x2osW|N6bry-#?rKK@tVv}^WU z{Ej>4w{G@QHtu_L;j`b(C(i;uClF?FaVAQrrmQU!RqvPH+VRwD`L4$i&fPGvEw$t6{l7`l)ZN9yG^+8kX|2DN|+ManF?b!iV^ zXuH?WBl6mq6PnYikqDd}xj9QvQw#*i#uW{ZHzPYEEUu0G$$uuNH@Fig5Lpw6b_&Q{ zBfyN=)%XC;?678Y4v<4qWiS#EuzTb#%-p%Trx?h!lq4-?l3>5MrWBvEq8Kf1~WMm+^879o?2a}2uur& zu_@-RZY-h}Ka{vC!%V?(%C|;SA?$!uY+@!Z9V@vH6s4k2Cq)IgwG^_rPG?u!>$R)J zHzYAr5EO=^p=dQh$T9a9a8~6P*Km1(l=F4o`CRL0r68ep>)k7rbMX6B0FZF9BdNSHOfxa~btF zV6||=M-Fy+l;jBz;xU8~Nj*e8$=%(8&8I0owZ1sSrJTYWY8XY2R;tWMapTwR)iUJiPJcANu0zOuyCgPVIv16V#pY z?v!^<|vi+Suw%$MyP{X`9;x zt6ltXo5Wkt^4%J;41pYpm=OwCG#vk!ti|y*lq;0vf)HX{TXGU{IMf?XBcSFIVGcrK zHq}-oC1*~er8FDmVhk!oB{b-64QP*y%!Nry0eKQG#ncP4HE4boVJ_hK1qzdCgPo?v zE9cA&gP-QMv;Z$o-t1b;!B$l)(rQn0>LMlc4Ka{IOO%E% zC_XI6IT#a&=R_pJ^**S{+!OJ1+uICvtPLRW;YHi8-tWRI+rA3#V=I!V~R2! z6IkQqHaI!6xH>}6&EY!+jAE1#bxDyFFH3+NmV(dARM&MC$Pu7c^;j}VRV9gxhQY>` zS{4FFu?MNq29|7tdbF}sa-Z4UO*oWbr<#4bP? zISeI(Qga7lW;ejD{KN-GcU&RLgWSt`IML5%zj#mog<~{i6ays~p_scen=`o@se$t5 zg9kRIc(iby7WPpNItJpy2o_yF^Y4M9ku5L02;^fjl06I^*BWp%z?{;LSNT zkT*mXB%b~YtquM;Co9L(-_SXO$rs~gQ*~`L@-2ewJyv72{)=z zE2W0uXhwiRtEv@mRWfAHAP6%xU~O|Ein*Kys*u6))JmiU8~8#Dg$XQdZll@)!IXq0 z+-)VUdJ)(so{Cs}=C5uWi z0m+DAsxWDGQ=lEc`nG)YL3;9~L%;WzUS~4f^2XbCee~^RaqXqg{C)l6nF!>1u0cx8 zR0Yri5Q=yu4Nu>w33rvo(yPK$|EXoSYfl_twU#4O{E31FZUF%E=P2y7z3Un6me+#@2h z5gUDq33O0qVy5EiCPXaaZYhabVX!Mn#UK_?>0Mgb0s z&jy->rEoF}NO8efi5L*5Ap3`gLqxz-#-Xf84`{fL;4o z*3X`J;G5r}q+~EQYNy!)7lA3SE^nMX9T9j+%?aMq(5;H!6N#W|H6ZR7P!W4e2Ed5Q zx#Ne2Pd!WR)}GhiG2F53rcZzDiGTMegBMOVV<8f6WJCB4;^L;U2mzsN+O~V#2}5fUThoRdf;3E{g94O|j4Q-@}ER^gVZLyI7h zu$qx^L%t)pP_5dM+|J^p+Dg-5zE*Lv$GKDy=FYqgT@aP_h(ANtNc7$r!#=*_Ra^+O+A z?a=bdnP>j!uX{gv4iF@(cF({0cmCC&-CAEh`_v!*b$QeD&Iz?!n=4}WM9^$)X-Uy`iywxw>zp1-v8NJ2S-t|jwt2gS!Z~V|> zpGL7m<0xl9;KdsT(AX1crHqGq4LF9Ir#66Lslo18Xayrjs?Ffc;%5dD2@(xR8rq&k zut(q?F=KLpfrQjN5mlU;%c6zS#B(l5C=LSxPDHh4IH)2-soDq-XA?k8UBPI@K!GW_ z788IdN%K-*hJsuT)}-e|$eQ;jnfV3UlXNCH+B7T_o5mz5{;#WA69gd=2ouEB$<-|s zhZI&0s9iXU#RDxIzN89dEKKbR?WA44>8>}orzSdEH|@Cez}|}w42JcQV=sOEKmD0! zz4guSZcj{p@BVMRbn@_yU3*izbLhMG)@^y`Z~qVFl07eeZKz z-1>p{Ys{_5g;)K{k6rgqe!1P9Sa|x` z`6~||{GDIldgB#qFCE)*$4%+xD<-?MT-R4s+t*(@mUhlh-FSKX;)|>v*2hj`v4@on zh_u=*>Lyf#7TDOGNtM{pA`&M_NP0=-r#Hz3$x7$!GrYA6H&}ac1Y%nVHQy zE;*>ny|oukAOjZE_@-4lE+%py#G6!&Yjk0PFMq)$;*F$|=|ZE#=mLdj+#})0NXGv{ z1QKIzMNJV1HfDLTkh?X}P{7S9mcTzZD;|P0VGjhbsrk?N8jam1L`D!HAtZwlIY9^> zCxRgNnW~$X!LUk1447gJeTtyqxcul$Wa=pfJuG7CQLU)0IE0K%T@pE{#Ho-_JaA(n zhJ$(`ae&NRl9+1}!B`F;BH2q(b(jC2t@nzu?7Z&${(JB5oO>%*bx!C;1L#H*fdGg| z1VRkrP$U(YBx+=d3L|+m620cdv&MdyWsmI#do0^aOQVr2Qi&RgBpAgck{~D$1c=zk zKsV4iR#&dNRX3dT?Y;f5&n@u5eBdG%uu$mkd(Zj4z5oB;4`dZ8;qvm?Q`+w;qhEEu z`)}`73UOaYc;ljn`qsJz@M3q%j?dhxb?wH!QMbo-g1#I`Wz4`w8FFgMA z&in42oZ0{M@yAzIX4A;{%=Ap+qCY|R{kuK4|T}_L@)LR*kpLpFX+oJ@2Ygdu(cY*Qb81|E^Q7{)az<=J9(D z-}oD!;P&X+!rbeB`{nwjv(9qkr$1Hf+(otb2i@N4^7(H+n$OO9B~N_*i~P?It0{Fl zdE4~dwwdyt`$xx%&SW7(Dg@;QBWA{l+=eYc;-*$i6c;`s4iZ;P8)6LNW?)5ZtzswQ z5vhyv8@;tB2f;I^1a)`@L8OeXw=h%8Pl?!^%nPtH0Ax2sgFXVl=GKS_;X}%DAV!5b ziCA2Q6wFEta!L%>@bc7&#fZ!s;JLYhP*+uC@|hVL1doPk$3)ijK0FDrA&})w>ntTP z2!V=}vLSBFDS}-raBJL%fg59J+)^8a9+(q6#v#T+b(6d+3Qiz;>FLK_dG2ZIE0)&L zt5cs@i47Y%uzu!Ki~ZLZyR{Zd)fDDzZ3gw^*vwRsI$jBiaZaA({ISq0JkS;10_P*-Zx3a(7P4 z0)>y1V_WaI_tNX?Hwb%ey88>Rpb~er|!IU%g5idKDCugqKT__{q8T#{^u_a&Rw{&XLQdsdlMJJ z@Z8>4sC(a>X-n6jzCSr{H+8wE@x2o|EXlN8~Wu-pJTc<7rLnwVUOGmPU# z8K=U zUXJSsEw9r0I_;Qvy>o7~o-0QuZ`gUH_1^cES9-G#|M>hHuP@J@xcSJPV^fpc#&>Sq ze#_iHJ!iZEBPWo!lRyLs;MAftjrRHT$6o#NH^I((ckTPo&yCD%yXND+@ZxJ{Ohn1W z9SI4=D9SbK5wP&Wi?VvJZkgy@xjg^ZU!mEKyPkdgC)fSrFLnl%i8MAt6R(|nxxG@^P5aU{2M+z#FQ5F=|5{yK zc5)tR?f&@ti`(8dHMVu7yK?E_$CrP6G)jTP6i&Q?;}jlUX?~06$$>rOH~=^6w8l4V zL_#ELH911_D=9VbAu}_OpfTS<806%s)e54nsV0($xtSZ0Q>=2mNt?z5+N`NqHQlY4 zG8o*AJ?L;z(xYt3<|Ga6nmjv`TUA7hQI$6jLLg(PA)1%i001BWNklG`50Ru#eO?_+Qz0^4W ziRVn_JJST59PGr(UKNg1j5zNd*`aIwJg8jVYPGD?&ENn07r58G|JL_DaLBZBwn1v=8jlYOsD~ z7VdU=rFU)B-8(+@Gxr?);Col3ovDJVqa5$?7TMCr*oGPR`%XN@<*IG0=Pt67I~ldP zHEm>^eS83(Ai}(?WqoOpT^6*zx%P(n-0Bga_^gSZ_fSX z>Gf|v?H#2`T#a1eM3g|z49x>Vc(Wa5MBI%28Wbl-QlEsILo>xs8ym_K+>vD{%Uq)@X>GomRA3Ni|XaT>nr zT{A^v+$Byy+?YEt6p68^MMT=N7EDU+3>ZY%gXI)-P6sndtA!$ona4_rh#=%dMQXKM zV`gjs2?zhw&0!5sny5J;xo@@{EG`x-o`{GkyE(fTV%o3z-Ol1-RrRUSA`p2X4C(yw zlW#os`1hmu@^~9MU{J1(d@0C)m8?#qd&R^)SZ^-OQ_l>is z9{P5^vO>mJPM)4Ubz)>@s_qR2Ym2Y`%@@|6IPSe1X5WU1k(h|Nl!HHW-{`LGBjsp& zdOA%{rmZugK5}aQ(&xTjpPt*ec(L9-x&6outy>N)6uM58_IkZ1U$l#hD{Cu!-A-J+ z>-ziNIaSHR@snyabNw}ATels)=EiHb?mzS5b7M!Yp4zo@BBiSi9IkHIJ4z+ZFRnfR z>cs6gZ=2q|aQ;mHsaNINJ=>35KQkyV96fsQ;~zM1G9$28XS_C5haf5;)d#$f}9S zU}|0#1>7|cw5r`QnW-8H4dKANDT57pin}KfG1ulgZ0-z1UYJQuD?drHhx!RHGQ6(oEi>ta+>)8K2ze?eQse?wKrad0?t4 z*RNcB>2qISd*wWs!R!!3RVh9!>S2U$_{|h5G&fUfj?^5>vxdVm)LWAqQwl`ICfLs0 ziOhlQkcNRlzrOV`ThU&XY(h| z!r7}D8ZrY$Gh0k#a97WYqJSe&QdNzMPR^(dJ=>JAQ;ybW^3~ecGSJmt9#-6kf75WY zK??M&dhyN0GZ)Y*K>;x%bSrcR=&5I?f#B4_vCn)Fac(R4bkF?q0-Vqzf9cZYKmPpE z*jRq~6iB>V>r1E3{q;8n*I%EO*U?iywX*QpZxz4dvy)S$diU#(=4Vf!?fJs|S{fbi zR97l*ujR7R0Syu*1D&yzWg3T!jO>`Sy3WPO+76V5ucBAaJ2{|Gqh^(2ES%#pukBv@eFS8SKB4Q2gZg7z)S+h%5PK9a%8EOn))M%cm zNI7|)DD1%4zxhA^k8M*s-#GV5i_0BTTPLTtzi|5b@BPVtSwDH%1_pJG47m+cjt;nj zV}e9rj(DL*RELZbN67*P%5hxd=FiEQvU|>?P95#SeY(hkx>C z)QT5H!{uQWs#Ia|afKumrnt(IH>q4AXAF%m@Q4UULW07vBILt{1q(G~x5#M~)WY`n z-@Er6w`a@qw!-Xnr+eaWA6k0iC`t0cAQT4&A<5xncjNw;m77)dX+rE zb?@!B>aNMPlV`do&s!F_L!G+WyB#pdYZy7yP3h7a*hv91RIbmwVZx;B-MPVqb!8xV z#Y99-LMuIA=rzAAB1!^J?sc34yl^CDZ$(17Q36Te0y2hi3$r@Br6DW^rFceolwnn1cBMAr70-s8* zVD^A(GuL-rQ|;eBJ&yTTUyX}e>;5D1vv+KrTYT-m|1Y?*Mry=t$jz3_Vnl3BOTT## zkjLJYoMGrym~8LA{~a4P;J((2os~CF`PzVL5C3N{79Ai;Tso;M)jVS6gieiyI}aj| za9tC~V(`vr;$^C_vrs4JRETgY*a}v0=OBHn!9sATb)8b1KpcPioI*zEumEQjg%G^1 z`flz*MZp3d3~Fa4Q)V(KiNKK61e~madRP;tYls{gBWFTg=T=$9dS&y7%fQKeao-@{Ft||9Dn2c|IeT2^@^$rE!}z7+pqqm_iWYCwc}?W|Kb-sIlFtx zqdT@93u+c;)QHP|_g^0S%mm05V3u;1l)bjW=G|_|A_;cI|lk$3DR`Q@eis zgG;X*%O~cjU`o;ulwr<{By8lPvOK~hIio_sl-U!y$@i3#3pQt?Knn0weEJ(B1k~UG z(|0&Q#HFeCfZ(2y{HhP#UH;5n6Ej;UEtyuwzW2SghaRzBpW;=+3GRd(e{9s^w}1MR z``&S5|K!CV|L4D{W;akb)meb3NKP78hu9?sO$#t5LLwI>K|MOcZQ@ZkQ><-7tJ|2^ zm`cEuoGcqB4rV~jW@KO|;*5@Fdu}6ICir+B(2+EGEM*Lr#?NuvD%Y7J-+SA<#P+i zPguJRm{k7Ch1bWnY&o=J*L(lqH;?|oi!xH&_R*ie{bQe4O#RdbF<-OiUINdv3YiM%s`6^qiNp*@2K48pM4n{n3|lliP2uS zQ+K*NIhI_=Xq9RbBUdRXkFapzL^LL7IaJ|-f=QexnHia&b}}_ml!;0~w4|eUTKX;j z>X++#ZcLQMFRu<-ymR~BYwmvM(n59iOAq^c9p#W={1{#uM(px->^-z+eWb>r8Eo{u zn>A+%dxFDAT+N4}(>S_WnBU97#I=R-{bMv$Jn%cecH{0NZI=lz7FU+O{qWac{lSmZ z25V?CgoxU$H^ex_a-Jj4Ym?*QKsh$tq4#FtK}P z1ne`QjLhUv)0~U4%x;>Ei4-B>HfK^dX40HRL|9zSbB-iB13ELh`6!2H17hB(T=&YaJa$Momm{(d<7g3wnC_2-#Yrh zdq04-Y*kTl17m6Q?>_e@OINORN79=Y-aP-*(a8fl zAN=$m?3jg60;Id|e6|Kq>59n;6(czN#1`Ng8nGv(}K&(TD2 z;9q@o%iVWWSv!M`wKiXO(+zJv{3O<@$m+ulOkk!2OcY}uxV@a&IyyCa-JzS>hp$Te z_pzdX@p$l{8 z2im*$fBM6ZeeySOVC$KquX<0ZMv(JiYH{W=Z~CWE-g2l}9hZ~ll`fGZj4DDiHEa%v zIaht{58$zzj*v$)?vY`gN^dTP2_=aKHJu5?Zvd*bx> zpYX*s%8o*|w4R8r*y@Zm+~5)U9|O8w9{(J z>s&1t*;{-z4W^1R7b#DbiRjXCvwP(t! zcJoJXnSAGi1FwpWyQ8%^6HmYv9(tF`g|4v^zY3irH`dvKy zD4A1>MkgoNmzTFp?;a_}dQ4s>>IX+q37Li6ZR^2(mRNGmT+4`Pk!!5h9w~` zDVZ}+I~2~;7!_h;E;#V+JNjd#m+72!pE&#M<)bf-&P?5N_j|72y64Vc`RH2Jz4GYu zgyhDqs@X(@#keKLSi5rN!s4ZF)$is?$J@&VT|#w!qV_hYRzkN{C-q7aBR2zPVp5F& z0#tJnDH?~TM@!SpOs!znKzF$txezBV%t=zARWN{?Uxz!0Ih(;II2bOcS(Rt#L?{3|_>#mz0 zC?+OvnYg(M`#Ugt~y`0$?n+qX{aIrjWx?bk0> zFPy91`FIO+0^EJh= zCl{kCVRPiI@4Mq|H{L$mTYYKijpN_=PCjvY5qY%ME${izjk^!~Z~XeVb*vLJuG%GGu|qS?4Dh{Wmb55w5>fe*N92EtC@>%s<7ySV|(6eV7F zmNV!&O_UsHrq`fwM%YcKVp(QY90+ZAkq)Cdgv(+*Sp_9E=vnrWeK`iBx zb!Un;4a~E%k*gwcccuI4>ql>U$6ae18&~FL&z(Jf{N?9yZmBgraqWF~m93Etd zE!z$sykYyTH@y3|e)ET4`x0HdtK{Of7k;vR$DS>F_a6Sh`)6jWr~mdF@G#Q>&@DT6 zjb63m%K9u9F!pMG@#6O$bt2h4Gyaj0>cF;i?LLf-nt5$??7(uef!78nhh3g8Dy!Mj zVsH5ePhf*=!ABPtuI$@7+FQE(g>T{fQtQaU?lrr1(dZlB``Whl)V2>iSWj&m`|vwE ze{}(7Tdeic6W?1|FAu%%JqPz+Km9u&d*y%qbG_7oT1Ttawp}~7>|L{s!CL2~CmzkG z&X5_oSvD3S5v2^F?#kK-rM}k-{k6W-or!XEdTQdfx9$7*`v)`QV`+49_m=y_o>=~` zz2ld;W`lv9K%SL~0Y|@;~#$Oz7KrpVA_5&rfvH0 z%^&)gkN@b=-YZwQUkQppMG6%LRnsUmvk-$M6(LbFwIJ^sh8JdH07Y36-0MnRedq*= z0a`rrEp`Io=TaNGWi4q|Znix}1Pc#nR^}uu+0~RtQh?zM!3DGk$Y#||a(Z+KLVO}3 znvGfD#tvjdr+ezjXL*FN(ogG|2gXDiHs)?!^{Z7`AGdP7n~915v+C^HV_*2nMrn84 zbk7uz%uLN3f9Rjk%Q`YTvYf|ujNX6m2Y1rs>E4y2r;lBF2`QrK7`$)J|5tsnjBKkm8ZrmJqdxtd7Vz5AV~ zUbvJmE?U;ek`aswa^mBUJX+np=dN4ced*%q7r*~)yfL@!(EjUw<0D(kE#H6Y8#j&a zzT+MD-*d+Uy*j&fW3rsQ<+}C#Eu7h29olYw{swib!im)!O)RE&ap4F5*Jq2xwS3}Yq7hWJ6R~jWbA5X0)h|6_ z3maS0MC=&jE?Y;f|KUcPTzI6HI|ND@gn5B{*`|MwqH|)Fa-4Bko z$Jf>t&wux^(|`9}?^b}o)zySs_1a+Z)-RsQ@)2W{Pj@d?KwgN!&rOk}s(!lE+-)BjziQzzEwcK)|D%`8)3B|-jt+rwLf-Mqz!345_ zcBzG$>vn5It*G2*l8nk&pIHr;UqAlpu7hjE%unV|bh`ci?0gm`t|f;i4MD}o>g>$U zLz5MJNFsG^%z#Y@Sv5uzw@OHwd2F@+B0=PbDpzq#T_^HzQ6X_FHQgM&*P?RN3OYU>+<@-kDk5!wIBCq z#`)HR|Kfl94;Q}i&qu%VQ0JeXociFqZu#Y3W61m@e0gQ$*z8Ilg4CtHd8S@Y$|GD< zP_L>jAGmYoZHLC6dTH+Y7t2HYM-E+Gkxv)xLcQ{+i=**`s}mBsc`}WNv734xz@R|o zzKzDbSMQwKJu2g>+Cgo!xdnG{^j`%eyD>ejWA|)3vU>M@&(8jn*9@zU+<5c#SKqQT zjX5Tds;)?#ffia0E;tcOC-r6lrc4v1ZRf01^>uO_tZFGE!CJc(pgC)8>JvRpf&NNhtC8q7hplUpKk zH37`n6(Cs7BE&V3W(&3qmEjCwCe#QFujTc45foOEnWX}}VXX(EzS%|}nPDIeUzihvUEF}R{KjX$=3@nw>?t`LaiUIFFV6AWz>QG%2VZ$+ zZn0a>Y%Pjbzs+T5LzXJ*iXWd}{)=yI|BVkx8pleu4(Qa%%4fd2`@j9jv8#nk!LoL~ z`IJMp{_OiyC@n55e)s9l!%wD(iJexK7+qEAXKO1jRsE_~uk5wYee=5C`{bT?K0tT8 zZD(r=ij|e+SN{H6{Zr?>9$Km*R2F+_^M#+hdet>=FDCZ=;wOIp)HBZ=JN?@DQpNk| z<^wluyJ2SEbw}D-Ol#S)V$dk^9PYv;fz{}x?|yIRwO3s~z5l}>_|;SwPk!g?d#=9z zmiN8)`olNR+s1llxxJ=i-0r#qXzec1001A6NklPeGh4RTtqLG@p%U(Fj_j$b zCo#HG^?F?UY8Qh{<~e6EDM8Gfb9Q%AOPm~P4ep5zE=6HMUZ*B=6!bkG(iB|WJU7gZ z;ZhG_7$=G>QD`57Md$F)ZG^*I0|ywZ&TJ+`nsYVi7iBAaVCF92TL!9}nMh(C=*~_a zg2RBW4r!-WXK~@E@RF00XC)#*3Yt3y-hpA3*@+;q=-LQ|3}7~Qs5^2qHloL=xcqY3JfsZ#CK$LSZ}ICpXO>Zt>}M|XYjgTH#)-4B+G z?R)kP>iYEgHy``vS3Acq<8r6BySsPds+|vfbnopq-88cAR9=>zVM^Fit8Qb!X+Zli zQ+U~`990F)up$atI&7yW5pCj9Zb*oY2!YKbj^`TMLmMUq;qYvRx+b%%d03b9;SMBv ziZp!sH#-q`NUO~tn7PBlT^9VEx5zsYVqqcSW_fHD3J~EKP+OSINQIQBufATPH$Y{S#m$io+0j?5 z51{1Pp+>daO5c~(vED}p8~b|B=U1weSNf+eW37U*XKWllKmW|j8)xRI$Mw0n<)>ep zf8;q|t5CVE^)J7C?D7-O&p!6t{3Fli7fxfLPXi^5P*kjEA;c7rzFyUvUC@>F<=*Q0 zsSBN#P7P)kyR-A-Gg}wdmM_d-eCBVyP#rzvYc*9iG$zSgT9!f8UFn=zx-{55aqaZ3 zLo@sKOl+Ge#*c4Y{Pv^YUVH2%bm~iI&W>&0_V#OTz319n_q8WmpxL_f;^~)0CdRMc zcVxM@dgjSz>Who({ocMCj=X>WefPZUy{pz+c;y6DnKPA?9L5}wrACF461yAB*qB%X ziNQ^xDD2xosA@28NmvI1tLrGr1PX_na!KR-Nrh}O%cW>D;F>oHfUIzJ3#n@?4QsdT zC?y3B-dv-A0KhbJFv;NV*_*|oH*Fwl>c)t>qgnKXBE6_;-e9vF25CYiNWuhYHgbr2 zG9rV3$RJLn#6$^!9&>im46RhaWF$spV0X_>*`ZO=41Qt5nvdEAnFHc#2yJvAq_U9< zsSyHd45)dn$RUZc*G0ZMQtX92?*M#$cqU!6O9?)=j1=~E}3JMr3? zjVtB$9h0r;qG+Fg^UZu|ojdiVH&0LQoS{Aj%hhV9v%K1Q#b;j1 zm%A$$F7^6@_Mv?|+CG2$wx@knq;^?L3sw$is**c6km}aEef)Evel_(U#BVp4#3fvSF#BXX)Y~*0Lh8~JS zn9IzTD{_h)3*4Zf6eg&6awLO+wE@O87;gp#TTRKFJn$}&8B@T`-PKSq6@?Q;LJg*< zRj3FPiq@gHRz9Khgmz3L{6Ytgf0-W#SfzuoRSyNQ@k!sok<9 zK2h34GStQ7=*NHO_inxWf!F8GedDu#y7cHvUMpH9&5Y7i8$whR=nZ^n*;~R>+c4wA-J#CHM#xz?S`UHoU}0{VdMaCJ zwKyef+(hg_2O*BLL?H!p#G=VS5K=TrWgfc3g1Tg8W|^1>1yf)mywLgB z#_&Rl9a9JIxH+qyd*;P@ZjE#H;PMoa@ry2nN8lKg$r*hkkQ7Wt1q8i5D`z#U2C<+E z4_vKPNy!7XA8R-gviL~AvPP*oo&`lJ%qu4zYB>VgW-21N&P?p4 z4cm{LLhj^wQ}f|4YT(+^H0PqY-iUxBlRHcuHrYdSFuB3VqpL@F%T7k_s*(z;EjYz) z$}Djshc%_KArMud%1ll{r3l8NffI-b;#S9D38Z0pi@QHTh`EW30-RuQpm3|0$Z`$< z2TVwqBvJG8B226)wKyf?S_(0OB_0`R(})bzXtl?VL0y5x@s{UNyn#E$4~Ky>nR*fM z7*%rh8V*(r-~^-PP6H>&Baw zhAJ};u&FgQ?afn&aB2p4%wUdKQk3DN=}qoL2Ec|!40o*^B%IvTp4{S{H7klj)l(rslxNC5@y5OOQ1>=!~~N> zt~u_^?rAtYHf8}2RlZCOIwH;_sEGR1Fm}+`NaD|!L7p?n z;l?1VvTKG}^fcf?EW+$L-VqSuRFzd~)OlpS6xE3s)(O6FE& z)QTEZJ7q`Cq|G6f&Dh!Db*=!;8bm=g%?;@@qIVou8Zy@eQd59HYVJ}L1Y(JgtHWV+ z&F0l$U|Ma?&YF6}Cc7QO|0WQVNU>?mLJmSOEXtEXQuFvdiCbWN_HqT+s2*6(a8=7{ zYGzg&Gt@KSh8()O1Yr;qL`~W?Xd|Y%&I5~11`8etGjga5+?d!sdZABOYnH3++I5m-Z(`?s9jKqy#todDRfQbPy z1r3FO!G~&S&1%f4xdMP4-IKVQD>H*ccsK?8iDA|KMwc!zJVATY`&N>ftvWT0BXI? zy4HPcB1C@5FZBQOAA=Na4jKc<)x9}yG%}^gO*5GXa)INSo#T92LzUFYEtM_H?q)I7 z<|s?5SzRTdt}BPB*1=!n2JR8CVk%N%5LCFEh7K&!e^(H6E)e@0; zt>#P#?xx0I*Jk1#3_^FX5Bp*UcnYjV(CQJmDk7Lt>THUb1BSq|Nrly(9$&DOLWHxM!xz<(oTo(=7 zzy%tu8;PN>DG?D#&gyCbNT7z~YYvlC5RrQhbH!#Y)Ey}yNdYy$odb&p0z9h@`c-co zsvNR8U>F=Fw@m>2Pu&OsNkwyjb$3Y;2sI%#wZL_|x`;4hR^42)s9}x(s$kVY)fg64 z6SLNpRavc4%dX~iorpLdfu3Osx9B54ozxlRrb8D6;%y!{rubYGVeyDZaO1+A`!W3S(G_j^Wt}qIpX`mU_cT#4Q!wYnW8Jqm{C{#s=Mwv z$L}OHbl>5(Vfa6Wm%OF`NJYDm%L7)sr6g)bPH;57X@wAl1E#7o2{n=zYG?u|$kow2 zPiXk8AW3XW@!sSl4vBZVNK#jpqS5@gCzia4m$BN3!BV!{xi$*B1hWD65D4$V0D)Q9 z5+sqrb2b1)N}5eQh8SX51w)mNxn^Z%ca`|1fwHQIm?^onbhljR6bA2zKezx?w#ryjQ<8z-2#W_4up1W#yWUP8>I zCQTJY+>Ok@T<7ermTMjKwcn@E6zTBSHGE6?X8Su{W7d2xs6CdNJ}#lk%87{JxhW=+ z$EH2lz{qL1on!Y*ey3P zMR$jxaY$<*FXB2F60{JiyBk8us*a$g#Zj0!6)nvQW~fpUuPaxj&D(d});R$~F$F2b zzGL&5ZSjSSLqgKJ20*EFDBKANM6Oj3&RI&cD(bwPBxEZj%rWwFm9mVNG_w$sI+>YU zEh!NbO9Hu@R<#jBh9DtxFIjR9KNtu|l42Ct7%-Tbi#%OIKo0eQ5XB^xd}=0y6551J)V~ynI~ZiOki_}jM1qPQzQ#% z=(UJbNAq@eb<0jh1j`jHx|0esn0ri%w1z8k<#pxeuC;6ST*J*ZyJcv0&2CCoTh&Ld z;5BN88f*Z|sIyy*oDoovumd{{e^#)>GZQ@5@uR^F>avjvdo#gy55h|b=-E{PBU4u+ z30}Mn=YK<|lNoUe206LAW#7c^TP7b02+b0~a;C=d?T`j?7GOJfhsCy6nT4d`)HlW) zh->!$udORulH`-d z`4|IpaT}#5qH5i4WI2p{A`?ot9b_GwKxx^g%&v$6)~dvd!df3NgHoqqqp416RfxeE zi@H}vIDY^0pZ~1;gBA{MclHQw?;T$&og_6DOJmujlvNg`wo_Vdb*O;BS$GaR#rO0&WZaLOVP7wt~IkUuQmCXs4AB2iyPBQ($lG-PZz93YiC)?VdPU3W|-ZN&7JjU;-(CR)! zEqq;Az4P=bUN5j5&ee^c5G+35FKIk2QxS~NTBv19QY#qMy-Sm#PrNLMbUx~HyWrSWAc;71{rDaV+8%+@?YRfF+wfhF0I}h)69Upj%n&R;q)SuvEYP`S1Pn=T59A#>s7^T4l(y+VpGS zjxa-s*^YJXTXDP&x}9N#NjszyTU)zs<1-qWn=Wbk_!K;A9NAd1q_kgw5aN{?ZPJK# zMF>*J3=fvHZ;ML%_Ap(~O~}R;pi-B5?SWL`+Ks&;*Lgy_rCU$-u_>$Ti!K1RcAe2%13g%89wXtXHcUapK;A_^tm1>@OwF+%IcT5Wk~#BeRGh2@JvxEJo#rq=*I z?^$GEb=M2-R+UtDD;F9BP)jTYfTfF6(}n<*D^%*zJE6SA`lr;qfBKg@&(m;zkmJwXMNtA z!tGi)X68Lx6B<)n&%Efo841aYW5L)O+AUN%0W%sf!Q{K%Mx2Wv3_4UP+x`yWJe6A2 zG9{5fSuTyvF21f;tz{AQyuv{0ZUQk_YniqHDeSteefrohui>sPrqma2_qH_9m~WTb z`XM%~8Da#7`;R%vakYaOsI5r_4d-@GoQ_VtP5$}=$6<_9B|9T#ONpIB6WsXp12X3@ zyG9wm@6EN~d;4Bk#d3906l#^$jZ$CipIfU;aM4;-w~6ywpSr!F>;Al{HSjf-HH z_3KyITF}2`m3@*`b^5#|RR#6R3&QP#r^?7$_j}z0(^qB{AXZt{nG#*ELs`sz= z`~4FJjn}=6y<#*|#~2A$WM|UBgA?Vv(jemx`{_=>(oJK+t*v*eAg-MN-8P(I#$Tr)w=r+d^y@i4u&!YoCwWs1j&9 zhAr$_rzOzacRLSiQVswMky*8xr4TJt{^%)e*&LnQqbw3vhmF>mmeZne8PKI?T3lQP zXWE)IqN^NhheqcmDn+K&a*1D6*Oh<*d4KMzb$Kw=V<~A+00pp8tPDn8cZmvB@oMLl zTE)_Rf24&L4zIR#M8gsc)@psifW=`fS=js8yLZ_^`1&&%j+NH3c?_xwF@A>KYs0NN z1GiQVQ6njxp^lsgh%56I@wq?9C@RDZh8slXC{xWj^Ik;LJR8XmjC_b-F|(l6BCBdE zyxaWTAkKU_Z1uR70ko{<_B8F6D+CQ;Prf^w181*KRe`gE2ow=pT$rLUI9M#|e8OE# zJlC_S)!gjf^qkMsBQI}bkjeGCn=pUht++s#Q)PR>$9d2LICqdYwjK6bpgXCZB354u z+~vN2Qd*z_)2qLlN?@~iTT_yjRKjGEO&jvOAW2-I+qy_FdIFNgs)aB=<|3f=X>;p| zW?c;1-EpAQ{x1H5sSKw>Gfy{=y!!iCJi$WGetDUfH%gVNJT4MVy};0`!LJ{$>C!;d z>&F#W(% z>)AIbdyGKm;`d_jB{L4t$bm(Edtb(W_vaC+Q-k?Fv8nw#7(Kp)kok%&LtrtbriQdc z4ciSbH*p^sTvbeu4dCy;|N8UKAAkJu^}avXby=0{^ZD2qK~ij!uUe8Z!E%wdx<2a% z!{C)sW#gC8yKW?bCjOhJr#8}*IRH(g4SqYX-3IJ)k($hT~_oCeq4A%06*P`j8`XcmYc2-E2Z%`osAJxvEd7A*tm}R_3PK?^9Ga= zSENdH-!>c|6yB3p$_z;%(=DnXfYnER&7l$+RB=Jlk0Y>_aN4o64DITQJ)$I;fdln8 zIx>c)rEejyfPK~Oc)t(H&QtaOcrcp$quNgUu{&Mi;RH5UjT_W=#^C8SwLA~w=>=lbcRkfS3<^~3Oa zw~rimEfj5NaD1%W1SD|fMG(~hU&kt8!_gZtV{4e7tZR_@$6m>>QG?EXHs`amGR~9& z&yk4pFHtl59vf%qeoHV16WoNF9orwTpzj$QV|XlmguS2mObw(Flci|qL3DddrQmjN z>l8G%J*H-j>i3H&@wt}~T_J2&Y{wl#86+=yWVGYGcVIe?g`$-Y+lcMJO>?EF6ZF=G zZz>Y_xcvqu*CS&I?n}3Gk3jO(*WZ=<_AsyCQc7E;Mkwc6UX%UpDcF*?A=P$PuG-rE zCL$7wun~sKAx#MV|o!;ghCcsR+gq2sd)n+#OrE$3rFX7OeuJx{G?(r zP7~+6PDR-X40ic!#?{F~nj0-(%}+?D=FtNqJ75_aOWFB1pw$Gy6V$ya{pQvb6n%F) zF_<`>9i%(NxS2iK{9#c#`V{AhVPB7NHK=t+r){p%K7Y;pLyzvqX;Dq}7|~p$2A`N= zG4n?#?AI_{zTfe_}7IyRj* z7jvcgLI`>y*poa>!ywy&r-Oskqyao(l|5SWKxnvetzJH%(e=8aP~^w#&=TRr{RMqaWxcc5tQvpFAPLM8 z=gz&85mip^ISk#NwCd+-DnS43q?o=`o4+(g$*zluQzZ|eN`S4CJ-4a@R^VG|`@J_l zh2}vSHq)fx3valX1q^QrZEB}ovu;}rPAlPYgl3t8nng0&cVS@a8M!_U%cfnmhS4|d z`?t6lyco4>8227>AHQDvVA2~=?gwvxcy?=Zz0PUf55G3#+ym@y+ Z{134d27Ag0hot}j002ovPDHLkV1jsTemnpG literal 0 HcmV?d00001 diff --git a/apps/test_UserInput/testUserInput_ss2.png b/apps/test_UserInput/testUserInput_ss2.png new file mode 100644 index 0000000000000000000000000000000000000000..ba680a366d6d26846b51042e0b419c1e98ce6bf0 GIT binary patch literal 88076 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 z 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.E#q<5>n8cCisDVsJ<8(hQ+?6 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 x2JJUP2X0j%$jLfHTS002ovPDHLkV1fsO>xuvX literal 0 HcmV?d00001 diff --git a/apps/test_UserInput/test_userInput.app.js b/apps/test_UserInput/test_userInput.app.js index accde69b0..0ea324cd4 100644 --- a/apps/test_UserInput/test_userInput.app.js +++ b/apps/test_UserInput/test_userInput.app.js @@ -1,53 +1,66 @@ -/* Testing input dapgo2021 +/* Test bangle.js input interface */ var colbackg='#111111'; //var coldarkred='#CC3333'; var colorange='#e56e06'; var colgrey='#51504f'; var v_font1size='16'; - var v_clicks='0' - console.log("*** Testing basic UserInput - dapgo***"); + var v_clicks='0'; + console.log("*** Test input interface ***"); function ClearActiveArea(){ - //all except widget area - g.setColor(colbackg); //white + g.setColor(colbackg); g.fillRect(0,32,239,239); //fill all screen except widget area g.flip(); } function ClearBannerArea(){ - //all except widget area - g.setColor(colgrey); //white + g.setColor(colgrey); g.fillRect(50,32,190,85); //fill an specific area g.flip(); } - function PrintUserInput(boton){ console.log("Pressed touch/BTN",boton); - if (v_clicks=='0') PrintAreas(); - - ClearBannerArea(); - //Bangle.drawWidgets(); //not paint if not removed - - g.setColor(colorange); - g.setFontVector(32).drawString(boton, 50, 65); - g.flip(); - v_clicks++; + if (v_clicks=='0') PrintAreas(); + ClearBannerArea(); + if (boton==' <---') { + var img = { + width : 48, height : 48, bpp : 2, + transparent : 0, + palette : new Uint16Array([65535,63968,40283,50781]), + buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAA///9VVVVVVVQAAAD/qq/1VVVVVVVAAAP6qqv9VVVVVVVUAA/qqqv/VVVVVVVVAD+qqq//1VVVVVVVQP6qqq//1VVVVVVVQPqqqr//9VVVVVVVUvqqqr//9VVVVVVVU+qqqv/+uVVVVVVVV+qqqv+quVVVVVVVV+qqq+qqvVVVVVVVV+qqvqqqvVVVVVVVV+qv+qqquVVVVVVVV+r/+qqquVVVVVVVVv//6qqq9VVVVVVVUP//6qqq9VVVVVVVUP//qqqr1VVVVVVVQD//qqqv1VVVVVVVQA/+qqq/VVVVVVVVAAP+qqr9VVVVVVVUAAD/qq/1VVVVVVVAAAA///9VVVVVVVQAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) + }; + g.drawImage(img,90,35); + } + else if (boton==' --->') { + var img = { + width : 48, height : 48, bpp : 2, + transparent : 0, + palette : new Uint16Array([65535,36361,27879,40283]), + buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAABVVVVVqqf///AAAAVVVVVWqn////wAAFVVVVVWqf////8AAVVVVVVap//////ABVVVVVVqr//////wBVVVVVVqn//////8FVVVVVVqv//////8FVVVVVWqf///////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////FVVVVVWqf///////FVVVVVVqv//////8BVVVVVVqn//////8BVVVVVVar//////wAVVVVVVap//////AAFVVVVVWqf////8AAAVVVVVWqn////wAAABVVVVVqqf///AAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) + }; + g.drawImage(img,90,35); + } + else + { //no swipe /slide + g.setColor(colorange); + g.setFontVector(32).drawString(boton, 60, 65); + } + g.flip(); + v_clicks++; } function PrintBtn1(boton){ console.log("Pressed BTN1"); if (v_clicks=='0') PrintAreas(); - PrintUserInput("Button1") - //delay + PrintUserInput("Button1"); v_clicks++; } function PrintBtn2(boton){ console.log("Pressed BTN2"); if (v_clicks=='0') PrintAreas(); - PrintUserInput("Button2") - //delay + PrintUserInput("Button2"); v_clicks++; } @@ -67,13 +80,12 @@ function PrintHelp(){ g.setFontVector(v_font1size).drawString("Press Button2 ", 30,205); g.setFontVector(v_font1size).drawString("Press Button3 to Quit", 30,220); g.flip(); -}; +} function PrintAreas(){ console.log("********************************"); console.log("Log: *** Print Areas in screen"); - ClearActiveArea(); - + ClearActiveArea(); g.setColor(0,1,0); //green g.drawLine(1, 140, 1, 200);//side border g.drawLine(239, 140, 239, 200);//side border @@ -84,12 +96,9 @@ function PrintAreas(){ g.setFontVector(v_font1size).drawString("BTN3", 195,225); g.setFontVector(v_font1size).drawString("Middle area", 80,120); g.setFontVector(v_font1size).drawString("Left area", 15, 165); - g.setFontVector(v_font1size).drawString("Right area", 140,165); - - + g.setFontVector(v_font1size).drawString("Right area", 140,165); g.flip(); -}; - +} function UserInput(){ Bangle.on('touch', function(button){ @@ -101,32 +110,27 @@ function UserInput(){ PrintUserInput("Touch 2");//right break; case 3: - PrintUserInput("Touch 3");//center + PrintUserInput("Touch 3");//center 1+2 break; - } + } }); //only the name of the function - setWatch(PrintBtn1, BTN1, { repeat: true }); - setWatch(PrintBtn2, BTN2, { repeat: true }); - setWatch(Bangle.showLauncher, BTN3, { repeat: true }); + setWatch(PrintBtn1, BTN1, { repeat: true }); + setWatch(PrintBtn2, BTN2, { repeat: true }); + setWatch(Bangle.showLauncher, BTN3, { repeat: true }); Bangle.on('swipe', dir => { - if(dir == 1) PrintUserInput(" --->"); //func load to quit - else PrintUserInput(" <---"); + if(dir == 1) PrintUserInput(" --->"); + else PrintUserInput(" <---"); }); - console.log("Log: Input conditions loaded"); -}; //end of UserInput + console.log("Log: Input conditions loaded"); +} //end of UserInput //Main code -//Call Once - Bangle.loadWidgets(); - Bangle.drawWidgets(); + Bangle.drawWidgets(); g.setColor(0,1,0); //green - g.drawLine(60, 30, 180, 30); //line below widgets check if deleted - g.flip(); - + g.drawLine(60, 30, 180, 30); //optional line below widgets area + g.flip(); PrintHelp(); - //printhelp clear the full screen - UserInput(); From a9f46c3899d6fc4084b63c21757aa37a2d0980b5 Mon Sep 17 00:00:00 2001 From: dapgo Date: Sat, 6 Feb 2021 22:54:51 +0100 Subject: [PATCH 106/148] Test User input v002 --- apps/{test_UserInput => testUserInput}/Changelog | 0 apps/{test_UserInput => testUserInput}/README.md | 0 .../testUserInput_ss0.png | Bin .../testUserInput_ss1.png | Bin .../testUserInput_ss2.png | Bin .../testUserInput_ss3.png | Bin .../test_userInput.app.js | 8 ++++---- .../test_userInput.img | 0 apps/testUserInput/test_userInput.info | 1 + apps/test_UserInput/test_userInput.info | 1 - 10 files changed, 5 insertions(+), 5 deletions(-) rename apps/{test_UserInput => testUserInput}/Changelog (100%) rename apps/{test_UserInput => testUserInput}/README.md (100%) rename apps/{test_UserInput => testUserInput}/testUserInput_ss0.png (100%) rename apps/{test_UserInput => testUserInput}/testUserInput_ss1.png (100%) rename apps/{test_UserInput => testUserInput}/testUserInput_ss2.png (100%) rename apps/{test_UserInput => testUserInput}/testUserInput_ss3.png (100%) rename apps/{test_UserInput => testUserInput}/test_userInput.app.js (98%) rename apps/{test_UserInput => testUserInput}/test_userInput.img (100%) create mode 100644 apps/testUserInput/test_userInput.info delete mode 100644 apps/test_UserInput/test_userInput.info diff --git a/apps/test_UserInput/Changelog b/apps/testUserInput/Changelog similarity index 100% rename from apps/test_UserInput/Changelog rename to apps/testUserInput/Changelog diff --git a/apps/test_UserInput/README.md b/apps/testUserInput/README.md similarity index 100% rename from apps/test_UserInput/README.md rename to apps/testUserInput/README.md diff --git a/apps/test_UserInput/testUserInput_ss0.png b/apps/testUserInput/testUserInput_ss0.png similarity index 100% rename from apps/test_UserInput/testUserInput_ss0.png rename to apps/testUserInput/testUserInput_ss0.png diff --git a/apps/test_UserInput/testUserInput_ss1.png b/apps/testUserInput/testUserInput_ss1.png similarity index 100% rename from apps/test_UserInput/testUserInput_ss1.png rename to apps/testUserInput/testUserInput_ss1.png diff --git a/apps/test_UserInput/testUserInput_ss2.png b/apps/testUserInput/testUserInput_ss2.png similarity index 100% rename from apps/test_UserInput/testUserInput_ss2.png rename to apps/testUserInput/testUserInput_ss2.png diff --git a/apps/test_UserInput/testUserInput_ss3.png b/apps/testUserInput/testUserInput_ss3.png similarity index 100% rename from apps/test_UserInput/testUserInput_ss3.png rename to apps/testUserInput/testUserInput_ss3.png diff --git a/apps/test_UserInput/test_userInput.app.js b/apps/testUserInput/test_userInput.app.js similarity index 98% rename from apps/test_UserInput/test_userInput.app.js rename to apps/testUserInput/test_userInput.app.js index 0ea324cd4..49d21b394 100644 --- a/apps/test_UserInput/test_userInput.app.js +++ b/apps/testUserInput/test_userInput.app.js @@ -25,22 +25,22 @@ function PrintUserInput(boton){ ClearBannerArea(); if (boton==' <---') { - var img = { + var img_off = { width : 48, height : 48, bpp : 2, transparent : 0, palette : new Uint16Array([65535,63968,40283,50781]), buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAA///9VVVVVVVQAAAD/qq/1VVVVVVVAAAP6qqv9VVVVVVVUAA/qqqv/VVVVVVVVAD+qqq//1VVVVVVVQP6qqq//1VVVVVVVQPqqqr//9VVVVVVVUvqqqr//9VVVVVVVU+qqqv/+uVVVVVVVV+qqqv+quVVVVVVVV+qqq+qqvVVVVVVVV+qqvqqqvVVVVVVVV+qv+qqquVVVVVVVV+r/+qqquVVVVVVVVv//6qqq9VVVVVVVUP//6qqq9VVVVVVVUP//qqqr1VVVVVVVQD//qqqv1VVVVVVVQA/+qqq/VVVVVVVVAAP+qqr9VVVVVVVUAAD/qq/1VVVVVVVAAAA///9VVVVVVVQAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) }; - g.drawImage(img,90,35); + g.drawImage(img_off,90,35); } else if (boton==' --->') { - var img = { + var img_on = { width : 48, height : 48, bpp : 2, transparent : 0, palette : new Uint16Array([65535,36361,27879,40283]), buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAABVVVVVqqf///AAAAVVVVVWqn////wAAFVVVVVWqf////8AAVVVVVVap//////ABVVVVVVqr//////wBVVVVVVqn//////8FVVVVVVqv//////8FVVVVVWqf///////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////FVVVVVWqf///////FVVVVVVqv//////8BVVVVVVqn//////8BVVVVVVar//////wAVVVVVVap//////AAFVVVVVWqf////8AAAVVVVVWqn////wAAABVVVVVqqf///AAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) }; - g.drawImage(img,90,35); + g.drawImage(img_on,90,35); } else { //no swipe /slide diff --git a/apps/test_UserInput/test_userInput.img b/apps/testUserInput/test_userInput.img similarity index 100% rename from apps/test_UserInput/test_userInput.img rename to apps/testUserInput/test_userInput.img diff --git a/apps/testUserInput/test_userInput.info b/apps/testUserInput/test_userInput.info new file mode 100644 index 000000000..cc1447954 --- /dev/null +++ b/apps/testUserInput/test_userInput.info @@ -0,0 +1 @@ +{"id":"testuserInput","name":"Test User Input","src":"test_userInput.app.js","icon":"test_userInput.img","version":"0.02","files":"test_userInput.info,test_userInput.app.js,test_userInput.img"} \ No newline at end of file diff --git a/apps/test_UserInput/test_userInput.info b/apps/test_UserInput/test_userInput.info deleted file mode 100644 index 0141577c8..000000000 --- a/apps/test_UserInput/test_userInput.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"test_userInput","name":"User Input","src":"test_userInput.app.js","icon":"test_userInput.img","version":"0.02","files":"test_userInput.info,test_userInput.app.js,test_userInput.img"} \ No newline at end of file From c5c7ad06b707f4a92c15d58ad33111d5fcac2d92 Mon Sep 17 00:00:00 2001 From: dapgo Date: Sat, 6 Feb 2021 23:08:47 +0100 Subject: [PATCH 107/148] Update test_userInput.app.js fixed : Mixed spaces and tabs no-mixed-spaces-and-tabs --- apps/testUserInput/test_userInput.app.js | 94 ++++++++++++------------ 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/apps/testUserInput/test_userInput.app.js b/apps/testUserInput/test_userInput.app.js index 49d21b394..09a187b5a 100644 --- a/apps/testUserInput/test_userInput.app.js +++ b/apps/testUserInput/test_userInput.app.js @@ -1,5 +1,4 @@ -/* Test bangle.js input interface -*/ +/* Test bangle.js input interface */ var colbackg='#111111'; //var coldarkred='#CC3333'; var colorange='#e56e06'; @@ -19,33 +18,33 @@ function ClearBannerArea(){ g.flip(); } -function PrintUserInput(boton){ +function PrintUserInput(boton){ console.log("Pressed touch/BTN",boton); - if (v_clicks=='0') PrintAreas(); + if (v_clicks=='0') PrintAreas(); ClearBannerArea(); - if (boton==' <---') { - var img_off = { - width : 48, height : 48, bpp : 2, - transparent : 0, - palette : new Uint16Array([65535,63968,40283,50781]), - buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAA///9VVVVVVVQAAAD/qq/1VVVVVVVAAAP6qqv9VVVVVVVUAA/qqqv/VVVVVVVVAD+qqq//1VVVVVVVQP6qqq//1VVVVVVVQPqqqr//9VVVVVVVUvqqqr//9VVVVVVVU+qqqv/+uVVVVVVVV+qqqv+quVVVVVVVV+qqq+qqvVVVVVVVV+qqvqqqvVVVVVVVV+qv+qqquVVVVVVVV+r/+qqquVVVVVVVVv//6qqq9VVVVVVVUP//6qqq9VVVVVVVUP//qqqr1VVVVVVVQD//qqqv1VVVVVVVQA/+qqq/VVVVVVVVAAP+qqr9VVVVVVVUAAD/qq/1VVVVVVVAAAA///9VVVVVVVQAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) - }; - g.drawImage(img_off,90,35); + if (boton==' <---') { + var img_off = { + width : 48, height : 48, bpp : 2, + transparent : 0, + palette : new Uint16Array([65535,63968,40283,50781]), + buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAA///9VVVVVVVQAAAD/qq/1VVVVVVVAAAP6qqv9VVVVVVVUAA/qqqv/VVVVVVVVAD+qqq//1VVVVVVVQP6qqq//1VVVVVVVQPqqqr//9VVVVVVVUvqqqr//9VVVVVVVU+qqqv/+uVVVVVVVV+qqqv+quVVVVVVVV+qqq+qqvVVVVVVVV+qqvqqqvVVVVVVVV+qv+qqquVVVVVVVV+r/+qqquVVVVVVVVv//6qqq9VVVVVVVUP//6qqq9VVVVVVVUP//qqqr1VVVVVVVQD//qqqv1VVVVVVVQA/+qqq/VVVVVVVVAAP+qqr9VVVVVVVUAAD/qq/1VVVVVVVAAAA///9VVVVVVVQAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) + }; + g.drawImage(img_off,90,35); } - else if (boton==' --->') { - var img_on = { - width : 48, height : 48, bpp : 2, - transparent : 0, - palette : new Uint16Array([65535,36361,27879,40283]), - buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAABVVVVVqqf///AAAAVVVVVWqn////wAAFVVVVVWqf////8AAVVVVVVap//////ABVVVVVVqr//////wBVVVVVVqn//////8FVVVVVVqv//////8FVVVVVWqf///////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////FVVVVVWqf///////FVVVVVVqv//////8BVVVVVVqn//////8BVVVVVVar//////wAVVVVVVap//////AAFVVVVVWqf////8AAAVVVVVWqn////wAAABVVVVVqqf///AAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) - }; + else if (boton==' --->') { + var img_on = { + width : 48, height : 48, bpp : 2, + transparent : 0, + palette : new Uint16Array([65535,36361,27879,40283]), + buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAABVVVVVqqf///AAAAVVVVVWqn////wAAFVVVVVWqf////8AAVVVVVVap//////ABVVVVVVqr//////wBVVVVVVqn//////8FVVVVVVqv//////8FVVVVVWqf///////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////VVVVVVWq////////FVVVVVWqf///////FVVVVVVqv//////8BVVVVVVqn//////8BVVVVVVar//////wAVVVVVVap//////AAFVVVVVWqf////8AAAVVVVVWqn////wAAABVVVVVqqf///AAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) + }; g.drawImage(img_on,90,35); } - else - { //no swipe /slide - g.setColor(colorange); - g.setFontVector(32).drawString(boton, 60, 65); + else + { //no swipe /slide + g.setColor(colorange); + g.setFontVector(32).drawString(boton, 60, 65); } g.flip(); v_clicks++; @@ -100,29 +99,29 @@ function PrintAreas(){ g.flip(); } -function UserInput(){ - Bangle.on('touch', function(button){ - switch(button){ - case 1: - PrintUserInput("Touch 1");//left - break; - case 2: - PrintUserInput("Touch 2");//right - break; - case 3: - PrintUserInput("Touch 3");//center 1+2 - break; - } - }); - //only the name of the function - setWatch(PrintBtn1, BTN1, { repeat: true }); - setWatch(PrintBtn2, BTN2, { repeat: true }); - setWatch(Bangle.showLauncher, BTN3, { repeat: true }); - Bangle.on('swipe', dir => { - if(dir == 1) PrintUserInput(" --->"); - else PrintUserInput(" <---"); - }); - console.log("Log: Input conditions loaded"); +function UserInput(){ + Bangle.on('touch', function(button){ + switch(button){ + case 1: + PrintUserInput("Touch 1");//left + break; + case 2: + PrintUserInput("Touch 2");//right + break; + case 3: + PrintUserInput("Touch 3");//center 1+2 + break; + } + }); + //only the name of the function + setWatch(PrintBtn1, BTN1, { repeat: true }); + setWatch(PrintBtn2, BTN2, { repeat: true }); + setWatch(Bangle.showLauncher, BTN3, { repeat: true }); + Bangle.on('swipe', dir => { + if(dir == 1) PrintUserInput(" --->"); + else PrintUserInput(" <---"); + }); + console.log("Log: Input conditions loaded"); } //end of UserInput //Main code @@ -132,5 +131,4 @@ function UserInput(){ g.drawLine(60, 30, 180, 30); //optional line below widgets area g.flip(); PrintHelp(); - UserInput(); - + UserInput(); \ No newline at end of file From 1227e80e45dbe2baa78b82b25015a3467a7a6b63 Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 13:38:20 +0100 Subject: [PATCH 108/148] minor update mainly the forgotten app.png --- apps/testUserInput/app.png | Bin 0 -> 1496 bytes apps/testUserInput/test_userInput.app.js | 9 +++++---- apps/testUserInput/test_userInput.info | 1 - 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 apps/testUserInput/app.png delete mode 100644 apps/testUserInput/test_userInput.info diff --git a/apps/testUserInput/app.png b/apps/testUserInput/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ad0f43f9781b194f56a0129b6aaa09ef82378a GIT binary patch literal 1496 zcmV;}1tz3Ip6O;XXc!lfzw=4Yr}Lp?P$~4Ypk_v5!!(kpkJ`P;Pklu z;HGps9n=psTs0Y3mtKDfjmnjpYcZ$wZv4RVz8GIfduC z6bd8c^Erye5t=-Yvzk+Mt-6s!JdRQAI65M?Hv&Gg0S$Dms|HKdXW91%ta_A~3x zN11nU4K0Tr+7|=lbRh3*Whqaa<2oUQ-|ECZXp#M|E76^g>Yb`^$9IA?{_BYCa7s-IH zy%xH6@7vGpmYJxIPArGF{;sFp$$>wmAL!P`!4oyzXn?4(>!|a**+m>?Hfxe6b-;(QE$nXo)>?eI%>Eg zjR3&=Z@qfJpq)mww?8`&n)6q70HeCY`qJ4*c&Nbu{9~g1in&Wf{JX+CE#BFF#oW%V z@4WoW)bLKOnqQ~KWVbD{6FOa%nR36?s-_V*m2}!0h_sMZt8X^61|5sf9d=wNgUB`l zc7gO^3VUQlU#_0D8uAPrIg+QfH8q-0o(}v5>;?9L>;c&e{$5$WbAK)M8)Cp(5Mez0 zgq(3YD3%Qb=R7YfJ~P$UZ^$!H13bVSD?Do@yV2U}FYJH*5LbX7JqZZ6@kQIc)%G{x zA-3BVuD4e1H6}M~|VDIrC!)Z&L%{ zC+%;%CN5+#=Rpc)9#&QYhzOns;50+i%@(=&&-X6Rj*OV;)*5L9{G{#1X~HZd9pC!6 z@mqnPN->eKkzm?1k66q-Cm#1Ck*K_o{}=F3VH%arZw7Jc1`d~Eqb8b~N+yWM!wpOs zekvm{Cb>5A3qm(AT#AL5n7~&L_<9%skfoU&SndW&|24;(DC3C=Kf2Wl4^^zhvOM!H z!V_h&6HJtNYJsN$e7#0sOtLid6v8WIF%eu>$|1s33w*r|01$H@LhL7HjUD-4;UR(n z>G;-1%xYlINt44s#=~1G!cS=(m`rkA-(P5O6L6$rQdsdYc&H3-8LXBm^6RwR@Z$jj zZUs9M3K|xR1`lF)Rm)S;_kdiV*$&*riOBVW2gLGrwJbG%(8#hMHUW>70iCE?;UVJ; znz9*hQjSQ}VVs{YTy2q;ff@e>!{Nf_`U&v9?UL>v{;0NoUH+iikK3m+P4BnJEm*q% y%d80SIbf$?dz?Y@imdJ{)`RJc&ghIz6a5WzKeaAm literal 0 HcmV?d00001 diff --git a/apps/testUserInput/test_userInput.app.js b/apps/testUserInput/test_userInput.app.js index 09a187b5a..3ee8b5c0f 100644 --- a/apps/testUserInput/test_userInput.app.js +++ b/apps/testUserInput/test_userInput.app.js @@ -2,7 +2,7 @@ var colbackg='#111111'; //var coldarkred='#CC3333'; var colorange='#e56e06'; - var colgrey='#51504f'; + var colgrey='#f3f3f1' //'#51504f'; //lighter gray var v_font1size='16'; var v_clicks='0'; console.log("*** Test input interface ***"); @@ -20,7 +20,7 @@ function ClearBannerArea(){ function PrintUserInput(boton){ console.log("Pressed touch/BTN",boton); - if (v_clicks=='0') PrintAreas(); + if (v_clicks=='0') PrintAreas(); ClearBannerArea(); if (boton==' <---') { @@ -63,7 +63,6 @@ function PrintBtn2(boton){ v_clicks++; } - function PrintHelp(){ console.log("********************************"); console.log("Log: *** Print help in screen"); @@ -127,8 +126,10 @@ function UserInput(){ //Main code Bangle.loadWidgets(); Bangle.drawWidgets(); + //optional line below widgets area g.setColor(0,1,0); //green - g.drawLine(60, 30, 180, 30); //optional line below widgets area + g.drawLine(60, 30, 180, 30); g.flip(); + //end optional PrintHelp(); UserInput(); \ No newline at end of file diff --git a/apps/testUserInput/test_userInput.info b/apps/testUserInput/test_userInput.info deleted file mode 100644 index cc1447954..000000000 --- a/apps/testUserInput/test_userInput.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"testuserInput","name":"Test User Input","src":"test_userInput.app.js","icon":"test_userInput.img","version":"0.02","files":"test_userInput.info,test_userInput.app.js,test_userInput.img"} \ No newline at end of file From 42870ad30d33523576b20c6ba23edf348c834b93 Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 13:42:23 +0100 Subject: [PATCH 109/148] a missing semmicolon --- apps/testUserInput/test_userInput.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/testUserInput/test_userInput.app.js b/apps/testUserInput/test_userInput.app.js index 3ee8b5c0f..8887a3149 100644 --- a/apps/testUserInput/test_userInput.app.js +++ b/apps/testUserInput/test_userInput.app.js @@ -2,7 +2,7 @@ var colbackg='#111111'; //var coldarkred='#CC3333'; var colorange='#e56e06'; - var colgrey='#f3f3f1' //'#51504f'; //lighter gray + var colgrey='#f3f3f1'; //'#51504f'; //lighter gray var v_font1size='16'; var v_clicks='0'; console.log("*** Test input interface ***"); From e9c25a2a6ff65a908b277a12bf372cf9cbe3176e Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 15:38:08 +0100 Subject: [PATCH 110/148] Update apps.json add testuserInput app --- apps.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps.json b/apps.json index 5a19eabf1..c794567e0 100644 --- a/apps.json +++ b/apps.json @@ -2750,6 +2750,18 @@ {"name":"oblique.app.js","url":"app.js"}, {"name":"oblique.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "testuserInput", + "name": "Test User Input", + "shortName":"Test User Input", + "icon": "app.png", + "version":"0.02", + "description": "Basic app to test the bangle.js input interface. It displays the result in text or a switch on/off image.", + "tags": "interface","buttons","touch" + "storage": [ + {"name":"test_userInput.app.js","url":"app.js"}, + {"name":"test_userInput.img","url":"app-icon.js","evaluate":true} + ] } ] From b03055530dc555e780c8d06cc603741ca939fbe2 Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 15:39:30 +0100 Subject: [PATCH 111/148] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c794567e0..926c55e58 100644 --- a/apps.json +++ b/apps.json @@ -2757,7 +2757,7 @@ "icon": "app.png", "version":"0.02", "description": "Basic app to test the bangle.js input interface. It displays the result in text or a switch on/off image.", - "tags": "interface","buttons","touch" + "tags": "interface","buttons","touch", "storage": [ {"name":"test_userInput.app.js","url":"app.js"}, {"name":"test_userInput.img","url":"app-icon.js","evaluate":true} From 2417c7d8c1118ccd36afc9e7546db59b5237748e Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 15:41:32 +0100 Subject: [PATCH 112/148] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 926c55e58..cbf102915 100644 --- a/apps.json +++ b/apps.json @@ -2757,7 +2757,7 @@ "icon": "app.png", "version":"0.02", "description": "Basic app to test the bangle.js input interface. It displays the result in text or a switch on/off image.", - "tags": "interface","buttons","touch", + "tags": "input,interface,buttons,touch", "storage": [ {"name":"test_userInput.app.js","url":"app.js"}, {"name":"test_userInput.img","url":"app-icon.js","evaluate":true} From e87dda3979e5d3f91d3151b103d2ebed176a088e Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 16:36:47 +0100 Subject: [PATCH 113/148] app-icon and linux enol --- apps/testUserInput/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/testUserInput/app-icon.js diff --git a/apps/testUserInput/app-icon.js b/apps/testUserInput/app-icon.js new file mode 100644 index 000000000..83b9f5c94 --- /dev/null +++ b/apps/testUserInput/app-icon.js @@ -0,0 +1 @@ +var img = E.toArrayBuffer(atob("MDDCAP//Bv7m/RF8AAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAD//8AAAAAAAAAAAAP///AAAAAAAAAAAA////wAAAAAAAAAAA////wAAAAAAAAAAD/9X/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAA/1V/wAAAAAAAAAAA/1V/wAAAAAAAAAAAP1V/AAAAAAAAAAAAD1V8AAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVlQAAAAAAAAAAAAFVlVVQAAAAAAAAAAFVVVVVUAAAAAAAAAFVVVVVVQAAAAAAAAFVVVVVVQAAAAFYAAFVVVVVVUAAAAFWAAFVVVVVVUAAAAFVgAFVVVVVVUAAAAFVaAlVVVVVVUAAAABVWqlVVVVVVUAAAAAVVqlVVVVVVUAAAAAFValVVVVVVYAAAAABVWlVVVVVVoAAAAAAVVlVVVVVWoAAAAAAFVVVVVVVaoAAAAAAFVVVVVVVqoAAAAAABVVVVVVWqoAAAAAAAVVVVVVqqoAAAAAAAFVVVVWqqoAAAAAAABVVVVaqqoAAAAAAAAVVVVqqqgAAAAAAAAFVVWqqqgAAAAAAAABVVaqqqAAAAAAAAAAFVqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) \ No newline at end of file From 754826a3a353fd171ac2ff34d7f7fee7802e0c7a Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 8 Feb 2021 20:44:27 +0000 Subject: [PATCH 114/148] fixed issues with tapelauncher entries in apps.json --- apps.json | 6 +++--- apps/tapelauncher/ChangeLog | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index dd96e9195..381c96d69 100644 --- a/apps.json +++ b/apps.json @@ -2733,14 +2733,14 @@ { "id": "tapelauncher", "name": "Tape Launcher", "icon": "icon.png", - "version":"0.01", + "version":"0.02", "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", "readme": "README.md", "tags": "tool,system,launcher", "type":"launch", "storage": [ - {"name":"tapelaunch.app.js","url":"app.js"}, - {"name":"tapelaunch.img","url":"icon.js","evaluate":true} + {"name":"tapelauncher.app.js","url":"app.js"}, + {"name":"tapelauncher.img","url":"icon.js","evaluate":true} ] }, { "id": "oblique", diff --git a/apps/tapelauncher/ChangeLog b/apps/tapelauncher/ChangeLog index 918e4a9ac..b30d07ad6 100644 --- a/apps/tapelauncher/ChangeLog +++ b/apps/tapelauncher/ChangeLog @@ -1,2 +1,2 @@ 0.01: Initial version - +0.02: Fixed issues with entry in apps.json From b81a4129ff51bf81ae433b04d744370ba8e9dc65 Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 21:49:29 +0100 Subject: [PATCH 115/148] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index cbf102915..620ccf8f9 100644 --- a/apps.json +++ b/apps.json @@ -2751,7 +2751,7 @@ {"name":"oblique.img","url":"app-icon.js","evaluate":true} ] }, -{ "id": "testuserInput", +{ "id": "testuserinput", "name": "Test User Input", "shortName":"Test User Input", "icon": "app.png", From b5b363955cf667d599ceb1e526ff015e4e2ac714 Mon Sep 17 00:00:00 2001 From: dapgo Date: Mon, 8 Feb 2021 21:55:55 +0100 Subject: [PATCH 116/148] fixed caps in id/folder --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index cbf102915..620ccf8f9 100644 --- a/apps.json +++ b/apps.json @@ -2751,7 +2751,7 @@ {"name":"oblique.img","url":"app-icon.js","evaluate":true} ] }, -{ "id": "testuserInput", +{ "id": "testuserinput", "name": "Test User Input", "shortName":"Test User Input", "icon": "app.png", From 11530da1726dac368f7dc961246ec286b68bd9a2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 9 Feb 2021 08:32:06 +0000 Subject: [PATCH 117/148] Build tweaks for app loader --- apps.json | 4 ++-- apps/testUserInput/app-icon.js | 1 - apps/testuserinput/ChangeLog | 2 ++ apps/{testUserInput => testuserinput}/Changelog | 0 apps/{testUserInput => testuserinput}/README.md | 0 apps/testuserinput/app-icon.js | 1 + .../test_userInput.app.js => testuserinput/app.js} | 0 apps/{testUserInput => testuserinput}/app.png | Bin .../testUserInput_ss0.png | Bin .../testUserInput_ss1.png | Bin .../testUserInput_ss2.png | Bin .../testUserInput_ss3.png | Bin .../test_userInput.img | 0 13 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 apps/testUserInput/app-icon.js create mode 100644 apps/testuserinput/ChangeLog rename apps/{testUserInput => testuserinput}/Changelog (100%) rename apps/{testUserInput => testuserinput}/README.md (100%) create mode 100644 apps/testuserinput/app-icon.js rename apps/{testUserInput/test_userInput.app.js => testuserinput/app.js} (100%) rename apps/{testUserInput => testuserinput}/app.png (100%) rename apps/{testUserInput => testuserinput}/testUserInput_ss0.png (100%) rename apps/{testUserInput => testuserinput}/testUserInput_ss1.png (100%) rename apps/{testUserInput => testuserinput}/testUserInput_ss2.png (100%) rename apps/{testUserInput => testuserinput}/testUserInput_ss3.png (100%) rename apps/{testUserInput => testuserinput}/test_userInput.img (100%) diff --git a/apps.json b/apps.json index 3649f6a8a..4fbc1a779 100644 --- a/apps.json +++ b/apps.json @@ -2762,8 +2762,8 @@ "description": "Basic app to test the bangle.js input interface. It displays the result in text or a switch on/off image.", "tags": "input,interface,buttons,touch", "storage": [ - {"name":"test_userInput.app.js","url":"app.js"}, - {"name":"test_userInput.img","url":"app-icon.js","evaluate":true} + {"name":"testuserinput.app.js","url":"app.js"}, + {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/testUserInput/app-icon.js b/apps/testUserInput/app-icon.js deleted file mode 100644 index 83b9f5c94..000000000 --- a/apps/testUserInput/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -var img = E.toArrayBuffer(atob("MDDCAP//Bv7m/RF8AAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAD//8AAAAAAAAAAAAP///AAAAAAAAAAAA////wAAAAAAAAAAA////wAAAAAAAAAAD/9X/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAA/1V/wAAAAAAAAAAA/1V/wAAAAAAAAAAAP1V/AAAAAAAAAAAAD1V8AAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVlQAAAAAAAAAAAAFVlVVQAAAAAAAAAAFVVVVVUAAAAAAAAAFVVVVVVQAAAAAAAAFVVVVVVQAAAAFYAAFVVVVVVUAAAAFWAAFVVVVVVUAAAAFVgAFVVVVVVUAAAAFVaAlVVVVVVUAAAABVWqlVVVVVVUAAAAAVVqlVVVVVVUAAAAAFValVVVVVVYAAAAABVWlVVVVVVoAAAAAAVVlVVVVVWoAAAAAAFVVVVVVVaoAAAAAAFVVVVVVVqoAAAAAABVVVVVVWqoAAAAAAAVVVVVVqqoAAAAAAAFVVVVWqqoAAAAAAABVVVVaqqoAAAAAAAAVVVVqqqgAAAAAAAAFVVWqqqgAAAAAAAABVVaqqqAAAAAAAAAAFVqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) \ No newline at end of file diff --git a/apps/testuserinput/ChangeLog b/apps/testuserinput/ChangeLog new file mode 100644 index 000000000..8e379def2 --- /dev/null +++ b/apps/testuserinput/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App! +0.02: Tweaks for app loader diff --git a/apps/testUserInput/Changelog b/apps/testuserinput/Changelog similarity index 100% rename from apps/testUserInput/Changelog rename to apps/testuserinput/Changelog diff --git a/apps/testUserInput/README.md b/apps/testuserinput/README.md similarity index 100% rename from apps/testUserInput/README.md rename to apps/testuserinput/README.md diff --git a/apps/testuserinput/app-icon.js b/apps/testuserinput/app-icon.js new file mode 100644 index 000000000..a84863bf0 --- /dev/null +++ b/apps/testuserinput/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("MDDCAP//Bv7m/RF8AAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAD//8AAAAAAAAAAAAP///AAAAAAAAAAAA////wAAAAAAAAAAA////wAAAAAAAAAAD/9X/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAD/1V/8AAAAAAAAAAA/1V/wAAAAAAAAAAA/1V/wAAAAAAAAAAAP1V/AAAAAAAAAAAAD1V8AAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVAAAAAAAAAAAAAAFVlQAAAAAAAAAAAAFVlVVQAAAAAAAAAAFVVVVVUAAAAAAAAAFVVVVVVQAAAAAAAAFVVVVVVQAAAAFYAAFVVVVVVUAAAAFWAAFVVVVVVUAAAAFVgAFVVVVVVUAAAAFVaAlVVVVVVUAAAABVWqlVVVVVVUAAAAAVVqlVVVVVVUAAAAAFValVVVVVVYAAAAABVWlVVVVVVoAAAAAAVVlVVVVVWoAAAAAAFVVVVVVVaoAAAAAAFVVVVVVVqoAAAAAABVVVVVVWqoAAAAAAAVVVVVVqqoAAAAAAAFVVVVWqqoAAAAAAABVVVVaqqoAAAAAAAAVVVVqqqgAAAAAAAAFVVWqqqgAAAAAAAABVVaqqqAAAAAAAAAAFVqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) diff --git a/apps/testUserInput/test_userInput.app.js b/apps/testuserinput/app.js similarity index 100% rename from apps/testUserInput/test_userInput.app.js rename to apps/testuserinput/app.js diff --git a/apps/testUserInput/app.png b/apps/testuserinput/app.png similarity index 100% rename from apps/testUserInput/app.png rename to apps/testuserinput/app.png diff --git a/apps/testUserInput/testUserInput_ss0.png b/apps/testuserinput/testUserInput_ss0.png similarity index 100% rename from apps/testUserInput/testUserInput_ss0.png rename to apps/testuserinput/testUserInput_ss0.png diff --git a/apps/testUserInput/testUserInput_ss1.png b/apps/testuserinput/testUserInput_ss1.png similarity index 100% rename from apps/testUserInput/testUserInput_ss1.png rename to apps/testuserinput/testUserInput_ss1.png diff --git a/apps/testUserInput/testUserInput_ss2.png b/apps/testuserinput/testUserInput_ss2.png similarity index 100% rename from apps/testUserInput/testUserInput_ss2.png rename to apps/testuserinput/testUserInput_ss2.png diff --git a/apps/testUserInput/testUserInput_ss3.png b/apps/testuserinput/testUserInput_ss3.png similarity index 100% rename from apps/testUserInput/testUserInput_ss3.png rename to apps/testuserinput/testUserInput_ss3.png diff --git a/apps/testUserInput/test_userInput.img b/apps/testuserinput/test_userInput.img similarity index 100% rename from apps/testUserInput/test_userInput.img rename to apps/testuserinput/test_userInput.img From dfba0a3e2ea03aa8ef3fb21ff4f37c11ac6c4dcb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 9 Feb 2021 08:34:52 +0000 Subject: [PATCH 118/148] add readme --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 4fbc1a779..c2b6ca075 100644 --- a/apps.json +++ b/apps.json @@ -2758,6 +2758,7 @@ "name": "Test User Input", "shortName":"Test User Input", "icon": "app.png", + "readme": "README.md", "version":"0.02", "description": "Basic app to test the bangle.js input interface. It displays the result in text or a switch on/off image.", "tags": "input,interface,buttons,touch", From 68252a0c5ecca0ecd328050f341c1b5d54025670 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 12:52:44 +0000 Subject: [PATCH 119/148] added gpssetup app --- apps/gpssetup/ChangeLog | 1 + apps/gpssetup/README.md | 64 +++++++++ apps/gpssetup/app.js | 260 ++++++++++++++++++++++++++++++++++++ apps/gpssetup/settings.js | 4 + apps/gpssetup/settings.json | 1 + 5 files changed, 330 insertions(+) create mode 100644 apps/gpssetup/ChangeLog create mode 100644 apps/gpssetup/README.md create mode 100644 apps/gpssetup/app.js create mode 100644 apps/gpssetup/settings.js create mode 100644 apps/gpssetup/settings.json diff --git a/apps/gpssetup/ChangeLog b/apps/gpssetup/ChangeLog new file mode 100644 index 000000000..0099beb29 --- /dev/null +++ b/apps/gpssetup/ChangeLog @@ -0,0 +1 @@ +0.01: First version of GPS Setup app diff --git a/apps/gpssetup/README.md b/apps/gpssetup/README.md new file mode 100644 index 000000000..4992a16b5 --- /dev/null +++ b/apps/gpssetup/README.md @@ -0,0 +1,64 @@ +# GPS Setup + +An App to enable the GPS to be configured into low power mode. + +## Goals + +To develop app that sets the GPS up to run with the lowest possible +power consumption. + + +* An app that turns on the GPS and constantly displays the screen + will use around 75mA, the battery will last between 3-4 hours. + +* Using the GPS in a Widget in Super-E Power Saving Mode (PSM) with + the screen off most of the time, will consume around 35mA and you + might get 10hrs before a recharge. + +* Using the GPS in Power Saving Mode On/Off (PSMOO) with suitable + settings can reduce the average consumption to around 15mA. A + simple test using a 120s update period, 6s search period was still + running with 45% battery 20 hours after it started. + + +## Settings + +The Settings App enables you set the options below for the GPS. +Either start the App from the launcher or go to Settings, select +App/Widgets and then 'GPS Setup'. + +When you exit the setup App the settings will be stored in the +gpssetup.settings.json file; the GPS will be switched on and the +necessary commands sent to the GPS to configure it. The GPS is then +powered off. The GPS configuration is stored in the GPS non-volatile +memory so that next time the GPS is powered on they are used. These +settings will remain and impact every app that uses the GPS. + + +- Power Mode: + + - SuperE - the factory default setup for the GPS. The recommended + power saving mode. + + - PSMOO - On/Off power saving mode. Configured by interval and + search time. Choose this mode if you are happy to get a GPS + position update less often (say every 1 or 2 minutes). The longer + the interval the more time the GPS will spend sleeping in low + power mode (7mA) between obtaining fixes (35mA). For walking in + open country an update once every 60 seconds is adequate to put + you within a 6 digit grid refernce sqaure. + +- update - the time between two position fix attempts. + +- search - the time between two acquisition attempts if the receiver + is unable to get a position fix. + +## References + +* [UBLOX M8 Receiver Data Sheet](https://www.u-blox.com/sites/default/files/products/documents/u-blox8-M8_ReceiverDescrProtSpec_%28UBX-13003221%29.pdf) + +* [UBLOX Power Management App Note](https://www.u-blox.com/sites/default/files/products/documents/PowerManagement_AppNote_%28UBX-13005162%29.pdf) + +* Some useful code on Github and be found [here](https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control) +and [here](https://github.com/thasti/utrak/blob/master/gps.c) + diff --git a/apps/gpssetup/app.js b/apps/gpssetup/app.js new file mode 100644 index 000000000..18dc57ec5 --- /dev/null +++ b/apps/gpssetup/app.js @@ -0,0 +1,260 @@ +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +const SETTINGS_FILE = "gpssetup.settings.json"; +let settings = undefined; +let settings_changed = false; + +function updateSettings() { + require("Storage").write(SETTINGS_FILE, settings); + settings_changed = true; +} + +function loadSettings() { + log_debug("loadSettings()"); + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.update = settings.update||120; + settings.search = settings.search||5; + settings.power_mode = settings.power_mode||"SuperE"; + log_debug(settings); +} + +/*********** GPS Power and Setup Functions ******************/ + +function log_debug(o) { + //console.log(o); +} + +// quick hack +function wait(ms){ + var start = new Date().getTime(); + var end = start; + while(end < start + ms) { + end = new Date().getTime(); + } +} + +function setupGPS() { + Bangle.setGPSPower(1); + if (settings.power_mode === "PSMOO") { + setupPSMOO(); + } else { + setupSuperE(); + } + + log_debug("Powering GPS Off"); + Bangle.setGPSPower(0); +} + +function setupPSMOO() { + log_debug("setupGPS() PSMOO"); + UBX_CFG_RESET(); + wait(100); + + UBX_CFG_PM2(settings.update, settings.search); + wait(20); + + UBX_CFG_RXM(); + wait(20); + + UBX_CFG_SAVE(); + wait(20); +} + +function setupSuperE() { + log_debug("setupGPS() Super-E"); + UBX_CFG_RESET(); + wait(100); + + UBX_CFG_PMS(); + wait(20); + + UBX_CFG_SAVE(); + wait(20); +} + +function writeGPScmd(cmd) { + var d = [0xB5,0x62]; // sync chars + d = d.concat(cmd); + var a=0,b=0; + for (var i=2;i>8; + } while (i); + + return bytes; +} + + +/* + * Extended Power Management + * update and search are in milli seconds + * settings are loaded little endian, lsb first + * + * https://github.com/thasti/utrak/blob/master/gps.c + */ +function UBX_CFG_PM2(update,search) { + + var u = int_2_bytes(update*1000); + var s = int_2_bytes(search*1000); + + writeGPScmd([0x06, 0x3B, /* class id */ + 44, 0, /* length */ + 0x01, 0x00, 0x00, 0x00, /* v1, reserved 1..3 */ + 0x00, 0x10, 0x00, 0x00, /* on/off-mode, update ephemeris */ + u[3], u[2], u[1], u[0], /* update period, ms, 120s=00 01 D4 C0, 30s= 00 00 75 30 */ + s[3], s[2], s[1], s[0], /* search period, ms, 120s, 20s = 00 00 4E 20, 5s = 13 88 */ + 0x00, 0x00, 0x00, 0x00, /* grid offset */ + 0x00, 0x00, /* on-time after first fix */ + 0x01, 0x00, /* minimum acquisition time */ + 0x00, 0x00, 0x00, 0x00, /* reserved 4,5 */ + 0x00, 0x00, 0x00, 0x00, /* reserved 6 */ + 0x00, 0x00, 0x00, 0x00, /* reserved 7 */ + 0x00, 0x00, 0x00, 0x00, /* reserved 8,9,10 */ + 0x00, 0x00, 0x00, 0x00]); /* reserved 11 */ +} + +// enable power saving mode, after configured with PM2 +function UBX_CFG_RXM() { + writeGPScmd([0x06, 0x11, /* UBX-CFG-RXM */ + 2, 0, /* length */ + 0x08, 0x01]); /* reserved, enable power save mode */ +} + + +/* + * Save configuration otherwise it will reset when the GPS wakes up + * + */ +function UBX_CFG_SAVE() { + writeGPScmd([0x06, 0x09, // class id + 0x0D, 0x00, // length + 0x00, 0x00, 0x00, 0x00, // clear mask + 0xFF, 0xFF, 0x00, 0x00, // save mask + 0x00, 0x00, 0x00, 0x00, // load mask + 0x07]); // b2=eeprom b1=flash b0=bat backed ram +} + +/* + * Reset to factory settings using clear mask in UBX_CFG_CFG + * https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control + */ +function UBX_CFG_RESET() { + writeGPScmd([0x06, 0x09, // class id + 0x0D, 0x00, + 0xFF, 0xFB, 0x00, 0x00, // clear mask + 0x00, 0x00, 0x00, 0x00, // save mask + 0xFF, 0xFF, 0x00, 0x00, // load mask + 0x17]); +} + + +/*********** GPS Setup Menu App *****************************/ + +function showMainMenu() { + var power_options = ["SuperE","PSMOO"]; + + const mainmenu = { + '': { 'title': 'GPS Setup' }, + '< Back': ()=>{exitSetup();}, + 'Power Mode': { + value: 0 | power_options.indexOf(settings.power_mode), + min: 0, max: 1, + format: v => power_options[v], + onchange: v => { + settings.power_mode = power_options[v]; + updateSettings(); + }, + }, + + 'Update (s)': { + value: settings.update, + min: 10, + max: 1800, + step: 10, + onchange: v => { + settings.update =v; + updateSettings(); + } + }, + 'Search (s)': { + value: settings.search, + min: 1, + max: 65, + step: 1, + onchange: v => { + settings.search = v; + updateSettings(); + } + } + }; + + return E.showMenu(mainmenu); +} + +/* +function exitSetup() { + log_debug("exitSetup()"); + if (settings_changed) { + log_debug(settings); + E.showMessage("Configuring GPS"); + setupGPS(); + } + load(); +} +*/ + +function exitSetup() { + log_debug("exitSetup()"); + if (settings_changed) { + log_debug(settings); + E.showMessage("Configuring GPS"); + setTimeout(function() { + setupGPS(); + setTimeout(function() { load() }, 750); + }, 500); + } else { + load(); + }; +} + +/* +function exitSetup() { + log_debug("exitSetup()"); + if (settings_changed) { + log_debug(settings); + g.clear(); + g.setFontAlign(0,0); + g.setColor(3); + g.setFontVector(25); + g.drawString("Configuring GPS",120,120); + setTimeout(function() { + setupGPS(); + setTimeout(function() { load() }, 500); + }, 500); + } else load(); +} +*/ + +loadSettings(); +showMainMenu(); + diff --git a/apps/gpssetup/settings.js b/apps/gpssetup/settings.js new file mode 100644 index 000000000..0e3c621d1 --- /dev/null +++ b/apps/gpssetup/settings.js @@ -0,0 +1,4 @@ +(function(back) { + // just go right to our app + load("gpssetup.app.js"); +})(); diff --git a/apps/gpssetup/settings.json b/apps/gpssetup/settings.json new file mode 100644 index 000000000..631ececdc --- /dev/null +++ b/apps/gpssetup/settings.json @@ -0,0 +1 @@ +{"power_mode":"SuperE", "update":120, "search":6} From 4fed30f5a224d28ee0b0fef6194f86386fbbcbb8 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 13:06:19 +0000 Subject: [PATCH 120/148] added apps.json settings for gpssetup app --- apps/gpssetup/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/gpssetup/icon.js diff --git a/apps/gpssetup/icon.js b/apps/gpssetup/icon.js new file mode 100644 index 000000000..114e6600e --- /dev/null +++ b/apps/gpssetup/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/ACmsAAIss1mBwIfZqwABFpwuYC4IADGBYuaDQwuDF5ouYLo4vJIYousCYQOIHJIuUCo4uIHJIuUf4wlGEIQaHFywvHGAguiF5GBEIgbHFzAvJDwwuRvV6F6xLJFxmkAAQuKqwtKPQ4RKFwgwICgobHVRJAJFQOr0owIE5AtNDIYRI0ulGBAuNapYABCRGkGBAuGAoIpNGBIIFGBF6FwuBFygAKGBAulGBgujGBWAF0jpBehIvlqwws1jnCGFOs1heBGFQuBFoYwoFxFWwAwjFw+BAAIMBGEIuMGEIuIeQIQFGDouJ1gSHGDYuSGDYuUGDSzBFYP+dAQuNGBN6F6RcBFyAwHwAvQGAYuSGAheCF54wCAAYuRGAQABwGAC6QuWGAV6FyYA/AH4A2A=")); From 8449fc00d8f49e05025a7ecde4f8911563d5aac8 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 13:07:58 +0000 Subject: [PATCH 121/148] added apps.json settings for gpssetup app --- apps.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 4fbc1a779..166aa2dec 100644 --- a/apps.json +++ b/apps.json @@ -2765,6 +2765,19 @@ {"name":"testuserinput.app.js","url":"app.js"}, {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "gpssetup", + "name": "GPS Setup", + "shortName":"GPS configuration app", + "icon": "gpssetup.png", + "version":"0.02", + "description": "Configure the GPS power options and store them in the GPS nvram", + "tags": "gps, tools, outdoors", + "storage": [ + {"name":"gpssetup.settings.js","url":"settings.js"}, + {"name":"gpssetup.settings.json","url":"settings.json"}, + {"name":"gpssetup.app.js","url":"app.js"}, + {"name":"gpssetup.img","url":"icon.js","evaluate":true} + ] } - ] From a18cc34f82f1b7112ac68d08c657d6a02af60857 Mon Sep 17 00:00:00 2001 From: dapgo Date: Tue, 9 Feb 2021 17:34:40 +0100 Subject: [PATCH 122/148] Case Sensitive!!! delete Changelog keep ChangeLog --- apps/testuserinput/Changelog | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/testuserinput/Changelog diff --git a/apps/testuserinput/Changelog b/apps/testuserinput/Changelog deleted file mode 100644 index 84f50a78b..000000000 --- a/apps/testuserinput/Changelog +++ /dev/null @@ -1 +0,0 @@ -0.02: app to test the bangle.js Input interface \ No newline at end of file From 47ebba1f11ac75632aebcaccbd92e28a11eb9c44 Mon Sep 17 00:00:00 2001 From: dapgo Date: Tue, 9 Feb 2021 17:40:13 +0100 Subject: [PATCH 123/148] correct file name icon was failing before. now folder and .img have the same name --- apps/testuserinput/{test_userInput.img => testuserinput.img} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/testuserinput/{test_userInput.img => testuserinput.img} (100%) diff --git a/apps/testuserinput/test_userInput.img b/apps/testuserinput/testuserinput.img similarity index 100% rename from apps/testuserinput/test_userInput.img rename to apps/testuserinput/testuserinput.img From c0d5d096710cf0465e598f791ed2ff0f85940805 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 18:47:12 +0000 Subject: [PATCH 124/148] corrected apps.json and added gpssetup.png --- apps.json | 3 ++- apps/gpssetup/gpssetup.png | Bin 0 -> 2663 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 apps/gpssetup/gpssetup.png diff --git a/apps.json b/apps.json index 166aa2dec..b322198cd 100644 --- a/apps.json +++ b/apps.json @@ -2770,9 +2770,10 @@ "name": "GPS Setup", "shortName":"GPS configuration app", "icon": "gpssetup.png", - "version":"0.02", + "version":"0.01", "description": "Configure the GPS power options and store them in the GPS nvram", "tags": "gps, tools, outdoors", + "readme": "README.md", "storage": [ {"name":"gpssetup.settings.js","url":"settings.js"}, {"name":"gpssetup.settings.json","url":"settings.json"}, diff --git a/apps/gpssetup/gpssetup.png b/apps/gpssetup/gpssetup.png new file mode 100644 index 0000000000000000000000000000000000000000..ca5899983a41a383c3880d3fb62e1598d4c96e9f GIT binary patch literal 2663 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 Date: Tue, 9 Feb 2021 18:49:54 +0000 Subject: [PATCH 125/148] corrected apps.json description for gpssetup --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b322198cd..fd8818460 100644 --- a/apps.json +++ b/apps.json @@ -2768,7 +2768,7 @@ }, { "id": "gpssetup", "name": "GPS Setup", - "shortName":"GPS configuration app", + "shortName":"GPS Setup", "icon": "gpssetup.png", "version":"0.01", "description": "Configure the GPS power options and store them in the GPS nvram", From e6206733aec129fed5fe302f8ed2b930dccc9d31 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 21:19:43 +0000 Subject: [PATCH 126/148] updated gpssetup README file --- apps/gpssetup/README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/apps/gpssetup/README.md b/apps/gpssetup/README.md index 4992a16b5..7a47d049a 100644 --- a/apps/gpssetup/README.md +++ b/apps/gpssetup/README.md @@ -4,16 +4,17 @@ An App to enable the GPS to be configured into low power mode. ## Goals -To develop app that sets the GPS up to run with the lowest possible -power consumption. +To develop an app that configures the GPS to run with the lowest +possible power consumption. +Example power consumption of the GPS while powered on: * An app that turns on the GPS and constantly displays the screen will use around 75mA, the battery will last between 3-4 hours. -* Using the GPS in a Widget in Super-E Power Saving Mode (PSM) with - the screen off most of the time, will consume around 35mA and you - might get 10hrs before a recharge. +* Using the GPS with Super-E Power Saving Mode (PSM) with the screen + off most of the time, will consume around 35mA and you might get + 10hrs before a recharge. * Using the GPS in Power Saving Mode On/Off (PSMOO) with suitable settings can reduce the average consumption to around 15mA. A @@ -23,22 +24,23 @@ power consumption. ## Settings -The Settings App enables you set the options below for the GPS. -Either start the App from the launcher or go to Settings, select -App/Widgets and then 'GPS Setup'. +The Settings App enables you set the options below. Either start the +App from the launcher or go to Settings, select App/Widgets and then +'GPS Setup'. -When you exit the setup App the settings will be stored in the -gpssetup.settings.json file; the GPS will be switched on and the +When you exit the setup app, the settings will be stored in the +gpssetup.settings.json file, the GPS will be switched on and the necessary commands sent to the GPS to configure it. The GPS is then powered off. The GPS configuration is stored in the GPS non-volatile -memory so that next time the GPS is powered on they are used. These -settings will remain and impact every app that uses the GPS. +memory so that next time the GPS is powered, that configuration is +used. These settings will remain for all apps that use the GPS. - Power Mode: - SuperE - the factory default setup for the GPS. The recommended - power saving mode. + power saving mode. If you need frequent (every second) updates on + position, then this is the mode for you. - PSMOO - On/Off power saving mode. Configured by interval and search time. Choose this mode if you are happy to get a GPS From a264a7adc3e8733fa2764bedd0f71c860fd6fe14 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 23:14:19 +0000 Subject: [PATCH 127/148] working gpssetup app, with promise chain, debugging left on --- apps/gpssetup/app.js | 75 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/apps/gpssetup/app.js b/apps/gpssetup/app.js index 18dc57ec5..c8405eaa6 100644 --- a/apps/gpssetup/app.js +++ b/apps/gpssetup/app.js @@ -22,16 +22,8 @@ function loadSettings() { /*********** GPS Power and Setup Functions ******************/ function log_debug(o) { - //console.log(o); -} - -// quick hack -function wait(ms){ - var start = new Date().getTime(); - var end = start; - while(end < start + ms) { - end = new Date().getTime(); - } + let timestamp = new Date().getTime(); + console.log(timestamp + " : " + o); } function setupGPS() { @@ -41,9 +33,16 @@ function setupGPS() { } else { setupSuperE(); } - - log_debug("Powering GPS Off"); - Bangle.setGPSPower(0); +} + +/* +// quick hack +function wait(ms){ + var start = new Date().getTime(); + var end = start; + while(end < start + ms) { + end = new Date().getTime(); + } } function setupPSMOO() { @@ -72,6 +71,50 @@ function setupSuperE() { UBX_CFG_SAVE(); wait(20); } +*/ + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +function setupSuperE() { + log_debug("setupGPS() Super-E"); + Promise.resolve().then(function() { + UBX_CFG_RESET(); + return delay(100); + }).then(function() { + UBX_CFG_PMS(); + return delay(20); + }).then(function() { + UBX_CFG_SAVE(); + return delay(20); + }).then(function() { + log_debug("Powering GPS Off"); + Bangle.setGPSPower(0); + return delay(20); + }); +} + +function setupPSMOO() { + log_debug("setupGPS() PSMOO"); + Promise.resolve().then(function() { + UBX_CFG_RESET(); + return delay(100); + }).then(function() { + UBX_CFG_PM2(settings.update, settings.search); + return delay(20); + }).then(function() { + UBX_CFG_RXM(); + return delay(20); + }).then(function() { + UBX_CFG_SAVE(); + return delay(20); + }).then(function() { + log_debug("Powering GPS Off"); + Bangle.setGPSPower(0); + return delay(20); + }); +} function writeGPScmd(cmd) { var d = [0xB5,0x62]; // sync chars @@ -87,6 +130,7 @@ function writeGPScmd(cmd) { // UBX-CFG-PMS - enable power management - Super-E function UBX_CFG_PMS() { + log_debug("UBX_CFG_PMS()"); writeGPScmd([0x06,0x86, // msg class + type 8,0,//length 0x00,0x03, 0,0, 0,0, 0,0]); @@ -104,7 +148,6 @@ function int_2_bytes( x ){ return bytes; } - /* * Extended Power Management * update and search are in milli seconds @@ -113,6 +156,7 @@ function int_2_bytes( x ){ * https://github.com/thasti/utrak/blob/master/gps.c */ function UBX_CFG_PM2(update,search) { + log_debug("UBX_CFG_PM2()"); var u = int_2_bytes(update*1000); var s = int_2_bytes(search*1000); @@ -135,6 +179,7 @@ function UBX_CFG_PM2(update,search) { // enable power saving mode, after configured with PM2 function UBX_CFG_RXM() { + log_debug("UBX_CFG_RXM()"); writeGPScmd([0x06, 0x11, /* UBX-CFG-RXM */ 2, 0, /* length */ 0x08, 0x01]); /* reserved, enable power save mode */ @@ -146,6 +191,7 @@ function UBX_CFG_RXM() { * */ function UBX_CFG_SAVE() { + log_debug("UBX_CFG_SAVE()"); writeGPScmd([0x06, 0x09, // class id 0x0D, 0x00, // length 0x00, 0x00, 0x00, 0x00, // clear mask @@ -159,6 +205,7 @@ function UBX_CFG_SAVE() { * https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control */ function UBX_CFG_RESET() { + log_debug("UBX_CFG_RESET()"); writeGPScmd([0x06, 0x09, // class id 0x0D, 0x00, 0xFF, 0xFB, 0x00, 0x00, // clear mask From 119cf8183f26ef32588c9e7ee6362a43adb44ded Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 23:29:15 +0000 Subject: [PATCH 128/148] working gpssetup app, removed old code, turned off debugging --- apps/gpssetup/app.js | 98 +++++++++++++------------------------------- 1 file changed, 28 insertions(+), 70 deletions(-) diff --git a/apps/gpssetup/app.js b/apps/gpssetup/app.js index c8405eaa6..f4cade2d6 100644 --- a/apps/gpssetup/app.js +++ b/apps/gpssetup/app.js @@ -1,3 +1,17 @@ +/* + * GPS Setup app, hughbarney AT googlemail DOT com + * With thanks to Gordon Williams for support and advice + * + * UBLOX power modes: + * SuperE - will provide updates every second and consume 35mA, 75mA with LCD on + * PSMOO - will sleep for update time and consume around 7mA during that period + * after acquiring satelite fixes the GPS will settle into a cycle of + * obtaining fix, sleeping for update seconds, wake up, get fix and sleep. + * + * See README file for more details + * + */ + Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -22,8 +36,8 @@ function loadSettings() { /*********** GPS Power and Setup Functions ******************/ function log_debug(o) { - let timestamp = new Date().getTime(); - console.log(timestamp + " : " + o); + //let timestamp = new Date().getTime(); + //console.log(timestamp + " : " + o); } function setupGPS() { @@ -35,44 +49,6 @@ function setupGPS() { } } -/* -// quick hack -function wait(ms){ - var start = new Date().getTime(); - var end = start; - while(end < start + ms) { - end = new Date().getTime(); - } -} - -function setupPSMOO() { - log_debug("setupGPS() PSMOO"); - UBX_CFG_RESET(); - wait(100); - - UBX_CFG_PM2(settings.update, settings.search); - wait(20); - - UBX_CFG_RXM(); - wait(20); - - UBX_CFG_SAVE(); - wait(20); -} - -function setupSuperE() { - log_debug("setupGPS() Super-E"); - UBX_CFG_RESET(); - wait(100); - - UBX_CFG_PMS(); - wait(20); - - UBX_CFG_SAVE(); - wait(20); -} -*/ - function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -90,6 +66,12 @@ function setupSuperE() { return delay(20); }).then(function() { log_debug("Powering GPS Off"); + /* + * must be part of the promise chain to ensure that + * setup does not return and powerOff before config functions + * have run + * + */ Bangle.setGPSPower(0); return delay(20); }); @@ -111,6 +93,12 @@ function setupPSMOO() { return delay(20); }).then(function() { log_debug("Powering GPS Off"); + /* + * must be part of the promise chain to ensure that + * setup does not return and powerOff before config functions + * have run + * + */ Bangle.setGPSPower(0); return delay(20); }); @@ -258,18 +246,6 @@ function showMainMenu() { return E.showMenu(mainmenu); } -/* -function exitSetup() { - log_debug("exitSetup()"); - if (settings_changed) { - log_debug(settings); - E.showMessage("Configuring GPS"); - setupGPS(); - } - load(); -} -*/ - function exitSetup() { log_debug("exitSetup()"); if (settings_changed) { @@ -284,24 +260,6 @@ function exitSetup() { }; } -/* -function exitSetup() { - log_debug("exitSetup()"); - if (settings_changed) { - log_debug(settings); - g.clear(); - g.setFontAlign(0,0); - g.setColor(3); - g.setFontVector(25); - g.drawString("Configuring GPS",120,120); - setTimeout(function() { - setupGPS(); - setTimeout(function() { load() }, 500); - }, 500); - } else load(); -} -*/ - loadSettings(); showMainMenu(); From 0946a676b603e53e3da241966a17e95ddd8e006b Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 9 Feb 2021 23:41:39 +0000 Subject: [PATCH 129/148] corrected typo in gpssetup README --- apps/gpssetup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpssetup/README.md b/apps/gpssetup/README.md index 7a47d049a..a8f0ce5b7 100644 --- a/apps/gpssetup/README.md +++ b/apps/gpssetup/README.md @@ -61,6 +61,6 @@ used. These settings will remain for all apps that use the GPS. * [UBLOX Power Management App Note](https://www.u-blox.com/sites/default/files/products/documents/PowerManagement_AppNote_%28UBX-13005162%29.pdf) -* Some useful code on Github and be found [here](https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control) +* Some useful code on Github can be found [here](https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control) and [here](https://github.com/thasti/utrak/blob/master/gps.c) From f3373ca717bac30d0e46a8313a7074995ccee9ee Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 10 Feb 2021 08:24:49 +0000 Subject: [PATCH 130/148] remove un-needed image --- apps/testuserinput/testuserinput.img | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/testuserinput/testuserinput.img diff --git a/apps/testuserinput/testuserinput.img b/apps/testuserinput/testuserinput.img deleted file mode 100644 index 173f74796..000000000 --- a/apps/testuserinput/testuserinput.img +++ /dev/null @@ -1 +0,0 @@ -00]]]]]]]]]]]]]]WWWWWW׳WWW]׬׬]WVV׬ά׳VVVV׬ά׬VVVV׬ͬ׬VVVV׬ͬ׬VVVVͬVVVVͬVVVV]ͬ]VVVVVVVVV22V͢ǣǣ \ No newline at end of file From 28c7cfc3fac5309851d6b13ae60f3dc3b1529bf6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 10 Feb 2021 08:27:18 +0000 Subject: [PATCH 131/148] tweaks to pass CI test --- apps/gpssetup/app.js | 2 +- apps/gpssetup/icon.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gpssetup/app.js b/apps/gpssetup/app.js index f4cade2d6..6b69271a1 100644 --- a/apps/gpssetup/app.js +++ b/apps/gpssetup/app.js @@ -257,7 +257,7 @@ function exitSetup() { }, 500); } else { load(); - }; + } } loadSettings(); diff --git a/apps/gpssetup/icon.js b/apps/gpssetup/icon.js index 114e6600e..fbe544b8b 100644 --- a/apps/gpssetup/icon.js +++ b/apps/gpssetup/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/ACmsAAIss1mBwIfZqwABFpwuYC4IADGBYuaDQwuDF5ouYLo4vJIYousCYQOIHJIuUCo4uIHJIuUf4wlGEIQaHFywvHGAguiF5GBEIgbHFzAvJDwwuRvV6F6xLJFxmkAAQuKqwtKPQ4RKFwgwICgobHVRJAJFQOr0owIE5AtNDIYRI0ulGBAuNapYABCRGkGBAuGAoIpNGBIIFGBF6FwuBFygAKGBAulGBgujGBWAF0jpBehIvlqwws1jnCGFOs1heBGFQuBFoYwoFxFWwAwjFw+BAAIMBGEIuMGEIuIeQIQFGDouJ1gSHGDYuSGDYuUGDSzBFYP+dAQuNGBN6F6RcBFyAwHwAvQGAYuSGAheCF54wCAAYuRGAQABwGAC6QuWGAV6FyYA/AH4A2A=")); +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/ACmsAAIss1mBwIfZqwABFpwuYC4IADGBYuaDQwuDF5ouYLo4vJIYousCYQOIHJIuUCo4uIHJIuUf4wlGEIQaHFywvHGAguiF5GBEIgbHFzAvJDwwuRvV6F6xLJFxmkAAQuKqwtKPQ4RKFwgwICgobHVRJAJFQOr0owIE5AtNDIYRI0ulGBAuNapYABCRGkGBAuGAoIpNGBIIFGBF6FwuBFygAKGBAulGBgujGBWAF0jpBehIvlqwws1jnCGFOs1heBGFQuBFoYwoFxFWwAwjFw+BAAIMBGEIuMGEIuIeQIQFGDouJ1gSHGDYuSGDYuUGDSzBFYP+dAQuNGBN6F6RcBFyAwHwAvQGAYuSGAheCF54wCAAYuRGAQABwGAC6QuWGAV6FyYA/AH4A2A=")) From 0e2f33d656ed6687e54a80b3682ce4139b77a1df Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 11 Feb 2021 09:45:50 +0000 Subject: [PATCH 132/148] gbridge: 0.19: Support for call incoming/start/end --- apps.json | 6 +++--- apps/gbridge/ChangeLog | 1 + apps/gbridge/widget.js | 24 ++++++++++++++++++------ apps/notify/ChangeLog | 1 + apps/notify/notify.js | 8 +++++--- apps/notifyfs/ChangeLog | 1 + apps/notifyfs/notify.js | 8 +++++--- 7 files changed, 34 insertions(+), 15 deletions(-) diff --git a/apps.json b/apps.json index 40d3ea45c..de96afe4f 100644 --- a/apps.json +++ b/apps.json @@ -80,7 +80,7 @@ "name": "Notifications (default)", "shortName":"Notifications", "icon": "notify.png", - "version":"0.05", + "version":"0.06", "description": "A handler for displaying notifications that displays them in a bar at the top of the screen", "tags": "widget", "type": "notify", @@ -93,7 +93,7 @@ "name": "Fullscreen Notifications", "shortName":"Notifications", "icon": "notify.png", - "version":"0.06", + "version":"0.07", "description": "A handler for displaying notifications that displays them fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notifications library.", "tags": "widget", "type": "notify", @@ -139,7 +139,7 @@ { "id": "gbridge", "name": "Gadgetbridge", "icon": "app.png", - "version":"0.18", + "version":"0.19", "description": "The default notification handler for Gadgetbridge notifications from Android", "tags": "tool,system,android,widget", "readme": "README.md", diff --git a/apps/gbridge/ChangeLog b/apps/gbridge/ChangeLog index bec2d305a..da163e466 100644 --- a/apps/gbridge/ChangeLog +++ b/apps/gbridge/ChangeLog @@ -18,3 +18,4 @@ Nicer display of alarm clock notifications 0.17: Modified music notification for updated 'notify' library 0.18: Added reporting of step count and HRM (new Gadgetbridges can now log this) +0.19: Support for call incoming/start/end diff --git a/apps/gbridge/widget.js b/apps/gbridge/widget.js index d616e8816..d611e6686 100644 --- a/apps/gbridge/widget.js +++ b/apps/gbridge/widget.js @@ -15,7 +15,7 @@ var currentSteps = 0, lastSentSteps=0; var activityInterval; var hrmTimeout; - + function settings() { let settings = require('Storage').readJSON("gbridge.json", true) || {}; if (!("showIcon" in settings)) { @@ -129,11 +129,23 @@ } function handleCallEvent(event) { - if (event.cmd === "accept") { + var callIcon = require("heatshrink").decompress(atob("jEYwIMJj4CCwACJh4CCCIMOAQMGAQMHAQMDAQMBCIMB4PwgHz/EAn4CBj4CBg4CBgACCAAw=")); + if (event.cmd === "incoming") { require("notify").show({ size: 55, title: event.name, id: "call", - body: event.number, icon:require("heatshrink").decompress(atob("jEYwIMJj4CCwACJh4CCCIMOAQMGAQMHAQMDAQMBCIMB4PwgHz/EAn4CBj4CBg4CBgACCAAw="))}); + body: event.number, icon:callIcon}); Bangle.buzz(); + } else if (event.cmd === "start") { + require("notify").show({ + size: 55, title: event.name, id: "call", bgColor : "#008000", titleBgColor : "#00C000", + body: "In progress: "+event.number, icon:callIcon}); + } else if (event.cmd === "end") { + require("notify").show({ + size: 55, title: event.name, id: "call", bgColor : "#800000", titleBgColor : "#C00000", + body: "Ended: "+event.number, icon:callIcon}); + setTimeout(function() { + require("notify").hide({ id: "call" }); + }, 2000); } } @@ -148,7 +160,7 @@ setTimeout(_=>Bangle.beep(), 1000); },2000); } - + function handleActivityEvent(event) { var s = settings(); // handle setting activity interval @@ -251,7 +263,7 @@ function sendBattery() { gbSend({ t: "status", bat: E.getBattery() }); } - + // Send a summary of activity to Gadgetbridge function sendActivity(hrm) { var steps = currentSteps - lastSentSteps; @@ -279,7 +291,7 @@ } }); handleActivityEvent({}); // kicks off activity reporting - + // Finally add widget WIDGETS["gbridgew"] = {area: "tl", width: 24, draw: draw, reload: reload}; reload(); diff --git a/apps/notify/ChangeLog b/apps/notify/ChangeLog index a1e8e4418..c823f9033 100644 --- a/apps/notify/ChangeLog +++ b/apps/notify/ChangeLog @@ -2,3 +2,4 @@ 0.02: Add notification ID option 0.03: Pass `area{x,y,w,h}` to render callback instead of just `y` 0.05: Adjust position of notification src text +0.06: Support background color diff --git a/apps/notify/notify.js b/apps/notify/notify.js index 6f5261de1..b18826d24 100644 --- a/apps/notify/notify.js +++ b/apps/notify/notify.js @@ -41,7 +41,9 @@ function fitWords(text,rows,width) { src : string // optional source name body : string // optional body text icon : string // optional icon (image string) - render function(y) // function callback to render + render : function(y) // function callback to render + bgColor : int/string // optional background color (default black) + titleBgColor : int/string // optional background color for title (default black) } */ /* @@ -83,13 +85,13 @@ exports.show = function(options) { b = y+h-1, r = x+w-1; // bottom,right g.setClipRect(x,y, r,b); // clear area - g.setColor(0).fillRect(x,y, r,b); + g.setColor(options.bgColor||0).fillRect(x,y, r,b); // bottom border g.setColor(0x39C7).fillRect(0,b-1, r,b); b -= 2;h -= 2; // title bar if (options.title || options.src) { - g.setColor(0x39C7).fillRect(x,y, r,y+20); + g.setColor(options.titleBgColor||0x39C7).fillRect(x,y, r,y+20); const title = options.title||options.src; g.setColor(-1).setFontAlign(-1, -1, 0).setFont("6x8", 2); g.drawString(title.trim().substring(0, 13), x+25,y+3); diff --git a/apps/notifyfs/ChangeLog b/apps/notifyfs/ChangeLog index 16bc0ebb3..d4ea69cc8 100644 --- a/apps/notifyfs/ChangeLog +++ b/apps/notifyfs/ChangeLog @@ -4,3 +4,4 @@ 0.04: Pass `area{x,y,w,h}` to render callback instead of just `y` 0.05: Fix `g` corruption issue if .hide gets called twice 0.06: Adjust position of notification src text and notifications without title +0.07: Support background color diff --git a/apps/notifyfs/notify.js b/apps/notifyfs/notify.js index 2c622f624..0b73ad2d2 100644 --- a/apps/notifyfs/notify.js +++ b/apps/notifyfs/notify.js @@ -37,7 +37,9 @@ function fitWords(text,rows,width) { src : string // optional source name body : string // optional body text icon : string // optional icon (image string) - render function(y) // function callback to render + render : function(y) // function callback to render + bgColor : int/string // optional background color (default black) + titleBgColor : int/string // optional background color for title (default black) } */ exports.show = function(options) { @@ -53,11 +55,11 @@ exports.show = function(options) { w = 240, h = size; // clear screen - g.clear(1); + g.setColor(options.bgColor||0).fillRect(0,0,g.getWidth(),g.getHeight()); // top bar if (options.title||options.src) { const title = options.title || options.src - g.setColor(0x39C7).fillRect(x, y, x+w-1, y+30); + g.setColor(options.titleBgColor||0x39C7).fillRect(x, y, x+w-1, y+30); g.setColor(-1).setFontAlign(-1, -1, 0).setFont("6x8", 3); g.drawString(title.trim().substring(0, 13), x+5, y+3); if (options.title && options.src) { From b5c7ded4b590e0b9ed37cca6834a3d632eb24f67 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 11 Feb 2021 09:57:34 +0000 Subject: [PATCH 133/148] gbridge 0.20: Reduce memory usage --- apps.json | 2 +- apps/gbridge/ChangeLog | 1 + apps/gbridge/widget.js | 96 +++++++++++++++++------------------------- 3 files changed, 40 insertions(+), 59 deletions(-) diff --git a/apps.json b/apps.json index de96afe4f..5d095ef39 100644 --- a/apps.json +++ b/apps.json @@ -139,7 +139,7 @@ { "id": "gbridge", "name": "Gadgetbridge", "icon": "app.png", - "version":"0.19", + "version":"0.20", "description": "The default notification handler for Gadgetbridge notifications from Android", "tags": "tool,system,android,widget", "readme": "README.md", diff --git a/apps/gbridge/ChangeLog b/apps/gbridge/ChangeLog index da163e466..579d3580e 100644 --- a/apps/gbridge/ChangeLog +++ b/apps/gbridge/ChangeLog @@ -19,3 +19,4 @@ 0.17: Modified music notification for updated 'notify' library 0.18: Added reporting of step count and HRM (new Gadgetbridges can now log this) 0.19: Support for call incoming/start/end +0.20: Reduce memory usage diff --git a/apps/gbridge/widget.js b/apps/gbridge/widget.js index d611e6686..efc620e36 100644 --- a/apps/gbridge/widget.js +++ b/apps/gbridge/widget.js @@ -2,13 +2,11 @@ // Music handling const state = { music: "stop", - musicInfo: { artist: "", album: "", track: "" }, - scrollPos: 0 }; // activity reporting @@ -43,14 +41,6 @@ return event; } } - function handleNotificationEvent(event) { - if (event.t === "notify") { - require("notify").show(prettifyNotificationEvent(event)); - Bangle.buzz(); - } else { // notify- - require("notify").hide(event); - } - } function updateMusic(options){ if (state.music === "play") { @@ -117,49 +107,6 @@ require("notify").hide("music"); } } - function handleMusicStateUpdate(event) { - if (state.music !== event.state) { - state.music = event.state - updateMusic({on: true}); - } - } - function handleMusicInfoUpdate(event) { - state.musicInfo = event; - updateMusic({on: false}); - } - - function handleCallEvent(event) { - var callIcon = require("heatshrink").decompress(atob("jEYwIMJj4CCwACJh4CCCIMOAQMGAQMHAQMDAQMBCIMB4PwgHz/EAn4CBj4CBg4CBgACCAAw=")); - if (event.cmd === "incoming") { - require("notify").show({ - size: 55, title: event.name, id: "call", - body: event.number, icon:callIcon}); - Bangle.buzz(); - } else if (event.cmd === "start") { - require("notify").show({ - size: 55, title: event.name, id: "call", bgColor : "#008000", titleBgColor : "#00C000", - body: "In progress: "+event.number, icon:callIcon}); - } else if (event.cmd === "end") { - require("notify").show({ - size: 55, title: event.name, id: "call", bgColor : "#800000", titleBgColor : "#C00000", - body: "Ended: "+event.number, icon:callIcon}); - setTimeout(function() { - require("notify").hide({ id: "call" }); - }, 2000); - } - } - - function handleFindEvent(event) { - if (state.find) { - clearInterval(state.find); - delete state.find; - } - if (event.n) - state.find = setInterval(_=>{ - Bangle.buzz(); - setTimeout(_=>Bangle.beep(), 1000); - },2000); - } function handleActivityEvent(event) { var s = settings(); @@ -205,19 +152,52 @@ switch (event.t) { case "notify": case "notify-": - handleNotificationEvent(event); + if (event.t === "notify") { + require("notify").show(prettifyNotificationEvent(event)); + Bangle.buzz(); + } else { // notify- + require("notify").hide(event); + } break; case "musicinfo": - handleMusicInfoUpdate(event); + state.musicInfo = event; + updateMusic({on: false}); break; case "musicstate": - handleMusicStateUpdate(event); + if (state.music !== event.state) { + state.music = event.state + updateMusic({on: true}); + } break; case "call": - handleCallEvent(event); + var note = { size: 55, title: event.name, id: "call", + body: event.number, icon:require("heatshrink").decompress(atob("jEYwIMJj4CCwACJh4CCCIMOAQMGAQMHAQMDAQMBCIMB4PwgHz/EAn4CBj4CBg4CBgACCAAw="))} + if (event.cmd === "incoming") { + require("notify").show(note); + Bangle.buzz(); + } else if (event.cmd === "start") { + require("notify").show(Object.assign(note, { + bgColor : "#008000", titleBgColor : "#00C000", + body: "In progress: "+event.number})); + } else if (event.cmd === "end") { + require("notify").show(Object.assign(note, { + bgColor : "#800000", titleBgColor : "#C00000", + body: "Ended: "+event.number})); + setTimeout(function() { + require("notify").hide({ id: "call" }); + }, 2000); + } break; case "find": - handleFindEvent(event); + if (state.find) { + clearInterval(state.find); + delete state.find; + } + if (event.n) + state.find = setInterval(_=>{ + Bangle.buzz(); + setTimeout(_=>Bangle.beep(), 1000); + },2000); break; case "act": handleActivityEvent(event); From b7940598845d38e856308221bbcecca5fd33d12f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 11 Feb 2021 11:24:44 +0000 Subject: [PATCH 134/148] 0.02: Created gppsetup module --- apps.json | 3 +- apps/gpssetup/ChangeLog | 1 + apps/gpssetup/README.md | 42 +++++++-- apps/gpssetup/app.js | 190 ++++---------------------------------- apps/gpssetup/gpssetup.js | 179 +++++++++++++++++++++++++++++++++++ 5 files changed, 235 insertions(+), 180 deletions(-) create mode 100644 apps/gpssetup/gpssetup.js diff --git a/apps.json b/apps.json index 5d095ef39..89428e841 100644 --- a/apps.json +++ b/apps.json @@ -2771,11 +2771,12 @@ "name": "GPS Setup", "shortName":"GPS Setup", "icon": "gpssetup.png", - "version":"0.01", + "version":"0.02", "description": "Configure the GPS power options and store them in the GPS nvram", "tags": "gps, tools, outdoors", "readme": "README.md", "storage": [ + {"name":"gpssetup","url":"gpssetup.js"}, {"name":"gpssetup.settings.js","url":"settings.js"}, {"name":"gpssetup.settings.json","url":"settings.json"}, {"name":"gpssetup.app.js","url":"app.js"}, diff --git a/apps/gpssetup/ChangeLog b/apps/gpssetup/ChangeLog index 0099beb29..e57d53d8e 100644 --- a/apps/gpssetup/ChangeLog +++ b/apps/gpssetup/ChangeLog @@ -1 +1,2 @@ 0.01: First version of GPS Setup app +0.02: Created gppsetup module diff --git a/apps/gpssetup/README.md b/apps/gpssetup/README.md index a8f0ce5b7..4d3922f50 100644 --- a/apps/gpssetup/README.md +++ b/apps/gpssetup/README.md @@ -1,6 +1,6 @@ # GPS Setup -An App to enable the GPS to be configured into low power mode. +An App and module to enable the GPS to be configured into low power mode. ## Goals @@ -15,14 +15,14 @@ Example power consumption of the GPS while powered on: * Using the GPS with Super-E Power Saving Mode (PSM) with the screen off most of the time, will consume around 35mA and you might get 10hrs before a recharge. - + * Using the GPS in Power Saving Mode On/Off (PSMOO) with suitable settings can reduce the average consumption to around 15mA. A simple test using a 120s update period, 6s search period was still running with 45% battery 20 hours after it started. -## Settings +## Settings App The Settings App enables you set the options below. Either start the App from the launcher or go to Settings, select App/Widgets and then @@ -38,11 +38,11 @@ used. These settings will remain for all apps that use the GPS. - Power Mode: - - SuperE - the factory default setup for the GPS. The recommended + - **SuperE** - the factory default setup for the GPS. The recommended power saving mode. If you need frequent (every second) updates on position, then this is the mode for you. - - PSMOO - On/Off power saving mode. Configured by interval and + - **PSMOO** - On/Off power saving mode. Configured by interval and search time. Choose this mode if you are happy to get a GPS position update less often (say every 1 or 2 minutes). The longer the interval the more time the GPS will spend sleeping in low @@ -55,6 +55,37 @@ used. These settings will remain for all apps that use the GPS. - search - the time between two acquisition attempts if the receiver is unable to get a position fix. +## Module + +A module is provided that'll allow you to set GPS configuration from your own +app. To use it: + +``` +// This will set up the GPS to current saved defaults. It's not normally +// needed unless the watch's battery has run down +require("gpssetup").setPowerMode(); + +// This sets up the PSMOO mode. update/search are optional in seconds +require("gpssetup").setPowerMode({ + power_mode:"PSMOO", + update:optional (default 120), + search:optional (default 5)}) + +// This sets up SuperE +require("gpssetup").setPowerMode({power_mode:"SuperE"}) +``` + +`setPowerMode` returns a promise, which is completed when the GPS is set up. + +So you can for instance do the following to turn the GPS off once it +has been configured: + +``` +require("gpssetup").setPowerMode().then(function() { + Bangle.setGPSPower(0); +}); +``` + ## References * [UBLOX M8 Receiver Data Sheet](https://www.u-blox.com/sites/default/files/products/documents/u-blox8-M8_ReceiverDescrProtSpec_%28UBX-13003221%29.pdf) @@ -63,4 +94,3 @@ used. These settings will remain for all apps that use the GPS. * Some useful code on Github can be found [here](https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control) and [here](https://github.com/thasti/utrak/blob/master/gps.c) - diff --git a/apps/gpssetup/app.js b/apps/gpssetup/app.js index 6b69271a1..e0d188af5 100644 --- a/apps/gpssetup/app.js +++ b/apps/gpssetup/app.js @@ -5,16 +5,21 @@ * UBLOX power modes: * SuperE - will provide updates every second and consume 35mA, 75mA with LCD on * PSMOO - will sleep for update time and consume around 7mA during that period - * after acquiring satelite fixes the GPS will settle into a cycle of + * after acquiring satelite fixes the GPS will settle into a cycle of * obtaining fix, sleeping for update seconds, wake up, get fix and sleep. * * See README file for more details - * + * */ Bangle.loadWidgets(); Bangle.drawWidgets(); +function log_debug(o) { + //let timestamp = new Date().getTime(); + //console.log(timestamp + " : " + o); +} + const SETTINGS_FILE = "gpssetup.settings.json"; let settings = undefined; let settings_changed = false; @@ -35,174 +40,15 @@ function loadSettings() { /*********** GPS Power and Setup Functions ******************/ -function log_debug(o) { - //let timestamp = new Date().getTime(); - //console.log(timestamp + " : " + o); -} - function setupGPS() { Bangle.setGPSPower(1); - if (settings.power_mode === "PSMOO") { - setupPSMOO(); - } else { - setupSuperE(); - } + setTimeout(function() { + require("gpssetup").setPowerMode().then(function() { + Bangle.setGPSPower(0); + }); + }, 100); } -function delay(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -function setupSuperE() { - log_debug("setupGPS() Super-E"); - Promise.resolve().then(function() { - UBX_CFG_RESET(); - return delay(100); - }).then(function() { - UBX_CFG_PMS(); - return delay(20); - }).then(function() { - UBX_CFG_SAVE(); - return delay(20); - }).then(function() { - log_debug("Powering GPS Off"); - /* - * must be part of the promise chain to ensure that - * setup does not return and powerOff before config functions - * have run - * - */ - Bangle.setGPSPower(0); - return delay(20); - }); -} - -function setupPSMOO() { - log_debug("setupGPS() PSMOO"); - Promise.resolve().then(function() { - UBX_CFG_RESET(); - return delay(100); - }).then(function() { - UBX_CFG_PM2(settings.update, settings.search); - return delay(20); - }).then(function() { - UBX_CFG_RXM(); - return delay(20); - }).then(function() { - UBX_CFG_SAVE(); - return delay(20); - }).then(function() { - log_debug("Powering GPS Off"); - /* - * must be part of the promise chain to ensure that - * setup does not return and powerOff before config functions - * have run - * - */ - Bangle.setGPSPower(0); - return delay(20); - }); -} - -function writeGPScmd(cmd) { - var d = [0xB5,0x62]; // sync chars - d = d.concat(cmd); - var a=0,b=0; - for (var i=2;i>8; - } while (i); - - return bytes; -} - -/* - * Extended Power Management - * update and search are in milli seconds - * settings are loaded little endian, lsb first - * - * https://github.com/thasti/utrak/blob/master/gps.c - */ -function UBX_CFG_PM2(update,search) { - log_debug("UBX_CFG_PM2()"); - - var u = int_2_bytes(update*1000); - var s = int_2_bytes(search*1000); - - writeGPScmd([0x06, 0x3B, /* class id */ - 44, 0, /* length */ - 0x01, 0x00, 0x00, 0x00, /* v1, reserved 1..3 */ - 0x00, 0x10, 0x00, 0x00, /* on/off-mode, update ephemeris */ - u[3], u[2], u[1], u[0], /* update period, ms, 120s=00 01 D4 C0, 30s= 00 00 75 30 */ - s[3], s[2], s[1], s[0], /* search period, ms, 120s, 20s = 00 00 4E 20, 5s = 13 88 */ - 0x00, 0x00, 0x00, 0x00, /* grid offset */ - 0x00, 0x00, /* on-time after first fix */ - 0x01, 0x00, /* minimum acquisition time */ - 0x00, 0x00, 0x00, 0x00, /* reserved 4,5 */ - 0x00, 0x00, 0x00, 0x00, /* reserved 6 */ - 0x00, 0x00, 0x00, 0x00, /* reserved 7 */ - 0x00, 0x00, 0x00, 0x00, /* reserved 8,9,10 */ - 0x00, 0x00, 0x00, 0x00]); /* reserved 11 */ -} - -// enable power saving mode, after configured with PM2 -function UBX_CFG_RXM() { - log_debug("UBX_CFG_RXM()"); - writeGPScmd([0x06, 0x11, /* UBX-CFG-RXM */ - 2, 0, /* length */ - 0x08, 0x01]); /* reserved, enable power save mode */ -} - - -/* - * Save configuration otherwise it will reset when the GPS wakes up - * - */ -function UBX_CFG_SAVE() { - log_debug("UBX_CFG_SAVE()"); - writeGPScmd([0x06, 0x09, // class id - 0x0D, 0x00, // length - 0x00, 0x00, 0x00, 0x00, // clear mask - 0xFF, 0xFF, 0x00, 0x00, // save mask - 0x00, 0x00, 0x00, 0x00, // load mask - 0x07]); // b2=eeprom b1=flash b0=bat backed ram -} - -/* - * Reset to factory settings using clear mask in UBX_CFG_CFG - * https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control - */ -function UBX_CFG_RESET() { - log_debug("UBX_CFG_RESET()"); - writeGPScmd([0x06, 0x09, // class id - 0x0D, 0x00, - 0xFF, 0xFB, 0x00, 0x00, // clear mask - 0x00, 0x00, 0x00, 0x00, // save mask - 0xFF, 0xFF, 0x00, 0x00, // load mask - 0x17]); -} - - /*********** GPS Setup Menu App *****************************/ function showMainMenu() { @@ -217,18 +63,17 @@ function showMainMenu() { format: v => power_options[v], onchange: v => { settings.power_mode = power_options[v]; - updateSettings(); + updateSettings(); }, }, - 'Update (s)': { value: settings.update, min: 10, max: 1800, step: 10, onchange: v => { - settings.update =v; - updateSettings(); + settings.update = v; + updateSettings(); } }, 'Search (s)': { @@ -237,8 +82,8 @@ function showMainMenu() { max: 65, step: 1, onchange: v => { - settings.search = v; - updateSettings(); + settings.search = v; + updateSettings(); } } }; @@ -262,4 +107,3 @@ function exitSetup() { loadSettings(); showMainMenu(); - diff --git a/apps/gpssetup/gpssetup.js b/apps/gpssetup/gpssetup.js new file mode 100644 index 000000000..f8fed68ff --- /dev/null +++ b/apps/gpssetup/gpssetup.js @@ -0,0 +1,179 @@ +const SETTINGS_FILE = "gpssetup.settings.json"; + +function log_debug(o) { + //let timestamp = new Date().getTime(); + //console.log(timestamp + " : " + o); +} + +function writeGPScmd(cmd) { + var d = [0xB5,0x62]; // sync chars + d = d.concat(cmd); + var a=0,b=0; + for (var i=2;i>8; + } while (i); + return bytes; + } + + var u = int_2_bytes(update*1000); + var s = int_2_bytes(search*1000); + + writeGPScmd([0x06, 0x3B, /* class id */ + 44, 0, /* length */ + 0x01, 0x00, 0x00, 0x00, /* v1, reserved 1..3 */ + 0x00, 0x10, 0x00, 0x00, /* on/off-mode, update ephemeris */ + u[3], u[2], u[1], u[0], /* update period, ms, 120s=00 01 D4 C0, 30s= 00 00 75 30 */ + s[3], s[2], s[1], s[0], /* search period, ms, 120s, 20s = 00 00 4E 20, 5s = 13 88 */ + 0x00, 0x00, 0x00, 0x00, /* grid offset */ + 0x00, 0x00, /* on-time after first fix */ + 0x01, 0x00, /* minimum acquisition time */ + 0x00, 0x00, 0x00, 0x00, /* reserved 4,5 */ + 0x00, 0x00, 0x00, 0x00, /* reserved 6 */ + 0x00, 0x00, 0x00, 0x00, /* reserved 7 */ + 0x00, 0x00, 0x00, 0x00, /* reserved 8,9,10 */ + 0x00, 0x00, 0x00, 0x00]); /* reserved 11 */ +} + +// enable power saving mode, after configured with PM2 +function UBX_CFG_RXM() { + log_debug("UBX_CFG_RXM()"); + writeGPScmd([0x06, 0x11, /* UBX-CFG-RXM */ + 2, 0, /* length */ + 0x08, 0x01]); /* reserved, enable power save mode */ +} + +/* + * Save configuration otherwise it will reset when the GPS wakes up + */ +function UBX_CFG_SAVE() { + log_debug("UBX_CFG_SAVE()"); + writeGPScmd([0x06, 0x09, // class id + 0x0D, 0x00, // length + 0x00, 0x00, 0x00, 0x00, // clear mask + 0xFF, 0xFF, 0x00, 0x00, // save mask + 0x00, 0x00, 0x00, 0x00, // load mask + 0x07]); // b2=eeprom b1=flash b0=bat backed ram +} + +/* + * Reset to factory settings using clear mask in UBX_CFG_CFG + * https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control + */ +function UBX_CFG_RESET() { + log_debug("UBX_CFG_RESET()"); + writeGPScmd([0x06, 0x09, // class id + 0x0D, 0x00, + 0xFF, 0xFB, 0x00, 0x00, // clear mask + 0x00, 0x00, 0x00, 0x00, // save mask + 0xFF, 0xFF, 0x00, 0x00, // load mask + 0x17]); +} + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +function setupSuperE() { + log_debug("setupGPS() Super-E"); + return Promise.resolve().then(function() { + UBX_CFG_RESET(); + return delay(100); + }).then(function() { + UBX_CFG_PMS(); + return delay(20); + }).then(function() { + UBX_CFG_SAVE(); + return delay(20); + }).then(function() { + log_debug("Powering GPS Off"); + /* + * must be part of the promise chain to ensure that + * setup does not return and powerOff before config functions + * have run + */ + return delay(20); + }); +} + +function setupPSMOO(settings) { + log_debug("setupGPS() PSMOO"); + return Promise.resolve().then(function() { + UBX_CFG_RESET(); + return delay(100); + }).then(function() { + UBX_CFG_PM2(settings.update, settings.search); + return delay(20); + }).then(function() { + UBX_CFG_RXM(); + return delay(20); + }).then(function() { + UBX_CFG_SAVE(); + return delay(20); + }).then(function() { + log_debug("Powering GPS Off"); + /* + * must be part of the promise chain to ensure that + * setup does not return and powerOff before config functions + * have run + */ + return delay(20); + }); +} + +/** Set GPS power mode (assumes GPS on), returns a promise. +Either: + +require("gpssetup").setPowerMode() // <-- set up GPS to current saved defaults +require("gpssetup").setPowerMode({power_mode:"PSMOO", update:optional, search:optional}) // <-- PSMOO mode +require("gpssetup").setPowerMode({power_mode:"SuperE"}) // <-- Super E mode + +See the README for more information + */ +exports.setPowerMode = function(options) { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + if (options) { + if (options.update) settings.update = options.update; + if (options.search) settings.search = options.search; + if (options.power_mode) settings.power_mode = options.power_mode; + } + settings.update = settings.update||120; + settings.search = settings.search||5; + settings.power_mode = settings.power_mode||"SuperE"; + if (options) require("Storage").write(SETTINGS_FILE, settings); + if (settings.power_mode === "PSMOO") { + return setupPSMOO(settings); + } else { + return setupSuperE(); + } +}; From 4a452f86b7f22e72d5eb08b1ce251e3f33a8a06b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 11 Feb 2021 11:29:01 +0000 Subject: [PATCH 135/148] docs --- apps/gpssetup/README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/gpssetup/README.md b/apps/gpssetup/README.md index 4d3922f50..8e64c6a30 100644 --- a/apps/gpssetup/README.md +++ b/apps/gpssetup/README.md @@ -84,7 +84,20 @@ has been configured: require("gpssetup").setPowerMode().then(function() { Bangle.setGPSPower(0); }); -``` +``` + +**Note:** It's not guaranteed that the user will have installed the `gpssetup` +app/module. It might be worth checking for its existence by surrounding the +`require` call with `try...catch` block. + +``` +var gpssetup; +try { + gpssetup = require("gpssetup") +} catch(e) { + E.showMessage("gpssetup\nnot installed"); +} +``` ## References From c5c3910bf5ebd13f106e7bb5f79a52956ee14b89 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 11 Feb 2021 20:20:57 +0000 Subject: [PATCH 136/148] added walkers clock --- apps/walkersclock/README.md | 63 ++++ apps/walkersclock/app.js | 522 +++++++++++++++++++++++++++ apps/walkersclock/gps_alt.jpg | Bin 0 -> 48399 bytes apps/walkersclock/gps_osref.jpg | Bin 0 -> 44994 bytes apps/walkersclock/gps_speed.jpg | Bin 0 -> 44988 bytes apps/walkersclock/icon.js | 1 + apps/walkersclock/walkersclock48.png | Bin 0 -> 1861 bytes 7 files changed, 586 insertions(+) create mode 100644 apps/walkersclock/README.md create mode 100644 apps/walkersclock/app.js create mode 100644 apps/walkersclock/gps_alt.jpg create mode 100644 apps/walkersclock/gps_osref.jpg create mode 100644 apps/walkersclock/gps_speed.jpg create mode 100644 apps/walkersclock/icon.js create mode 100644 apps/walkersclock/walkersclock48.png diff --git a/apps/walkersclock/README.md b/apps/walkersclock/README.md new file mode 100644 index 000000000..0c10f79eb --- /dev/null +++ b/apps/walkersclock/README.md @@ -0,0 +1,63 @@ +# Walkers Clock + +A larg font watch, displays steps, can switch GPS on/off, displays grid reference + +The watch works well with GPSsetup, the Activepedom or Widpedom +wdigets. A tiny GPS power widget is waiting in the wings for when +the v2.09 firware is released. + +## Features + +- Displays the time in large font +- Uses BTN1 to select modeline display (eg battery status or switch between setting when in a function mode +- Uses BTN3 to select the function mode (eg turn on/off GPS, or change GPS display) + - two function menus at present + GPS Power = On/Off + GPS Display = Grid | Speed Alt + when the modeline in CYAN use button BTN1 to switch between options +- Display the current steps if one of the steps widgets is installed +- Ensures that BTN2 requires a 1.5 second press in order to switch to the launcher + this is so you dont accidently switch out of the GPS/watch display with you coat sleeve +- Displays the timestamp of the last GPS fix when the GPS is on +- Buzzes when the GPS aquires a positional satellite fix +- Displays the current OS map grid reference in a large font +- Displays the age of the current GPS position fix in seconds +- Works in tandem with the GPS setup app so that you can reduce the power consumption of the GPS + +## BTN1 cycles the information line + +- By default the modeline is switched off +- Click BTN1 once and display your steps (if one of the step widgets is installed) +- Click BTN1 again and it will show battery % charge +- Click BTN1 again and it will switch the modeline off + +## BTN2 Long press to start the launcher + +BTN2 is confiured to respond to a 1.5 second press in order to switch +to the launcher App. Simply press and hold until you hear a buzz and +release. This avoids accidently switching out of the watch app when +clothing catches it. + +## BTN3 cycles the function mode + +- Click BTN3 once and the GPS ON / OFF menu is displayed +- If the GPS is OFF then pressing BTN1 will turn it ON +- If the GPS is ON then Clicking BTN1 will turn it OFF + +When the GPS is ON a second function menu can be displayed by +pressing BTN3 again. This will show options to change the GPS display +on the second line of the watch. + +- Grid - will display the GPS position converted to an OS Grid Ref +- Speed - will display the GPS speed inforation supplied in the last GPS fix +- Alt - will display the altitude information + +![](gps_osref.jpg) +![](gps_speed.jpg) +![](gps_alt.jpg) + +## Future Enhancements +* Ability to turn on the Heart Rate monitor +* Maybe a simple stopwatch capability +* Fix the screen flicker + diff --git a/apps/walkersclock/app.js b/apps/walkersclock/app.js new file mode 100644 index 000000000..df009534a --- /dev/null +++ b/apps/walkersclock/app.js @@ -0,0 +1,522 @@ +/* + * Walkers clock, hugh barney AT googlemail DOT com + * + * A clock that has the following features + * - displays the time in large font + * - uses BTN1 to select modeline display (eg battery status or switch between setting when in a function mode + * - uses BTN3 to select the function mode (eg turn on/off GPS, or change GPS display) + * - two function menus at present + * GPS Power = On/Off + * GPS Display = Grid | Speed Alt + * when the modeline in CYAN use button BTN1 to switch between options + * - display the current steps if one of the steps widgets is installed + * - ensures that BTN2 requires a 1.5 second press in order to switch to the launcher + * this is so you dont accidently switch out of the GPS/watch display with you coat sleeve + * - displays the timestamp of the last GPS fix when the GPS is on + * - buzzes when the GPS aquires a positional satellite fix + * - displays the current OS map grid reference in a large font + * - displays the age of the current GPS position fix in seconds + * - works in tandem with the GPS setup app so that you can reduce the power consumption of the GPS + * + */ + +const INFO_NONE = "none"; +const INFO_BATT = "batt"; +const INFO_STEPS = "step"; + +const FN_MODE_OFF = "fn_mode_off"; +const FN_MODE_GPS = "fn_mode_gps"; +const FN_MODE_GDISP = "fn_mode_gdisp"; + +const GPS_OFF = "gps_off"; +const GPS_TIME = "gps_time"; +const GPS_SATS = "gps_sats"; +const GPS_RUNNING = "gps_running"; + +const GDISP_OS = "g_osref"; +const GDISP_SPEED = "g_speed"; +const GDISP_ALT = "g_alt"; + +const Y_TIME = 40; +const Y_ACTIVITY = 120; +const Y_MODELINE = 200; + +let gpsState = GPS_OFF; +let gpsPowerState = false; +let infoMode = INFO_NONE; +let functionMode = FN_MODE_OFF; +let gpsDisplay = GDISP_OS; + +let last_steps = undefined; +let firstPress = 0; + +let last_fix = { + fix: 0, + alt: 0, + lat: 0, + lon: 0, + speed: 0, + time: 0, + satellites: 0 +}; + +function drawTime() { + var d = new Date(); + var da = d.toString().split(" "); + var time = da[4].substr(0,5); + + g.reset(); + g.clearRect(0,24,239,239); + g.setColor(1,1,1); // white + g.setFontAlign(0, -1); + + if (gpsState == GPS_SATS || gpsState == GPS_RUNNING) { + time = last_fix.time.toUTCString().split(" "); + time = time[4]; + g.setFont("Vector", 56); + } else { + g.setFont("Vector", 80); + } + + g.drawString(time, g.getWidth()/2, Y_TIME); +} + +function drawSteps() { + g.setColor(0,255,0); // green + g.setFont("Vector", 60); + g.drawString(getSteps(), g.getWidth()/2, Y_ACTIVITY); +} + +function drawActivity() { + if (!gpsPowerState) { + drawSteps(); + return; + } + + g.setFont("6x8", 3); + g.setColor(1,1,1); + g.setFontAlign(0, -1); + + if (gpsState == GPS_TIME) { + g.drawString("Waiting for", g.getWidth()/2, Y_ACTIVITY); + g.drawString("GPS", g.getWidth()/2, Y_ACTIVITY + 30); + return; + } + + if (gpsState == GPS_SATS) { + g.drawString("Satellites", g.getWidth()/2, Y_ACTIVITY); + g.drawString(last_fix.satellites, g.getWidth()/2, Y_ACTIVITY + 30); + return; + } + + if (gpsState == GPS_RUNNING) { + //console.log("Draw GPS Running"); + let time = formatTime(last_fix.time); + let age = timeSince(time); + let os = OsGridRef.latLongToOsGrid(last_fix); + let ref = to_map_ref(6, os.easting, os.northing); + let speed; + + if (age < 0) age = 0; + g.setFontVector(40); + g.setColor(0xFFC0); + + switch(gpsDisplay) { + case GDISP_OS: + g.drawString(ref, 120, Y_ACTIVITY, true); + break; + case GDISP_SPEED: + speed = last_fix.speed; + speed = speed.toFixed(1); + g.drawString(speed + "kph", 120, Y_ACTIVITY, true); + break; + case GDISP_ALT: + g.drawString(last_fix.alt + "m" , 120, Y_ACTIVITY, true); + break; + } + + g.setFont("6x8",2); + g.setColor(1,1,1); + g.drawString(age, 120, Y_ACTIVITY + 46); + } +} + +function onTick() { + if (!Bangle.isLCDOn()) + return; + + if (gpsPowerState) { + drawAll(); + return; + } + + if (last_steps != getSteps()) { + last_steps = getSteps(); + drawAll(); + return; + } + + var t = new Date(); + + if (t.getSeconds() === 0 && !gpsPowerState) { + drawAll(); + } +} + +function drawAll(){ + drawTime(); + drawActivity(); // steps, hrt or gps + drawInfo(); +} + +function drawInfo() { + let val; + let str = ""; + let col = 0x07E0; // green + + //console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); + + switch(functionMode) { + case FN_MODE_OFF: + break; + case FN_MODE_GPS: + col = 0x07FF; // cyan + str = "GPS: " + (gpsPowerState ? "ON" : "OFF"); + drawModeLine(str,col); + return; + case FN_MODE_GDISP: + col = 0x07FF; // cyan + switch(gpsDisplay) { + case GDISP_OS: + str = "GPS: Grid"; + break; + case GDISP_SPEED: + str = "GPS: Speed"; + break; + case GDISP_ALT: + str = "GPS: Alt"; + break; + } + drawModeLine(str,col); + return; + } + + switch(infoMode) { + case INFO_NONE: + col = 0x0000; + str = ""; + break; + case INFO_STEPS: + str = "Steps: " + getSteps(); + break; + case INFO_BATT: + default: + str = "Battery: " + E.getBattery() + "%"; + } + + drawModeLine(str,col); +} + +function drawModeLine(str, col) { + g.setFont("6x8", 3); + g.setColor(col); + g.fillRect(0, Y_MODELINE - 3, 239, Y_MODELINE + 25); + g.setColor(0,0,0); + g.setFontAlign(0, -1); + g.drawString(str, g.getWidth()/2, Y_MODELINE); +} + +function changeInfoMode() { + switch(functionMode) { + case FN_MODE_OFF: + break; + case FN_MODE_GPS: + gpsPowerState = !gpsPowerState; + Bangle.buzz(); + Bangle.setGPSPower(gpsPowerState ? 1 : 0); + if (gpsPowerState) { + gpsState = GPS_TIME; // waiting first response so we can display time + Bangle.on('GPS', processFix); + } else { + Bangle.removeListener("GPS", processFix); + gpsState = GPS_OFF; + } + resetLastFix(); + + // poke the gps widget indicator to change + if (WIDGETS.gps !== undefined) { + WIDGETS.gps.draw(); + } + functionMode = FN_MODE_OFF; + infoMode = INFO_NONE; + //drawInfo(); + return; + + case FN_MODE_GDISP: + switch (gpsDisplay) { + case GDISP_OS: + gpsDisplay = GDISP_SPEED; + break; + case GDISP_SPEED: + gpsDisplay = GDISP_ALT; + break; + case GDISP_ALT: + default: + gpsDisplay = GDISP_OS; + break; + } + } + + switch(infoMode) { + case INFO_NONE: + if (stepsWidget() !== undefined) + infoMode = INFO_STEPS; + else + infoMode = INFO_BATT; + break; + case INFO_STEPS: + infoMode = INFO_BATT; + break; + case INFO_BATT: + default: + infoMode = INFO_NONE; + } + //drawInfo(); +} + +function changeFunctionMode() { + //console.log("changeFunctionMode()"); + + if (gpsState != GPS_RUNNING) { + switch(functionMode) { + case FN_MODE_OFF: + functionMode = FN_MODE_GPS; + break; + case FN_MODE_GPS: + default: + functionMode = FN_MODE_OFF; + break; + } + } else { + // if GPS is RUNNING then we want the GPS display options first + switch(functionMode) { + case FN_MODE_OFF: + functionMode = FN_MODE_GDISP; + break; + case FN_MODE_GDISP: + functionMode = FN_MODE_GPS; + break; + case FN_MODE_GPS: + default: + functionMode = FN_MODE_OFF; + break; + } + } + + infoMode = INFO_NONE; // function mode overrides info mode +} + +function resetLastFix() { + last_fix = { + fix: 0, + alt: 0, + lat: 0, + lon: 0, + speed: 0, + time: 0, + satellites: 0 + }; +} + +function processFix(fix) { + last_fix.time = fix.time; + + if (gpsState == GPS_TIME) + gpsState = GPS_SATS; + + if (fix.fix) { + if (!last_fix.fix) Bangle.buzz(); // buzz on first position + gpsState = GPS_RUNNING; + last_fix = fix; + } +} + +function getSteps() { + if (stepsWidget() !== undefined) + return stepsWidget().getSteps(); + return "-"; +} + +function stepsWidget() { + if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom; + } else if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom; + } + return undefined; +} + + +/************* GPS / OSREF Code **************************/ + +function formatTime(now) { + var fd = now.toUTCString().split(" "); + return fd[4]; +} + +function timeSince(t) { + var hms = t.split(":"); + var now = new Date(); + + var sn = 3600*(now.getHours()) + 60*(now.getMinutes()) + 1*(now.getSeconds()); + var st = 3600*(hms[0]) + 60*(hms[1]) + 1*(hms[2]); + + return (sn - st); +} + +Number.prototype.toRad = function() { return this*Math.PI/180; }; +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* Ordnance Survey Grid Reference functions (c) Chris Veness 2005-2014 */ +/* - www.movable-type.co.uk/scripts/gridref.js */ +/* - www.movable-type.co.uk/scripts/latlon-gridref.html */ +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +function OsGridRef(easting, northing) { + this.easting = 0|easting; + this.northing = 0|northing; +} +OsGridRef.latLongToOsGrid = function(point) { + var lat = point.lat.toRad(); + var lon = point.lon.toRad(); + + var a = 6377563.396, b = 6356256.909; // Airy 1830 major & minor semi-axes + var F0 = 0.9996012717; // NatGrid scale factor on central meridian + var lat0 = (49).toRad(), lon0 = (-2).toRad(); // NatGrid true origin is 49�N,2�W + var N0 = -100000, E0 = 400000; // northing & easting of true origin, metres + var e2 = 1 - (b*b)/(a*a); // eccentricity squared + var n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n; + + var cosLat = Math.cos(lat), sinLat = Math.sin(lat); + var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat); // transverse radius of curvature + var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5); // meridional radius of curvature + var eta2 = nu/rho-1; + + var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0); + var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0); + var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0)); + var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0)); + var M = b * F0 * (Ma - Mb + Mc - Md); // meridional arc + + var cos3lat = cosLat*cosLat*cosLat; + var cos5lat = cos3lat*cosLat*cosLat; + var tan2lat = Math.tan(lat)*Math.tan(lat); + var tan4lat = tan2lat*tan2lat; + + var I = M + N0; + var II = (nu/2)*sinLat*cosLat; + var III = (nu/24)*sinLat*cos3lat*(5-tan2lat+9*eta2); + var IIIA = (nu/720)*sinLat*cos5lat*(61-58*tan2lat+tan4lat); + var IV = nu*cosLat; + var V = (nu/6)*cos3lat*(nu/rho-tan2lat); + var VI = (nu/120) * cos5lat * (5 - 18*tan2lat + tan4lat + 14*eta2 - 58*tan2lat*eta2); + + var dLon = lon-lon0; + var dLon2 = dLon*dLon, dLon3 = dLon2*dLon, dLon4 = dLon3*dLon, dLon5 = dLon4*dLon, dLon6 = dLon5*dLon; + + var N = I + II*dLon2 + III*dLon4 + IIIA*dLon6; + var E = E0 + IV*dLon + V*dLon3 + VI*dLon5; + + return new OsGridRef(E, N); +}; + +/* + * converts northing, easting to standard OS grid reference. + * + * [digits=10] - precision (10 digits = metres) + * to_map_ref(8, 651409, 313177); => 'TG 5140 1317' + * to_map_ref(0, 651409, 313177); => '651409,313177' + * + */ +function to_map_ref(digits, easting, northing) { + if (![ 0,2,4,6,8,10,12,14,16 ].includes(Number(digits))) throw new RangeError(`invalid precision '${digits}'`); // eslint-disable-line comma-spacing + + let e = easting; + let n = northing; + + // use digits = 0 to return numeric format (in metres) - note northing may be >= 1e7 + if (digits == 0) { + const format = { useGrouping: false, minimumIntegerDigits: 6, maximumFractionDigits: 3 }; + const ePad = e.toLocaleString('en', format); + const nPad = n.toLocaleString('en', format); + return `${ePad},${nPad}`; + } + + // get the 100km-grid indices + const e100km = Math.floor(e / 100000), n100km = Math.floor(n / 100000); + + // translate those into numeric equivalents of the grid letters + let l1 = (19 - n100km) - (19 - n100km) % 5 + Math.floor((e100km + 10) / 5); + let l2 = (19 - n100km) * 5 % 25 + e100km % 5; + + // compensate for skipped 'I' and build grid letter-pairs + if (l1 > 7) l1++; + if (l2 > 7) l2++; + const letterPair = String.fromCharCode(l1 + 'A'.charCodeAt(0), l2 + 'A'.charCodeAt(0)); + + // strip 100km-grid indices from easting & northing, and reduce precision + e = Math.floor((e % 100000) / Math.pow(10, 5 - digits / 2)); + n = Math.floor((n % 100000) / Math.pow(10, 5 - digits / 2)); + + // pad eastings & northings with leading zeros + e = e.toString().padStart(digits/2, '0'); + n = n.toString().padStart(digits/2, '0'); + + return `${letterPair} ${e} ${n}`; +} + +// start a timer and buzz whenn held long enough +function firstPressed() { + firstPress = getTime(); + pressTimer = setInterval(longPressCheck, 1500); +} + +// if you release too soon there is no buzz as timer is cleared +function thenReleased() { + var dur = getTime() - firstPress; + if (pressTimer) { + clearInterval(pressTimer); + pressTimer = undefined; + } + if ( dur >= 1.5 ) Bangle.showLauncher(); +} + +// when you feel the buzzer you know you have done a long press +function longPressCheck() { + Bangle.buzz(); + if (pressTimer) { + clearInterval(pressTimer); + pressTimer = undefined; + } +} + +var pressTimer; + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +drawAll(); + +Bangle.on('lcdPower',function(on) { + functionMode = FN_MODE_OFF; + infoMode = INFO_NONE; + if (on) drawAll(); +}); + +var click = setInterval(onTick, 5000); + +setWatch(() => { changeInfoMode(); drawAll(); }, BTN1, {repeat: true}); +setWatch(() => { changeFunctionMode(); drawAll(); }, BTN3, {repeat: true}); + +// make BTN require a long press (1.5 seconds) to switch to launcher +setWatch(firstPressed, BTN2,{repeat:true,edge:"rising"}); +setWatch(thenReleased, BTN2,{repeat:true,edge:"falling"}); + diff --git a/apps/walkersclock/gps_alt.jpg b/apps/walkersclock/gps_alt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d407998b62ff4c399864b44d5fe501fe87810fbd GIT binary patch literal 48399 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