BangleApps/apps/measuretime/measuretime.app.js

202 lines
4.6 KiB
JavaScript
Raw Normal View History

{
require("Font7x11Numeric7Seg").add(Graphics);
2024-06-25 20:51:55 +00:00
const centerY = g.getHeight() / 2; //88
const lineStart = 25;
const lineEndFull = 110;
const lineEndHalf = 90;
const lineEndQuarter = 70;
const lineEndDefault = 50;
let drawTimeout;
let queueDrawTime = function () {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function () {
drawTimeout = undefined;
drawTime();
}, 60000 - (Date.now() % 60000));
};
let drawCenterLine = function () {
// center line
g.drawLineAA(0, centerY, g.getWidth(), centerY);
// left decoration
var steps = [0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
var stepsReversed = steps.slice();
stepsReversed.reverse();
var polyLeftTop = [0, 0];
var polyLeftBottom = [0, g.getHeight()];
var polyRightTop = [g.getWidth() - 1, 0];
var polyRightBottom = [g.getWidth() - 1, g.getHeight()];
let xL = 0;
let xR = g.getWidth() - 1;
let yT = centerY - 13;
let yB = centerY + 13;
2024-06-25 20:51:55 +00:00
for (let i = 0; i < steps.length; i++) {
xL += steps[i];
xR -= steps[i];
yT += stepsReversed[i];
yB -= stepsReversed[i];
// Left Top
polyLeftTop.push(xL);
polyLeftTop.push(yT);
// Left Bottom
polyLeftBottom.push(xL);
polyLeftBottom.push(yB);
// Right Top
polyRightTop.push(xR);
polyRightTop.push(yT);
// Right Bottom
polyRightBottom.push(xR);
polyRightBottom.push(yB);
}
polyLeftTop.push(0, 88);
polyLeftBottom.push(0, 88);
polyRightTop.push(g.getWidth(), 88);
polyRightBottom.push(g.getWidth(), 88);
g.fillPolyAA(polyLeftTop, true);
g.fillPolyAA(polyLeftBottom, true);
g.fillPolyAA(polyRightTop, true);
g.fillPolyAA(polyRightBottom, true);
};
let hourStringXOffset = function (hour) {
if (hour == 1) {
return lineEndFull - 5;
}
if (hour < 10 || hour >= 20) {
return lineEndFull + 5;
}
return lineEndFull - 5;
};
let drawHourString = function(hour, yLines) {
var hourForDrawing = 0;
if (hour < 0) {
// a negative hour => (+ and - = -)
hourForDrawing = 24 + hour;
} else if (hour >= 24) {
hourForDrawing = hour - 24;
} else {
hourForDrawing = hour;
}
g.drawString(hourForDrawing, hourStringXOffset(hourForDrawing), yLines, true);
};
let drawTime = function () {
g.clear();
var d = new Date();
var mins = d.getMinutes();
var offset = mins % 5;
var yTopLines = centerY - offset;
var topReached = false;
var yBottomLines = centerY - offset + 5;
var bottomReached = false;
drawCenterLine();
var lineEnd = lineEndDefault;
g.setFont("7x11Numeric7Seg", 2);
g.setFontAlign(-1, 0);
// gone
do {
switch (yTopLines - 88 + mins) {
case -60:
lineEnd = lineEndFull;
drawHourString(d.getHours() - 1, yTopLines);
break;
case 0:
case 60:
lineEnd = lineEndFull;
drawHourString(d.getHours(), yTopLines);
break;
case 45:
case -45:
case 15:
case -15:
case -75:
lineEnd = lineEndQuarter;
break;
case 30:
case -30:
lineEnd = lineEndHalf;
break;
default:
lineEnd = lineEndDefault;
}
g.drawLineAA(lineStart, yTopLines, lineEnd, yTopLines);
yTopLines -= 5;
if (yTopLines < -4) {
topReached = true;
}
} while (!topReached);
// upcoming
do {
switch (yBottomLines - 88 + mins) {
case 0:
case 60:
lineEnd = lineEndFull;
drawHourString(d.getHours() + 1, yBottomLines);
break;
case 120:
lineEnd = lineEndFull;
drawHourString(d.getHours() + 2, yBottomLines);
break;
case 15:
case 75:
case 135:
case 45:
case 105:
case 165:
lineEnd = lineEndQuarter;
break;
case 30:
case 90:
case 150:
lineEnd = lineEndHalf;
break;
default:
lineEnd = lineEndDefault;
}
g.drawLineAA(lineStart, yBottomLines, lineEnd, yBottomLines);
yBottomLines += 5;
if (yBottomLines > 176) {
bottomReached = true;
}
} while (!bottomReached);
queueDrawTime();
};
g.clear();
drawTime();
Bangle.setUI(
{
mode: "clock",
remove: function () {
if (drawTimeout) clearTimeout(drawTimeout);
require("widget_utils").show();
}
}
);
Bangle.loadWidgets();
2024-06-23 11:38:02 +00:00
require("widget_utils").swipeOn();
}