diff --git a/apps/approxclock/ChangeLog b/apps/approxclock/ChangeLog new file mode 100644 index 000000000..9ba3e983a --- /dev/null +++ b/apps/approxclock/ChangeLog @@ -0,0 +1,4 @@ +0.1: Initial release +0.2: Added more descriptive approximations +0.2f: Bug fixes: Incorrect hour drawn after 50 mins, incorrect quarter minute drawn after 50 mins +0.3: Added touch interaction to display exact time and date. \ No newline at end of file diff --git a/apps/approxclock/app-icon.js b/apps/approxclock/app-icon.js new file mode 100644 index 000000000..d63ad4b1f --- /dev/null +++ b/apps/approxclock/app-icon.js @@ -0,0 +1 @@ +atob("MDAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArgVYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABW19cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrNcrAACBVoGsVgAAgVaBrFYAAKzXK4GsKwAAgayBAAAAgVYAVoEAAAAAAAAAAADXVqyBAACs14Gs1ysArNeBrNcrAIHX14HXgQCB14HXrAAAVtdW11YAAAAAAAAAAFbXK4GsAACs1wAr11YArNcAK9dWAADXrABWVgDXgQCB1wAAAKzXgQAAAAAAAAAAAKzXrNfXKwCs1wAA14EArKwAK9dWAADXVgAAAADXgQBW1ysAAIHXVgAAAAAAAAAAANfXgYHXVgCs11aB11YArNcrgddWACvXgSsAAACsrCus1wAAK9es1ysAAAAAAAAAK9dWAACsrACsrKzXrAAArKzX16wAVtfX16wAAAAr19fXKwAArKwArKwAAAAAAAAAAAAAAAAAAACsrAArAAAArIEAKwAAAAAAAAAAAAAAACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrAAAAAAArIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWVgAAAAAAVlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArVoErAAAAAAAAAAAAAAAAAAAAAAArVgAAAAAAAAAAAAAAAAAAAAAAAAArrNfXgQCBrNdWAAAAAAAAAAAAAAAAAAAAAABW1wAAAAAAAAAAAAAAAAAAAAAAACvXrCtWgQAAANdWAAAAAAArKwAAAAAAACsAAABW1wAAAAAAAAAAAAAAAAAAAAAAAFbXKwAAAAAAANdWAAAAAIHX16wAAACB19fXVgBW1wAA14EAAAAAAAAAAAAAAAAAAIGsAAAAAAAAANdWAAAAK9eBVteBACvXgSuBVgBW1wBW1ysAAAAAAAAAAAAAAAAAAIHXAAAAAAAAANdWAAAAVtcrAKyBAFbXKwAAAABW16zX1wAAAAAAAAAAAAAAAAAAAFbXVgAAAAAAANeBAAAAVtcrANeBAFbXKwAAAABW14HXrAAAAAAAAAAAAAAAAAAAAACs14GBrAAAAKzXrIEAK9esrNdWACvX14GBVgBW1wAr11YAAAAAAAAAAAAAAAAAAAAAVoGBgQAAACusrIEAACusrFYAAAArgaysVgBWgQAAgYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") \ No newline at end of file diff --git a/apps/approxclock/app.js b/apps/approxclock/app.js new file mode 100644 index 000000000..4f0bb570a --- /dev/null +++ b/apps/approxclock/app.js @@ -0,0 +1,156 @@ +//load fonts +require("FontSinclair").add(Graphics); +require("FontTeletext5x9Ascii").add(Graphics); + +//const + +const numbers = { + "0": "Twelve", + "1": "One", + "2": "Two", + "3": "Three", + "4": "Four", + "5": "Five", + "6": "Six", + "7": "Seven", + "8": "Eight", + "9": "Nine", + "10": "Ten", + "11": "Eleven", + "12": "Twelve", + "13": "One", + "14": "Two", + "15": "Three", + "16": "Four", + "17": "Five", + "18": "Six", + "19": "Seven", + "20": "Eight", + "21": "Nine", + "22": "Ten", + "23": "Eleven", + "24": "Twelve", +}; + +const minutesByQuarterString = { + 0: "O'Clock", + 15: "Fifteen", + 30: "Thirty", + 45: "Fourty-Five" +}; + +const width = g.getWidth(); +const height = g.getHeight(); +let drawTimeout; + +const getNearestHour = (hours, minutes) => { + if (minutes > 54) { + return hours + 1; + } + return hours; +}; + +const getApproximatePrefix = (minutes, minutesByQuarter) => { + if (minutes === minutesByQuarter) { + return " exactly"; + } else if (minutesByQuarter - minutes < -54) { + return " nearly"; + } else if (minutesByQuarter - minutes < -5) { + return " after"; + } else if (minutesByQuarter - minutes < 0) { + return " just after"; + } else if (minutesByQuarter - minutes > 5) { + return " before"; + } else { + return " nearly"; + } +}; + +const getMinutesByQuarter = minutes => { + if (minutes < 10) { + return 0; + } else if (minutes < 20) { + return 15; + } else if (minutes < 40) { + return 30; + } else if (minutes < 55) { + return 45; + } else { + return 0; + } +}; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + drawTime(); + }, 60000 - (Date.now() % 60000)); +} + +const drawTimeExact = () => { + var dateTime = Date(); + var hours = dateTime.getHours(); + var minutes = dateTime.getMinutes().toString().padStart(2,0); + var day = dateTime.getDay(); + var date = dateTime.getDate(); + var month = dateTime.getMonth(); + var year = dateTime.getFullYear(); + g.clear(); + g.setBgColor(0,0,0); + g.clearRect(0,0,width, height); + g.setColor(1,1,1); + g.setFont("Vector", 30); + g.drawString(hours + ":" + minutes, (width - g.stringWidth(hours + ":" + minutes))/2, height * 0.3, false); + g.setFont("Vector", 26); + g.drawString(month + 1 + "/" + date + "/" + year, (width - g.stringWidth(month + 1 + "/" + date + "/" + year))/2, height * 0.6, false); +}; + +const drawTime = () => { + //Grab time vars + var date = Date(); + var hour = date.getHours(); + var minutes = date.getMinutes(); + var minutesByQuarter = getMinutesByQuarter(minutes); + + //reset graphics + g.clear(); + g.reset(); + + //Build watch face + g.setBgColor(0, 0, 0); + g.clearRect(0, 0, width, height); + g.setFont("Vector", 22); + g.setColor(1, 1, 1); + g.drawString("It's" + getApproximatePrefix(minutes, minutesByQuarter), (width - g.stringWidth("It's" + getApproximatePrefix(minutes, minutesByQuarter))) / 2, height * 0.25, false); + g.setFont("Vector", 30); + g.drawString(numbers[getNearestHour(hour, minutes)], (width - g.stringWidth(numbers[getNearestHour(hour, minutes)])) / 2, height * 0.45, false); + g.setFont("Vector", 22); + g.drawString(minutesByQuarterString[minutesByQuarter], (width - g.stringWidth(minutesByQuarterString[minutesByQuarter])) / 2, height * 0.7, false); + + queueDraw(); +}; + +g.clear(); +drawTime(); + +Bangle.on('lcdPower', function (on) { + if (on) { + drawTime(); + } else { + if (idTimeout) { + clearTimeout(idTimeout); + } + } +}); + +Bangle.on('touch', function(button, xy){ + drawTimeExact(); + setTimeout(drawTime, 7000); +}); + +// Show launcher when button pressed +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/approxclock/app.png b/apps/approxclock/app.png new file mode 100644 index 000000000..a5fd8db83 Binary files /dev/null and b/apps/approxclock/app.png differ diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json new file mode 100644 index 000000000..80e476e5b --- /dev/null +++ b/apps/approxclock/metadata.json @@ -0,0 +1,18 @@ +{ "id": "approxclock", + "name": "Approximate Clock", + "shortName" : "Approx Clock", + "version": "0.3", + "icon": "app.png", + "description": "A really basic spelled out time display for people looking for the vague time at a glance.", + "readme": "readme.md", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"approxclock.app.js","url":"app.js"}, + {"name":"approxclock.img","url":"app-icon.js","evaluate":true} + ], + "screenshots": [ + {"url": "screenshot.png"} + ] +} diff --git a/apps/approxclock/readme.md b/apps/approxclock/readme.md new file mode 100644 index 000000000..aa1b74267 --- /dev/null +++ b/apps/approxclock/readme.md @@ -0,0 +1,7 @@ +## Approximate Clock + +### Description + +Get a rough idea of the time at a quick glance, mostly made for myself based on a similar watchface on pebble. I find this keeps me from checking my watch too often and also saves me from moments of severe brainfart staring at these mysterious symbols we call numbers. + +Exact time and date can be viewed temporarily by touching the screen. \ No newline at end of file diff --git a/apps/approxclock/screenshot.png b/apps/approxclock/screenshot.png new file mode 100644 index 000000000..fe13bbe33 Binary files /dev/null and b/apps/approxclock/screenshot.png differ