From 4d51eff081c24edf85e79e289ca22360c0305257 Mon Sep 17 00:00:00 2001 From: Giles Booth Date: Wed, 28 Dec 2022 19:13:35 +0000 Subject: [PATCH] Delete apps/suw directory --- apps/suw/README.md | 30 ----- apps/suw/app-icon.js | 1 - apps/suw/app.js | 246 --------------------------------------- apps/suw/app.png | Bin 5265 -> 0 bytes apps/suw/metadata.json | 19 --- apps/suw/no-tides-app.js | 169 --------------------------- apps/suw/screenshot.png | Bin 3057 -> 0 bytes apps/suw/screenshot2.png | Bin 2822 -> 0 bytes apps/suw/settings.js | 57 --------- 9 files changed, 522 deletions(-) delete mode 100644 apps/suw/README.md delete mode 100644 apps/suw/app-icon.js delete mode 100644 apps/suw/app.js delete mode 100644 apps/suw/app.png delete mode 100644 apps/suw/metadata.json delete mode 100644 apps/suw/no-tides-app.js delete mode 100644 apps/suw/screenshot.png delete mode 100644 apps/suw/screenshot2.png delete mode 100644 apps/suw/settings.js diff --git a/apps/suw/README.md b/apps/suw/README.md deleted file mode 100644 index 6c0c47e83..000000000 --- a/apps/suw/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Seaside utility watch - -A watch that does just what I want when I am at the seaside, showing day, date, month, year, sunrise, sunset, location and approximate high and low tide times. - -Touch to toggle between sunrise / sunset and tide times. - -Very much a work in progress. Sunrise/set requires location to have already been set in mylocation.json using MyLocation app. - -DO NOT RELY ON THESE TIDE TIMES! This is in development. - -When working, you will set the next tide time (high or low) in application settings, the watch will then calculate approximate next tide time by adding 6 hours and 12 minutes to the tide time and keep doing so until reset. - -This may become very unreliable over time and will need periodic realignment. - -![sun rise/set](screenshot.png) -![sun rise/set](screenshot2.png) - -## Many faults - -- [ ] bug fix to prevent cascading tide time flipping causes it to halt completely - tide time never updates -- [ ] when watch closed and reloaded it reloads tide times from setting file which may be out of date - need to write new times to settings file when swapping occurs - - -## Many of the to-dos - -- [ ] handle tide time not being set and remove default time which is just for testing -- [ ] write tide data back to json file when flipped to keep it up to date when app reloaded -- [ ] tidy up code in general -- [ ] no need to check sunrise and sunset times so often -- [ ] consider a web app for setting next tide time or entering real data diff --git a/apps/suw/app-icon.js b/apps/suw/app-icon.js deleted file mode 100644 index 4440ffec1..000000000 --- a/apps/suw/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwhHXAH4A1wOBF9tRqImkvesBA1Xq4IG1l7F7dQKw4vIqNQF7emqBgGR4+sqGmSDlQPw17A45ecMBReleJTtc01RExgAR1lRNBh3BQ5ms02CwWmCBgfNbAhAHQYMmkweBqFKAoKbIaoKXRGAIdEFoNKqGkAAOp1Oj0eAGYIxFLoLGTDQmmFoXO5oAH0aGGbjAuBvXOFw+kvWp5movVKc5hiPFxQvBpUC0fM5gwBLjHX6IuB56MJGIXN1PNGANQ6KDO02teRBdJAAtQvXMYYLsH1opBEotQqN7Ogesk2k6gvO0ZgC0cmDgl7qInBHIo3BGQIJDLwXUFxoAD5miDg17Q5AAGqOA6peOF4jBBqLtU1lK0gvTSAVKSAYvqqAvVqGqF/4vdR8uBqF7BwvRqGk5+kvVQvV6FRINBBwOj5l/qHRKAt7qGBAodRqGCB4lRFQMmvYABpVQ0YtFK4NKBwUmCoNRLA1RLIwJBG4QAB01KpQPD6A/BGAguBqPQUwlK0wkKAAmCSYWs0x8BU4xiBwGp1OALgLXGC4OmDoKLBQgoAF0xTBAAJtGJYdKk0mpROIFYQABqJkEABJBBFpD7DBoLjFDiQnLFAOtE5YOPFQZsBqKZI6J5DSxKIEvYxIwS0BaQXR0wVBbJOBewIVBVQ2mWgWswITBH4wmC0w7FDAIwEFwWtDAowEwQVF1owGCoxYIMwVRPQxJCwWCOpHRQwWmMxKpJwIOISYSLCBxAsCapQAucAJoM0zTGRQoNBDhoNCNgV7EQ+sQ4QABwQfHeIIACqIxH6KzCWQet0wHBGAoIBDgPRZQToGBAQOCIQLIF6IlB02tKwz8FFwIoFA4wuBFAoHFEYyHIq97AYJXGGAQKBPgQuFGAdRvdXAYJcGVQwuBPgI/JBoIOOq7UIAH4AeA==")) diff --git a/apps/suw/app.js b/apps/suw/app.js deleted file mode 100644 index 0d869dbac..000000000 --- a/apps/suw/app.js +++ /dev/null @@ -1,246 +0,0 @@ -var SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); -const LOCATION_FILE = "mylocation.json"; -let location; - -// load tide times from settings file -var settings = Object.assign({ - // default values - nextTideType: "high", - nextTideHour: 0, - nextTideMin: 0, -}, require('Storage').readJSON("suw.json", true) || {}); - -// flag to see if next tide time has crossed midnight and need to halt tide time swapping -var tideNextDay = false; - -// assume next tide is 6h 12m later -var tide1h = settings.nextTideHour; -var tide1m = settings.nextTideMin; -var tide1type = settings.nextTideType; -var tide2m = tide1m +12; -if (tide2m > 59) { - tide2m = tide2m - 60; - var tide2h = tide1h + 7; - } -else { -var tide2h = tide1h + 6; -} -if (tide2h > 23) { - tide2h = tide2h - 24; -} -if (tide1type === "low ") { - var tide2type = "high"; -} -else { - var tide2type = "low "; -} - -// print(settings.nextTideHour,settings.nextTideMin,settings.nextTideType); -// print(tide2h); - -const big = g.getWidth()>200; -const timeFontSize = big?6:5; -const dateFontSize = big?3:2; -//const locationFontSize = 2; -const sunFontSize = 2; -const tideFontSize = 1; -const font = "6x8"; - -const xyCenter = g.getWidth() / 2; -const yposTime = xyCenter*0.7; -const yposDate = xyCenter*1.1; -const yposSunrise = xyCenter*1.5; -const yposLat = xyCenter*1.7; -const yposLon = xyCenter*1.9; - -let showSun = true; - -var sunImg = require("heatshrink").decompress(atob("j0ewIIFhgDCmADC4ACBgYCBjEMg0AuEAnEA8EB4EBx/GB4N/wAVB/4GBj/+AYP//gKC+EH5//5+fn//nwOGgEH/4hBh4KBEIPggEGn8YHIVwHII9Bg0DgIWBLJoADA==")); - -var seaImg = -require("heatshrink").decompress(atob("kEgwRC/ABH8gE/4EDAgX/4f//gEDh//+H/AgcA/8Ah4EDE/4nXAH4A==")); - -// Check settings for what type our clock should be -var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]; - - -function numToString(num) { - returnString = String(num); - if (returnString.length === 1) { - returnString = "0"+returnString; - } - return returnString; -} - -// requires the myLocation app -function loadLocation() { - location = require("Storage").readJSON(LOCATION_FILE,1)||{}; - location.lat = location.lat||51.5072; - location.lon = location.lon||0.1276; - location.location = location.location||"London"; -} - - -// this is from Pastel - perhaps can be replaced with other function -function extractTime(d){ - var h = d.getHours(), m = d.getMinutes(); - return(("0"+h).substr(-2) + ":" + ("0"+m).substr(-2)); -} - - -var sunRise = "00:00"; -var sunSet = "00:00"; - -function updateSunRiseSunSet(now, lat, lon, line){ - // get today's sunlight times for lat/lon - var times = SunCalc.getTimes(new Date(), lat, lon); - - // format sunrise time from the Date object - sunRise = extractTime(times.sunrise); - sunSet = extractTime(times.sunset); -} - - -// timeout used to update every minute -var drawTimeout; - -// schedule a draw for the next minute -function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); -} - -function draw() { - // get date - var d = new Date(); - var da = d.toString().split(" "); - - g.reset(); // default draw styles - // drawSting centered - g.setFontAlign(0, 0); - - // draw time - var time = da[4].substr(0, 5).split(":"); - var hours = time[0], - minutes = time[1]; - var meridian = ""; - if (is12Hour) { - hours = parseInt(hours,10); - meridian = "AM"; - if (hours == 0) { - hours = 12; - meridian = "AM"; - } else if (hours >= 12) { - meridian = "PM"; - if (hours>12) hours -= 12; - } - hours = (" "+hours).substr(-2); - } - - - - - g.setFont("Vector",64); // vector font, 64px - g.drawString(`${hours}:${minutes}`, xyCenter, yposTime, true); - - // draw Day, name of month, Date - var date = [da[0], da[2], da[1], da[3].substr(-2)].join(" "); - g.setFont(font, dateFontSize); - g.drawString(date, xyCenter, yposDate, true); - -// recalc sunrise / sunset every hour - needs putting in correct place -// if (drawCount % 60 == 0) - updateSunRiseSunSet(new Date(), location.lat, location.lon); -// drawCount++; - - - - // draw sunrise or tide times - g.setFont(font, sunFontSize); - if (showSun) { - g.clearRect(0, xyCenter+17, 175, 175); - g.drawString(sunRise+" "+sunSet , xyCenter, yposSunrise, true); - g.drawImage(sunImg, xyCenter-15, xyCenter+17); - var latitude = location.lat; - latitude = Math.round(latitude * 100) / 100; - var longitude = location.lon; - longitude = Math.round(longitude * 100) / 100; - g.drawString("Lat "+latitude, xyCenter, yposLat, true); - g.drawString("Lon "+longitude, xyCenter, yposLon, true); - } - else { - var textTime = hours + minutes; // use this for making simple time comparisons - var textNextTide = numToString(tide1h)+numToString(tide1m); - print(textNextTide); - if (Number(textTime) > Number(textNextTide) && (!tideNextDay)) { - print("time swap needed"); - tide1h = tide2h; - tide1m = tide2m; - tide1type = tide2type; - tide2m = tide2m +12; - if (tide2m > 59) { - tide2m = tide2m - 60; - tide2h = tide2h + 7; - } - else { - tide2h = tide2h + 6; - } - if (tide2h > 23) { - tide2h = tide2h - 24; - } - if (tide2type === "low ") { - tide2type = "high"; - } - else { - tide2type = "low "; - } - if (Number(textNextTide) < Number(textTime)) { - tideNextDay = true; - } - else { - tideNextDay = false; - } - - } - g.clearRect(0, xyCenter+17, 175, 175); - g.drawString(numToString(tide1h)+numToString(tide1m)+" "+numToString(tide2h)+numToString(tide2m) , xyCenter, 138, true); - g.drawString(tide1type+" "+tide2type , xyCenter, 156, true); - g.drawImage(seaImg, xyCenter-16, xyCenter+17); - } - -// print(tide1h,tide1m,tide1type,tide2h,tide2m,tide2type); - queueDraw(); -} - -function toggleDisplay() { - showSun = ! showSun; - draw(); -} - -// adding this as it's not getting called at start -loadLocation(); - -Bangle.on('touch', () => toggleDisplay()); - -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); - -// clean app screen -g.clear(); -// Show launcher when button pressed -Bangle.setUI("clock"); -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -// draw now -draw(); diff --git a/apps/suw/app.png b/apps/suw/app.png deleted file mode 100644 index 3157e9662c7fc4bf02b6c4c839045f2608e45801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5265 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

