diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 7e148381b..54743d945 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -1,5 +1,19 @@ +var SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); +const storage = require('Storage'); +const locale = require("locale"); +const SETTINGS_FILE = "pastel.json"; // XXX +const LOCATION_FILE = "mylocation.json"; const h = g.getHeight(); const w = g.getWidth(); +let settings; +let location; + +// variable for controlling idle alert +let lastStep = getTime(); +let warned = 0; +let idle = false; +let IDLE_MINUTES = 26; + // palette for 0-40% const pal1 = new Uint16Array([g.theme.bg, g.toColor("#020"), g.toColor("#0f0"), g.toColor("#00f")]); // palette for 50-100% @@ -9,8 +23,8 @@ const infoHeight = 14; var drawingSteps = false; -function debug(o) { - //console.log(o); +function log_debug(o) { + print(o); } var p0_img = { @@ -111,13 +125,6 @@ var p100_img = { buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVAAVUFUgpDAAdAFMEBFQ4ABqBVnLMQqLFjzWEABLgbVgohEGoqyaiofDBihWVHJpYYDgYPbKxz5NLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; -// 300 -Graphics.prototype.setFontRoboto18 = function(scale) { - // Actual height 18 (17 - 0) - this.setFontCustom(atob("AAAAAAAAAAAAAAAf8Qf8QAAAAAA+AAAAA+AAAAAAAABGABGwB/wf2AZGABHwD/AfGABGAAAADhwHw4MYIYIM4MOMMIGGYDDwAAAAAAPAAQgAQggZjAPOAAYABjgDPwEIQAIQAHwADAAAAAHgPMwZwQQwQR8QfGQODwADgAPwAAQAAA+AAAAAAAAA/wD/8OAHYABAAAQAAYABOAOD/8AfgAAAGAAGQACwAfgAfgACwAGAAAAAAAAAYAAYAAYAH/gH/gAYAAYAAYAAAAAAAAA8AAQAIAAIAAIAAIAAIAAAAAAQAAQAAAAAIAB4AHAA8AHgAeAAQAAAAAH/AOBgYAQQAQQAQYAQODwH/AAAAAAAEAAMAAIAAYAAf/wAAAAAAAAAAAAAAAOAQMBwYDQQGQQMQYYQPwQHAQAAAAAAGDgMAwYQQQQQQQQY4QPtwHHgAAAACAAOAAeAByADCAOCAf/wf/wACAACAAAAABAfxgcgwQgQQgQQgQQwwQfgAAAAAAB/AH7gMgwZgQZgQQgQQxwAfgAAAQAAQAAQAQQBwQHgQcARwAfAAcAAAAAAAAHHgPswYwQQQQQQQY4QPswHHgAAAAAAHwAMYQYMQQEQQEwYIgPfAH+AAAAAAADAQBAQAAAAAADA8BAQAAAAAAAYAAcAA0AAmABiABDADDAAAAAAAAkAAmAAmAAmAAmAAmAAmAAkAAAAAAADDABDABiAAmAA0AAcAAYAAIAAAAMAAYAAQGQQcQYwAPgAGAAAAAAfwBwcGAGEACIPzI4RZgRZARZBhY/zIAQMAQGAwD/gAeAAAQADwAfAB+APGAcGAPGAD2AAeAAHwAAwAAAf/wf/wQQQQQQQQQYQQYwwP5wHPgAAAAAAD+APvgIAwYAQQAQQAQQAQYAwODgCDAAAAAAAf/wf/wQAQQAQQAQYAQYAwMBgH/AB8AAAAAAAf/wf/wQQQQQQQQQQQQQQQQQQQAQAAAf/wf/wQQAQQAQQAQQAQQAQQAQAAAAAD+AP/gIAwYAQQAQQIQQIQYIQOIwGPgAAAAAAf/wf/wAQAAQAAQAAQAAQAAQAAQAf/wAAAAAAAAAAAAf/wAAAAAAAAAADgAAwAAQAAQAAQAAwf/gf+AAAAAAAf/wf/wAYAAwAB4ADMAGHAMBgYAwAAQAAAf/wf/wAAQAAQAAQAAQAAQAAQAAAf/wf/wOAADwAA8AAHgABwADwAOAB4AHgAeAAf/wAAAAAAAAAf/wf/wOAAHAABwAA4AAOAAHAABwf/wAAAAAAAAAD+APHgIAwYAQQAQQAQQAQYAwODgD/AAAAAAAf/wf/wQIAQIAQIAQIAYYAIQAPwAAAAAAAD+APDgIAwYAQQAQQAQYAQYA4ODsD/EAAAAAAf/wf/wQIAQIAQIAQYAYeAMzgHgwAAQAAAHDgPgwYwQQwQQQQQYQYYQMNwGHgAAAQAAQAAQAAQAAYAAf/wQAAQAAQAAQAAAAAAAAf/Af/gAAwAAQAAQAAQAAQAAwf/gf+AAAAYAAeAAHwAA+AAHgAAwAHwAeADwAeAAYAAQAAfAAD8AAPwABwAPgD4AfAAeAAHwAAfAADwAHwD+AfgAYAAAAAYAwMBgHHAB8AA4AB8AHHAMBgYAwAAAQAAcAAHAADgAA4AAfwA4ADgAOAAYAAAAAAAAQAwQDwQGQQcQQwQRgQXAQcAQYAQAAAAAA//////wABQAAeAAHgAA8AAPAAB4AAIwABwAD///AAAAAABwAHAAcAAOAADgAAwAAAIAAIAAIAAIAAIAAIAAIAAIAAAwAAYAAIAAAAAAAAAngBmwDMQCMQDMQDMwB/wAAQAAAAAA//wf/wBAQDAQDAQDAQBxwA/AAAAAAAA/gBhwDAQCAQDAQDAQBxgARAAAAA/ABxwDAQDAQDAQBAQf/w//wAAAAAAA/gBtwDMQDMQDMQDMQB8wAYAAAADAAf/w7AAzAAwAAAAAA/ABxyDATDARDARBAzB/+D/8AAAAAA//wf/wBAADAADAADAAB/wA/wAAAAAAT/wT/wAAAAABT//T/8AAAAAA//wf/wAMAAeAAzABhgDAwAAQAAAf/w//wAAAAAAD/wB/wBAADAADAADAAB/wB/wBAADAADAADAAB/wA/wAAAAAAD/wB/wBAADAADAADAAB/wA/wAAAAAAA/gBhwDAQDAQDAQDAQBhwA/gAEAAAAD//B//BAQDAQDAQDAQBxwA/AAAAAAAA/ABxwDAQCAQDAQBAQB//D//AAAAAAD/wB/wBAADAADAAAAABxgB4wDMQCMQDEQBGwBjgAAADAADAAP/wDAQDAQAAAAAAD/gB/wAAQAAQAAQAAwD/wD/wAAADAADwAAeAADwABwAHgA8ADgAAAAAAAD4AAfAADwAHwA+ADwAB4AAPAABwAHwB8ADgAAAAAAADAwBxgAfAAOAA7ABhwDAwAAADAADwBAeDAH+AB8AHgA8ADgAAAAAAADAwDBwDHQDMQD4QDgQDAQAAAAIAAMAH/wfz+wACgADAAAf/8f/8AAAgADwAGfz8D/wAMAAAAAAAAMAAcAAQAAQAAYAAMAAEAAEAAEAAYAAA"), 32, atob("BAQFCgoNCwMGBggKAwUEBwoKCgoKCgoKCgoEBAkKCQgQCwsMDAoKDA0FCgsJEA0MCwwLCwsMCxALCwsEBwQHCAUKCgkKCQYKCgQECQQQCgoKCgYJBgoJDgkJCQYEBgwA"), 18+(scale<<8)+(1<<16)); - return this; -} - // https://www.1001fonts.com/rounded-fonts.html?page=3 Graphics.prototype.setFontBloggerSansLight46 = function(scale) { // Actual height 46 (45 - 0) @@ -125,12 +132,22 @@ Graphics.prototype.setFontBloggerSansLight46 = function(scale) { return this; }; +Graphics.prototype.setFontRoboto20 = function(scale) { + // Actual height 21 (20 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAH/zA/+YAAAAAAAHwAAwAAHwAA+AAAAAAAAAAAQACDAAYbADP4B/8A/zAGYZADH4A/+A/7AHYYADCAAAAAAAQAeHgH4eBzgwMMHnhw88GGBw4wHj+AcPgAAAAAAAAAAB4AA/gAGMAAwhwGMcAfuABzgABzgAc+AOMYBhBAAMYAB/AAHwAAAAAHwD5+A/8YGPDAw8YGPzA/HYD4fAADwAB/AAOYAABAAAAHwAA4AAAAAAAAAAH/gD//B8A+cAA7AADAAAAAAAYAAbwAHHgHwf/4A/8AAAAEAABiAAGwAA8AA/AAH+AAGwAByAAEAAAAAAAMAABgAAMAABgAH/wA/+AAMAABgAAMAABgAAAAAAAIAAfAADwAAAABgAAMAABgAAMAABgAAAAAAAAAAAAADAAAYAAAAAAAAADgAB8AB+AA+AA+AA/AAHAAAgAAAAAAB8AB/8Af/wHAHAwAYGADAwAYHAHAf/wB/8AAAAAAAAAAABgAAcAADAAAYAAH//A//4AAAAAAAAAAAAAAAAAAAAABwDAeA4HAPAwHYGBzAwcYHHDAfwYB8DAAAYAAAAAAABgOAcBwHADAwwYGGDAwwYHPHAf/wB58AAAAAAAAADAAB4AAfAAPYAHjAB4YA8DAH//A//4AAYAADAAAAAAAAAEMA/xwH+HAxgYGMDAxgYGODAw/4GD+AAHAAAAAAAAAf8AP/wD2HA5wYGMDAxgYGOHAA/wAD8AAAAAAAAAAAGAAAwAAGADAwB4GB+Aw+AGfAA/gAHwAAwAAAAAAADAB5+Af/wHPDAwwYGGDAwwYHPHAfvwB58AAAAAAAAAAAB+AAf4AHDjAwMYGBjAwM4HDOAf/gB/4AAAAAAAAAAAAYDADAYAAAAAAAAAAYDAfAYHwAAAABAAAcAADgAA+AAGwAB3AAMYABjgAYMAAAAAAAAAAAAAAABmAAMwABmAAMwABmAAMwABmAAMwAAiAAAAAAAAAYMADjgAMYAB3AAGwAA2AADgAAcAABAAAAAAAAAMAADgAA4AAGBzAweYGHAA/wAD8AAEAAAAwAB/4A/PwOAGDgAYYPxmH/Mw4ZmMDMxgZmM+Mx/5mHDAYAIDgDAPBwAf8AAMAAAAAAAYAAfAAPwAP4AH+AH4wA8GAH4wAP2AAPwAAfwAAfAAAYAAAAAAAAAAA//4H//AwwYGGDAwwYGGDAwwYH/HAf/wB58AAAAADAAH/AD/+AcBwHADAwAYGADAwAYGADA4A4DweAODgAAAAAAAAAAAAAAH//A//4GADAwAYGADAwAYGADAYAwD4+AP/gAfwAAAAAAAAAAAH//A//4GDDAwYYGDDAwYYGDDAwYYGCDAgAYAAAAAAAH//A//4GDAAwYAGDAAwYAGDAAwYAGAAAAAAAAAAH/AD/8AcBwHAHAwAYGADAwYYGDDA4YYDz/AOfwAAAAAAAAAAA//4H//A//4ADAAAYAADAAAYAADAAAYAADAA//4H//AAAAAAAAAAAAAAA//4H//AAAAAAAAABAAAeAAB4AADAAAYAADAAAYAAHA//wH/8AAAAAAAAAAAAAAA//4H//AAcAAPAAD4AA/wAOPADg8A4B4GAHAgAYAAAAAAAH//A//4AADAAAYAADAAAYAADAAAYAADAAAAAAAA//4H//A+AAB+AAD8AAD8AAH4AAPAAH4AH4AD8AD8AA+AAH//A//4AAAAAAAH//A//4H//AeAAB8AADwAAPgAAeAAA8AADwH//A//4AAAAAAAAAAAH/AB/8AeDwHAHAwAYGADAwAYGADA4A4DweAP/gA/4AAAAAAAAAAAH//A//4GBgAwMAGBgAwMAGBgAwcAH/AAfwAA8AAAAAA/4AP/gDgOA4A4GADAwAYGADAwAYHAHgeD+B/8wD+GAAAAAAAAAAA//4H//AwYAGDAAwYAGDgAweAHH8Afz4B8HAAAIAAYAPDwD8OA5w4GGDAwwYGHDAwYYHDnAePwBw8AAAAGAAAwAAGAAAwAAGAAA//4H//AwAAGAAAwAAGAAAwAAAAAAAAAH/4A//wAAPAAAYAADAAAYAADAAAYAAPA//wH/8AAAAAAAAgAAHAAA/AAB/AAD+AAD+AAD4AAfAAfwAfwAfwAH4AA4AAEAAA+AAH/AAH/gAD/AAD4AD+AH+AH8AA+AAH+AAD+AAD/AAD4AH/AP/AH+AA8AAAAAAAAAGADA4A4HweAPPgA/wAB8AAfwAPvgDweA8B4GADAAAIGAAA4AAHwAAPgAAfAAA/4AH/AD4AB8AA+AAHgAAwAAAAAAAAAGADAwB4GAfAwPYGDzAx4YGeDA/AYHwDA4AYGADAAAAAAAA///3//+wAA2AAGAAAGAAA+AAD8AAD8AAD4AAH4AAHgAAMAAAAwAA2AAG///3//+AAAAAAAAAAAOAAHwAD4AA8AAD8AADwAAGAAAAAAABgAAMAABgAAMAABgAAMAABgAAMAABgAAAEAAAwAADAAAIAAAAAAAAAAEeABn4Ad3ADMYAZjADMYAZmAB/4AP/AAAAAAAA//4H//ABgwAYDADAYAYDADg4AP+AA/gABwAAAAAAAAA/gAP+ADg4AYDADAYAYDADAYAOOABxwAAAAAEAAH8AB/wAcHADAYAYDADAYAcDA//4H//AAAAAAAAAAAAH8AB/wAdnADMYAZjADMYAZjAB84AHmAAMAAMAABgAB//gf/8HMAAxgAGIAAAAAAH8IB/zAcHMDAZgYDMDAZgcHcD//Af/wAAAAAAAAAAH//A//4AMAADAAAYAADAAAcAAD/4AP/AAAAAAAAAAAGf/Az/4AAAAAAAAAAMz//mf/4AAAAAAAAAAH//A//4ABwAAeAAH4ABzwAcPACAYAABAAAAAAAA//4H//AAAAAAAAAAAAf/AD/4AMAADAAAYAADAAAcAAD/4AP/ABgAAYAADAAAYAADgAAP/AA/4AAAAAAAAf/AD/4AMAADAAAYAADAAAcAAD/4AP/AAAAAAAAAAAAH8AB/wAcHADAYAYDADAYAYDADx4AP+AA/gAAAAAAAAf/8D//gYDADAYAYDADAYAcHAB/wAH8AAEAAAAAAEAAH8AB/wAcHADAYAYDADAYAYDAD//gf/8AAAAAAAAAAAf/AD/4AcAADAAAYAACAAAAEAB5wAfnADMYAZjADGYAYzADn4AOeAAAAAAAADAAAYAAf/wD//ADAYAYDAAAAAAAAD/gAf/AAA4AADAAAYAADAAAwAf/AD/4AAAAAAAAYAAD4AAP4AAP4AAPAAH4AH4AD8AAcAAAAAAQAADwAAf4AAf4AAPAAP4AP4ADwAAfgAA/gAA/AAD4AH+AD+AAeAAAAAAAAACAYAcHADzwAH8AAfAAH8ADx4AcHACAIAcAMD4BgP4MAP/AAPwAP4AP4AD4AAcAAAAAAAAADAYAYHADD4AY7ADOYAfjADwYAcDADAYAAAAADAAA4AH//B/v8cABzAACAAAH//w//+AAAAAAACAACcAAx/n+H//AA4AAHAAAAAAAAAAAAAOAADgAAYAADAAAcAABgAAGAAAwAAGAADwAAcAAAAA"), 32, atob("BQUHDQwPDQQHBwkMBAYGCQwMDAwMDAwMDAwFBAsMCwoTDg0ODgwMDg8GDA0LEg8ODQ4NDA0ODRMNDQ0GCQYJCQYLDAsMCwcMDAUFCwUSDAwMDAcLBwwKEAoKCgcFBw4A"), 21+(scale<<8)+(1<<16)); + return this; +} + +function setSmallFont20() { + g.setFontRoboto20(); +} + function setLargeFont() { g.setFontBloggerSansLight46(1); } function setSmallFont() { - g.setFontRoboto18(1); + g.setFont('Vector', 16); } function getSteps() { @@ -144,8 +161,70 @@ function getSteps() { } } +/////////////// sunrise / sunset ///////////////////////////// + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.grid = settings.grid||false; + settings.font = settings.font||"Lato"; + settings.idle_check = settings.idle_check||true; +} + +// 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"; +} + +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"; +var drawCount = 0; + +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); +} + +const infoData = { + ID_DATE: { calc: () => {var d = (new Date()).toString().split(" "); return d[2] + ' ' + d[1] + ' ' + d[3];} }, + ID_DAY: { calc: () => {var d = require("locale").dow(new Date()).toLowerCase(); return d[0].toUpperCase() + d.substring(1);} }, + ID_SR: { calc: () => 'Sunrise: ' + sunRise }, + ID_SS: { calc: () => 'Sunset: ' + sunSet }, + ID_STEP: { calc: () => 'Steps: ' + getSteps() }, + ID_BATT: { calc: () => 'Battery: ' + E.getBattery() + '%' } +}; + +const infoList = Object.keys(infoData).sort(); +let infoMode = infoList[0]; + +function nextInfo() { + let idx = infoList.indexOf(infoMode); + if (idx > -1) { + if (idx === infoList.length - 1) infoMode = infoList[0]; + else infoMode = infoList[idx + 1]; + } +} + +function prevInfo() { + let idx = infoList.indexOf(infoMode); + if (idx > -1) { + if (idx === 0) infoMode = infoList[infoList.length - 1]; + else infoMode = infoList[idx - 1]; + } +} + function getGaugeImage(p) { - //debug("p="+p); if (p < 2) return p0_img; if (p >= 2 && p < 4) return p2_img; if (p >= 4 && p < 7) return p4_img; @@ -163,6 +242,14 @@ function getGaugeImage(p) { } function draw() { + if (!idle) + drawClock(); + else + drawIdle(); + queueDraw(); +} + +function drawClock() { var date = new Date(); var timeStr = require("locale").time(date,1); var da = date.toString().split(" "); @@ -171,7 +258,6 @@ function draw() { var mm = da[4].substr(3,2); var steps = getSteps(); var p_steps = Math.round(100*(steps/10000)); - debug("steps="+ steps + " p_steps=" + p_steps); g.reset(); g.setColor(g.theme.bg); @@ -187,9 +273,14 @@ function draw() { g.setFontAlign(-1,0); // left aligned g.drawString(mm, (w/2) + 1, h/2); - drawSteps(); - g.drawString('Battery ' + E.getBattery() + '%', w/2, h/4); - queueDraw(); + setSmallFont(); + g.setFontAlign(0,0); // left aligned + g.drawString((infoData[infoMode].calc()), w/2, (3*h/4) - 4); + + // recalc sunrise / sunset every hour + if (drawCount % 60 == 0) + updateSunRiseSunSet(new Date(), location.lat, location.lon); + drawCount++; } function drawSteps() { @@ -205,11 +296,142 @@ function drawSteps() { drawingSteps = false; } +/* Bangle.on('step', s => { drawSteps(); }); +*/ +///////////////// IDLE TIMER ///////////////////////////////////// + +function drawIdle() { + let mins = Math.round((getTime() - lastStep) / 60); + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + g.setColor(g.theme.fg); + setSmallFont20(); + g.setFontAlign(0, 0); + g.drawString('Last step was', w/2, (h/3)); + g.drawString(mins + ' minutes ago', w/2, 20+(h/3)); + dismissBtn.draw(); +} + +/////////////// BUTTON CLASS /////////////////////////////////////////// + +// simple on screen button class +function BUTTON(name,x,y,w,h,c,f,tx) { + this.name = name; + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.color = c; + this.callback = f; + this.text = tx; +} + +// if pressed the callback +BUTTON.prototype.check = function(x,y) { + //console.log(this.name + ":check() x=" + x + " y=" + y +"\n"); + + if (x>= this.x && x<= (this.x + this.w) && y>= this.y && y<= (this.y + this.h)) { + log_debug(this.name + ":callback\n"); + this.callback(); + return true; + } + return false; +}; + +BUTTON.prototype.draw = function() { + g.setColor(this.color); + g.fillRect(this.x, this.y, this.x + this.w, this.y + this.h); + g.setColor("#000"); // the icons and boxes are drawn black + setSmallFont20(); + g.setFontAlign(0, 0); + g.drawString(this.text, (this.x + this.w/2), (this.y + this.h/2)); + g.drawRect(this.x, this.y, (this.x + this.w), (this.y + this.h)); +}; + +function dismissPrompt() { + idle = false; + warned = false; + lastStep = getTime(); + Bangle.buzz(100); + draw(); +} + +var dismissBtn = new BUTTON("big",0, 3*h/4 ,w, h/4, "#0ff", dismissPrompt, "Dismiss"); + +Bangle.on('touch', function(button, xy) { + var x = xy.x; + var y = xy.y; + // adjust for outside the dimension of the screen + // http://forum.espruino.com/conversations/371867/#comment16406025 + if (y > h) y = h; + if (y < 0) y = 0; + if (x > w) x = w; + if (x < 0) x = 0; + + if (idle && dismissBtn.check(x, y)) return; +}); + +// if we get a step then we are not idle +Bangle.on('step', s => { + lastStep = getTime(); + // redraw if we had been idle + if (idle == true) { + dismissPrompt(); + } + idle = false; + warned = 0; +}); + +function checkIdle() { + log_debug("checkIdle()"); + if (!settings.idle_check) { + idle = false; + warned = false; + return; + } + + let hour = (new Date()).getHours(); + let active = (hour >= 9 && hour < 21); + //let active = true; + let dur = getTime() - lastStep; + + if (active && dur > IDLE_MINUTES * 60) { + drawIdle(); + if (warned++ < 3) { + buzzer(warned); + log_debug("checkIdle: warned=" + warned); + Bangle.setLocked(false); + } + idle = true; + } else { + idle = false; + warned = 0; + } +} + +// timeout for multi-buzzer +var buzzTimeout; + +// n buzzes +function buzzer(n) { + log_debug("buzzer n=" + n); + + if (n-- < 1) return; + Bangle.buzz(250); + + if (buzzTimeout) clearTimeout(buzzTimeout); + buzzTimeout = setTimeout(function() { + buzzTimeout = undefined; + buzzer(n); + }, 500); +} + /////////////////////////////////////////////////////////////////////////////// // timeout used to update every minute @@ -220,8 +442,7 @@ function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; - //prevInfo(); - //checkIdle(); + checkIdle(); draw(); }, 60000 - (Date.now() % 60000)); } @@ -236,8 +457,16 @@ Bangle.on('lcdPower',on=>{ } }); +Bangle.setUI("clockupdown", btn=> { + if (btn<0) prevInfo(); + if (btn>0) nextInfo(); + draw(); +}); + +loadSettings(); +loadLocation(); + g.clear(); -Bangle.setUI("clock"); Bangle.loadWidgets(); /* * we are not drawing the widgets as we are taking over the whole screen