[TerminalClock] Use ClockFace module

master
Stiralbios 2022-06-18 15:17:34 +02:00
parent 3bddcd402d
commit 1f2726a841
2 changed files with 115 additions and 108 deletions

View File

@ -1,8 +1,8 @@
var locale = require("locale"); const locale = require("locale");
var fontColor = g.theme.dark ? "#0f0" : "#000";
var heartRate = 0; var heartRate = 0;
var altitude = -9001; var altitude = -9001;
const fontColor = g.theme.dark ? "#0f0" : "#000";
// handling the differents versions of the Banglejs smartwatch screen sizes // handling the differents versions of the Banglejs smartwatch screen sizes
if (process.env.HWVERSION == 1){ if (process.env.HWVERSION == 1){
var paddingY = 3; var paddingY = 3;
@ -18,32 +18,81 @@ if (process.env.HWVERSION == 1){
var font6x8DefaultTextSize = 2; 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) if(pos == 1)
g.setFont("6x8", font6x8FirstTextSize); g.setFont("6x8", font6x8FirstTextSize);
else else
g.setFont("6x8", font6x8DefaultTextSize); 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 + var yPos = Bangle.appRect.y +
paddingY * (pos - 1) + paddingY * (pos - 1) +
font6x8At4Size * Math.min(1, pos-1) + font6x8At4Size * Math.min(1, pos-1) +
@ -66,7 +115,6 @@ function drawDate(now, pos){
} }
function drawInput(pos){ function drawInput(pos){
clearField(pos);
drawLine(">", pos); drawLine(">", pos);
} }
@ -77,7 +125,6 @@ function drawStepCount(pos){
} }
function drawHRM(pos){ function drawHRM(pos){
clearField(pos);
if(heartRate != 0) if(heartRate != 0)
drawLine(">HR: " + parseInt(heartRate), pos); drawLine(">HR: " + parseInt(heartRate), pos);
else else
@ -85,60 +132,31 @@ function drawHRM(pos){
} }
function drawAltitude(pos){ function drawAltitude(pos){
clearField(pos);
if(altitude > 0) if(altitude > 0)
drawLine(">Alt: " + altitude.toFixed(1) + "m", pos); drawLine(">Alt: " + altitude.toFixed(1) + "m", pos);
else else
drawLine(">Alt: unknown", pos); drawLine(">Alt: unknown", pos);
} }
function drawActivity(pos){ function drawActivity(pos){
clearField(pos);
var health = Bangle.getHealthStatus('last'); var health = Bangle.getHealthStatus('last');
var steps_formated = ">Motion: " + parseInt(health.movement); var steps_formated = ">Motion: " + parseInt(health.movement);
drawLine(steps_formated, pos); drawLine(steps_formated, pos);
} }
function draw(){
var curPos = 1; /* -----------------------------------------------
g.reset(); Services functions (HRM, pressure, etc...)
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);
}
function turnOnServices(){ function turnOnServices(){
if(settings.showHRM){ if(clock.showHRM){
Bangle.setHRMPower(true, "terminalclock"); Bangle.setHRMPower(true, "terminalclock");
} }
if(settings.showAltitude && process.env.HWVERSION != 1){ if(clock.showAltitude){
Bangle.setBarometerPower(true, "terminalclock"); Bangle.setBarometerPower(true, "terminalclock");
} }
if(settings.powerSaving){ if(clock.powerSaving){
setTimeout(function () { setTimeout(function () {
turnOffServices(); turnOffServices();
}, 45000); }, 45000);
@ -146,33 +164,20 @@ function turnOnServices(){
} }
function turnOffServices(){ function turnOffServices(){
if(settings.showHRM){ if(clock.showHRM){
Bangle.setHRMPower(false, "terminalclock"); Bangle.setHRMPower(false, "terminalclock");
} }
if(settings.showAltitude && process.env.HWVERSION != 1){ if(clock.showAltitude){
Bangle.setBarometerPower(false, "terminalclock"); 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) { Bangle.on('HRM',function(hrmInfo) {
if(hrmInfo.confidence >= settings.HRMinConfidence) if(hrmInfo.confidence >= clock.HRMinConfidence)
heartRate = hrmInfo.bpm; heartRate = hrmInfo.bpm;
}); });
var MEDIANLENGTH = 20; // technical const MEDIANLENGTH = 20; // technical
var avr = [], median; // technical var avr = [], median; // technical
Bangle.on('pressure', function(e) { Bangle.on('pressure', function(e) {
while (avr.length>MEDIANLENGTH) avr.pop(); 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 function unlock(){
g.clear(); if(clock.powerSaving){
// load the settings turnOnServices();
var settings = Object.assign({ }
// default values clock.old_precision = clock.precision;
HRMinConfidence: 50, clock.precision = 1;
showDate: true, clock.tick();
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
} }
// Show launcher when middle button pressed
Bangle.setUI("clock"); function lock(){
// Load and draw widgets clock.precision = clock.old_precision;
Bangle.loadWidgets(); clock.tick();
Bangle.drawWidgets(); }
// draw immediately at first
draw(); // starting the clock
setInterval(draw, 10000); // every 10 seconds clock.start();

View File

@ -2,9 +2,12 @@
var FILE = "terminalclock.json"; var FILE = "terminalclock.json";
// Load settings // Load settings
var settings = Object.assign({ var settings = Object.assign({
HRMinConfidence: 50, // ClockFace lib
showDate: true, showDate: true,
showAltitude: process.env.HWVERSION != 1 ? true : false, loadWidgets: true,
// TerminalClock specific
HRMinConfidence: 50,
showAltitude: process.env.HWVERSION == 2 ? true : false,
showHRM: true, showHRM: true,
showActivity: true, showActivity: true,
showStepCount: true, showStepCount: true,
@ -28,6 +31,14 @@
writeSettings(); writeSettings();
} }
}, },
'Show widgets': {
value: settings.loadWidgets,
format: v => v?"Yes":"No",
onchange: v => {
settings.loadWidgets = v;
writeSettings();
}
},
'Show date': { 'Show date': {
value: settings.showDate, value: settings.showDate,
format: v => v?"Yes":"No", format: v => v?"Yes":"No",