diff --git a/apps/terminalclock/ChangeLog b/apps/terminalclock/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/terminalclock/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/terminalclock/README.md b/apps/terminalclock/README.md new file mode 100644 index 000000000..2a2bc1204 --- /dev/null +++ b/apps/terminalclock/README.md @@ -0,0 +1,9 @@ +# Terminal clock + +A clock displayed as a terminal cli. +It can display : +- time +- date +- hrm +- activity +- steps diff --git a/apps/terminalclock/app-icon.js b/apps/terminalclock/app-icon.js new file mode 100644 index 000000000..5e57a4b7c --- /dev/null +++ b/apps/terminalclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwghC/AHsHu93uAX/C+wACsAaTC/4Xiu1mswXRCYNnDQQxTgwX/C8QABuAaTg4X/C7Z3Xa/4Xds1ms4XUCgV2DYIXUsBdTC/4AEg4VCC61wIiYX/C74A/AGIA==")) diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js new file mode 100644 index 000000000..fb7bd16cc --- /dev/null +++ b/apps/terminalclock/app.js @@ -0,0 +1,138 @@ +var locale = require("locale"); +var fontColor = g.theme.dark ? "#0f0" : "#000"; +var startY = 24; +var paddingY = 2; +var font6x8At4Size = 32; +var font6x8At2Size = 18; +var heartRate = 0; + + +function setFontSize(pos){ + if(pos == 1) + g.setFont("6x8", 4); + else + g.setFont("6x8", 2); +} + +function clearField(pos){ + var yStartPos = startY + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos-1) + + font6x8At2Size * Math.max(0, pos-2); + var yEndPos = startY + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos) + + font6x8At2Size * Math.max(0, pos-1); + g.clearRect(0, yStartPos, 240, yEndPos); +} + +function clearWatchIfNeeded(now){ + if(now.getMinutes() % 10 == 0) + g.clearRect(0, startY, 240, 240); +} + +function drawLine(line, pos){ + setFontSize(pos); + var yPos = startY + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos-1) + + font6x8At2Size * Math.max(0, pos-2); + g.drawString(line, 5, yPos, true); +} + +function drawTime(now, pos){ + var h = now.getHours(); + var m = now.getMinutes(); + var time = ">" + (""+h).substr(-2) + ":" + ("0"+m).substr(-2); + drawLine(time, pos); +} + +function drawDate(now, pos){ + var dow = locale.dow(now, 1); + var date = locale.date(now, 1).substr(0,6) + locale.date(now, 1).substr(-2); + var locale_date = ">" + dow + " " + date; + drawLine(locale_date, pos); +} + +function drawInput(now, pos){ + clearField(pos); + drawLine(">", pos); +} + +function drawStepCount(pos){ + var health = Bangle.getHealthStatus("day"); + var steps_formated = ">Steps: " + health.steps; + drawLine(steps_formated, pos); +} + +function drawHRM(pos){ + clearField(pos); + if(heartRate != 0) + drawLine(">HR: " + parseInt(heartRate), pos); + else + drawLine(">HR: unknown", pos); +} + +function drawActivity(pos){ + clearField(pos); + var health = Bangle.getHealthStatus('last'); + var steps_formated = ">Activity: " + parseInt(health.movement/10); + 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.showHRM){ + drawHRM(curPos); + curPos++; + } + if(settings.showActivity){ + drawActivity(curPos); + curPos++; + } + if(settings.showStepCount){ + drawStepCount(curPos); + curPos++; + } + drawInput(now, curPos); +} + + +Bangle.on('HRM',function(hrmInfo) { + if(hrmInfo.confidence >= settings.HRMinConfidence) + heartRate = hrmInfo.bpm; +}); + + +// 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, +}, require('Storage').readJSON("terminalclock.json", true) || {}); +// draw immediately at first +draw(); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +var secondInterval = setInterval(draw, 10000); diff --git a/apps/terminalclock/app.png b/apps/terminalclock/app.png new file mode 100644 index 000000000..5d4507ead Binary files /dev/null and b/apps/terminalclock/app.png differ diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json new file mode 100644 index 000000000..6907da84d --- /dev/null +++ b/apps/terminalclock/metadata.json @@ -0,0 +1,24 @@ +{ + "id": "terminalclock", + "name": "Terminal Clock", + "shortName":"Terminal Clock", + "description": "A terminal cli like clock displaying multiple sensor data", + "version":"0.01", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name": "terminalclock.app.js","url": "app.js"}, + {"name": "terminalclock.settings.js","url": "settings.js"}, + {"name": "terminalclock.img","url": "app-icon.js","evaluate": true} + ], + "data": [ + {"name": "terminalclock.json"} + ], + "screenshots": [ + {"url": "screenshot1.png"}, + {"url": "screenshot2.png"} + ] +} diff --git a/apps/terminalclock/screenshot1.png b/apps/terminalclock/screenshot1.png new file mode 100644 index 000000000..a0d41f495 Binary files /dev/null and b/apps/terminalclock/screenshot1.png differ diff --git a/apps/terminalclock/screenshot2.png b/apps/terminalclock/screenshot2.png new file mode 100644 index 000000000..21d7aadbf Binary files /dev/null and b/apps/terminalclock/screenshot2.png differ diff --git a/apps/terminalclock/settings.js b/apps/terminalclock/settings.js new file mode 100644 index 000000000..77df69b12 --- /dev/null +++ b/apps/terminalclock/settings.js @@ -0,0 +1,61 @@ +(function(back) { + var FILE = "terminalclock.json"; + // Load settings + var settings = Object.assign({ + HRMinConfidence: 50, + showDate: true, + showHRM: true, + showActivity: true, + showStepCount: true, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + // Show the menu + E.showMenu({ + "" : { "title" : "Terminal Clock" }, + "< Back" : () => back(), + 'HR confidence': { + value: 50|settings.HRMinConfidence, // 0| converts undefined to 0 + min: 0, max: 100, + onchange: v => { + settings.HRMinConfidence = v; + writeSettings(); + } + }, + 'Show date': { + value: !!settings.showDate, + format: v => v?"Yes":"No", + onchange: v => { + settings.showDate = v; + writeSettings(); + } + }, + 'Show HRM': { + value: !!settings.showHRM, + format: v => v?"Yes":"No", + onchange: v => { + settings.showHRM = v; + writeSettings(); + } + }, + 'Show Activity': { + value: !!settings.showActivity, + format: v => v?"Yes":"No", + onchange: v => { + settings.showActivity = v; + writeSettings(); + } + }, + 'Show Steps': { + value: !!settings.showStepCount, + format: v => v?"Yes":"No", + onchange: v => { + settings.showStepCount = v; + writeSettings(); + } + } + }); +})