[TerminalClock] Use ClockFace module
parent
3bddcd402d
commit
1f2726a841
|
|
@ -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,7 +132,6 @@ 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
|
||||||
|
|
@ -93,52 +139,24 @@ function drawAltitude(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
|
|
||||||
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();
|
turnOnServices();
|
||||||
if(settings.powerSaving){
|
|
||||||
setInterval(turnOnServices, settings.PowerOnInterval*60000); // every PowerOnInterval min
|
|
||||||
}
|
}
|
||||||
// Show launcher when middle button pressed
|
clock.old_precision = clock.precision;
|
||||||
Bangle.setUI("clock");
|
clock.precision = 1;
|
||||||
// Load and draw widgets
|
clock.tick();
|
||||||
Bangle.loadWidgets();
|
}
|
||||||
Bangle.drawWidgets();
|
|
||||||
// draw immediately at first
|
function lock(){
|
||||||
draw();
|
clock.precision = clock.old_precision;
|
||||||
setInterval(draw, 10000); // every 10 seconds
|
clock.tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
// starting the clock
|
||||||
|
clock.start();
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue