diff --git a/apps/cc_astro/ChangeLog b/apps/cc_astro/ChangeLog new file mode 100644 index 0000000000..1678d5285e --- /dev/null +++ b/apps/cc_astro/ChangeLog @@ -0,0 +1 @@ +0.01: First functional release diff --git a/apps/cc_astro/README.md b/apps/cc_astro/README.md new file mode 100644 index 0000000000..5343a64026 --- /dev/null +++ b/apps/cc_astro/README.md @@ -0,0 +1,9 @@ +# Astronomy Clock + +## Features + +* shows earth as hour and venus as minute hand +* shows mercury as second hand only on unlocked screen +* if battery is low, the sun will become to a red giant + +![logo](screenshot1.png) diff --git a/apps/cc_astro/app.js b/apps/cc_astro/app.js new file mode 100644 index 0000000000..89dadbdd72 --- /dev/null +++ b/apps/cc_astro/app.js @@ -0,0 +1,184 @@ +// ----- const ----- + +const center = { + "x": g.getWidth()/2, + "y": g.getHeight()/2 +}; + +const parameters = { + "earthOrbitRadius": 80, + "venusOrbitRadius": 60, + "mercuryOrbitRadius": 40, + "earthRadius": 8, + "venusRadius": 6, + "mercuryRadius": 4, + "sunRadius": 12, + "maxSunRadius": 115 +}; + +// ----- global vars ----- + +let drawTimeout; +let queueMillis = 1000; +let unlock = true; +let lastBatteryStates = [E.getBattery()]; + +// ----- functions ----- + +function updateState() { + updateBatteryStates(); + + if (Bangle.isLCDOn()) { + if (!Bangle.isLocked()) { + queueMillis = 1000; + unlock = true; + } + else { + queueMillis = 60000; + unlock = false; + } + draw(); + } + else { + if (drawTimeout) + clearTimeout(drawTimeout); + drawTimeout = undefined; + } +} + +function updateBatteryStates() { + lastBatteryStates.push(E.getBattery()); + if (lastBatteryStates.length > 5) + lastBatteryStates.shift(); // remove 1st item +} + +function draw() { + drawBackground(); + drawHands(); + queueDraw(); +} + +function drawBackground() { + clearScreen(); + drawSun(); +} + +function clearScreen() { + g.setBgColor(0, 0, 0); + g.clear(); +} + +function drawSun() { + const batteryState = calcAvgBatteryState(); + + if (batteryState <= 25) + g.setColor(1, 0, 0); // red sun, if battery low + else + g.setColor(1, 1, 0); + + let r = parameters.sunRadius; + if (batteryState <= 20) { + const relSize = (20 - batteryState) / 20; + const dr = parameters.maxSunRadius - parameters.sunRadius; + r = parameters.sunRadius + relSize * dr; + } + + g.fillCircle(center.x, center.y, r); +} + +function drawHands() { + const date = new Date(); + + drawHourHand(date.getHours(), date.getMinutes()); + drawMinuteHand(date.getMinutes()); + + if (unlock) { + drawSecondHand(date.getSeconds()); + } +} + +function drawHourHand(hours, minutes) { + const r = parameters.earthOrbitRadius; + const phi = 30 * (hours + minutes/60) * (Math.PI / 180) - Math.PI/2; + const x = center.x + r * Math.cos(phi); + const y = center.y + r * Math.sin(phi); + + g.setColor(1, 1, 1); + g.drawCircle(center.x, center.y, r); + + g.setColor(0, 1, 1); + g.fillCircle(x, y, parameters.earthRadius); +} + +function drawMinuteHand(minutes) { + const r = parameters.venusOrbitRadius; + const phi = 6 * minutes * (Math.PI / 180) - Math.PI/2; + const x = center.x + r * Math.cos(phi); + const y = center.y + r * Math.sin(phi); + + g.setColor(1, 1, 1); + g.drawCircle(center.x, center.y, r); + + g.setColor(1, 1, 1); + g.fillCircle(x, y, parameters.venusRadius); +} + +function drawSecondHand(seconds) { + const r = parameters.mercuryOrbitRadius; + const phi = 6 * seconds * (Math.PI / 180) - Math.PI/2; + const x = center.x + r * Math.cos(phi); + const y = center.y + r * Math.sin(phi); + + g.setColor(1, 1, 1); + g.drawCircle(center.x, center.y, r); + + g.setColor(1, 0, 1); + g.fillCircle(x, y, parameters.mercuryRadius); +} + +function calcAvgBatteryState() { + const n = lastBatteryStates.length; + if (n == 0) + return 100; + + let sum = lastBatteryStates.reduce((acc, value) => acc + value, 0); + return Math.round(sum / n); +} + +function queueDraw() { + if (drawTimeout) + clearTimeout(drawTimeout); + + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, queueMillis - (Date.now() % queueMillis)); +} + + +//// main running sequence //// + +// Show launcher when middle button pressed, and widgets that we're clock +Bangle.setUI({ + mode: "clock", + remove: function() { + Bangle.removeListener('lcdPower', updateState); + Bangle.removeListener('lock', updateState); + Bangle.removeListener('charging', draw); + + // We clear drawTimout after removing all listeners, because they can add one again + if (drawTimeout) + clearTimeout(drawTimeout); + + drawTimeout = undefined; + require("widget_utils").show(); + } +}); + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower', updateState); +Bangle.on('lock', updateState); +Bangle.on('charging', draw); // Immediately redraw when charger (dis)connected + +updateState(); +draw(); diff --git a/apps/cc_astro/app_icon.js b/apps/cc_astro/app_icon.js new file mode 100644 index 0000000000..5c8e704bf1 --- /dev/null +++ b/apps/cc_astro/app_icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+If4AxlYALFkQOaFqITlDQ5FpJDgZUCY2s1mBeJB5bCI1W64ABDhAyKGB4PHwIvCRSgwNCw4HBwOBqxJVGBguHdrTOSCJLtMGA4QXFgYAFJywuPayIgTUyIwWFzIcPCTBhQAogLFAowuVJqRecEiQKQAAUqv1+qhgSAhQvMqnSAAWoF7iOMFwYABMI1KpQvflQvFvwMEku53MlF/6PVlS/GFwYqVd5heFd6wvNSQQABBQ4vaGBQAIlYkVF7IFiFyCuMFJgwORopMOGDIuHEJkHjkjjkHHpQxIBJBeNisjAAMcLJYnBAArDTAAReBAATsUFykAhwuCirsTFyowCisVCg4xQYZwWRC5jDQDKbpGeJapSLBYqDB5rYaDCQZWIyxHYDaaXMGKjHOFrjtKeRwA/AE4A=")) \ No newline at end of file diff --git a/apps/cc_astro/app_icon.png b/apps/cc_astro/app_icon.png new file mode 100644 index 0000000000..a00a36b9cc Binary files /dev/null and b/apps/cc_astro/app_icon.png differ diff --git a/apps/cc_astro/metadata.json b/apps/cc_astro/metadata.json new file mode 100644 index 0000000000..54f3fd8697 --- /dev/null +++ b/apps/cc_astro/metadata.json @@ -0,0 +1,21 @@ +{ "id": "cc_astro", + "name": "CC Astro", + "shortName": "CC-Astro", + "version": "0.01", + "description": "A clock with planets as clock hands", + "icon": "app_icon.png", + "type": "clock", + "tags": "clock,astro,planets,earth,venus,mercury,sun", + "supports" : ["BANGLEJS2"], + "screenshots": [ + {"url":"screenshot1.png"}, + {"url":"screenshot2.png"}, + {"url":"screenshot3.png"} + ], + "readme": "README.md", + "storage": [ + {"name": "cc_astro.app.js", "url": "app.js"}, + {"name": "cc_astro.img", "url": "app_icon.js", "evaluate":true} + ], + "data": [{"name":"cc_astro.json"}] +} diff --git a/apps/cc_astro/screenshot1.png b/apps/cc_astro/screenshot1.png new file mode 100644 index 0000000000..e93e44ce00 Binary files /dev/null and b/apps/cc_astro/screenshot1.png differ diff --git a/apps/cc_astro/screenshot2.png b/apps/cc_astro/screenshot2.png new file mode 100644 index 0000000000..ec56c599e1 Binary files /dev/null and b/apps/cc_astro/screenshot2.png differ diff --git a/apps/cc_astro/screenshot3.png b/apps/cc_astro/screenshot3.png new file mode 100644 index 0000000000..ce43bc54f2 Binary files /dev/null and b/apps/cc_astro/screenshot3.png differ diff --git a/apps/cc_clock24/ChangeLog b/apps/cc_clock24/ChangeLog index c807c40a0b..fd302bca04 100644 --- a/apps/cc_clock24/ChangeLog +++ b/apps/cc_clock24/ChangeLog @@ -1,3 +1,4 @@ 0.01: copied from andark (V0.08) refactored add 24 hour mode +0.02: fix icon + screenshots diff --git a/apps/cc_clock24/README.md b/apps/cc_clock24/README.md index 84b1fa874f..17d9e7fd3d 100644 --- a/apps/cc_clock24/README.md +++ b/apps/cc_clock24/README.md @@ -1,4 +1,4 @@ -# Analog Clock With 24 hour hands +# Analog Clock With Optional 24 hour hands ## Features @@ -7,7 +7,7 @@ * battery percentage (showing charge status with color) * turned off or swipeable widgets (choose in settings) -![logo](cc_clock24_screen.png) +![logo](screenshot1.png) ## Settings diff --git a/apps/cc_clock24/app_icon.js b/apps/cc_clock24/app_icon.js index b213fe5c8f..def5ee8ac2 100644 --- a/apps/cc_clock24/app_icon.js +++ b/apps/cc_clock24/app_icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgIEBoUAiAKCgUCBQUEColEAYUQhAmKCwgeCAAcCgEDjwEBkEAg8TBocNgYFDh8GAYMDxkPjEA8EAwkHJgIcBAoPfAoYWCBYYFIgfvAoX4FYRJEAp9gAomYNAOAArPwAogAC4AFiRoIFJLgIFJuADCg//Q4U//4FDj4FEAAV4Aoi0CSxBsCA==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4P/AoP//8MhFxhFEsUEhFwxgFBgUEnGEoVigMCjAFCwGCjlEkVioArFgEMuEDg0YgEe+EHw0IgAeBgGOCYMGiEBywFBhkggc2wEAjHAg0eFIMwAoMGFIIjCwAgBAB/AAonwAol4AokZ84GElA9BAAVoAodA5AFDmOIAocJhoFDgPjIJ84BgtwgQFD/hpBAoU/wfgKYUP+JcDgP+vgYDn7ZCAAMH/4zBGoX/DAI1Cj/8B4MeD4IYBgMTD4Xw/ILBB4IFESgMBiRRDgILDCYPMAof4XJQA=")) \ No newline at end of file diff --git a/apps/cc_clock24/app_icon.png b/apps/cc_clock24/app_icon.png new file mode 100644 index 0000000000..2fbaa7af77 Binary files /dev/null and b/apps/cc_clock24/app_icon.png differ diff --git a/apps/cc_clock24/cc_clock24_icon.png b/apps/cc_clock24/cc_clock24_icon.png deleted file mode 100644 index cded02071d..0000000000 Binary files a/apps/cc_clock24/cc_clock24_icon.png and /dev/null differ diff --git a/apps/cc_clock24/metadata.json b/apps/cc_clock24/metadata.json index e450893b7a..3512b3baea 100644 --- a/apps/cc_clock24/metadata.json +++ b/apps/cc_clock24/metadata.json @@ -1,18 +1,18 @@ { "id": "cc_clock24", "name": "CC Clock 24", - "shortName":"CC-Clock24", - "version":"0.01", + "shortName": "CC-Clock24", + "version": "0.02", "description": "analog clock face with 24 hour pointer", - "icon": "cc_clock24_icon.png", + "icon": "app_icon.png", "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], - "screenshots": [{"url":"cc_clock24_screen.png"}], + "screenshots": [{"url": "screenshot1.png"}, {"url": "screenshot2.png"}, {"url": "screenshot3.png"}], "readme": "README.md", "storage": [ - {"name":"cc_clock24.app.js","url":"app.js"}, - {"name":"cc_clock24.settings.js","url":"settings.js"}, - {"name":"cc_clock24.img","url":"app_icon.js","evaluate":true} + {"name": "cc_clock24.app.js", "url": "app.js"}, + {"name": "cc_clock24.settings.js", "url": "settings.js"}, + {"name": "cc_clock24.img", "url": "app_icon.js", "evaluate": true} ], - "data": [{"name":"cc_clock24.json"}] + "data": [{"name": "cc_clock24.json"}] } diff --git a/apps/cc_clock24/screenshot1.png b/apps/cc_clock24/screenshot1.png new file mode 100644 index 0000000000..60936a563b Binary files /dev/null and b/apps/cc_clock24/screenshot1.png differ diff --git a/apps/cc_clock24/screenshot2.png b/apps/cc_clock24/screenshot2.png new file mode 100644 index 0000000000..c0b3bae03e Binary files /dev/null and b/apps/cc_clock24/screenshot2.png differ diff --git a/apps/cc_clock24/cc_clock24_screen.png b/apps/cc_clock24/screenshot3.png similarity index 100% rename from apps/cc_clock24/cc_clock24_screen.png rename to apps/cc_clock24/screenshot3.png diff --git a/apps/cc_clock24/settings.js b/apps/cc_clock24/settings.js index 4aa19215d1..483c0e6f44 100644 --- a/apps/cc_clock24/settings.js +++ b/apps/cc_clock24/settings.js @@ -5,7 +5,7 @@ shortHrHand : false, show24HourMode : false } - let settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1) || {}); + let settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json', 1) || {}); const save = () => require('Storage').write('cc_clock24.json', settings); @@ -13,19 +13,19 @@ '': {title: 'cc_clock24'}, '< Back': back, /*LANG*/'Load widgets': { value : !!settings.loadWidgets, - onchange : v => { settings.loadWidgets=v; save();} + onchange : v => { settings.loadWidgets = v; save();} }, /*LANG*/'Text above hands': { value : !!settings.textAboveHands, - onchange : v => { settings.textAboveHands=v; save();} + onchange : v => { settings.textAboveHands = v; save();} }, /*LANG*/'Short hour hand': { value : !!settings.shortHrHand, - onchange : v => { settings.shortHrHand=v; save();} + onchange : v => { settings.shortHrHand = v; save();} }, /*LANG*/'Show 24 hour mode': { value : !!settings.show24HourMode, - onchange : v => { settings.show24HourMode=v; save();} + onchange : v => { settings.show24HourMode = v; save();} }, };