2020-04-21 21:18:21 +00:00
|
|
|
(() => {
|
2020-05-24 09:21:24 +00:00
|
|
|
const weather = require('weather');
|
|
|
|
|
2020-05-23 04:44:31 +00:00
|
|
|
function formatDuration(millis) {
|
|
|
|
let pluralize = (n, w) => n + " " + w + (n == 1 ? "" : "s");
|
2020-06-07 02:26:46 +00:00
|
|
|
if (millis < 60000) return "< 1 minute";
|
2020-05-23 04:44:31 +00:00
|
|
|
if (millis < 3600000) return pluralize(Math.floor(millis/60000), "minute");
|
|
|
|
if (millis < 86400000) return pluralize(Math.floor(millis/3600000), "hour");
|
|
|
|
return pluralize(Math.floor(millis/86400000), "day");
|
|
|
|
}
|
|
|
|
|
2020-05-24 09:21:24 +00:00
|
|
|
function draw() {
|
|
|
|
let w = weather.current;
|
2020-04-21 21:18:21 +00:00
|
|
|
g.reset();
|
|
|
|
g.setColor(0).fillRect(0, 24, 239, 239);
|
|
|
|
|
2020-05-24 09:21:24 +00:00
|
|
|
weather.drawIcon(w.txt, 65, 90, 55);
|
2020-04-21 21:18:21 +00:00
|
|
|
const locale = require("locale");
|
|
|
|
|
|
|
|
g.setColor(-1);
|
|
|
|
|
2020-04-22 09:00:16 +00:00
|
|
|
const temp = locale.temp(w.temp-273.15).match(/^(\D*\d*)(.*)$/);
|
2020-04-21 21:18:21 +00:00
|
|
|
let width = g.setFont("Vector", 40).stringWidth(temp[1]);
|
|
|
|
width += g.setFont("Vector", 20).stringWidth(temp[2]);
|
|
|
|
g.setFont("Vector", 40).setFontAlign(-1, -1, 0);
|
|
|
|
g.drawString(temp[1], 180-width/2, 70);
|
|
|
|
g.setFont("Vector", 20).setFontAlign(1, -1, 0);
|
|
|
|
g.drawString(temp[2], 180+width/2, 70);
|
|
|
|
|
|
|
|
g.setFont("6x8", 1);
|
|
|
|
g.setFontAlign(-1, 0, 0);
|
|
|
|
g.drawString("Humidity", 135, 130);
|
|
|
|
g.drawString("Wind", 135, 142);
|
|
|
|
g.setFontAlign(1, 0, 0);
|
|
|
|
g.drawString(w.hum+"%", 225, 130);
|
|
|
|
g.drawString(locale.speed(w.wind), 225, 142);
|
|
|
|
|
|
|
|
g.setFont("6x8", 2).setFontAlign(0, 0, 0);
|
|
|
|
g.drawString(w.loc, 120, 170);
|
|
|
|
|
|
|
|
g.setFont("6x8", 1).setFontAlign(0, 0, 0);
|
|
|
|
g.drawString(w.txt.charAt(0).toUpperCase()+w.txt.slice(1), 120, 190);
|
|
|
|
|
2020-06-07 02:26:46 +00:00
|
|
|
drawUpdateTime();
|
2020-05-23 04:44:31 +00:00
|
|
|
|
2020-04-21 21:18:21 +00:00
|
|
|
g.flip();
|
|
|
|
}
|
|
|
|
|
2020-05-24 09:21:24 +00:00
|
|
|
function drawUpdateTime() {
|
|
|
|
if (!weather.current || !weather.current.time) return;
|
|
|
|
let text = `Last update received ${formatDuration(Date.now() - weather.current.time)} ago`;
|
2020-05-23 04:44:31 +00:00
|
|
|
g.reset();
|
|
|
|
g.setColor(0).fillRect(0, 202, 239, 210);
|
|
|
|
g.setColor(-1).setFont("6x8", 1).setFontAlign(0, 0, 0);
|
|
|
|
g.drawString(text, 120, 206);
|
|
|
|
}
|
|
|
|
|
2020-05-24 09:21:24 +00:00
|
|
|
function update() {
|
|
|
|
if (weather.current) {
|
|
|
|
draw();
|
|
|
|
} else {
|
|
|
|
E.showMessage('Weather unknown\n\nIs Gadgetbridge\nconnected?');
|
2020-05-23 04:44:31 +00:00
|
|
|
}
|
2020-05-24 09:21:24 +00:00
|
|
|
}
|
2020-04-21 21:18:21 +00:00
|
|
|
|
2020-06-07 02:26:46 +00:00
|
|
|
let interval = setInterval(drawUpdateTime, 60000);
|
2020-05-23 04:44:31 +00:00
|
|
|
Bangle.on('lcdPower', (on) => {
|
|
|
|
if (interval) {
|
|
|
|
clearInterval(interval);
|
|
|
|
interval = undefined;
|
|
|
|
}
|
|
|
|
if (on) {
|
|
|
|
drawUpdateTime();
|
2020-06-07 02:26:46 +00:00
|
|
|
interval = setInterval(drawUpdateTime, 60000);
|
2020-05-23 04:44:31 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2020-05-24 09:21:24 +00:00
|
|
|
weather.on("update", update);
|
2020-04-21 21:18:21 +00:00
|
|
|
|
2020-05-24 09:21:24 +00:00
|
|
|
update(weather.current);
|
2020-04-21 21:18:21 +00:00
|
|
|
|
|
|
|
// Show launcher when middle button pressed
|
2020-05-23 03:53:42 +00:00
|
|
|
setWatch(Bangle.showLauncher, BTN2, {repeat: false, edge: 'falling'});
|
2020-05-24 09:21:24 +00:00
|
|
|
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
2020-04-21 21:18:21 +00:00
|
|
|
})()
|