2020-04-18 07:01:15 +00:00
|
|
|
{
|
|
|
|
var minutes;
|
|
|
|
var seconds;
|
|
|
|
var hours;
|
|
|
|
var date;
|
|
|
|
var first = true;
|
2020-04-23 19:31:12 +00:00
|
|
|
var locale = require('locale');
|
|
|
|
var _12hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"] || false;
|
|
|
|
|
|
|
|
//HR variables
|
2020-05-04 19:31:19 +00:00
|
|
|
var id = 0;
|
|
|
|
var grow = true;
|
2020-05-06 18:56:40 +00:00
|
|
|
var size=10;
|
2020-04-18 07:01:15 +00:00
|
|
|
|
2020-05-06 18:56:40 +00:00
|
|
|
//Screen dimensions
|
2020-04-18 07:01:15 +00:00
|
|
|
const screen = {
|
|
|
|
width: g.getWidth(),
|
|
|
|
height: g.getWidth(),
|
|
|
|
middle: g.getWidth() / 2,
|
|
|
|
center: g.getHeight() / 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
// Ssettings
|
|
|
|
const settings = {
|
|
|
|
time: {
|
2021-03-22 18:45:06 +00:00
|
|
|
color: '#D6ED17',
|
2020-04-18 07:01:15 +00:00
|
|
|
font: 'Vector',
|
2021-02-06 15:34:46 +00:00
|
|
|
size: 60,
|
2021-02-06 15:23:48 +00:00
|
|
|
middle: screen.middle,
|
2020-04-18 10:02:01 +00:00
|
|
|
center: screen.center,
|
2020-04-18 07:01:15 +00:00
|
|
|
},
|
|
|
|
date: {
|
2021-03-22 18:45:06 +00:00
|
|
|
color: '#D6ED17',
|
2020-04-18 07:01:15 +00:00
|
|
|
font: 'Vector',
|
|
|
|
size: 15,
|
2021-02-06 15:59:49 +00:00
|
|
|
middle: screen.height-17, // at bottom of screen
|
2020-04-18 07:01:15 +00:00
|
|
|
center: screen.center,
|
|
|
|
},
|
|
|
|
circle: {
|
2021-03-22 18:34:31 +00:00
|
|
|
colormin: '#ffffff',
|
|
|
|
colorsec: '#ffffff',
|
2020-04-18 07:01:15 +00:00
|
|
|
width: 10,
|
|
|
|
middle: screen.middle,
|
|
|
|
center: screen.center,
|
|
|
|
height: screen.height
|
2020-05-04 17:28:53 +00:00
|
|
|
},
|
|
|
|
hr: {
|
2021-03-22 18:45:06 +00:00
|
|
|
color: '#333333',
|
2020-05-04 17:28:53 +00:00
|
|
|
size: 10,
|
|
|
|
x: screen.center,
|
2020-05-04 19:31:19 +00:00
|
|
|
y: screen.middle + 45
|
2020-04-18 07:01:15 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const dateStr = function (date) {
|
2020-04-23 19:31:12 +00:00
|
|
|
return locale.date(new Date(), 1);
|
2020-04-18 07:01:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const getArcXY = function (centerX, centerY, radius, angle) {
|
|
|
|
var s, r = [];
|
|
|
|
s = 2 * Math.PI * angle / 360;
|
|
|
|
r.push(centerX + Math.round(Math.cos(s) * radius));
|
|
|
|
r.push(centerY + Math.round(Math.sin(s) * radius));
|
|
|
|
|
|
|
|
return r;
|
|
|
|
};
|
|
|
|
|
|
|
|
const drawMinArc = function (sections, color) {
|
|
|
|
g.setColor(color);
|
2021-03-22 18:13:18 +00:00
|
|
|
rad = (settings.circle.height / 2) - 40;
|
2020-04-18 07:01:15 +00:00
|
|
|
r1 = getArcXY(settings.circle.middle, settings.circle.center, rad, sections * (360 / 60) - 90);
|
|
|
|
//g.setPixel(r[0],r[1]);
|
|
|
|
r2 = getArcXY(settings.circle.middle, settings.circle.center, rad - settings.circle.width, sections * (360 / 60) - 90);
|
|
|
|
//g.setPixel(r[0],r[1]);
|
|
|
|
g.drawLine(r1[0], r1[1], r2[0], r2[1]);
|
|
|
|
g.setColor('#333333');
|
2020-04-23 19:31:12 +00:00
|
|
|
g.drawCircle(settings.circle.middle, settings.circle.center, rad - settings.circle.width - 4)
|
2020-04-18 07:01:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const drawSecArc = function (sections, color) {
|
|
|
|
g.setColor(color);
|
2021-03-22 18:13:18 +00:00
|
|
|
rad = (settings.circle.height / 2) - 20;
|
2020-04-18 07:01:15 +00:00
|
|
|
r1 = getArcXY(settings.circle.middle, settings.circle.center, rad, sections * (360 / 60) - 90);
|
|
|
|
//g.setPixel(r[0],r[1]);
|
|
|
|
r2 = getArcXY(settings.circle.middle, settings.circle.center, rad - settings.circle.width, sections * (360 / 60) - 90);
|
|
|
|
//g.setPixel(r[0],r[1]);
|
|
|
|
g.drawLine(r1[0], r1[1], r2[0], r2[1]);
|
|
|
|
g.setColor('#333333');
|
2020-04-23 19:31:12 +00:00
|
|
|
g.drawCircle(settings.circle.middle, settings.circle.center, rad - settings.circle.width - 4)
|
2020-04-18 07:01:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const drawClock = function () {
|
|
|
|
|
|
|
|
currentTime = new Date();
|
|
|
|
|
|
|
|
//Set to initial time when started
|
|
|
|
if (first == true) {
|
|
|
|
minutes = currentTime.getMinutes();
|
|
|
|
seconds = currentTime.getSeconds();
|
|
|
|
for (count = 0; count <= minutes; count++) {
|
|
|
|
drawMinArc(count, settings.circle.colormin);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (count = 0; count <= seconds; count++) {
|
|
|
|
drawSecArc(count, settings.circle.colorsec);
|
|
|
|
}
|
|
|
|
first = false;
|
|
|
|
}
|
2020-04-23 19:31:12 +00:00
|
|
|
|
2021-03-22 19:27:15 +00:00
|
|
|
// Reset
|
2020-04-18 07:01:15 +00:00
|
|
|
if (seconds == 59) {
|
|
|
|
g.setColor('#000000');
|
2021-03-22 19:36:51 +00:00
|
|
|
g.fillCircle(settings.circle.middle, settings.circle.center, (settings.circle.height / 2) - 20);
|
2021-03-22 19:27:15 +00:00
|
|
|
for (count = 0; count <= minutes; count++) {
|
|
|
|
drawMinArc(count, settings.circle.colormin);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (count = 0; count <= seconds; count++) {
|
|
|
|
drawSecArc(count, settings.circle.colorsec);
|
|
|
|
}
|
2020-04-18 07:01:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//Get date as a string
|
|
|
|
date = dateStr(currentTime);
|
|
|
|
|
|
|
|
// Update minutes when needed
|
|
|
|
if (minutes != currentTime.getMinutes()) {
|
|
|
|
minutes = currentTime.getMinutes();
|
|
|
|
drawMinArc(minutes, settings.circle.colormin);
|
|
|
|
}
|
|
|
|
|
|
|
|
//Update seconds when needed
|
|
|
|
if (seconds != currentTime.getSeconds()) {
|
|
|
|
seconds = currentTime.getSeconds();
|
2020-04-23 19:31:12 +00:00
|
|
|
drawSecArc(seconds, settings.circle.colorsec);
|
2020-04-18 07:01:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//Write the time as configured in the settings
|
|
|
|
hours = currentTime.getHours();
|
2020-04-23 19:31:12 +00:00
|
|
|
if (_12hour && hours > 13) {
|
|
|
|
hours = hours - 12;
|
|
|
|
}
|
|
|
|
|
|
|
|
var meridian;
|
|
|
|
|
|
|
|
if (typeof locale.meridian === "function") {
|
|
|
|
meridian = locale.meridian(new Date());
|
|
|
|
} else {
|
|
|
|
meridian = "";
|
|
|
|
}
|
|
|
|
|
|
|
|
var timestr;
|
|
|
|
|
|
|
|
if (meridian.length > 0 && _12hour) {
|
|
|
|
timestr = hours + " " + meridian;
|
|
|
|
} else {
|
|
|
|
timestr = hours;
|
|
|
|
}
|
2020-05-06 19:25:18 +00:00
|
|
|
g.setFontAlign(0, 0, 0);
|
2020-04-18 07:01:15 +00:00
|
|
|
g.setColor(settings.time.color);
|
|
|
|
g.setFont(settings.time.font, settings.time.size);
|
2020-04-23 19:31:12 +00:00
|
|
|
g.drawString(timestr, settings.time.center, settings.time.middle);
|
2020-04-18 07:01:15 +00:00
|
|
|
|
|
|
|
//Write the date as configured in the settings
|
|
|
|
g.setColor(settings.date.color);
|
|
|
|
g.setFont(settings.date.font, settings.date.size);
|
|
|
|
g.drawString(date, settings.date.center, settings.date.middle);
|
|
|
|
};
|
|
|
|
|
2020-05-23 21:32:33 +00:00
|
|
|
//setInterval for HR visualisation
|
2020-04-23 19:31:12 +00:00
|
|
|
const newBeats = function (hr) {
|
|
|
|
if (id != 0) {
|
|
|
|
changeInterval(id, 6e3 / hr.bpm);
|
|
|
|
} else {
|
|
|
|
id = setInterval(drawHR, 6e3 / hr.bpm);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-05-04 19:31:19 +00:00
|
|
|
//visualize HR with circles pulsating
|
2020-05-06 18:56:40 +00:00
|
|
|
const drawHR = function () {
|
2020-05-04 17:28:53 +00:00
|
|
|
if (grow && size < settings.hr.size) {
|
2020-04-23 19:31:12 +00:00
|
|
|
size++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!grow && size > 3) {
|
|
|
|
size--;
|
|
|
|
}
|
|
|
|
|
2020-05-04 17:28:53 +00:00
|
|
|
if (size == settings.hr.size || size == 3) {
|
2020-04-23 19:31:12 +00:00
|
|
|
grow = !grow;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (grow) {
|
2020-05-04 17:28:53 +00:00
|
|
|
color = settings.hr.color;
|
2020-04-23 19:31:12 +00:00
|
|
|
g.setColor(color);
|
2020-05-04 17:28:53 +00:00
|
|
|
g.fillCircle(settings.hr.x, settings.hr.y, size);
|
2020-04-23 19:31:12 +00:00
|
|
|
} else {
|
|
|
|
color = "#000000";
|
|
|
|
g.setColor(color);
|
2020-05-04 17:28:53 +00:00
|
|
|
g.drawCircle(settings.hr.x, settings.hr.y, size);
|
2020-04-23 19:31:12 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-04-18 07:01:15 +00:00
|
|
|
// clean app screen
|
|
|
|
g.clear();
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
|
|
|
|
2020-05-23 21:32:33 +00:00
|
|
|
//manage when things should be enabled and not
|
2020-05-04 19:31:19 +00:00
|
|
|
Bangle.on('lcdPower', function (on) {
|
|
|
|
if (on) {
|
|
|
|
Bangle.setHRMPower(1);
|
|
|
|
} else {
|
|
|
|
Bangle.setHRMPower(0);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// refesh every second
|
2020-04-18 07:01:15 +00:00
|
|
|
setInterval(drawClock, 1E3);
|
|
|
|
|
2020-05-04 19:31:19 +00:00
|
|
|
//start HR monitor and update frequency of update
|
2020-04-23 19:31:12 +00:00
|
|
|
Bangle.setHRMPower(1);
|
|
|
|
Bangle.on('HRM', function (d) {
|
|
|
|
newBeats(d);
|
|
|
|
});
|
|
|
|
|
2020-04-18 07:01:15 +00:00
|
|
|
// draw now
|
|
|
|
drawClock();
|
|
|
|
|
|
|
|
// Show launcher when middle button pressed
|
|
|
|
setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
|
|
|
|
|
2020-04-23 19:31:12 +00:00
|
|
|
}
|