Eceq7ro{d8ogg)(J{AAhMx z9+56DDW#a1sdY)n7*dxxO_xwb79yJlcHt&YKQiUZ1c|D_#yPLCAM@U83D6s_Beg2C zdK};2!&p=Mwp$m*4wWsi;H5if9*QFrhz%?vycQ^qRMW`w6`Lzvaa=E%H>zNGy@x9K zjjF)sOL&ez^WeTi<^|6+1v!l_oS1m7&$&v$6GK}z!eTM_1CG(g=ALxiL+Sf|qdCoY zdz@=NlQX9=f6sir2_06VT}06Ww&MKpta4o%+%})m5Q*LMGlbXk5Yc1!N-Y~^(()D! zg02#!t3Gh_$}kZ;wcYb0HqNJS8zdw0OAVjlqUCv6ZbK(j&&Vq!Yi{2BJs(@!>s{aI zz;`A|SKYp?`QWoTGUn7OCwDlMG-|Z=n~0*%mw}5hQq;{mFM#!zbnp*JeC|2=5U`aZS1^fardZ|oVt-p=-VZV%yV=} zCX#ztWvYVvQ*VrbJ_DNu@yE69_N#VgZt-95DA3QkbhAx=R!cpgzSNvSWqz$*w0j}dfsU-%00P6^)UKbFQHK~O zdb+N|pn031vvv3o8%WtlrS(({vajaMFa7~!9w2PdaD?UKy%BBu&;LkX^cM7{5PJKnH`^LF#KSGo`C zS{a!Olgbr*qqzql7;uX>++W8u*^mcP^O=+(22Mp4(_h{H5^=b}+67o6iAj7HNxD)W z=R)nZ5^XGLO7~?hL5ZMnen}|Zw>D2x$|9 zMtKGZk&%SpkNR{}{xMENW)B2ou!UZyFvJ%VH?}RApxe%skCl)I{@VU3@Ppiihwt z=2IK8c?YQcd){_Af|T*Vha{)jr%lFMVJR@I5ImNpaSfJN*$|wd?+7)`A!w-i!p^D| zE;Dw|icmU#v|JFVG(sORzLpx9kWB;K$rGEfzmTH5`h(qT6@~eBt*3kYUrtp~OQAyE HI^=%<2>g@G diff --git a/apps/suw/metadata.json b/apps/suw/metadata.json deleted file mode 100644 index 9ca992e43..000000000 --- a/apps/suw/metadata.json +++ /dev/null @@ -1,19 +0,0 @@ -{ "id": "suw", - "name": "Seaside Utility Watch", - "shortName":"SeaWatch", - "icon": "app.png", - "version":"0.01", - "description": "A watch useful at the seaside", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "allow_emulator": false, - "storage": [ - {"name":"suw.app.js","url":"app.js"}, - {"name":"suw.settings.js","url":"settings.js"}, - {"name":"suw.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"suw.json"}] -} diff --git a/apps/suw/no-tides-app.js b/apps/suw/no-tides-app.js deleted file mode 100644 index 0778d0500..000000000 --- a/apps/suw/no-tides-app.js +++ /dev/null @@ -1,169 +0,0 @@ -var SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); -const LOCATION_FILE = "mylocation.json"; -let location; - -const big = g.getWidth()>200; -const timeFontSize = big?6:5; -const dateFontSize = big?3:2; -const locationFontSize = 2; -const sunFontSize = 2; -const tideFontSize = 1; -const font = "6x8"; - -const xyCenter = g.getWidth() / 2; -const yposTime = xyCenter*0.7; -const yposDate = xyCenter*1.1; -const yposSunrise = xyCenter*1.5; -//const yposSunset = xyCenter*1.4; -const yposLat = xyCenter*1.7; -const yposLon = xyCenter*1.9; -//const yposTide1 = xyCenter*1.6; -//const yposTide2 = xyCenter*1.7; -//const yposTide3 = xyCenter*1.8; -//const yposTide4 = xyCenter*1.9; - -var sunImg = require("heatshrink").decompress(atob("j0ewIIFhgDCmADC4ACBgYCBjEMg0AuEAnEA8EB4EBx/GB4N/wAVB/4GBj/+AYP//gKC+EH5//5+fn//nwOGgEH/4hBh4KBEIPggEGn8YHIVwHII9Bg0DgIWBLJoADA==")); - - -// Check settings for what type our clock should be -var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]; - -// requires the myLocation app -function loadLocation() { - location = require("Storage").readJSON(LOCATION_FILE,1)||{}; - location.lat = location.lat||51.5072; - location.lon = location.lon||0.1276; - location.location = location.location||"London"; -} - -// this is from Pastel - perhaps not needed -function extractTime(d){ - var h = d.getHours(), m = d.getMinutes(); - return(("0"+h).substr(-2) + ":" + ("0"+m).substr(-2)); -} - - -var sunRise = "00:00"; -var sunSet = "00:00"; - -function updateSunRiseSunSet(now, lat, lon, line){ - // get today's sunlight times for lat/lon - var times = SunCalc.getTimes(new Date(), lat, lon); - - // format sunrise time from the Date object - sunRise = extractTime(times.sunrise); - sunSet = extractTime(times.sunset); -} - - -// timeout used to update every minute -var drawTimeout; - -// schedule a draw for the next minute -function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); -} - -function draw() { - // get date - var d = new Date(); - var da = d.toString().split(" "); - - g.reset(); // default draw styles - // drawSting centered - g.setFontAlign(0, 0); - - // draw time - var time = da[4].substr(0, 5).split(":"); - var hours = time[0], - minutes = time[1]; - var meridian = ""; - if (is12Hour) { - hours = parseInt(hours,10); - meridian = "AM"; - if (hours == 0) { - hours = 12; - meridian = "AM"; - } else if (hours >= 12) { - meridian = "PM"; - if (hours>12) hours -= 12; - } - hours = (" "+hours).substr(-2); - } - -// g.setFont(font, timeFontSize); - g.setFont("Vector",66); // vector font, 80px - g.drawString(`${hours}:${minutes}`, xyCenter, yposTime, true); -// g.setFont(font, tideFontSize); -// g.drawString(meridian, xyCenter + 102, yposTime + 10, true); - - // draw Day, name of month, Date - var date = [da[0], da[2], da[1], da[3].substr(-2)].join(" "); - g.setFont(font, dateFontSize); - - g.drawString(date, xyCenter, yposDate, true); - -// recalc sunrise / sunset every hour - needs putting in correct place -// if (drawCount % 60 == 0) - updateSunRiseSunSet(new Date(), location.lat, location.lon); -// drawCount++; - - // draw sunrise - g.setFont(font, sunFontSize); - g.drawString(sunRise+" "+sunSet , xyCenter, yposSunrise, true); -// g.drawString("Sunset "+sunSet, xyCenter, yposSunset, true); - - // draw sun icon - g.drawImage(sunImg, xyCenter-15, xyCenter+17); - - // draw location - g.setFont(font, locationFontSize); - var latitude = location.lat; - latitude = Math.round(latitude * 100) / 100; - var longitude = location.lon; - longitude = Math.round(longitude * 100) / 100; - g.drawString("Lat "+latitude, xyCenter, yposLat, true); - g.drawString("Lon "+longitude, xyCenter, yposLon, true); - - - // draw tides -// g.setFont(font, tideFontSize); -// g.drawString("High tide 0017 5.58m", xyCenter, yposTide1, true); - -// g.setFont(font, tideFontSize); -// g.drawString("Low tide 0651 2.25m", xyCenter, yposTide2, true); - -// g.setFont(font, tideFontSize); -// g.drawString("High tide 1302 5.44m", xyCenter, yposTide3, true); - -// g.setFont(font, tideFontSize); -// g.drawString("Low tide 1931 2.26m", xyCenter, yposTide4, true); - - - - queueDraw(); -} - -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); - -// clean app screen -g.clear(); -// Show launcher when button pressed -Bangle.setUI("clock"); -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -// draw now -draw(); diff --git a/apps/suw/screenshot.png b/apps/suw/screenshot.png deleted file mode 100644 index b7e5efa1292772d1f7352f86dd6c32a121b4de7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3057 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 diff --git a/apps/suw/settings.js b/apps/suw/settings.js deleted file mode 100644 index b94baea93..000000000 --- a/apps/suw/settings.js +++ /dev/null @@ -1,57 +0,0 @@ -(function(back) { - var FILE = "suw.json"; - // Load settings - var settings = Object.assign({ - nextTideType: "high", - nextTideHour: 0, - nextTideMin: 0, - }, require('Storage').readJSON(FILE, true) || {}); - - function writeSettings() { - require('Storage').writeJSON(FILE, settings); - } - - // Helper method which uses int-based menu item for set of string values - function stringItems(startvalue, writer, values) { - return { - value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), - format: v => values[v], - min: 0, - max: values.length - 1, - wrap: true, - step: 1, - onchange: v => { - writer(values[v]); - writeSettings(); - } - }; - } - - // Helper method which breaks string set settings down to local settings object - function stringInSettings(name, values) { - return stringItems(settings[name], v => settings[name] = v, values); - } - - // Show the menu - E.showMenu({ - "" : { "title" : "Seaside Watch" }, - "< Back" : () => back(), - "Tide type": stringInSettings("nextTideType", ["high", "low "]), - 'Hour': { - value: 0|settings.nextTideHour, // 0| converts undefined to 0 - min: 0, max: 23, - onchange: v => { - settings.nextTideHour = v; - writeSettings(); - } - }, - 'Minutes': { - value: 0|settings.nextTideMin, // 0| converts undefined to 0 - min: 0, max: 59, - onchange: v => { - settings.nextTideMin = v; - writeSettings(); - } - }, - }); -});