|
|
|
|
@ -3,23 +3,8 @@ const storage = require("Storage");
|
|
|
|
|
const SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js");
|
|
|
|
|
|
|
|
|
|
const shoesIcon = atob("EBCBAAAACAAcAB4AHgAeABwwADgGeAZ4AHgAMAAAAHAAIAAA");
|
|
|
|
|
const heartIcon = atob("EBCBAAAAAAAeeD/8P/x//n/+P/w//B/4D/AH4APAAYAAAAAA");
|
|
|
|
|
const powerIcon = atob("EBCBAAAAA8ADwA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AH4AAA");
|
|
|
|
|
const temperatureIcon = atob("EBCBAAAAAYADwAJAAkADwAPAA8ADwAfgB+AH4AfgA8ABgAAA");
|
|
|
|
|
|
|
|
|
|
const weatherCloudy = atob("EBCBAAAAAAAAAAfgD/Af8H/4//7///////9//z/+AAAAAAAA");
|
|
|
|
|
const weatherSunny = atob("EBCBAAAAAYAQCBAIA8AH4A/wb/YP8A/gB+ARiBAIAYABgAAA");
|
|
|
|
|
const weatherMoon = atob("EBCBAAAAAYAP8B/4P/w//D/8f/5//j/8P/w//B/4D/ABgAAA");
|
|
|
|
|
const weatherPartlyCloudy = atob("EBCBAAAAAAAYQAMAD8AIQBhoW+AOYBwwOBBgHGAGP/wf+AAA");
|
|
|
|
|
const weatherRainy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQAJBgjPOEkgGYAZgA8ABgAAA");
|
|
|
|
|
const weatherPartlyRainy = atob("EBCBAAAAEEAQAAeADMAYaFvoTmAMMDgQIBxhhiGGG9wDwAGA");
|
|
|
|
|
const weatherSnowy = atob("EBCBAAAAAAADwAGAEYg73C50BCAEIC50O9wRiAGAA8AAAAAA");
|
|
|
|
|
const weatherFoggy = atob("EBCBAAAAAAADwAZgDDA4EGAcQAZAAgAAf74AAAAAd/4AAAAA");
|
|
|
|
|
const weatherStormy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQMJAgjmOGcgAgACAAAAAAAAA");
|
|
|
|
|
|
|
|
|
|
const sunSetDown = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAAGYAPAAYAAAAAA");
|
|
|
|
|
const sunSetUp = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAABgAPABmAAAAAA");
|
|
|
|
|
|
|
|
|
|
Graphics.prototype.setFontRobotoRegular50NumericOnly = function(scale) {
|
|
|
|
|
// Actual height 39 (40 - 2)
|
|
|
|
|
this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAAfAAAAAAAPwAAAAAAB8AAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA4AAAAAAB+AAAAAAD/gAAAAAD/4AAAAAH/4AAAAAP/wAAAAAP/gAAAAAf/gAAAAAf/AAAAAA/+AAAAAB/+AAAAAB/8AAAAAD/4AAAAAH/4AAAAAD/wAAAAAA/wAAAAAAPgAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAB////gAAA////8AAA/////gAAP////8AAH8AAA/gAB8AAAD4AA+AAAAfAAPAAAADwADwAAAA8AA8AAAAPAAPAAAADwADwAAAA8AA8AAAAPAAPgAAAHwAB8AAAD4AAfwAAD+AAD/////AAA/////wAAH////4AAAf///4AAAB///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAPgAAAAAADwAAAAAAB8AAAAAAAfAAAAAAAHgAAAAAAD4AAAAAAA+AAAAAAAPAAAAAAAH/////wAB/////8AA//////AAP/////wAD/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAfgAADwAAP4AAB8AAH+AAA/AAD/gAAfwAB/AAAf8AAfAAAP/AAPgAAH7wAD4AAD88AA8AAB+PAAPAAA/DwADwAAfg8AA8AAPwPAAPAAH4DwADwAH8A8AA+AD+APAAPwB/ADwAB/D/gA8AAf//gAPAAD//wADwAAf/wAA8AAD/4AAPAAAHwAADwAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAADgAAAHwAA+AAAD8AAP4AAB/AAD/AAA/wAA/wAAf4AAD+AAHwAAAPgAD4APAB8AA+ADwAPAAPAA8ADwADwAPAA8AA8ADwAPAAPAA8ADwADwAfAA8AA8AH4APAAPgD+AHwAB8B/wD4AAf7/+B+AAD//v//AAA//x//wAAD/4P/4AAAf8B/4AAAAYAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAHwAAAAAAH8AAAAAAD/AAAAAAD/wAAAAAD/8AAAAAB/vAAAAAB/jwAAAAA/g8AAAAA/wPAAAAAfwDwAAAAf4A8AAAAf4APAAAAP8ADwAAAP8AA8AAAH8AAPAAAD/////8AA//////AAP/////wAD/////8AA//////AAAAAAPAAAAAAADwAAAAAAA8AAAAAAAPAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAB/APwAAH//wD+AAD//8A/wAA///AH+AAP//wAPgAD/B4AB8AA8A+AAfAAPAPAADwADwDwAA8AA8A8AAPAAPAPAADwADwD4AA8AA8A+AAPAAPAPwAHwADwD8AD4AA8AfwD+AAPAH///AADwA///wAA8AH//4AAPAAf/4AAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAD//+AAAAD///4AAAD////AAAB////4AAA/78D/AAAfw8AH4AAPweAA+AAD4PgAHwAB8DwAA8AAfA8AAPAAHgPAADwAD4DwAA8AA+A8AAPAAPAPgAHwADwD4AB8AA8AfgA+AAPAH+B/gAAAA///wAAAAH//4AAAAA//8AAAAAH/8AAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAA8AAAAAAAPAAAAAAADwAAAAAAA8AAAABAAPAAAABwADwAAAB8AA8AAAB/AAPAAAB/wADwAAD/8AA8AAD/8AAPAAD/4AADwAD/4AAA8AD/4AAAPAH/wAAADwH/wAAAA8H/wAAAAPH/wAAAAD3/gAAAAA//gAAAAAP/gAAAAAD/gAAAAAA/AAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwA/4AAAH/Af/AAAH/8P/4AAD//n//AAA//7//4AAfx/+A+AAHwD+AHwAD4AfgB8AA8AHwAPAAPAA8ADwADwAPAA8AA8ADwAPAAPAA8ADwADwAfAA8AA+AH4AfAAHwD+AHwAB/D/4D4AAP/+/n+AAD//n//AAAf/w//gAAB/wH/wAAAHwA/4AAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAD/8AAAAAD//wAAAAB//+AAAAA///wAAAAf4H+APAAH4AfgDwAD8AB8A8AA+AAfAPAAPAADwDwADwAA8B8AA8AAPAfAAPAADwHgADwAA8D4AA+AAeB+AAHwAHg/AAB+ADwfgAAP8D4/4AAD////8AAAf///8AAAB///+AAAAP//+AAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAOAAAB8AAHwAAAfgAD8AAAH4AA/AAAB8AAHwAAAOAAA4AAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("DRUcHBwcHBwcHBwcDA=="), 50+(scale<<8)+(1<<16));
|
|
|
|
|
@ -67,7 +52,7 @@ const colorGreen = '#008000';
|
|
|
|
|
const colorBlue = '#0000ff';
|
|
|
|
|
const colorYellow = '#ffff00';
|
|
|
|
|
const widgetOffset = showWidgets ? 24 : 0;
|
|
|
|
|
const dowOffset = circleCount == 3 ? 22 : 24; // dow offset relative to date
|
|
|
|
|
const dowOffset = circleCount == 3 ? 20 : 22; // dow offset relative to date
|
|
|
|
|
const h = g.getHeight() - widgetOffset;
|
|
|
|
|
const w = g.getWidth();
|
|
|
|
|
const hOffset = (circleCount == 3 ? 34 : 30) - widgetOffset;
|
|
|
|
|
@ -103,10 +88,7 @@ const circleFontBig = circleCount == 3 ? "Vector:16" : "Vector:12";
|
|
|
|
|
const iconOffset = circleCount == 3 ? 6 : 8;
|
|
|
|
|
const defaultCircleTypes = ["steps", "hr", "battery", "weather"];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function draw() {
|
|
|
|
|
g.clear(true);
|
|
|
|
|
if (!showWidgets) {
|
|
|
|
|
function hideWidgets() {
|
|
|
|
|
/*
|
|
|
|
|
* we are not drawing the widgets as we are taking over the whole screen
|
|
|
|
|
* so we will blank out the draw() functions of each widget and change the
|
|
|
|
|
@ -118,6 +100,12 @@ function draw() {
|
|
|
|
|
wd.area = "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function draw() {
|
|
|
|
|
g.clear(true);
|
|
|
|
|
if (!showWidgets) {
|
|
|
|
|
hideWidgets();
|
|
|
|
|
} else {
|
|
|
|
|
Bangle.drawWidgets();
|
|
|
|
|
}
|
|
|
|
|
@ -129,7 +117,7 @@ function draw() {
|
|
|
|
|
g.setFontRobotoRegular50NumericOnly();
|
|
|
|
|
g.setFontAlign(0, -1);
|
|
|
|
|
g.setColor(colorFg);
|
|
|
|
|
g.drawString(locale.time(new Date(), 1), w / 2, h1 + 8);
|
|
|
|
|
g.drawString(locale.time(new Date(), 1), w / 2, h1 + 6);
|
|
|
|
|
now = Math.round(new Date().getTime() / 1000);
|
|
|
|
|
|
|
|
|
|
// date & dow
|
|
|
|
|
@ -138,10 +126,19 @@ function draw() {
|
|
|
|
|
g.drawString(locale.date(new Date()), w / 2, h2);
|
|
|
|
|
g.drawString(locale.dow(new Date()), w / 2, h2 + dowOffset);
|
|
|
|
|
|
|
|
|
|
// draw the circles a little bit delayed so we decrease the blocking time
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
drawCircle(1);
|
|
|
|
|
}, 1);
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
drawCircle(2);
|
|
|
|
|
}, 1);
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
drawCircle(3);
|
|
|
|
|
}, 1);
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
if (circleCount >= 4) drawCircle(4);
|
|
|
|
|
}, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function drawCircle(index) {
|
|
|
|
|
@ -248,6 +245,9 @@ function getGradientColor(color, percent) {
|
|
|
|
|
const colorList = [
|
|
|
|
|
'#00FF00', '#80FF00', '#FFFF00', '#FF8000', '#FF0000'
|
|
|
|
|
];
|
|
|
|
|
if (color == "fg") {
|
|
|
|
|
color = colorFg;
|
|
|
|
|
}
|
|
|
|
|
if (color == "green-red") {
|
|
|
|
|
const colorIndex = Math.round(colorList.length * percent);
|
|
|
|
|
return colorList[Math.min(colorIndex, colorList.length) - 1] || "#00ff00";
|
|
|
|
|
@ -325,6 +325,8 @@ function drawStepsDistance(w) {
|
|
|
|
|
function drawHeartRate(w) {
|
|
|
|
|
if (!w) w = getCircleXPosition("hr");
|
|
|
|
|
|
|
|
|
|
const heartIcon = atob("EBCBAAAAAAAeeD/8P/x//n/+P/w//B/4D/AH4APAAYAAAAAA");
|
|
|
|
|
|
|
|
|
|
drawCircleBackground(w);
|
|
|
|
|
|
|
|
|
|
const color = getCircleColor("hr");
|
|
|
|
|
@ -349,6 +351,8 @@ function drawBattery(w) {
|
|
|
|
|
if (!w) w = getCircleXPosition("battery");
|
|
|
|
|
const battery = E.getBattery();
|
|
|
|
|
|
|
|
|
|
const powerIcon = atob("EBCBAAAAA8ADwA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AH4AAA");
|
|
|
|
|
|
|
|
|
|
drawCircleBackground(w);
|
|
|
|
|
|
|
|
|
|
let color = getCircleColor("battery");
|
|
|
|
|
@ -426,6 +430,10 @@ function drawSunProgress(w) {
|
|
|
|
|
if (!w) w = getCircleXPosition("sunprogress");
|
|
|
|
|
const percent = getSunProgress();
|
|
|
|
|
|
|
|
|
|
// sunset icons:
|
|
|
|
|
const sunSetDown = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAAGYAPAAYAAAAAA");
|
|
|
|
|
const sunSetUp = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAABgAPABmAAAAAA");
|
|
|
|
|
|
|
|
|
|
drawCircleBackground(w);
|
|
|
|
|
|
|
|
|
|
const color = getCircleColor("sunprogress");
|
|
|
|
|
@ -559,6 +567,18 @@ function windAsBeaufort(windInKmh) {
|
|
|
|
|
*/
|
|
|
|
|
function getWeatherIconByCode(code) {
|
|
|
|
|
const codeGroup = Math.round(code / 100);
|
|
|
|
|
|
|
|
|
|
// weather icons:
|
|
|
|
|
const weatherCloudy = atob("EBCBAAAAAAAAAAfgD/Af8H/4//7///////9//z/+AAAAAAAA");
|
|
|
|
|
const weatherSunny = atob("EBCBAAAAAYAQCBAIA8AH4A/wb/YP8A/gB+ARiBAIAYABgAAA");
|
|
|
|
|
const weatherMoon = atob("EBCBAAAAAYAP8B/4P/w//D/8f/5//j/8P/w//B/4D/ABgAAA");
|
|
|
|
|
const weatherPartlyCloudy = atob("EBCBAAAAAAAYQAMAD8AIQBhoW+AOYBwwOBBgHGAGP/wf+AAA");
|
|
|
|
|
const weatherRainy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQAJBgjPOEkgGYAZgA8ABgAAA");
|
|
|
|
|
const weatherPartlyRainy = atob("EBCBAAAAEEAQAAeADMAYaFvoTmAMMDgQIBxhhiGGG9wDwAGA");
|
|
|
|
|
const weatherSnowy = atob("EBCBAAAAAAADwAGAEYg73C50BCAEIC50O9wRiAGAA8AAAAAA");
|
|
|
|
|
const weatherFoggy = atob("EBCBAAAAAAADwAZgDDA4EGAcQAZAAgAAf74AAAAAd/4AAAAA");
|
|
|
|
|
const weatherStormy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQMJAgjmOGcgAgACAAAAAAAAA");
|
|
|
|
|
|
|
|
|
|
switch (codeGroup) {
|
|
|
|
|
case 2:
|
|
|
|
|
return weatherStormy;
|
|
|
|
|
@ -823,7 +843,6 @@ if (isCircleEnabled("hr")) {
|
|
|
|
|
enableHRMSensor();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bangle.setUI("clock");
|
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
|
|
|
|
|
|
|