diff --git a/apps/terminalclock/README.md b/apps/terminalclock/README.md index 93967e8a7..6660ac2c2 100644 --- a/apps/terminalclock/README.md +++ b/apps/terminalclock/README.md @@ -1,7 +1,8 @@ # Terminal clock -A clock displayed as a terminal cli. -It can display : +A clock displayed as a terminal cli. +It can display: + - time - date - altitude @@ -9,7 +10,6 @@ It can display : - motion - steps - -"Power saving" setting control the HR and pressure (altitude) sensors. -If "Off" they will always be on. -If "On" the sensors will be turned on every "Power on interval" minutes for 45 secondes +"Power saving" setting control the HR and pressure (altitude) sensors. +If "Off" they will always be on. +If "On" the sensors will be turned on every "Power on interval" minutes for 45 seconds diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index 4bf2e69d7..94c0a34ba 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -11,7 +11,7 @@ let font6x8At2Size = 18; let font6x8FirstTextSize = 4; let font6x8DefaultTextSize = 2; - if (process.env.HWVERSION == 1){ + if (process.env.HWVERSION == 1) { paddingY = 3; font6x8At4Size = 48; font6x8At2Size = 27; @@ -32,29 +32,32 @@ this.unlock_precision = 1; if (this.HRMinConfidence === undefined) this.HRMinConfidence = 50; if (this.PowerOnInterval === undefined) this.PowerOnInterval = 15; - if (this.powerSave===undefined) this.powerSave = this.powerSaving; // migrate old setting - if (this.powerSave===undefined) this.powerSave = true; + if (this.powerSave === undefined) this.powerSave = this.powerSaving; // migrate old setting + if (this.powerSave === undefined) this.powerSave = true; - ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach(k => { - if (this[k]===undefined){ - if(k == "L2") this[k] = "Date"; - else if(k == "L3") { + ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach((k) => { + if (this[k] === undefined) { + if (k == "L2") this[k] = "Date"; + else if (k == "L3") { this[k] = "HR"; this.showHRM = true; - }else if(k == "L4") this[k] = "Motion"; - else if(k == "L5") this[k] = "Steps"; - else if(k == "L6") this[k] = ">"; - else this[k] = "Empty"; - } - else if (this[k]==="HR") this.showHRM = true; - else if (this[k]==="Alt") this.showAltitude = true && process.env.HWVERSION == 2; + } else if (k == "L4") this[k] = "Motion"; + else if (k == "L5") this[k] = "Steps"; + else if (k == "L6") this[k] = ">"; + else this[k] = "Empty"; + } else if (this[k] === "HR") this.showHRM = true; + else if (this[k] === "Alt") + this.showAltitude = true && process.env.HWVERSION == 2; }); // set the services (HRM, pressure sensor, etc....) - if(!this.powerSave){ + if (!this.powerSave) { turnOnServices(); - } else{ - this.turnOnInterval = setInterval(turnOnServices, this.PowerOnInterval*60000); // every PowerOnInterval min + } else { + this.turnOnInterval = setInterval( + turnOnServices, + this.PowerOnInterval * 60000, + ); // every PowerOnInterval min } // start the clock unlocked unlock(); @@ -67,102 +70,111 @@ drawTime(date, curPos); curPos++; - ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach(line => { - if (this[line]==='Date') drawDate(date, curPos); - else if (this[line]==='HR') drawHRM(curPos); - else if (this[line]==='Motion') drawMotion(curPos); - else if (this[line]==='Alt') drawAltitude(curPos); - else if (this[line]==='Steps') drawStepCount(curPos); - else if (this[line]==='>') drawInput(curPos); + ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach((line) => { + if (this[line] === "Date") drawDate(date, this.isoDate, curPos); + else if (this[line] === "HR") drawHRM(curPos); + else if (this[line] === "Motion") drawMotion(curPos); + else if (this[line] === "Alt") drawAltitude(curPos); + else if (this[line] === "Steps") drawStepCount(curPos); + else if (this[line] === ">") drawInput(curPos); curPos++; }); }, - remove: function() { - if (this.turnOnInterval){ + remove: function () { + if (this.turnOnInterval) { clearInterval(this.turnOnInterval); delete this.turnOnInterval; } - if (this.turnOffServiceTimeout){ - clearTimeout(this.turnOffServiceTimeout) - delete this.turnOffServiceTimeout + if (this.turnOffServiceTimeout) { + clearTimeout(this.turnOffServiceTimeout); + delete this.turnOffServiceTimeout; } turnOffServices(); - if (this.onLock) Bangle.removeListener('lock', this.onLock); - if (this.onHRM) Bangle.removeListener('HRM', this.onHRM); - if (this.onPressure) Bangle.removeListener('pressure', this.onPressure); - } - + if (this.onLock) Bangle.removeListener("lock", this.onLock); + if (this.onHRM) Bangle.removeListener("HRM", this.onHRM); + if (this.onPressure) Bangle.removeListener("pressure", this.onPressure); + }, }); - - /* ---------------------------- + /* ---------------------------- Draw related of specific lines -------------------------------- */ - let drawLine = function(line, pos){ - if(pos == 1) + let drawLine = function (line, pos) { + if (pos == 1) { g.setFont("6x8", font6x8FirstTextSize); - else + } else { g.setFont("6x8", font6x8DefaultTextSize); + } - let yPos = Bangle.appRect.y + - paddingY * (pos - 1) + - font6x8At4Size * Math.min(1, pos-1) + - font6x8At2Size * Math.max(0, pos-2); + let yPos = + Bangle.appRect.y + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos - 1) + + font6x8At2Size * Math.max(0, pos - 2); g.drawString(line, 5, yPos, true); }; - let drawTime = function(now, pos){ + let drawTime = function (now, pos) { let h = now.getHours(); let m = now.getMinutes(); - let time = ">" + (""+h).substr(-2) + ":" + ("0"+m).substr(-2); + let time = ">" + ("" + h).substr(-2) + ":" + ("0" + m).substr(-2); drawLine(time, pos); }; - let drawDate = function(now, pos) { + let drawDate = function (now, pos) { let date; if (clock.isoDate) { let year = now.getFullYear(); - let month = now.getMonth() + 1; // Months are 0-11 + let month = now.getMonth() + 1; // Months are 0-11 let day = now.getDate(); date = ">" + year + "-" + month + "-" + day; } else { let dow = locale.dow(now, 1); - date = locale.date(now, 1).substr(0,6) + locale.date(now, 1).substr(-2); + date = locale.date(now, 1).substr(0, 6) + locale.date(now, 1).substr(-2); date = ">" + dow + " " + date; } drawLine(date, pos); }; - let drawInput = function(pos){ + let drawInput = function (pos) { drawLine(">", pos); }; - let drawStepCount = function(pos){ + let drawStepCount = function (pos) { let health = Bangle.getHealthStatus("day"); let steps_formated = ">Steps: " + health.steps; drawLine(steps_formated, pos); }; - let drawHRM = function(pos){ - if(heartRate != 0) + let drawHRM = function (pos) { + if (heartRate != 0) { drawLine(">HR: " + parseInt(heartRate), pos); - else + } else { drawLine( - ">HR: " + parseInt(Math.round(Bangle.getHealthStatus().bpm||Bangle.getHealthStatus("last").bpm)), - pos); + ">HR: " + + parseInt( + Math.round( + Bangle.getHealthStatus().bpm || + Bangle.getHealthStatus("last").bpm, + ), + ), + pos, + ); + } }; - let drawAltitude = function(pos){ - if(altitude > 0) + let drawAltitude = function (pos) { + if (altitude > 0) { drawLine(">Alt: " + altitude.toFixed(1) + "m", pos); - else + } else { drawLine(">Alt: unknown", pos); + } }; - - let drawMotion = function(pos){ - let health = Bangle.getHealthStatus('last'); + + let drawMotion = function (pos) { + let health = Bangle.getHealthStatus("last"); let steps_formated = ">Motion: " + parseInt(health.movement); drawLine(steps_formated, pos); }; @@ -171,72 +183,70 @@ Services functions (HRM, pressure, etc...) -------------------------------------------------- */ - let turnOnServices = function(){ - if(clock.showHRM){ + let turnOnServices = function () { + if (clock.showHRM) { Bangle.setHRMPower(true, "terminalclock"); } - if(clock.showAltitude){ + if (clock.showAltitude) { Bangle.setBarometerPower(true, "terminalclock"); } - if(clock.powerSave){ - if(clock.turnOffServiceTimeout) clearTimeout(clock.turnOffServiceTimeout); + if (clock.powerSave) { + if (clock.turnOffServiceTimeout) + clearTimeout(clock.turnOffServiceTimeout); clock.turnOffServiceTimeout = setTimeout(function () { turnOffServices(); }, 45000); } }; - let turnOffServices = function(){ - if(clock.showHRM){ + let turnOffServices = function () { + if (clock.showHRM) { Bangle.setHRMPower(false, "terminalclock"); } - if(clock.showAltitude){ + if (clock.showAltitude) { Bangle.setBarometerPower(false, "terminalclock"); } }; // set the lock and unlock actions - clock.onLock = lock_event => { + clock.onLock = (lock_event) => { if (lock_event) lock(); else unlock(); }; Bangle.on("lock", clock.onLock); - clock.onHRM = hrmInfo => { - if(hrmInfo.confidence >= clock.HRMinConfidence) - heartRate = hrmInfo.bpm; + clock.onHRM = (hrmInfo) => { + if (hrmInfo.confidence >= clock.HRMinConfidence) heartRate = hrmInfo.bpm; }; - Bangle.on('HRM', clock.onHRM); + Bangle.on("HRM", clock.onHRM); const MEDIANLENGTH = 20; // technical - let avr = [], median; // technical - clock.onPressure = pressureInfo => { - while (avr.length>MEDIANLENGTH) avr.pop(); + let avr = [], + median; // technical + clock.onPressure = (pressureInfo) => { + while (avr.length > MEDIANLENGTH) avr.pop(); avr.unshift(pressureInfo.altitude); median = avr.slice().sort(); - if (median.length>10) { - let mid = median.length>>1; - altitude = E.sum(median.slice(mid-4,mid+5)) / 9; - } - else - altitude = pressureInfo.altitude; + if (median.length > 10) { + let mid = median.length >> 1; + altitude = E.sum(median.slice(mid - 4, mid + 5)) / 9; + } else altitude = pressureInfo.altitude; }; - Bangle.on('pressure', clock.onPressure); - + Bangle.on("pressure", clock.onPressure); /* ------------------------------------------------- Clock related functions but not in the ClockFace module ---------------------------------------------------- */ - let unlock = function(){ - if(clock.powerSave){ + let unlock = function () { + if (clock.powerSave) { turnOnServices(); } clock.precision = clock.unlock_precision; clock.tick(); }; - let lock = function(){ + let lock = function () { clock.precision = clock.lock_precision; clock.tick(); }; diff --git a/apps/terminalclock/settings.js b/apps/terminalclock/settings.js index a0598ad80..e707d5c95 100644 --- a/apps/terminalclock/settings.js +++ b/apps/terminalclock/settings.js @@ -1,23 +1,27 @@ -(function(back) { +(function (back) { var FILE = "terminalclock.json"; // Load settings - var settings = Object.assign({ - // TerminalClock specific - isoDate: false, - HRMinConfidence: 50, - PowerOnInterval: 15, - L2: 'Date', - L3: 'HR', - L4: 'Motion', - L5: 'Steps', - L6: '>', - L7: 'Empty', - L8: 'Empty', - L9: 'Empty', - }, require('Storage').readJSON(FILE, true) || {}); + var settings = Object.assign( + { + // TerminalClock specific + isoDate: false, + HRMinConfidence: 50, + PowerOnInterval: 15, + L2: "Date", + L3: "HR", + L4: "Motion", + L5: "Steps", + L6: ">", + L7: "Empty", + L8: "Empty", + L9: "Empty", + }, + require("Storage").readJSON(FILE, true) || {}, + ); // ClockFace lib: migrate "don't load widgets" to "hide widgets" if (!("hideWidgets" in settings)) { - if (("loadWidgets" in settings) && !settings.loadWidgets) settings.hideWidgets = 1; + if ("loadWidgets" in settings && !settings.loadWidgets) + settings.hideWidgets = 1; else settings.hideWidgets = 0; } delete settings.loadWidgets; @@ -29,20 +33,21 @@ delete settings.powerSaving; function writeSettings() { - require('Storage').writeJSON(FILE, settings); + require("Storage").writeJSON(FILE, settings); } - if(process.env.HWVERSION == 2) { - var lineType = ['Date', 'HR', 'Motion', 'Alt', 'Steps', '>', 'Empty']; - } else{ - var lineType = ['Date', 'HR', 'Motion', 'Steps', '>', 'Empty']; + if (process.env.HWVERSION == 2) { + var lineType = ["Date", "HR", "Motion", "Alt", "Steps", ">", "Empty"]; + } else { + var lineType = ["Date", "HR", "Motion", "Steps", ">", "Empty"]; } - function getLineChooser(lineID){ + function getLineChooser(lineID) { return { value: lineType.indexOf(settings[lineID]), - min: 0, max: lineType.length-1, - format: v => lineType[v], - onchange: v => { + min: 0, + max: lineType.length - 1, + format: (v) => lineType[v], + onchange: (v) => { settings[lineID] = lineType[v]; writeSettings(); }, @@ -50,35 +55,38 @@ } var lineMenu = { - '< Back': function() { E.showMenu(getMainMenu());}, - 'Line 2': getLineChooser('L2'), - 'Line 3': getLineChooser('L3'), - 'Line 4': getLineChooser('L4'), - 'Line 5': getLineChooser('L5'), - 'Line 6': getLineChooser('L6'), - 'Line 7': getLineChooser('L7'), - 'Line 8': getLineChooser('L8'), - 'Line 9': getLineChooser('L9'), + "< Back": function () { + E.showMenu(getMainMenu()); + }, + "Line 2": getLineChooser("L2"), + "Line 3": getLineChooser("L3"), + "Line 4": getLineChooser("L4"), + "Line 5": getLineChooser("L5"), + "Line 6": getLineChooser("L6"), + "Line 7": getLineChooser("L7"), + "Line 8": getLineChooser("L8"), + "Line 9": getLineChooser("L9"), }; - function getMainMenu(){ + function getMainMenu() { var mainMenu = { - "" : { "title" : "Terminal Clock" }, - "< Back" : () => back(), - 'HR confidence': { + "": { title: "Terminal Clock" }, + "< Back": () => back(), + "HR confidence": { value: settings.HRMinConfidence, - min: 0, max: 100, - onchange: v => { + min: 0, + max: 100, + onchange: (v) => { settings.HRMinConfidence = v; writeSettings(); - } - }, + }, + }, "ISO date": { value: !!settings.isoDate, - onchange: v => { + onchange: (v) => { settings.isoDate = v; writeSettings(); - } + }, }, }; const save = (key, v) => { @@ -89,21 +97,24 @@ hideWidgets: settings.hideWidgets, powerSave: settings.powerSave, }); - if(settings.powerSave){ - mainMenu['Power on interval'] = { + if (settings.powerSave) { + mainMenu["Power on interval"] = { value: settings.PowerOnInterval, - min: 3, max: 60, - onchange: v => { + min: 3, + max: 60, + onchange: (v) => { settings.PowerOnInterval = v; writeSettings(); }, - format: x => x + "m" + format: (x) => x + "m", }; } - mainMenu['Lines'] = function() { E.showMenu(lineMenu);}; + mainMenu["Lines"] = function () { + E.showMenu(lineMenu); + }; return mainMenu; } E.showMenu(getMainMenu()); -}) +});