mirror of https://github.com/espruino/BangleApps
parent
0a32e40b1a
commit
c6fd71be03
|
@ -29,6 +29,13 @@
|
||||||
"ecmaVersion": 11
|
"ecmaVersion": 11
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"indent": [
|
||||||
|
"error",
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
"SwitchCase": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
"no-case-declarations": "off",
|
"no-case-declarations": "off",
|
||||||
"no-constant-condition": "off",
|
"no-constant-condition": "off",
|
||||||
"no-delete-var": "off",
|
"no-delete-var": "off",
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
(() => {
|
(() => {
|
||||||
|
|
||||||
//Graph module, as long as modules are not added by the app loader
|
//Graph module, as long as modules are not added by the app loader
|
||||||
Modules.addCached("graph",function(){exports.drawAxes=function(b,c,a){function h(a){return e+m*(a-t)/x}function l(a){return f+g-g*(a-n)/u}var k=a.padx||0,d=a.pady||0,t=-k,w=c.length+k-1,n=(void 0!==a.miny?a.miny:a.miny=c.reduce(function(a,b){return Math.min(a,b)},c[0]))-d;c=(void 0!==a.maxy?a.maxy:a.maxy=c.reduce(function(a,b){return Math.max(a,b)},c[0]))+d;a.gridy&&(d=a.gridy,n=d*Math.floor(n/d),c=d*Math.ceil(c/d));var e=a.x||0,f=a.y||0,m=a.width||b.getWidth()-(e+1),g=a.height||b.getHeight()-(f+1);a.axes&&(null!==a.ylabel&&
|
Modules.addCached("graph",function(){exports.drawAxes=function(b,c,a){function h(a){return e+m*(a-t)/x}function l(a){return f+g-g*(a-n)/u}var k=a.padx||0,d=a.pady||0,t=-k,w=c.length+k-1,n=(void 0!==a.miny?a.miny:a.miny=c.reduce(function(a,b){return Math.min(a,b)},c[0]))-d;c=(void 0!==a.maxy?a.maxy:a.maxy=c.reduce(function(a,b){return Math.max(a,b)},c[0]))+d;a.gridy&&(d=a.gridy,n=d*Math.floor(n/d),c=d*Math.ceil(c/d));var e=a.x||0,f=a.y||0,m=a.width||b.getWidth()-(e+1),g=a.height||b.getHeight()-(f+1);a.axes&&(null!==a.ylabel&&
|
||||||
(e+=6,m-=6),null!==a.xlabel&&(g-=6));a.title&&(f+=6,g-=6);a.axes&&(b.drawLine(e,f,e,f+g),b.drawLine(e,f+g,e+m,f+g));a.title&&(b.setFontAlign(0,-1),b.drawString(a.title,e+m/2,f-6));var x=w-t,u=c-n;u||(u=1);if(a.gridx){b.setFontAlign(0,-1,0);var v=a.gridx;for(d=Math.ceil((t+k)/v)*v;d<=w-k;d+=v){var r=h(d),p=a.xlabel?a.xlabel(d):d;b.setPixel(r,f+g-1);var q=b.stringWidth(p)/2;null!==a.xlabel&&r>q&&b.getWidth()>r+q&&b.drawString(p,r,f+g+2)}}if(a.gridy)for(b.setFontAlign(0,0,1),d=n;d<=c;d+=a.gridy)k=l(d),
|
(e+=6,m-=6),null!==a.xlabel&&(g-=6));a.title&&(f+=6,g-=6);a.axes&&(b.drawLine(e,f,e,f+g),b.drawLine(e,f+g,e+m,f+g));a.title&&(b.setFontAlign(0,-1),b.drawString(a.title,e+m/2,f-6));var x=w-t,u=c-n;u||(u=1);if(a.gridx){b.setFontAlign(0,-1,0);var v=a.gridx;for(d=Math.ceil((t+k)/v)*v;d<=w-k;d+=v){var r=h(d),p=a.xlabel?a.xlabel(d):d;b.setPixel(r,f+g-1);var q=b.stringWidth(p)/2;null!==a.xlabel&&r>q&&b.getWidth()>r+q&&b.drawString(p,r,f+g+2)}}if(a.gridy)for(b.setFontAlign(0,0,1),d=n;d<=c;d+=a.gridy)k=l(d),
|
||||||
p=a.ylabel?a.ylabel(d):d,b.setPixel(e+1,k),q=b.stringWidth(p)/2,null!==a.ylabel&&k>q&&b.getHeight()>k+q&&b.drawString(p,e-5,k+1);b.setFontAlign(-1,-1,0);return{x:e,y:f,w:m,h:g,getx:h,gety:l}};exports.drawLine=function(b,c,a){a=a||{};a=exports.drawAxes(b,c,a);var h=!0,l;for(l in c)h?b.moveTo(a.getx(l),a.gety(c[l])):b.lineTo(a.getx(l),a.gety(c[l])),h=!1;return a};exports.drawBar=function(b,c,a){a=a||{};a.padx=1;a=exports.drawAxes(b,c,a);for(var h in c)b.fillRect(a.getx(h-.5)+1,a.gety(c[h]),a.getx(h+
|
p=a.ylabel?a.ylabel(d):d,b.setPixel(e+1,k),q=b.stringWidth(p)/2,null!==a.ylabel&&k>q&&b.getHeight()>k+q&&b.drawString(p,e-5,k+1);b.setFontAlign(-1,-1,0);return{x:e,y:f,w:m,h:g,getx:h,gety:l}};exports.drawLine=function(b,c,a){a=a||{};a=exports.drawAxes(b,c,a);var h=!0,l;for(l in c)h?b.moveTo(a.getx(l),a.gety(c[l])):b.lineTo(a.getx(l),a.gety(c[l])),h=!1;return a};exports.drawBar=function(b,c,a){a=a||{};a.padx=1;a=exports.drawAxes(b,c,a);for(var h in c)b.fillRect(a.getx(h-.5)+1,a.gety(c[h]),a.getx(h+
|
||||||
.5)-1,a.gety(0));return a}});
|
.5)-1,a.gety(0));return a}});
|
||||||
|
|
||||||
const storage = require("Storage");
|
const storage = require("Storage");
|
||||||
const SETTINGS_FILE = 'activepedom.settings.json';
|
const SETTINGS_FILE = 'activepedom.settings.json';
|
||||||
var history = 86400000; // 28800000=8h 43200000=12h //86400000=24h
|
var history = 86400000; // 28800000=8h 43200000=12h //86400000=24h
|
||||||
|
|
||||||
//return setting
|
//return setting
|
||||||
function setting(key) {
|
function setting(key) {
|
||||||
//define default settings
|
//define default settings
|
||||||
const DEFAULTS = {
|
const DEFAULTS = {
|
||||||
'cMaxTime' : 1100,
|
'cMaxTime' : 1100,
|
||||||
'cMinTime' : 240,
|
'cMinTime' : 240,
|
||||||
'stepThreshold' : 30,
|
'stepThreshold' : 30,
|
||||||
'intervalResetActive' : 30000,
|
'intervalResetActive' : 30000,
|
||||||
'stepSensitivity' : 80,
|
'stepSensitivity' : 80,
|
||||||
'stepGoal' : 10000,
|
'stepGoal' : 10000,
|
||||||
'stepLength' : 75,
|
'stepLength' : 75,
|
||||||
};
|
};
|
||||||
if (!settings) { loadSettings(); }
|
if (!settings) { loadSettings(); }
|
||||||
return (key in settings) ? settings[key] : DEFAULTS[key];
|
return (key in settings) ? settings[key] : DEFAULTS[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
//Convert ms to time
|
//Convert ms to time
|
||||||
function getTime(t) {
|
function getTime(t) {
|
||||||
date = new Date(t);
|
date = new Date(t);
|
||||||
offset = date.getTimezoneOffset() / 60;
|
offset = date.getTimezoneOffset() / 60;
|
||||||
//var milliseconds = parseInt((t % 1000) / 100),
|
//var milliseconds = parseInt((t % 1000) / 100),
|
||||||
|
@ -39,9 +39,9 @@ function getTime(t) {
|
||||||
minutes = (minutes < 10) ? "0" + minutes : minutes;
|
minutes = (minutes < 10) ? "0" + minutes : minutes;
|
||||||
seconds = (seconds < 10) ? "0" + seconds : seconds;
|
seconds = (seconds < 10) ? "0" + seconds : seconds;
|
||||||
return hours + ":" + minutes + ":" + seconds;
|
return hours + ":" + minutes + ":" + seconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDate(t) {
|
function getDate(t) {
|
||||||
date = new Date(t*1);
|
date = new Date(t*1);
|
||||||
year = date.getFullYear();
|
year = date.getFullYear();
|
||||||
month = date.getMonth()+1; //month is zero-based
|
month = date.getMonth()+1; //month is zero-based
|
||||||
|
@ -49,27 +49,27 @@ function getDate(t) {
|
||||||
month = (month < 10) ? "0" + month : month;
|
month = (month < 10) ? "0" + month : month;
|
||||||
day = (day < 10) ? "0" + day : day;
|
day = (day < 10) ? "0" + day : day;
|
||||||
return year + "-" + month + "-" + day;
|
return year + "-" + month + "-" + day;
|
||||||
}
|
}
|
||||||
|
|
||||||
//columns: 0=time, 1=stepsCounted, 2=active, 3=stepsTooShort, 4=stepsTooLong, 5=stepsOutsideTime
|
//columns: 0=time, 1=stepsCounted, 2=active, 3=stepsTooShort, 4=stepsTooLong, 5=stepsOutsideTime
|
||||||
function getArrayFromCSV(file, column) {
|
function getArrayFromCSV(file, column) {
|
||||||
i = 0;
|
i = 0;
|
||||||
array = [];
|
array = [];
|
||||||
now = new Date();
|
now = new Date();
|
||||||
while ((nextLine = file.readLine())) { //as long as there is a next line
|
while ((nextLine = file.readLine())) { //as long as there is a next line
|
||||||
if(nextLine) {
|
if(nextLine) {
|
||||||
dataSplitted = nextLine.split(','); //split line,
|
dataSplitted = nextLine.split(','); //split line,
|
||||||
diff = now - dataSplitted[0]; //calculate difference between now and stored time
|
diff = now - dataSplitted[0]; //calculate difference between now and stored time
|
||||||
if (diff <= history) { //only entries from the last x ms
|
if (diff <= history) { //only entries from the last x ms
|
||||||
array.push(dataSplitted[column]);
|
array.push(dataSplitted[column]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
i++;
|
}
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawGraph() {
|
function drawGraph() {
|
||||||
//times
|
//times
|
||||||
// actives = getArrayFromCSV(csvFile, 2);
|
// actives = getArrayFromCSV(csvFile, 2);
|
||||||
// shorts = getArrayFromCSV(csvFile, 3);
|
// shorts = getArrayFromCSV(csvFile, 3);
|
||||||
|
@ -104,62 +104,62 @@ function drawGraph() {
|
||||||
g.drawString("First: " + first, 10, 30);
|
g.drawString("First: " + first, 10, 30);
|
||||||
g.drawString(" Last: " + last, 10, 40);
|
g.drawString(" Last: " + last, 10, 40);
|
||||||
require("graph").drawLine(g, steps, {
|
require("graph").drawLine(g, steps, {
|
||||||
//title: "Steps Counted",
|
//title: "Steps Counted",
|
||||||
axes : true,
|
axes : true,
|
||||||
gridy : gridyValue,
|
gridy : gridyValue,
|
||||||
y : 60, //offset on screen
|
y : 60, //offset on screen
|
||||||
x : 5, //offset on screen
|
x : 5, //offset on screen
|
||||||
});
|
});
|
||||||
//free memory from big variables
|
//free memory from big variables
|
||||||
allData = undefined;
|
allData = undefined;
|
||||||
allDataFile = undefined;
|
allDataFile = undefined;
|
||||||
csvFile = undefined;
|
csvFile = undefined;
|
||||||
times = undefined;
|
times = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawMenu () {
|
function drawMenu () {
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFont("6x8", 1);
|
g.setFont("6x8", 1);
|
||||||
g.drawString("BTN1:Timespan | BTN2:Draw", 20, 10);
|
g.drawString("BTN1:Timespan | BTN2:Draw", 20, 10);
|
||||||
g.drawString("Timespan: " + history/1000/60/60 + " hours", 20, 20);
|
g.drawString("Timespan: " + history/1000/60/60 + " hours", 20, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
setWatch(function() { //BTN1
|
setWatch(function() { //BTN1
|
||||||
switch(history) {
|
switch(history) {
|
||||||
case 3600000 : //1h
|
case 3600000 : //1h
|
||||||
history = 14400000; //4h
|
history = 14400000; //4h
|
||||||
break;
|
break;
|
||||||
case 86400000 : //24
|
case 86400000 : //24
|
||||||
history = 3600000; //1h
|
history = 3600000; //1h
|
||||||
break;
|
break;
|
||||||
default :
|
default :
|
||||||
history = history + 14400000; //4h
|
history = history + 14400000; //4h
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
drawMenu();
|
drawMenu();
|
||||||
}, BTN1, {edge:"rising", debounce:50, repeat:true});
|
}, BTN1, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
setWatch(function() { //BTN2
|
setWatch(function() { //BTN2
|
||||||
g.setFont("6x8", 2);
|
g.setFont("6x8", 2);
|
||||||
g.drawString ("Drawing...",30,60);
|
g.drawString ("Drawing...",30,60);
|
||||||
drawGraph();
|
drawGraph();
|
||||||
}, BTN2, {edge:"rising", debounce:50, repeat:true});
|
}, BTN2, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
setWatch(function() { //BTN3
|
setWatch(function() { //BTN3
|
||||||
}, BTN3, {edge:"rising", debounce:50, repeat:true});
|
}, BTN3, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
setWatch(function() { //BTN4
|
setWatch(function() { //BTN4
|
||||||
}, BTN4, {edge:"rising", debounce:50, repeat:true});
|
}, BTN4, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
setWatch(function() { //BTN5
|
setWatch(function() { //BTN5
|
||||||
}, BTN5, {edge:"rising", debounce:50, repeat:true});
|
}, BTN5, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
//load settings
|
//load settings
|
||||||
let settings;
|
let settings;
|
||||||
function loadSettings() {
|
function loadSettings() {
|
||||||
settings = storage.readJSON(SETTINGS_FILE, 1) || {};
|
settings = storage.readJSON(SETTINGS_FILE, 1) || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
drawMenu();
|
drawMenu();
|
||||||
|
|
||||||
})();
|
})();
|
|
@ -26,7 +26,7 @@
|
||||||
var storeDataInterval = 5*60*1000; //ms
|
var storeDataInterval = 5*60*1000; //ms
|
||||||
|
|
||||||
let settings;
|
let settings;
|
||||||
//load settings
|
//load settings
|
||||||
function loadSettings() {
|
function loadSettings() {
|
||||||
settings = s.readJSON(SETTINGS_FILE, 1) || {};
|
settings = s.readJSON(SETTINGS_FILE, 1) || {};
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,8 @@
|
||||||
'stepGoal' : 10000,
|
'stepGoal' : 10000,
|
||||||
'stepLength' : 75,
|
'stepLength' : 75,
|
||||||
};
|
};
|
||||||
if (!settings) { loadSettings(); }
|
if (!settings) { loadSettings(); }
|
||||||
return (key in settings) ? settings[key] : DEFAULTS[key];
|
return (key in settings) ? settings[key] : DEFAULTS[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
function setStepSensitivity(s) {
|
function setStepSensitivity(s) {
|
||||||
|
|
|
@ -155,7 +155,7 @@ function drawMoonPositionPage(gps, title) {
|
||||||
drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 1});
|
drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 1});
|
||||||
|
|
||||||
let m = setWatch(() => {
|
let m = setWatch(() => {
|
||||||
let m = moonIndexPageMenu(gps);
|
let m = moonIndexPageMenu(gps);
|
||||||
}, BTN3, {repeat: false, edge: "falling"});
|
}, BTN3, {repeat: false, edge: "falling"});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,61 +232,61 @@ function drawSunShowPage(gps, key, date) {
|
||||||
drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 0});
|
drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 0});
|
||||||
|
|
||||||
m = setWatch(() => {
|
m = setWatch(() => {
|
||||||
m = sunIndexPageMenu(gps);
|
m = sunIndexPageMenu(gps);
|
||||||
}, BTN3, {repeat: false, edge: "falling"});
|
}, BTN3, {repeat: false, edge: "falling"});
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function sunIndexPageMenu(gps) {
|
function sunIndexPageMenu(gps) {
|
||||||
const sunTimes = SunCalc.getTimes(new Date(), gps.lat, gps.lon);
|
const sunTimes = SunCalc.getTimes(new Date(), gps.lat, gps.lon);
|
||||||
|
|
||||||
const sunMenu = {
|
const sunMenu = {
|
||||||
"": {
|
"": {
|
||||||
"title": "-- Sun --",
|
"title": "-- Sun --",
|
||||||
},
|
},
|
||||||
"Current Pos": () => {
|
"Current Pos": () => {
|
||||||
m = E.showMenu();
|
m = E.showMenu();
|
||||||
drawSunShowPage(gps, "Current Pos", new Date());
|
drawSunShowPage(gps, "Current Pos", new Date());
|
||||||
},
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.keys(sunTimes).sort().reduce((menu, key) => {
|
||||||
|
const title = titlizeKey(key);
|
||||||
|
menu[title] = () => {
|
||||||
|
m = E.showMenu();
|
||||||
|
drawSunShowPage(gps, key, sunTimes[key]);
|
||||||
};
|
};
|
||||||
|
return menu;
|
||||||
|
}, sunMenu);
|
||||||
|
|
||||||
Object.keys(sunTimes).sort().reduce((menu, key) => {
|
sunMenu["< Back"] = () => m = indexPageMenu(gps);
|
||||||
const title = titlizeKey(key);
|
|
||||||
menu[title] = () => {
|
|
||||||
m = E.showMenu();
|
|
||||||
drawSunShowPage(gps, key, sunTimes[key]);
|
|
||||||
};
|
|
||||||
return menu;
|
|
||||||
}, sunMenu);
|
|
||||||
|
|
||||||
sunMenu["< Back"] = () => m = indexPageMenu(gps);
|
return E.showMenu(sunMenu);
|
||||||
|
|
||||||
return E.showMenu(sunMenu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function moonIndexPageMenu(gps) {
|
function moonIndexPageMenu(gps) {
|
||||||
const moonMenu = {
|
const moonMenu = {
|
||||||
"": {
|
"": {
|
||||||
"title": "-- Moon --",
|
"title": "-- Moon --",
|
||||||
},
|
},
|
||||||
"Times": () => {
|
"Times": () => {
|
||||||
m = E.showMenu();
|
m = E.showMenu();
|
||||||
drawMoonTimesPage(gps, "Times");
|
drawMoonTimesPage(gps, "Times");
|
||||||
},
|
},
|
||||||
"Position": () => {
|
"Position": () => {
|
||||||
m = E.showMenu();
|
m = E.showMenu();
|
||||||
drawMoonPositionPage(gps, "Position");
|
drawMoonPositionPage(gps, "Position");
|
||||||
},
|
},
|
||||||
"Illumination": () => {
|
"Illumination": () => {
|
||||||
m = E.showMenu();
|
m = E.showMenu();
|
||||||
drawMoonIlluminationPage(gps, "Illumination");
|
drawMoonIlluminationPage(gps, "Illumination");
|
||||||
},
|
},
|
||||||
"< Back": () => m = indexPageMenu(gps),
|
"< Back": () => m = indexPageMenu(gps),
|
||||||
};
|
};
|
||||||
|
|
||||||
return E.showMenu(moonMenu);
|
return E.showMenu(moonMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
function indexPageMenu(gps) {
|
function indexPageMenu(gps) {
|
||||||
|
@ -314,74 +314,74 @@ function getCenterStringX(str) {
|
||||||
* GPS wait page, shows GPS locating animation until it gets a lock, then moves to the Sun page
|
* GPS wait page, shows GPS locating animation until it gets a lock, then moves to the Sun page
|
||||||
*/
|
*/
|
||||||
function drawGPSWaitPage() {
|
function drawGPSWaitPage() {
|
||||||
const img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4AW43GF1wwsFwYwqFwowoFw4wmFxIwdE5YAPF/4vM5nN6YAE5vMF8YtHGIgvhFpQxKF7AuOGA4vXFyAwGF63MFyIABF6xeWMC4UDLwvNGpAJG5gwSdhIIDRBLyWCIgcJHAgJJDoouQF4vMQoICBBJoeGFx6GGACIfHL6YvaX6gvZeCIdFc4gAFXogvGFxgwFDwovQCAguOGAnMMBxeG5guTGAggGGAwNKFySREcA3N5vM5gDBdpQvXEY4AKXqovGGCKbFF7AwPZQwvZGJgtGF7vGdQItG5gSIF7gASF/44WEzgwRF0wwHF1AwFF1QwDF1gvwAH4A/AFAA=="));
|
const img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4AW43GF1wwsFwYwqFwowoFw4wmFxIwdE5YAPF/4vM5nN6YAE5vMF8YtHGIgvhFpQxKF7AuOGA4vXFyAwGF63MFyIABF6xeWMC4UDLwvNGpAJG5gwSdhIIDRBLyWCIgcJHAgJJDoouQF4vMQoICBBJoeGFx6GGACIfHL6YvaX6gvZeCIdFc4gAFXogvGFxgwFDwovQCAguOGAnMMBxeG5guTGAggGGAwNKFySREcA3N5vM5gDBdpQvXEY4AKXqovGGCKbFF7AwPZQwvZGJgtGF7vGdQItG5gSIF7gASF/44WEzgwRF0wwHF1AwFF1QwDF1gvwAH4A/AFAA=="));
|
||||||
const str1 = "Astrocalc v0.02";
|
const str1 = "Astrocalc v0.02";
|
||||||
const str2 = "Locating GPS";
|
const str2 = "Locating GPS";
|
||||||
const str3 = "Please wait...";
|
const str3 = "Please wait...";
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
g.drawImage(img, 100, 50);
|
g.drawImage(img, 100, 50);
|
||||||
g.setFont("6x8", 1);
|
g.setFont("6x8", 1);
|
||||||
g.drawString(str1, getCenterStringX(str1), 105);
|
g.drawString(str1, getCenterStringX(str1), 105);
|
||||||
g.drawString(str2, getCenterStringX(str2), 140);
|
g.drawString(str2, getCenterStringX(str2), 140);
|
||||||
g.drawString(str3, getCenterStringX(str3), 155);
|
g.drawString(str3, getCenterStringX(str3), 155);
|
||||||
|
|
||||||
if (lastGPS) {
|
if (lastGPS) {
|
||||||
lastGPS = JSON.parse(lastGPS);
|
lastGPS = JSON.parse(lastGPS);
|
||||||
lastGPS.time = new Date();
|
lastGPS.time = new Date();
|
||||||
|
|
||||||
const str4 = "Press Button 3 to use last GPS";
|
const str4 = "Press Button 3 to use last GPS";
|
||||||
g.setColor("#d32e29");
|
g.setColor("#d32e29");
|
||||||
g.fillRect(0, 190, g.getWidth(), 215);
|
g.fillRect(0, 190, g.getWidth(), 215);
|
||||||
g.setColor("#ffffff");
|
g.setColor("#ffffff");
|
||||||
g.drawString(str4, getCenterStringX(str4), 200);
|
g.drawString(str4, getCenterStringX(str4), 200);
|
||||||
|
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
clearWatch();
|
|
||||||
Bangle.setGPSPower(0);
|
|
||||||
m = indexPageMenu(lastGPS);
|
|
||||||
}, BTN3, {repeat: false});
|
|
||||||
}
|
|
||||||
|
|
||||||
g.flip();
|
|
||||||
|
|
||||||
const DEBUG = false;
|
|
||||||
if (DEBUG) {
|
|
||||||
clearWatch();
|
clearWatch();
|
||||||
|
Bangle.setGPSPower(0);
|
||||||
|
m = indexPageMenu(lastGPS);
|
||||||
|
}, BTN3, {repeat: false});
|
||||||
|
}
|
||||||
|
|
||||||
const gps = {
|
g.flip();
|
||||||
"lat": 56.45783133333,
|
|
||||||
"lon": -3.02188583333,
|
|
||||||
"alt": 75.3,
|
|
||||||
"speed": 0.070376,
|
|
||||||
"course": NaN,
|
|
||||||
"time":new Date(),
|
|
||||||
"satellites": 4,
|
|
||||||
"fix": 1
|
|
||||||
};
|
|
||||||
|
|
||||||
m = indexPageMenu(gps);
|
const DEBUG = false;
|
||||||
|
if (DEBUG) {
|
||||||
|
clearWatch();
|
||||||
|
|
||||||
return;
|
const gps = {
|
||||||
}
|
"lat": 56.45783133333,
|
||||||
|
"lon": -3.02188583333,
|
||||||
|
"alt": 75.3,
|
||||||
|
"speed": 0.070376,
|
||||||
|
"course": NaN,
|
||||||
|
"time":new Date(),
|
||||||
|
"satellites": 4,
|
||||||
|
"fix": 1
|
||||||
|
};
|
||||||
|
|
||||||
Bangle.on('GPS', (gps) => {
|
m = indexPageMenu(gps);
|
||||||
if (gps.fix === 0) return;
|
|
||||||
clearWatch();
|
|
||||||
|
|
||||||
if (isNaN(gps.course)) gps.course = 0;
|
return;
|
||||||
require("Storage").writeJSON(LAST_GPS_FILE, JSON.stringify(gps));
|
}
|
||||||
Bangle.setGPSPower(0);
|
|
||||||
Bangle.buzz();
|
|
||||||
Bangle.setLCDPower(true);
|
|
||||||
|
|
||||||
m = indexPageMenu(gps);
|
Bangle.on('GPS', (gps) => {
|
||||||
});
|
if (gps.fix === 0) return;
|
||||||
|
clearWatch();
|
||||||
|
|
||||||
|
if (isNaN(gps.course)) gps.course = 0;
|
||||||
|
require("Storage").writeJSON(LAST_GPS_FILE, JSON.stringify(gps));
|
||||||
|
Bangle.setGPSPower(0);
|
||||||
|
Bangle.buzz();
|
||||||
|
Bangle.setLCDPower(true);
|
||||||
|
|
||||||
|
m = indexPageMenu(gps);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
Bangle.setGPSPower(1);
|
Bangle.setGPSPower(1);
|
||||||
drawGPSWaitPage();
|
drawGPSWaitPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
let m;
|
let m;
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
(function () { 'use strict';
|
(function () { 'use strict';
|
||||||
|
|
||||||
// shortcuts for easier to read formulas
|
// shortcuts for easier to read formulas
|
||||||
|
|
||||||
var PI = Math.PI,
|
var PI = Math.PI,
|
||||||
sin = Math.sin,
|
sin = Math.sin,
|
||||||
cos = Math.cos,
|
cos = Math.cos,
|
||||||
tan = Math.tan,
|
tan = Math.tan,
|
||||||
|
@ -17,219 +17,219 @@ var PI = Math.PI,
|
||||||
acos = Math.acos,
|
acos = Math.acos,
|
||||||
rad = PI / 180;
|
rad = PI / 180;
|
||||||
|
|
||||||
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
|
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
|
||||||
|
|
||||||
|
|
||||||
// date/time constants and conversions
|
// date/time constants and conversions
|
||||||
|
|
||||||
var dayMs = 1000 * 60 * 60 * 24,
|
var dayMs = 1000 * 60 * 60 * 24,
|
||||||
J1970 = 2440588,
|
J1970 = 2440588,
|
||||||
J2000 = 2451545;
|
J2000 = 2451545;
|
||||||
|
|
||||||
function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
|
function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
|
||||||
function fromJulian(j) { return (j + 0.5 - J1970) * dayMs; }
|
function fromJulian(j) { return (j + 0.5 - J1970) * dayMs; }
|
||||||
function toDays(date) { return toJulian(date) - J2000; }
|
function toDays(date) { return toJulian(date) - J2000; }
|
||||||
|
|
||||||
|
|
||||||
// general calculations for position
|
// general calculations for position
|
||||||
|
|
||||||
var e = rad * 23.4397; // obliquity of the Earth
|
var e = rad * 23.4397; // obliquity of the Earth
|
||||||
|
|
||||||
function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
|
function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
|
||||||
function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
|
function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
|
||||||
|
|
||||||
function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
|
function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
|
||||||
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
|
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
|
||||||
|
|
||||||
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
|
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
|
||||||
|
|
||||||
function astroRefraction(h) {
|
function astroRefraction(h) {
|
||||||
if (h < 0) // the following formula works for positive altitudes only.
|
if (h < 0) // the following formula works for positive altitudes only.
|
||||||
h = 0; // if h = -0.08901179 a div/0 would occur.
|
h = 0; // if h = -0.08901179 a div/0 would occur.
|
||||||
|
|
||||||
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||||
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
|
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
|
||||||
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
|
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
|
||||||
}
|
}
|
||||||
|
|
||||||
// general sun calculations
|
// general sun calculations
|
||||||
|
|
||||||
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
|
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
|
||||||
|
|
||||||
function eclipticLongitude(M) {
|
function eclipticLongitude(M) {
|
||||||
|
|
||||||
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
|
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
|
||||||
P = rad * 102.9372; // perihelion of the Earth
|
P = rad * 102.9372; // perihelion of the Earth
|
||||||
|
|
||||||
return M + C + P + PI;
|
return M + C + P + PI;
|
||||||
}
|
}
|
||||||
|
|
||||||
function sunCoords(d) {
|
function sunCoords(d) {
|
||||||
|
|
||||||
var M = solarMeanAnomaly(d),
|
var M = solarMeanAnomaly(d),
|
||||||
L = eclipticLongitude(M);
|
L = eclipticLongitude(M);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dec: declination(L, 0),
|
dec: declination(L, 0),
|
||||||
ra: rightAscension(L, 0)
|
ra: rightAscension(L, 0)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var SunCalc = {};
|
var SunCalc = {};
|
||||||
|
|
||||||
|
|
||||||
// calculates sun position for a given date and latitude/longitude
|
// calculates sun position for a given date and latitude/longitude
|
||||||
|
|
||||||
SunCalc.getPosition = function (date, lat, lng) {
|
SunCalc.getPosition = function (date, lat, lng) {
|
||||||
|
|
||||||
var lw = rad * -lng,
|
var lw = rad * -lng,
|
||||||
phi = rad * lat,
|
phi = rad * lat,
|
||||||
d = toDays(date),
|
d = toDays(date),
|
||||||
|
|
||||||
c = sunCoords(d),
|
c = sunCoords(d),
|
||||||
H = siderealTime(d, lw) - c.ra;
|
H = siderealTime(d, lw) - c.ra;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
azimuth: azimuth(H, phi, c.dec),
|
azimuth: azimuth(H, phi, c.dec),
|
||||||
altitude: altitude(H, phi, c.dec)
|
altitude: altitude(H, phi, c.dec)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// sun times configuration (angle, morning name, evening name)
|
// sun times configuration (angle, morning name, evening name)
|
||||||
|
|
||||||
var times = SunCalc.times = [
|
var times = SunCalc.times = [
|
||||||
[-0.833, 'sunrise', 'sunset' ],
|
[-0.833, 'sunrise', 'sunset' ],
|
||||||
[ -0.3, 'sunriseEnd', 'sunsetStart' ],
|
[ -0.3, 'sunriseEnd', 'sunsetStart' ],
|
||||||
[ -6, 'dawn', 'dusk' ],
|
[ -6, 'dawn', 'dusk' ],
|
||||||
[ -12, 'nauticalDawn', 'nauticalDusk'],
|
[ -12, 'nauticalDawn', 'nauticalDusk'],
|
||||||
[ -18, 'nightEnd', 'night' ],
|
[ -18, 'nightEnd', 'night' ],
|
||||||
[ 6, 'goldenHourEnd', 'goldenHour' ]
|
[ 6, 'goldenHourEnd', 'goldenHour' ]
|
||||||
];
|
];
|
||||||
|
|
||||||
// adds a custom time to the times config
|
// adds a custom time to the times config
|
||||||
|
|
||||||
SunCalc.addTime = function (angle, riseName, setName) {
|
SunCalc.addTime = function (angle, riseName, setName) {
|
||||||
times.push([angle, riseName, setName]);
|
times.push([angle, riseName, setName]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// calculations for sun times
|
// calculations for sun times
|
||||||
|
|
||||||
var J0 = 0.0009;
|
var J0 = 0.0009;
|
||||||
|
|
||||||
function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }
|
function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }
|
||||||
|
|
||||||
function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
|
function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
|
||||||
function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }
|
function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }
|
||||||
|
|
||||||
function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }
|
function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }
|
||||||
function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; }
|
function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; }
|
||||||
|
|
||||||
// returns set time for the given sun altitude
|
// returns set time for the given sun altitude
|
||||||
function getSetJ(h, lw, phi, dec, n, M, L) {
|
function getSetJ(h, lw, phi, dec, n, M, L) {
|
||||||
|
|
||||||
var w = hourAngle(h, phi, dec),
|
var w = hourAngle(h, phi, dec),
|
||||||
a = approxTransit(w, lw, n);
|
a = approxTransit(w, lw, n);
|
||||||
return solarTransitJ(a, M, L);
|
return solarTransitJ(a, M, L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// calculates sun times for a given date, latitude/longitude, and, optionally,
|
// calculates sun times for a given date, latitude/longitude, and, optionally,
|
||||||
// the observer height (in meters) relative to the horizon
|
// the observer height (in meters) relative to the horizon
|
||||||
|
|
||||||
SunCalc.getTimes = function (date, lat, lng, height) {
|
SunCalc.getTimes = function (date, lat, lng, height) {
|
||||||
|
|
||||||
height = height || 0;
|
height = height || 0;
|
||||||
|
|
||||||
var lw = rad * -lng,
|
var lw = rad * -lng,
|
||||||
phi = rad * lat,
|
phi = rad * lat,
|
||||||
|
|
||||||
dh = observerAngle(height),
|
dh = observerAngle(height),
|
||||||
|
|
||||||
d = toDays(date),
|
d = toDays(date),
|
||||||
n = julianCycle(d, lw),
|
n = julianCycle(d, lw),
|
||||||
ds = approxTransit(0, lw, n),
|
ds = approxTransit(0, lw, n),
|
||||||
|
|
||||||
M = solarMeanAnomaly(ds),
|
M = solarMeanAnomaly(ds),
|
||||||
L = eclipticLongitude(M),
|
L = eclipticLongitude(M),
|
||||||
dec = declination(L, 0),
|
dec = declination(L, 0),
|
||||||
|
|
||||||
Jnoon = solarTransitJ(ds, M, L),
|
Jnoon = solarTransitJ(ds, M, L),
|
||||||
|
|
||||||
i, len, time, h0, Jset, Jrise;
|
i, len, time, h0, Jset, Jrise;
|
||||||
|
|
||||||
|
|
||||||
var result = {
|
var result = {
|
||||||
solarNoon: new Date(fromJulian(Jnoon)),
|
solarNoon: new Date(fromJulian(Jnoon)),
|
||||||
nadir: new Date(fromJulian(Jnoon - 0.5))
|
nadir: new Date(fromJulian(Jnoon - 0.5))
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0, len = times.length; i < len; i += 1) {
|
for (i = 0, len = times.length; i < len; i += 1) {
|
||||||
time = times[i];
|
time = times[i];
|
||||||
h0 = (time[0] + dh) * rad;
|
h0 = (time[0] + dh) * rad;
|
||||||
|
|
||||||
Jset = getSetJ(h0, lw, phi, dec, n, M, L);
|
Jset = getSetJ(h0, lw, phi, dec, n, M, L);
|
||||||
Jrise = Jnoon - (Jset - Jnoon);
|
Jrise = Jnoon - (Jset - Jnoon);
|
||||||
|
|
||||||
result[time[1]] = new Date(fromJulian(Jrise) - (dayMs / 2));
|
result[time[1]] = new Date(fromJulian(Jrise) - (dayMs / 2));
|
||||||
result[time[2]] = new Date(fromJulian(Jset) + (dayMs / 2));
|
result[time[2]] = new Date(fromJulian(Jset) + (dayMs / 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
|
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
|
||||||
|
|
||||||
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
|
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
|
||||||
|
|
||||||
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
|
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
|
||||||
M = rad * (134.963 + 13.064993 * d), // mean anomaly
|
M = rad * (134.963 + 13.064993 * d), // mean anomaly
|
||||||
F = rad * (93.272 + 13.229350 * d), // mean distance
|
F = rad * (93.272 + 13.229350 * d), // mean distance
|
||||||
|
|
||||||
l = L + rad * 6.289 * sin(M), // longitude
|
l = L + rad * 6.289 * sin(M), // longitude
|
||||||
b = rad * 5.128 * sin(F), // latitude
|
b = rad * 5.128 * sin(F), // latitude
|
||||||
dt = 385001 - 20905 * cos(M); // distance to the moon in km
|
dt = 385001 - 20905 * cos(M); // distance to the moon in km
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ra: rightAscension(l, b),
|
ra: rightAscension(l, b),
|
||||||
dec: declination(l, b),
|
dec: declination(l, b),
|
||||||
dist: dt
|
dist: dt
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
SunCalc.getMoonPosition = function (date, lat, lng) {
|
SunCalc.getMoonPosition = function (date, lat, lng) {
|
||||||
|
|
||||||
var lw = rad * -lng,
|
var lw = rad * -lng,
|
||||||
phi = rad * lat,
|
phi = rad * lat,
|
||||||
d = toDays(date),
|
d = toDays(date),
|
||||||
|
|
||||||
c = moonCoords(d),
|
c = moonCoords(d),
|
||||||
H = siderealTime(d, lw) - c.ra,
|
H = siderealTime(d, lw) - c.ra,
|
||||||
h = altitude(H, phi, c.dec),
|
h = altitude(H, phi, c.dec),
|
||||||
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||||
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
|
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
|
||||||
|
|
||||||
h = h + astroRefraction(h); // altitude correction for refraction
|
h = h + astroRefraction(h); // altitude correction for refraction
|
||||||
|
|
||||||
return {
|
return {
|
||||||
azimuth: azimuth(H, phi, c.dec),
|
azimuth: azimuth(H, phi, c.dec),
|
||||||
altitude: h,
|
altitude: h,
|
||||||
distance: c.dist,
|
distance: c.dist,
|
||||||
parallacticAngle: pa
|
parallacticAngle: pa
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// calculations for illumination parameters of the moon,
|
// calculations for illumination parameters of the moon,
|
||||||
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
|
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
|
||||||
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||||
|
|
||||||
// Function updated from gist: https://gist.github.com/endel/dfe6bb2fbe679781948c
|
// Function updated from gist: https://gist.github.com/endel/dfe6bb2fbe679781948c
|
||||||
|
|
||||||
SunCalc.getMoonIllumination = function (date) {
|
SunCalc.getMoonIllumination = function (date) {
|
||||||
let month = date.getMonth();
|
let month = date.getMonth();
|
||||||
let year = date.getFullYear();
|
let year = date.getFullYear();
|
||||||
let day = date.getDate();
|
let day = date.getDate();
|
||||||
|
@ -256,57 +256,57 @@ SunCalc.getMoonIllumination = function (date) {
|
||||||
if (b >= 8) b = 0; // 0 and 8 are the same so turn 8 into 0
|
if (b >= 8) b = 0; // 0 and 8 are the same so turn 8 into 0
|
||||||
|
|
||||||
return {phase: b};
|
return {phase: b};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
function hoursLater(date, h) {
|
function hoursLater(date, h) {
|
||||||
return new Date(date.valueOf() + h * dayMs / 24);
|
return new Date(date.valueOf() + h * dayMs / 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
|
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
|
||||||
|
|
||||||
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
||||||
var t = date;
|
var t = date;
|
||||||
if (inUTC) t.setUTCHours(0, 0, 0, 0);
|
if (inUTC) t.setUTCHours(0, 0, 0, 0);
|
||||||
else t.setHours(0, 0, 0, 0);
|
else t.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
var hc = 0.133 * rad,
|
var hc = 0.133 * rad,
|
||||||
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
|
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
|
||||||
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
|
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
|
||||||
|
|
||||||
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
|
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
|
||||||
for (var i = 1; i <= 24; i += 2) {
|
for (var i = 1; i <= 24; i += 2) {
|
||||||
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
|
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
|
||||||
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
|
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
|
||||||
|
|
||||||
a = (h0 + h2) / 2 - h1;
|
a = (h0 + h2) / 2 - h1;
|
||||||
b = (h2 - h0) / 2;
|
b = (h2 - h0) / 2;
|
||||||
xe = -b / (2 * a);
|
xe = -b / (2 * a);
|
||||||
ye = (a * xe + b) * xe + h1;
|
ye = (a * xe + b) * xe + h1;
|
||||||
d = b * b - 4 * a * h1;
|
d = b * b - 4 * a * h1;
|
||||||
roots = 0;
|
roots = 0;
|
||||||
|
|
||||||
if (d >= 0) {
|
if (d >= 0) {
|
||||||
dx = Math.sqrt(d) / (Math.abs(a) * 2);
|
dx = Math.sqrt(d) / (Math.abs(a) * 2);
|
||||||
x1 = xe - dx;
|
x1 = xe - dx;
|
||||||
x2 = xe + dx;
|
x2 = xe + dx;
|
||||||
if (Math.abs(x1) <= 1) roots++;
|
if (Math.abs(x1) <= 1) roots++;
|
||||||
if (Math.abs(x2) <= 1) roots++;
|
if (Math.abs(x2) <= 1) roots++;
|
||||||
if (x1 < -1) x1 = x2;
|
if (x1 < -1) x1 = x2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (roots === 1) {
|
if (roots === 1) {
|
||||||
if (h0 < 0) rise = i + x1;
|
if (h0 < 0) rise = i + x1;
|
||||||
else set = i + x1;
|
else set = i + x1;
|
||||||
|
|
||||||
} else if (roots === 2) {
|
} else if (roots === 2) {
|
||||||
rise = i + (ye < 0 ? x2 : x1);
|
rise = i + (ye < 0 ? x2 : x1);
|
||||||
set = i + (ye < 0 ? x1 : x2);
|
set = i + (ye < 0 ? x1 : x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rise && set) break;
|
if (rise && set) break;
|
||||||
|
|
||||||
h0 = h2;
|
h0 = h2;
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = {};
|
var result = {};
|
||||||
|
@ -317,12 +317,12 @@ SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
||||||
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
|
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// export as Node module / AMD module / browser variable
|
// export as Node module / AMD module / browser variable
|
||||||
if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;
|
if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;
|
||||||
else if (typeof define === 'function' && define.amd) define(SunCalc);
|
else if (typeof define === 'function' && define.amd) define(SunCalc);
|
||||||
else global.SunCalc = SunCalc;
|
else global.SunCalc = SunCalc;
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
|
|
||||||
// Very coarse first approach to check if the BLE device is on.
|
// Very coarse first approach to check if the BLE device is on.
|
||||||
if (NRF.getSecurityStatus().connected)
|
if (NRF.getSecurityStatus().connected)
|
||||||
enabledConsumers = enabledConsumers | switchableConsumers.bluetooth;
|
enabledConsumers = enabledConsumers | switchableConsumers.bluetooth;
|
||||||
|
|
||||||
// Reset the event registration vars
|
// Reset the event registration vars
|
||||||
compassEventReceived = false;
|
compassEventReceived = false;
|
||||||
|
|
|
@ -6,98 +6,98 @@ const colpos = canvasWidth / numberOfColumns - 10;
|
||||||
const binSize = (canvasWidth / numberOfColumns) / 3;
|
const binSize = (canvasWidth / numberOfColumns) / 3;
|
||||||
|
|
||||||
const findBinary = target => {
|
const findBinary = target => {
|
||||||
return [
|
return [
|
||||||
[0, 0, 0, 0], // 0
|
[0, 0, 0, 0], // 0
|
||||||
[1, 0, 0, 0], // 1
|
[1, 0, 0, 0], // 1
|
||||||
[0, 1, 0, 0], // 2
|
[0, 1, 0, 0], // 2
|
||||||
[1, 1, 0, 0], // 3
|
[1, 1, 0, 0], // 3
|
||||||
[0, 0, 1, 0], // 4
|
[0, 0, 1, 0], // 4
|
||||||
[1, 0, 1, 0], // 5
|
[1, 0, 1, 0], // 5
|
||||||
[0, 1, 1, 0], // 6
|
[0, 1, 1, 0], // 6
|
||||||
[1, 1, 1, 0], // 7
|
[1, 1, 1, 0], // 7
|
||||||
[0, 0, 0, 1], // 8
|
[0, 0, 0, 1], // 8
|
||||||
[1, 0, 0, 1], // 9
|
[1, 0, 0, 1], // 9
|
||||||
][target];
|
][target];
|
||||||
};
|
};
|
||||||
|
|
||||||
const getCurrentTime = () => {
|
const getCurrentTime = () => {
|
||||||
const flattenArray = (array = []) => [].concat.apply([], array);
|
const flattenArray = (array = []) => [].concat.apply([], array);
|
||||||
const format = number => {
|
const format = number => {
|
||||||
const numberStr = number.toString();
|
const numberStr = number.toString();
|
||||||
return numberStr.length === 1 ? ["0", numberStr] : numberStr.split("");
|
return numberStr.length === 1 ? ["0", numberStr] : numberStr.split("");
|
||||||
};
|
};
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
return flattenArray([now.getHours(), now.getMinutes(), now.getSeconds()].map(format));
|
return flattenArray([now.getHours(), now.getMinutes(), now.getSeconds()].map(format));
|
||||||
};
|
};
|
||||||
|
|
||||||
let prevFrame = [];
|
let prevFrame = [];
|
||||||
const drawColumn = (position = 0, column = [0, 0, 0, 0]) => {
|
const drawColumn = (position = 0, column = [0, 0, 0, 0]) => {
|
||||||
const maxDotsPerColumn = [2, 4, 3, 4, 3, 4];
|
const maxDotsPerColumn = [2, 4, 3, 4, 3, 4];
|
||||||
|
|
||||||
const columnPos = position * colpos;
|
const columnPos = position * colpos;
|
||||||
let pos = colpos / 2 + 45;
|
let pos = colpos / 2 + 45;
|
||||||
const frame = column.reverse();
|
const frame = column.reverse();
|
||||||
const drawDot = fn => g[fn]((columnPos + colpos / 2), pos, binSize);
|
const drawDot = fn => g[fn]((columnPos + colpos / 2), pos, binSize);
|
||||||
|
|
||||||
for (let i = 0; i < frame.length; i += 1) {
|
for (let i = 0; i < frame.length; i += 1) {
|
||||||
if (i + maxDotsPerColumn[position] >= 4 || drawFullGrid) {
|
if (i + maxDotsPerColumn[position] >= 4 || drawFullGrid) {
|
||||||
if (prevFrame && prevFrame[position] && prevFrame[position][i]) {
|
if (prevFrame && prevFrame[position] && prevFrame[position][i]) {
|
||||||
if (frame[i] !== prevFrame[position][i]) {
|
if (frame[i] !== prevFrame[position][i]) {
|
||||||
// subsequent draw
|
// subsequent draw
|
||||||
g.clearRect((columnPos + colpos / 2) - 15, pos - 15, (columnPos + colpos / 2) + 20, pos + 20);
|
g.clearRect((columnPos + colpos / 2) - 15, pos - 15, (columnPos + colpos / 2) + 20, pos + 20);
|
||||||
if (frame[i]) {
|
if (frame[i]) {
|
||||||
drawDot('fillCircle');
|
drawDot('fillCircle');
|
||||||
} else {
|
} else {
|
||||||
drawDot('drawCircle');
|
drawDot('drawCircle');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// First draw
|
|
||||||
if (frame[i]) {
|
|
||||||
drawDot('fillCircle');
|
|
||||||
} else {
|
|
||||||
drawDot('drawCircle');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pos += colpos;
|
} else {
|
||||||
|
// First draw
|
||||||
|
if (frame[i]) {
|
||||||
|
drawDot('fillCircle');
|
||||||
|
} else {
|
||||||
|
drawDot('drawCircle');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
pos += colpos;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const drawClock = () => {
|
const drawClock = () => {
|
||||||
const data = getCurrentTime().map(findBinary);
|
const data = getCurrentTime().map(findBinary);
|
||||||
for (let i = 0; i < data.length; i += 1) {
|
for (let i = 0; i < data.length; i += 1) {
|
||||||
drawColumn(i, data[i]);
|
drawColumn(i, data[i]);
|
||||||
}
|
}
|
||||||
prevFrame = data;
|
prevFrame = data;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Themes
|
// Themes
|
||||||
const drawTheme = (idx) => () => {
|
const drawTheme = (idx) => () => {
|
||||||
idx += 1;
|
idx += 1;
|
||||||
const themes = [
|
const themes = [
|
||||||
[[0, 0, 0], [1, 1, 1]],
|
[[0, 0, 0], [1, 1, 1]],
|
||||||
[[1, 1, 1], [0, 0, 0]],
|
[[1, 1, 1], [0, 0, 0]],
|
||||||
[[0, 0, 0], [1, 0, 0]],
|
[[0, 0, 0], [1, 0, 0]],
|
||||||
[[0, 0, 0], [0, 1, 0]],
|
[[0, 0, 0], [0, 1, 0]],
|
||||||
[[0, 0, 0], [0, 0, 1]],
|
[[0, 0, 0], [0, 0, 1]],
|
||||||
];
|
];
|
||||||
if (idx >= themes.length) idx = 0;
|
if (idx >= themes.length) idx = 0;
|
||||||
const color = themes[idx];
|
const color = themes[idx];
|
||||||
g.setBgColor.apply(g, color[0]);
|
g.setBgColor.apply(g, color[0]);
|
||||||
g.setColor.apply(g, color[1]);
|
g.setColor.apply(g, color[1]);
|
||||||
g.clear();
|
g.clear();
|
||||||
};
|
};
|
||||||
|
|
||||||
const nextTheme = drawTheme(0);
|
const nextTheme = drawTheme(0);
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
prevFrame = [];
|
prevFrame = [];
|
||||||
Bangle.beep();
|
Bangle.beep();
|
||||||
nextTheme();
|
nextTheme();
|
||||||
}, BTN1, { repeat: true });
|
}, BTN1, { repeat: true });
|
||||||
|
|
||||||
Bangle.on('lcdPower', on => {
|
Bangle.on('lcdPower', on => {
|
||||||
if (on) drawClock();
|
if (on) drawClock();
|
||||||
});
|
});
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
|
|
|
@ -10,388 +10,388 @@ require('FontTeletext10x18Ascii').add(Graphics);
|
||||||
|
|
||||||
// Double height text
|
// Double height text
|
||||||
Graphics.prototype.drawStringDH = function (txt, px, py, align, gw) {
|
Graphics.prototype.drawStringDH = function (txt, px, py, align, gw) {
|
||||||
let g2 = Graphics.createArrayBuffer(gw,18,1,{msb:true});
|
let g2 = Graphics.createArrayBuffer(gw,18,1,{msb:true});
|
||||||
g2.setFontTeletext10x18Ascii();
|
g2.setFontTeletext10x18Ascii();
|
||||||
let w = g2.stringWidth(txt);
|
let w = g2.stringWidth(txt);
|
||||||
let c = (w+3)>>2;
|
let c = (w+3)>>2;
|
||||||
g2.drawString(txt);
|
g2.drawString(txt);
|
||||||
let img = {width:w,height:1,transparent:0,buffer:new ArrayBuffer(c)};
|
let img = {width:w,height:1,transparent:0,buffer:new ArrayBuffer(c)};
|
||||||
let a = new Uint8Array(img.buffer);
|
let a = new Uint8Array(img.buffer);
|
||||||
|
|
||||||
let x;
|
let x;
|
||||||
switch (align) {
|
switch (align) {
|
||||||
case 'C': x = px + (gw - w)/2; break;
|
case 'C': x = px + (gw - w)/2; break;
|
||||||
case 'R': x = gw - w + px; break;
|
case 'R': x = gw - w + px; break;
|
||||||
default: x = px;
|
default: x = px;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var y=0;y<18;y++) {
|
for (var y=0;y<18;y++) {
|
||||||
a.set(new Uint8Array(g2.buffer,gw*y/8,c));
|
a.set(new Uint8Array(g2.buffer,gw*y/8,c));
|
||||||
this.drawImage(img,x,py+y*2);
|
this.drawImage(img,x,py+y*2);
|
||||||
this.drawImage(img,x,py+1+y*2);
|
this.drawImage(img,x,py+1+y*2);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Fill rectangle rotated around the centre
|
// Fill rectangle rotated around the centre
|
||||||
Graphics.prototype.fillRotRect = function (sina, cosa, cx, cy, x0, x1, y0, y1) {
|
Graphics.prototype.fillRotRect = function (sina, cosa, cx, cy, x0, x1, y0, y1) {
|
||||||
let fn = Math.ceil;
|
let fn = Math.ceil;
|
||||||
return this.fillPoly([
|
return this.fillPoly([
|
||||||
fn(cx - x0*cosa + y0*sina), fn(cy - x0*sina - y0*cosa),
|
fn(cx - x0*cosa + y0*sina), fn(cy - x0*sina - y0*cosa),
|
||||||
fn(cx - x1*cosa + y0*sina), fn(cy - x1*sina - y0*cosa),
|
fn(cx - x1*cosa + y0*sina), fn(cy - x1*sina - y0*cosa),
|
||||||
fn(cx - x1*cosa + y1*sina), fn(cy - x1*sina - y1*cosa),
|
fn(cx - x1*cosa + y1*sina), fn(cy - x1*sina - y1*cosa),
|
||||||
fn(cx - x0*cosa + y1*sina), fn(cy - x0*sina - y1*cosa)
|
fn(cx - x0*cosa + y1*sina), fn(cy - x0*sina - y1*cosa)
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Draw a line from r1,a to r2,a relative to cx+cy
|
// Draw a line from r1,a to r2,a relative to cx+cy
|
||||||
Graphics.prototype.drawRotLine = function (sina, cosa, cx, cy, r1, r2) {
|
Graphics.prototype.drawRotLine = function (sina, cosa, cx, cy, r1, r2) {
|
||||||
return this.drawLine(
|
return this.drawLine(
|
||||||
cx + r1*sina, cy - r1*cosa,
|
cx + r1*sina, cy - r1*cosa,
|
||||||
cx + r2*sina, cy - r2*cosa
|
cx + r2*sina, cy - r2*cosa
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
(function(g) {
|
(function(g) {
|
||||||
// Display modes
|
// Display modes
|
||||||
//
|
//
|
||||||
// 0: full-screen
|
// 0: full-screen
|
||||||
// 1: with widgets
|
// 1: with widgets
|
||||||
// 2: centred on Bangle (v.1), no widgets or time/date
|
// 2: centred on Bangle (v.1), no widgets or time/date
|
||||||
// 3: centred with time above
|
// 3: centred with time above
|
||||||
// 4: centred with date above
|
// 4: centred with date above
|
||||||
// 5: centred with time and date above
|
// 5: centred with time and date above
|
||||||
let mode;
|
let mode;
|
||||||
|
|
||||||
// R1, R2: Outer and inner radii of hour marks
|
// R1, R2: Outer and inner radii of hour marks
|
||||||
// RC1, RC2: Outer and inner radii of hub
|
// RC1, RC2: Outer and inner radii of hub
|
||||||
// CX, CY: Centre location, relative to buffer (not screen, necessarily)
|
// CX, CY: Centre location, relative to buffer (not screen, necessarily)
|
||||||
// HW2, MW2: Half-width of hour and minute hand
|
// HW2, MW2: Half-width of hour and minute hand
|
||||||
// HR, MR: Length of hour and minute hand, relative to CX,CY
|
// HR, MR: Length of hour and minute hand, relative to CX,CY
|
||||||
// M: Half-width of gap in hour marks
|
// M: Half-width of gap in hour marks
|
||||||
// HSCALE: Half-width of hour mark as function(0<h<13)
|
// HSCALE: Half-width of hour mark as function(0<h<13)
|
||||||
let R1, R2, RC1, RC2, CX, CY, HW2, MW2, HR, MR, M, HSCALE;
|
let R1, R2, RC1, RC2, CX, CY, HW2, MW2, HR, MR, M, HSCALE;
|
||||||
|
|
||||||
// Screen size
|
// Screen size
|
||||||
const GW = g.getWidth();
|
const GW = g.getWidth();
|
||||||
const GH = g.getHeight();
|
const GH = g.getHeight();
|
||||||
|
|
||||||
// Top margin: the gap taken from the top of the buffer, except when
|
// Top margin: the gap taken from the top of the buffer, except when
|
||||||
// in mode 0 (full screen)
|
// in mode 0 (full screen)
|
||||||
let TM;
|
let TM;
|
||||||
|
|
||||||
// Buffer image. undefined means it needs regenerating
|
// Buffer image. undefined means it needs regenerating
|
||||||
let faceImg;
|
let faceImg;
|
||||||
|
|
||||||
// with_seconds flag determines whether the face is updated every
|
// with_seconds flag determines whether the face is updated every
|
||||||
// second or every minute, and to draw the hand or not.
|
// second or every minute, and to draw the hand or not.
|
||||||
let with_seconds = true;
|
let with_seconds = true;
|
||||||
|
|
||||||
// Display flags, determined from `mode` by setMode()
|
// Display flags, determined from `mode` by setMode()
|
||||||
let with_widgets = false;
|
let with_widgets = false;
|
||||||
let with_digital_time = true;
|
let with_digital_time = true;
|
||||||
let with_digital_date = true;
|
let with_digital_date = true;
|
||||||
|
|
||||||
// Create offscreen buffer for the once-per-minute face draw
|
// Create offscreen buffer for the once-per-minute face draw
|
||||||
const G1 = Graphics.createArrayBuffer(g.getWidth(), g.getHeight(), 1, {msb:true});
|
const G1 = Graphics.createArrayBuffer(g.getWidth(), g.getHeight(), 1, {msb:true});
|
||||||
|
|
||||||
// Precalculate sin/cos for the hour marks. Might be premature
|
// Precalculate sin/cos for the hour marks. Might be premature
|
||||||
// optimisation, but might as well.
|
// optimisation, but might as well.
|
||||||
let ss = [], cs = [];
|
let ss = [], cs = [];
|
||||||
|
for (let h=1; h<=12; h++) {
|
||||||
|
const a = Math.PI * h / 6;
|
||||||
|
ss[h] = Math.sin(a);
|
||||||
|
cs[h] = Math.cos(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the face with hour and minute hand. Ideally, we'd separate
|
||||||
|
// the face from the hands and double-buffer, but memory is limited,
|
||||||
|
// so we buffer once and minute, and draw the second hand dynamically
|
||||||
|
// (with a bit of flicker)
|
||||||
|
const drawFace = (G) => {
|
||||||
|
const fw = R1 * 2;
|
||||||
|
const fh = R1 * 2;
|
||||||
|
const fw2 = R1;
|
||||||
|
const fh2 = R1;
|
||||||
|
let hs = [];
|
||||||
|
|
||||||
|
// Wipe the image and start with white
|
||||||
|
G.clear();
|
||||||
|
G.setColor(1,1,1);
|
||||||
|
|
||||||
|
// Draw the hour marks.
|
||||||
for (let h=1; h<=12; h++) {
|
for (let h=1; h<=12; h++) {
|
||||||
const a = Math.PI * h / 6;
|
hs[h] = HSCALE(h);
|
||||||
ss[h] = Math.sin(a);
|
G.fillRotRect(ss[h], cs[h], CX, CY, -hs[h], hs[h], R2, R1);
|
||||||
cs[h] = Math.cos(a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the face with hour and minute hand. Ideally, we'd separate
|
// Draw the hub
|
||||||
// the face from the hands and double-buffer, but memory is limited,
|
G.fillCircle(CX, CY, RC1);
|
||||||
// so we buffer once and minute, and draw the second hand dynamically
|
|
||||||
// (with a bit of flicker)
|
|
||||||
const drawFace = (G) => {
|
|
||||||
const fw = R1 * 2;
|
|
||||||
const fh = R1 * 2;
|
|
||||||
const fw2 = R1;
|
|
||||||
const fh2 = R1;
|
|
||||||
let hs = [];
|
|
||||||
|
|
||||||
// Wipe the image and start with white
|
// Black
|
||||||
G.clear();
|
G.setColor(0,0,0);
|
||||||
G.setColor(1,1,1);
|
|
||||||
|
|
||||||
// Draw the hour marks.
|
// Clear the centre of the hub
|
||||||
for (let h=1; h<=12; h++) {
|
G.fillCircle(CX, CY, RC2);
|
||||||
hs[h] = HSCALE(h);
|
|
||||||
G.fillRotRect(ss[h], cs[h], CX, CY, -hs[h], hs[h], R2, R1);
|
|
||||||
|
|
||||||
}
|
// Draw the gap in the hour marks
|
||||||
|
for (let h=1; h<=12; h++) {
|
||||||
|
G.fillRotRect(ss[h], cs[h], CX, CY, -M, M, R2-1, R1+1);
|
||||||
|
}
|
||||||
|
|
||||||
// Draw the hub
|
// Back to white for future draw operations
|
||||||
G.fillCircle(CX, CY, RC1);
|
G.setColor(1,1,1);
|
||||||
|
|
||||||
// Black
|
// While the buffer remains full-screen, we may trim out the
|
||||||
G.setColor(0,0,0);
|
// bottom of the image so we can shift the whole thing down for
|
||||||
|
// widgets.
|
||||||
|
const img = {width:GW,height:GH-TM,buffer:G.buffer};
|
||||||
|
return img;
|
||||||
|
};
|
||||||
|
|
||||||
// Clear the centre of the hub
|
let hours, minutes, seconds, date;
|
||||||
G.fillCircle(CX, CY, RC2);
|
|
||||||
|
|
||||||
// Draw the gap in the hour marks
|
// Schedule event for calling at the start of the next second
|
||||||
for (let h=1; h<=12; h++) {
|
const inOneSecond = (cb) => {
|
||||||
G.fillRotRect(ss[h], cs[h], CX, CY, -M, M, R2-1, R1+1);
|
let now = new Date();
|
||||||
}
|
clearTimeout();
|
||||||
|
setTimeout(cb, 1000 - now.getMilliseconds());
|
||||||
|
};
|
||||||
|
|
||||||
// Back to white for future draw operations
|
// Schedule event for calling at the start of the next minute
|
||||||
G.setColor(1,1,1);
|
const inOneMinute = (cb) => {
|
||||||
|
let now = new Date();
|
||||||
|
clearTimeout();
|
||||||
|
setTimeout(cb, 60000 - (now.getSeconds() * 1000 + now.getMilliseconds()));
|
||||||
|
};
|
||||||
|
|
||||||
// While the buffer remains full-screen, we may trim out the
|
// Draw a fat hour/minute hand
|
||||||
// bottom of the image so we can shift the whole thing down for
|
const drawHand = (G, a, w2, r1, r2) =>
|
||||||
// widgets.
|
G.fillRotRect(Math.sin(a), Math.cos(a), CX, CY, -w2, w2, r1, r2);
|
||||||
const img = {width:GW,height:GH-TM,buffer:G.buffer};
|
|
||||||
return img;
|
|
||||||
};
|
|
||||||
|
|
||||||
let hours, minutes, seconds, date;
|
// Redraw function
|
||||||
|
const drawAll = (force) => {
|
||||||
|
let now = new Date();
|
||||||
|
|
||||||
// Schedule event for calling at the start of the next second
|
if (!faceImg) force = true;
|
||||||
const inOneSecond = (cb) => {
|
|
||||||
let now = new Date();
|
|
||||||
clearTimeout();
|
|
||||||
setTimeout(cb, 1000 - now.getMilliseconds());
|
|
||||||
};
|
|
||||||
|
|
||||||
// Schedule event for calling at the start of the next minute
|
let face_changed = force;
|
||||||
const inOneMinute = (cb) => {
|
let date_changed = false;
|
||||||
let now = new Date();
|
|
||||||
clearTimeout();
|
|
||||||
setTimeout(cb, 60000 - (now.getSeconds() * 1000 + now.getMilliseconds()));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Draw a fat hour/minute hand
|
tmp = hours;
|
||||||
const drawHand = (G, a, w2, r1, r2) =>
|
hours = now.getHours();
|
||||||
G.fillRotRect(Math.sin(a), Math.cos(a), CX, CY, -w2, w2, r1, r2);
|
if (tmp !== hours)
|
||||||
|
face_changed = true;
|
||||||
|
|
||||||
// Redraw function
|
tmp = minutes;
|
||||||
const drawAll = (force) => {
|
minutes = now.getMinutes();
|
||||||
let now = new Date();
|
if (tmp !== minutes)
|
||||||
|
face_changed = true;
|
||||||
|
|
||||||
if (!faceImg) force = true;
|
// If the face has been updated and/or needs a redraw,
|
||||||
|
// face_changed is true.
|
||||||
|
|
||||||
let face_changed = force;
|
let time_changed = face_changed;
|
||||||
let date_changed = false;
|
|
||||||
|
|
||||||
tmp = hours;
|
// If the screen needs an update, regardless of whether the face
|
||||||
hours = now.getHours();
|
// needs a redraw, time_changed is true.
|
||||||
if (tmp !== hours)
|
|
||||||
face_changed = true;
|
|
||||||
|
|
||||||
tmp = minutes;
|
if (with_seconds) {
|
||||||
minutes = now.getMinutes();
|
// If we're going by second, we always need an update.
|
||||||
if (tmp !== minutes)
|
seconds = now.getSeconds();
|
||||||
face_changed = true;
|
time_changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
// If the face has been updated and/or needs a redraw,
|
if (with_digital_date) {
|
||||||
// face_changed is true.
|
// See if the date has changed. If it has, then we need a
|
||||||
|
// full-blown redraw of the screen and the face, plus text.
|
||||||
|
tmp = date;
|
||||||
|
date = now.getDate();
|
||||||
|
if (tmp !== date) {
|
||||||
|
date_changed = true;
|
||||||
|
face_changed = true; // Should have changed anyway with hour/minute rollover
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let time_changed = face_changed;
|
if (face_changed) {
|
||||||
|
// Redraw the face and hands onto the buffer G1.
|
||||||
|
faceImg = drawFace(G1);
|
||||||
|
drawHand(G1, Math.PI*hours/6, HW2, RC1, HR);
|
||||||
|
drawHand(G1, Math.PI*minutes/30, MW2, RC1, MR);
|
||||||
|
}
|
||||||
|
|
||||||
// If the screen needs an update, regardless of whether the face
|
// Has the time updated? If so, we'll need to draw something.
|
||||||
// needs a redraw, time_changed is true.
|
if (time_changed) {
|
||||||
|
|
||||||
if (with_seconds) {
|
// Are we adding text?
|
||||||
// If we're going by second, we always need an update.
|
if (with_digital_date || with_digital_time) {
|
||||||
seconds = now.getSeconds();
|
|
||||||
time_changed = true;
|
// Construct the date/time text to add above the face
|
||||||
|
let d = now.toString();
|
||||||
|
let da = d.toString().split(" ");
|
||||||
|
let txt;
|
||||||
|
|
||||||
|
if (with_digital_time) {
|
||||||
|
txt = da[4].substr(0, 5);
|
||||||
|
if (with_digital_date)
|
||||||
|
G1.drawStringDH(txt+',', 24, 0, 'L', GW);
|
||||||
|
else
|
||||||
|
G1.drawStringDH(txt, 0, 0, 'C', GW);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (with_digital_date) {
|
if (with_digital_date) {
|
||||||
// See if the date has changed. If it has, then we need a
|
let txt = [da[0], da[1], da[2]].join(" ");
|
||||||
// full-blown redraw of the screen and the face, plus text.
|
if (with_digital_time)
|
||||||
tmp = date;
|
G1.drawStringDH(txt, -24, 0, 'R', GW);
|
||||||
date = now.getDate();
|
else
|
||||||
if (tmp !== date) {
|
G1.drawStringDH(txt, 0, 0, 'C', GW);
|
||||||
date_changed = true;
|
|
||||||
face_changed = true; // Should have changed anyway with hour/minute rollover
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (face_changed) {
|
// If the time has updated, we need to _at least_ draw the
|
||||||
// Redraw the face and hands onto the buffer G1.
|
// image to the screen.
|
||||||
faceImg = drawFace(G1);
|
g.setColor(1,1,1);
|
||||||
drawHand(G1, Math.PI*hours/6, HW2, RC1, HR);
|
g.drawImage({width:GW,
|
||||||
drawHand(G1, Math.PI*minutes/30, MW2, RC1, MR);
|
height:GH-TM,
|
||||||
}
|
buffer:G1.buffer}, 0, TM);
|
||||||
|
|
||||||
// Has the time updated? If so, we'll need to draw something.
|
// and possibly add the second hand
|
||||||
if (time_changed) {
|
if (with_seconds) {
|
||||||
|
let a = 2.0 * Math.PI * seconds / 60.0;
|
||||||
|
g.drawRotLine(Math.sin(a), Math.cos(a), CX, CY+TM, RC1, R1);
|
||||||
|
}
|
||||||
|
|
||||||
// Are we adding text?
|
// Clock chime on the hour.
|
||||||
if (with_digital_date || with_digital_time) {
|
if (hours >= 0 && minutes === 0)
|
||||||
|
|
||||||
// Construct the date/time text to add above the face
|
|
||||||
let d = now.toString();
|
|
||||||
let da = d.toString().split(" ");
|
|
||||||
let txt;
|
|
||||||
|
|
||||||
if (with_digital_time) {
|
|
||||||
txt = da[4].substr(0, 5);
|
|
||||||
if (with_digital_date)
|
|
||||||
G1.drawStringDH(txt+',', 24, 0, 'L', GW);
|
|
||||||
else
|
|
||||||
G1.drawStringDH(txt, 0, 0, 'C', GW);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (with_digital_date) {
|
|
||||||
let txt = [da[0], da[1], da[2]].join(" ");
|
|
||||||
if (with_digital_time)
|
|
||||||
G1.drawStringDH(txt, -24, 0, 'R', GW);
|
|
||||||
else
|
|
||||||
G1.drawStringDH(txt, 0, 0, 'C', GW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the time has updated, we need to _at least_ draw the
|
|
||||||
// image to the screen.
|
|
||||||
g.setColor(1,1,1);
|
|
||||||
g.drawImage({width:GW,
|
|
||||||
height:GH-TM,
|
|
||||||
buffer:G1.buffer}, 0, TM);
|
|
||||||
|
|
||||||
// and possibly add the second hand
|
|
||||||
if (with_seconds) {
|
|
||||||
let a = 2.0 * Math.PI * seconds / 60.0;
|
|
||||||
g.drawRotLine(Math.sin(a), Math.cos(a), CX, CY+TM, RC1, R1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clock chime on the hour.
|
|
||||||
if (hours >= 0 && minutes === 0)
|
|
||||||
try {
|
|
||||||
Bangle.buzz();
|
|
||||||
} catch (e) { }
|
|
||||||
|
|
||||||
// And draw widgets if we're in that mode
|
|
||||||
if (with_widgets)
|
|
||||||
Bangle.drawWidgets();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schedule to repeat this. A `setTimeout(1000)` isn't good
|
|
||||||
// enough, as all the above might've taken some milliseconds and
|
|
||||||
// we don't want to drift.
|
|
||||||
if (with_seconds)
|
|
||||||
inOneSecond(drawAll);
|
|
||||||
else
|
|
||||||
inOneMinute(drawAll);
|
|
||||||
};
|
|
||||||
|
|
||||||
const setButtons = () => {
|
|
||||||
const opts = { repeat: true, edge:'rising', debounce:30};
|
|
||||||
|
|
||||||
// BTN1: enable/disable second hand
|
|
||||||
setWatch(changeSeconds, BTN1, opts);
|
|
||||||
|
|
||||||
// BTN2: return to launcher
|
|
||||||
setWatch(Bangle.showLauncher, BTN2, { repeat:false, edge:'falling' });
|
|
||||||
|
|
||||||
// BTN3: change display mode
|
|
||||||
setWatch(function () { ++mode; setMode(); drawAll(true); }, BTN3, opts);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Load display parameters based on `mode`
|
|
||||||
const setMode = () => {
|
|
||||||
// Normalize mode to 0 <= mode <= 5
|
|
||||||
mode = (6+mode) % 6;
|
|
||||||
|
|
||||||
// [R1, R2, RC1, RC2, HW2, MW3, HR, MR, M, HSCALE] =
|
|
||||||
const scales = [
|
|
||||||
[120, 84, 17, 12.4, 4.6, 2.2, 8, 2, 1, h => (3.0 + Math.ceil(h/1.5)) ],
|
|
||||||
[102, 70, 14.6, 10.7, 3.88, 1.8, 8, 2, 1, h => (2.4 + Math.ceil(h/1.6)) ],
|
|
||||||
];
|
|
||||||
|
|
||||||
if (mode < 3) {
|
|
||||||
// Face without time/date text. Might have widgets though.
|
|
||||||
with_digital_time = with_digital_date = false;
|
|
||||||
with_widgets = (mode == 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Face with time/date text, but no widgets
|
|
||||||
with_digital_time = (mode-2)&1;
|
|
||||||
with_digital_date = (mode-2)&2;
|
|
||||||
with_widgets = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destructure the array to the global display parameters
|
|
||||||
let arr = scales[mode > 0 ? 1 : 0];
|
|
||||||
R1 = arr[0];
|
|
||||||
R2 = arr[1];
|
|
||||||
RC1 = arr[2];
|
|
||||||
RC2 = arr[3];
|
|
||||||
HW2 = arr[4];
|
|
||||||
MW2 = arr[5];
|
|
||||||
HR = R2 - arr[6];
|
|
||||||
MR = R1 - arr[7];
|
|
||||||
M = arr[8];
|
|
||||||
HSCALE = arr[9];
|
|
||||||
TM = with_widgets ? 36 : 0;
|
|
||||||
|
|
||||||
CX = GW/2;
|
|
||||||
CY = R1;
|
|
||||||
|
|
||||||
// If we're in the small-face + text regime, we're going to buffer
|
|
||||||
// the full screen but draw the clock face further down to give
|
|
||||||
// space for the text.
|
|
||||||
//
|
|
||||||
// Compare with modes 0 (full-screen) and 1 (with_widgets==true)
|
|
||||||
// where the face is drawn at the top of the buffer, but drawn
|
|
||||||
// lower down the screen (so CY doesn't move)
|
|
||||||
if (mode > 1) {
|
|
||||||
CY += 36;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We only don't bother redrawing the face from modes 2 to 5, as
|
|
||||||
// they're the same.
|
|
||||||
if (!faceImg || mode<3) {
|
|
||||||
faceImg = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store the settings for next time
|
|
||||||
try {
|
try {
|
||||||
storage.writeJSON(filename, [mode,with_seconds]);
|
Bangle.buzz();
|
||||||
} catch (e) {
|
} catch (e) { }
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear the screen: we need to make sure all parts are cleaned off.
|
// And draw widgets if we're in that mode
|
||||||
g.clear();
|
if (with_widgets)
|
||||||
};
|
Bangle.drawWidgets();
|
||||||
|
|
||||||
const changeSeconds = () => {
|
|
||||||
with_seconds = !with_seconds;
|
|
||||||
drawAll(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
Bangle.loadWidgets();
|
|
||||||
|
|
||||||
// Restore mode
|
|
||||||
try {
|
|
||||||
conf = storage.readJSON(filename);
|
|
||||||
mode = conf[0];
|
|
||||||
with_seconds = conf[1];
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e);
|
|
||||||
mode = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setButtons();
|
// Schedule to repeat this. A `setTimeout(1000)` isn't good
|
||||||
setMode();
|
// enough, as all the above might've taken some milliseconds and
|
||||||
drawAll();
|
// we don't want to drift.
|
||||||
|
if (with_seconds)
|
||||||
|
inOneSecond(drawAll);
|
||||||
|
else
|
||||||
|
inOneMinute(drawAll);
|
||||||
|
};
|
||||||
|
|
||||||
Bangle.on('lcdPower', (on) => {
|
const setButtons = () => {
|
||||||
if (on) {
|
const opts = { repeat: true, edge:'rising', debounce:30};
|
||||||
Bangle.loadWidgets();
|
|
||||||
Bangle.drawWidgets();
|
// BTN1: enable/disable second hand
|
||||||
drawAll();
|
setWatch(changeSeconds, BTN1, opts);
|
||||||
} else {
|
|
||||||
clearTimeout();
|
// BTN2: return to launcher
|
||||||
}
|
setWatch(Bangle.showLauncher, BTN2, { repeat:false, edge:'falling' });
|
||||||
});
|
|
||||||
|
// BTN3: change display mode
|
||||||
|
setWatch(function () { ++mode; setMode(); drawAll(true); }, BTN3, opts);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Load display parameters based on `mode`
|
||||||
|
const setMode = () => {
|
||||||
|
// Normalize mode to 0 <= mode <= 5
|
||||||
|
mode = (6+mode) % 6;
|
||||||
|
|
||||||
|
// [R1, R2, RC1, RC2, HW2, MW3, HR, MR, M, HSCALE] =
|
||||||
|
const scales = [
|
||||||
|
[120, 84, 17, 12.4, 4.6, 2.2, 8, 2, 1, h => (3.0 + Math.ceil(h/1.5)) ],
|
||||||
|
[102, 70, 14.6, 10.7, 3.88, 1.8, 8, 2, 1, h => (2.4 + Math.ceil(h/1.6)) ],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (mode < 3) {
|
||||||
|
// Face without time/date text. Might have widgets though.
|
||||||
|
with_digital_time = with_digital_date = false;
|
||||||
|
with_widgets = (mode == 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Face with time/date text, but no widgets
|
||||||
|
with_digital_time = (mode-2)&1;
|
||||||
|
with_digital_date = (mode-2)&2;
|
||||||
|
with_widgets = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructure the array to the global display parameters
|
||||||
|
let arr = scales[mode > 0 ? 1 : 0];
|
||||||
|
R1 = arr[0];
|
||||||
|
R2 = arr[1];
|
||||||
|
RC1 = arr[2];
|
||||||
|
RC2 = arr[3];
|
||||||
|
HW2 = arr[4];
|
||||||
|
MW2 = arr[5];
|
||||||
|
HR = R2 - arr[6];
|
||||||
|
MR = R1 - arr[7];
|
||||||
|
M = arr[8];
|
||||||
|
HSCALE = arr[9];
|
||||||
|
TM = with_widgets ? 36 : 0;
|
||||||
|
|
||||||
|
CX = GW/2;
|
||||||
|
CY = R1;
|
||||||
|
|
||||||
|
// If we're in the small-face + text regime, we're going to buffer
|
||||||
|
// the full screen but draw the clock face further down to give
|
||||||
|
// space for the text.
|
||||||
|
//
|
||||||
|
// Compare with modes 0 (full-screen) and 1 (with_widgets==true)
|
||||||
|
// where the face is drawn at the top of the buffer, but drawn
|
||||||
|
// lower down the screen (so CY doesn't move)
|
||||||
|
if (mode > 1) {
|
||||||
|
CY += 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only don't bother redrawing the face from modes 2 to 5, as
|
||||||
|
// they're the same.
|
||||||
|
if (!faceImg || mode<3) {
|
||||||
|
faceImg = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the settings for next time
|
||||||
|
try {
|
||||||
|
storage.writeJSON(filename, [mode,with_seconds]);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear the screen: we need to make sure all parts are cleaned off.
|
||||||
|
g.clear();
|
||||||
|
};
|
||||||
|
|
||||||
|
const changeSeconds = () => {
|
||||||
|
with_seconds = !with_seconds;
|
||||||
|
drawAll(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
Bangle.loadWidgets();
|
||||||
|
|
||||||
|
// Restore mode
|
||||||
|
try {
|
||||||
|
conf = storage.readJSON(filename);
|
||||||
|
mode = conf[0];
|
||||||
|
with_seconds = conf[1];
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
mode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
setButtons();
|
||||||
|
setMode();
|
||||||
|
drawAll();
|
||||||
|
|
||||||
|
Bangle.on('lcdPower', (on) => {
|
||||||
|
if (on) {
|
||||||
|
Bangle.loadWidgets();
|
||||||
|
Bangle.drawWidgets();
|
||||||
|
drawAll();
|
||||||
|
} else {
|
||||||
|
clearTimeout();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
})(g);
|
})(g);
|
||||||
|
|
|
@ -6,43 +6,43 @@ rowHeight = height/4;
|
||||||
rowlights = [];
|
rowlights = [];
|
||||||
|
|
||||||
function drawBerlinClock() {
|
function drawBerlinClock() {
|
||||||
var now = new Date();
|
var now = new Date();
|
||||||
rowlights[0] = Math.floor(now.getHours() / 5);
|
rowlights[0] = Math.floor(now.getHours() / 5);
|
||||||
rowlights[1] = now.getHours() % 5;
|
rowlights[1] = now.getHours() % 5;
|
||||||
rowlights[2] = Math.floor(now.getMinutes() / 5);
|
rowlights[2] = Math.floor(now.getMinutes() / 5);
|
||||||
rowlights[3] = now.getMinutes() % 5;
|
rowlights[3] = now.getMinutes() % 5;
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
|
|
||||||
g.drawRect(0,0,width,height);
|
g.drawRect(0,0,width,height);
|
||||||
for (row = 0 ; row < 4 ; row++) {
|
for (row = 0 ; row < 4 ; row++) {
|
||||||
nfields = fields[row];
|
nfields = fields[row];
|
||||||
boxWidth = width/nfields;
|
boxWidth = width/nfields;
|
||||||
|
|
||||||
for (col = 0 ; col < nfields ; col++) {
|
for (col = 0 ; col < nfields ; col++) {
|
||||||
x1 = col*boxWidth;
|
x1 = col*boxWidth;
|
||||||
y1 = row*rowHeight;
|
y1 = row*rowHeight;
|
||||||
x2 = (col+1)*boxWidth;
|
x2 = (col+1)*boxWidth;
|
||||||
y2 = (row+1)*rowHeight;
|
y2 = (row+1)*rowHeight;
|
||||||
|
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
g.drawRect(x1,y1,x2,y2);
|
g.drawRect(x1,y1,x2,y2);
|
||||||
if (col<rowlights[row]) {
|
if (col<rowlights[row]) {
|
||||||
|
|
||||||
if (row === 2 ) {
|
if (row === 2 ) {
|
||||||
if (((col+1) % 3) === 0) {
|
if (((col+1) % 3) === 0) {
|
||||||
g.setColor(1,0,0);
|
g.setColor(1,0,0);
|
||||||
} else {
|
|
||||||
g.setColor(1,1,0);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
g.setColor(1,0,0);
|
g.setColor(1,1,0);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
g.fillRect(x1+2,y1+2,x2-2,y2-2);
|
g.setColor(1,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.fillRect(x1+2,y1+2,x2-2,y2-2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// special function to handle display switch on
|
// special function to handle display switch on
|
||||||
|
@ -50,9 +50,9 @@ Bangle.on('lcdPower', (on) => {
|
||||||
g.clear();
|
g.clear();
|
||||||
if (on) {
|
if (on) {
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
// call your app function here
|
// call your app function here
|
||||||
drawBerlinClock();
|
drawBerlinClock();
|
||||||
}});
|
}});
|
||||||
|
|
||||||
// refesh every 15 sec
|
// refesh every 15 sec
|
||||||
setInterval(drawBerlinClock, 15E3);
|
setInterval(drawBerlinClock, 15E3);
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
const Clubs = { width : 48, height : 48, bpp : 1,
|
const Clubs = { width : 48, height : 48, bpp : 1,
|
||||||
buffer : require("heatshrink").decompress(atob("ACcP+AFDn/8Aod//wFD///AgUBAoOAApsDAoPAAr4vLI4pTEgP8L4M/wEH/5rB//gh//x/x//wj//9/3//4n4iBAAIZBAol/Aof+Apv5z4FP+OPAo41BAoX8I4Pj45HBAoPD4YFBLIOD4JZBRAMD4CKC/AFBj59Cg/gQYYFXAB4="))
|
buffer : require("heatshrink").decompress(atob("ACcP+AFDn/8Aod//wFD///AgUBAoOAApsDAoPAAr4vLI4pTEgP8L4M/wEH/5rB//gh//x/x//wj//9/3//4n4iBAAIZBAol/Aof+Apv5z4FP+OPAo41BAoX8I4Pj45HBAoPD4YFBLIOD4JZBRAMD4CKC/AFBj59Cg/gQYYFXAB4="))
|
||||||
};
|
};
|
||||||
|
|
||||||
const Spades = { width : 48, height : 48, bpp : 1,
|
const Spades = { width : 48, height : 48, bpp : 1,
|
||||||
buffer : require("heatshrink").decompress(atob("ABsBwAFDgfAAocH8AFDh/wAocf/AFDn/8Aod//wFD///FwYFBGAUDAoIwCg4FBGAUPAoIwCj4FBGAU/AoIwCv4FBGAQEBGAQuCGAQuCGAQFLHQQ8CAupHLL4prB+fPTgU/8fHVwbLLApbXFbpYFLdIoADA=="))
|
buffer : require("heatshrink").decompress(atob("ABsBwAFDgfAAocH8AFDh/wAocf/AFDn/8Aod//wFD///FwYFBGAUDAoIwCg4FBGAUPAoIwCj4FBGAU/AoIwCv4FBGAQEBGAQuCGAQuCGAQFLHQQ8CAupHLL4prB+fPTgU/8fHVwbLLApbXFbpYFLdIoADA=="))
|
||||||
};
|
};
|
||||||
|
|
||||||
const Hearts = { width : 48, height : 48, bpp : 4,
|
const Hearts = { width : 48, height : 48, bpp : 4,
|
||||||
buffer : require("heatshrink").decompress(atob("ADlVqtQBQ8FBYIKIrnMAAINGqoKC4okGCwYAB4AKDhgKE4oWKAAILDBQwYEBYwwDFwojFgoLHEgQ6H5hhCBZAkCBRAjLEgI6IC4YLIC5Y7BBZXBjgjVABYX/C8CnKABbXLABTvMC8sMC6fAC4KQURwIABRypgULwRgULwRIUCwhIRIwiRSRoZITCwx5POoowRCxAwNFxIwNCxQwLFxYwLCxgwJFxowJCxwwHFx4wHCyAwFFyIwFCyQwDFycAgoXBqAXTgFc4oWUJAJGUJARGVAEo"))
|
buffer : require("heatshrink").decompress(atob("ADlVqtQBQ8FBYIKIrnMAAINGqoKC4okGCwYAB4AKDhgKE4oWKAAILDBQwYEBYwwDFwojFgoLHEgQ6H5hhCBZAkCBRAjLEgI6IC4YLIC5Y7BBZXBjgjVABYX/C8CnKABbXLABTvMC8sMC6fAC4KQURwIABRypgULwRgULwRIUCwhIRIwiRSRoZITCwx5POoowRCxAwNFxIwNCxQwLFxYwLCxgwJFxowJCxwwHFx4wHCyAwFFyIwFCyQwDFycAgoXBqAXTgFc4oWUJAJGUJARGVAEo"))
|
||||||
};
|
};
|
||||||
|
|
||||||
const Diamonds = { width : 48, height : 48, bpp : 4,
|
const Diamonds = { width : 48, height : 48, bpp : 4,
|
||||||
buffer : require("heatshrink").decompress(atob("AHUFC60M4AXV5nFIyvM5hGVC4JIUCwJIUIwRIUIwRIUCwZISIwgABqBGUJCQWFPKBGGJCFcC455OCw4wOOox5QIxB5NOpBIOFxZ5LCxYwKOpQwMIxh5KOxipLL6xgNR5QwMX5TvXPJZ1JJBpGLPJR1LJBZGNPJIWOJA5GOPJB1NJBIWQPIpGRJApGRPIoWSJAa8PJA5GTJAYWUJAJGVAAJGVAHo="))
|
buffer : require("heatshrink").decompress(atob("AHUFC60M4AXV5nFIyvM5hGVC4JIUCwJIUIwRIUIwRIUCwZISIwgABqBGUJCQWFPKBGGJCFcC455OCw4wOOox5QIxB5NOpBIOFxZ5LCxYwKOpQwMIxh5KOxipLL6xgNR5QwMX5TvXPJZ1JJBpGLPJR1LJBZGNPJIWOJA5GOPJB1NJBIWQPIpGRJApGRPIoWSJAa8PJA5GTJAYWUJAJGVAAJGVAHo="))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var deck = [];
|
var deck = [];
|
||||||
|
@ -20,168 +20,168 @@ var player = {Hand:[]};
|
||||||
var computer = {Hand:[]};
|
var computer = {Hand:[]};
|
||||||
|
|
||||||
function createDeck() {
|
function createDeck() {
|
||||||
var suits = ["Spades", "Hearts", "Diamonds", "Clubs"];
|
var suits = ["Spades", "Hearts", "Diamonds", "Clubs"];
|
||||||
var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
|
var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
|
||||||
|
|
||||||
var dck = [];
|
var dck = [];
|
||||||
for (var i = 0 ; i < values.length; i++) {
|
for (var i = 0 ; i < values.length; i++) {
|
||||||
for(var x = 0; x < suits.length; x++) {
|
for(var x = 0; x < suits.length; x++) {
|
||||||
dck.push({ Value: values[i], Suit: suits[x] });
|
dck.push({ Value: values[i], Suit: suits[x] });
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return dck;
|
}
|
||||||
|
return dck;
|
||||||
}
|
}
|
||||||
|
|
||||||
function shuffle(a) {
|
function shuffle(a) {
|
||||||
var j, x, i;
|
var j, x, i;
|
||||||
for (i = a.length - 1; i > 0; i--) {
|
for (i = a.length - 1; i > 0; i--) {
|
||||||
j = Math.floor(Math.random() * (i + 1));
|
j = Math.floor(Math.random() * (i + 1));
|
||||||
x = a[i];
|
x = a[i];
|
||||||
a[i] = a[j];
|
a[i] = a[j];
|
||||||
a[j] = x;
|
a[j] = x;
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
function EndGameMessdage(msg){
|
function EndGameMessdage(msg){
|
||||||
g.drawString(msg, 155, 200);
|
g.drawString(msg, 155, 200);
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
startGame();
|
startGame();
|
||||||
}, 2500);
|
}, 2500);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function hitMe() {
|
function hitMe() {
|
||||||
player.Hand.push(deck.pop());
|
player.Hand.push(deck.pop());
|
||||||
renderOnScreen(1);
|
renderOnScreen(1);
|
||||||
var playerWeight = calcWeight(player.Hand, 0);
|
var playerWeight = calcWeight(player.Hand, 0);
|
||||||
|
|
||||||
if(playerWeight == 21)
|
if(playerWeight == 21)
|
||||||
EndGameMessdage('WINNER');
|
EndGameMessdage('WINNER');
|
||||||
else if(playerWeight > 21)
|
else if(playerWeight > 21)
|
||||||
EndGameMessdage('LOOSER');
|
EndGameMessdage('LOOSER');
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcWeight(hand, hideCard) {
|
function calcWeight(hand, hideCard) {
|
||||||
|
|
||||||
if(hideCard === 1) {
|
if(hideCard === 1) {
|
||||||
if (hand[0].Value == "J" || hand[0].Value == "Q" || hand[0].Value == "K")
|
if (hand[0].Value == "J" || hand[0].Value == "Q" || hand[0].Value == "K")
|
||||||
return "10 +";
|
return "10 +";
|
||||||
else if (hand[0].Value == "A")
|
else if (hand[0].Value == "A")
|
||||||
return "11 +";
|
return "11 +";
|
||||||
else
|
else
|
||||||
return parseInt(hand[0].Value) +" +";
|
return parseInt(hand[0].Value) +" +";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var weight = 0;
|
||||||
|
for(i=0; i<hand.length; i++){
|
||||||
|
if (hand[i].Value == "J" || hand[i].Value == "Q" || hand[i].Value == "K") {
|
||||||
|
weight += 10;
|
||||||
|
}
|
||||||
|
else if (hand[i].Value == "A") {
|
||||||
|
weight += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
weight += parseInt(hand[i].Value);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
var weight = 0;
|
|
||||||
for(i=0; i<hand.length; i++){
|
|
||||||
if (hand[i].Value == "J" || hand[i].Value == "Q" || hand[i].Value == "K") {
|
|
||||||
weight += 10;
|
|
||||||
}
|
|
||||||
else if (hand[i].Value == "A") {
|
|
||||||
weight += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
weight += parseInt(hand[i].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find count of aces because it may be 11 or 1
|
// Find count of aces because it may be 11 or 1
|
||||||
var numOfAces = hand.filter(function(x){ return x.Value === "A"; }).length;
|
var numOfAces = hand.filter(function(x){ return x.Value === "A"; }).length;
|
||||||
for (var j = 0; j < numOfAces; j++) {
|
for (var j = 0; j < numOfAces; j++) {
|
||||||
if (weight + 10 <= 21) {
|
if (weight + 10 <= 21) {
|
||||||
weight +=10;
|
weight +=10;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return weight;
|
|
||||||
}
|
}
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function stand(){
|
function stand(){
|
||||||
function sleepFor( sleepDuration ){
|
function sleepFor( sleepDuration ){
|
||||||
console.log("Sleeping...");
|
console.log("Sleeping...");
|
||||||
var now = new Date().getTime();
|
var now = new Date().getTime();
|
||||||
while(new Date().getTime() < now + sleepDuration){ /* do nothing */ }
|
while(new Date().getTime() < now + sleepDuration){ /* do nothing */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderOnScreen(0);
|
||||||
|
var playerWeight = calcWeight(player.Hand, 0);
|
||||||
|
var bangleWeight = calcWeight(computer.Hand, 0);
|
||||||
|
|
||||||
|
while(bangleWeight<17){
|
||||||
|
sleepFor(500);
|
||||||
|
computer.Hand.push(deck.pop());
|
||||||
renderOnScreen(0);
|
renderOnScreen(0);
|
||||||
var playerWeight = calcWeight(player.Hand, 0);
|
bangleWeight = calcWeight(computer.Hand, 0);
|
||||||
var bangleWeight = calcWeight(computer.Hand, 0);
|
}
|
||||||
|
|
||||||
while(bangleWeight<17){
|
if (bangleWeight == playerWeight)
|
||||||
sleepFor(500);
|
EndGameMessdage('TIES');
|
||||||
computer.Hand.push(deck.pop());
|
else if(playerWeight==21 || bangleWeight > 21 || bangleWeight < playerWeight)
|
||||||
renderOnScreen(0);
|
EndGameMessdage('WINNER');
|
||||||
bangleWeight = calcWeight(computer.Hand, 0);
|
else if(bangleWeight > playerWeight)
|
||||||
}
|
EndGameMessdage('LOOSER');
|
||||||
|
|
||||||
if (bangleWeight == playerWeight)
|
|
||||||
EndGameMessdage('TIES');
|
|
||||||
else if(playerWeight==21 || bangleWeight > 21 || bangleWeight < playerWeight)
|
|
||||||
EndGameMessdage('WINNER');
|
|
||||||
else if(bangleWeight > playerWeight)
|
|
||||||
EndGameMessdage('LOOSER');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderOnScreen(HideCard) {
|
function renderOnScreen(HideCard) {
|
||||||
const fontName = "6x8";
|
const fontName = "6x8";
|
||||||
|
|
||||||
g.clear(); // clear screen
|
g.clear(); // clear screen
|
||||||
g.reset(); // default draw styles
|
g.reset(); // default draw styles
|
||||||
g.setFont(fontName, 1);
|
g.setFont(fontName, 1);
|
||||||
|
|
||||||
g.drawString('RST', 220, 35);
|
g.drawString('RST', 220, 35);
|
||||||
g.drawString('Hit', 60, 230);
|
g.drawString('Hit', 60, 230);
|
||||||
g.drawString('Stand', 165, 230);
|
g.drawString('Stand', 165, 230);
|
||||||
|
|
||||||
g.setFont(fontName, 3);
|
g.setFont(fontName, 3);
|
||||||
for(i=0; i<computer.Hand.length; i++){
|
for(i=0; i<computer.Hand.length; i++){
|
||||||
g.drawImage(eval(computer.Hand[i].Suit), i*48, 10);
|
g.drawImage(eval(computer.Hand[i].Suit), i*48, 10);
|
||||||
if(i == 1 && HideCard == 1)
|
if(i == 1 && HideCard == 1)
|
||||||
g.drawString("?", i*48+18, 58);
|
g.drawString("?", i*48+18, 58);
|
||||||
else
|
else
|
||||||
g.drawString(computer.Hand[i].Value, i*48+18, 58);
|
g.drawString(computer.Hand[i].Value, i*48+18, 58);
|
||||||
}
|
}
|
||||||
g.setFont(fontName, 2);
|
g.setFont(fontName, 2);
|
||||||
g.drawString('BangleJS has '+ calcWeight(computer.Hand, HideCard), 5, 85);
|
g.drawString('BangleJS has '+ calcWeight(computer.Hand, HideCard), 5, 85);
|
||||||
|
|
||||||
g.setFont(fontName, 3);
|
g.setFont(fontName, 3);
|
||||||
for(i=0; i<player.Hand.length; i++){
|
for(i=0; i<player.Hand.length; i++){
|
||||||
g.drawImage(eval(player.Hand[i].Suit), i*48, 125);
|
g.drawImage(eval(player.Hand[i].Suit), i*48, 125);
|
||||||
g.drawString(player.Hand[i].Value, i*48+18, 175);
|
g.drawString(player.Hand[i].Value, i*48+18, 175);
|
||||||
}
|
}
|
||||||
g.setFont(fontName, 2);
|
g.setFont(fontName, 2);
|
||||||
g.drawString('You have ' + calcWeight(player.Hand, 0), 5, 202);
|
g.drawString('You have ' + calcWeight(player.Hand, 0), 5, 202);
|
||||||
}
|
}
|
||||||
|
|
||||||
function dealHands() {
|
function dealHands() {
|
||||||
player.Hand= [];
|
player.Hand= [];
|
||||||
computer.Hand= [];
|
computer.Hand= [];
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
player.Hand.push(deck.pop());
|
player.Hand.push(deck.pop());
|
||||||
renderOnScreen(0);
|
renderOnScreen(0);
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
computer.Hand.push(deck.pop());
|
computer.Hand.push(deck.pop());
|
||||||
renderOnScreen(1);
|
renderOnScreen(1);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
player.Hand.push(deck.pop());
|
player.Hand.push(deck.pop());
|
||||||
renderOnScreen(1);
|
renderOnScreen(1);
|
||||||
}, 1500);
|
}, 1500);
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
computer.Hand.push(deck.pop());
|
computer.Hand.push(deck.pop());
|
||||||
renderOnScreen(1);
|
renderOnScreen(1);
|
||||||
}, 2000);
|
}, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startGame(){
|
function startGame(){
|
||||||
deck = createDeck();
|
deck = createDeck();
|
||||||
deck = shuffle(deck);
|
deck = shuffle(deck);
|
||||||
dealHands();
|
dealHands();
|
||||||
}
|
}
|
||||||
|
|
||||||
setWatch(hitMe, BTN4, {repeat:true, edge:"falling"});
|
setWatch(hitMe, BTN4, {repeat:true, edge:"falling"});
|
||||||
|
|
|
@ -37,16 +37,16 @@ function scan() {
|
||||||
waitMessage();
|
waitMessage();
|
||||||
|
|
||||||
NRF.findDevices(devices => {
|
NRF.findDevices(devices => {
|
||||||
devices.forEach(device =>{
|
devices.forEach(device =>{
|
||||||
let deviceName = device.id.substring(0,17);
|
let deviceName = device.id.substring(0,17);
|
||||||
|
|
||||||
if (device.name) {
|
if (device.name) {
|
||||||
deviceName = device.name;
|
deviceName = device.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
menu[deviceName] = () => showDeviceInfo(device);
|
menu[deviceName] = () => showDeviceInfo(device);
|
||||||
});
|
});
|
||||||
showMainMenu(menu);
|
showMainMenu(menu);
|
||||||
}, { active: true });
|
}, { active: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,22 +22,22 @@ function draw() {
|
||||||
|
|
||||||
function scan() {
|
function scan() {
|
||||||
NRF.findDevices(devices => {
|
NRF.findDevices(devices => {
|
||||||
for (let device of devices) {
|
for (let device of devices) {
|
||||||
|
|
||||||
// Only display devices that advertise a name
|
// Only display devices that advertise a name
|
||||||
|
|
||||||
if (device.name) {
|
if (device.name) {
|
||||||
// Remove no devices found message if it is present
|
// Remove no devices found message if it is present
|
||||||
if (menu[NODEVICE]) {
|
if (menu[NODEVICE]) {
|
||||||
delete menu[NODEVICE];
|
delete menu[NODEVICE];
|
||||||
}
|
|
||||||
menu[device.name] = {
|
|
||||||
value : device.rssi,
|
|
||||||
onchange : () => {}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
menu[device.name] = {
|
||||||
|
value : device.rssi,
|
||||||
|
onchange : () => {}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
draw();
|
}
|
||||||
|
draw();
|
||||||
}, { active: true });
|
}, { active: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,103 +1,103 @@
|
||||||
const buf = Graphics.createArrayBuffer(144,200,1,{msb:true});
|
const buf = Graphics.createArrayBuffer(144,200,1,{msb:true});
|
||||||
const NUMBERS = [
|
const NUMBERS = [
|
||||||
[1,1,1,1,3,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1],//0
|
[1,1,1,1,3,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1],//0
|
||||||
[0,1,1,1,3,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1],//1
|
[0,1,1,1,3,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1],//1
|
||||||
[1,1,1,1,3,0,0,1,1,1,2,1,1,1,4,1,1,1,0,0,1,1,1,1,1],//2
|
[1,1,1,1,3,0,0,1,1,1,2,1,1,1,4,1,1,1,0,0,1,1,1,1,1],//2
|
||||||
[1,1,1,1,3,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1],//3
|
[1,1,1,1,3,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1],//3
|
||||||
[1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,5,1,1,1,1,0,0,1,1,1],//4
|
[1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,5,1,1,1,1,0,0,1,1,1],//4
|
||||||
[1,1,1,1,1,1,1,1,0,0,5,1,1,1,3,0,0,1,1,1,1,1,1,1,1],//5
|
[1,1,1,1,1,1,1,1,0,0,5,1,1,1,3,0,0,1,1,1,1,1,1,1,1],//5
|
||||||
[1,1,1,1,1,1,1,1,0,0,1,1,1,1,3,1,1,0,1,1,1,1,1,1,1],//6
|
[1,1,1,1,1,1,1,1,0,0,1,1,1,1,3,1,1,0,1,1,1,1,1,1,1],//6
|
||||||
[1,1,1,1,3,0,0,1,1,1,0,2,1,1,1,0,1,1,1,0,0,1,1,1,0],//7
|
[1,1,1,1,3,0,0,1,1,1,0,2,1,1,1,0,1,1,1,0,0,1,1,1,0],//7
|
||||||
[1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1],//8
|
[1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1],//8
|
||||||
[1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1] //9
|
[1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1] //9
|
||||||
];
|
];
|
||||||
let intervalRef = null;
|
let intervalRef = null;
|
||||||
let digits = [-1,-1,-1,-1,-1,-1];
|
let digits = [-1,-1,-1,-1,-1,-1];
|
||||||
function flip() {
|
function flip() {
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
g.drawImage({width:buf.getWidth(),height:buf.getHeight(),buffer:buf.buffer},55,26);
|
g.drawImage({width:buf.getWidth(),height:buf.getHeight(),buffer:buf.buffer},55,26);
|
||||||
}
|
}
|
||||||
function drawPixel(ox,oy,x,y,r,p) {
|
function drawPixel(ox,oy,x,y,r,p) {
|
||||||
let x1 = ox+x*(r*2+1);
|
let x1 = ox+x*(r*2+1);
|
||||||
let y1 = oy+y*(r*2+1);
|
let y1 = oy+y*(r*2+1);
|
||||||
let xmid = x1+r;
|
let xmid = x1+r;
|
||||||
let ymid = y1+r;
|
let ymid = y1+r;
|
||||||
let x2 = xmid+r;
|
let x2 = xmid+r;
|
||||||
let y2 = ymid+r;
|
let y2 = ymid+r;
|
||||||
if (p > 0) {
|
if (p > 0) {
|
||||||
if (p > 1) {
|
if (p > 1) {
|
||||||
buf.setColor(0,0,0);
|
buf.setColor(0,0,0);
|
||||||
buf.fillRect(x1,y1,x2,y2);
|
buf.fillRect(x1,y1,x2,y2);
|
||||||
}
|
|
||||||
buf.setColor(1,1,1);
|
|
||||||
} else {
|
|
||||||
buf.setColor(0,0,0);
|
|
||||||
}
|
|
||||||
if (p < 2) {
|
|
||||||
buf.fillRect(x1,y1,x2,y2);
|
|
||||||
} else if (p === 2) {
|
|
||||||
buf.fillPoly([xmid,y1,x2,y1,x2,y2,x1,y2,x1,ymid]);
|
|
||||||
} else if (p === 3) {
|
|
||||||
buf.fillPoly([x1,y1,xmid,y1,x2,ymid,x2,y2,x1,y2]);
|
|
||||||
} else if (p === 4) {
|
|
||||||
buf.fillPoly([x1,y1,x2,y1,x2,ymid,xmid,y2,x1,y2]);
|
|
||||||
} else if (p === 5) {
|
|
||||||
buf.fillPoly([x1,y1,x2,y1,x2,y2,xmid,y2,x1,ymid]);
|
|
||||||
}
|
}
|
||||||
|
buf.setColor(1,1,1);
|
||||||
|
} else {
|
||||||
|
buf.setColor(0,0,0);
|
||||||
|
}
|
||||||
|
if (p < 2) {
|
||||||
|
buf.fillRect(x1,y1,x2,y2);
|
||||||
|
} else if (p === 2) {
|
||||||
|
buf.fillPoly([xmid,y1,x2,y1,x2,y2,x1,y2,x1,ymid]);
|
||||||
|
} else if (p === 3) {
|
||||||
|
buf.fillPoly([x1,y1,xmid,y1,x2,ymid,x2,y2,x1,y2]);
|
||||||
|
} else if (p === 4) {
|
||||||
|
buf.fillPoly([x1,y1,x2,y1,x2,ymid,xmid,y2,x1,y2]);
|
||||||
|
} else if (p === 5) {
|
||||||
|
buf.fillPoly([x1,y1,x2,y1,x2,y2,xmid,y2,x1,ymid]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function redraw() {
|
function redraw() {
|
||||||
let time = new Date();
|
let time = new Date();
|
||||||
let hours = time.getHours();
|
let hours = time.getHours();
|
||||||
let mins = time.getMinutes();
|
let mins = time.getMinutes();
|
||||||
let secs = time.getSeconds();
|
let secs = time.getSeconds();
|
||||||
|
|
||||||
let newDigits = [Math.floor(hours/10),hours%10,Math.floor(mins/10),mins%10,Math.floor(secs/10),secs%10];
|
let newDigits = [Math.floor(hours/10),hours%10,Math.floor(mins/10),mins%10,Math.floor(secs/10),secs%10];
|
||||||
|
|
||||||
for (var p = 0;p<25;p++) {
|
for (var p = 0;p<25;p++) {
|
||||||
var px = p%5;
|
var px = p%5;
|
||||||
var py = Math.floor(p/5);
|
var py = Math.floor(p/5);
|
||||||
if (digits[0] === -1 || NUMBERS[newDigits[0]][p] !== NUMBERS[digits[0]][p] ) {
|
if (digits[0] === -1 || NUMBERS[newDigits[0]][p] !== NUMBERS[digits[0]][p] ) {
|
||||||
drawPixel(0,20,px,py,6,NUMBERS[newDigits[0]][p]);
|
drawPixel(0,20,px,py,6,NUMBERS[newDigits[0]][p]);
|
||||||
}
|
|
||||||
if (digits[1] === -1 || NUMBERS[newDigits[1]][p] !== NUMBERS[digits[1]][p] ) {
|
|
||||||
drawPixel(78,20,px,py,6,NUMBERS[newDigits[1]][p]);
|
|
||||||
}
|
|
||||||
if (digits[2] === -1 || NUMBERS[newDigits[2]][p] !== NUMBERS[digits[2]][p] ) {
|
|
||||||
drawPixel(0,92,px,py,6,NUMBERS[newDigits[2]][p]);
|
|
||||||
}
|
|
||||||
if (digits[3] === -1 || NUMBERS[newDigits[3]][p] !== NUMBERS[digits[3]][p] ) {
|
|
||||||
drawPixel(78,92,px,py,6,NUMBERS[newDigits[3]][p]);
|
|
||||||
}
|
|
||||||
if (digits[4] === -1 || NUMBERS[newDigits[4]][p] !== NUMBERS[digits[4]][p] ) {
|
|
||||||
drawPixel(69,164,px,py,3,NUMBERS[newDigits[4]][p]);
|
|
||||||
}
|
|
||||||
if (digits[5] === -1 || NUMBERS[newDigits[5]][p] !== NUMBERS[digits[5]][p] ) {
|
|
||||||
drawPixel(108,164,px,py,3,NUMBERS[newDigits[5]][p]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
digits = newDigits;
|
if (digits[1] === -1 || NUMBERS[newDigits[1]][p] !== NUMBERS[digits[1]][p] ) {
|
||||||
flip();
|
drawPixel(78,20,px,py,6,NUMBERS[newDigits[1]][p]);
|
||||||
|
}
|
||||||
|
if (digits[2] === -1 || NUMBERS[newDigits[2]][p] !== NUMBERS[digits[2]][p] ) {
|
||||||
|
drawPixel(0,92,px,py,6,NUMBERS[newDigits[2]][p]);
|
||||||
|
}
|
||||||
|
if (digits[3] === -1 || NUMBERS[newDigits[3]][p] !== NUMBERS[digits[3]][p] ) {
|
||||||
|
drawPixel(78,92,px,py,6,NUMBERS[newDigits[3]][p]);
|
||||||
|
}
|
||||||
|
if (digits[4] === -1 || NUMBERS[newDigits[4]][p] !== NUMBERS[digits[4]][p] ) {
|
||||||
|
drawPixel(69,164,px,py,3,NUMBERS[newDigits[4]][p]);
|
||||||
|
}
|
||||||
|
if (digits[5] === -1 || NUMBERS[newDigits[5]][p] !== NUMBERS[digits[5]][p] ) {
|
||||||
|
drawPixel(108,164,px,py,3,NUMBERS[newDigits[5]][p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
digits = newDigits;
|
||||||
|
flip();
|
||||||
}
|
}
|
||||||
function clearTimers() {
|
function clearTimers() {
|
||||||
if(intervalRef) {
|
if(intervalRef) {
|
||||||
clearInterval(intervalRef);
|
clearInterval(intervalRef);
|
||||||
intervalRef = undefined;
|
intervalRef = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function startTimers() {
|
function startTimers() {
|
||||||
g.clear();
|
g.clear();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
intervalRef = setInterval(redraw,1000);
|
intervalRef = setInterval(redraw,1000);
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
Bangle.loadWidgets();
|
Bangle.loadWidgets();
|
||||||
startTimers();
|
startTimers();
|
||||||
Bangle.on('lcdPower',function(on) {
|
Bangle.on('lcdPower',function(on) {
|
||||||
if (on) {
|
if (on) {
|
||||||
startTimers();
|
startTimers();
|
||||||
} else {
|
} else {
|
||||||
clearTimers();
|
clearTimers();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Show launcher when middle button pressed
|
// Show launcher when middle button pressed
|
||||||
setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
|
setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
var hour_hand = {
|
var hour_hand = {
|
||||||
width : 61, height : 8, bpp : 1,
|
width : 61, height : 8, bpp : 1,
|
||||||
transparent : 0,
|
transparent : 0,
|
||||||
buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////////////w=="))
|
buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////////////w=="))
|
||||||
};
|
};
|
||||||
var minute_hand = {
|
var minute_hand = {
|
||||||
width : 110, height : 4, bpp : 1,
|
width : 110, height : 4, bpp : 1,
|
||||||
transparent : 0,
|
transparent : 0,
|
||||||
buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////w=="))
|
buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////w=="))
|
||||||
};
|
};
|
||||||
|
|
||||||
//g.fillRect(0,24,239,239); // Apps area
|
//g.fillRect(0,24,239,239); // Apps area
|
||||||
|
@ -24,117 +24,117 @@ let tick1 = Graphics.createArrayBuffer(8,4,1);
|
||||||
tick1.fillRect(0,0,tick1.getWidth()-1, tick1.getHeight()-1);
|
tick1.fillRect(0,0,tick1.getWidth()-1, tick1.getHeight()-1);
|
||||||
|
|
||||||
function big_wheel_x(angle){
|
function big_wheel_x(angle){
|
||||||
return clock_center.x + radius * Math.cos(angle*p180);
|
return clock_center.x + radius * Math.cos(angle*p180);
|
||||||
}
|
}
|
||||||
function big_wheel_y(angle){
|
function big_wheel_y(angle){
|
||||||
return clock_center.y + radius * Math.sin(angle*p180);
|
return clock_center.y + radius * Math.sin(angle*p180);
|
||||||
}
|
}
|
||||||
function rotate_around_x(center_x, angle, tick){
|
function rotate_around_x(center_x, angle, tick){
|
||||||
return center_x + Math.cos(angle*p180) * tick.getWidth()/2;
|
return center_x + Math.cos(angle*p180) * tick.getWidth()/2;
|
||||||
}
|
}
|
||||||
function rotate_around_y(center_y, angle, tick){
|
function rotate_around_y(center_y, angle, tick){
|
||||||
return center_y + Math.sin(angle*p180) * tick.getWidth()/2;
|
return center_y + Math.sin(angle*p180) * tick.getWidth()/2;
|
||||||
}
|
}
|
||||||
function hour_pos_x(angle){
|
function hour_pos_x(angle){
|
||||||
return clock_center.x + Math.cos(angle*p180) * hour_hand.width/2;
|
return clock_center.x + Math.cos(angle*p180) * hour_hand.width/2;
|
||||||
}
|
}
|
||||||
function hour_pos_y(angle){
|
function hour_pos_y(angle){
|
||||||
return clock_center.y + Math.sin(angle*p180) * hour_hand.width/2;
|
return clock_center.y + Math.sin(angle*p180) * hour_hand.width/2;
|
||||||
}
|
}
|
||||||
function minute_pos_x(angle){
|
function minute_pos_x(angle){
|
||||||
return clock_center.x + Math.cos(angle*p180) * minute_hand.width/2;
|
return clock_center.x + Math.cos(angle*p180) * minute_hand.width/2;
|
||||||
}
|
}
|
||||||
function minute_pos_y(angle){
|
function minute_pos_y(angle){
|
||||||
return clock_center.y + Math.sin(angle*p180) * minute_hand.width/2;
|
return clock_center.y + Math.sin(angle*p180) * minute_hand.width/2;
|
||||||
}
|
}
|
||||||
function minute_angle(date){
|
function minute_angle(date){
|
||||||
//let minutes = date.getMinutes() + date.getSeconds()/60;
|
//let minutes = date.getMinutes() + date.getSeconds()/60;
|
||||||
let minutes = date.getMinutes();
|
let minutes = date.getMinutes();
|
||||||
return 6*minutes - 90;
|
return 6*minutes - 90;
|
||||||
}
|
}
|
||||||
function hour_angle(date){
|
function hour_angle(date){
|
||||||
let hours= date.getHours() + date.getMinutes()/60;
|
let hours= date.getHours() + date.getMinutes()/60;
|
||||||
return 30*hours - 90;
|
return 30*hours - 90;
|
||||||
}
|
}
|
||||||
|
|
||||||
function draw_clock(){
|
function draw_clock(){
|
||||||
//console.log("draw_clock");
|
//console.log("draw_clock");
|
||||||
let date = new Date();
|
let date = new Date();
|
||||||
//g.clear();
|
//g.clear();
|
||||||
g.setBgColor(0,0,0);
|
g.setBgColor(0,0,0);
|
||||||
g.setColor(0,0,0);
|
g.setColor(0,0,0);
|
||||||
g.fillRect(0,24,239,239); // clear app area
|
g.fillRect(0,24,239,239); // clear app area
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
|
|
||||||
// draw cross lines for testing
|
// draw cross lines for testing
|
||||||
// g.setColor(1,0,0);
|
// g.setColor(1,0,0);
|
||||||
// g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y);
|
// g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y);
|
||||||
// g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius);
|
// g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius);
|
||||||
|
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
let ticks = [0, 90, 180, 270];
|
let ticks = [0, 90, 180, 270];
|
||||||
ticks.forEach((item)=>{
|
ticks.forEach((item)=>{
|
||||||
let agl = item+180;
|
let agl = item+180;
|
||||||
g.drawImage(tick0.asImage(), rotate_around_x(big_wheel_x(item), agl, tick0), rotate_around_y(big_wheel_y(item), agl, tick0), {rotate:agl*p180});
|
g.drawImage(tick0.asImage(), rotate_around_x(big_wheel_x(item), agl, tick0), rotate_around_y(big_wheel_y(item), agl, tick0), {rotate:agl*p180});
|
||||||
});
|
});
|
||||||
ticks = [30, 60, 120, 150, 210, 240, 300, 330];
|
ticks = [30, 60, 120, 150, 210, 240, 300, 330];
|
||||||
ticks.forEach((item)=>{
|
ticks.forEach((item)=>{
|
||||||
let agl = item+180;
|
let agl = item+180;
|
||||||
g.drawImage(tick5.asImage(), rotate_around_x(big_wheel_x(item), agl, tick5), rotate_around_y(big_wheel_y(item), agl, tick5), {rotate:agl*p180});
|
g.drawImage(tick5.asImage(), rotate_around_x(big_wheel_x(item), agl, tick5), rotate_around_y(big_wheel_y(item), agl, tick5), {rotate:agl*p180});
|
||||||
});
|
});
|
||||||
|
|
||||||
let hour_agl = hour_angle(date);
|
let hour_agl = hour_angle(date);
|
||||||
let minute_agl = minute_angle(date);
|
let minute_agl = minute_angle(date);
|
||||||
g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); //
|
g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); //
|
||||||
g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); //
|
g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); //
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
g.fillCircle(clock_center.x, clock_center.y, 6);
|
g.fillCircle(clock_center.x, clock_center.y, 6);
|
||||||
g.setColor(0,0,0);
|
g.setColor(0,0,0);
|
||||||
g.fillCircle(clock_center.x, clock_center.y, 3);
|
g.fillCircle(clock_center.x, clock_center.y, 3);
|
||||||
|
|
||||||
// draw minute ticks. Takes long time to draw!
|
// draw minute ticks. Takes long time to draw!
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
for (var i=0; i<60; i++){
|
for (var i=0; i<60; i++){
|
||||||
let agl = i*6+180;
|
let agl = i*6+180;
|
||||||
g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180});
|
g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180});
|
||||||
}
|
}
|
||||||
|
|
||||||
g.flip();
|
g.flip();
|
||||||
//console.log(date);
|
//console.log(date);
|
||||||
}
|
}
|
||||||
function clearTimers(){
|
function clearTimers(){
|
||||||
//console.log("clearTimers");
|
//console.log("clearTimers");
|
||||||
if(intervalRef) {
|
if(intervalRef) {
|
||||||
clearInterval(intervalRef);
|
clearInterval(intervalRef);
|
||||||
intervalRef = null;
|
intervalRef = null;
|
||||||
//console.log("interval is cleared");
|
//console.log("interval is cleared");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function startTimers(){
|
function startTimers(){
|
||||||
//console.log("startTimers");
|
//console.log("startTimers");
|
||||||
if(intervalRef) clearTimers();
|
if(intervalRef) clearTimers();
|
||||||
intervalRef = setInterval(draw_clock, 60*1000);
|
intervalRef = setInterval(draw_clock, 60*1000);
|
||||||
//console.log("interval is set");
|
//console.log("interval is set");
|
||||||
draw_clock();
|
draw_clock();
|
||||||
}
|
}
|
||||||
|
|
||||||
Bangle.on('lcdPower', (on) => {
|
Bangle.on('lcdPower', (on) => {
|
||||||
if (on) {
|
if (on) {
|
||||||
//console.log("lcdPower: on");
|
//console.log("lcdPower: on");
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
startTimers();
|
startTimers();
|
||||||
} else {
|
} else {
|
||||||
//console.log("lcdPower: off");
|
//console.log("lcdPower: off");
|
||||||
clearTimers();
|
clearTimers();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Bangle.on('faceUp',function(up){
|
Bangle.on('faceUp',function(up){
|
||||||
//console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn());
|
//console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn());
|
||||||
if (up && !Bangle.isLCDOn()) {
|
if (up && !Bangle.isLCDOn()) {
|
||||||
//console.log("faceUp and LCD off");
|
//console.log("faceUp and LCD off");
|
||||||
clearTimers();
|
clearTimers();
|
||||||
Bangle.setLCDPower(true);
|
Bangle.setLCDPower(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
|
|
|
@ -372,7 +372,7 @@ function buttonPress(val) {
|
||||||
|
|
||||||
for (var k in keys) {
|
for (var k in keys) {
|
||||||
if (keys.hasOwnProperty(k)) {
|
if (keys.hasOwnProperty(k)) {
|
||||||
drawKey(k, keys[k], k == '5');
|
drawKey(k, keys[k], k == '5');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.setFont('7x11Numeric7Seg', 2.8);
|
g.setFont('7x11Numeric7Seg', 2.8);
|
||||||
|
|
|
@ -45,12 +45,12 @@ function showMenu() {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Reset values': function() {
|
'Reset values': function() {
|
||||||
settingsChronowid.hours = 0;
|
settingsChronowid.hours = 0;
|
||||||
settingsChronowid.minutes = 0;
|
settingsChronowid.minutes = 0;
|
||||||
settingsChronowid.seconds = 0;
|
settingsChronowid.seconds = 0;
|
||||||
settingsChronowid.started = false;
|
settingsChronowid.started = false;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
showMenu();
|
showMenu();
|
||||||
},
|
},
|
||||||
'Hours': {
|
'Hours': {
|
||||||
value: settingsChronowid.hours,
|
value: settingsChronowid.hours,
|
||||||
|
@ -89,8 +89,8 @@ function showMenu() {
|
||||||
settingsChronowid.started = v;
|
settingsChronowid.started = v;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
timerMenu['-Exit-'] = ()=>{load();};
|
timerMenu['-Exit-'] = ()=>{load();};
|
||||||
return E.showMenu(timerMenu);
|
return E.showMenu(timerMenu);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,93 +1,93 @@
|
||||||
(() => {
|
(() => {
|
||||||
const storage = require('Storage');
|
const storage = require('Storage');
|
||||||
settingsChronowid = storage.readJSON("chronowid.json",1)||{}; //read settingsChronowid from file
|
settingsChronowid = storage.readJSON("chronowid.json",1)||{}; //read settingsChronowid from file
|
||||||
var height = 23;
|
var height = 23;
|
||||||
var width = 58;
|
var width = 58;
|
||||||
var interval = 0; //used for the 1 second interval timer
|
var interval = 0; //used for the 1 second interval timer
|
||||||
var now = new Date();
|
var now = new Date();
|
||||||
|
|
||||||
var time = 0;
|
var time = 0;
|
||||||
var diff = settingsChronowid.goal - now;
|
var diff = settingsChronowid.goal - now;
|
||||||
|
|
||||||
//Convert ms to time
|
//Convert ms to time
|
||||||
function getTime(t) {
|
function getTime(t) {
|
||||||
var milliseconds = parseInt((t % 1000) / 100),
|
var milliseconds = parseInt((t % 1000) / 100),
|
||||||
seconds = Math.floor((t / 1000) % 60),
|
seconds = Math.floor((t / 1000) % 60),
|
||||||
minutes = Math.floor((t / (1000 * 60)) % 60),
|
minutes = Math.floor((t / (1000 * 60)) % 60),
|
||||||
hours = Math.floor((t / (1000 * 60 * 60)) % 24);
|
hours = Math.floor((t / (1000 * 60 * 60)) % 24);
|
||||||
|
|
||||||
hours = (hours < 10) ? "0" + hours : hours;
|
hours = (hours < 10) ? "0" + hours : hours;
|
||||||
minutes = (minutes < 10) ? "0" + minutes : minutes;
|
minutes = (minutes < 10) ? "0" + minutes : minutes;
|
||||||
seconds = (seconds < 10) ? "0" + seconds : seconds;
|
seconds = (seconds < 10) ? "0" + seconds : seconds;
|
||||||
|
|
||||||
return hours + ":" + minutes + ":" + seconds;
|
return hours + ":" + minutes + ":" + seconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
function printDebug() {
|
||||||
|
print ("Nowtime: " + getTime(now));
|
||||||
|
print ("Now: " + now);
|
||||||
|
print ("Goaltime: " + getTime(settingsChronowid.goal));
|
||||||
|
print ("Goal: " + settingsChronowid.goal);
|
||||||
|
print("Difftime: " + getTime(diff));
|
||||||
|
print("Diff: " + diff);
|
||||||
|
print ("Started: " + settingsChronowid.started);
|
||||||
|
print ("----");
|
||||||
|
}
|
||||||
|
|
||||||
|
//counts down, calculates and displays
|
||||||
|
function countDown() {
|
||||||
|
now = new Date();
|
||||||
|
diff = settingsChronowid.goal - now; //calculate difference
|
||||||
|
WIDGETS["chronowid"].draw();
|
||||||
|
//time is up
|
||||||
|
if (settingsChronowid.started && diff < 1000) {
|
||||||
|
Bangle.buzz(1500);
|
||||||
|
//write timer off to file
|
||||||
|
settingsChronowid.started = false;
|
||||||
|
storage.writeJSON('chronowid.json', settingsChronowid);
|
||||||
|
clearInterval(interval); //stop interval
|
||||||
}
|
}
|
||||||
|
|
||||||
function printDebug() {
|
|
||||||
print ("Nowtime: " + getTime(now));
|
|
||||||
print ("Now: " + now);
|
|
||||||
print ("Goaltime: " + getTime(settingsChronowid.goal));
|
|
||||||
print ("Goal: " + settingsChronowid.goal);
|
|
||||||
print("Difftime: " + getTime(diff));
|
|
||||||
print("Diff: " + diff);
|
|
||||||
print ("Started: " + settingsChronowid.started);
|
|
||||||
print ("----");
|
|
||||||
}
|
|
||||||
|
|
||||||
//counts down, calculates and displays
|
|
||||||
function countDown() {
|
|
||||||
now = new Date();
|
|
||||||
diff = settingsChronowid.goal - now; //calculate difference
|
|
||||||
WIDGETS["chronowid"].draw();
|
|
||||||
//time is up
|
|
||||||
if (settingsChronowid.started && diff < 1000) {
|
|
||||||
Bangle.buzz(1500);
|
|
||||||
//write timer off to file
|
|
||||||
settingsChronowid.started = false;
|
|
||||||
storage.writeJSON('chronowid.json', settingsChronowid);
|
|
||||||
clearInterval(interval); //stop interval
|
|
||||||
}
|
|
||||||
//printDebug();
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw your widget
|
|
||||||
function draw() {
|
|
||||||
if (!settingsChronowid.started) {
|
|
||||||
width = 0;
|
|
||||||
return; //do not draw anything if timer is not started
|
|
||||||
}
|
|
||||||
g.reset();
|
|
||||||
if (diff >= 0) {
|
|
||||||
if (diff < 3600000) { //less than 1 hour left
|
|
||||||
width = 58;
|
|
||||||
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
|
||||||
g.setFont("6x8", 2);
|
|
||||||
g.drawString(getTime(diff).substring(3), this.x+1, this.y+5); //remove hour part 00:00:00 -> 00:00
|
|
||||||
}
|
|
||||||
if (diff >= 3600000) { //one hour or more left
|
|
||||||
width = 48;
|
|
||||||
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
|
||||||
g.setFont("6x8", 1);
|
|
||||||
g.drawString(getTime(diff), this.x+1, this.y+((height/2)-4)); //display hour 00:00:00
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// not needed anymoe, because we check if diff < 1000 now, so 00:00 is displayed.
|
|
||||||
// else {
|
|
||||||
// width = 58;
|
|
||||||
// g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
|
||||||
// g.setFont("6x8", 2);
|
|
||||||
// g.drawString("END", this.x+15, this.y+5);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settingsChronowid.started) interval = setInterval(countDown, 1000); //start countdown each second
|
|
||||||
|
|
||||||
// add the widget
|
|
||||||
WIDGETS["chronowid"]={area:"bl",width:width,draw:draw,reload:function() {
|
|
||||||
reload();
|
|
||||||
Bangle.drawWidgets(); // relayout all widgets
|
|
||||||
}};
|
|
||||||
|
|
||||||
//printDebug();
|
//printDebug();
|
||||||
countDown();
|
}
|
||||||
|
|
||||||
|
// draw your widget
|
||||||
|
function draw() {
|
||||||
|
if (!settingsChronowid.started) {
|
||||||
|
width = 0;
|
||||||
|
return; //do not draw anything if timer is not started
|
||||||
|
}
|
||||||
|
g.reset();
|
||||||
|
if (diff >= 0) {
|
||||||
|
if (diff < 3600000) { //less than 1 hour left
|
||||||
|
width = 58;
|
||||||
|
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
||||||
|
g.setFont("6x8", 2);
|
||||||
|
g.drawString(getTime(diff).substring(3), this.x+1, this.y+5); //remove hour part 00:00:00 -> 00:00
|
||||||
|
}
|
||||||
|
if (diff >= 3600000) { //one hour or more left
|
||||||
|
width = 48;
|
||||||
|
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
||||||
|
g.setFont("6x8", 1);
|
||||||
|
g.drawString(getTime(diff), this.x+1, this.y+((height/2)-4)); //display hour 00:00:00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// not needed anymoe, because we check if diff < 1000 now, so 00:00 is displayed.
|
||||||
|
// else {
|
||||||
|
// width = 58;
|
||||||
|
// g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
||||||
|
// g.setFont("6x8", 2);
|
||||||
|
// g.drawString("END", this.x+15, this.y+5);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsChronowid.started) interval = setInterval(countDown, 1000); //start countdown each second
|
||||||
|
|
||||||
|
// add the widget
|
||||||
|
WIDGETS["chronowid"]={area:"bl",width:width,draw:draw,reload:function() {
|
||||||
|
reload();
|
||||||
|
Bangle.drawWidgets(); // relayout all widgets
|
||||||
|
}};
|
||||||
|
|
||||||
|
//printDebug();
|
||||||
|
countDown();
|
||||||
})();
|
})();
|
|
@ -7,12 +7,12 @@ setWatch(x=>{
|
||||||
},BTN1,{repeat:true});
|
},BTN1,{repeat:true});
|
||||||
|
|
||||||
function updateAdvertising() {
|
function updateAdvertising() {
|
||||||
try {
|
try {
|
||||||
NRF.setAdvertising({},{
|
NRF.setAdvertising({},{
|
||||||
manufacturer: 0x0590,
|
manufacturer: 0x0590,
|
||||||
manufacturerData: new Uint8Array([mycounter>>8,mycounter&255])
|
manufacturerData: new Uint8Array([mycounter>>8,mycounter&255])
|
||||||
});
|
});
|
||||||
} catch(e){}
|
} catch(e){}
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawPlayers() {
|
function drawPlayers() {
|
||||||
|
|
|
@ -14,9 +14,9 @@ const x21=x20+pw+ps;
|
||||||
const x30=x21+pw+ds;
|
const x30=x21+pw+ds;
|
||||||
const x31=x30+pw+ps;
|
const x31=x30+pw+ps;
|
||||||
const xSpace=[[x00,x01], // all pixel x spacing
|
const xSpace=[[x00,x01], // all pixel x spacing
|
||||||
[x10,x11],
|
[x10,x11],
|
||||||
[x20,x21],
|
[x20,x21],
|
||||||
[x30,x31]];
|
[x30,x31]];
|
||||||
|
|
||||||
const y0=oy; // y spacing
|
const y0=oy; // y spacing
|
||||||
const y1=y0+pw+ps;
|
const y1=y0+pw+ps;
|
||||||
|
@ -24,35 +24,35 @@ const y2=y1+pw+ps;
|
||||||
const ySpace=[y0, y1, y2];
|
const ySpace=[y0, y1, y2];
|
||||||
|
|
||||||
const pixels = [[[0,0], // digit on/off pixels
|
const pixels = [[[0,0], // digit on/off pixels
|
||||||
[1,1],
|
[1,1],
|
||||||
[1,1]],
|
[1,1]],
|
||||||
[[0,1], // digit 1
|
[[0,1], // digit 1
|
||||||
[0,1],
|
[0,1],
|
||||||
[0,1]],
|
[0,1]],
|
||||||
[[0,1],
|
[[0,1],
|
||||||
[1,0],
|
[1,0],
|
||||||
[1,1]],
|
[1,1]],
|
||||||
[[1,1],
|
[[1,1],
|
||||||
[0,1],
|
[0,1],
|
||||||
[1,1]],
|
[1,1]],
|
||||||
[[1,0],
|
[[1,0],
|
||||||
[1,1],
|
[1,1],
|
||||||
[0,1]],
|
[0,1]],
|
||||||
[[1,1],
|
[[1,1],
|
||||||
[1,0],
|
[1,0],
|
||||||
[0,1]],
|
[0,1]],
|
||||||
[[1,0],
|
[[1,0],
|
||||||
[1,1],
|
[1,1],
|
||||||
[1,1]],
|
[1,1]],
|
||||||
[[1,1],
|
[[1,1],
|
||||||
[0,1],
|
[0,1],
|
||||||
[0,1]],
|
[0,1]],
|
||||||
[[1,1],
|
[[1,1],
|
||||||
[1,1],
|
[1,1],
|
||||||
[1,1]],
|
[1,1]],
|
||||||
[[1,1],
|
[[1,1],
|
||||||
[1,1],
|
[1,1],
|
||||||
[0,1]]];
|
[0,1]]];
|
||||||
|
|
||||||
let idTimeout = null;
|
let idTimeout = null;
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ function arrow(r,c) {
|
||||||
120+60*Math.sin(r), 130-60*Math.cos(r),
|
120+60*Math.sin(r), 130-60*Math.cos(r),
|
||||||
120+10*Math.sin(r+p), 130-10*Math.cos(r+p),
|
120+10*Math.sin(r+p), 130-10*Math.cos(r+p),
|
||||||
120+10*Math.sin(r+-p), 130-10*Math.cos(r-p),
|
120+10*Math.sin(r+-p), 130-10*Math.cos(r-p),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var oldHeading = 0;
|
var oldHeading = 0;
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
require("heatshrink").decompress(atob("/4AYv4CB+YdZABPvEkYA/AGv3EkfPAQP+DrI"))
|
require("heatshrink").decompress(atob("/4AYv4CB+YdZABPvEkYA/AGv3EkfPAQP+DrI"))
|
||||||
|
|
|
@ -2,9 +2,9 @@ var rx = 0, ry = 0;
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
var rcx=Math.cos(rx),
|
var rcx=Math.cos(rx),
|
||||||
rsx=Math.sin(rx),
|
rsx=Math.sin(rx),
|
||||||
rcy=Math.cos(ry),
|
rcy=Math.cos(ry),
|
||||||
rsy=Math.sin(ry);
|
rsy=Math.sin(ry);
|
||||||
function p(x,y,z) {
|
function p(x,y,z) {
|
||||||
var t;
|
var t;
|
||||||
t = x*rcy + z*rsy;
|
t = x*rcy + z*rsy;
|
||||||
|
|
|
@ -110,8 +110,8 @@ function drawTimeText() {
|
||||||
|
|
||||||
var time = da[4].split(":");
|
var time = da[4].split(":");
|
||||||
var hours = time[0],
|
var hours = time[0],
|
||||||
minutes = time[1],
|
minutes = time[1],
|
||||||
seconds = time[2];
|
seconds = time[2];
|
||||||
g.setColor(mainColor);
|
g.setColor(mainColor);
|
||||||
g.setFont(font, timeFontSize);
|
g.setFont(font, timeFontSize);
|
||||||
g.drawString(`${hours}:${minutes}:${seconds}`, xyCenter, yposTime, true);
|
g.drawString(`${hours}:${minutes}:${seconds}`, xyCenter, yposTime, true);
|
||||||
|
|
|
@ -7,7 +7,7 @@ var debug = 0; //1 = show debug info
|
||||||
|
|
||||||
//write settings to file
|
//write settings to file
|
||||||
function updateSettings() {
|
function updateSettings() {
|
||||||
storage.write('daysleft.json', settings);
|
storage.write('daysleft.json', settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Define standard settings
|
//Define standard settings
|
||||||
|
@ -24,8 +24,8 @@ settings = storage.readJSON('daysleft.json',1); //read storage
|
||||||
if (!settings) resetSettings(); //if settings file was not found, set to standard
|
if (!settings) resetSettings(); //if settings file was not found, set to standard
|
||||||
|
|
||||||
var dd = settings.day,
|
var dd = settings.day,
|
||||||
mm = settings.month-1, //-1 because month is zero-based
|
mm = settings.month-1, //-1 because month is zero-based
|
||||||
yy = settings.year;
|
yy = settings.year;
|
||||||
|
|
||||||
const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
|
const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
|
||||||
const targetDate = new Date(yy, mm, dd); //is 00:00
|
const targetDate = new Date(yy, mm, dd); //is 00:00
|
||||||
|
|
|
@ -27,22 +27,22 @@ var scenes = [
|
||||||
"| __|_ -| . | _| | | | | . |\n"+
|
"| __|_ -| . | _| | | | | . |\n"+
|
||||||
"|____|___| _|_| |___|_|_|_|___|\n"+
|
"|____|___| _|_| |___|_|_|_|___|\n"+
|
||||||
" |_| espruino.com\n\n",
|
" |_| espruino.com\n\n",
|
||||||
"The JavaScript Interpreter for uCs\n",
|
"The JavaScript Interpreter for uCs\n",
|
||||||
" * On-chip JS Interpreter",
|
" * On-chip JS Interpreter",
|
||||||
" * GPS, Acclerometer, Compass",
|
" * GPS, Acclerometer, Compass",
|
||||||
" * 64 MHz, 64kB RAM, 512kB + 4MB Flash",
|
" * 64 MHz, 64kB RAM, 512kB + 4MB Flash",
|
||||||
" * 240x240 IPS LCD",
|
" * 240x240 IPS LCD",
|
||||||
" * Speaker & Vibration motor",
|
" * Speaker & Vibration motor",
|
||||||
" * Bluetooth LE",
|
" * Bluetooth LE",
|
||||||
" * 1 week battery life",
|
" * 1 week battery life",
|
||||||
"",
|
"",
|
||||||
"Includes:",
|
"Includes:",
|
||||||
" * Tensorflow AI",
|
" * Tensorflow AI",
|
||||||
" * Bluetooth LE central & periph",
|
" * Bluetooth LE central & periph",
|
||||||
" * Graphics Library",
|
" * Graphics Library",
|
||||||
" * VT100 terminal",
|
" * VT100 terminal",
|
||||||
"","",""
|
"","",""
|
||||||
];
|
];
|
||||||
var n=0;
|
var n=0;
|
||||||
var i = setInterval(function() {
|
var i = setInterval(function() {
|
||||||
Terminal.println(txt[n]);
|
Terminal.println(txt[n]);
|
||||||
|
@ -62,19 +62,19 @@ var scenes = [
|
||||||
function() {
|
function() {
|
||||||
var img = require("heatshrink").decompress(atob("oNBxH+5wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHGpAAoQKv4ADCBQAeqsrAAejBw9/B4oABqt/IGepHw5CEQspALH5hBC5pAvv4/MAALFkIBWpPI6IHqpAu0Z3GfYOpRYdPQEhALYIp2FBYNVI4JAvvL4LH0yBYAFJAQQQ5Ay1JAFftBAQBYxCDv+qIGiCHIQiGnIBfOv5BJIQRAyIJkrvKEkIBrFBB4qEGIGRCNYsZAQIQV/IZDEiICRCDQVJAUIQVPC4lVIF6yJQYpAZ5t/FYvNIBepqtVIJGjIDoqBDY2pdYo3DfAhBIQLmpvIcDvIrC5oJEIAhTCGQmj5qgEC4t5e7YrBqt5BI6UFBg15v4XHbQwAQb4oAKv7NKABdVRoYATUAwnICqjZFIMdVE4+jXI4XGYCxBFFZN/M5OpCxUrvJ/ZFYmjvNVAAY+KCwpDBC6YAV5vNC9oA/AH4A/AHYA=="));
|
var img = require("heatshrink").decompress(atob("oNBxH+5wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHGpAAoQKv4ADCBQAeqsrAAejBw9/B4oABqt/IGepHw5CEQspALH5hBC5pAvv4/MAALFkIBWpPI6IHqpAu0Z3GfYOpRYdPQEhALYIp2FBYNVI4JAvvL4LH0yBYAFJAQQQ5Ay1JAFftBAQBYxCDv+qIGiCHIQiGnIBfOv5BJIQRAyIJkrvKEkIBrFBB4qEGIGRCNYsZAQIQV/IZDEiICRCDQVJAUIQVPC4lVIF6yJQYpAZ5t/FYvNIBepqtVIJGjIDoqBDY2pdYo3DfAhBIQLmpvIcDvIrC5oJEIAhTCGQmj5qgEC4t5e7YrBqt5BI6UFBg15v4XHbQwAQb4oAKv7NKABdVRoYATUAwnICqjZFIMdVE4+jXI4XGYCxBFFZN/M5OpCxUrvJ/ZFYmjvNVAAY+KCwpDBC6YAV5vNC9oA/AH4A/AHYA=="));
|
||||||
|
|
||||||
g.clear();
|
|
||||||
y = 0;
|
|
||||||
var step = 4;
|
|
||||||
var i = setInterval(function() {
|
|
||||||
y+=step;
|
|
||||||
g.clear();
|
g.clear();
|
||||||
g.drawImage(img,60,60,{rotate:Math.sin(y*0.03)*0.5});
|
y = 0;
|
||||||
g.flip();
|
var step = 4;
|
||||||
}, 20);
|
var i = setInterval(function() {
|
||||||
Bangle.setLCDMode("120x120");
|
y+=step;
|
||||||
return function() {
|
g.clear();
|
||||||
if (i) clearInterval(i);
|
g.drawImage(img,60,60,{rotate:Math.sin(y*0.03)*0.5});
|
||||||
};
|
g.flip();
|
||||||
|
}, 20);
|
||||||
|
Bangle.setLCDMode("120x120");
|
||||||
|
return function() {
|
||||||
|
if (i) clearInterval(i);
|
||||||
|
};
|
||||||
},
|
},
|
||||||
function() {
|
function() {
|
||||||
var rx = 0, ry = 0;
|
var rx = 0, ry = 0;
|
||||||
|
@ -82,9 +82,9 @@ var scenes = [
|
||||||
// draw a cube
|
// draw a cube
|
||||||
function draw() {
|
function draw() {
|
||||||
var rcx=Math.cos(rx),
|
var rcx=Math.cos(rx),
|
||||||
rsx=Math.sin(rx),
|
rsx=Math.sin(rx),
|
||||||
rcy=Math.cos(ry),
|
rcy=Math.cos(ry),
|
||||||
rsy=Math.sin(ry);
|
rsy=Math.sin(ry);
|
||||||
// Project 3D coordinates into 2D
|
// Project 3D coordinates into 2D
|
||||||
function p(x,y,z) {
|
function p(x,y,z) {
|
||||||
var t;
|
var t;
|
||||||
|
@ -149,7 +149,7 @@ var scenes = [
|
||||||
y+=step;
|
y+=step;
|
||||||
g.scroll(0,1);
|
g.scroll(0,1);
|
||||||
g.drawImage(img,Math.random()*240,Math.random()*240,
|
g.drawImage(img,Math.random()*240,Math.random()*240,
|
||||||
{rotate:Math.random()*6.3, scale:0.5+Math.random()});
|
{rotate:Math.random()*6.3, scale:0.5+Math.random()});
|
||||||
}, 1);
|
}, 1);
|
||||||
Bangle.setLCDMode();
|
Bangle.setLCDMode();
|
||||||
return function() {
|
return function() {
|
||||||
|
|
|
@ -88,10 +88,10 @@ function binToHex(bins) {
|
||||||
function hexToBin(hexStr) {
|
function hexToBin(hexStr) {
|
||||||
const regEx = new RegExp("..", "g");
|
const regEx = new RegExp("..", "g");
|
||||||
const bin = hexStr
|
const bin = hexStr
|
||||||
.replace(regEx, el => el + '_')
|
.replace(regEx, el => el + '_')
|
||||||
.slice(0, -1)
|
.slice(0, -1)
|
||||||
.split('_')
|
.split('_')
|
||||||
.map(hex => ("00000000" + (parseInt(hex, 16)).toString(2)).substr(-8));
|
.map(hex => ("00000000" + (parseInt(hex, 16)).toString(2)).substr(-8));
|
||||||
|
|
||||||
return bin;
|
return bin;
|
||||||
}
|
}
|
||||||
|
@ -153,8 +153,8 @@ function drawFont(str, font, x, y) {
|
||||||
const gridWidthTotal = (rows * (pxlW + gap)) + gutter;
|
const gridWidthTotal = (rows * (pxlW + gap)) + gutter;
|
||||||
for (let i = 0; i < charArr.length; i++) {
|
for (let i = 0; i < charArr.length; i++) {
|
||||||
const charAsBin = fontMap.hasOwnProperty(charArr[i])?
|
const charAsBin = fontMap.hasOwnProperty(charArr[i])?
|
||||||
hexToBin(fontMap[charArr[i]]):
|
hexToBin(fontMap[charArr[i]]):
|
||||||
fontMap.empty;
|
fontMap.empty;
|
||||||
|
|
||||||
drawGrid(
|
drawGrid(
|
||||||
{x: x + (i * gridWidthTotal), y: y},
|
{x: x + (i * gridWidthTotal), y: y},
|
||||||
|
@ -188,8 +188,8 @@ function drawCompass(lastHeading) {
|
||||||
const cps = Bangle.getCompass();
|
const cps = Bangle.getCompass();
|
||||||
let angle = cps.heading;
|
let angle = cps.heading;
|
||||||
let heading = angle?
|
let heading = angle?
|
||||||
directions[Math.round(((angle %= 360) < 0 ? angle + 360 : angle) / 45) % 8]:
|
directions[Math.round(((angle %= 360) < 0 ? angle + 360 : angle) / 45) % 8]:
|
||||||
"-- ";
|
"-- ";
|
||||||
|
|
||||||
heading = (heading + " ").slice(0, 3);
|
heading = (heading + " ").slice(0, 3);
|
||||||
if (lastHeading != heading) drawFont(heading, "5x5", 40, 67);
|
if (lastHeading != heading) drawFont(heading, "5x5", 40, 67);
|
||||||
|
|
|
@ -2,7 +2,7 @@ var storage = require('Storage');
|
||||||
|
|
||||||
//notify your phone
|
//notify your phone
|
||||||
function find(){
|
function find(){
|
||||||
Bluetooth.println(JSON.stringify({t:"findPhone", n:true}));
|
Bluetooth.println(JSON.stringify({t:"findPhone", n:true}));
|
||||||
}
|
}
|
||||||
|
|
||||||
//init graphics
|
//init graphics
|
||||||
|
@ -17,17 +17,17 @@ const settings = storage.readJSON('setting.json',1) || { HID: false };
|
||||||
|
|
||||||
//check if HID enabled and show message
|
//check if HID enabled and show message
|
||||||
if (settings.HID=="kb" || settings.HID=="kbmedia") {
|
if (settings.HID=="kb" || settings.HID=="kbmedia") {
|
||||||
g.setColor(0x03E0);
|
g.setColor(0x03E0);
|
||||||
g.drawString("click to find", g.getWidth()/2, g.getHeight()/2);
|
g.drawString("click to find", g.getWidth()/2, g.getHeight()/2);
|
||||||
|
|
||||||
//register all buttons and screen to find phone
|
//register all buttons and screen to find phone
|
||||||
setWatch(find, BTN1);
|
setWatch(find, BTN1);
|
||||||
setWatch(find, BTN2);
|
setWatch(find, BTN2);
|
||||||
setWatch(find, BTN3);
|
setWatch(find, BTN3);
|
||||||
setWatch(find, BTN4);
|
setWatch(find, BTN4);
|
||||||
setWatch(find, BTN5);
|
setWatch(find, BTN5);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
g.setColor(0xf800);
|
g.setColor(0xf800);
|
||||||
g.drawString("enable HID!", g.getWidth()/2, g.getHeight()/2);
|
g.drawString("enable HID!", g.getWidth()/2, g.getHeight()/2);
|
||||||
}
|
}
|
|
@ -5,15 +5,15 @@ function redraw() {
|
||||||
g.drawImage(img, 120-96, 120-96, {scale:2});
|
g.drawImage(img, 120-96, 120-96, {scale:2});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Code for button (Puck.js)
|
// Code for button (Puck.js)
|
||||||
var busy = false;
|
var busy = false;
|
||||||
|
|
||||||
var lastTry = getTime();
|
var lastTry = getTime();
|
||||||
|
|
||||||
function flag() {
|
function flag() {
|
||||||
E.showMessage("Working...");
|
E.showMessage("Working...");
|
||||||
if (busy && lastTry+5<getTime()) busy=false;
|
if (busy && lastTry+5<getTime()) busy=false;
|
||||||
lastTry = getTime();
|
lastTry = getTime();
|
||||||
|
|
||||||
if (busy) {
|
if (busy) {
|
||||||
digitalPulse(LED1,1,[10,200,10,200,10]);
|
digitalPulse(LED1,1,[10,200,10,200,10]);
|
||||||
|
@ -22,33 +22,33 @@ function flag() {
|
||||||
busy = true;
|
busy = true;
|
||||||
var gatt;
|
var gatt;
|
||||||
NRF.requestDevice({ filters: [{ name: 'Flag' }] })
|
NRF.requestDevice({ filters: [{ name: 'Flag' }] })
|
||||||
.then(function(device) {
|
.then(function(device) {
|
||||||
console.log("Found");
|
console.log("Found");
|
||||||
return device.gatt.connect();
|
return device.gatt.connect();
|
||||||
}).then(function(g) {
|
}).then(function(g) {
|
||||||
console.log("Connected");
|
console.log("Connected");
|
||||||
gatt = g;
|
gatt = g;
|
||||||
return gatt.getPrimaryService(
|
return gatt.getPrimaryService(
|
||||||
"3e440001-f5bb-357d-719d-179272e4d4d9");
|
"3e440001-f5bb-357d-719d-179272e4d4d9");
|
||||||
}).then(function(service) {
|
}).then(function(service) {
|
||||||
console.log("Found service");
|
console.log("Found service");
|
||||||
return service.getCharacteristic(
|
return service.getCharacteristic(
|
||||||
"3e440002-f5bb-357d-719d-179272e4d4d9");
|
"3e440002-f5bb-357d-719d-179272e4d4d9");
|
||||||
}).then(function(characteristic) {
|
}).then(function(characteristic) {
|
||||||
console.log("Found characteristic");
|
console.log("Found characteristic");
|
||||||
return characteristic.writeValue(1);
|
return characteristic.writeValue(1);
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
console.log("Found service");
|
console.log("Found service");
|
||||||
gatt.disconnect();
|
gatt.disconnect();
|
||||||
console.log("Done!");
|
console.log("Done!");
|
||||||
busy=false;
|
busy=false;
|
||||||
redraw();
|
redraw();
|
||||||
}).catch(function(e) {
|
}).catch(function(e) {
|
||||||
console.log("ERROR",e);
|
console.log("ERROR",e);
|
||||||
busy=false;
|
busy=false;
|
||||||
gatt.disconnect();
|
gatt.disconnect();
|
||||||
redraw();
|
redraw();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setWatch(flag, BTN, {repeat:true});
|
setWatch(flag, BTN, {repeat:true});
|
||||||
|
|
|
@ -101,7 +101,7 @@ Bangle.on('touch', function(button) {
|
||||||
if (!running) {
|
if (!running) {
|
||||||
gameStart();
|
gameStart();
|
||||||
} else {
|
} else {
|
||||||
birdvy -= 4;
|
birdvy -= 4;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -34,14 +34,14 @@ const drawSegment = (params) => {
|
||||||
for (i = angle1; i < angle2; i=i+incr) {
|
for (i = angle1; i < angle2; i=i+incr) {
|
||||||
brush = thickness * (angle2-angle1) /angle2;
|
brush = thickness * (angle2-angle1) /angle2;
|
||||||
points = [
|
points = [
|
||||||
x + Math.sin(i) * (segRadius+brush),
|
x + Math.sin(i) * (segRadius+brush),
|
||||||
y - Math.cos(i) * (segRadius+brush),
|
y - Math.cos(i) * (segRadius+brush),
|
||||||
x + Math.sin(i+incr) * (segRadius+brush),
|
x + Math.sin(i+incr) * (segRadius+brush),
|
||||||
y - Math.cos(i+incr) * (segRadius+brush),
|
y - Math.cos(i+incr) * (segRadius+brush),
|
||||||
x + Math.sin(i+incr) * (segRadius-brush),
|
x + Math.sin(i+incr) * (segRadius-brush),
|
||||||
y - Math.cos(i+incr) * (segRadius-brush),
|
y - Math.cos(i+incr) * (segRadius-brush),
|
||||||
x + Math.sin(i) * (segRadius-brush),
|
x + Math.sin(i) * (segRadius-brush),
|
||||||
y - Math.cos(i) * (segRadius-brush)
|
y - Math.cos(i) * (segRadius-brush)
|
||||||
];
|
];
|
||||||
g.fillPoly(points);
|
g.fillPoly(points);
|
||||||
}
|
}
|
||||||
|
@ -165,11 +165,11 @@ const drawMinuteHand = () => {
|
||||||
g.setColor(0,1,0);
|
g.setColor(0,1,0);
|
||||||
break;
|
break;
|
||||||
case "blue":
|
case "blue":
|
||||||
g.setColor(0,0,1);
|
g.setColor(0,0,1);
|
||||||
break;
|
break;
|
||||||
case "80s":
|
case "80s":
|
||||||
g.setColor(1,0,0);
|
g.setColor(1,0,0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g.setColor(0,1,0);
|
g.setColor(0,1,0);
|
||||||
}
|
}
|
||||||
|
@ -177,7 +177,7 @@ const drawMinuteHand = () => {
|
||||||
var points = [centerX,centerY];
|
var points = [centerX,centerY];
|
||||||
for (i = 0; i < angle; i=i+cirRad/60) {
|
for (i = 0; i < angle; i=i+cirRad/60) {
|
||||||
points.push(Math.round(centerX + Math.sin(i) * radius),
|
points.push(Math.round(centerX + Math.sin(i) * radius),
|
||||||
Math.round(centerY - Math.cos(i) * radius));
|
Math.round(centerY - Math.cos(i) * radius));
|
||||||
}
|
}
|
||||||
g.fillPoly(points);
|
g.fillPoly(points);
|
||||||
};
|
};
|
||||||
|
@ -194,24 +194,24 @@ const drawHourHand = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const drawClockFace = () => {
|
const drawClockFace = () => {
|
||||||
switch(colour) {
|
switch(colour) {
|
||||||
case "red":
|
case "red":
|
||||||
g.setColor(0.8,0.3,0);
|
g.setColor(0.8,0.3,0);
|
||||||
break;
|
break;
|
||||||
case "green":
|
case "green":
|
||||||
g.setColor(0.1,0.7,0);
|
g.setColor(0.1,0.7,0);
|
||||||
break;
|
break;
|
||||||
case "blue":
|
case "blue":
|
||||||
g.setColor(0,0.3,0.8);
|
g.setColor(0,0.3,0.8);
|
||||||
break;
|
break;
|
||||||
case "80s":
|
case "80s":
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g.setColor(0.1,0.7,0);
|
g.setColor(0.1,0.7,0);
|
||||||
}
|
}
|
||||||
g.fillCircle(centerX,centerY,radius*0.98);
|
g.fillCircle(centerX,centerY,radius*0.98);
|
||||||
};
|
};
|
||||||
|
|
||||||
const drawAll = () => {
|
const drawAll = () => {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
// make sure to enclose the function in parentheses
|
// make sure to enclose the function in parentheses
|
||||||
(function (back) {
|
(function (back) {
|
||||||
let settings = require('Storage').readJSON('gallifr.json',1)||{};
|
let settings = require('Storage').readJSON('gallifr.json',1)||{};
|
||||||
let colours = ["green","red","blue","80s"];
|
let colours = ["green","red","blue","80s"];
|
||||||
let onoff = ["on","off"];
|
let onoff = ["on","off"];
|
||||||
function save(key, value) {
|
function save(key, value) {
|
||||||
settings[key] = value;
|
settings[key] = value;
|
||||||
require('Storage').writeJSON('gallifr.json',settings);
|
require('Storage').writeJSON('gallifr.json',settings);
|
||||||
|
}
|
||||||
|
const appMenu = {
|
||||||
|
'': {'title': 'Clock Settings'},
|
||||||
|
'< Back': back,
|
||||||
|
'Colour': {
|
||||||
|
value: 0|settings['colour'],
|
||||||
|
min:0,max:3,
|
||||||
|
format: m => colours[m],
|
||||||
|
onchange: m => {save('colour', m)}
|
||||||
|
},
|
||||||
|
'Widgets': {
|
||||||
|
value: 0|settings['widgets'],
|
||||||
|
min:0,max:1,
|
||||||
|
format: m => onoff[m],
|
||||||
|
onchange: m => {save('widgets', m)}
|
||||||
|
},
|
||||||
|
'Decoration': {
|
||||||
|
value: 0|settings['decoration'],
|
||||||
|
min:0,max:1,
|
||||||
|
format: m => onoff[m],
|
||||||
|
onchange: m => {save('decoration', m)}
|
||||||
}
|
}
|
||||||
const appMenu = {
|
};
|
||||||
'': {'title': 'Clock Settings'},
|
E.showMenu(appMenu)
|
||||||
'< Back': back,
|
})
|
||||||
'Colour': {
|
|
||||||
value: 0|settings['colour'],
|
|
||||||
min:0,max:3,
|
|
||||||
format: m => colours[m],
|
|
||||||
onchange: m => {save('colour', m)}
|
|
||||||
},
|
|
||||||
'Widgets': {
|
|
||||||
value: 0|settings['widgets'],
|
|
||||||
min:0,max:1,
|
|
||||||
format: m => onoff[m],
|
|
||||||
onchange: m => {save('widgets', m)}
|
|
||||||
},
|
|
||||||
'Decoration': {
|
|
||||||
value: 0|settings['decoration'],
|
|
||||||
min:0,max:1,
|
|
||||||
format: m => onoff[m],
|
|
||||||
onchange: m => {save('decoration', m)}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
E.showMenu(appMenu)
|
|
||||||
})
|
|
||||||
|
|
|
@ -3,38 +3,38 @@ const storage = require("Storage");
|
||||||
const SETTINGS_FILE = 'getup.settings.json';
|
const SETTINGS_FILE = 'getup.settings.json';
|
||||||
|
|
||||||
function setting(key) {
|
function setting(key) {
|
||||||
const DEFAULTS = {
|
const DEFAULTS = {
|
||||||
'sitTime' : 20,
|
'sitTime' : 20,
|
||||||
'moveTime' : 1
|
'moveTime' : 1
|
||||||
}
|
}
|
||||||
if (!settings) {
|
if (!settings) {
|
||||||
loadSettings();
|
loadSettings();
|
||||||
}
|
}
|
||||||
return (key in settings) ? settings[key] : DEFAULTS[key];
|
return (key in settings) ? settings[key] : DEFAULTS[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
let settings;
|
let settings;
|
||||||
|
|
||||||
function loadSettings() {
|
function loadSettings() {
|
||||||
settings = storage.readJSON(SETTINGS_FILE, 1) || {};
|
settings = storage.readJSON(SETTINGS_FILE, 1) || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
//vibrate, draw move message and start timer for sitting message
|
//vibrate, draw move message and start timer for sitting message
|
||||||
function remind() {
|
function remind() {
|
||||||
Bangle.buzz(1000,1);
|
Bangle.buzz(1000,1);
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFont("8x12",4);
|
g.setFont("8x12",4);
|
||||||
g.setColor(0x03E0);
|
g.setColor(0x03E0);
|
||||||
g.drawString("MOVE!", g.getWidth()/2, g.getHeight()/2);
|
g.drawString("MOVE!", g.getWidth()/2, g.getHeight()/2);
|
||||||
setTimeout(print_message,setting("moveTime") * 60000);
|
setTimeout(print_message,setting("moveTime") * 60000);
|
||||||
}
|
}
|
||||||
//draw sitting message and start timer for reminder
|
//draw sitting message and start timer for reminder
|
||||||
function print_message(){
|
function print_message(){
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFont("8x12",2);
|
g.setFont("8x12",2);
|
||||||
g.setColor(0xF800);
|
g.setColor(0xF800);
|
||||||
g.drawString("sitting is dangerous!", g.getWidth()/2, g.getHeight()/2);
|
g.drawString("sitting is dangerous!", g.getWidth()/2, g.getHeight()/2);
|
||||||
setTimeout(remind,setting("sitTime") * 60000);
|
setTimeout(remind,setting("sitTime") * 60000);
|
||||||
}
|
}
|
||||||
|
|
||||||
//init graphics
|
//init graphics
|
||||||
|
|
|
@ -4,8 +4,8 @@ var buf = Graphics.createArrayBuffer(240,50,2,{msb:true});
|
||||||
var candraw = true;
|
var candraw = true;
|
||||||
|
|
||||||
function flip(b,y) {
|
function flip(b,y) {
|
||||||
g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer, palette:pal2color},0,y);
|
g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer, palette:pal2color},0,y);
|
||||||
b.clear();
|
b.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
var brg=0;
|
var brg=0;
|
||||||
|
@ -44,27 +44,27 @@ function drawCompass(course) {
|
||||||
if (bpos>210) bpos = 226;
|
if (bpos>210) bpos = 226;
|
||||||
buf.setColor(2);
|
buf.setColor(2);
|
||||||
buf.fillCircle(bpos,40,8);
|
buf.fillCircle(bpos,40,8);
|
||||||
}
|
}
|
||||||
flip(buf,Yoff);
|
flip(buf,Yoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
//displayed heading
|
//displayed heading
|
||||||
var heading = 0;
|
var heading = 0;
|
||||||
function newHeading(m,h){
|
function newHeading(m,h){
|
||||||
var s = Math.abs(m - h);
|
var s = Math.abs(m - h);
|
||||||
var delta = 1;
|
var delta = 1;
|
||||||
if (s<2) return h;
|
if (s<2) return h;
|
||||||
if (m > h){
|
if (m > h){
|
||||||
if (s >= 180) { delta = -1; s = 360 - s;}
|
if (s >= 180) { delta = -1; s = 360 - s;}
|
||||||
} else if (m <= h){
|
} else if (m <= h){
|
||||||
if (s < 180) delta = -1;
|
if (s < 180) delta = -1;
|
||||||
else s = 360 -s;
|
else s = 360 -s;
|
||||||
}
|
}
|
||||||
delta = delta * (1 + Math.round(s/15));
|
delta = delta * (1 + Math.round(s/15));
|
||||||
heading+=delta;
|
heading+=delta;
|
||||||
if (heading<0) heading += 360;
|
if (heading<0) heading += 360;
|
||||||
if (heading>360) heading -= 360;
|
if (heading>360) heading -= 360;
|
||||||
return heading;
|
return heading;
|
||||||
}
|
}
|
||||||
|
|
||||||
var course =0;
|
var course =0;
|
||||||
|
@ -193,17 +193,17 @@ function setButtons(){
|
||||||
}
|
}
|
||||||
|
|
||||||
var SCREENACCESS = {
|
var SCREENACCESS = {
|
||||||
withApp:true,
|
withApp:true,
|
||||||
request:function(){
|
request:function(){
|
||||||
this.withApp=false;
|
this.withApp=false;
|
||||||
stopdraw();
|
stopdraw();
|
||||||
clearWatch();
|
clearWatch();
|
||||||
},
|
},
|
||||||
release:function(){
|
release:function(){
|
||||||
this.withApp=true;
|
this.withApp=true;
|
||||||
startdraw();
|
startdraw();
|
||||||
setButtons();
|
setButtons();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bangle.on('lcdPower',function(on) {
|
Bangle.on('lcdPower',function(on) {
|
||||||
|
@ -229,9 +229,9 @@ function nextwp(inc){
|
||||||
|
|
||||||
function doselect(){
|
function doselect(){
|
||||||
if (selected && waypoints[wpindex].lat===undefined && savedfix.fix) {
|
if (selected && waypoints[wpindex].lat===undefined && savedfix.fix) {
|
||||||
waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon};
|
waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon};
|
||||||
wp = waypoints[wpindex];
|
wp = waypoints[wpindex];
|
||||||
require("Storage").writeJSON("waypoints.json", waypoints);
|
require("Storage").writeJSON("waypoints.json", waypoints);
|
||||||
}
|
}
|
||||||
selected=!selected;
|
selected=!selected;
|
||||||
drawN();
|
drawN();
|
||||||
|
|
|
@ -48,9 +48,9 @@ function drawApp() {
|
||||||
|
|
||||||
if (camShot) {
|
if (camShot) {
|
||||||
setWatch(function(e) {
|
setWatch(function(e) {
|
||||||
E.showMessage('camShot !');
|
E.showMessage('camShot !');
|
||||||
setTimeout(drawApp, 1000);
|
setTimeout(drawApp, 1000);
|
||||||
camShot(() => {});
|
camShot(() => {});
|
||||||
}, BTN2, { edge:"falling",repeat:true,debounce:50});
|
}, BTN2, { edge:"falling",repeat:true,debounce:50});
|
||||||
|
|
||||||
drawApp();
|
drawApp();
|
||||||
|
|
|
@ -4,71 +4,71 @@ const settings = storage.readJSON('setting.json',1) || { HID: false };
|
||||||
var sendInProgress = false; // Only send one message at a time, do not flood
|
var sendInProgress = false; // Only send one message at a time, do not flood
|
||||||
|
|
||||||
const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) {
|
const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) {
|
||||||
try {
|
try {
|
||||||
const buttons = (btn5<<4) | (btn4<<3) | (btn3<<2) | (btn2<<1) | (btn1<<0);
|
const buttons = (btn5<<4) | (btn4<<3) | (btn3<<2) | (btn2<<1) | (btn1<<0);
|
||||||
if (!sendInProgress) {
|
if (!sendInProgress) {
|
||||||
sendInProgress = true;
|
sendInProgress = true;
|
||||||
NRF.sendHIDReport([buttons, x, y], () => {
|
NRF.sendHIDReport([buttons, x, y], () => {
|
||||||
sendInProgress = false;
|
sendInProgress = false;
|
||||||
if (cb) cb();
|
if (cb) cb();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
print(e);
|
print(e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function drawApp() {
|
function drawApp() {
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFont("6x8",2);
|
g.setFont("6x8",2);
|
||||||
g.setFontAlign(0,0);
|
g.setFontAlign(0,0);
|
||||||
g.drawString("Joystick", 120, 120);
|
g.drawString("Joystick", 120, 120);
|
||||||
const d = g.getWidth() - 18;
|
const d = g.getWidth() - 18;
|
||||||
|
|
||||||
function c(a) {
|
function c(a) {
|
||||||
return {
|
return {
|
||||||
width: 8,
|
width: 8,
|
||||||
height: a.length,
|
height: a.length,
|
||||||
bpp: 1,
|
bpp: 1,
|
||||||
buffer: (new Uint8Array(a)).buffer
|
buffer: (new Uint8Array(a)).buffer
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
g.drawImage(c([16,56,124,254,16,16,16,16]),d,40);
|
g.drawImage(c([16,56,124,254,16,16,16,16]),d,40);
|
||||||
g.drawImage(c([16,16,16,16,254,124,56,16]),d,194);
|
g.drawImage(c([16,16,16,16,254,124,56,16]),d,194);
|
||||||
g.drawImage(c([0,8,12,14,255,14,12,8]),d,116);
|
g.drawImage(c([0,8,12,14,255,14,12,8]),d,116);
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
const btn1 = BTN1.read();
|
const btn1 = BTN1.read();
|
||||||
const btn2 = BTN2.read();
|
const btn2 = BTN2.read();
|
||||||
const btn3 = BTN3.read();
|
const btn3 = BTN3.read();
|
||||||
const btn4 = BTN4.read();
|
const btn4 = BTN4.read();
|
||||||
const btn5 = BTN5.read();
|
const btn5 = BTN5.read();
|
||||||
const acc = Bangle.getAccel();
|
const acc = Bangle.getAccel();
|
||||||
var x = acc.x*-127;
|
var x = acc.x*-127;
|
||||||
var y = acc.y*-127;
|
var y = acc.y*-127;
|
||||||
|
|
||||||
// check limits
|
// check limits
|
||||||
if (x > 127) x = 127;
|
if (x > 127) x = 127;
|
||||||
else if (x < -127) x = -127;
|
else if (x < -127) x = -127;
|
||||||
if (y > 127) y = 127;
|
if (y > 127) y = 127;
|
||||||
else if (y < -127) y = -127;
|
else if (y < -127) y = -127;
|
||||||
|
|
||||||
sendHid(x & 0xff, y & 0xff, btn1, btn2, btn3, btn4, btn5);
|
sendHid(x & 0xff, y & 0xff, btn1, btn2, btn3, btn4, btn5);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.HID === "joy") {
|
if (settings.HID === "joy") {
|
||||||
drawApp();
|
drawApp();
|
||||||
setInterval(update, 100); // 10 Hz
|
setInterval(update, 100); // 10 Hz
|
||||||
} else {
|
} else {
|
||||||
E.showPrompt("Enable HID?",{title:"HID disabled"}).then(function(enable) {
|
E.showPrompt("Enable HID?",{title:"HID disabled"}).then(function(enable) {
|
||||||
if (enable) {
|
if (enable) {
|
||||||
settings.HID = "joy";
|
settings.HID = "joy";
|
||||||
storage.write('setting.json', settings);
|
storage.write('setting.json', settings);
|
||||||
setTimeout(load, 1000, "hidjoystick.app.js");
|
setTimeout(load, 1000, "hidjoystick.app.js");
|
||||||
} else {
|
} else {
|
||||||
setTimeout(load, 1000);
|
setTimeout(load, 1000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,13 +16,13 @@ setWatch(x=>{
|
||||||
},BTN1,{repeat:true});
|
},BTN1,{repeat:true});
|
||||||
|
|
||||||
function updateAdvertising() {
|
function updateAdvertising() {
|
||||||
try {
|
try {
|
||||||
NRF.setAdvertising({},{
|
NRF.setAdvertising({},{
|
||||||
manufacturer: 0x0590,
|
manufacturer: 0x0590,
|
||||||
manufacturerData: new Uint8Array([mycounter>>8,mycounter&255]),
|
manufacturerData: new Uint8Array([mycounter>>8,mycounter&255]),
|
||||||
interval: 60
|
interval: 60
|
||||||
});
|
});
|
||||||
} catch(e){}
|
} catch(e){}
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawPlayers() {
|
function drawPlayers() {
|
||||||
|
@ -44,7 +44,7 @@ function drawPlayers() {
|
||||||
var d = 63 - (offset&63);
|
var d = 63 - (offset&63);
|
||||||
g.fillRect(0,10,240,12);
|
g.fillRect(0,10,240,12);
|
||||||
for (var x=d;x<240;x+=64)
|
for (var x=d;x<240;x+=64)
|
||||||
g.fillRect(x,12,x+2,12+20);
|
g.fillRect(x,12,x+2,12+20);
|
||||||
var y = 20;
|
var y = 20;
|
||||||
var p = mycounter-offset;
|
var p = mycounter-offset;
|
||||||
g.drawString("You",p-16,y+20);
|
g.drawString("You",p-16,y+20);
|
||||||
|
@ -60,7 +60,7 @@ function drawPlayers() {
|
||||||
|
|
||||||
g.fillRect(0,150,240,152);
|
g.fillRect(0,150,240,152);
|
||||||
for (var x=d;x<240;x+=64)
|
for (var x=d;x<240;x+=64)
|
||||||
g.fillRect(x,152,x+2,160);
|
g.fillRect(x,152,x+2,160);
|
||||||
g.flip();
|
g.flip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,30 +7,30 @@ by Gordon Williams https://github.com/gfwilliams
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
|
|
||||||
const allWords = [
|
const allWords = [
|
||||||
"AEARLYDN",
|
"AEARLYDN",
|
||||||
"LATEYRZO",
|
"LATEYRZO",
|
||||||
"MORNINGO",
|
"MORNINGO",
|
||||||
"KMIDDLEN",
|
"KMIDDLEN",
|
||||||
"AFTERDAY",
|
"AFTERDAY",
|
||||||
"OFDZTHEC",
|
"OFDZTHEC",
|
||||||
"EVENINGR",
|
"EVENINGR",
|
||||||
"ORMNIGHT"
|
"ORMNIGHT"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
const timeOfDay = {
|
const timeOfDay = {
|
||||||
0: ["", 0, 0],
|
0: ["", 0, 0],
|
||||||
1: ["EARLYMORNING", 10, 20, 30, 40, 50, 02, 12, 22, 32, 42, 52, 62],
|
1: ["EARLYMORNING", 10, 20, 30, 40, 50, 02, 12, 22, 32, 42, 52, 62],
|
||||||
2: ["MORNING", 02, 12, 22, 32, 42, 52, 62],
|
2: ["MORNING", 02, 12, 22, 32, 42, 52, 62],
|
||||||
3: ["LATEMORNING", 01, 11, 21, 31, 02, 12, 22, 32, 42, 52, 62],
|
3: ["LATEMORNING", 01, 11, 21, 31, 02, 12, 22, 32, 42, 52, 62],
|
||||||
4: ["MIDDAY", 13, 23, 33, 54, 64, 74],
|
4: ["MIDDAY", 13, 23, 33, 54, 64, 74],
|
||||||
5: ["EARLYAFTERNOON", 10, 20, 30, 40, 50, 04, 14, 24, 34, 44, 70, 71, 72, 73],
|
5: ["EARLYAFTERNOON", 10, 20, 30, 40, 50, 04, 14, 24, 34, 44, 70, 71, 72, 73],
|
||||||
6: ["AFTERNOON", 04, 14, 24, 34, 44, 70, 71, 72, 73],
|
6: ["AFTERNOON", 04, 14, 24, 34, 44, 70, 71, 72, 73],
|
||||||
7: ["LATEAFTERNOON", 01, 11, 21, 31, 04, 14, 24, 34, 44, 70, 71, 72, 73],
|
7: ["LATEAFTERNOON", 01, 11, 21, 31, 04, 14, 24, 34, 44, 70, 71, 72, 73],
|
||||||
8: ["EARLYEVENING", 10, 20, 30, 40, 50, 06, 16, 26, 36, 46, 56, 66],
|
8: ["EARLYEVENING", 10, 20, 30, 40, 50, 06, 16, 26, 36, 46, 56, 66],
|
||||||
9: ["EVENING", 06, 16, 26, 36, 46, 56, 66],
|
9: ["EVENING", 06, 16, 26, 36, 46, 56, 66],
|
||||||
10: ["NIGHT", 37, 47, 57, 67, 77],
|
10: ["NIGHT", 37, 47, 57, 67, 77],
|
||||||
11: ["MIDDLEOFTHENIGHT", 13, 23, 33, 43, 53, 63, 05, 15, 45, 55, 65, 37,47,57,67,77 ],
|
11: ["MIDDLEOFTHENIGHT", 13, 23, 33, 43, 53, 63, 05, 15, 45, 55, 65, 37,47,57,67,77 ],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,100 +51,100 @@ var hidxPrev;
|
||||||
function drawWordClock() {
|
function drawWordClock() {
|
||||||
|
|
||||||
|
|
||||||
// get time
|
// get time
|
||||||
var t = new Date();
|
var t = new Date();
|
||||||
var h = t.getHours();
|
var h = t.getHours();
|
||||||
var m = t.getMinutes();
|
var m = t.getMinutes();
|
||||||
var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2);
|
var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2);
|
||||||
var day = t.getDay();
|
var day = t.getDay();
|
||||||
|
|
||||||
var hidx;
|
var hidx;
|
||||||
|
|
||||||
var activeColor = activeColorDay;
|
var activeColor = activeColorDay;
|
||||||
if(h < 7 || h > 19) {activeColor = activeColorNight;}
|
if(h < 7 || h > 19) {activeColor = activeColorNight;}
|
||||||
|
|
||||||
g.setFont("6x8",fontSize);
|
g.setFont("6x8",fontSize);
|
||||||
g.setColor(passivColor);
|
g.setColor(passivColor);
|
||||||
g.setFontAlign(0, -1, 0);
|
g.setFontAlign(0, -1, 0);
|
||||||
|
|
||||||
|
|
||||||
// Switch case isn't good for this in Js apparently so...
|
// Switch case isn't good for this in Js apparently so...
|
||||||
if(h < 3){
|
if(h < 3){
|
||||||
// Middle of the Night
|
// Middle of the Night
|
||||||
hidx = 11;
|
hidx = 11;
|
||||||
}
|
}
|
||||||
else if (h < 7){
|
else if (h < 7){
|
||||||
// Early Morning
|
// Early Morning
|
||||||
hidx = 1;
|
hidx = 1;
|
||||||
}
|
}
|
||||||
else if (h < 10){
|
else if (h < 10){
|
||||||
// Morning
|
// Morning
|
||||||
hidx = 2;
|
hidx = 2;
|
||||||
}
|
}
|
||||||
else if (h < 12){
|
else if (h < 12){
|
||||||
// Late Morning
|
// Late Morning
|
||||||
hidx = 3;
|
hidx = 3;
|
||||||
}
|
}
|
||||||
else if (h < 13){
|
else if (h < 13){
|
||||||
// Midday
|
// Midday
|
||||||
hidx = 4;
|
hidx = 4;
|
||||||
}
|
}
|
||||||
else if (h < 14){
|
else if (h < 14){
|
||||||
// Early afternoon
|
// Early afternoon
|
||||||
hidx = 5;
|
hidx = 5;
|
||||||
}
|
}
|
||||||
else if (h < 16){
|
else if (h < 16){
|
||||||
// Afternoon
|
// Afternoon
|
||||||
hidx = 6;
|
hidx = 6;
|
||||||
}
|
}
|
||||||
else if (h < 17){
|
else if (h < 17){
|
||||||
// Late Afternoon
|
// Late Afternoon
|
||||||
hidx = 7;
|
hidx = 7;
|
||||||
}
|
}
|
||||||
else if (h < 19){
|
else if (h < 19){
|
||||||
// Early evening
|
// Early evening
|
||||||
hidx = 8;
|
hidx = 8;
|
||||||
}
|
}
|
||||||
else if (h < 21){
|
else if (h < 21){
|
||||||
// evening
|
// evening
|
||||||
hidx = 9;
|
hidx = 9;
|
||||||
}
|
}
|
||||||
else if (h < 24){
|
else if (h < 24){
|
||||||
// Night
|
// Night
|
||||||
hidx = 10;
|
hidx = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check whether we need to redraw the watchface
|
// check whether we need to redraw the watchface
|
||||||
if (hidx !== hidxPrev) {
|
if (hidx !== hidxPrev) {
|
||||||
// draw allWords
|
// draw allWords
|
||||||
var c;
|
var c;
|
||||||
var y = ys;
|
var y = ys;
|
||||||
var x = xs;
|
var x = xs;
|
||||||
allWords.forEach((line) => {
|
allWords.forEach((line) => {
|
||||||
x = xs;
|
x = xs;
|
||||||
for (c in line) {
|
for (c in line) {
|
||||||
g.drawString(line[c], x, y);
|
g.drawString(line[c], x, y);
|
||||||
x += dx;
|
x += dx;
|
||||||
}
|
}
|
||||||
y += dy;
|
y += dy;
|
||||||
});
|
});
|
||||||
|
|
||||||
// write hour in active color
|
// write hour in active color
|
||||||
g.setColor(activeColor);
|
g.setColor(activeColor);
|
||||||
timeOfDay[hidx][0].split('').forEach((c, pos) => {
|
timeOfDay[hidx][0].split('').forEach((c, pos) => {
|
||||||
x = xs + (timeOfDay[hidx][pos + 1] / 10 | 0) * dx;
|
x = xs + (timeOfDay[hidx][pos + 1] / 10 | 0) * dx;
|
||||||
y = ys + (timeOfDay[hidx][pos + 1] % 10) * dy;
|
y = ys + (timeOfDay[hidx][pos + 1] % 10) * dy;
|
||||||
g.drawString(c, x, y);
|
g.drawString(c, x, y);
|
||||||
});
|
});
|
||||||
hidxPrev = hidx;
|
hidxPrev = hidx;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display digital time while button 1 is pressed
|
// Display digital time while button 1 is pressed
|
||||||
g.clearRect(0, 215, 240, 240);
|
g.clearRect(0, 215, 240, 240);
|
||||||
if (BTN1.read()){
|
if (BTN1.read()){
|
||||||
g.setColor(activeColor);
|
g.setColor(activeColor);
|
||||||
g.drawString(time, 120, 215);
|
g.drawString(time, 120, 215);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,19 +3,19 @@ E.showMessage("Jingle Bells");
|
||||||
var eventEmitter = new Object();
|
var eventEmitter = new Object();
|
||||||
|
|
||||||
function strofa(notes, times, current, next){
|
function strofa(notes, times, current, next){
|
||||||
eventEmitter.on(current, () => {
|
eventEmitter.on(current, () => {
|
||||||
if (notes.length == 0) {
|
if (notes.length == 0) {
|
||||||
eventEmitter.emit(next);
|
eventEmitter.emit(next);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let note = notes.shift();
|
let note = notes.shift();
|
||||||
let time = times.shift();
|
let time = times.shift();
|
||||||
Bangle.beep(time, note).then(() => {
|
Bangle.beep(time, note).then(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
eventEmitter.emit(current);
|
eventEmitter.emit(current);
|
||||||
}, time);
|
}, time);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var one = [2637, 2637, 2637, 2637, 2637, 2637, 2637, 3135, 2093, 2349, 2637];
|
var one = [2637, 2637, 2637, 2637, 2637, 2637, 2637, 3135, 2093, 2349, 2637];
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
const distanceUnits = { // how many meters per X?
|
const distanceUnits = { // how many meters per X?
|
||||||
"m": 1,
|
"m": 1,
|
||||||
"yd": 0.9144,
|
"yd": 0.9144,
|
||||||
"mi": 1609.34,
|
"mi": 1609.34,
|
||||||
"km": 1000,
|
"km": 1000,
|
||||||
"kmi": 1000
|
"kmi": 1000
|
||||||
};
|
};
|
||||||
const speedUnits = { // how many kph per X?
|
const speedUnits = { // how many kph per X?
|
||||||
"kmh": 1,
|
"kmh": 1,
|
||||||
"kph": 1,
|
"kph": 1,
|
||||||
"km/h": 1,
|
"km/h": 1,
|
||||||
"mph": 1.60934
|
"mph": 1.60934
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -34,417 +34,417 @@ timePattern / datePattern:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var locales = {
|
var locales = {
|
||||||
"en_GB": { // this is default
|
"en_GB": { // this is default
|
||||||
lang: "en_GB",
|
lang: "en_GB",
|
||||||
decimal_point: ".",
|
decimal_point: ".",
|
||||||
thousands_sep: ",",
|
thousands_sep: ",",
|
||||||
currency_symbol: "£", currency_first: true,
|
currency_symbol: "£", currency_first: true,
|
||||||
int_curr_symbol: "GBP",
|
int_curr_symbol: "GBP",
|
||||||
speed: 'mph',
|
speed: 'mph',
|
||||||
distance: { "0": "yd", "1": "mi" },
|
distance: { "0": "yd", "1": "mi" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "am", 1: "pm" },
|
ampm: { 0: "am", 1: "pm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%b %d %Y", 1: "%d/%m/%Y" }, // Feb 28 2020" // "01/03/2020"(short)
|
datePattern: { 0: "%b %d %Y", 1: "%d/%m/%Y" }, // Feb 28 2020" // "01/03/2020"(short)
|
||||||
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
||||||
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
||||||
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
||||||
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"de_DE": {
|
"de_DE": {
|
||||||
lang: "de_DE",
|
lang: "de_DE",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%Y" }, // Sonntag, 1. März 2020 // 01.01.20
|
datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%Y" }, // Sonntag, 1. März 2020 // 01.01.20
|
||||||
abmonth: "Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez",
|
abmonth: "Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez",
|
||||||
month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
|
month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
|
||||||
abday: "So,Mo,Di,Mi,Do,Fr,Sa",
|
abday: "So,Mo,Di,Mi,Do,Fr,Sa",
|
||||||
day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",
|
day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",
|
||||||
trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" }
|
trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" }
|
||||||
},
|
},
|
||||||
"en_US": {
|
"en_US": {
|
||||||
lang: "en_US",
|
lang: "en_US",
|
||||||
decimal_point: ".",
|
decimal_point: ".",
|
||||||
thousands_sep: ",",
|
thousands_sep: ",",
|
||||||
currency_symbol: "$", currency_first: true,
|
currency_symbol: "$", currency_first: true,
|
||||||
int_curr_symbol: "USD",
|
int_curr_symbol: "USD",
|
||||||
speed: "mph",
|
speed: "mph",
|
||||||
distance: { 0: "yd", 1: "mi" },
|
distance: { 0: "yd", 1: "mi" },
|
||||||
temperature: "°F",
|
temperature: "°F",
|
||||||
ampm: { 0: "am", 1: "pm" },
|
ampm: { 0: "am", 1: "pm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%b %d, %Y", 1: "%m/%d/%y" },
|
datePattern: { 0: "%b %d, %Y", 1: "%m/%d/%y" },
|
||||||
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
||||||
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
||||||
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
||||||
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"en_JP": { // we do not have the font, so it is not ja_JP
|
"en_JP": { // we do not have the font, so it is not ja_JP
|
||||||
lang: "en_JP",
|
lang: "en_JP",
|
||||||
decimal_point: ".",
|
decimal_point: ".",
|
||||||
thousands_sep: ",",
|
thousands_sep: ",",
|
||||||
currency_symbol: "¥",
|
currency_symbol: "¥",
|
||||||
int_curr_symbol: "JPY",
|
int_curr_symbol: "JPY",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°F",
|
temperature: "°F",
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%y/%M/%d", 1: "%y/%m;/%d" },
|
datePattern: { 0: "%y/%M/%d", 1: "%y/%m;/%d" },
|
||||||
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
||||||
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
||||||
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
||||||
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"nl_NL": {
|
"nl_NL": {
|
||||||
lang: "nl_NL",
|
lang: "nl_NL",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A %B %d %Y", 1: "%d.%m.%y" }, // zondag 1 maart 2020 // 01.01.20
|
datePattern: { 0: "%A %B %d %Y", 1: "%d.%m.%y" }, // zondag 1 maart 2020 // 01.01.20
|
||||||
abday: "zo,ma,di,wo,do,vr,za",
|
abday: "zo,ma,di,wo,do,vr,za",
|
||||||
day: "zondag,maandag,dinsdag,woensdag,donderdag,vrijdag,zaterdag",
|
day: "zondag,maandag,dinsdag,woensdag,donderdag,vrijdag,zaterdag",
|
||||||
abmonth: "jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec",
|
abmonth: "jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec",
|
||||||
month: "januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december",
|
month: "januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"en_CA": {
|
"en_CA": {
|
||||||
lang: "en_CA",
|
lang: "en_CA",
|
||||||
decimal_point: ".",
|
decimal_point: ".",
|
||||||
thousands_sep: ",",
|
thousands_sep: ",",
|
||||||
currency_symbol: "$",
|
currency_symbol: "$",
|
||||||
int_curr_symbol: "CAD",
|
int_curr_symbol: "CAD",
|
||||||
speed: "km/h",
|
speed: "km/h",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "am", 1: "pm" },
|
ampm: { 0: "am", 1: "pm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %B %d, %Y", "1": "%Y-%m-%d" }, // Sunday, March 1, 2020 // 2012-12-20
|
datePattern: { 0: "%A, %B %d, %Y", "1": "%Y-%m-%d" }, // Sunday, March 1, 2020 // 2012-12-20
|
||||||
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
||||||
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
||||||
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
||||||
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"fr_FR": {
|
"fr_FR": {
|
||||||
lang: "fr_FR",
|
lang: "fr_FR",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: " ",
|
thousands_sep: " ",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "km/h",
|
speed: "km/h",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A %d %B %Y", "1": "%d/%m/%Y" }, // dimanche 1 mars 2020 // 01/03/2020
|
datePattern: { 0: "%A %d %B %Y", "1": "%d/%m/%Y" }, // dimanche 1 mars 2020 // 01/03/2020
|
||||||
abmonth: "janv,févr,mars,avril,mai,juin,juil,août,sept,oct,nov,déc",
|
abmonth: "janv,févr,mars,avril,mai,juin,juil,août,sept,oct,nov,déc",
|
||||||
month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre",
|
month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre",
|
||||||
abday: "dim,lun,mar,mer,jeu,ven,sam",
|
abday: "dim,lun,mar,mer,jeu,ven,sam",
|
||||||
day: "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi",
|
day: "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi",
|
||||||
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"sv_SE": {
|
"sv_SE": {
|
||||||
lang: "sv_SE",
|
lang: "sv_SE",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "kr",
|
currency_symbol: "kr",
|
||||||
int_curr_symbol: "SKR",
|
int_curr_symbol: "SKR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "fm", 1: "em" },
|
ampm: { 0: "fm", 1: "em" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A %B %d %Y", "1": "%Y-%m-%d" }, // söndag 1 mars 2020 // 2020-03-01
|
datePattern: { 0: "%A %B %d %Y", "1": "%Y-%m-%d" }, // söndag 1 mars 2020 // 2020-03-01
|
||||||
abmonth: "jan,feb,mars,apr,maj,juni,juli,aug,sep,okt,nov,dec",
|
abmonth: "jan,feb,mars,apr,maj,juni,juli,aug,sep,okt,nov,dec",
|
||||||
month: "januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december",
|
month: "januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december",
|
||||||
abday: "sön,mån,tis,ons,tors,fre,lör",
|
abday: "sön,mån,tis,ons,tors,fre,lör",
|
||||||
day: "söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag",
|
day: "söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag",
|
||||||
trans: { yes: "ja", Yes: "Ja", no: "nej", No: "Nej", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "ja", Yes: "Ja", no: "nej", No: "Nej", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"en_AU": {
|
"en_AU": {
|
||||||
lang: "en_AU",
|
lang: "en_AU",
|
||||||
decimal_point: ".",
|
decimal_point: ".",
|
||||||
thousands_sep: ",",
|
thousands_sep: ",",
|
||||||
currency_symbol: "$",
|
currency_symbol: "$",
|
||||||
int_curr_symbol: "AUD",
|
int_curr_symbol: "AUD",
|
||||||
speed: "mph",
|
speed: "mph",
|
||||||
distance: { 0: "mi", 1: "kmi" },
|
distance: { 0: "mi", 1: "kmi" },
|
||||||
temperature: "°F",
|
temperature: "°F",
|
||||||
ampm: { 0: "am", 1: "pm" },
|
ampm: { 0: "am", 1: "pm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %B %d, %Y", "1": "%m/%d/%y" }, // Sunday, 1 March 2020 // 1/3/20
|
datePattern: { 0: "%A, %B %d, %Y", "1": "%m/%d/%y" }, // Sunday, 1 March 2020 // 1/3/20
|
||||||
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
||||||
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
||||||
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
||||||
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"de_AT": {
|
"de_AT": {
|
||||||
lang: "de_AT",
|
lang: "de_AT",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%y" }, // Sonntag, 1. März 2020 // 01.03.20
|
datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%y" }, // Sonntag, 1. März 2020 // 01.03.20
|
||||||
abmonth: "Jän,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez",
|
abmonth: "Jän,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez",
|
||||||
month: "Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
|
month: "Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
|
||||||
abday: "So,Mo,Di,Mi,Do,Fr,Sa",
|
abday: "So,Mo,Di,Mi,Do,Fr,Sa",
|
||||||
day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",
|
day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",
|
||||||
trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" }
|
trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" }
|
||||||
},
|
},
|
||||||
"en_IL": {
|
"en_IL": {
|
||||||
lang: "en_IL",
|
lang: "en_IL",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "₪",
|
currency_symbol: "₪",
|
||||||
int_curr_symbol: "ILS",
|
int_curr_symbol: "ILS",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "am", 1: "pm" },
|
ampm: { 0: "am", 1: "pm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %B %d, %Y", "1": "%d/%m/%Y" }, // Sunday, 1 March 2020 // 01/03/2020
|
datePattern: { 0: "%A, %B %d, %Y", "1": "%d/%m/%Y" }, // Sunday, 1 March 2020 // 01/03/2020
|
||||||
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
|
||||||
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
month: "January,February,March,April,May,June,July,August,September,October,November,December",
|
||||||
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
|
||||||
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
|
||||||
// No translation for english...
|
// No translation for english...
|
||||||
},
|
},
|
||||||
"es_ES": {
|
"es_ES": {
|
||||||
lang: "es_ES",
|
lang: "es_ES",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %d de %B de %Y", "1": "%d/%m/%y" }, // domingo, 1 de marzo de 2020 // 01/03/20
|
datePattern: { 0: "%A, %d de %B de %Y", "1": "%d/%m/%y" }, // domingo, 1 de marzo de 2020 // 01/03/20
|
||||||
abmonth: "ene,feb,mar,abr,may,jun,jul,ago,sept,oct,nov,dic",
|
abmonth: "ene,feb,mar,abr,may,jun,jul,ago,sept,oct,nov,dic",
|
||||||
month: "enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre",
|
month: "enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre",
|
||||||
abday: "dom,lun,mar,mié,jue,vie,sáb",
|
abday: "dom,lun,mar,mié,jue,vie,sáb",
|
||||||
day: "domingo,lunes,martes,miércoles,jueves,viernes,sábado",
|
day: "domingo,lunes,martes,miércoles,jueves,viernes,sábado",
|
||||||
trans: { yes: "sí", Yes: "Sí", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "sí", Yes: "Sí", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"fr_BE": {
|
"fr_BE": {
|
||||||
lang: "fr_BE",
|
lang: "fr_BE",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%y" }, // dimanche 1 mars 2020 // 01/03/20
|
datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%y" }, // dimanche 1 mars 2020 // 01/03/20
|
||||||
abmonth: "anv.,févr.,mars,avril,mai,juin,juil.,août,sept.,oct.,nov.,déc.",
|
abmonth: "anv.,févr.,mars,avril,mai,juin,juil.,août,sept.,oct.,nov.,déc.",
|
||||||
month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre",
|
month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre",
|
||||||
abday: "dim,lun,mar,mer,jeu,ven,sam",
|
abday: "dim,lun,mar,mer,jeu,ven,sam",
|
||||||
day: "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi",
|
day: "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi",
|
||||||
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"fi_FI": {
|
"fi_FI": {
|
||||||
lang: "fi_FI",
|
lang: "fi_FI",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "ap", 1: "ip" },
|
ampm: { 0: "ap", 1: "ip" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, // 17.00.00 // 17.00
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, // 17.00.00 // 17.00
|
||||||
datePattern: { 0: "%A %d. %B %Y", "1": "%-d/%-m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020
|
datePattern: { 0: "%A %d. %B %Y", "1": "%-d/%-m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020
|
||||||
abmonth: "tammik,helmik,maalisk,huhtik,toukok,kesäk,heinäk,elok,syysk,lokak,marrask,jouluk",
|
abmonth: "tammik,helmik,maalisk,huhtik,toukok,kesäk,heinäk,elok,syysk,lokak,marrask,jouluk",
|
||||||
month: "tammikuuta,helmikuuta,maaliskuuta,huhtikuuta,toukokuuta,kesäkuuta,heinäkuuta,elokuuta,syyskuuta,lokakuuta,marraskuuta,joulukuuta",
|
month: "tammikuuta,helmikuuta,maaliskuuta,huhtikuuta,toukokuuta,kesäkuuta,heinäkuuta,elokuuta,syyskuuta,lokakuuta,marraskuuta,joulukuuta",
|
||||||
abday: "su,ma,ti,ke,to,pe,la",
|
abday: "su,ma,ti,ke,to,pe,la",
|
||||||
day: "sunnuntaina,maanantaina,tiistaina,keskiviikkona,torstaina,perjantaina,lauantaina",
|
day: "sunnuntaina,maanantaina,tiistaina,keskiviikkona,torstaina,perjantaina,lauantaina",
|
||||||
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"de_CH": {
|
"de_CH": {
|
||||||
lang: "de_CH",
|
lang: "de_CH",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "CHF",
|
currency_symbol: "CHF",
|
||||||
int_curr_symbol: "CHF",
|
int_curr_symbol: "CHF",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "vorm", 1: " nachm" },
|
ampm: { 0: "vorm", 1: " nachm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%Y" }, // Sonntag, 1. März 2020 // 1.3.2020
|
datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%Y" }, // Sonntag, 1. März 2020 // 1.3.2020
|
||||||
abmonth: "Jan,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez",
|
abmonth: "Jan,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez",
|
||||||
month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
|
month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
|
||||||
abday: "So,Mo,Di,Mi,Do,Fr,Sa",
|
abday: "So,Mo,Di,Mi,Do,Fr,Sa",
|
||||||
day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",
|
day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",
|
||||||
trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" }
|
trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" }
|
||||||
},
|
},
|
||||||
"fr_CH": {
|
"fr_CH": {
|
||||||
lang: "fr_CH",
|
lang: "fr_CH",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "CHF",
|
currency_symbol: "CHF",
|
||||||
int_curr_symbol: "CHF",
|
int_curr_symbol: "CHF",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "AM", 1: "PM" },
|
ampm: { 0: "AM", 1: "PM" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%A %d %B %Y", "1": "%d/%m/%y" }, // dimanche 1 mars 2020 // 01/03/20
|
datePattern: { 0: "%A %d %B %Y", "1": "%d/%m/%y" }, // dimanche 1 mars 2020 // 01/03/20
|
||||||
abmonth: "anv.,févr.,mars,avril,mai,juin,juil.,août,sept.,oct.,nov.,déc.",
|
abmonth: "anv.,févr.,mars,avril,mai,juin,juil.,août,sept.,oct.,nov.,déc.",
|
||||||
month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre",
|
month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre",
|
||||||
abday: "dim,lun,mar,mer,jeu,ven,sam",
|
abday: "dim,lun,mar,mer,jeu,ven,sam",
|
||||||
day: "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi",
|
day: "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi",
|
||||||
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "oui", Yes: "Oui", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"it_CH": {
|
"it_CH": {
|
||||||
lang: "it_CH",
|
lang: "it_CH",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "CHF",
|
currency_symbol: "CHF",
|
||||||
int_curr_symbol: "CHF",
|
int_curr_symbol: "CHF",
|
||||||
speed: 'kmh',
|
speed: 'kmh',
|
||||||
distance: { "0": "m", "1": "km" },
|
distance: { "0": "m", "1": "km" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00
|
timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00
|
||||||
datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020
|
datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020
|
||||||
abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic",
|
abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic",
|
||||||
month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre",
|
month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre",
|
||||||
abday: "dom,lun,mar,mer,gio,ven,sab",
|
abday: "dom,lun,mar,mer,gio,ven,sab",
|
||||||
day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato",
|
day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato",
|
||||||
trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"it_IT": {
|
"it_IT": {
|
||||||
lang: "it_IT",
|
lang: "it_IT",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "\x80",
|
currency_symbol: "\x80",
|
||||||
int_curr_symbol: "EUR",
|
int_curr_symbol: "EUR",
|
||||||
speed: 'kmh',
|
speed: 'kmh',
|
||||||
distance: { "0": "m", "1": "km" },
|
distance: { "0": "m", "1": "km" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00
|
timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00
|
||||||
datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020
|
datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020
|
||||||
abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic",
|
abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic",
|
||||||
month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre",
|
month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre",
|
||||||
abday: "dom,lun,mar,mer,gio,ven,sab",
|
abday: "dom,lun,mar,mer,gio,ven,sab",
|
||||||
day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato",
|
day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato",
|
||||||
trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"wae_CH": {
|
"wae_CH": {
|
||||||
lang: "wae_CH",
|
lang: "wae_CH",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "CHF",
|
currency_symbol: "CHF",
|
||||||
int_curr_symbol: "CHF",
|
int_curr_symbol: "CHF",
|
||||||
speed: 'kmh',
|
speed: 'kmh',
|
||||||
distance: { "0": "m", "1": "km" },
|
distance: { "0": "m", "1": "km" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "", 1: "" },
|
ampm: { 0: "", 1: "" },
|
||||||
timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00
|
timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00
|
||||||
datePattern: { 0: "%A, %d. %B %Y", "1": "%Y-%m-%d" }, // Sunntag, 1. Märze 2020 // 2020-03-01
|
datePattern: { 0: "%A, %d. %B %Y", "1": "%Y-%m-%d" }, // Sunntag, 1. Märze 2020 // 2020-03-01
|
||||||
abmonth: "Jen,Hor,Mär,Abr,Mei,Brá,Hei,Öig,Her,Wím,Win,Chr",
|
abmonth: "Jen,Hor,Mär,Abr,Mei,Brá,Hei,Öig,Her,Wím,Win,Chr",
|
||||||
month: "Jenner,Hornig,Märze,Abrille,Meije,Bráčet,Heiwet,Öigšte,Herbštmánet,Wímánet,Wintermánet,Chrištmánet",
|
month: "Jenner,Hornig,Märze,Abrille,Meije,Bráčet,Heiwet,Öigšte,Herbštmánet,Wímánet,Wintermánet,Chrištmánet",
|
||||||
abday: "Sun,Män,Ziš,Mit,Fró,Fri,Sam",
|
abday: "Sun,Män,Ziš,Mit,Fró,Fri,Sam",
|
||||||
day: "Sunntag,Mäntag,Zištag,Mittwuč,Fróntag,Fritag,Samštag",
|
day: "Sunntag,Mäntag,Zištag,Mittwuč,Fróntag,Fritag,Samštag",
|
||||||
trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" }
|
||||||
},
|
},
|
||||||
"tr_TR": { // this is default
|
"tr_TR": { // this is default
|
||||||
lang: "tr_TR",
|
lang: "tr_TR",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "TL",
|
currency_symbol: "TL",
|
||||||
int_curr_symbol: "TRY",
|
int_curr_symbol: "TRY",
|
||||||
speed: 'kmh',
|
speed: 'kmh',
|
||||||
distance: { "0": "m", "1": "km" },
|
distance: { "0": "m", "1": "km" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "öö", 1: "ös" },
|
ampm: { 0: "öö", 1: "ös" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%d %w %Y %A", 1: "%d/%m/%Y" }, // 1 Mart 2020 Pazar // "01/03/2020"
|
datePattern: { 0: "%d %w %Y %A", 1: "%d/%m/%Y" }, // 1 Mart 2020 Pazar // "01/03/2020"
|
||||||
abmonth: "Oca,Sub,Mar,Nis,May,Haz,Tem,Agu,Eyl,Eki,Kas,Ara",
|
abmonth: "Oca,Sub,Mar,Nis,May,Haz,Tem,Agu,Eyl,Eki,Kas,Ara",
|
||||||
month: "Ocak,Subat,Mart,Nisan,Mayis,Haziran,Temmuz,Agustos,Eylul,Ekim,Kasim,Aralik",
|
month: "Ocak,Subat,Mart,Nisan,Mayis,Haziran,Temmuz,Agustos,Eylul,Ekim,Kasim,Aralik",
|
||||||
abday: "Paz,Pzt,Sal,Car,Per,Cum,Cmt",
|
abday: "Paz,Pzt,Sal,Car,Per,Cum,Cmt",
|
||||||
day: "Pazar,Pazartesi,Sali,Carsamba,Persembe,Cuma,Cumartesi",
|
day: "Pazar,Pazartesi,Sali,Carsamba,Persembe,Cuma,Cumartesi",
|
||||||
trans: { yes: "evet", Yes: "Evet", no: "hayir", No: "Hayir", ok: "tamam", on: "acik", off: "kapali" }
|
trans: { yes: "evet", Yes: "Evet", no: "hayir", No: "Hayir", ok: "tamam", on: "acik", off: "kapali" }
|
||||||
},
|
},
|
||||||
"hu_HU": {
|
"hu_HU": {
|
||||||
lang: "hu_HU",
|
lang: "hu_HU",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: " ",
|
thousands_sep: " ",
|
||||||
currency_symbol: "Ft",
|
currency_symbol: "Ft",
|
||||||
int_curr_symbol: "HUF",
|
int_curr_symbol: "HUF",
|
||||||
speed: 'kph',
|
speed: 'kph',
|
||||||
distance: { "0": "m", "1": "km" },
|
distance: { "0": "m", "1": "km" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "de", 1: "du" },
|
ampm: { 0: "de", 1: "du" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%Y %b %d, %A", 1: "%Y.%m.%d" }, // 2020 Feb 28, Péntek" // "2020.03.01."(short)
|
datePattern: { 0: "%Y %b %d, %A", 1: "%Y.%m.%d" }, // 2020 Feb 28, Péntek" // "2020.03.01."(short)
|
||||||
abmonth: "Jan,Feb,Már,Ápr,Máj,Jún,Júl,Aug,Szep,Okt,Nov,Dec",
|
abmonth: "Jan,Feb,Már,Ápr,Máj,Jún,Júl,Aug,Szep,Okt,Nov,Dec",
|
||||||
month: "Január,Február,Március,Április,Május,Június,Július,Augusztus,Szeptember,Október,November,December",
|
month: "Január,Február,Március,Április,Május,Június,Július,Augusztus,Szeptember,Október,November,December",
|
||||||
abday: "Vas,Hét,Ke,Szer,Csüt,Pén,Szom",
|
abday: "Vas,Hét,Ke,Szer,Csüt,Pén,Szom",
|
||||||
day: "Vasárnap,Hétfő,Kedd,Szerda,Csütörtök,Péntek,Szombat",
|
day: "Vasárnap,Hétfő,Kedd,Szerda,Csütörtök,Péntek,Szombat",
|
||||||
trans: { yes: "igen", Yes: "Igen", no: "nem", No: "Nem", ok: "ok", on: "be", off: "ki" }
|
trans: { yes: "igen", Yes: "Igen", no: "nem", No: "Nem", ok: "ok", on: "be", off: "ki" }
|
||||||
},
|
},
|
||||||
"pt_BR": {
|
"pt_BR": {
|
||||||
lang: "pt_BR",
|
lang: "pt_BR",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: ".",
|
thousands_sep: ".",
|
||||||
currency_symbol: "R$", currency_first: true,
|
currency_symbol: "R$", currency_first: true,
|
||||||
int_curr_symbol: "BRL",
|
int_curr_symbol: "BRL",
|
||||||
speed: "kmh",
|
speed: "kmh",
|
||||||
distance: { 0: "m", 1: "km" },
|
distance: { 0: "m", 1: "km" },
|
||||||
temperature: "°C",
|
temperature: "°C",
|
||||||
ampm: { 0: "am", 1: "pm" },
|
ampm: { 0: "am", 1: "pm" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%d %b %Y", 1: "%d/%m/%y" },
|
datePattern: { 0: "%d %b %Y", 1: "%d/%m/%y" },
|
||||||
abmonth: "Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez",
|
abmonth: "Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez",
|
||||||
month: "Janeiro,Fevereiro,Março,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro",
|
month: "Janeiro,Fevereiro,Março,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro",
|
||||||
abday: "Dom,Seg,Ter,Qua,Qui,Sex,Sab",
|
abday: "Dom,Seg,Ter,Qua,Qui,Sex,Sab",
|
||||||
day: "Domingo,Segunda-feira,Terça-feira,Quarta-feira,Quinta-feira,Sexta-feira,Sábado",
|
day: "Domingo,Segunda-feira,Terça-feira,Quarta-feira,Quinta-feira,Sexta-feira,Sábado",
|
||||||
trans: { yes: "sim", Yes: "Sim", no: "não", No: "Não", ok: "certo", on: "ligado", off: "desligado" }
|
trans: { yes: "sim", Yes: "Sim", no: "não", No: "Não", ok: "certo", on: "ligado", off: "desligado" }
|
||||||
},
|
},
|
||||||
"cs_CZ": {
|
"cs_CZ": {
|
||||||
lang: "cs_CZ",
|
lang: "cs_CZ",
|
||||||
decimal_point: ",",
|
decimal_point: ",",
|
||||||
thousands_sep: " ",
|
thousands_sep: " ",
|
||||||
currency_symbol: "Kč",
|
currency_symbol: "Kč",
|
||||||
int_curr_symbol: " CZK",
|
int_curr_symbol: " CZK",
|
||||||
speed: 'kmh',
|
speed: 'kmh',
|
||||||
distance: { "0": "m", "1": "km" },
|
distance: { "0": "m", "1": "km" },
|
||||||
temperature: '°C',
|
temperature: '°C',
|
||||||
ampm: { 0: "dop", 1: "odp" },
|
ampm: { 0: "dop", 1: "odp" },
|
||||||
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" },
|
||||||
datePattern: { 0: "%d. %b %Y", 1: "%d.%m.%Y" }, // "30. led 2020" // "30.01.2020"(short)
|
datePattern: { 0: "%d. %b %Y", 1: "%d.%m.%Y" }, // "30. led 2020" // "30.01.2020"(short)
|
||||||
abmonth: "led,úno,bře,dub,kvě,čvn,čvc,srp,zář,říj,lis,pro",
|
abmonth: "led,úno,bře,dub,kvě,čvn,čvc,srp,zář,říj,lis,pro",
|
||||||
month: "leden,únor,březen,duben,květen,červen,červenec,srpen,září,říjen,listopad,prosinec",
|
month: "leden,únor,březen,duben,květen,červen,červenec,srpen,září,říjen,listopad,prosinec",
|
||||||
abday: "ne,po,út,st,čt,pá,so",
|
abday: "ne,po,út,st,čt,pá,so",
|
||||||
day: "neděle,pondělí,úterý,středa,čtvrtek,pátek,sobota",
|
day: "neděle,pondělí,úterý,středa,čtvrtek,pátek,sobota",
|
||||||
trans: { yes: "tak", Yes: "Tak", no: "nie", No: "Nie", ok: "ok", on: "na", off: "poza" }
|
trans: { yes: "tak", Yes: "Tak", no: "nie", No: "Nie", ok: "ok", on: "na", off: "poza" }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -96,30 +96,30 @@ function phoneOutbound(msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function phoneClearMessage() {
|
function phoneClearMessage() {
|
||||||
if (phone.message === null) return;
|
if (phone.message === null) return;
|
||||||
|
|
||||||
if (phone.messageTimeout) {
|
if (phone.messageTimeout) {
|
||||||
clearTimeout(phone.messageTimeout);
|
clearTimeout(phone.messageTimeout);
|
||||||
phone.messageTimeout = null;
|
phone.messageTimeout = null;
|
||||||
}
|
}
|
||||||
phone.message = null;
|
phone.message = null;
|
||||||
phone.messageScrollX = null;
|
phone.messageScrollX = null;
|
||||||
phone.messageType = null;
|
phone.messageType = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function phoneNewMessage(type, msg) {
|
function phoneNewMessage(type, msg) {
|
||||||
Bangle.buzz();
|
Bangle.buzz();
|
||||||
|
|
||||||
phoneClearMessage();
|
phoneClearMessage();
|
||||||
phone.messageTimeout = setTimeout(() => phone.message = null, ONE_SECOND * 30);
|
phone.messageTimeout = setTimeout(() => phone.message = null, ONE_SECOND * 30);
|
||||||
phone.message = msg;
|
phone.message = msg;
|
||||||
phone.messageType = type;
|
phone.messageType = type;
|
||||||
|
|
||||||
// Notify user and active screen
|
// Notify user and active screen
|
||||||
if (!Bangle.isLCDOn()) {
|
if (!Bangle.isLCDOn()) {
|
||||||
clearTimers();
|
clearTimers();
|
||||||
Bangle.setLCDPower(true);
|
Bangle.setLCDPower(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function truncStr(str, max) {
|
function truncStr(str, max) {
|
||||||
|
@ -258,7 +258,7 @@ function drawTrees() {
|
||||||
// remove first sprite if offscreen
|
// remove first sprite if offscreen
|
||||||
let firstBackgroundSprite = backgroundArr[0];
|
let firstBackgroundSprite = backgroundArr[0];
|
||||||
if (firstBackgroundSprite) {
|
if (firstBackgroundSprite) {
|
||||||
if (firstBackgroundSprite.x < -15) backgroundArr.splice(0, 1);
|
if (firstBackgroundSprite.x < -15) backgroundArr.splice(0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set background sprite if array empty
|
// set background sprite if array empty
|
||||||
|
@ -365,7 +365,7 @@ function drawNotice(x, y) {
|
||||||
function drawCharacter(date, character) {
|
function drawCharacter(date, character) {
|
||||||
// calculate jumping
|
// calculate jumping
|
||||||
const seconds = date.getSeconds(),
|
const seconds = date.getSeconds(),
|
||||||
milliseconds = date.getMilliseconds();
|
milliseconds = date.getMilliseconds();
|
||||||
|
|
||||||
if (seconds == 59 && milliseconds > 800 && !characterSprite.isJumping) {
|
if (seconds == 59 && milliseconds > 800 && !characterSprite.isJumping) {
|
||||||
characterSprite.isJumping = true;
|
characterSprite.isJumping = true;
|
||||||
|
@ -486,22 +486,22 @@ function drawInfo(date) {
|
||||||
}
|
}
|
||||||
xPos = phone.messageScrollX;
|
xPos = phone.messageScrollX;
|
||||||
} else {
|
} else {
|
||||||
xPos = (W - g.stringWidth(str)) / 2;
|
xPos = (W - g.stringWidth(str)) / 2;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch(infoMode) {
|
switch(infoMode) {
|
||||||
case PHON_MODE:
|
case PHON_MODE:
|
||||||
str = buildPhonStr();
|
str = buildPhonStr();
|
||||||
break;
|
break;
|
||||||
case TEMP_MODE:
|
case TEMP_MODE:
|
||||||
str = buildTempStr();
|
str = buildTempStr();
|
||||||
break;
|
break;
|
||||||
case BATT_MODE:
|
case BATT_MODE:
|
||||||
str = buildBatStr();
|
str = buildBatStr();
|
||||||
break;
|
break;
|
||||||
case DATE_MODE:
|
case DATE_MODE:
|
||||||
default:
|
default:
|
||||||
str = buildDateStr(date);
|
str = buildDateStr(date);
|
||||||
}
|
}
|
||||||
xPos = (W - g.stringWidth(str)) / 2;
|
xPos = (W - g.stringWidth(str)) / 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,98 +16,98 @@ var timeInterval;
|
||||||
n is the amount (0..1)
|
n is the amount (0..1)
|
||||||
maxFive is true is this digit only counts 0..5 */
|
maxFive is true is this digit only counts 0..5 */
|
||||||
const DIGITS = {
|
const DIGITS = {
|
||||||
" ":n=>[],
|
" ":n=>[],
|
||||||
"0":n=>[
|
"0":n=>[
|
||||||
[n,0,1,0],
|
[n,0,1,0],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[n,2,1,2],
|
[n,2,1,2],
|
||||||
[n,1,n,2],
|
[n,1,n,2],
|
||||||
[n,0,n,1]],
|
[n,0,n,1]],
|
||||||
"1":n=>[
|
"1":n=>[
|
||||||
[1-n,0,1,0],
|
[1-n,0,1,0],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[1-n,1,1,1],
|
[1-n,1,1,1],
|
||||||
[1-n,1,1-n,2],
|
[1-n,1,1-n,2],
|
||||||
[1-n,2,1,2]],
|
[1-n,2,1,2]],
|
||||||
"2":n=>[
|
"2":n=>[
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[0,1,1,1],
|
[0,1,1,1],
|
||||||
[0,1+n,0,2],
|
[0,1+n,0,2],
|
||||||
[1,2-n,1,2],
|
[1,2-n,1,2],
|
||||||
[0,2,1,2]],
|
[0,2,1,2]],
|
||||||
"3":n=>[
|
"3":n=>[
|
||||||
[0,0,1-n,0],
|
[0,0,1-n,0],
|
||||||
[0,0,0,n],
|
[0,0,0,n],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[0,1,1,1],
|
[0,1,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[n,2,1,2]],
|
[n,2,1,2]],
|
||||||
"4":n=>[
|
"4":n=>[
|
||||||
[0,0,0,1],
|
[0,0,0,1],
|
||||||
[1,0,1-n,0],
|
[1,0,1-n,0],
|
||||||
[1,0,1,1-n],
|
[1,0,1,1-n],
|
||||||
[0,1,1,1],
|
[0,1,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[1-n,2,1,2]],
|
[1-n,2,1,2]],
|
||||||
"5to0": n=>[ // 5 -> 0
|
"5to0": n=>[ // 5 -> 0
|
||||||
[0,0,0,1],
|
[0,0,0,1],
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[n,1,1,1],
|
[n,1,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[0,2,1,2],
|
[0,2,1,2],
|
||||||
[0,2,0,2],
|
[0,2,0,2],
|
||||||
[1,1-n,1,1],
|
[1,1-n,1,1],
|
||||||
[0,1,0,1+n]],
|
[0,1,0,1+n]],
|
||||||
"5to6": n=>[ // 5 -> 6
|
"5to6": n=>[ // 5 -> 6
|
||||||
[0,0,0,1],
|
[0,0,0,1],
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[0,1,1,1],
|
[0,1,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[0,2,1,2],
|
[0,2,1,2],
|
||||||
[0,2-n,0,2]],
|
[0,2-n,0,2]],
|
||||||
"6":n=>[
|
"6":n=>[
|
||||||
[0,0,0,1-n],
|
[0,0,0,1-n],
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[n,1,1,1],
|
[n,1,1,1],
|
||||||
[1,1-n,1,1],
|
[1,1-n,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[n,2,1,2],
|
[n,2,1,2],
|
||||||
[0,1-n,0,2-2*n]],
|
[0,1-n,0,2-2*n]],
|
||||||
"7":n=>[
|
"7":n=>[
|
||||||
[0,0,0,n],
|
[0,0,0,n],
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[1-n,1,1,1],
|
[1-n,1,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[1-n,2,1,2],
|
[1-n,2,1,2],
|
||||||
[1-n,1,1-n,2]],
|
[1-n,1,1-n,2]],
|
||||||
"8":n=>[
|
"8":n=>[
|
||||||
[0,0,0,1],
|
[0,0,0,1],
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[0,1,1,1],
|
[0,1,1,1],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[0,2,1,2],
|
[0,2,1,2],
|
||||||
[0,1,0,2-n]],
|
[0,1,0,2-n]],
|
||||||
"9":n=>[
|
"9":n=>[
|
||||||
[0,0,0,1],
|
[0,0,0,1],
|
||||||
[0,0,1,0],
|
[0,0,1,0],
|
||||||
[1,0,1,1],
|
[1,0,1,1],
|
||||||
[0,1,1-n,1],
|
[0,1,1-n,1],
|
||||||
[0,1,0,1+n],
|
[0,1,0,1+n],
|
||||||
[1,1,1,2],
|
[1,1,1,2],
|
||||||
[0,2,1,2]],
|
[0,2,1,2]],
|
||||||
":":n=>[
|
":":n=>[
|
||||||
[0.4,0.4,0.6,0.4],
|
[0.4,0.4,0.6,0.4],
|
||||||
[0.6,0.4,0.6,0.6],
|
[0.6,0.4,0.6,0.6],
|
||||||
[0.6,0.6,0.4,0.6],
|
[0.6,0.6,0.4,0.6],
|
||||||
[0.4,0.4,0.4,0.6],
|
[0.4,0.4,0.4,0.6],
|
||||||
[0.4,1.4,0.6,1.4],
|
[0.4,1.4,0.6,1.4],
|
||||||
[0.6,1.4,0.6,1.6],
|
[0.6,1.4,0.6,1.6],
|
||||||
[0.6,1.6,0.4,1.6],
|
[0.6,1.6,0.4,1.6],
|
||||||
[0.4,1.4,0.4,1.6]]
|
[0.4,1.4,0.4,1.6]]
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Draw a transition between lastText and thisText.
|
/* Draw a transition between lastText and thisText.
|
||||||
|
|
|
@ -29,23 +29,23 @@ function loadSettings() {
|
||||||
|
|
||||||
function changecolor() {
|
function changecolor() {
|
||||||
const colors = {
|
const colors = {
|
||||||
0: { value: 0xF800, name: "Red" },
|
0: { value: 0xF800, name: "Red" },
|
||||||
1: { value: 0xFFFF, name: "White" },
|
1: { value: 0xFFFF, name: "White" },
|
||||||
2: { value: 0x9492, name: "gray" },
|
2: { value: 0x9492, name: "gray" },
|
||||||
3: { value: 0xFFFF, name: "White" },
|
3: { value: 0xFFFF, name: "White" },
|
||||||
4: { value: 0x9492, name: "gray" },
|
4: { value: 0x9492, name: "gray" },
|
||||||
5: { value: 0xFFFF, name: "White" },
|
5: { value: 0xFFFF, name: "White" },
|
||||||
6: { value: 0x9492, name: "gray" },
|
6: { value: 0x9492, name: "gray" },
|
||||||
7: { value: 0xFFFF, name: "White" },
|
7: { value: 0xFFFF, name: "White" },
|
||||||
};
|
};
|
||||||
g.setColor(colors[cindex].value);
|
g.setColor(colors[cindex].value);
|
||||||
if (cindex == setting('beatsperbar')-1) {
|
if (cindex == setting('beatsperbar')-1) {
|
||||||
cindex = 0;
|
cindex = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cindex += 1;
|
cindex += 1;
|
||||||
}
|
}
|
||||||
return cindex;
|
return cindex;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateScreen() {
|
function updateScreen() {
|
||||||
|
@ -63,27 +63,27 @@ function updateScreen() {
|
||||||
|
|
||||||
Bangle.on('touch', function(button) {
|
Bangle.on('touch', function(button) {
|
||||||
// setting bpm by tapping the screen. Uses the mean time difference between several tappings.
|
// setting bpm by tapping the screen. Uses the mean time difference between several tappings.
|
||||||
if (tindex < time_diffs.length) {
|
if (tindex < time_diffs.length) {
|
||||||
if (Date.now()-tStart < 5000) {
|
if (Date.now()-tStart < 5000) {
|
||||||
time_diffs[tindex] = Date.now()-tStart;
|
time_diffs[tindex] = Date.now()-tStart;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tindex=0;
|
|
||||||
time_diffs[tindex] = Date.now()-tStart;
|
|
||||||
}
|
|
||||||
tindex += 1;
|
|
||||||
mean_time = 0.0;
|
|
||||||
for(count = 0; count < time_diffs.length; count++) {
|
|
||||||
mean_time += time_diffs[count];
|
|
||||||
}
|
}
|
||||||
time_diff = mean_time/count;
|
} else {
|
||||||
|
tindex=0;
|
||||||
|
time_diffs[tindex] = Date.now()-tStart;
|
||||||
|
}
|
||||||
|
tindex += 1;
|
||||||
|
mean_time = 0.0;
|
||||||
|
for(count = 0; count < time_diffs.length; count++) {
|
||||||
|
mean_time += time_diffs[count];
|
||||||
|
}
|
||||||
|
time_diff = mean_time/count;
|
||||||
|
|
||||||
tStart = Date.now();
|
tStart = Date.now();
|
||||||
clearInterval(time_diff);
|
clearInterval(time_diff);
|
||||||
bpm = (60 * 1000/(time_diff));
|
bpm = (60 * 1000/(time_diff));
|
||||||
updateScreen();
|
updateScreen();
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
interval = setInterval(updateScreen, 60000 / bpm);
|
interval = setInterval(updateScreen, 60000 / bpm);
|
||||||
return bpm;
|
return bpm;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -96,9 +96,9 @@ setWatch(() => {
|
||||||
|
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
if (bpm > 1) {
|
if (bpm > 1) {
|
||||||
bpm -= 1;
|
bpm -= 1;
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
interval = setInterval(updateScreen, 60000 / bpm);
|
interval = setInterval(updateScreen, 60000 / bpm);
|
||||||
}
|
}
|
||||||
}, BTN3, {repeat:true});
|
}, BTN3, {repeat:true});
|
||||||
|
|
||||||
|
|
|
@ -4,73 +4,73 @@ const Radius = { "center": 8, "hour": 78, "min": 95, "dots": 102 };
|
||||||
const Center = { "x": 120, "y": 132 };
|
const Center = { "x": 120, "y": 132 };
|
||||||
|
|
||||||
function rotatePoint(x, y, d) {
|
function rotatePoint(x, y, d) {
|
||||||
rad = -1 * d / 180 * Math.PI;
|
rad = -1 * d / 180 * Math.PI;
|
||||||
var sin = Math.sin(rad);
|
var sin = Math.sin(rad);
|
||||||
var cos = Math.cos(rad);
|
var cos = Math.cos(rad);
|
||||||
xn = ((Center.x + x * cos - y * sin) + 0.5) | 0;
|
xn = ((Center.x + x * cos - y * sin) + 0.5) | 0;
|
||||||
yn = ((Center.y + x * sin - y * cos) + 0.5) | 0;
|
yn = ((Center.y + x * sin - y * cos) + 0.5) | 0;
|
||||||
p = [xn, yn];
|
p = [xn, yn];
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawMixedClock() {
|
function drawMixedClock() {
|
||||||
|
|
||||||
var date = new Date();
|
var date = new Date();
|
||||||
var dateArray = date.toString().split(" ");
|
var dateArray = date.toString().split(" ");
|
||||||
var isEn = locale.name.startsWith("en");
|
var isEn = locale.name.startsWith("en");
|
||||||
var point = [];
|
var point = [];
|
||||||
var minute = date.getMinutes();
|
var minute = date.getMinutes();
|
||||||
var hour = date.getHours();
|
var hour = date.getHours();
|
||||||
var radius;
|
var radius;
|
||||||
|
|
||||||
// draw date
|
// draw date
|
||||||
g.setColor(0x7be0);
|
g.setColor(0x7be0);
|
||||||
g.setFont("6x8", 2);
|
g.setFont("6x8", 2);
|
||||||
g.setFontAlign(-1, 0);
|
g.setFontAlign(-1, 0);
|
||||||
g.drawString(locale.dow(date,true) + ' ', 4, 35, true);
|
g.drawString(locale.dow(date,true) + ' ', 4, 35, true);
|
||||||
g.drawString(isEn?(' ' + dateArray[2]):locale.month(date,true), 4, 225, true);
|
g.drawString(isEn?(' ' + dateArray[2]):locale.month(date,true), 4, 225, true);
|
||||||
g.setFontAlign(1, 0);
|
g.setFontAlign(1, 0);
|
||||||
g.drawString(isEn?locale.month(date,true):(' ' + dateArray[2]), 237, 35, true);
|
g.drawString(isEn?locale.month(date,true):(' ' + dateArray[2]), 237, 35, true);
|
||||||
g.drawString(dateArray[3], 237, 225, true);
|
g.drawString(dateArray[3], 237, 225, true);
|
||||||
|
|
||||||
// draw hour and minute dots
|
// draw hour and minute dots
|
||||||
g.setColor(0xFD20); // orange
|
g.setColor(0xFD20); // orange
|
||||||
for (i = 0; i < 60; i++) {
|
for (i = 0; i < 60; i++) {
|
||||||
radius = (i % 5) ? 2 : 4;
|
radius = (i % 5) ? 2 : 4;
|
||||||
point = rotatePoint(0, Radius.dots, i * 6);
|
point = rotatePoint(0, Radius.dots, i * 6);
|
||||||
g.fillCircle(point[0], point[1], radius);
|
g.fillCircle(point[0], point[1], radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
// erase last minutes hand
|
// erase last minutes hand
|
||||||
g.setColor(0);
|
g.setColor(0);
|
||||||
point = rotatePoint(0, Radius.min, (minute - 1) * 6);
|
point = rotatePoint(0, Radius.min, (minute - 1) * 6);
|
||||||
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
||||||
|
|
||||||
// erase last two hour hands
|
// erase last two hour hands
|
||||||
g.setColor(0);
|
g.setColor(0);
|
||||||
p = rotatePoint(0, Radius.hour, hour % 12 * 30 + (minute - 2) / 2 | 0);
|
p = rotatePoint(0, Radius.hour, hour % 12 * 30 + (minute - 2) / 2 | 0);
|
||||||
g.drawLine(Center.x, Center.y, p[0], p[1]);
|
g.drawLine(Center.x, Center.y, p[0], p[1]);
|
||||||
point = rotatePoint(0, Radius.hour, hour % 12 * 30 + (minute - 1) / 2 | 0);
|
point = rotatePoint(0, Radius.hour, hour % 12 * 30 + (minute - 1) / 2 | 0);
|
||||||
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
||||||
|
|
||||||
// draw digital time
|
// draw digital time
|
||||||
g.setFont("6x8", 3);
|
g.setFont("6x8", 3);
|
||||||
g.setColor(0x7be0);
|
g.setColor(0x7be0);
|
||||||
g.setFontAlign(0, 0);
|
g.setFontAlign(0, 0);
|
||||||
g.drawString(dateArray[4].substr(0, 5), 120, 180, true);
|
g.drawString(dateArray[4].substr(0, 5), 120, 180, true);
|
||||||
|
|
||||||
// draw new minute hand
|
// draw new minute hand
|
||||||
point = rotatePoint(0, Radius.min, minute * 6);
|
point = rotatePoint(0, Radius.min, minute * 6);
|
||||||
g.setColor(0xFFFF);
|
g.setColor(0xFFFF);
|
||||||
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
||||||
// draw new hour hand
|
// draw new hour hand
|
||||||
point = rotatePoint(0, Radius.hour, hour % 12 * 30 + date.getMinutes() / 2 | 0);
|
point = rotatePoint(0, Radius.hour, hour % 12 * 30 + date.getMinutes() / 2 | 0);
|
||||||
g.setColor(0xFFFF);
|
g.setColor(0xFFFF);
|
||||||
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
g.drawLine(Center.x, Center.y, point[0], point[1]);
|
||||||
|
|
||||||
// draw center
|
// draw center
|
||||||
g.setColor(0xFD20);
|
g.setColor(0xFD20);
|
||||||
g.fillCircle(Center.x, Center.y, Radius.center);
|
g.fillCircle(Center.x, Center.y, Radius.center);
|
||||||
}
|
}
|
||||||
Bangle.on('lcdPower', function(on) {
|
Bangle.on('lcdPower', function(on) {
|
||||||
if (on)
|
if (on)
|
||||||
|
|
|
@ -32,8 +32,8 @@ function parseDevice(device) {
|
||||||
case 0x1009: event.fertility = d.getUint16(offset+3,true)/10; break;
|
case 0x1009: event.fertility = d.getUint16(offset+3,true)/10; break;
|
||||||
// case 0x1007: break; // 3 bytes? got 84,0,0 or 68,0,0
|
// case 0x1007: break; // 3 bytes? got 84,0,0 or 68,0,0
|
||||||
default: event.code = code;
|
default: event.code = code;
|
||||||
event.raw = new Uint8Array(d.buffer, offset+3, l);
|
event.raw = new Uint8Array(d.buffer, offset+3, l);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//print(event);
|
//print(event);
|
||||||
show(event);
|
show(event);
|
||||||
|
|
|
@ -7,12 +7,12 @@ but because we're going lower level we need to account for the
|
||||||
different pin. */
|
different pin. */
|
||||||
if (s.beep=="vib") {
|
if (s.beep=="vib") {
|
||||||
function freq(f) {
|
function freq(f) {
|
||||||
if (f===0) digitalWrite(D13, 0);
|
if (f===0) digitalWrite(D13, 0);
|
||||||
else analogWrite(D13, 0.1, {freq: f});
|
else analogWrite(D13, 0.1, {freq: f});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
function freq(f) {
|
function freq(f) {
|
||||||
if (f===0) digitalWrite(D18, 0);
|
if (f===0) digitalWrite(D18, 0);
|
||||||
else analogWrite(D18, 0.5, {freq: f});
|
else analogWrite(D18, 0.5, {freq: f});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,22 +8,22 @@ var timer;
|
||||||
var fix;
|
var fix;
|
||||||
|
|
||||||
var PI = Math.PI,
|
var PI = Math.PI,
|
||||||
sin = Math.sin,
|
sin = Math.sin,
|
||||||
cos = Math.cos,
|
cos = Math.cos,
|
||||||
tan = Math.tan,
|
tan = Math.tan,
|
||||||
asin = Math.asin,
|
asin = Math.asin,
|
||||||
atan = Math.atan2,
|
atan = Math.atan2,
|
||||||
acos = Math.acos,
|
acos = Math.acos,
|
||||||
rad = PI / 180,
|
rad = PI / 180,
|
||||||
dayMs = 1000 * 60 * 60 * 24,
|
dayMs = 1000 * 60 * 60 * 24,
|
||||||
J1970 = 2440588,
|
J1970 = 2440588,
|
||||||
J2000 = 2451545;
|
J2000 = 2451545;
|
||||||
|
|
||||||
var SunCalc = {};
|
var SunCalc = {};
|
||||||
|
|
||||||
//pictures
|
//pictures
|
||||||
function getImg(i) {
|
function getImg(i) {
|
||||||
var data = {
|
var data = {
|
||||||
"NewMoon": "AD8AAH/4AHwPgDwA8BwADg4AAcMAADHAAA5gAAGYAABsAAAPAAADwAAA8AAAPAAADwAAA2AAAZgAAGcAADjAAAw4AAcHAAOA8APAHwPgAf/gAA/AAA==",
|
"NewMoon": "AD8AAH/4AHwPgDwA8BwADg4AAcMAADHAAA5gAAGYAABsAAAPAAADwAAA8AAAPAAADwAAA2AAAZgAAGcAADjAAAw4AAcHAAOA8APAHwPgAf/gAA/AAA==",
|
||||||
"WaxingCrescentNorth" : "AD8AAH/4AHw/gDwH8BwA/g4AH8MAB/HAAf5gAD+YAA/sAAP/AAD/wAA/8AAP/AAD/wAA/2AAP5gAD+cAB/jAAfw4AH8HAD+A8B/AHw/gAf/gAA/AAA==",
|
"WaxingCrescentNorth" : "AD8AAH/4AHw/gDwH8BwA/g4AH8MAB/HAAf5gAD+YAA/sAAP/AAD/wAA/8AAP/AAD/wAA/2AAP5gAD+cAB/jAAfw4AH8HAD+A8B/AHw/gAf/gAA/AAA==",
|
||||||
"WaningCrescentSouth" : "AD8AAH/4AHw/gDwH8BwA/g4AH8MAB/HAAf5gAD+YAA/sAAP/AAD/wAA/8AAP/AAD/wAA/2AAP5gAD+cAB/jAAfw4AH8HAD+A8B/AHw/gAf/gAA/AAA==",
|
"WaningCrescentSouth" : "AD8AAH/4AHw/gDwH8BwA/g4AH8MAB/HAAf5gAD+YAA/sAAP/AAD/wAA/8AAP/AAD/wAA/2AAP5gAD+cAB/jAAfw4AH8HAD+A8B/AHw/gAf/gAA/AAA==",
|
||||||
|
@ -38,12 +38,12 @@ function getImg(i) {
|
||||||
"LastQuarterSouth" : "AD8AAH/4AHx/gDwf8BwH/g4B/8MAf/HAH/5gB/+YAf/sAH//AB//wAf/8AH//AB//wAf/2AH/5gB/+cAf/jAH/w4B/8HAf+A8H/AHx/gAf/gAA/AAA==",
|
"LastQuarterSouth" : "AD8AAH/4AHx/gDwf8BwH/g4B/8MAf/HAH/5gB/+YAf/sAH//AB//wAf/8AH//AB//wAf/2AH/5gB/+cAf/jAH/w4B/8HAf+A8H/AHx/gAf/gAA/AAA==",
|
||||||
"WaningCrescentNorth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA==",
|
"WaningCrescentNorth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA==",
|
||||||
"WaxingCrescentSouth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA=="
|
"WaxingCrescentSouth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA=="
|
||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
width : 26, height : 26, bpp : 1,
|
width : 26, height : 26, bpp : 1,
|
||||||
transparent : 0,
|
transparent : 0,
|
||||||
buffer : E.toArrayBuffer(atob(data[i]))
|
buffer : E.toArrayBuffer(atob(data[i]))
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
|
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
|
||||||
// date/time constants and conversions
|
// date/time constants and conversions
|
||||||
|
@ -59,182 +59,182 @@ function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec
|
||||||
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
|
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
|
||||||
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
|
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
|
||||||
function astroRefraction(h) {
|
function astroRefraction(h) {
|
||||||
if (h < 0) // the following formula works for positive altitudes only.
|
if (h < 0) // the following formula works for positive altitudes only.
|
||||||
h = 0; // if h = -0.08901179 a div/0 would occur.
|
h = 0; // if h = -0.08901179 a div/0 would occur.
|
||||||
|
|
||||||
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||||
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
|
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
|
||||||
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
|
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
|
||||||
}
|
}
|
||||||
|
|
||||||
// general sun calculations
|
// general sun calculations
|
||||||
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
|
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
|
||||||
function eclipticLongitude(M) {
|
function eclipticLongitude(M) {
|
||||||
|
|
||||||
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
|
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
|
||||||
P = rad * 102.9372; // perihelion of the Earth
|
P = rad * 102.9372; // perihelion of the Earth
|
||||||
|
|
||||||
return M + C + P + PI;
|
return M + C + P + PI;
|
||||||
}
|
}
|
||||||
|
|
||||||
function sunCoords(d) {
|
function sunCoords(d) {
|
||||||
var M = solarMeanAnomaly(d),
|
var M = solarMeanAnomaly(d),
|
||||||
L = eclipticLongitude(M);
|
L = eclipticLongitude(M);
|
||||||
return {
|
return {
|
||||||
dec: declination(L, 0),
|
dec: declination(L, 0),
|
||||||
ra: rightAscension(L, 0)
|
ra: rightAscension(L, 0)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// adds a custom time to the times config
|
// adds a custom time to the times config
|
||||||
SunCalc.addTime = function (angle, riseName, setName) {
|
SunCalc.addTime = function (angle, riseName, setName) {
|
||||||
times.push([angle, riseName, setName]);
|
times.push([angle, riseName, setName]);
|
||||||
};
|
};
|
||||||
|
|
||||||
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
|
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
|
||||||
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
|
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
|
||||||
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
|
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
|
||||||
M = rad * (134.963 + 13.064993 * d), // mean anomaly
|
M = rad * (134.963 + 13.064993 * d), // mean anomaly
|
||||||
F = rad * (93.272 + 13.229350 * d), // mean distance
|
F = rad * (93.272 + 13.229350 * d), // mean distance
|
||||||
l = L + rad * 6.289 * sin(M), // longitude
|
l = L + rad * 6.289 * sin(M), // longitude
|
||||||
b = rad * 5.128 * sin(F), // latitude
|
b = rad * 5.128 * sin(F), // latitude
|
||||||
dt = 385001 - 20905 * cos(M); // distance to the moon in km
|
dt = 385001 - 20905 * cos(M); // distance to the moon in km
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ra: rightAscension(l, b),
|
ra: rightAscension(l, b),
|
||||||
dec: declination(l, b),
|
dec: declination(l, b),
|
||||||
dist: dt
|
dist: dt
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
SunCalc.getMoonPosition = function (date, lat, lng) {
|
SunCalc.getMoonPosition = function (date, lat, lng) {
|
||||||
|
|
||||||
var lw = rad * -lng,
|
var lw = rad * -lng,
|
||||||
phi = rad * lat,
|
phi = rad * lat,
|
||||||
d = toDays(date),
|
d = toDays(date),
|
||||||
c = moonCoords(d),
|
c = moonCoords(d),
|
||||||
H = siderealTime(d, lw) - c.ra,
|
H = siderealTime(d, lw) - c.ra,
|
||||||
h = altitude(H, phi, c.dec),
|
h = altitude(H, phi, c.dec),
|
||||||
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||||
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
|
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
|
||||||
h = h + astroRefraction(h); // altitude correction for refraction
|
h = h + astroRefraction(h); // altitude correction for refraction
|
||||||
return {
|
return {
|
||||||
azimuth: azimuth(H, phi, c.dec),
|
azimuth: azimuth(H, phi, c.dec),
|
||||||
altitude: h,
|
altitude: h,
|
||||||
distance: c.dist,
|
distance: c.dist,
|
||||||
parallacticAngle: pa
|
parallacticAngle: pa
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// calculations for illumination parameters of the moon,
|
// calculations for illumination parameters of the moon,
|
||||||
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
|
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
|
||||||
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||||
SunCalc.getMoonIllumination = function (date) {
|
SunCalc.getMoonIllumination = function (date) {
|
||||||
var year = date.getFullYear();
|
var year = date.getFullYear();
|
||||||
var month = date.getMonth();
|
var month = date.getMonth();
|
||||||
var day = date.getDate();
|
var day = date.getDate();
|
||||||
var Moon = {
|
var Moon = {
|
||||||
phases: ['new', 'waxing-crescent', 'first-quarter', 'waxing-gibbous', 'full', 'waning-gibbous', 'last-quarter', 'waning-crescent'],
|
phases: ['new', 'waxing-crescent', 'first-quarter', 'waxing-gibbous', 'full', 'waning-gibbous', 'last-quarter', 'waning-crescent'],
|
||||||
phase: function (year, month, day) {
|
phase: function (year, month, day) {
|
||||||
let c = 0;
|
let c = 0;
|
||||||
let e = 0;
|
let e = 0;
|
||||||
let jd = 0;
|
let jd = 0;
|
||||||
let b = 0;
|
let b = 0;
|
||||||
if (month < 3) {
|
if (month < 3) {
|
||||||
year--;
|
year--;
|
||||||
month += 12;
|
month += 12;
|
||||||
}
|
}
|
||||||
++month;
|
++month;
|
||||||
c = 365.25 * year;
|
c = 365.25 * year;
|
||||||
e = 30.6 * month;
|
e = 30.6 * month;
|
||||||
jd = c + e + day - 694039.09; // jd is total days elapsed
|
jd = c + e + day - 694039.09; // jd is total days elapsed
|
||||||
jd /= 29.5305882; // divide by the moon cycle
|
jd /= 29.5305882; // divide by the moon cycle
|
||||||
b = parseInt(jd); // int(jd) -> b, take integer part of jd
|
b = parseInt(jd); // int(jd) -> b, take integer part of jd
|
||||||
jd -= b; // subtract integer part to leave fractional part of original jd
|
jd -= b; // subtract integer part to leave fractional part of original jd
|
||||||
b = Math.round(jd * 8); // scale fraction from 0-8 and round
|
b = Math.round(jd * 8); // scale fraction from 0-8 and round
|
||||||
if (b >= 8) b = 0; // 0 and 8 are the same so turn 8 into 0
|
if (b >= 8) b = 0; // 0 and 8 are the same so turn 8 into 0
|
||||||
return {phase: b, name: Moon.phases[b]};
|
return {phase: b, name: Moon.phases[b]};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (Moon.phase(year, month, day));
|
return (Moon.phase(year, month, day));
|
||||||
};
|
};
|
||||||
|
|
||||||
function hoursLater(date, h) {
|
function hoursLater(date, h) {
|
||||||
return new Date(date.valueOf() + h * dayMs / 24);
|
return new Date(date.valueOf() + h * dayMs / 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
|
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
|
||||||
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
||||||
var t = new Date(date);
|
var t = new Date(date);
|
||||||
if (inUTC) t.setUTCHours(0, 0, 0, 0);
|
if (inUTC) t.setUTCHours(0, 0, 0, 0);
|
||||||
else t.setHours(0, 0, 0, 0);
|
else t.setHours(0, 0, 0, 0);
|
||||||
var hc = 0.133 * rad,
|
var hc = 0.133 * rad,
|
||||||
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
|
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
|
||||||
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
|
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
|
||||||
|
|
||||||
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
|
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
|
||||||
for (var i = 1; i <= 24; i += 2) {
|
for (var i = 1; i <= 24; i += 2) {
|
||||||
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
|
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
|
||||||
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
|
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
|
||||||
a = (h0 + h2) / 2 - h1;
|
a = (h0 + h2) / 2 - h1;
|
||||||
b = (h2 - h0) / 2;
|
b = (h2 - h0) / 2;
|
||||||
xe = -b / (2 * a);
|
xe = -b / (2 * a);
|
||||||
ye = (a * xe + b) * xe + h1;
|
ye = (a * xe + b) * xe + h1;
|
||||||
d = b * b - 4 * a * h1;
|
d = b * b - 4 * a * h1;
|
||||||
roots = 0;
|
roots = 0;
|
||||||
if (d >= 0) {
|
if (d >= 0) {
|
||||||
dx = Math.sqrt(d) / (Math.abs(a) * 2);
|
dx = Math.sqrt(d) / (Math.abs(a) * 2);
|
||||||
x1 = xe - dx;
|
x1 = xe - dx;
|
||||||
x2 = xe + dx;
|
x2 = xe + dx;
|
||||||
if (Math.abs(x1) <= 1) roots++;
|
if (Math.abs(x1) <= 1) roots++;
|
||||||
if (Math.abs(x2) <= 1) roots++;
|
if (Math.abs(x2) <= 1) roots++;
|
||||||
if (x1 < -1) x1 = x2;
|
if (x1 < -1) x1 = x2;
|
||||||
}
|
|
||||||
if (roots === 1) {
|
|
||||||
if (h0 < 0) rise = i + x1;
|
|
||||||
else set = i + x1;
|
|
||||||
} else if (roots === 2) {
|
|
||||||
rise = i + (ye < 0 ? x2 : x1);
|
|
||||||
set = i + (ye < 0 ? x1 : x2);
|
|
||||||
}
|
|
||||||
if (rise && set) break;
|
|
||||||
h0 = h2;
|
|
||||||
}
|
}
|
||||||
var result = {};
|
if (roots === 1) {
|
||||||
if (rise) result.rise = hoursLater(t, rise);
|
if (h0 < 0) rise = i + x1;
|
||||||
if (set) result.set = hoursLater(t, set);
|
else set = i + x1;
|
||||||
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
|
} else if (roots === 2) {
|
||||||
return result;
|
rise = i + (ye < 0 ? x2 : x1);
|
||||||
|
set = i + (ye < 0 ? x1 : x2);
|
||||||
|
}
|
||||||
|
if (rise && set) break;
|
||||||
|
h0 = h2;
|
||||||
|
}
|
||||||
|
var result = {};
|
||||||
|
if (rise) result.rise = hoursLater(t, rise);
|
||||||
|
if (set) result.set = hoursLater(t, set);
|
||||||
|
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
|
||||||
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
function getMPhaseComp (offset) {
|
function getMPhaseComp (offset) {
|
||||||
var date = new Date();
|
var date = new Date();
|
||||||
date.setDate(date.getDate() + offset);
|
date.setDate(date.getDate() + offset);
|
||||||
var dd = String(date.getDate());
|
var dd = String(date.getDate());
|
||||||
if(dd<10){dd='0'+dd;}
|
if(dd<10){dd='0'+dd;}
|
||||||
var mm = String(date.getMonth() + 1);
|
var mm = String(date.getMonth() + 1);
|
||||||
if(mm<10){mm='0'+mm;}
|
if(mm<10){mm='0'+mm;}
|
||||||
var yyyy = date.getFullYear();
|
var yyyy = date.getFullYear();
|
||||||
var phase = SunCalc.getMoonIllumination(date);
|
var phase = SunCalc.getMoonIllumination(date);
|
||||||
return dd + "." + mm + "." + yyyy + ": "+ phase.name;
|
return dd + "." + mm + "." + yyyy + ": "+ phase.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMPhaseSim (offset) {
|
function getMPhaseSim (offset) {
|
||||||
var date = new Date();
|
var date = new Date();
|
||||||
date.setDate(date.getDate() + offset);
|
date.setDate(date.getDate() + offset);
|
||||||
var dd = String(date.getDate());
|
var dd = String(date.getDate());
|
||||||
if(dd<10){dd='0'+dd;}
|
if(dd<10){dd='0'+dd;}
|
||||||
var mm = String(date.getMonth() + 1);
|
var mm = String(date.getMonth() + 1);
|
||||||
if(mm<10){mm='0'+mm;}
|
if(mm<10){mm='0'+mm;}
|
||||||
var yyyy = date.getFullYear();
|
var yyyy = date.getFullYear();
|
||||||
var phase = SunCalc.getMoonIllumination(date);
|
var phase = SunCalc.getMoonIllumination(date);
|
||||||
return phase.name;
|
return phase.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawMoonPhase(offset, x, y){
|
function drawMoonPhase(offset, x, y){
|
||||||
if (coords.lat >= 0 && coords.lat <= 90){ //Northern hemisphere
|
if (coords.lat >= 0 && coords.lat <= 90){ //Northern hemisphere
|
||||||
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
|
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentNorth"), x, y);}
|
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentNorth"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterNorth"), x, y);}
|
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterNorth"), x, y);}
|
||||||
|
@ -243,8 +243,8 @@ function drawMoonPhase(offset, x, y){
|
||||||
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousNorth"), x, y);}
|
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousNorth"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterNorth"), x, y);}
|
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterNorth"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentNorth"), x, y);}
|
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentNorth"), x, y);}
|
||||||
}
|
}
|
||||||
else { //Southern hemisphere
|
else { //Southern hemisphere
|
||||||
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
|
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentSouth"), x, y);}
|
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentSouth"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterSouth"), x, y);}
|
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterSouth"), x, y);}
|
||||||
|
@ -253,101 +253,101 @@ function drawMoonPhase(offset, x, y){
|
||||||
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousSouth"), x, y);}
|
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousSouth"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterSouth"), x, y);}
|
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterSouth"), x, y);}
|
||||||
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentSouth"), x, y);}
|
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentSouth"), x, y);}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawMoon(offset, x, y) {
|
function drawMoon(offset, x, y) {
|
||||||
g.setFont("6x8");
|
g.setFont("6x8");
|
||||||
g.clear();
|
g.clear();
|
||||||
g.drawString("Key1: day+, Key2:today, Key3:day-",x,y-30);
|
g.drawString("Key1: day+, Key2:today, Key3:day-",x,y-30);
|
||||||
g.drawString("Last known coordinates: " + coords.lat.toFixed(4) + " " + coords.lon.toFixed(4), x, y-20);
|
g.drawString("Last known coordinates: " + coords.lat.toFixed(4) + " " + coords.lon.toFixed(4), x, y-20);
|
||||||
g.drawString("Press BTN4 to update",x, y-10);
|
g.drawString("Press BTN4 to update",x, y-10);
|
||||||
|
|
||||||
g.drawString(getMPhaseComp(offset),x,y+30);
|
g.drawString(getMPhaseComp(offset),x,y+30);
|
||||||
drawMoonPhase(offset, x+35, y+40);
|
drawMoonPhase(offset, x+35, y+40);
|
||||||
|
|
||||||
g.drawString(getMPhaseComp(offset+2),x,y+70);
|
g.drawString(getMPhaseComp(offset+2),x,y+70);
|
||||||
drawMoonPhase(offset+2, x+35, y+80);
|
drawMoonPhase(offset+2, x+35, y+80);
|
||||||
|
|
||||||
g.drawString(getMPhaseComp(offset+4),x,y+110);
|
g.drawString(getMPhaseComp(offset+4),x,y+110);
|
||||||
drawMoonPhase(offset+4, x+35, y+120);
|
drawMoonPhase(offset+4, x+35, y+120);
|
||||||
|
|
||||||
g.drawString(getMPhaseComp(offset+6),x,y+150);
|
g.drawString(getMPhaseComp(offset+6),x,y+150);
|
||||||
drawMoonPhase(offset+6, x+35, y+160);
|
drawMoonPhase(offset+6, x+35, y+160);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Write coordinates to file
|
//Write coordinates to file
|
||||||
function updateCoords() {
|
function updateCoords() {
|
||||||
storage.write('coords.json', coords);
|
storage.write('coords.json', coords);
|
||||||
}
|
}
|
||||||
|
|
||||||
//set coordinates to default (city where I live)
|
//set coordinates to default (city where I live)
|
||||||
function resetCoords() {
|
function resetCoords() {
|
||||||
coords = {
|
coords = {
|
||||||
lat : 52.96236,
|
lat : 52.96236,
|
||||||
lon : 7.62571,
|
lon : 7.62571,
|
||||||
};
|
};
|
||||||
updateCoords();
|
updateCoords();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGpsFix() {
|
function getGpsFix() {
|
||||||
Bangle.on('GPS', function(fix) {
|
Bangle.on('GPS', function(fix) {
|
||||||
g.clear();
|
g.clear();
|
||||||
|
|
||||||
if (fix.fix == 1) {
|
if (fix.fix == 1) {
|
||||||
var gpsString = "lat: " + fix.lat.toFixed(4) + " lon: " + fix.lon.toFixed(4);
|
var gpsString = "lat: " + fix.lat.toFixed(4) + " lon: " + fix.lon.toFixed(4);
|
||||||
coords.lat = fix.lat;
|
coords.lat = fix.lat;
|
||||||
coords.lon = fix.lon;
|
coords.lon = fix.lon;
|
||||||
updateCoords();
|
updateCoords();
|
||||||
g.drawString("Got GPS fix and wrote coords to file",10,20);
|
g.drawString("Got GPS fix and wrote coords to file",10,20);
|
||||||
g.drawString(gpsString,10,30);
|
g.drawString(gpsString,10,30);
|
||||||
g.drawString("Press BTN5 to return to app",10,40);
|
g.drawString("Press BTN5 to return to app",10,40);
|
||||||
clearInterval(timer);
|
clearInterval(timer);
|
||||||
timer = undefined;
|
timer = undefined;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
g.drawString("Searching satellites...",10,20);
|
g.drawString("Searching satellites...",10,20);
|
||||||
g.drawString("Press BTN5 to stop GPS",10, 30);
|
g.drawString("Press BTN5 to stop GPS",10, 30);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
var x = 10;
|
var x = 10;
|
||||||
var y = 50;
|
var y = 50;
|
||||||
var offsetMoon = 0;
|
var offsetMoon = 0;
|
||||||
coords = storage.readJSON('coords.json',1); //read coordinates from file
|
coords = storage.readJSON('coords.json',1); //read coordinates from file
|
||||||
if (!coords) resetCoords(); //if coordinates could not be read, reset them
|
if (!coords) resetCoords(); //if coordinates could not be read, reset them
|
||||||
|
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||||
|
|
||||||
|
//define button functions
|
||||||
|
setWatch(function() { //BTN1
|
||||||
|
offsetMoon++; //jump to next day
|
||||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||||
|
}, BTN1, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
//define button functions
|
setWatch(function() { //BTN2
|
||||||
setWatch(function() { //BTN1
|
offsetMoon = 0; //jump to today
|
||||||
offsetMoon++; //jump to next day
|
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
}, BTN2, {edge:"rising", debounce:50, repeat:true});
|
||||||
}, BTN1, {edge:"rising", debounce:50, repeat:true});
|
|
||||||
|
|
||||||
setWatch(function() { //BTN2
|
setWatch(function() { //BTN3
|
||||||
offsetMoon = 0; //jump to today
|
offsetMoon--; //jump to next day
|
||||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||||
}, BTN2, {edge:"rising", debounce:50, repeat:true});
|
}, BTN3, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
setWatch(function() { //BTN3
|
setWatch(function() { //BTN4
|
||||||
offsetMoon--; //jump to next day
|
g.drawString("--- Getting GPS signal ---",x, y);
|
||||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
Bangle.setGPSPower(1);
|
||||||
}, BTN3, {edge:"rising", debounce:50, repeat:true});
|
timer = setInterval(getGpsFix, 10000);
|
||||||
|
}, BTN4, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
|
||||||
setWatch(function() { //BTN4
|
setWatch(function() { //BTN5
|
||||||
g.drawString("--- Getting GPS signal ---",x, y);
|
if (timer) clearInterval(timer);
|
||||||
Bangle.setGPSPower(1);
|
timer = undefined;
|
||||||
timer = setInterval(getGpsFix, 10000);
|
Bangle.setGPSPower(0);
|
||||||
}, BTN4, {edge:"rising", debounce:50, repeat:true});
|
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||||
|
}, BTN5, {edge:"rising", debounce:50, repeat:true});
|
||||||
setWatch(function() { //BTN5
|
|
||||||
if (timer) clearInterval(timer);
|
|
||||||
timer = undefined;
|
|
||||||
Bangle.setGPSPower(0);
|
|
||||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
|
||||||
}, BTN5, {edge:"rising", debounce:50, repeat:true});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start();
|
start();
|
|
@ -95,20 +95,20 @@ const beepItOut = () => {
|
||||||
// Could make buzz optional or switchable potentially
|
// Could make buzz optional or switchable potentially
|
||||||
BUZZING ? Bangle.buzz(UNITS[UNIT_INDEX] === '.' ? UNIT : 3 * UNIT) : null
|
BUZZING ? Bangle.buzz(UNITS[UNIT_INDEX] === '.' ? UNIT : 3 * UNIT) : null
|
||||||
])
|
])
|
||||||
.then(() => {
|
.then(() => {
|
||||||
if (UNITS[UNIT_INDEX + 1]) {
|
if (UNITS[UNIT_INDEX + 1]) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
UNIT_INDEX++;
|
UNIT_INDEX++;
|
||||||
beepItOut();
|
beepItOut();
|
||||||
}, UNIT);
|
}, UNIT);
|
||||||
} else {
|
} else {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
BEEPING = false;
|
BEEPING = false;
|
||||||
UNIT_INDEX = 0;
|
UNIT_INDEX = 0;
|
||||||
writeLetter();
|
writeLetter();
|
||||||
}, 3 * UNIT);
|
}, 3 * UNIT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, wait);
|
}, wait);
|
||||||
};
|
};
|
||||||
const startBeep = () => {
|
const startBeep = () => {
|
||||||
|
|
|
@ -53,7 +53,7 @@ const writeText = (txt) => {
|
||||||
|
|
||||||
var width = g.stringWidth(txt);
|
var width = g.stringWidth(txt);
|
||||||
|
|
||||||
// Fit text to screen
|
// Fit text to screen
|
||||||
var fontFix = FONT_SIZE;
|
var fontFix = FONT_SIZE;
|
||||||
while(width > SCREEN_PIXELS-10){
|
while(width > SCREEN_PIXELS-10){
|
||||||
fontFix--;
|
fontFix--;
|
||||||
|
|
|
@ -118,7 +118,7 @@ function arrow(r,c) {
|
||||||
180+20*Math.sin(r+p), 180-20*Math.cos(r+p),
|
180+20*Math.sin(r+p), 180-20*Math.cos(r+p),
|
||||||
180-10*Math.sin(r), 180+10*Math.cos(r),
|
180-10*Math.sin(r), 180+10*Math.cos(r),
|
||||||
180+20*Math.sin(r+-p), 180-20*Math.cos(r-p),
|
180+20*Math.sin(r+-p), 180-20*Math.cos(r-p),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onCompass(m) {
|
function onCompass(m) {
|
||||||
|
|
|
@ -83,7 +83,7 @@ draw(settings.drawMode);
|
||||||
Bangle.on('lcdPower', function(on){
|
Bangle.on('lcdPower', function(on){
|
||||||
if (on){
|
if (on){
|
||||||
if (settings.color==0) _rCol = Math.floor(Math.random()*_hCol.length);
|
if (settings.color==0) _rCol = Math.floor(Math.random()*_hCol.length);
|
||||||
draw(settings.drawMode);
|
draw(settings.drawMode);
|
||||||
interval=setInterval(draw, REFRESH_RATE, settings.drawMode);
|
interval=setInterval(draw, REFRESH_RATE, settings.drawMode);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,25 +17,25 @@
|
||||||
let col = ["rnd","r/g","y/w","o/c","b/y"];
|
let col = ["rnd","r/g","y/w","o/c","b/y"];
|
||||||
let btn = [[24,"BTN1"],[22,"BTN2"],[23,"BTN3"],[11,"BTN4"],[16,"BTN5"]];
|
let btn = [[24,"BTN1"],[22,"BTN2"],[23,"BTN3"],[11,"BTN4"],[16,"BTN5"]];
|
||||||
var menu={
|
var menu={
|
||||||
"" : { "title":"Numerals"},
|
"" : { "title":"Numerals"},
|
||||||
"Colors": {
|
"Colors": {
|
||||||
value: 0|numeralsSettings.color,
|
value: 0|numeralsSettings.color,
|
||||||
min:0,max:4,
|
min:0,max:4,
|
||||||
format: v=>col[v],
|
format: v=>col[v],
|
||||||
onchange: v=> { numeralsSettings.color=v; updateSettings();}
|
onchange: v=> { numeralsSettings.color=v; updateSettings();}
|
||||||
},
|
},
|
||||||
"Draw mode": {
|
"Draw mode": {
|
||||||
value: 0|dm.indexOf(numeralsSettings.drawMode),
|
value: 0|dm.indexOf(numeralsSettings.drawMode),
|
||||||
min:0,max:1,
|
min:0,max:1,
|
||||||
format: v=>dm[v],
|
format: v=>dm[v],
|
||||||
onchange: v=> { numeralsSettings.drawMode=dm[v]; updateSettings();}
|
onchange: v=> { numeralsSettings.drawMode=dm[v]; updateSettings();}
|
||||||
},
|
},
|
||||||
"Menu button": {
|
"Menu button": {
|
||||||
value: btn.findIndex(e=>e[0]==numeralsSettings.menuButton),
|
value: btn.findIndex(e=>e[0]==numeralsSettings.menuButton),
|
||||||
min:0,max:4,
|
min:0,max:4,
|
||||||
format: v=>btn[v][1],
|
format: v=>btn[v][1],
|
||||||
onchange: v=> { numeralsSettings.menuButton=btn[v][0]; updateSettings();}
|
onchange: v=> { numeralsSettings.menuButton=btn[v][0]; updateSettings();}
|
||||||
},
|
},
|
||||||
"< back": back
|
"< back": back
|
||||||
};
|
};
|
||||||
E.showMenu(menu);
|
E.showMenu(menu);
|
||||||
|
|
|
@ -77,29 +77,29 @@ function boy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawClock() {
|
function drawClock() {
|
||||||
var t = new Date();
|
var t = new Date();
|
||||||
var h = t.getHours();
|
var h = t.getHours();
|
||||||
var m = t.getMinutes();
|
var m = t.getMinutes();
|
||||||
var dd = t.getDate();
|
var dd = t.getDate();
|
||||||
var mm = t.getMonth()+1; //month is zero-based
|
var mm = t.getMonth()+1; //month is zero-based
|
||||||
var yy = t.getFullYear();
|
var yy = t.getFullYear();
|
||||||
var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2);
|
var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2);
|
||||||
|
|
||||||
//create date string
|
//create date string
|
||||||
if (dd.toString().length < 2) dd = '0' + dd;
|
if (dd.toString().length < 2) dd = '0' + dd;
|
||||||
if (mm.toString().length < 2) mm = '0' + mm;
|
if (mm.toString().length < 2) mm = '0' + mm;
|
||||||
var date = dd + "." + mm + "." + yy;
|
var date = dd + "." + mm + "." + yy;
|
||||||
|
|
||||||
g.setFont("6x8",bigFont);
|
g.setFont("6x8",bigFont);
|
||||||
g.setColor(green);
|
g.setColor(green);
|
||||||
g.setFontAlign(0, -1, 0);
|
g.setFontAlign(0, -1, 0);
|
||||||
|
|
||||||
g.clearRect(0, 110, 150, 140);
|
g.clearRect(0, 110, 150, 140);
|
||||||
g.drawString(time, 70, 110);
|
g.drawString(time, 70, 110);
|
||||||
|
|
||||||
//draw date
|
//draw date
|
||||||
g.setFont("6x8", tinyFont);
|
g.setFont("6x8", tinyFont);
|
||||||
g.drawString(date, 67, 177);
|
g.drawString(date, 67, 177);
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawAll() {
|
function drawAll() {
|
||||||
|
|
|
@ -3,254 +3,254 @@ const storage = require("Storage");
|
||||||
const DEFAULT_TIME = 1500; // 25m
|
const DEFAULT_TIME = 1500; // 25m
|
||||||
const TIME_BREAK = 300;
|
const TIME_BREAK = 300;
|
||||||
const STATES = {
|
const STATES = {
|
||||||
INIT: 1,
|
INIT: 1,
|
||||||
STARTED: 2,
|
STARTED: 2,
|
||||||
DONE: 3,
|
DONE: 3,
|
||||||
BREAK: 4
|
BREAK: 4
|
||||||
};
|
};
|
||||||
var counterInterval;
|
var counterInterval;
|
||||||
|
|
||||||
class State {
|
class State {
|
||||||
constructor (state) {
|
constructor (state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.next = null;
|
this.next = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
setNext (next) {
|
||||||
|
this.next = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
setButtons () {}
|
||||||
|
|
||||||
|
clear () {
|
||||||
|
clearWatch();
|
||||||
|
g.clear();
|
||||||
|
g.setFontAlign(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw () {
|
||||||
|
g.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
init () { }
|
||||||
|
|
||||||
|
go (nextState) {
|
||||||
|
if (nextState) {
|
||||||
|
this.next = nextState;
|
||||||
}
|
}
|
||||||
|
|
||||||
setNext (next) {
|
this.clear();
|
||||||
this.next = next;
|
this.init();
|
||||||
}
|
this.setButtons();
|
||||||
|
this.draw();
|
||||||
setButtons () {}
|
}
|
||||||
|
|
||||||
clear () {
|
|
||||||
clearWatch();
|
|
||||||
g.clear();
|
|
||||||
g.setFontAlign(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
draw () {
|
|
||||||
g.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
init () { }
|
|
||||||
|
|
||||||
go (nextState) {
|
|
||||||
if (nextState) {
|
|
||||||
this.next = nextState;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.clear();
|
|
||||||
this.init();
|
|
||||||
this.setButtons();
|
|
||||||
this.draw();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class InitState extends State {
|
class InitState extends State {
|
||||||
constructor (time) {
|
constructor (time) {
|
||||||
super(STATES.INIT);
|
super(STATES.INIT);
|
||||||
|
|
||||||
this.timeCounter = parseInt(storage.read(".pomodo") || DEFAULT_TIME, 10);
|
this.timeCounter = parseInt(storage.read(".pomodo") || DEFAULT_TIME, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
saveTime () {
|
saveTime () {
|
||||||
storage.write('.pomodo', '' + this.timeCounter);
|
storage.write('.pomodo', '' + this.timeCounter);
|
||||||
}
|
}
|
||||||
|
|
||||||
setButtons () {
|
setButtons () {
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
if (this.timeCounter + 300 > 3599) {
|
if (this.timeCounter + 300 > 3599) {
|
||||||
this.timeCounter = 3599;
|
this.timeCounter = 3599;
|
||||||
} else {
|
} else {
|
||||||
this.timeCounter += 300;
|
this.timeCounter += 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.draw();
|
this.draw();
|
||||||
|
|
||||||
}, BTN1, { repeat: true });
|
}, BTN1, { repeat: true });
|
||||||
|
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
if (this.timeCounter - 300 > 0) {
|
if (this.timeCounter - 300 > 0) {
|
||||||
this.timeCounter -= 300;
|
this.timeCounter -= 300;
|
||||||
this.draw();
|
this.draw();
|
||||||
}
|
}
|
||||||
}, BTN3, { repeat: true });
|
}, BTN3, { repeat: true });
|
||||||
|
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
if (this.timeCounter - 60 > 0) {
|
if (this.timeCounter - 60 > 0) {
|
||||||
this.timeCounter -= 60;
|
this.timeCounter -= 60;
|
||||||
this.draw();
|
this.draw();
|
||||||
}
|
}
|
||||||
}, BTN4, { repeat: true });
|
}, BTN4, { repeat: true });
|
||||||
|
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
if (this.timeCounter + 60 > 3599) {
|
if (this.timeCounter + 60 > 3599) {
|
||||||
this.timeCounter = 3599;
|
this.timeCounter = 3599;
|
||||||
} else {
|
} else {
|
||||||
this.timeCounter += 60;
|
this.timeCounter += 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.draw();
|
this.draw();
|
||||||
|
|
||||||
}, BTN5, { repeat: true });
|
}, BTN5, { repeat: true });
|
||||||
|
|
||||||
setWatch(() => {
|
setWatch(() => {
|
||||||
this.saveTime();
|
this.saveTime();
|
||||||
const startedState = new StartedState(this.timeCounter);
|
const startedState = new StartedState(this.timeCounter);
|
||||||
|
|
||||||
this.setNext(startedState);
|
this.setNext(startedState);
|
||||||
this.next.go();
|
this.next.go();
|
||||||
}, BTN2, { repeat: true });
|
}, BTN2, { repeat: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
draw () {
|
draw () {
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFontAlign(0, 0); // center font
|
g.setFontAlign(0, 0); // center font
|
||||||
g.setFont("Vector", 50); // vector font, 80px
|
g.setFont("Vector", 50); // vector font, 80px
|
||||||
drawCounter(this.timeCounter);
|
drawCounter(this.timeCounter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StartedState extends State {
|
class StartedState extends State {
|
||||||
constructor (timeCounter) {
|
constructor (timeCounter) {
|
||||||
super(STATES.STARTED);
|
super(STATES.STARTED);
|
||||||
|
|
||||||
this.timeCounter = timeCounter;
|
this.timeCounter = timeCounter;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw () {
|
||||||
|
drawCounter(this.timeCounter, 120, 120);
|
||||||
|
}
|
||||||
|
|
||||||
|
init () {
|
||||||
|
function countDown () {
|
||||||
|
this.timeCounter--;
|
||||||
|
|
||||||
|
// Out of time
|
||||||
|
if (this.timeCounter <= 0) {
|
||||||
|
clearInterval(counterInterval);
|
||||||
|
counterInterval = undefined;
|
||||||
|
this.next.go();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
draw () {
|
const doneState = new DoneState();
|
||||||
drawCounter(this.timeCounter, 120, 120);
|
this.setNext(doneState);
|
||||||
}
|
counterInterval = setInterval(countDown.bind(this), 1000);
|
||||||
|
}
|
||||||
init () {
|
|
||||||
function countDown () {
|
|
||||||
this.timeCounter--;
|
|
||||||
|
|
||||||
// Out of time
|
|
||||||
if (this.timeCounter <= 0) {
|
|
||||||
clearInterval(counterInterval);
|
|
||||||
counterInterval = undefined;
|
|
||||||
this.next.go();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
const doneState = new DoneState();
|
|
||||||
this.setNext(doneState);
|
|
||||||
counterInterval = setInterval(countDown.bind(this), 1000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class BreakState extends State {
|
class BreakState extends State {
|
||||||
constructor () {
|
constructor () {
|
||||||
super(STATES.BREAK);
|
super(STATES.BREAK);
|
||||||
}
|
}
|
||||||
|
|
||||||
draw () {
|
draw () {
|
||||||
g.setFontAlign(0, 0);
|
g.setFontAlign(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
init () {
|
init () {
|
||||||
const startedState = new StartedState(TIME_BREAK);
|
const startedState = new StartedState(TIME_BREAK);
|
||||||
|
|
||||||
this.setNext(startedState);
|
this.setNext(startedState);
|
||||||
this.next.go();
|
this.next.go();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class DoneState extends State {
|
class DoneState extends State {
|
||||||
constructor () {
|
constructor () {
|
||||||
super(STATES.DONE);
|
super(STATES.DONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
setButtons () {
|
||||||
|
setWatch(() => {
|
||||||
|
const initState = new InitState();
|
||||||
|
clearTimeout(this.timeout);
|
||||||
|
initState.go();
|
||||||
|
}, BTN1, { repeat: true });
|
||||||
|
|
||||||
|
setWatch(() => {
|
||||||
|
const breakState = new BreakState();
|
||||||
|
clearTimeout(this.timeout);
|
||||||
|
breakState.go();
|
||||||
|
}, BTN3, { repeat: true });
|
||||||
|
|
||||||
|
setWatch(() => {
|
||||||
|
}, BTN2, { repeat: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
draw () {
|
||||||
|
g.clear();
|
||||||
|
g.setFont("6x8", 2);
|
||||||
|
g.setFontAlign(0, 0, 3);
|
||||||
|
g.drawString("AGAIN", 230, 50);
|
||||||
|
g.drawString("BREAK", 230, 190);
|
||||||
|
g.setFont("Vector", 45);
|
||||||
|
g.setFontAlign(-1, -1);
|
||||||
|
|
||||||
|
g.drawString('You\nare\na\nhero!', 50, 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
init () {
|
||||||
|
|
||||||
|
function buzz () {
|
||||||
|
Bangle.buzz();
|
||||||
|
Bangle.beep(200, 4000)
|
||||||
|
.then(() => new Promise(resolve => setTimeout(resolve, 50)))
|
||||||
|
.then(() => Bangle.beep(200, 3000))
|
||||||
|
.then(() => new Promise(resolve => setTimeout(resolve, 200)))
|
||||||
|
.then(() => Bangle.beep(200, 3000))
|
||||||
|
.then(() => new Promise(resolve => setTimeout(resolve, 300)))
|
||||||
|
.then(() => {
|
||||||
|
Bangle.beep(200, 3000);
|
||||||
|
Bangle.buzz()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setButtons () {
|
buzz();
|
||||||
setWatch(() => {
|
// again, 10 secs later
|
||||||
const initState = new InitState();
|
this.timeout = setTimeout(buzz.bind(this), 10000);
|
||||||
clearTimeout(this.timeout);
|
}
|
||||||
initState.go();
|
|
||||||
}, BTN1, { repeat: true });
|
|
||||||
|
|
||||||
setWatch(() => {
|
|
||||||
const breakState = new BreakState();
|
|
||||||
clearTimeout(this.timeout);
|
|
||||||
breakState.go();
|
|
||||||
}, BTN3, { repeat: true });
|
|
||||||
|
|
||||||
setWatch(() => {
|
|
||||||
}, BTN2, { repeat: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
draw () {
|
|
||||||
g.clear();
|
|
||||||
g.setFont("6x8", 2);
|
|
||||||
g.setFontAlign(0, 0, 3);
|
|
||||||
g.drawString("AGAIN", 230, 50);
|
|
||||||
g.drawString("BREAK", 230, 190);
|
|
||||||
g.setFont("Vector", 45);
|
|
||||||
g.setFontAlign(-1, -1);
|
|
||||||
|
|
||||||
g.drawString('You\nare\na\nhero!', 50, 40);
|
|
||||||
}
|
|
||||||
|
|
||||||
init () {
|
|
||||||
|
|
||||||
function buzz () {
|
|
||||||
Bangle.buzz();
|
|
||||||
Bangle.beep(200, 4000)
|
|
||||||
.then(() => new Promise(resolve => setTimeout(resolve, 50)))
|
|
||||||
.then(() => Bangle.beep(200, 3000))
|
|
||||||
.then(() => new Promise(resolve => setTimeout(resolve, 200)))
|
|
||||||
.then(() => Bangle.beep(200, 3000))
|
|
||||||
.then(() => new Promise(resolve => setTimeout(resolve, 300)))
|
|
||||||
.then(() => {
|
|
||||||
Bangle.beep(200, 3000);
|
|
||||||
Bangle.buzz()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
buzz();
|
|
||||||
// again, 10 secs later
|
|
||||||
this.timeout = setTimeout(buzz.bind(this), 10000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawCounter (currentValue, x, y) {
|
function drawCounter (currentValue, x, y) {
|
||||||
if (currentValue < 0) {
|
if (currentValue < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
x = x || 120;
|
x = x || 120;
|
||||||
y = y || 120;
|
y = y || 120;
|
||||||
|
|
||||||
let minutes = 0;
|
let minutes = 0;
|
||||||
let seconds = 0;
|
let seconds = 0;
|
||||||
|
|
||||||
if (currentValue >= 60) {
|
if (currentValue >= 60) {
|
||||||
minutes = Math.floor(currentValue / 60);
|
minutes = Math.floor(currentValue / 60);
|
||||||
seconds = currentValue % 60;
|
seconds = currentValue % 60;
|
||||||
} else {
|
} else {
|
||||||
seconds = currentValue;
|
seconds = currentValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let minutesString = '' + minutes;
|
let minutesString = '' + minutes;
|
||||||
let secondsString = '' + seconds;
|
let secondsString = '' + seconds;
|
||||||
|
|
||||||
if (minutes < 10) {
|
if (minutes < 10) {
|
||||||
minutesString = '0' + minutes;
|
minutesString = '0' + minutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seconds < 10) {
|
if (seconds < 10) {
|
||||||
secondsString = '0' + seconds;
|
secondsString = '0' + seconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
g.drawString(minutesString + ':' + secondsString, x, y);
|
g.drawString(minutesString + ':' + secondsString, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
function init () {
|
function init () {
|
||||||
const initState = new InitState();
|
const initState = new InitState();
|
||||||
initState.go();
|
initState.go();
|
||||||
}
|
}
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
|
@ -167,7 +167,7 @@
|
||||||
g.drawString(date, settings.date.center, settings.date.middle);
|
g.drawString(date, settings.date.center, settings.date.middle);
|
||||||
};
|
};
|
||||||
|
|
||||||
//setInterval for HR visualisation
|
//setInterval for HR visualisation
|
||||||
const newBeats = function (hr) {
|
const newBeats = function (hr) {
|
||||||
if (id != 0) {
|
if (id != 0) {
|
||||||
changeInterval(id, 6e3 / hr.bpm);
|
changeInterval(id, 6e3 / hr.bpm);
|
||||||
|
@ -206,7 +206,7 @@
|
||||||
Bangle.loadWidgets();
|
Bangle.loadWidgets();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
|
|
||||||
//manage when things should be enabled and not
|
//manage when things should be enabled and not
|
||||||
Bangle.on('lcdPower', function (on) {
|
Bangle.on('lcdPower', function (on) {
|
||||||
if (on) {
|
if (on) {
|
||||||
Bangle.setHRMPower(1);
|
Bangle.setHRMPower(1);
|
||||||
|
|
|
@ -1,60 +1,60 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
const colors = {
|
const colors = {
|
||||||
0: { value: 0x0000, name: "Black" },
|
0: { value: 0x0000, name: "Black" },
|
||||||
1: { value: 0x000F, name: "Navy" },
|
1: { value: 0x000F, name: "Navy" },
|
||||||
2: { value: 0x03E0, name: "DarkGreen" },
|
2: { value: 0x03E0, name: "DarkGreen" },
|
||||||
3: { value: 0x03EF, name: "DarkCyan" },
|
3: { value: 0x03EF, name: "DarkCyan" },
|
||||||
4: { value: 0x7800, name: "Maroon" },
|
4: { value: 0x7800, name: "Maroon" },
|
||||||
5: { value: 0x780F, name: "Purple" },
|
5: { value: 0x780F, name: "Purple" },
|
||||||
6: { value: 0x7BE0, name: "Olive" },
|
6: { value: 0x7BE0, name: "Olive" },
|
||||||
7: { value: 0xC618, name: "LightGray" },
|
7: { value: 0xC618, name: "LightGray" },
|
||||||
8: { value: 0x7BEF, name: "DarkGrey" },
|
8: { value: 0x7BEF, name: "DarkGrey" },
|
||||||
9: { value: 0x001F, name: "Blue" },
|
9: { value: 0x001F, name: "Blue" },
|
||||||
10: { value: 0x07E0, name: "Green" },
|
10: { value: 0x07E0, name: "Green" },
|
||||||
11: { value: 0x07FF, name: "Cyan" },
|
11: { value: 0x07FF, name: "Cyan" },
|
||||||
12: { value: 0xF800, name: "Red" },
|
12: { value: 0xF800, name: "Red" },
|
||||||
13: { value: 0xF81F, name: "Magenta" },
|
13: { value: 0xF81F, name: "Magenta" },
|
||||||
14: { value: 0xFFE0, name: "Yellow" },
|
14: { value: 0xFFE0, name: "Yellow" },
|
||||||
15: { value: 0xFFFF, name: "White" },
|
15: { value: 0xFFFF, name: "White" },
|
||||||
16: { value: 0xFD20, name: "Orange" },
|
16: { value: 0xFD20, name: "Orange" },
|
||||||
17: { value: 0xAFE5, name: "GreenYellow" },
|
17: { value: 0xAFE5, name: "GreenYellow" },
|
||||||
18: { value: 0xF81F, name: "Pink" },
|
18: { value: 0xF81F, name: "Pink" },
|
||||||
};
|
};
|
||||||
|
|
||||||
const maxColors = 19;
|
const maxColors = 19;
|
||||||
var index = 0;
|
var index = 0;
|
||||||
|
|
||||||
function drawColor() {
|
function drawColor() {
|
||||||
|
|
||||||
// draw filled rectangle
|
// draw filled rectangle
|
||||||
g.setColor(colors[index % maxColors].value);
|
g.setColor(colors[index % maxColors].value);
|
||||||
g.fillRect(0, 24, g.getWidth(), g.getHeight());
|
g.fillRect(0, 24, g.getWidth(), g.getHeight());
|
||||||
|
|
||||||
// draw value name of color
|
// draw value name of color
|
||||||
g.setFontAlign(0, 0);
|
g.setFontAlign(0, 0);
|
||||||
g.setColor(0xFFFF);
|
g.setColor(0xFFFF);
|
||||||
if (colors[index % maxColors].name == "White")
|
if (colors[index % maxColors].name == "White")
|
||||||
g.setColor(0);
|
g.setColor(0);
|
||||||
g.setFont("6x8", 4);
|
g.setFont("6x8", 4);
|
||||||
g.drawString('0x' + colors[index % maxColors].value.toString(16), 120, 80);
|
g.drawString('0x' + colors[index % maxColors].value.toString(16), 120, 80);
|
||||||
g.setFont("6x8", 3);
|
g.setFont("6x8", 3);
|
||||||
g.drawString(colors[index % maxColors].name, 120, 160);
|
g.drawString(colors[index % maxColors].name, 120, 160);
|
||||||
|
|
||||||
// draw next button info
|
// draw next button info
|
||||||
g.setFont("6x8", 2);
|
g.setFont("6x8", 2);
|
||||||
g.setFontAlign(0, 0, 3);
|
g.setFontAlign(0, 0, 3);
|
||||||
g.drawString("Next", 230, 60);
|
g.drawString("Next", 230, 60);
|
||||||
|
|
||||||
// set watches for button 1
|
// set watches for button 1
|
||||||
index++;
|
index++;
|
||||||
setWatch(drawColor, BTN1, { repeate: true });
|
setWatch(drawColor, BTN1, { repeate: true });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
setWatch(drawColor, BTN1, { repeate: false });
|
setWatch(drawColor, BTN1, { repeate: false });
|
||||||
E.showMessage("Press BTN1\nto start");
|
E.showMessage("Press BTN1\nto start");
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -11,8 +11,8 @@ var hrm;
|
||||||
var SPEAKER_PIN = D18;
|
var SPEAKER_PIN = D18;
|
||||||
|
|
||||||
function freq(f) {
|
function freq(f) {
|
||||||
console.log("frequency: ", f);
|
console.log("frequency: ", f);
|
||||||
if (f===0) digitalWrite(SPEAKER_PIN, 0);
|
if (f===0) digitalWrite(SPEAKER_PIN, 0);
|
||||||
else analogWrite(SPEAKER_PIN, 0.5, {freq: f});
|
else analogWrite(SPEAKER_PIN, 0.5, {freq: f});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,8 +83,8 @@ setWatch(function() { // Start/stop
|
||||||
Bangle.beep();
|
Bangle.beep();
|
||||||
if (started)
|
if (started)
|
||||||
tStart = Date.now()+tStart-tCurrent;
|
tStart = Date.now()+tStart-tCurrent;
|
||||||
tTotal = Date.now()+tTotal-tCurrent;
|
tTotal = Date.now()+tTotal-tCurrent;
|
||||||
tCurrent = Date.now();
|
tCurrent = Date.now();
|
||||||
if (displayInterval) {
|
if (displayInterval) {
|
||||||
clearInterval(displayInterval);
|
clearInterval(displayInterval);
|
||||||
displayInterval = undefined;
|
displayInterval = undefined;
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
(function() {
|
(function() {
|
||||||
var clickTimes = [];
|
var clickTimes = [];
|
||||||
var clickPattern = "";
|
var clickPattern = "";
|
||||||
var TAPS = 4; // number of taps
|
var TAPS = 4; // number of taps
|
||||||
var PERIOD = 1; // seconds
|
var PERIOD = 1; // seconds
|
||||||
|
|
||||||
// we don't actually create/draw a widget here at all...
|
// we don't actually create/draw a widget here at all...
|
||||||
Bangle.on("lcdPower",function(on) {
|
Bangle.on("lcdPower",function(on) {
|
||||||
// First click (that turns LCD on) isn't given to
|
// First click (that turns LCD on) isn't given to
|
||||||
// setWatch, so handle it here
|
// setWatch, so handle it here
|
||||||
if (!on) return;
|
if (!on) return;
|
||||||
clickTimes=[getTime()];
|
clickTimes=[getTime()];
|
||||||
clickPattern="x";
|
clickPattern="x";
|
||||||
});
|
});
|
||||||
function tap(e,c) {
|
function tap(e,c) {
|
||||||
clickPattern = clickPattern.substr(-3)+c;
|
clickPattern = clickPattern.substr(-3)+c;
|
||||||
while (clickTimes.length>=TAPS) clickTimes.shift();
|
while (clickTimes.length>=TAPS) clickTimes.shift();
|
||||||
clickTimes.push(e.time);
|
clickTimes.push(e.time);
|
||||||
var clickPeriod = e.time-clickTimes[0];
|
var clickPeriod = e.time-clickTimes[0];
|
||||||
if (clickPeriod<PERIOD && clickPattern.match(/.313/)) {
|
if (clickPeriod<PERIOD && clickPattern.match(/.313/)) {
|
||||||
load("torch.app.js");
|
load("torch.app.js");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
setWatch(function(e) { tap(e,"1"); }, BTN1, {repeat:true, edge:"rising"});
|
||||||
setWatch(function(e) { tap(e,"1"); }, BTN1, {repeat:true, edge:"rising"});
|
setWatch(function(e) { tap(e,"3"); }, BTN3, {repeat:true, edge:"rising"});
|
||||||
setWatch(function(e) { tap(e,"3"); }, BTN3, {repeat:true, edge:"rising"});
|
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -32,18 +32,18 @@ function getPosition(index){
|
||||||
}
|
}
|
||||||
|
|
||||||
function getApps(){
|
function getApps(){
|
||||||
const exit_app = {
|
const exit_app = {
|
||||||
name: 'Exit',
|
name: 'Exit',
|
||||||
special: true
|
special: true
|
||||||
};
|
};
|
||||||
const raw_apps = Storage.list(/\.info$/).filter(app => app.endsWith('.info')).map(app => Storage.readJSON(app,1) || { name: "DEAD: "+app.substr(1) })
|
const raw_apps = Storage.list(/\.info$/).filter(app => app.endsWith('.info')).map(app => Storage.readJSON(app,1) || { name: "DEAD: "+app.substr(1) })
|
||||||
.filter(app=>app.type=="app" || app.type=="clock" || !app.type)
|
.filter(app=>app.type=="app" || app.type=="clock" || !app.type)
|
||||||
.sort((a,b)=>{
|
.sort((a,b)=>{
|
||||||
var n=(0|a.sortorder)-(0|b.sortorder);
|
var n=(0|a.sortorder)-(0|b.sortorder);
|
||||||
if (n) return n; // do sortorder first
|
if (n) return n; // do sortorder first
|
||||||
if (a.name<b.name) return -1;
|
if (a.name<b.name) return -1;
|
||||||
if (a.name>b.name) return 1;
|
if (a.name>b.name) return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}).map(raw => ({
|
}).map(raw => ({
|
||||||
name: raw.name,
|
name: raw.name,
|
||||||
src: raw.src,
|
src: raw.src,
|
||||||
|
@ -51,12 +51,12 @@ function getApps(){
|
||||||
version: raw.version
|
version: raw.version
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const apps = [Object.assign({}, exit_app)].concat(raw_apps);
|
const apps = [Object.assign({}, exit_app)].concat(raw_apps);
|
||||||
apps.push(exit_app);
|
apps.push(exit_app);
|
||||||
return apps.map((app, i) => {
|
return apps.map((app, i) => {
|
||||||
app.x = getPosition(i);
|
app.x = getPosition(i);
|
||||||
return app;
|
return app;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const APPS = getApps();
|
const APPS = getApps();
|
||||||
|
@ -105,8 +105,8 @@ function render(){
|
||||||
|
|
||||||
//draw icon
|
//draw icon
|
||||||
const icon = app.icon ?
|
const icon = app.icon ?
|
||||||
icons[app.name] ? icons[app.name] : Storage.read(app.icon)
|
icons[app.name] ? icons[app.name] : Storage.read(app.icon)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
if(icon){
|
if(icon){
|
||||||
icons[app.name] = icon;
|
icons[app.name] = icon;
|
||||||
|
@ -132,13 +132,13 @@ function render(){
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings.highres){
|
if(settings.highres){
|
||||||
const type = app.type ? app.type : 'App';
|
const type = app.type ? app.type : 'App';
|
||||||
const version = app.version ? app.version : '0.00';
|
const version = app.version ? app.version : '0.00';
|
||||||
const info = type+' v'+version;
|
const info = type+' v'+version;
|
||||||
g.setFontAlign(0,1);
|
g.setFontAlign(0,1);
|
||||||
g.setFont('6x8', 1.5);
|
g.setFont('6x8', 1.5);
|
||||||
g.setColor(scale,scale,scale);
|
g.setColor(scale,scale,scale);
|
||||||
g.drawString(info, HALF, 215, { scale: scale });
|
g.drawString(info, HALF, 215, { scale: scale });
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
const allWords = [
|
const allWords = [
|
||||||
"ATWENTYD",
|
"ATWENTYD",
|
||||||
"QUARTERY",
|
"QUARTERY",
|
||||||
"FIVEHALF",
|
"FIVEHALF",
|
||||||
"DPASTORO",
|
"DPASTORO",
|
||||||
"FIVEIGHT",
|
"FIVEIGHT",
|
||||||
"SIXTHREE",
|
"SIXTHREE",
|
||||||
"TWELEVEN",
|
"TWELEVEN",
|
||||||
"FOURNINE"
|
"FOURNINE"
|
||||||
];
|
];
|
||||||
const hours = {
|
const hours = {
|
||||||
0: ["", 0, 0],
|
0: ["", 0, 0],
|
||||||
1: ["ONE", 17, 47, 77],
|
1: ["ONE", 17, 47, 77],
|
||||||
2: ["TWO", 06, 16, 17],
|
2: ["TWO", 06, 16, 17],
|
||||||
3: ["THREE", 35, 45, 55, 65, 75],
|
3: ["THREE", 35, 45, 55, 65, 75],
|
||||||
4: ["FOUR", 07, 17, 27, 37],
|
4: ["FOUR", 07, 17, 27, 37],
|
||||||
5: ["FIVE", 04, 14, 24, 34],
|
5: ["FIVE", 04, 14, 24, 34],
|
||||||
6: ["SIX", 05, 15, 25],
|
6: ["SIX", 05, 15, 25],
|
||||||
7: ["SEVEN", 05, 46, 56, 66, 67],
|
7: ["SEVEN", 05, 46, 56, 66, 67],
|
||||||
8: ["EIGHT", 34, 44, 54, 64, 74],
|
8: ["EIGHT", 34, 44, 54, 64, 74],
|
||||||
9: ["NINE", 47, 57, 67, 77],
|
9: ["NINE", 47, 57, 67, 77],
|
||||||
10: ["TEN", 74, 75, 76],
|
10: ["TEN", 74, 75, 76],
|
||||||
11: ["ELEVEN", 26, 36, 46, 56, 66, 76],
|
11: ["ELEVEN", 26, 36, 46, 56, 66, 76],
|
||||||
12: ["TWELVE", 06, 16, 26, 36, 56, 66]
|
12: ["TWELVE", 06, 16, 26, 36, 56, 66]
|
||||||
};
|
};
|
||||||
|
|
||||||
const mins = {
|
const mins = {
|
||||||
0: ["A", 0, 0],
|
0: ["A", 0, 0],
|
||||||
1: ["FIVE", 02, 12, 22, 32],
|
1: ["FIVE", 02, 12, 22, 32],
|
||||||
2: ["TEN", 10, 30, 40],
|
2: ["TEN", 10, 30, 40],
|
||||||
3: ["QUARTER", 01, 11, 21, 31, 41, 51, 61],
|
3: ["QUARTER", 01, 11, 21, 31, 41, 51, 61],
|
||||||
4: ["TWENTY", 10, 20, 30, 40, 50, 60],
|
4: ["TWENTY", 10, 20, 30, 40, 50, 60],
|
||||||
5: ["HALF", 42, 52, 62, 72],
|
5: ["HALF", 42, 52, 62, 72],
|
||||||
6: ["PAST", 13, 23, 33, 43],
|
6: ["PAST", 13, 23, 33, 43],
|
||||||
7: ["TO", 43, 53]
|
7: ["TO", 43, 53]
|
||||||
};
|
};
|
||||||
|
|
||||||
// offsets and incerments
|
// offsets and incerments
|
||||||
|
@ -49,71 +49,71 @@ const activeColor = 0xF800 /*red*/ ;
|
||||||
|
|
||||||
function drawWordClock() {
|
function drawWordClock() {
|
||||||
|
|
||||||
// get time
|
// get time
|
||||||
var t = new Date();
|
var t = new Date();
|
||||||
var h = t.getHours();
|
var h = t.getHours();
|
||||||
var m = t.getMinutes();
|
var m = t.getMinutes();
|
||||||
var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2);
|
var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2);
|
||||||
|
|
||||||
var hidx;
|
var hidx;
|
||||||
var midx;
|
var midx;
|
||||||
var midxA = [];
|
var midxA = [];
|
||||||
|
|
||||||
g.setFont("6x8",fontSize);
|
g.setFont("6x8",fontSize);
|
||||||
g.setColor(passivColor);
|
g.setColor(passivColor);
|
||||||
g.setFontAlign(0, -1, 0);
|
g.setFontAlign(0, -1, 0);
|
||||||
|
|
||||||
// draw allWords
|
// draw allWords
|
||||||
var c;
|
var c;
|
||||||
var y = ys;
|
var y = ys;
|
||||||
var x = xs;
|
var x = xs;
|
||||||
allWords.forEach((line) => {
|
allWords.forEach((line) => {
|
||||||
x = xs;
|
x = xs;
|
||||||
for (c in line) {
|
for (c in line) {
|
||||||
g.drawString(line[c], x, y);
|
g.drawString(line[c], x, y);
|
||||||
x += dx;
|
x += dx;
|
||||||
}
|
|
||||||
y += dy;
|
|
||||||
});
|
|
||||||
|
|
||||||
// calc indexes
|
|
||||||
midx = Math.round(m / 5);
|
|
||||||
hidx = h % 12;
|
|
||||||
if (hidx === 0) { hidx = 12; }
|
|
||||||
if (midx > 6) {
|
|
||||||
if (midx == 12) { midx = 0; }
|
|
||||||
hidx++;
|
|
||||||
}
|
}
|
||||||
if (midx !== 0) {
|
y += dy;
|
||||||
if (midx <= 6) {
|
});
|
||||||
midxA = [midx, 6];
|
|
||||||
} else {
|
// calc indexes
|
||||||
midxA = [12 - midx, 7];
|
midx = Math.round(m / 5);
|
||||||
}
|
hidx = h % 12;
|
||||||
|
if (hidx === 0) { hidx = 12; }
|
||||||
|
if (midx > 6) {
|
||||||
|
if (midx == 12) { midx = 0; }
|
||||||
|
hidx++;
|
||||||
|
}
|
||||||
|
if (midx !== 0) {
|
||||||
|
if (midx <= 6) {
|
||||||
|
midxA = [midx, 6];
|
||||||
|
} else {
|
||||||
|
midxA = [12 - midx, 7];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// write hour in active color
|
// write hour in active color
|
||||||
g.setColor(activeColor);
|
g.setColor(activeColor);
|
||||||
hours[hidx][0].split('').forEach((c, pos) => {
|
hours[hidx][0].split('').forEach((c, pos) => {
|
||||||
x = xs + (hours[hidx][pos + 1] / 10 | 0) * dx;
|
x = xs + (hours[hidx][pos + 1] / 10 | 0) * dx;
|
||||||
y = ys + (hours[hidx][pos + 1] % 10) * dy;
|
y = ys + (hours[hidx][pos + 1] % 10) * dy;
|
||||||
|
|
||||||
g.drawString(c, x, y);
|
g.drawString(c, x, y);
|
||||||
|
});
|
||||||
|
|
||||||
|
// write min words in active color
|
||||||
|
midxA.forEach(idx => {
|
||||||
|
mins[idx][0].split('').forEach((c, pos) => {
|
||||||
|
x = xs + (mins[idx][pos + 1] / 10 | 0) * dx;
|
||||||
|
y = ys + (mins[idx][pos + 1] % 10) * dy;
|
||||||
|
g.drawString(c, x, y);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// write min words in active color
|
// display digital time
|
||||||
midxA.forEach(idx => {
|
g.setColor(activeColor);
|
||||||
mins[idx][0].split('').forEach((c, pos) => {
|
g.clearRect(0, 215, 240, 240);
|
||||||
x = xs + (mins[idx][pos + 1] / 10 | 0) * dx;
|
g.drawString(time, 120, 215);
|
||||||
y = ys + (mins[idx][pos + 1] % 10) * dy;
|
|
||||||
g.drawString(c, x, y);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// display digital time
|
|
||||||
g.setColor(activeColor);
|
|
||||||
g.clearRect(0, 215, 240, 240);
|
|
||||||
g.drawString(time, 120, 215);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Bangle.on('lcdPower', function(on) {
|
Bangle.on('lcdPower', function(on) {
|
||||||
|
|
|
@ -87,7 +87,7 @@ var scenes = [
|
||||||
()=>{g.setFont("Vector",36);g.drawString("1",200,40);},
|
()=>{g.setFont("Vector",36);g.drawString("1",200,40);},
|
||||||
()=>g.drawString("2",200,120),
|
()=>g.drawString("2",200,120),
|
||||||
()=>g.drawString("3",200,200)
|
()=>g.drawString("3",200,200)
|
||||||
],200);
|
],200);
|
||||||
},
|
},
|
||||||
function() {
|
function() {
|
||||||
g.reset();
|
g.reset();
|
||||||
|
@ -138,15 +138,15 @@ var scenes = [
|
||||||
var x = 120, y = 10, h=21;
|
var x = 120, y = 10, h=21;
|
||||||
animate([
|
animate([
|
||||||
()=>{g.drawString("Bangle.js has a",x,y+=h);
|
()=>{g.drawString("Bangle.js has a",x,y+=h);
|
||||||
g.drawString("simple touchscreen",x,y+=h);},
|
g.drawString("simple touchscreen",x,y+=h);},
|
||||||
0,0,
|
0,0,
|
||||||
()=>{g.drawString("It'll detect touch",x,y+=h*2);
|
()=>{g.drawString("It'll detect touch",x,y+=h*2);
|
||||||
g.drawString("on left and right",x,y+=h);},
|
g.drawString("on left and right",x,y+=h);},
|
||||||
0,0,
|
0,0,
|
||||||
()=>{g.drawString("Horizontal swipes",x,y+=h*2);
|
()=>{g.drawString("Horizontal swipes",x,y+=h*2);
|
||||||
g.drawString("work too. Try now",x,y+=h);
|
g.drawString("work too. Try now",x,y+=h);
|
||||||
g.drawString("to change page.",x,y+=h);}
|
g.drawString("to change page.",x,y+=h);}
|
||||||
],300);
|
],300);
|
||||||
},
|
},
|
||||||
function() {
|
function() {
|
||||||
g.reset();
|
g.reset();
|
||||||
|
@ -156,15 +156,15 @@ var scenes = [
|
||||||
var x = 120, y = 10, h=21;
|
var x = 120, y = 10, h=21;
|
||||||
animate([
|
animate([
|
||||||
()=>{g.drawString("Bangle.js",x,y+=h);
|
()=>{g.drawString("Bangle.js",x,y+=h);
|
||||||
g.drawString("comes with",x,y+=h);
|
g.drawString("comes with",x,y+=h);
|
||||||
g.drawString("a few simple",x,y+=h);
|
g.drawString("a few simple",x,y+=h);
|
||||||
g.drawString("apps installed",x,y+=h);},
|
g.drawString("apps installed",x,y+=h);},
|
||||||
0,0,
|
0,0,
|
||||||
()=>{g.drawString("To add more, visit",x,y+=h*2);
|
()=>{g.drawString("To add more, visit",x,y+=h*2);
|
||||||
g.drawString("banglejs.com/apps",x,y+=h);
|
g.drawString("banglejs.com/apps",x,y+=h);
|
||||||
g.drawString("with a Bluetooth",x,y+=h);
|
g.drawString("with a Bluetooth",x,y+=h);
|
||||||
g.drawString("capable device",x,y+=h);},
|
g.drawString("capable device",x,y+=h);},
|
||||||
],400);
|
],400);
|
||||||
},
|
},
|
||||||
function() {
|
function() {
|
||||||
g.reset();
|
g.reset();
|
||||||
|
@ -186,9 +186,9 @@ var scenes = [
|
||||||
rx += 0.1;
|
rx += 0.1;
|
||||||
ry += 0.11;
|
ry += 0.11;
|
||||||
var rcx=Math.cos(rx),
|
var rcx=Math.cos(rx),
|
||||||
rsx=Math.sin(rx),
|
rsx=Math.sin(rx),
|
||||||
rcy=Math.cos(ry),
|
rcy=Math.cos(ry),
|
||||||
rsy=Math.sin(ry);
|
rsy=Math.sin(ry);
|
||||||
// Project 3D coordinates into 2D
|
// Project 3D coordinates into 2D
|
||||||
function p(x,y,z) {
|
function p(x,y,z) {
|
||||||
var t;
|
var t;
|
||||||
|
@ -240,10 +240,10 @@ var scenes = [
|
||||||
animate([
|
animate([
|
||||||
()=>g.drawString("That's it!",x,y+=h),
|
()=>g.drawString("That's it!",x,y+=h),
|
||||||
()=>{g.drawString("Press",x,y+=h*3);
|
()=>{g.drawString("Press",x,y+=h*3);
|
||||||
g.drawString("Button 2",x,y+=h);
|
g.drawString("Button 2",x,y+=h);
|
||||||
g.drawString("to start",x,y+=h);
|
g.drawString("to start",x,y+=h);
|
||||||
g.drawString("Bangle.js",x,y+=h);}
|
g.drawString("Bangle.js",x,y+=h);}
|
||||||
],400);
|
],400);
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -1,43 +1,43 @@
|
||||||
(function(){
|
(function(){
|
||||||
var CHARGING = 0x07E0;
|
var CHARGING = 0x07E0;
|
||||||
|
|
||||||
function setWidth() {
|
function setWidth() {
|
||||||
WIDGETS["bat"].width = 40 + (Bangle.isCharging()?16:0);
|
WIDGETS["bat"].width = 40 + (Bangle.isCharging()?16:0);
|
||||||
}
|
|
||||||
function draw() {
|
|
||||||
var s = 39;
|
|
||||||
var x = this.x, y = this.y;
|
|
||||||
if (Bangle.isCharging()) {
|
|
||||||
g.setColor(CHARGING).drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
|
|
||||||
x+=16;
|
|
||||||
}
|
}
|
||||||
g.setColor(-1);
|
function draw() {
|
||||||
g.fillRect(x,y+2,x+s-4,y+21);
|
var s = 39;
|
||||||
g.clearRect(x+2,y+4,x+s-6,y+19);
|
var x = this.x, y = this.y;
|
||||||
g.fillRect(x+s-3,y+10,x+s,y+14);
|
if (Bangle.isCharging()) {
|
||||||
g.setColor(CHARGING).fillRect(x+4,y+6,x+4+E.getBattery()*(s-12)/100,y+17);
|
g.setColor(CHARGING).drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
|
||||||
g.setColor(-1);
|
x+=16;
|
||||||
}
|
}
|
||||||
Bangle.on('charging',function(charging) {
|
g.setColor(-1);
|
||||||
if(charging) Bangle.buzz();
|
g.fillRect(x,y+2,x+s-4,y+21);
|
||||||
|
g.clearRect(x+2,y+4,x+s-6,y+19);
|
||||||
|
g.fillRect(x+s-3,y+10,x+s,y+14);
|
||||||
|
g.setColor(CHARGING).fillRect(x+4,y+6,x+4+E.getBattery()*(s-12)/100,y+17);
|
||||||
|
g.setColor(-1);
|
||||||
|
}
|
||||||
|
Bangle.on('charging',function(charging) {
|
||||||
|
if(charging) Bangle.buzz();
|
||||||
|
setWidth();
|
||||||
|
Bangle.drawWidgets(); // relayout widgets
|
||||||
|
g.flip();
|
||||||
|
});
|
||||||
|
var batteryInterval;
|
||||||
|
Bangle.on('lcdPower', function(on) {
|
||||||
|
if (on) {
|
||||||
|
WIDGETS["bat"].draw();
|
||||||
|
// refresh once a minute if LCD on
|
||||||
|
if (!batteryInterval)
|
||||||
|
batteryInterval = setInterval(()=>WIDGETS["bat"].draw(), 60000);
|
||||||
|
} else {
|
||||||
|
if (batteryInterval) {
|
||||||
|
clearInterval(batteryInterval);
|
||||||
|
batteryInterval = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
WIDGETS["bat"]={area:"tr",width:40,draw:draw};
|
||||||
setWidth();
|
setWidth();
|
||||||
Bangle.drawWidgets(); // relayout widgets
|
|
||||||
g.flip();
|
|
||||||
});
|
|
||||||
var batteryInterval;
|
|
||||||
Bangle.on('lcdPower', function(on) {
|
|
||||||
if (on) {
|
|
||||||
WIDGETS["bat"].draw();
|
|
||||||
// refresh once a minute if LCD on
|
|
||||||
if (!batteryInterval)
|
|
||||||
batteryInterval = setInterval(()=>WIDGETS["bat"].draw(), 60000);
|
|
||||||
} else {
|
|
||||||
if (batteryInterval) {
|
|
||||||
clearInterval(batteryInterval);
|
|
||||||
batteryInterval = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
WIDGETS["bat"]={area:"tr",width:40,draw:draw};
|
|
||||||
setWidth();
|
|
||||||
})()
|
})()
|
||||||
|
|
|
@ -52,8 +52,8 @@
|
||||||
const newIndex = (oldIndex + 1) % COLORS.length
|
const newIndex = (oldIndex + 1) % COLORS.length
|
||||||
s.color = COLORS[newIndex]
|
s.color = COLORS[newIndex]
|
||||||
save('color')(s.color)
|
save('color')(s.color)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Hide if >': {
|
'Hide if >': {
|
||||||
value: s.hideifmorethan||100,
|
value: s.hideifmorethan||100,
|
||||||
min: 10,
|
min: 10,
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
step: 10,
|
step: 10,
|
||||||
format: x => x+"%",
|
format: x => x+"%",
|
||||||
onchange: save('hideifmorethan'),
|
onchange: save('hideifmorethan'),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
E.showMenu(menu)
|
E.showMenu(menu)
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,140 +1,140 @@
|
||||||
(function(){
|
(function(){
|
||||||
const COLORS = {
|
const COLORS = {
|
||||||
'white': -1,
|
'white': -1,
|
||||||
'charging': 0x07E0, // "Green"
|
'charging': 0x07E0, // "Green"
|
||||||
'high': 0x05E0, // slightly darker green
|
'high': 0x05E0, // slightly darker green
|
||||||
'ok': 0xFD20, // "Orange"
|
'ok': 0xFD20, // "Orange"
|
||||||
'low':0xF800, // "Red"
|
'low':0xF800, // "Red"
|
||||||
}
|
}
|
||||||
const SETTINGS_FILE = 'widbatpc.json'
|
const SETTINGS_FILE = 'widbatpc.json'
|
||||||
|
|
||||||
let settings
|
let settings
|
||||||
function loadSettings() {
|
function loadSettings() {
|
||||||
settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}
|
settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}
|
||||||
const DEFAULTS = {
|
const DEFAULTS = {
|
||||||
'color': 'By Level',
|
'color': 'By Level',
|
||||||
'percentage': true,
|
'percentage': true,
|
||||||
'charger': true,
|
'charger': true,
|
||||||
'hideifmorethan': 100,
|
'hideifmorethan': 100,
|
||||||
};
|
};
|
||||||
Object.keys(DEFAULTS).forEach(k=>{
|
Object.keys(DEFAULTS).forEach(k=>{
|
||||||
if (settings[k]===undefined) settings[k]=DEFAULTS[k]
|
if (settings[k]===undefined) settings[k]=DEFAULTS[k]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function setting(key) {
|
function setting(key) {
|
||||||
if (!settings) { loadSettings() }
|
if (!settings) { loadSettings() }
|
||||||
return settings[key];
|
return settings[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
const levelColor = (l) => {
|
const levelColor = (l) => {
|
||||||
// "charging" is very bright -> percentage is hard to read, "high" is ok(ish)
|
// "charging" is very bright -> percentage is hard to read, "high" is ok(ish)
|
||||||
const green = setting('percentage') ? COLORS.high : COLORS.charging
|
const green = setting('percentage') ? COLORS.high : COLORS.charging
|
||||||
switch (setting('color')) {
|
switch (setting('color')) {
|
||||||
case 'Monochrome': return COLORS.white; // no chance of reading the percentage here :-(
|
case 'Monochrome': return COLORS.white; // no chance of reading the percentage here :-(
|
||||||
case 'Green': return green;
|
case 'Green': return green;
|
||||||
case 'By Level': // fall through
|
case 'By Level': // fall through
|
||||||
default:
|
default:
|
||||||
if (setting('charger')) {
|
if (setting('charger')) {
|
||||||
// charger icon -> always make percentage readable
|
// charger icon -> always make percentage readable
|
||||||
if (Bangle.isCharging() || l >= 50) return green;
|
if (Bangle.isCharging() || l >= 50) return green;
|
||||||
} else {
|
} else {
|
||||||
// no icon -> brightest green to indicate charging, even when showing percentage
|
// no icon -> brightest green to indicate charging, even when showing percentage
|
||||||
if (Bangle.isCharging()) return COLORS.charging;
|
if (Bangle.isCharging()) return COLORS.charging;
|
||||||
if (l >= 50) return COLORS.high;
|
if (l >= 50) return COLORS.high;
|
||||||
}
|
}
|
||||||
if (l >= 15) return COLORS.ok;
|
if (l >= 15) return COLORS.ok;
|
||||||
return COLORS.low;
|
return COLORS.low;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
const chargerColor = () => {
|
||||||
const chargerColor = () => {
|
return (setting('color') === 'Monochrome') ? COLORS.white : COLORS.charging
|
||||||
return (setting('color') === 'Monochrome') ? COLORS.white : COLORS.charging
|
}
|
||||||
}
|
// sets width, returns true if it changed
|
||||||
// sets width, returns true if it changed
|
function setWidth() {
|
||||||
function setWidth() {
|
var w = 40;
|
||||||
var w = 40;
|
if (Bangle.isCharging() && setting('charger'))
|
||||||
if (Bangle.isCharging() && setting('charger'))
|
w += 16;
|
||||||
w += 16;
|
if (E.getBattery() > setting('hideifmorethan'))
|
||||||
if (E.getBattery() > setting('hideifmorethan'))
|
w = 0;
|
||||||
w = 0;
|
var changed = WIDGETS["batpc"].width != w;
|
||||||
var changed = WIDGETS["batpc"].width != w;
|
WIDGETS["batpc"].width = w;
|
||||||
WIDGETS["batpc"].width = w;
|
return changed;
|
||||||
return changed;
|
}
|
||||||
}
|
function draw() {
|
||||||
function draw() {
|
|
||||||
// if hidden, don't draw
|
// if hidden, don't draw
|
||||||
if (!WIDGETS["batpc"].width) return;
|
if (!WIDGETS["batpc"].width) return;
|
||||||
// else...
|
// else...
|
||||||
var s = 39;
|
var s = 39;
|
||||||
var x = this.x, y = this.y;
|
var x = this.x, y = this.y;
|
||||||
const l = E.getBattery(),
|
const l = E.getBattery(),
|
||||||
c = levelColor(l);
|
c = levelColor(l);
|
||||||
const xl = x+4+l*(s-12)/100
|
const xl = x+4+l*(s-12)/100
|
||||||
|
|
||||||
if (Bangle.isCharging() && setting('charger')) {
|
if (Bangle.isCharging() && setting('charger')) {
|
||||||
g.setColor(chargerColor()).drawImage(atob(
|
g.setColor(chargerColor()).drawImage(atob(
|
||||||
"DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
|
"DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
|
||||||
x+=16;
|
x+=16;
|
||||||
}
|
}
|
||||||
g.setColor(-1);
|
g.setColor(-1);
|
||||||
g.fillRect(x,y+2,x+s-4,y+21);
|
g.fillRect(x,y+2,x+s-4,y+21);
|
||||||
g.clearRect(x+2,y+4,x+s-6,y+19);
|
g.clearRect(x+2,y+4,x+s-6,y+19);
|
||||||
g.fillRect(x+s-3,y+10,x+s,y+14);
|
g.fillRect(x+s-3,y+10,x+s,y+14);
|
||||||
|
|
||||||
g.setColor(c).fillRect(x+4,y+6,xl,y+17);
|
g.setColor(c).fillRect(x+4,y+6,xl,y+17);
|
||||||
g.setColor(-1);
|
g.setColor(-1);
|
||||||
if (!setting('percentage')) {
|
if (!setting('percentage')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let gfx = g
|
let gfx = g
|
||||||
if (setting('color') === 'Monochrome') {
|
if (setting('color') === 'Monochrome') {
|
||||||
// draw text inverted on battery level
|
// draw text inverted on battery level
|
||||||
gfx = Graphics.createCallback(240, 240, 1,
|
gfx = Graphics.createCallback(240, 240, 1,
|
||||||
(x,y) => {g.setPixel(x,y,x<=xl?0:-1)})
|
(x,y) => {g.setPixel(x,y,x<=xl?0:-1)})
|
||||||
|
}
|
||||||
|
gfx.setFontAlign(-1,-1);
|
||||||
|
if (l >= 100) {
|
||||||
|
gfx.setFont('4x6', 2);
|
||||||
|
gfx.drawString(l, x + 6, y + 7);
|
||||||
|
} else {
|
||||||
|
if (l < 10) x+=6;
|
||||||
|
gfx.setFont('6x8', 2);
|
||||||
|
gfx.drawString(l, x + 6, y + 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
gfx.setFontAlign(-1,-1);
|
// reload widget, e.g. when settings have changed
|
||||||
if (l >= 100) {
|
function reload() {
|
||||||
gfx.setFont('4x6', 2);
|
loadSettings()
|
||||||
gfx.drawString(l, x + 6, y + 7);
|
// need to redraw all widgets, because changing the "charger" setting
|
||||||
} else {
|
// can affect the width and mess with the whole widget layout
|
||||||
if (l < 10) x+=6;
|
setWidth()
|
||||||
gfx.setFont('6x8', 2);
|
g.clear();
|
||||||
gfx.drawString(l, x + 6, y + 4);
|
Bangle.drawWidgets();
|
||||||
|
}
|
||||||
|
// update widget - redraw just widget, or all widgets if size changed
|
||||||
|
function update() {
|
||||||
|
if (setWidth()) Bangle.drawWidgets();
|
||||||
|
else WIDGETS["batpc"].draw();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// reload widget, e.g. when settings have changed
|
|
||||||
function reload() {
|
|
||||||
loadSettings()
|
|
||||||
// need to redraw all widgets, because changing the "charger" setting
|
|
||||||
// can affect the width and mess with the whole widget layout
|
|
||||||
setWidth()
|
|
||||||
g.clear();
|
|
||||||
Bangle.drawWidgets();
|
|
||||||
}
|
|
||||||
// update widget - redraw just widget, or all widgets if size changed
|
|
||||||
function update() {
|
|
||||||
if (setWidth()) Bangle.drawWidgets();
|
|
||||||
else WIDGETS["batpc"].draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
Bangle.on('charging',function(charging) {
|
Bangle.on('charging',function(charging) {
|
||||||
if(charging) Bangle.buzz();
|
if(charging) Bangle.buzz();
|
||||||
update();
|
update();
|
||||||
g.flip();
|
g.flip();
|
||||||
});
|
});
|
||||||
var batteryInterval;
|
var batteryInterval;
|
||||||
Bangle.on('lcdPower', function(on) {
|
Bangle.on('lcdPower', function(on) {
|
||||||
if (on) {
|
if (on) {
|
||||||
update();
|
update();
|
||||||
// refresh once a minute if LCD on
|
// refresh once a minute if LCD on
|
||||||
if (!batteryInterval)
|
if (!batteryInterval)
|
||||||
batteryInterval = setInterval(update, 60000);
|
batteryInterval = setInterval(update, 60000);
|
||||||
} else {
|
} else {
|
||||||
if (batteryInterval) {
|
if (batteryInterval) {
|
||||||
clearInterval(batteryInterval);
|
clearInterval(batteryInterval);
|
||||||
batteryInterval = undefined;
|
batteryInterval = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
WIDGETS["batpc"]={area:"tr",width:40,draw:draw,reload:reload};
|
WIDGETS["batpc"]={area:"tr",width:40,draw:draw,reload:reload};
|
||||||
setWidth();
|
setWidth();
|
||||||
})()
|
})()
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
(function(){
|
(function(){
|
||||||
var img_bt = E.toArrayBuffer(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="));
|
var img_bt = E.toArrayBuffer(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="));
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset();
|
g.reset();
|
||||||
if (NRF.getSecurityStatus().connected)
|
if (NRF.getSecurityStatus().connected)
|
||||||
g.setColor(0,0.5,1);
|
g.setColor(0,0.5,1);
|
||||||
else
|
else
|
||||||
g.setColor(0.3,0.3,0.3);
|
g.setColor(0.3,0.3,0.3);
|
||||||
g.drawImage(img_bt,10+this.x,2+this.y);
|
g.drawImage(img_bt,10+this.x,2+this.y);
|
||||||
}
|
}
|
||||||
function changed() {
|
function changed() {
|
||||||
WIDGETS["bluetooth"].draw();
|
WIDGETS["bluetooth"].draw();
|
||||||
g.flip();// turns screen on
|
g.flip();// turns screen on
|
||||||
}
|
}
|
||||||
NRF.on('connect',changed);
|
NRF.on('connect',changed);
|
||||||
NRF.on('disconnect',changed);
|
NRF.on('disconnect',changed);
|
||||||
WIDGETS["bluetooth"]={area:"tr",width:24,draw:draw};
|
WIDGETS["bluetooth"]={area:"tr",width:24,draw:draw};
|
||||||
})()
|
})()
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
(() => {
|
(() => {
|
||||||
let intervalRef = null;
|
let intervalRef = null;
|
||||||
var width = 5 * 6*2
|
var width = 5 * 6*2
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset().setFont("6x8", 2).setFontAlign(-1, 0);
|
g.reset().setFont("6x8", 2).setFontAlign(-1, 0);
|
||||||
var time = require("locale").time(new Date(),1);
|
var time = require("locale").time(new Date(),1);
|
||||||
g.drawString(time, this.x, this.y+11, true); // 5 * 6*2 = 60
|
g.drawString(time, this.x, this.y+11, true); // 5 * 6*2 = 60
|
||||||
|
}
|
||||||
|
function clearTimers(){
|
||||||
|
if(intervalRef) {
|
||||||
|
clearInterval(intervalRef);
|
||||||
|
intervalRef = null;
|
||||||
}
|
}
|
||||||
function clearTimers(){
|
}
|
||||||
if(intervalRef) {
|
function startTimers(){
|
||||||
clearInterval(intervalRef);
|
intervalRef = setInterval(()=>WIDGETS["wdclk"].draw(), 60*1000);
|
||||||
intervalRef = null;
|
WIDGETS["wdclk"].draw();
|
||||||
}
|
}
|
||||||
}
|
Bangle.on('lcdPower', (on) => {
|
||||||
function startTimers(){
|
clearTimers();
|
||||||
intervalRef = setInterval(()=>WIDGETS["wdclk"].draw(), 60*1000);
|
if (on) startTimers();
|
||||||
WIDGETS["wdclk"].draw();
|
});
|
||||||
}
|
|
||||||
Bangle.on('lcdPower', (on) => {
|
|
||||||
clearTimers();
|
|
||||||
if (on) startTimers();
|
|
||||||
});
|
|
||||||
|
|
||||||
WIDGETS["wdclk"]={area:"tr",width:width,draw:draw};
|
WIDGETS["wdclk"]={area:"tr",width:width,draw:draw};
|
||||||
if (Bangle.isLCDOn) intervalRef = setInterval(()=>WIDGETS["wdclk"].draw(), 60*1000);
|
if (Bangle.isLCDOn) intervalRef = setInterval(()=>WIDGETS["wdclk"].draw(), 60*1000);
|
||||||
})()
|
})()
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
(() => {
|
(() => {
|
||||||
var icon = require("heatshrink").decompress(atob("jEYwIKHgwCBhwCBh4CEggPCkACBmAXDBwVZ+EB+F4gEsjl8EgMP+EChk/gEMh+ehkA+YIBxwxBnF/4HggH/wEAj0AA=="));
|
var icon = require("heatshrink").decompress(atob("jEYwIKHgwCBhwCBh4CEggPCkACBmAXDBwVZ+EB+F4gEsjl8EgMP+EChk/gEMh+ehkA+YIBxwxBnF/4HggH/wEAj0AA=="));
|
||||||
var color = 0x4A69;
|
var color = 0x4A69;
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset().setColor(color).drawImage(icon, this.x + 1, 0);
|
g.reset().setColor(color).drawImage(icon, this.x + 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WIDGETS["widhwt"] = { area: "tr", width: 26, draw: draw };
|
WIDGETS["widhwt"] = { area: "tr", width: 26, draw: draw };
|
||||||
|
|
||||||
Bangle.on('swipe', function() {
|
Bangle.on('swipe', function() {
|
||||||
color = 0x41f;
|
color = 0x41f;
|
||||||
Bangle.buzz();
|
Bangle.buzz();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
color = 0x4A69;
|
color = 0x4A69;
|
||||||
Bangle.buzz(1E3, 1);
|
Bangle.buzz(1E3, 1);
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
}, 35E3);
|
}, 35E3);
|
||||||
|
|
||||||
});
|
});
|
||||||
})();
|
})();
|
|
@ -1,12 +1,12 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
(() => {
|
(() => {
|
||||||
var id = NRF.getAddress().substr().substr(12).split(":");
|
var id = NRF.getAddress().substr().substr(12).split(":");
|
||||||
|
|
||||||
// draw your widget at xpos
|
// draw your widget at xpos
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset().setColor(0, 0.5, 1).setFont("6x8", 1);
|
g.reset().setColor(0, 0.5, 1).setFont("6x8", 1);
|
||||||
g.drawString(id[0], this.x+2, this.y+4, true);
|
g.drawString(id[0], this.x+2, this.y+4, true);
|
||||||
g.drawString(id[1], this.x+2, this.y+14, true);
|
g.drawString(id[1], this.x+2, this.y+14, true);
|
||||||
}
|
}
|
||||||
WIDGETS["widid"] = { area:"tr", width:16, draw: draw };
|
WIDGETS["widid"] = { area:"tr", width:16, draw: draw };
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
(() => {
|
(() => {
|
||||||
|
|
||||||
const BLACK = 0, MOON = 0x41f, MC = 29.5305882, NM = 694039.09;
|
const BLACK = 0, MOON = 0x41f, MC = 29.5305882, NM = 694039.09;
|
||||||
var r = 12, mx = 0, my = 0;
|
var r = 12, mx = 0, my = 0;
|
||||||
|
|
||||||
var moon = {
|
var moon = {
|
||||||
0: () => { g.reset().setColor(BLACK).fillRect(mx - r, my - r, mx + r, my + r);},
|
0: () => { g.reset().setColor(BLACK).fillRect(mx - r, my - r, mx + r, my + r);},
|
||||||
1: () => { moon[0](); g.setColor(MOON).drawCircle(mx, my, r);},
|
1: () => { moon[0](); g.setColor(MOON).drawCircle(mx, my, r);},
|
||||||
2: () => { moon[3](); g.setColor(BLACK).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);},
|
2: () => { moon[3](); g.setColor(BLACK).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);},
|
||||||
3: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r).setColor(BLACK).fillRect(mx - r, my - r, mx, my + r);},
|
3: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r).setColor(BLACK).fillRect(mx - r, my - r, mx, my + r);},
|
||||||
4: () => { moon[3](); g.setColor(MOON).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);},
|
4: () => { moon[3](); g.setColor(MOON).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);},
|
||||||
5: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r);},
|
5: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r);},
|
||||||
6: () => { moon[7](); g.setColor(MOON).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);},
|
6: () => { moon[7](); g.setColor(MOON).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);},
|
||||||
7: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r).setColor(BLACK).fillRect(mx, my - r, mx + r + r, my + r);},
|
7: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r).setColor(BLACK).fillRect(mx, my - r, mx + r + r, my + r);},
|
||||||
8: () => { moon[7](); g.setColor(BLACK).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);}
|
8: () => { moon[7](); g.setColor(BLACK).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);}
|
||||||
};
|
};
|
||||||
|
|
||||||
function moonPhase(d) {
|
function moonPhase(d) {
|
||||||
var tmp, month = d.getMonth(), year = d.getFullYear(), day = d.getDate();
|
var tmp, month = d.getMonth(), year = d.getFullYear(), day = d.getDate();
|
||||||
if (month < 3) {year--; month += 12;}
|
if (month < 3) {year--; month += 12;}
|
||||||
tmp = ((365.25 * year + 30.6 * ++month + day - NM) / MC);
|
tmp = ((365.25 * year + 30.6 * ++month + day - NM) / MC);
|
||||||
return Math.round(((tmp - (tmp | 0)) * 7)+1);
|
return Math.round(((tmp - (tmp | 0)) * 7)+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
mx = this.x; my = this.y + 12;
|
mx = this.x; my = this.y + 12;
|
||||||
moon[moonPhase(Date())]();
|
moon[moonPhase(Date())]();
|
||||||
}
|
}
|
||||||
|
|
||||||
WIDGETS["widmoon"] = { area: "tr", width: 24, draw: draw };
|
WIDGETS["widmoon"] = { area: "tr", width: 24, draw: draw };
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -10,14 +10,14 @@
|
||||||
var ramInterval;
|
var ramInterval;
|
||||||
Bangle.on('lcdPower', function(on) {
|
Bangle.on('lcdPower', function(on) {
|
||||||
if (on) {
|
if (on) {
|
||||||
WIDGETS["ram"].draw();
|
WIDGETS["ram"].draw();
|
||||||
if (!ramInterval) ramInterval = setInterval(()=>WIDGETS["ram"].draw(), 10000);
|
if (!ramInterval) ramInterval = setInterval(()=>WIDGETS["ram"].draw(), 10000);
|
||||||
} else {
|
} else {
|
||||||
if (ramInterval) {
|
if (ramInterval) {
|
||||||
clearInterval(ramInterval);
|
clearInterval(ramInterval);
|
||||||
ramInterval = undefined;
|
ramInterval = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
WIDGETS["ram"]={area:"tl",width: 24,draw:draw};
|
WIDGETS["ram"]={area:"tl",width: 24,draw:draw};
|
||||||
})()
|
})()
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
(() => {
|
(() => {
|
||||||
const CBS = 0x41f, CBC = 0x07E0;
|
const CBS = 0x41f, CBC = 0x07E0;
|
||||||
var batS = require("heatshrink").decompress(atob("j0TwIHEv///kD////EfAYPwuEAgPB4EAg/HCgMfzgDBvwOC/IOC84ONDoUcFgc/AYOAHYRDE"));
|
var batS = require("heatshrink").decompress(atob("j0TwIHEv///kD////EfAYPwuEAgPB4EAg/HCgMfzgDBvwOC/IOC84ONDoUcFgc/AYOAHYRDE"));
|
||||||
var xo = 6, xl = 22, yo = 9, h = 17;
|
var xo = 6, xl = 22, yo = 9, h = 17;
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset().setColor(CBS).drawImage(batS, this.x + 1, this.y + 4);
|
g.reset().setColor(CBS).drawImage(batS, this.x + 1, this.y + 4);
|
||||||
g.setColor(0).fillRect(this.x + xo, this.y + yo, this.x + xl, this.y + h);
|
g.setColor(0).fillRect(this.x + xo, this.y + yo, this.x + xl, this.y + h);
|
||||||
var cbc = (Bangle.isCharging()) ? CBC : CBS;
|
var cbc = (Bangle.isCharging()) ? CBC : CBS;
|
||||||
g.setColor(cbc).fillRect(this.x + xo, this.y + yo, this.x + (xl - xo) / 100 * E.getBattery() + xo, this.y + h);
|
g.setColor(cbc).fillRect(this.x + xo, this.y + yo, this.x + (xl - xo) / 100 * E.getBattery() + xo, this.y + h);
|
||||||
}
|
}
|
||||||
Bangle.on('charging', function(charging) {
|
Bangle.on('charging', function(charging) {
|
||||||
if (charging) Bangle.buzz();
|
if (charging) Bangle.buzz();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
});
|
});
|
||||||
WIDGETS["widtbat"] = { area:"tr", width:32, draw: draw };
|
WIDGETS["widtbat"] = { area:"tr", width:32, draw: draw };
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
(() => {
|
(() => {
|
||||||
var width = 28,
|
var width = 28,
|
||||||
ver = process.env.VERSION.split('.');
|
ver = process.env.VERSION.split('.');
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset().setColor(0, 0.5, 1).setFont("6x8", 1);
|
g.reset().setColor(0, 0.5, 1).setFont("6x8", 1);
|
||||||
g.drawString(ver[0], this.x + 2, this.y + 4, true);
|
g.drawString(ver[0], this.x + 2, this.y + 4, true);
|
||||||
g.setFontAlign(0, -1, 0).drawString(ver[1], this.x + width / 2, this.y + 14, true);
|
g.setFontAlign(0, -1, 0).drawString(ver[1], this.x + width / 2, this.y + 14, true);
|
||||||
}
|
}
|
||||||
WIDGETS["version"] = { area: "tr", width: width, draw: draw };
|
WIDGETS["version"] = { area: "tr", width: width, draw: draw };
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -143,13 +143,13 @@ function renderConfidenceBars(){
|
||||||
if(!confidenceChanged) { return; }
|
if(!confidenceChanged) { return; }
|
||||||
|
|
||||||
if(hrConfidence >= 85){
|
if(hrConfidence >= 85){
|
||||||
g.setColor(0, 255, 0);
|
g.setColor(0, 255, 0);
|
||||||
} else if (hrConfidence >= 50) {
|
} else if (hrConfidence >= 50) {
|
||||||
g.setColor(255, 255, 0);
|
g.setColor(255, 255, 0);
|
||||||
} else if(hrConfidence >= 0){
|
} else if(hrConfidence >= 0){
|
||||||
g.setColor(255, 0, 0);
|
g.setColor(255, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
g.setColor(255, 255, 255);
|
g.setColor(255, 255, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
g.fillRect(45, 110, 55, 150);
|
g.fillRect(45, 110, 55, 150);
|
||||||
|
|
Loading…
Reference in New Issue