forked from FOSS/BangleApps
183 lines
6.2 KiB
JavaScript
183 lines
6.2 KiB
JavaScript
//Binary LED Clock (BLC) by aeMKai
|
|
|
|
{ // must be inside our own scope here so that when we are unloaded everything disappears
|
|
// we also define functions using 'let fn = function() {..}' for the same reason. function decls are global
|
|
|
|
const SETTINGSFILE = "BinaryClk.settings.json";
|
|
|
|
// variables defined from settings
|
|
let HourCol;
|
|
let MinCol;
|
|
let DayCol;
|
|
let MonCol;
|
|
let RingOn;
|
|
|
|
// color arrays
|
|
// !!! don't change order unless change oder in BinaryClk.settings.js !!!
|
|
// !!! order must correspond to each other between arrays !!!
|
|
let LED_Colors = ["#FFF", "#F00", "#0F0", "#00F", "#FF0", "#F0F", "#0FF", "#000"];
|
|
let LED_ColorNames = ["white", "red", "green", "blue", "yellow", "magenta", "cyan", "black"];
|
|
|
|
// load settings
|
|
let loadSettings = function()
|
|
{
|
|
function def (value, def) {return value !== undefined ? value : def;}
|
|
|
|
var settings = require('Storage').readJSON(SETTINGSFILE, true) || {};
|
|
// get name from setting, find index of name and assign corresponding color code by index
|
|
HourCol = LED_Colors[LED_ColorNames.indexOf(def(settings.HourCol, "red"))];
|
|
MinCol = LED_Colors[LED_ColorNames.indexOf(def(settings.MinCol, "green"))];
|
|
DayCol = LED_Colors[LED_ColorNames.indexOf(def(settings.DayCol, "yellow"))];
|
|
MonCol = LED_Colors[LED_ColorNames.indexOf(def(settings.MonCol, "yellow"))];
|
|
RingOn = def(settings.RingOn, true);
|
|
|
|
delete settings; // settings in local var -> no more required
|
|
}
|
|
|
|
let drawTimeout;
|
|
|
|
// actually draw the watch face
|
|
let draw = function()
|
|
{
|
|
// Bangle.js2 -> 176x176
|
|
var x_rgt = g.getWidth();
|
|
var y_bot = g.getHeight();
|
|
//var x_cntr = x_rgt / 2;
|
|
var y_cntr = y_bot / 18*7;
|
|
g.reset().clearRect(Bangle.appRect); // clear whole background (w/o widgets)
|
|
|
|
var white = "#FFF";
|
|
var black = "#000";
|
|
var bord_col = white;
|
|
var col_off = black;
|
|
|
|
var col = new Array(HourCol, MinCol, DayCol, MonCol); // each #rgb
|
|
if (g.theme.dark)
|
|
{
|
|
bord_col = white;
|
|
col_off = black;
|
|
}
|
|
else
|
|
{
|
|
bord_col = black;
|
|
col_off = white;
|
|
}
|
|
|
|
let pwr2 = [1, 2, 4, 8, 16, 32]; // array with powers of 2, because poweroperator '**' doesnt work
|
|
// maybe also faster
|
|
|
|
|
|
var no_lines = 4; // 4 rows: hour (hr), minute (min), day (day), month (mon)
|
|
var no_hour = 5;
|
|
var no_min = 6;
|
|
var no_day = 5;
|
|
var no_mon = 4;
|
|
|
|
// arrays: [hr, min, day, mon]
|
|
let msbits = [no_hour-1, no_min-1, no_day-1, no_mon-1]; // MSB = No bits - 1
|
|
let rad = [13, 13, 9, 9]; // radiuses for each row
|
|
var x_dist = 29;
|
|
let y_dist = [0, 35, 75, 100]; // y-position from y_centr for each row from top
|
|
// don't calc. automatic as for x, because of different spaces
|
|
var x_offs_rgt = 15; // offset from right border (layout)
|
|
var y_offs_cntr = 25; // vertical offset from center
|
|
|
|
////////////////////////////////////////
|
|
// compute bit-pattern from time/date and draw leds
|
|
////////////////////////////////////////
|
|
|
|
// date-time-array: 4x6 bit
|
|
//var idx_hour = 0;
|
|
//var idx_min = 1;
|
|
//var idx_day = 2;
|
|
//var idx_mon = 3;
|
|
var dt_bit_arr = [[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0]];
|
|
|
|
var date_time = new Date();
|
|
var hour = date_time.getHours(); // 0..23
|
|
var min = date_time.getMinutes(); // 0..59
|
|
var day = date_time.getDate(); // 1..31
|
|
var mon = date_time.getMonth() + 1; // GetMonth() -> 0..11
|
|
|
|
let dt_array = [hour, min, day, mon];
|
|
|
|
var line_cnt = 0;
|
|
var cnt = 0;
|
|
var bit_cnt = 0;
|
|
|
|
while (line_cnt < no_lines)
|
|
{
|
|
|
|
////////////////////////////////////////
|
|
// compute bit-pattern
|
|
bit_cnt = msbits[line_cnt];
|
|
|
|
while (bit_cnt >= 0)
|
|
{
|
|
if (dt_array[line_cnt] >= pwr2[bit_cnt])
|
|
{
|
|
dt_array[line_cnt] -= pwr2[bit_cnt];
|
|
dt_bit_arr[line_cnt][bit_cnt] = 1;
|
|
}
|
|
else
|
|
{
|
|
dt_bit_arr[line_cnt][bit_cnt] = 0;
|
|
}
|
|
bit_cnt--;
|
|
}
|
|
|
|
////////////////////////////////////////
|
|
// draw leds (and border, if enabled)
|
|
cnt = 0;
|
|
|
|
while (cnt <= msbits[line_cnt])
|
|
{
|
|
if (RingOn) // draw outer ring, if enabled
|
|
{
|
|
g.setColor(bord_col);
|
|
g.drawCircle(x_rgt-x_offs_rgt-cnt*x_dist, y_cntr-y_offs_cntr+y_dist[line_cnt], rad[line_cnt]);
|
|
}
|
|
if (dt_bit_arr[line_cnt][cnt] == 1)
|
|
{
|
|
g.setColor(col[line_cnt]);
|
|
}
|
|
else
|
|
{
|
|
g.setColor(col_off);
|
|
}
|
|
g.fillCircle(x_rgt-x_offs_rgt-cnt*x_dist, y_cntr-y_offs_cntr+y_dist[line_cnt], rad[line_cnt]-1);
|
|
cnt++;
|
|
}
|
|
line_cnt++;
|
|
}
|
|
|
|
// queue next draw
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
drawTimeout = setTimeout(function()
|
|
{
|
|
drawTimeout = undefined;
|
|
draw();
|
|
}, 60000 - (Date.now() % 60000));
|
|
}
|
|
|
|
|
|
// Init the settings of the app
|
|
loadSettings();
|
|
|
|
// Show launcher when middle button pressed
|
|
Bangle.setUI(
|
|
{
|
|
mode : "clock",
|
|
remove : function()
|
|
{
|
|
// Called to unload all of the clock app
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
drawTimeout = undefined;
|
|
}
|
|
});
|
|
// Load widgets
|
|
Bangle.loadWidgets();
|
|
draw();
|
|
setTimeout(Bangle.drawWidgets,0);
|
|
}
|