diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index 7dc3bf1d1..d0699f855 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,8 +1,8 @@ -var locale = require("locale"); -var fontColor = g.theme.dark ? "#0f0" : "#000"; +const locale = require("locale"); var heartRate = 0; var altitude = -9001; +const fontColor = g.theme.dark ? "#0f0" : "#000"; // handling the differents versions of the Banglejs smartwatch screen sizes if (process.env.HWVERSION == 1){ var paddingY = 3; @@ -18,32 +18,81 @@ if (process.env.HWVERSION == 1){ var font6x8DefaultTextSize = 2; } -function setFontSize(pos){ +// initialising the clockface +const ClockFace = require("ClockFace"); +const clock = new ClockFace({ + init: function () { + // check settings and set default if needed + if (this.HRMinConfidence === undefined) this.HRMinConfidence = 50; + if (this.PowerOnInterval === undefined) this.PowerOnInterval = 15; + if (this.showAltitude === undefined){ + this.showAltitude = true && process.env.HWVERSION == 2; + }else { + this.showAltitude = this.showAltitude && process.env.HWVERSION == 2; + } + ["showHRM", "showActivity", "showStepCount", "powerSaving"].forEach(k => { + if (this[k]===undefined) this[k] = true; + }); + + this. + + Bangle.on("lock", on => { + if (on) lock(); + else unlock(); + }); + + turnOnServices(); + if(this.powerSaving){ + setInterval(turnOnServices, this.PowerOnInterval*60000); // every PowerOnInterval min + } + + }, + + draw: function (date) { + var curPos = 1; + g.reset(); + g.clearRect(g.appRect); + g.setFontAlign(-1, -1); + g.setColor(fontColor); + drawTime(date, curPos); + curPos++; + if(this.showDate){ + drawDate(date, curPos); + curPos++; + } + if(this.showAltitude){ + drawAltitude(curPos); + curPos++; + } + if(this.showHRM){ + drawHRM(curPos); + curPos++; + } + if(this.showActivity){ + drawActivity(curPos); + curPos++; + } + if(this.showStepCount){ + drawStepCount(curPos); + curPos++; + } + drawInput(curPos); + }, + + settingsFile: "terminalclock.json" +}); + + +/* ---------------------------- +Draw related of specific lines +-------------------------------- */ + +function drawLine(line, pos){ if(pos == 1) g.setFont("6x8", font6x8FirstTextSize); else g.setFont("6x8", font6x8DefaultTextSize); -} -function clearField(pos){ - var yStartPos = Bangle.appRect.y + - paddingY * (pos - 1) + - font6x8At4Size * Math.min(1, pos-1) + - font6x8At2Size * Math.max(0, pos-2); - var yEndPos = Bangle.appRect.y + - paddingY * (pos - 1) + - font6x8At4Size * Math.min(1, pos) + - font6x8At2Size * Math.max(0, pos-1); - g.clearRect(Bangle.appRect.x, yStartPos, Bangle.appRect.x2, yEndPos); -} - -function clearWatchIfNeeded(now){ - if(now.getMinutes() % 10 == 0) - g.clearRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y2); -} - -function drawLine(line, pos){ - setFontSize(pos); var yPos = Bangle.appRect.y + paddingY * (pos - 1) + font6x8At4Size * Math.min(1, pos-1) + @@ -66,7 +115,6 @@ function drawDate(now, pos){ } function drawInput(pos){ - clearField(pos); drawLine(">", pos); } @@ -77,7 +125,6 @@ function drawStepCount(pos){ } function drawHRM(pos){ - clearField(pos); if(heartRate != 0) drawLine(">HR: " + parseInt(heartRate), pos); else @@ -85,60 +132,31 @@ function drawHRM(pos){ } function drawAltitude(pos){ - clearField(pos); if(altitude > 0) drawLine(">Alt: " + altitude.toFixed(1) + "m", pos); else drawLine(">Alt: unknown", pos); } - + function drawActivity(pos){ - clearField(pos); var health = Bangle.getHealthStatus('last'); var steps_formated = ">Motion: " + parseInt(health.movement); drawLine(steps_formated, pos); } -function draw(){ - var curPos = 1; - g.reset(); - g.setFontAlign(-1, -1); - g.setColor(fontColor); - var now = new Date(); - clearWatchIfNeeded(now); // mostly to not have issues when changing days - drawTime(now, curPos); - curPos++; - if(settings.showDate){ - drawDate(now, curPos); - curPos++; - } - if(settings.showAltitude){ - drawAltitude(curPos); - curPos++; - } - if(settings.showHRM){ - drawHRM(curPos); - curPos++; - } - if(settings.showActivity){ - drawActivity(curPos); - curPos++; - } - if(settings.showStepCount){ - drawStepCount(curPos); - curPos++; - } - drawInput(curPos); -} + +/* ----------------------------------------------- +Services functions (HRM, pressure, etc...) +-------------------------------------------------- */ function turnOnServices(){ - if(settings.showHRM){ + if(clock.showHRM){ Bangle.setHRMPower(true, "terminalclock"); } - if(settings.showAltitude && process.env.HWVERSION != 1){ + if(clock.showAltitude){ Bangle.setBarometerPower(true, "terminalclock"); } - if(settings.powerSaving){ + if(clock.powerSaving){ setTimeout(function () { turnOffServices(); }, 45000); @@ -146,33 +164,20 @@ function turnOnServices(){ } function turnOffServices(){ - if(settings.showHRM){ + if(clock.showHRM){ Bangle.setHRMPower(false, "terminalclock"); } - if(settings.showAltitude && process.env.HWVERSION != 1){ + if(clock.showAltitude){ Bangle.setBarometerPower(false, "terminalclock"); } } -var unlockDrawIntervalID = -1; -Bangle.on('lock', function(on){ - if(!on){ // unclock - if(settings.powerSaving){ - turnOnServices(); - } - unlockDrawIntervalID = setInterval(draw, 1000); // every second - } - if(on && unlockDrawIntervalID != -1){ // lock - clearInterval(unlockDrawIntervalID); - } -}); - Bangle.on('HRM',function(hrmInfo) { - if(hrmInfo.confidence >= settings.HRMinConfidence) + if(hrmInfo.confidence >= clock.HRMinConfidence) heartRate = hrmInfo.bpm; }); -var MEDIANLENGTH = 20; // technical +const MEDIANLENGTH = 20; // technical var avr = [], median; // technical Bangle.on('pressure', function(e) { while (avr.length>MEDIANLENGTH) avr.pop(); @@ -184,32 +189,23 @@ Bangle.on('pressure', function(e) { } }); +/* ------------------------------------------------- +Clock related functions but not in the ClockFace module +---------------------------------------------------- */ -// Clear the screen once, at startup -g.clear(); -// load the settings -var settings = Object.assign({ - // default values - HRMinConfidence: 50, - showDate: true, - showHRM: true, - showActivity: true, - showStepCount: true, - showAltitude: process.env.HWVERSION != 1 ? true : false, - powerSaving: true, - PowerOnInterval: 15, -}, require('Storage').readJSON("terminalclock.json", true) || {}); - -// turn the services before drawing anything -turnOnServices(); -if(settings.powerSaving){ - setInterval(turnOnServices, settings.PowerOnInterval*60000); // every PowerOnInterval min +function unlock(){ + if(clock.powerSaving){ + turnOnServices(); + } + clock.old_precision = clock.precision; + clock.precision = 1; + clock.tick(); } -// Show launcher when middle button pressed -Bangle.setUI("clock"); -// Load and draw widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); -// draw immediately at first -draw(); -setInterval(draw, 10000); // every 10 seconds + +function lock(){ + clock.precision = clock.old_precision; + clock.tick(); +} + +// starting the clock +clock.start(); diff --git a/apps/terminalclock/settings.js b/apps/terminalclock/settings.js index bd860b491..cdad7b9a4 100644 --- a/apps/terminalclock/settings.js +++ b/apps/terminalclock/settings.js @@ -2,9 +2,12 @@ var FILE = "terminalclock.json"; // Load settings var settings = Object.assign({ - HRMinConfidence: 50, + // ClockFace lib showDate: true, - showAltitude: process.env.HWVERSION != 1 ? true : false, + loadWidgets: true, + // TerminalClock specific + HRMinConfidence: 50, + showAltitude: process.env.HWVERSION == 2 ? true : false, showHRM: true, showActivity: true, showStepCount: true, @@ -28,6 +31,14 @@ writeSettings(); } }, + 'Show widgets': { + value: settings.loadWidgets, + format: v => v?"Yes":"No", + onchange: v => { + settings.loadWidgets = v; + writeSettings(); + } + }, 'Show date': { value: settings.showDate, format: v => v?"Yes":"No",