support fastload

pull/2862/head
d3nd3 2023-07-04 19:56:16 +01:00
parent 026778f656
commit aa5442ab4c
No known key found for this signature in database
GPG Key ID: DD20A75EE5FC29BC
3 changed files with 142 additions and 123 deletions

View File

@ -26,3 +26,4 @@
0.26: Use widget_utils. 0.26: Use widget_utils.
0.27: Report latest HRM rather than HRM 10 minutes ago (fix #2395) 0.27: Report latest HRM rather than HRM 10 minutes ago (fix #2395)
0.28: Battery Vref implemented correctly. 0.28: Battery Vref implemented correctly.
0.29: Support fastload.

View File

@ -1,7 +1,8 @@
{
const TIMER_IDX = "lcars"; const TIMER_IDX = "lcars";
const SETTINGS_FILE = "lcars.setting.json"; const SETTINGS_FILE = "lcars.setting.json";
const locale = require('locale'); const locale = require('locale');
const storage = require('Storage') const storage = require('Storage');
const widget_utils = require('widget_utils'); const widget_utils = require('widget_utils');
let settings = { let settings = {
alarm: -1, alarm: -1,
@ -18,7 +19,7 @@ let settings = {
}; };
let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings;
for (const key in saved_settings) { for (const key in saved_settings) {
settings[key] = saved_settings[key] settings[key] = saved_settings[key];
} }
/* /*
@ -36,10 +37,10 @@ let cGrey = "#424242";
*/ */
let lcarsViewPos = 0; let lcarsViewPos = 0;
// let hrmValue = 0; // let hrmValue = 0;
var plotMonth = false; let plotMonth = false;
function convert24to16(input) let convert24to16 = function(input)
{ {
let RGB888 = parseInt(input.replace(/^#/, ''), 16); let RGB888 = parseInt(input.replace(/^#/, ''), 16);
let r = (RGB888 & 0xFF0000) >> 16; let r = (RGB888 & 0xFF0000) >> 16;
@ -55,17 +56,17 @@ function convert24to16(input)
RGB565 = RGB565 | b; RGB565 = RGB565 | b;
return "0x"+RGB565.toString(16); return "0x"+RGB565.toString(16);
} };
var color1C = convert24to16(color1);//Converting colors to the correct format. let color1C = convert24to16(color1);//Converting colors to the correct format.
var color2C = convert24to16(color2); let color2C = convert24to16(color2);
var color3C = convert24to16(color3); let color3C = convert24to16(color3);
/* /*
* Requirements and globals * Requirements and globals
*/ */
var colorPalette = new Uint16Array([//Used to change the color of the image if the user selects a color that is diffrent than the default. let colorPalette = new Uint16Array([//Used to change the color of the image if the user selects a color that is diffrent than the default.
0x0000, // not used 0x0000, // not used
color2C, // second color2C, // second
color3C, // third color3C, // third
@ -84,73 +85,73 @@ var colorPalette = new Uint16Array([//Used to change the color of the image if t
0x0000 // not used 0x0000 // not used
],0,1); ],0,1);
var bgLeftFullscreen = { let bgLeftFullscreen = {
width : 27, height : 176, bpp : 3, width : 27, height : 176, bpp : 3,
transparent : 0, transparent : 0,
buffer : require("heatshrink").decompress((atob("/4AB+VJkmSAQV///+BAtJn//5IIFkmf/4IGyVP/gIGpMnF41PHIImGF4ImHJoQmGJoIdK8hNHNY47C/JNGBIJZGyYJBQA5GCKH5Q/KAQAoUP7y/KH5QGDoQAy0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkqrCS4xGCWoyDCKH5Q1GShlJChQLCCg5TCHw5TMAD35FAoIIkgJB8hGGv/8Mg8/+QIFp4cB5IRGBIIvI/4IFybyCF4wTCDp5NBHZZiGz4JBLJKAGk4JBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4"))), buffer : require("heatshrink").decompress((atob("/4AB+VJkmSAQV///+BAtJn//5IIFkmf/4IGyVP/gIGpMnF41PHIImGF4ImHJoQmGJoIdK8hNHNY47C/JNGBIJZGyYJBQA5GCKH5Q/KAQAoUP7y/KH5QGDoQAy0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkqrCS4xGCWoyDCKH5Q1GShlJChQLCCg5TCHw5TMAD35FAoIIkgJB8hGGv/8Mg8/+QIFp4cB5IRGBIIvI/4IFybyCF4wTCDp5NBHZZiGz4JBLJKAGk4JBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4"))),
palette: colorPalette palette: colorPalette
}; };
var bgLeftNotFullscreen = { let bgLeftNotFullscreen = {
width : 27, height : 152, bpp : 3, width : 27, height : 152, bpp : 3,
transparent : 0, transparent : 0,
buffer : require("heatshrink").decompress((atob("/4AB+VJkmSAQV///+BAtJn//5IIFkmf/4IGyVP/gIGpMnF41PHIImGF4ImHJoQmGJoIdK8hNHNY47C/JNGBIJZGyYJBQA5GCKH5Q/KAQAy0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkqrCS4xGCWoyhCKH5Q1GShlJChQLCCg5TCHw5TMAD35FAoIIkgJB8hGGv/8Mg8/+QIFp4cB5IRGBIIvI/4IFybyCF4wTCDp5NBHZZiGz4JBLJKAGk4JBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A=="))), buffer : require("heatshrink").decompress((atob("/4AB+VJkmSAQV///+BAtJn//5IIFkmf/4IGyVP/gIGpMnF41PHIImGF4ImHJoQmGJoIdK8hNHNY47C/JNGBIJZGyYJBQA5GCKH5Q/KAQAy0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkqrCS4xGCWoyhCKH5Q1GShlJChQLCCg5TCHw5TMAD35FAoIIkgJB8hGGv/8Mg8/+QIFp4cB5IRGBIIvI/4IFybyCF4wTCDp5NBHZZiGz4JBLJKAGk4JBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A=="))),
palette: colorPalette palette: colorPalette
}; };
var bgRightFullscreen = { let bgRightFullscreen = {
width : 27, height : 176, bpp : 3, width : 27, height : 176, bpp : 3,
transparent : 0, transparent : 0,
buffer : require("heatshrink").decompress((atob("yVJkgCCyf/AAPJBAYCBk4JB8gUFyVP//yBAoCB//5BAwUCAAIUHAAIgGChopGv5TIn5TIz4yLKYxxC/iGI/xxGKH5Q/agwAnUP7y/KH4yGeVYAJ0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkp4CS4xGCWoyhCKH5QuDoxQCDpI7GDoJZGHYIRGLIQvGO4QvGMQRNJADv+GIqTC/5PGz4JBJ41JBIPJCg2TD4QLGn4JB/gUaHwRTGHwRTHBIRTGNAQyJ8gyI+QdFp4JB/IdFk5lLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJoyJC/4A=="))), buffer : require("heatshrink").decompress((atob("yVJkgCCyf/AAPJBAYCBk4JB8gUFyVP//yBAoCB//5BAwUCAAIUHAAIgGChopGv5TIn5TIz4yLKYxxC/iGI/xxGKH5Q/agwAnUP7y/KH4yGeVYAJ0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkp4CS4xGCWoyhCKH5QuDoxQCDpI7GDoJZGHYIRGLIQvGO4QvGMQRNJADv+GIqTC/5PGz4JBJ41JBIPJCg2TD4QLGn4JB/gUaHwRTGHwRTHBIRTGNAQyJ8gyI+QdFp4JB/IdFk5lLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJoyJC/4A=="))),
palette: colorPalette palette: colorPalette
}; };
var bgRightNotFullscreen = { let bgRightNotFullscreen = {
width : 27, height : 152, bpp : 3, width : 27, height : 152, bpp : 3,
transparent : 0, transparent : 0,
buffer : require("heatshrink").decompress((atob("yVJkgCCyf/AAPJBAYCBk4JB8gUFyVP//yBAoCB//5BAwUCAAIUHAAIgGChopGv5TIn5TIz4yLKYxxC/iGI/xxGKH5Q/agwAx0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkqrCS4xGCWoyhCKH5QuDoxQCDpI7GDoJZGHYIRGLIQvGO4QvGMQRNJADv+GIqTC/5PGz4JBJ41JBIPJCg2TD4QLGn4JB/gUaHwRTGHwRTHBIRTGNAQyJ8gyI+QdFp4JB/IdFk5lLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJoyJC/4A="))), buffer : require("heatshrink").decompress((atob("yVJkgCCyf/AAPJBAYCBk4JB8gUFyVP//yBAoCB//5BAwUCAAIUHAAIgGChopGv5TIn5TIz4yLKYxxC/iGI/xxGKH5Q/agwAx0hGF34JB6RGFr4JB9JkFl4JB+gdFy4JB/QdFpYJB/odFkqrCS4xGCWoyhCKH5QuDoxQCDpI7GDoJZGHYIRGLIQvGO4QvGMQRNJADv+GIqTC/5PGz4JBJ41JBIPJCg2TD4QLGn4JB/gUaHwRTGHwRTHBIRTGNAQyJ8gyI+QdFp4JB/IdFk5lLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJoyJC/4A="))),
palette: colorPalette palette: colorPalette
}; };
var bgLeft = settings.fullscreen ? bgLeftFullscreen : bgLeftNotFullscreen; let bgLeft = settings.fullscreen ? bgLeftFullscreen : bgLeftNotFullscreen;
var bgRight= settings.fullscreen ? bgRightFullscreen : bgRightNotFullscreen; let bgRight= settings.fullscreen ? bgRightFullscreen : bgRightNotFullscreen;
var iconEarth = { let iconEarth = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA="))
}; };
var iconSaturn = { let iconSaturn = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
transparent : 1, transparent : 1,
buffer : require("heatshrink").decompress(atob("AH4A/AEkQuPHCJ0ChEAwARNjAjBjgjOhs06Q2OEYVx4ARMhEggUMkANIDoIgBoEEgEBNxJEC6ZrBAAMwNxAjDNYcHNxIjB7dtEwIHBwRoKj158+cuPEjlwCRAjC23bpu0wRNDAAsHEYWeEwaSJ6YjCAQUNSRQjEzxQBWZMNEYlsmg2JWAIjCz95SoJuJggjDtuw6dMG5JKCz998wFBJRVNEYW0yaVBJRNhJQN9+4pCzhKJmBKC4YpB/fINxIgCzFxSoQ3J4ENm3CAQPb98wbpEcAQMYWwKYBNxMDXgc2/fv3g2IEAOAgAjBjy5CEhEMfYICBgfPnjdLjj+CgMHiC3JknDhhoINw4jCAB0IJQIANR4QjPAH4A/AFA")) buffer : require("heatshrink").decompress(atob("AH4A/AEkQuPHCJ0ChEAwARNjAjBjgjOhs06Q2OEYVx4ARMhEggUMkANIDoIgBoEEgEBNxJEC6ZrBAAMwNxAjDNYcHNxIjB7dtEwIHBwRoKj158+cuPEjlwCRAjC23bpu0wRNDAAsHEYWeEwaSJ6YjCAQUNSRQjEzxQBWZMNEYlsmg2JWAIjCz95SoJuJggjDtuw6dMG5JKCz998wFBJRVNEYW0yaVBJRNhJQN9+4pCzhKJmBKC4YpB/fINxIgCzFxSoQ3J4ENm3CAQPb98wbpEcAQMYWwKYBNxMDXgc2/fv3g2IEAOAgAjBjy5CEhEMfYICBgfPnjdLjj+CgMHiC3JknDhhoINw4jCAB0IJQIANR4QjPAH4A/AFA"))
}; };
var iconMoon = { let iconMoon = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
transparent : 1, transparent : 1,
buffer : require("heatshrink").decompress(atob("AH4AQjlx44CCCZsg8eOkHDwAQKEYgmPhEgEQM48AOIgMHEYoCB4ATI8UAmH/x04JoRuJsImHuBKLn37EwZuIgEQOI8cEpXj/yYBhE8+YNGgkYoJxITBUPnAaC///nC+FjBuIOJZEB8YeCh/8AoYACoMEEAnEjhQDPQJKJ/DCDAoi5DoLdHAoMQgLjFWYPOnngh02IwXzwDjEgPGEYS8BI4MBYoSVG4fP/nghkAgZrDkngJQqSG4gvBg4sBQgkImHihEAWwP8ZBMBEYl5/+cSoVAGQIUFh04weJn///0gj/OEw5KEz45BzhuCTYQAEgePB4IACAoJuBnAQEa4XHjxKB//xFgWHJQsCRgMDEonipwjENwUBDQNx8+evvn/hTDLw3igE+EgZxB8UOXIvEJQUfEYOfv53DEQkgga5BJQvzx84cAj+CDoNh8/eEYJKDuCSEcocnEon+/7xEgFBIIcfB4Mf/IICXI2DgDdBAAn758gCIq5Dv4zBvJuIOIfjEgvP/ARHgwdCB4P3AoTdFAAk4EYk8SQgAFTALaDSQwAGh08//vnDmBABYmEEZYAzA==")) buffer : require("heatshrink").decompress(atob("AH4AQjlx44CCCZsg8eOkHDwAQKEYgmPhEgEQM48AOIgMHEYoCB4ATI8UAmH/x04JoRuJsImHuBKLn37EwZuIgEQOI8cEpXj/yYBhE8+YNGgkYoJxITBUPnAaC///nC+FjBuIOJZEB8YeCh/8AoYACoMEEAnEjhQDPQJKJ/DCDAoi5DoLdHAoMQgLjFWYPOnngh02IwXzwDjEgPGEYS8BI4MBYoSVG4fP/nghkAgZrDkngJQqSG4gvBg4sBQgkImHihEAWwP8ZBMBEYl5/+cSoVAGQIUFh04weJn///0gj/OEw5KEz45BzhuCTYQAEgePB4IACAoJuBnAQEa4XHjxKB//xFgWHJQsCRgMDEonipwjENwUBDQNx8+evvn/hTDLw3igE+EgZxB8UOXIvEJQUfEYOfv53DEQkgga5BJQvzx84cAj+CDoNh8/eEYJKDuCSEcocnEon+/7xEgFBIIcfB4Mf/IICXI2DgDdBAAn758gCIq5Dv4zBvJuIOIfjEgvP/ARHgwdCB4P3AoTdFAAk4EYk8SQgAFTALaDSQwAGh08//vnDmBABYmEEZYAzA=="))
}; };
var iconMars = { let iconMars = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
transparent : 1, transparent : 1,
buffer : require("heatshrink").decompress(atob("AH4ATjlwCJ+Dh0wwAQMg0cuPHjFhCZkDps0yVJkmQCBMEjFx42atOmzQmLhMkEYQCCCREQoOGEYmmzB0IEY4CBkARGoJKBEYQCEzgSGkGSpAjDyYCCphuGiFhJQgCD8ASFgRHGAQKbB6BuHJRGeOIsINxEk6dNmARDgMEjQjHAQPnVQojIyZKB6YSDNwK5FAQt54BuDXJIjBEwK5EgxKKXgq5BJRdgXIojJAQJKMcAM0EwM2JUApDoCVFExa7FkGCgAmIkAREEwUEjAmHCIgABhEggQmFpACBCIojBEwRQCzVhwkQU4YADgQmBwQCCI4IFBCAojFAQojGJQQjDAQgRGEZICBEo4gFyUIkilFJQUYEAZrBAQMYNw5KDSQSbCNwwABgOGEwgCBsPACQ5xGwdNnARJcAVh48evvnCJK8Chs+/fv33gCRcB48cuPHCBYA/ADAA==")) buffer : require("heatshrink").decompress(atob("AH4ATjlwCJ+Dh0wwAQMg0cuPHjFhCZkDps0yVJkmQCBMEjFx42atOmzQmLhMkEYQCCCREQoOGEYmmzB0IEY4CBkARGoJKBEYQCEzgSGkGSpAjDyYCCphuGiFhJQgCD8ASFgRHGAQKbB6BuHJRGeOIsINxEk6dNmARDgMEjQjHAQPnVQojIyZKB6YSDNwK5FAQt54BuDXJIjBEwK5EgxKKXgq5BJRdgXIojJAQJKMcAM0EwM2JUApDoCVFExa7FkGCgAmIkAREEwUEjAmHCIgABhEggQmFpACBCIojBEwRQCzVhwkQU4YADgQmBwQCCI4IFBCAojFAQojGJQQjDAQgRGEZICBEo4gFyUIkilFJQUYEAZrBAQMYNw5KDSQSbCNwwABgOGEwgCBsPACQ5xGwdNnARJcAVh48evvnCJK8Chs+/fv33gCRcB48cuPHCBYA/ADAA=="))
}; };
var iconSatellite = { let iconSatellite = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
transparent : 2, transparent : 2,
buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA="))
}; };
var iconCharging = { let iconCharging = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
transparent : 5, transparent : 5,
buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A"))
}; };
var iconWarning = { let iconWarning = {
width : 50, height : 50, bpp : 3, width : 50, height : 50, bpp : 3,
transparent : 1, transparent : 1,
buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA"))
@ -172,26 +173,26 @@ Graphics.prototype.setFontAntonioLarge = function(scale) {
/* /*
* Draw watch face * Draw watch face
*/ */
var drawTimeout; let drawTimeout;
function queueDraw() { let queueDraw = function() {
// Faster updates during alarm to ensure that it is // Faster updates during alarm to ensure that it is
// shown correctly... // shown correctly...
var timeout = isAlarmEnabled() ? 10000 : 60000; let timeout = isAlarmEnabled() ? 10000 : 60000;
if (drawTimeout) clearTimeout(drawTimeout); if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() { drawTimeout = setTimeout(function() {
drawTimeout = undefined; drawTimeout = undefined;
draw(); draw();
}, timeout - (Date.now() % timeout)); }, timeout - (Date.now() % timeout));
} };
/** /**
* This function plots a data row in LCARS style. * This function plots a data row in LCARS style.
* Note: It can be called async and therefore, the text alignment and * Note: It can be called async and therefore, the text alignment and
* font is set each time the function is called. * font is set each time the function is called.
*/ */
function printRow(text, value, y, c){ let printRow = function(text, value, y, c){
g.setFontAntonioMedium(); g.setFontAntonioMedium();
g.setFontAlign(-1,-1,0); g.setFontAlign(-1,-1,0);
@ -210,23 +211,23 @@ function printRow(text, value, y, c){
g.setColor(c); g.setColor(c);
g.setFontAlign(1,-1,0); g.setFontAlign(1,-1,0);
g.drawString(value, 126, y); g.drawString(value, 126, y);
} };
function drawData(key, y, c){ let drawData = function(key, y, c){
try{ try{
_drawData(key, y, c); _drawData(key, y, c);
} catch(ex){ } catch(ex){
// Show last error - next try hopefully works. // Show last error - next try hopefully works.
} }
} };
function _drawData(key, y, c){ let _drawData = function(key, y, c){
key = key.toUpperCase() key = key.toUpperCase()
var text = key; let text = key;
var value = "ERR"; let value = "ERR";
var should_print= true; let should_print= true;
if(key == "STEPS"){ if(key == "STEPS"){
text = "STEP"; text = "STEP";
@ -246,17 +247,17 @@ function _drawData(key, y, c){
value = Math.round(Bangle.getHealthStatus().bpm||Bangle.getHealthStatus("last").bpm); value = Math.round(Bangle.getHealthStatus().bpm||Bangle.getHealthStatus("last").bpm);
} else if (key == "TEMP"){ } else if (key == "TEMP"){
var weather = getWeather(); let weather = getWeather();
value = weather.temp; value = weather.temp;
} else if (key == "HUMIDITY"){ } else if (key == "HUMIDITY"){
text = "HUM"; text = "HUM";
var weather = getWeather(); let weather = getWeather();
value = weather.hum; value = weather.hum;
} else if (key == "WIND"){ } else if (key == "WIND"){
text = "WND"; text = "WND";
var weather = getWeather(); let weather = getWeather();
value = weather.wind; value = weather.wind;
} else if (key == "ALTITUDE"){ } else if (key == "ALTITUDE"){
@ -280,18 +281,18 @@ function _drawData(key, y, c){
if(should_print){ if(should_print){
printRow(text, value, y, c); printRow(text, value, y, c);
} }
} };
function drawHorizontalBgLine(color, x1, x2, y, h){ let drawHorizontalBgLine = function(color, x1, x2, y, h){
g.setColor(color); g.setColor(color);
for(var i=0; i<h; i++){ for(let i=0; i<h; i++){
g.drawLine(x1, y+i, x2,y+i); g.drawLine(x1, y+i, x2,y+i);
} }
} };
function drawInfo(){ let drawInfo = function(){
if(lcarsViewPos != 0 || !settings.fullscreen){ if(lcarsViewPos != 0 || !settings.fullscreen){
return; return;
} }
@ -313,9 +314,9 @@ function drawInfo(){
g.setColor(color3); g.setColor(color3);
g.drawString("LOCK", 128, 53); g.drawString("LOCK", 128, 53);
} }
} };
function drawState(){ let drawState = function(){
if(lcarsViewPos != 0){ if(lcarsViewPos != 0){
return; return;
} }
@ -325,11 +326,11 @@ function drawState(){
g.setFontAntonioMedium(); g.setFontAntonioMedium();
if(!isAlarmEnabled()){ if(!isAlarmEnabled()){
var bat = E.getBattery(); let bat = E.getBattery();
var flash = storage.getFree() / process.env.STORAGE; let flash = storage.getFree() / process.env.STORAGE;
var current = new Date(); let current = new Date();
var hours = current.getHours(); let hours = current.getHours();
var iconMsg = let iconMsg =
Bangle.isCharging() ? { icon: iconCharging, text: "STATUS" } : Bangle.isCharging() ? { icon: iconCharging, text: "STATUS" } :
bat < 30 ? { icon: iconWarning, text: "BAT" } : bat < 30 ? { icon: iconWarning, text: "BAT" } :
flash < 0.1 ? { icon: iconWarning, text: "DISK" } : flash < 0.1 ? { icon: iconWarning, text: "DISK" } :
@ -351,12 +352,12 @@ function drawState(){
} }
g.setFontAlign(-1, -1, 0); g.setFontAlign(-1, -1, 0);
} };
function drawPosition0(){ let drawPosition0 = function(){
// Draw background image // Draw background image
var offset = settings.fullscreen ? 0 : 24; let offset = settings.fullscreen ? 0 : 24;
g.drawImage(bgLeft, 0, offset); g.drawImage(bgLeft, 0, offset);
drawHorizontalBgLine(color1, 25, 120, offset, 4); drawHorizontalBgLine(color1, 25, 120, offset, 4);
drawHorizontalBgLine(color1, 130, 176, offset, 4); drawHorizontalBgLine(color1, 130, 176, offset, 4);
@ -366,13 +367,13 @@ function drawPosition0(){
drawHorizontalBgLine(color2, 120, 176, 87, 4); drawHorizontalBgLine(color2, 120, 176, 87, 4);
// The last line is a battery indicator too // The last line is a battery indicator too
var bat = E.getBattery() / 100.0; let bat = E.getBattery() / 100.0;
var batStart = 19; let batStart = 19;
var batWidth = 172 - batStart; let batWidth = 172 - batStart;
var batX2 = parseInt(batWidth * bat + batStart); let batX2 = parseInt(batWidth * bat + batStart);
drawHorizontalBgLine(color2, batStart, batX2, 171, 5); drawHorizontalBgLine(color2, batStart, batX2, 171, 5);
drawHorizontalBgLine(cGrey, batX2, 172, 171, 5); drawHorizontalBgLine(cGrey, batX2, 172, 171, 5);
for(var i=0; i+batStart<=172; i+=parseInt(batWidth/4)){ for(let i=0; i+batStart<=172; i+=parseInt(batWidth/4)){
drawHorizontalBgLine(cBlack, batStart+i, batStart+i+3, 168, 8) drawHorizontalBgLine(cBlack, batStart+i, batStart+i+3, 168, 8)
} }
@ -382,8 +383,8 @@ function drawPosition0(){
// Write time // Write time
g.setFontAlign(-1, -1, 0); g.setFontAlign(-1, -1, 0);
g.setColor(cWhite); g.setColor(cWhite);
var currentDate = new Date(); let currentDate = new Date();
var timeStr = locale.time(currentDate,1); let timeStr = locale.time(currentDate,1);
g.setFontAntonioLarge(); g.setFontAntonioLarge();
if(settings.fullscreen){ if(settings.fullscreen){
g.drawString(timeStr, 27, 10); g.drawString(timeStr, 27, 10);
@ -395,13 +396,13 @@ function drawPosition0(){
g.setColor(cWhite); g.setColor(cWhite);
g.setFontAntonioMedium(); g.setFontAntonioMedium();
if(settings.fullscreen){ if(settings.fullscreen){
var dayStr = locale.dow(currentDate, true).toUpperCase(); let dayStr = locale.dow(currentDate, true).toUpperCase();
dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getDate();
dayStr += " " + locale.month(currentDate, 1).toUpperCase(); dayStr += " " + locale.month(currentDate, 1).toUpperCase();
g.drawString(dayStr, 30, 56); g.drawString(dayStr, 30, 56);
} else { } else {
var dayStr = locale.dow(currentDate, true).toUpperCase(); let dayStr = locale.dow(currentDate, true).toUpperCase();
var date = currentDate.getDate(); let date = currentDate.getDate();
g.drawString(dayStr, 128, 35); g.drawString(dayStr, 128, 35);
g.drawString(date, 128, 55); g.drawString(date, 128, 55);
} }
@ -415,11 +416,11 @@ function drawPosition0(){
// Draw state // Draw state
drawState(); drawState();
} };
function drawPosition1(){ let drawPosition1 = function(){
// Draw background image // Draw background image
var offset = settings.fullscreen ? 0 : 24; let offset = settings.fullscreen ? 0 : 24;
g.drawImage(bgRight, 149, offset); g.drawImage(bgRight, 149, offset);
if(settings.fullscreen){ if(settings.fullscreen){
drawHorizontalBgLine(color1, 0, 140, offset, 4); drawHorizontalBgLine(color1, 0, 140, offset, 4);
@ -447,8 +448,8 @@ function drawPosition1(){
// Plot HRM graph // Plot HRM graph
if(plotMonth){ if(plotMonth){
var data = new Uint16Array(32); let data = new Uint16Array(32);
var cnt = new Uint8Array(32); let cnt = new Uint8Array(32);
health.readDailySummaries(new Date(), h=>{ health.readDailySummaries(new Date(), h=>{
data[h.day]+=h.bpm; data[h.day]+=h.bpm;
if (h.bpm) cnt[h.day]++; if (h.bpm) cnt[h.day]++;
@ -465,9 +466,9 @@ function drawPosition1(){
}); });
// Plot step graph // Plot step graph
var data = new Uint16Array(32); data = new Uint16Array(32);
health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000);
var gridY = parseInt(Math.max.apply(Math, data)/2); let gridY = parseInt(Math.max.apply(Math, data)/2);
gridY = gridY <= 0 ? 1 : gridY; gridY = gridY <= 0 ? 1 : gridY;
require("graph").drawBar(g, data, { require("graph").drawBar(g, data, {
axes : true, axes : true,
@ -493,8 +494,8 @@ function drawPosition1(){
// Plot day // Plot day
} else { } else {
var data = new Uint16Array(24); let data = new Uint16Array(24);
var cnt = new Uint8Array(24); let cnt = new Uint8Array(24);
health.readDay(new Date(), h=>{ health.readDay(new Date(), h=>{
data[h.hr]+=h.bpm; data[h.hr]+=h.bpm;
if (h.bpm) cnt[h.hr]++; if (h.bpm) cnt[h.hr]++;
@ -511,9 +512,9 @@ function drawPosition1(){
}); });
// Plot step graph // Plot step graph
var data = new Uint16Array(24); data = new Uint16Array(24);
health.readDay(new Date(), h=>data[h.hr]+=h.steps); health.readDay(new Date(), h=>data[h.hr]+=h.steps);
var gridY = parseInt(Math.max.apply(Math, data)/1000)*1000; let gridY = parseInt(Math.max.apply(Math, data)/1000)*1000;
gridY = gridY <= 0 ? 1000 : gridY; gridY = gridY <= 0 ? 1000 : gridY;
require("graph").drawBar(g, data, { require("graph").drawBar(g, data, {
axes : true, axes : true,
@ -537,9 +538,9 @@ function drawPosition1(){
g.drawString("DAY", 154, 115); g.drawString("DAY", 154, 115);
} }
} }
} };
function draw(){ let draw = function(){
// Queue draw first to ensure that its called in one minute again. // Queue draw first to ensure that its called in one minute again.
queueDraw(); queueDraw();
@ -560,14 +561,14 @@ function draw(){
} else { } else {
Bangle.drawWidgets(); Bangle.drawWidgets();
} }
} };
/* /*
* Step counter via widget * Step counter via widget
*/ */
function getSteps() { let getSteps = function() {
var steps = 0; let steps = 0;
try{ try{
if (WIDGETS.wpedom !== undefined) { if (WIDGETS.wpedom !== undefined) {
steps = WIDGETS.wpedom.getSteps(); steps = WIDGETS.wpedom.getSteps();
@ -581,15 +582,15 @@ function getSteps() {
} }
return steps; return steps;
} };
function getWeather(){ let getWeather = function(){
var weatherJson; let weatherJson;
try { try {
weatherJson = storage.readJSON('weather.json'); weatherJson = storage.readJSON('weather.json');
var weather = weatherJson.weather; let weather = weatherJson.weather;
// Temperature // Temperature
weather.temp = locale.temp(weather.temp-273.15); weather.temp = locale.temp(weather.temp-273.15);
@ -599,7 +600,7 @@ function getWeather(){
// Wind // Wind
const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/);
var speedFactor = settings.speed == "kph" ? 1.0 : 1.0 / 1.60934; let speedFactor = settings.speed == "kph" ? 1.0 : 1.0 / 1.60934;
weather.wind = Math.round(wind[1] * speedFactor); weather.wind = Math.round(wind[1] * speedFactor);
return weather return weather
@ -616,15 +617,15 @@ function getWeather(){
wdir: " ? ", wdir: " ? ",
wrose: " ? " wrose: " ? "
}; };
} };
/* /*
* Handle alarm * Handle alarm
*/ */
function isAlarmEnabled(){ let isAlarmEnabled = function(){
try{ try{
var alarm = require('sched'); let alarm = require('sched');
var alarmObj = alarm.getAlarm(TIMER_IDX); let alarmObj = alarm.getAlarm(TIMER_IDX);
if(alarmObj===undefined || !alarmObj.on){ if(alarmObj===undefined || !alarmObj.on){
return false; return false;
} }
@ -633,35 +634,35 @@ function isAlarmEnabled(){
} catch(ex){ } } catch(ex){ }
return false; return false;
} };
function getAlarmMinutes(){ let getAlarmMinutes = function(){
if(!isAlarmEnabled()){ if(!isAlarmEnabled()){
return -1; return -1;
} }
var alarm = require('sched'); let alarm = require('sched');
var alarmObj = alarm.getAlarm(TIMER_IDX); let alarmObj = alarm.getAlarm(TIMER_IDX);
return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000));
} };
function increaseAlarm(){ let increaseAlarm = function(){
try{ try{
var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; let minutes = isAlarmEnabled() ? getAlarmMinutes() : 0;
var alarm = require('sched') let alarm = require('sched')
alarm.setAlarm(TIMER_IDX, { alarm.setAlarm(TIMER_IDX, {
timer : (minutes+5)*60*1000, timer : (minutes+5)*60*1000,
}); });
alarm.reload(); alarm.reload();
} catch(ex){ } } catch(ex){ }
} };
function decreaseAlarm(){ let decreaseAlarm = function(){
try{ try{
var minutes = getAlarmMinutes(); let minutes = getAlarmMinutes();
minutes -= 5; minutes -= 5;
var alarm = require('sched') let alarm = require('sched')
alarm.setAlarm(TIMER_IDX, undefined); alarm.setAlarm(TIMER_IDX, undefined);
if(minutes > 0){ if(minutes > 0){
@ -672,13 +673,13 @@ function decreaseAlarm(){
alarm.reload(); alarm.reload();
} catch(ex){ } } catch(ex){ }
} };
/* /*
* Listeners * Listeners
*/ */
Bangle.on('lcdPower',on=>{ let onLcdPower = on=>{
if (on) { if (on) {
// Whenever we connect to Gadgetbridge, reading data from // Whenever we connect to Gadgetbridge, reading data from
// health failed. Therefore, we update only partially... // health failed. Therefore, we update only partially...
@ -688,31 +689,34 @@ Bangle.on('lcdPower',on=>{
if (drawTimeout) clearTimeout(drawTimeout); if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined; drawTimeout = undefined;
} }
}); };
Bangle.on('lcdPower', onLcdPower);
Bangle.on('lock', function(isLocked) { let onLock = function(isLocked) {
drawInfo(); drawInfo();
}); };
Bangle.on('lock', onLock);
Bangle.on('charging',function(charging) {
let onCharge = function(charging) {
drawState(); drawState();
}); };
Bangle.on('charging', onCharge);
function feedback(){ let feedback = function(){
Bangle.buzz(40, 0.3); Bangle.buzz(40, 0.3);
} };
// Touch gestures to control clock. We don't use swipe to be compatible with the bangle ecosystem let onTouch = function(btn, e){
Bangle.on('touch', function(btn, e){ let left = parseInt(g.getWidth() * 0.2);
var left = parseInt(g.getWidth() * 0.2); let right = g.getWidth() - left;
var right = g.getWidth() - left; let upper = parseInt(g.getHeight() * 0.2);
var upper = parseInt(g.getHeight() * 0.2); let lower = g.getHeight() - upper;
var lower = g.getHeight() - upper;
var is_left = e.x < left; let is_left = e.x < left;
var is_right = e.x > right; let is_right = e.x > right;
var is_upper = e.y < upper; let is_upper = e.y < upper;
var is_lower = e.y > lower; let is_lower = e.y > lower;
if(!settings.disableData){ if(!settings.disableData){
if(is_left && lcarsViewPos == 1){ if(is_left && lcarsViewPos == 1){
@ -747,16 +751,30 @@ Bangle.on('touch', function(btn, e){
draw(); draw();
return; return;
} }
}); };
// Touch gestures to control clock. We don't use swipe to be compatible with the bangle ecosystem
Bangle.on('touch', onTouch);
let themeBefore = g.theme;
/* /*
* Lets start widgets, listen for btn etc. * Lets start widgets, listen for btn etc.
*/ */
// Show launcher when middle button pressed // Show launcher when middle button pressed
Bangle.setUI("clock"); Bangle.setUI({mode:"clock",remove:function() {
if (drawTimeout) clearTimeout(drawTimeout);
delete Graphics.prototype.setFontAntonioMedium;
delete Graphics.prototype.setFontAntonioLarge;
Bangle.removeListener("lcdPower",onLcdPower);
Bangle.removeListener("lock",onLock);
Bangle.removeListener("charging",onCharge);
Bangle.removeListener("touch",onTouch);
require('sched').setAlarm(TIMER_IDX, undefined);
g.setTheme(themeBefore);
widget_utils.cleanup();
}});
Bangle.loadWidgets(); Bangle.loadWidgets();
// Clear the screen once, at startup and draw clock // Clear the screen once, at startup and draw clock
g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear();
draw(); draw();
}

View File

@ -3,7 +3,7 @@
"name": "LCARS Clock", "name": "LCARS Clock",
"shortName":"LCARS", "shortName":"LCARS",
"icon": "lcars.png", "icon": "lcars.png",
"version":"0.28", "version":"0.29",
"readme": "README.md", "readme": "README.md",
"supports": ["BANGLEJS2"], "supports": ["BANGLEJS2"],
"description": "Library Computer Access Retrieval System (LCARS) clock.", "description": "Library Computer Access Retrieval System (LCARS) clock.",