1
0
Fork 0
BangleApps/apps/smclock/app.js

189 lines
5.1 KiB
JavaScript
Raw Normal View History

2022-02-25 20:54:38 +00:00
const SETTINGSFILE = "smclock.json";
2022-02-22 14:37:37 +00:00
const background = {
width : 176, height : 176, bpp : 4,
transparent : 1,
buffer : require("heatshrink").decompress(atob("/4A/AH4Au1QAp1/2swApK/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K+//AH4A/AF8AAH4AUK/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/AA=="))
2022-02-22 14:37:37 +00:00
};
2022-03-03 23:05:17 +00:00
const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
2022-03-03 12:36:56 +00:00
const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
2022-02-22 14:37:37 +00:00
2022-02-25 20:54:38 +00:00
// dynamic variables
2022-03-03 22:30:34 +00:00
var batLevel = -1;
var batColor = [0, 0, 0];
2022-03-03 12:36:56 +00:00
// settings variables
2022-03-03 22:30:34 +00:00
var dateFormat;
var drawInterval;
var pollInterval;
var showAnalogFace;
var showWeekInfo;
var useVectorFont;
2022-03-03 12:36:56 +00:00
// load settings
function loadSettings() {
// Helper function default setting
2022-03-03 22:30:34 +00:00
function def(value, def) {return value !== undefined ? value : def;}
var settings = require("Storage").readJSON(SETTINGSFILE, true) || {};
2022-03-03 12:36:56 +00:00
dateFormat = def(settings.dateFormat, "Short");
drawInterval = def(settings.drawInterval, 10);
pollInterval = def(settings.pollInterval, 60);
showAnalogFace = def(settings.showAnalogFace, false);
showWeekInfo = def(settings.showWeekInfo, false);
useVectorFont = def(settings.useVectorFont, false);
}
2022-02-22 14:37:37 +00:00
2022-02-25 20:54:38 +00:00
// copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480
function ISO8601_week_no(date) {
2022-03-03 12:36:56 +00:00
var tdt = new Date(date.valueOf());
var dayn = (date.getDay() + 6) % 7;
tdt.setDate(tdt.getDate() - dayn + 3);
var firstThursday = tdt.valueOf();
tdt.setMonth(0, 1);
if (tdt.getDay() !== 4) {
tdt.setMonth(0, 1 + ((4 - tdt.getDay() + 7) % 7));
}
return 1 + Math.ceil((firstThursday - tdt) / 604800000);
2022-02-22 14:37:37 +00:00
}
function d02(value) {
2022-03-03 12:36:56 +00:00
return ("0" + value).substr(-2);
2022-02-22 14:37:37 +00:00
}
function pollBattery() {
2022-02-25 20:54:38 +00:00
batLevel = E.getBattery();
2022-02-22 14:37:37 +00:00
}
function getBatteryColor(level) {
var color;
if (level < 0) {
2022-02-27 22:22:32 +00:00
pollBattery();
level = batLevel;
2022-02-22 14:37:37 +00:00
}
2022-03-03 12:36:56 +00:00
if (level > 80) {
color = [0, 0, 1];
} else if (level > 60) {
color = [0, 1, 1];
} else if (level > 40) {
color = [0, 1, 0];
} else if (level > 20) {
color = [1, 1, 0];
2022-02-22 14:37:37 +00:00
} else {
2022-03-03 12:36:56 +00:00
color = [1, 0, 0];
2022-02-22 14:37:37 +00:00
}
return color;
}
function draw() {
g.drawImage(background);
2022-02-27 22:22:32 +00:00
const color = getBatteryColor(batLevel);
2022-03-03 22:30:34 +00:00
var bat = "";
2022-02-22 14:37:37 +00:00
const d = new Date();
const day = d.getDate();
2022-03-03 12:36:56 +00:00
const month = d.getMonth() + 1;
2022-02-22 14:37:37 +00:00
const week = d02(ISO8601_week_no(d));
2022-03-04 00:03:49 +00:00
var date1 = "";
var date2 = "";
2022-02-22 14:37:37 +00:00
const h = d.getHours();
const m = d.getMinutes();
const time = d02(h) + ":" + d02(m);
2022-03-03 15:38:56 +00:00
if (E.getBattery() < 100) {
2022-03-03 19:15:32 +00:00
bat = d02(E.getBattery()) + "%";
2022-03-03 15:38:56 +00:00
} else {
2022-03-03 19:15:32 +00:00
bat = E.getBattery() + "%";
2022-03-03 15:38:56 +00:00
}
2022-02-22 14:37:37 +00:00
g.reset();
2022-03-03 23:05:17 +00:00
// draw battery info
g.setColor(1, 1, 1);
if (useVectorFont == true) {
g.setFont("Vector", 16);
g.drawString("Bat:", 12, 22, false);
} else {
g.setFont("4x6", 2);
g.drawString("Bat:", 10, 22, false);
}
g.setColor(color[0], color[1], color[2]);
if (batLevel < 100) {
g.drawString(bat, 52, 22, false);
} else {
g.drawString(bat, 46, 22, false);
}
// draw date info
2022-02-22 14:37:37 +00:00
g.setColor(0, 0, 0);
if (useVectorFont == true) {
2022-03-03 12:36:56 +00:00
g.setFont("Vector", 20);
} else {
g.setFont("6x8", 2);
}
if (dateFormat == "Short") {
date1 = d02(day) + "/" + d02(month);
g.drawString(date1, 105, 20, false);
} else {
date1 = monthName[month - 1] + d02(day);
g.drawString(date1, 104, 20, false);
}
2022-02-22 14:37:37 +00:00
// draw week info
if (showWeekInfo == true) {
date2 = weekday[d.getDay()] + " " + d02(week)
if (useVectorFont == true) {
g.setFont("Vector", 18);
} else {
g.setFont("6x8", 2);
}
g.drawString(date2, 105, 55, false);
} else {
date2 = d.getFullYear();
if (useVectorFont == true) {
g.setFont("Vector", 22);
g.drawString(date2, 105, 55, false);
} else {
g.setFont("4x6", 3);
g.drawString(date2, 108, 55, false);
}
}
2022-02-22 14:37:37 +00:00
2022-03-03 23:14:20 +00:00
// draw time
2022-02-22 14:37:37 +00:00
g.setColor(1, 1, 1);
2022-03-03 23:14:20 +00:00
if (useVectorFont == true) {
g.setFont("Vector", 60);
g.drawString(time, 10, 108, false);
} else {
g.setFont("6x8", 5);
g.drawString(time, 14, 112, false);
}
2022-02-22 14:37:37 +00:00
}
2022-03-03 12:36:56 +00:00
loadSettings();
2022-02-22 14:37:37 +00:00
g.clear();
pollBattery();
draw();
2022-03-03 23:05:17 +00:00
var batInterval = setInterval(pollBattery, pollInterval * 1000);
2022-03-03 22:30:34 +00:00
var actualDrawInterval = setInterval(draw, drawInterval * 1000);
2022-02-22 14:37:37 +00:00
// Stop updates when LCD is off, restart when on
2022-03-03 12:36:56 +00:00
Bangle.on("lcdPower", (on) => {
2022-02-22 14:37:37 +00:00
if (batInterval) clearInterval(batInterval);
batInterval = undefined;
2022-03-03 21:23:57 +00:00
if (actualDrawInterval) clearInterval(actualDrawInterval);
actualDrawInterval = undefined;
2022-02-22 14:37:37 +00:00
if (on) {
2022-03-03 23:05:17 +00:00
batInterval = setInterval(pollBattery, pollInterval * 1000);
2022-03-03 21:23:57 +00:00
actualDrawInterval = setInterval(draw, drawInterval * 1000);
2022-03-03 12:36:56 +00:00
2022-02-22 14:37:37 +00:00
pollBattery();
2022-02-25 20:54:38 +00:00
draw();
2022-02-22 14:37:37 +00:00
}
});
// Show launcher when middle button pressed
Bangle.setUI("clock");