2022-02-25 20:54:38 +00:00
|
|
|
const SETTINGSFILE = "smclock.json";
|
2022-03-15 16:09:14 +00:00
|
|
|
const image3bit = {
|
|
|
|
width : 176, height : 176, bpp : 3,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/4A/AH4AC23btoCct/pkmSpICcIP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5Bp/4A/AH4AC/kAAH0/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5BpA="))
|
|
|
|
};
|
|
|
|
const image4bit = {
|
2022-03-13 20:27:36 +00:00
|
|
|
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;
|
2022-03-17 22:18:17 +00:00
|
|
|
var batColor = "";
|
2022-03-03 12:36:56 +00:00
|
|
|
|
|
|
|
// settings variables
|
2022-03-15 16:09:14 +00:00
|
|
|
var backgroundImage;
|
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
|
|
|
|
2022-03-15 16:09:14 +00:00
|
|
|
backgroundImage = def(settings.backgroundImage, "3bit");
|
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) {
|
2022-03-17 22:18:17 +00:00
|
|
|
color = "#00f";
|
2022-03-03 12:36:56 +00:00
|
|
|
} else if (level > 60) {
|
2022-03-17 22:18:17 +00:00
|
|
|
color = "#0ff";
|
2022-03-03 12:36:56 +00:00
|
|
|
} else if (level > 40) {
|
2022-03-17 22:18:17 +00:00
|
|
|
color = "#0f0";
|
2022-03-03 12:36:56 +00:00
|
|
|
} else if (level > 20) {
|
2022-03-17 22:18:17 +00:00
|
|
|
color = "#f40";
|
2022-02-22 14:37:37 +00:00
|
|
|
} else {
|
2022-03-17 22:18:17 +00:00
|
|
|
color = "f00";
|
2022-02-22 14:37:37 +00:00
|
|
|
}
|
|
|
|
return color;
|
|
|
|
}
|
|
|
|
|
|
|
|
function draw() {
|
2022-03-15 16:09:14 +00:00
|
|
|
var background;
|
|
|
|
if (backgroundImage == "3bit") {
|
|
|
|
background = image3bit;
|
|
|
|
} else {
|
|
|
|
background = image4bit;
|
|
|
|
}
|
2022-02-22 14:37:37 +00:00
|
|
|
g.drawImage(background);
|
|
|
|
|
2022-03-17 22:18:17 +00:00
|
|
|
batColor = 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);
|
|
|
|
|
|
|
|
g.reset();
|
|
|
|
|
2022-03-03 23:05:17 +00:00
|
|
|
// draw battery info
|
2022-03-17 22:18:17 +00:00
|
|
|
var x = 12;
|
|
|
|
var y = 16;
|
|
|
|
if (Bangle.isCharging()) {
|
|
|
|
g.setColor("#ff0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
|
|
|
|
} else {
|
|
|
|
g.clearRect(x,y,x+14,y+24);
|
|
|
|
g.setColor("#000").fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2);
|
|
|
|
g.setColor(batColor).fillRect(x+4,y+20-(batLevel*16/100),x+10,y+20);
|
|
|
|
}
|
|
|
|
if (Bangle.isCharging()) {
|
|
|
|
g.setColor("#ff0");
|
2022-03-03 23:05:17 +00:00
|
|
|
} else {
|
2022-03-17 22:18:17 +00:00
|
|
|
g.setColor(batColor);
|
2022-03-03 23:05:17 +00:00
|
|
|
}
|
2022-03-17 22:36:16 +00:00
|
|
|
if (useVectorFont == true) {
|
|
|
|
g.setFont("Vector", 16);
|
|
|
|
} else {
|
|
|
|
g.setFont("4x6", 3);
|
|
|
|
}
|
2022-03-03 23:05:17 +00:00
|
|
|
if (batLevel < 100) {
|
2022-03-17 22:18:17 +00:00
|
|
|
bat = d02(batLevel) + "%";
|
|
|
|
g.drawString(bat, 50, 22, false);
|
2022-03-03 23:05:17 +00:00
|
|
|
} else {
|
2022-03-17 22:18:17 +00:00
|
|
|
bat = "100%";
|
|
|
|
g.drawString(bat, 40, 22, false);
|
2022-03-03 23:05:17 +00:00
|
|
|
}
|
|
|
|
|
2022-03-03 23:52:33 +00:00
|
|
|
// draw date info
|
2022-03-17 22:18:17 +00:00
|
|
|
g.setColor("#000");
|
2022-03-03 23:52:33 +00:00
|
|
|
if (useVectorFont == true) {
|
2022-03-03 12:36:56 +00:00
|
|
|
g.setFont("Vector", 20);
|
|
|
|
} else {
|
|
|
|
g.setFont("6x8", 2);
|
|
|
|
}
|
2022-03-03 23:52:33 +00:00
|
|
|
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
|
|
|
|
2022-03-03 23:52:33 +00:00
|
|
|
// draw week info
|
|
|
|
if (showWeekInfo == true) {
|
2022-03-17 22:18:17 +00:00
|
|
|
date2 = weekday[d.getDay()] + " " + d02(week);
|
2022-03-03 23:52:33 +00:00
|
|
|
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-03-17 22:18:17 +00:00
|
|
|
g.setColor("#fff");
|
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
|
2022-03-17 22:36:16 +00:00
|
|
|
Bangle.setUI("clock");
|