parent
f17f4e6148
commit
d34faf8a2b
|
|
@ -1,50 +1,47 @@
|
||||||
|
const EMULATOR = false;
|
||||||
|
// which Bangle?
|
||||||
|
const isB2 = g.getWidth() < 200;
|
||||||
|
|
||||||
|
// global coordinate system
|
||||||
|
const wX = g.getWidth();
|
||||||
|
const wY = g.getHeight();
|
||||||
|
const midX = wX/2, midY = wY/2;
|
||||||
|
// relative positioning: send 0 <= coord < 1
|
||||||
|
function relX(x) { return Math.floor(x*wX); }
|
||||||
|
function relY(y) { return Math.floor(y*wY); }
|
||||||
|
|
||||||
|
// colors
|
||||||
|
const col_bg = 0;
|
||||||
|
const col_nm =isB2 ? 1 :"#206040";
|
||||||
|
const col_sep = isB2 ? 6 :"#202020";
|
||||||
|
const col_off = isB2 ? 1 : "#202020";
|
||||||
|
const col_shad1 = isB2 ? 4 :"#FF0000";
|
||||||
|
const col_shad2 = isB2 ? 6 :"#FF6000";
|
||||||
|
const col_hi =isB2 ? 7 : "#FFC000";
|
||||||
|
const col_data = isB2 ? 6 :"#C06000";
|
||||||
|
|
||||||
|
g.setBgColor(col_bg);
|
||||||
g.clear();
|
g.clear();
|
||||||
|
|
||||||
|
var imgTube = {
|
||||||
|
width : 64, height : 128, bpp : 2,
|
||||||
|
buffer : require("heatshrink").decompress(atob("AE9AB7sQD54AOiFQB5tVsgPN0uoBxkByEFB5kGyIPNhVVB5tpLwKAMoJuOgNQggMJgtVDhsVqtEZ5cVrWlEBcFtWq1WlJxUaBwOq1IgJgIdCqoABEBEC1WVBwTkGKgUGFYIOCgIRDC4kaFoVUOQQKCQ4IgCB4YKDCYIgCq2QgEqHwJLIEoOkgFqB4KaIEoNkB4Z7JHQVqquqD5EVDYQPCVRIPE1IPKgsAtJTCAA8GyEBD4TrKqAPOgNRB5sRB5wfPgAPOiA/RP4IPaiD6BB5oCBB5kAdQIPNH5wPCvIPMBgIPMR4QPcL4QPNgIPQvS/MqtAB59+B9cVB91VL91BF91RF79RB4OVD5wPsH59BB51FB5sQB/0AD7xvPV4elD5wPLqIPOgJPeX/6//X8YPMH5wPPL74PfN55PQB6TfPB5afDB51/D57P/Z/7P/B97vOB5kAB58VoAA="))
|
||||||
|
};
|
||||||
|
var imgTubeBW = {
|
||||||
|
width : 46, height : 92, bpp : 1,
|
||||||
|
buffer : require("heatshrink").decompress(atob("AD0EAomAAgcCBQkQEykwAgcP/gFD/wKECok4AgcB4A7DgwQEjAFEsYWExg2DhkgAoVAE4kA8AEDgZqEhw+JgA+DCwIKEhhrJCyJELFqBbQIiByLIk6gWZyC3WOSItWOVq3nCywA="))
|
||||||
|
};
|
||||||
|
|
||||||
require("Font8x12").add(Graphics);
|
require("Font8x12").add(Graphics);
|
||||||
g.setFont("8x12", 1);
|
g.setFont("8x12", 1);
|
||||||
let interval = null;
|
let interval = null;
|
||||||
let stepCounter = 0;
|
|
||||||
|
|
||||||
let msgs = require("Storage").readJSON('yngv27.msgs.json');
|
|
||||||
let alarms = require("Storage").readJSON('yngv27.alarm.json');
|
|
||||||
|
|
||||||
let alarming = false;
|
let alarming = false;
|
||||||
let nightMode = false;
|
let nightMode = false;
|
||||||
|
|
||||||
function showMsg(msg) {
|
// our scale factor
|
||||||
alarming = true;
|
let xs = 0.5 * wX/240;
|
||||||
g.setFontAlign(0,-1);
|
let ys = 0.75 * wY/240;
|
||||||
g.setColor(1,1,1);
|
|
||||||
g.drawString("<< ALARM >>", 120, 180, true);
|
|
||||||
g.drawString(msg, 120, 200, true);
|
|
||||||
Bangle.buzz();
|
|
||||||
setTimeout(Bangle.buzz, 800);
|
|
||||||
setTimeout(Bangle.buzz, 1600);
|
|
||||||
setTimeout(Bangle.buzz, 2400);
|
|
||||||
setTimeout(Bangle.buzz, 3200);
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkMsgs() {
|
|
||||||
for(let idx=0; idx < alarms.length; idx++) {
|
|
||||||
let tdiff = Date.now() - Date.parse(alarms[idx].time);
|
|
||||||
// 10 sec margin of error
|
|
||||||
if(tdiff > 0 && tdiff < 10000) {
|
|
||||||
showMsg(alarms[idx].msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(let idx=0; idx < alarms.length; idx++) {
|
|
||||||
let tdiff = Date.parse(alarms[idx].time) - Date.now();
|
|
||||||
let msg = alarms[idx].msg;
|
|
||||||
if(tdiff > 0) {
|
|
||||||
/*console.log(`will alarm ${msg} in ${tdiff}`);*/
|
|
||||||
setTimeout(checkMsgs, tdiff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let xs = 0.5;
|
|
||||||
let ys = 0.75;
|
|
||||||
|
|
||||||
let prevH1 = -1;
|
let prevH1 = -1;
|
||||||
let prevH2 = -1;
|
let prevH2 = -1;
|
||||||
|
|
@ -52,7 +49,7 @@ let prevM1 = -1;
|
||||||
let prevM2 = -1;
|
let prevM2 = -1;
|
||||||
|
|
||||||
|
|
||||||
let points0 = [
|
let points0 = new Uint8Array([
|
||||||
0, 40,
|
0, 40,
|
||||||
1, 35,
|
1, 35,
|
||||||
7, 20,
|
7, 20,
|
||||||
|
|
@ -79,11 +76,11 @@ let points0 = [
|
||||||
1, 64,
|
1, 64,
|
||||||
0, 59,
|
0, 59,
|
||||||
0, 40
|
0, 40
|
||||||
];
|
]);
|
||||||
|
|
||||||
let points1 = [ 40, 99, 40, 0];
|
let points1 = new Uint8Array([ 40, 99, 40, 0]);
|
||||||
|
|
||||||
let points2 = [ 0, 25,
|
let points2 = new Uint8Array([ 0, 25,
|
||||||
2, 22,
|
2, 22,
|
||||||
6, 13,
|
6, 13,
|
||||||
17, 5,
|
17, 5,
|
||||||
|
|
@ -103,11 +100,11 @@ let points2 = [ 0, 25,
|
||||||
8, 80,
|
8, 80,
|
||||||
0, 99,
|
0, 99,
|
||||||
79, 99
|
79, 99
|
||||||
];
|
]);
|
||||||
|
|
||||||
let points4 = [ 60, 99, 60, 0, 0, 75, 79, 75 ];
|
let points4 = new Uint8Array([ 60, 99, 60, 0, 0, 75, 79, 75 ]);
|
||||||
|
|
||||||
let points8 = [
|
let points8 = new Uint8Array([
|
||||||
40, 40,
|
40, 40,
|
||||||
26, 42,
|
26, 42,
|
||||||
15, 46,
|
15, 46,
|
||||||
|
|
@ -148,9 +145,9 @@ let points8 = [
|
||||||
18, 34,
|
18, 34,
|
||||||
28, 39,
|
28, 39,
|
||||||
40, 40,
|
40, 40,
|
||||||
];
|
]);
|
||||||
|
|
||||||
let points6 = [
|
let points6 = new Uint8Array([
|
||||||
50, 0,
|
50, 0,
|
||||||
4, 56,
|
4, 56,
|
||||||
1, 66,
|
1, 66,
|
||||||
|
|
@ -171,9 +168,9 @@ let points6 = [
|
||||||
26, 42,
|
26, 42,
|
||||||
15, 46,
|
15, 46,
|
||||||
4, 56,
|
4, 56,
|
||||||
];
|
]);
|
||||||
|
|
||||||
let points3 = [
|
let points3 = new Uint8Array([
|
||||||
1, 77,
|
1, 77,
|
||||||
6, 87,
|
6, 87,
|
||||||
17, 94,
|
17, 94,
|
||||||
|
|
@ -190,12 +187,12 @@ let points3 = [
|
||||||
39, 40,
|
39, 40,
|
||||||
79, 0,
|
79, 0,
|
||||||
1, 0
|
1, 0
|
||||||
];
|
]);
|
||||||
|
|
||||||
let points7 = [ 0, 0, 79, 0, 30, 99 ];
|
let points7 = new Uint8Array([ 0, 0, 79, 0, 30, 99 ]);
|
||||||
|
|
||||||
let points9 = [];
|
let points9 = new Uint8Array(points6.length);
|
||||||
let points5 = [
|
let points5 = new Uint8Array([
|
||||||
1, 77,
|
1, 77,
|
||||||
6, 87,
|
6, 87,
|
||||||
17, 94,
|
17, 94,
|
||||||
|
|
@ -215,7 +212,7 @@ let points5 = [
|
||||||
15, 46,
|
15, 46,
|
||||||
27, 0,
|
27, 0,
|
||||||
79, 0,
|
79, 0,
|
||||||
];
|
]);
|
||||||
|
|
||||||
function drawPoints(points, x0, y0) {
|
function drawPoints(points, x0, y0) {
|
||||||
let x = points[0]*xs+x0, y = points[1]*ys+y0;
|
let x = points[0]*xs+x0, y = points[1]*ys+y0;
|
||||||
|
|
@ -245,8 +242,8 @@ for (let idx=0; idx*2 < points6.length; idx++) {
|
||||||
pointsArray = [points0, points1, points2, points3, points4, points5, points6, points7, points8, points9];
|
pointsArray = [points0, points1, points2, points3, points4, points5, points6, points7, points8, points9];
|
||||||
|
|
||||||
function eraseDigit(d, x, y) {
|
function eraseDigit(d, x, y) {
|
||||||
if(d < 0) return;
|
if(d < 0 || d > 9) return;
|
||||||
g.setColor("#000000");
|
g.setColor(col_bg);
|
||||||
if(nightMode) {
|
if(nightMode) {
|
||||||
drawPoints(pointsArray[d], x, y);
|
drawPoints(pointsArray[d], x, y);
|
||||||
return;
|
return;
|
||||||
|
|
@ -263,84 +260,101 @@ function eraseDigit(d, x, y) {
|
||||||
|
|
||||||
function drawDigit(d, x, y) {
|
function drawDigit(d, x, y) {
|
||||||
if(nightMode) {
|
if(nightMode) {
|
||||||
g.setColor("#206040");
|
g.setColor(col_nm);
|
||||||
drawPoints(pointsArray[d], x, y);
|
drawPoints(pointsArray[d], x, y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
g.setColor("#202020");
|
g.setColor(col_off);
|
||||||
for (let idx = pointsArray.length - 1; idx >= 0 ; idx--) {
|
for (let idx = pointsArray.length - 1; idx >= 0 ; idx--) {
|
||||||
if(idx == d) {
|
if(idx == d) {
|
||||||
g.setColor("#FF0000");
|
g.setColor(col_shad1);
|
||||||
drawPoints(pointsArray[d], x-2, y-2);
|
drawPoints(pointsArray[d], x-2, y-2);
|
||||||
drawPoints(pointsArray[d], x+2, y-2);
|
drawPoints(pointsArray[d], x+2, y-2);
|
||||||
drawPoints(pointsArray[d], x-2, y+2);
|
drawPoints(pointsArray[d], x-2, y+2);
|
||||||
drawPoints(pointsArray[d], x+2, y+2);
|
drawPoints(pointsArray[d], x+2, y+2);
|
||||||
g.setColor("#FF6000");
|
g.setColor(col_shad2);
|
||||||
drawPoints(pointsArray[d], x-1, y-1);
|
drawPoints(pointsArray[d], x-1, y-1);
|
||||||
drawPoints(pointsArray[d], x+1, y-1);
|
drawPoints(pointsArray[d], x+1, y-1);
|
||||||
drawPoints(pointsArray[d], x-1, y+1);
|
drawPoints(pointsArray[d], x-1, y+1);
|
||||||
drawPoints(pointsArray[d], x+1, y+1);
|
drawPoints(pointsArray[d], x+1, y+1);
|
||||||
|
|
||||||
g.setColor("#FFC000");
|
g.setColor(col_hi);
|
||||||
drawPoints(pointsArray[d], x, y);
|
drawPoints(pointsArray[d], x, y);
|
||||||
|
|
||||||
g.setColor("#202020");
|
g.setColor(col_off);
|
||||||
} else {
|
} else {
|
||||||
drawPoints(pointsArray[idx], x, y);
|
drawPoints(pointsArray[idx], x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawTime() {
|
function drawBkgd(nm) {
|
||||||
const mstr="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
|
g.clear();
|
||||||
|
prevH1=-1;prevH2=-1;prevM1=-1;prevM2=-1;
|
||||||
|
if(nm) return;
|
||||||
|
|
||||||
let d = new Date();
|
if(!isB2) {
|
||||||
let hour = d.getHours();
|
// tube images
|
||||||
let minute = d.getMinutes();
|
g.setColor(col_shad2);
|
||||||
let month = d.getMonth();
|
|
||||||
let date = d.getDate();
|
|
||||||
|
|
||||||
let h1 = Math.floor(hour / 10);
|
[relX(0),relX(0.25),relX(0.5),relX(0.75)].forEach((v,i,a) => {
|
||||||
let h2 = hour % 10;
|
g.drawImage(imgTube,v,relY(0.225));
|
||||||
let m1 = Math.floor(minute / 10);
|
});
|
||||||
let m2 = minute % 10;
|
// something to sit on
|
||||||
|
g.setColor(col_shad2);
|
||||||
|
g.fillRect(0, relY(0.76),wX,relY(0.76));
|
||||||
|
} else {
|
||||||
|
// simple tubes
|
||||||
|
[1,45,89,133].forEach((v,i,a) => {
|
||||||
|
g.setColor(col_shad1);
|
||||||
|
g.drawEllipse(v, 52, v+41, 90);
|
||||||
|
g.drawRect(v,66,v+41,125);
|
||||||
|
g.clearRect(v+1,66,v+40,124);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
g.setColor(col_shad2);
|
||||||
|
g.moveTo(relX(0.125), 0);
|
||||||
|
g.lineTo(relX(0.25), relY(0.125));
|
||||||
|
g.lineTo(relX(0.75), relY(0.125));
|
||||||
|
g.lineTo(relX(0.875),0);
|
||||||
|
|
||||||
|
g.moveTo(relX(0.125), wY);
|
||||||
|
g.lineTo(relX(0.25), relY(0.875));
|
||||||
|
g.lineTo(relX(0.75), relY(0.875));
|
||||||
|
g.lineTo(relX(0.875), wY);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawTime(d,nm) {
|
||||||
|
const dx = [relX(0.042), relX(0.29), relX(0.55), relX(0.791)]; //[ 10, 65, 135, 190];
|
||||||
|
const dy = [relY(0.38),relY(0.38),relY(0.38),relY(0.38)];
|
||||||
|
|
||||||
|
let h1 = Math.floor(d.hour / 10);
|
||||||
|
let h2 = d.hour % 10;
|
||||||
|
let m1 = Math.floor(d.min / 10);
|
||||||
|
let m2 = d.min % 10;
|
||||||
|
|
||||||
if(h1 == prevH1 && h2 == prevH2 && m1 == prevM1 && m2 == prevM2) {
|
if(h1 == prevH1 && h2 == prevH2 && m1 == prevM1 && m2 == prevM2) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
nightMode = nm;
|
||||||
|
|
||||||
if(h1 != prevH1) {
|
if(h1 != prevH1) {
|
||||||
eraseDigit(prevH1, 10, 80);
|
eraseDigit(prevH1, dx[0], dy[0]);
|
||||||
drawDigit(h1, 10, 80);
|
drawDigit(h1, dx[0], dy[0]);
|
||||||
}
|
}
|
||||||
if(h2 != prevH2) {
|
if(h2 != prevH2) {
|
||||||
eraseDigit(prevH2, 65, 80);
|
eraseDigit(prevH2, dx[1], dy[1]);
|
||||||
drawDigit(h2, 65, 80);
|
drawDigit(h2, dx[1], dy[1]);
|
||||||
}
|
}
|
||||||
if(m1 != prevM1) {
|
if(m1 != prevM1) {
|
||||||
eraseDigit(prevM1, 135, 80);
|
eraseDigit(prevM1, dx[2], dy[2]);
|
||||||
drawDigit(m1, 135, 80);
|
drawDigit(m1, dx[2], dy[2]);
|
||||||
}
|
}
|
||||||
if(m2 != prevM2) {
|
if(m2 != prevM2) {
|
||||||
eraseDigit(prevM2, 190, 80);
|
eraseDigit(prevM2, dx[3], dy[3]);
|
||||||
drawDigit(m2, 190, 80);
|
drawDigit(m2, dx[3], dy[3]);
|
||||||
}
|
}
|
||||||
if(!nightMode) {
|
|
||||||
g.setColor("#000000");
|
|
||||||
g.fillRect(0, 10, 240, 24);
|
|
||||||
g.fillRect(0, 222, 240, 240);
|
|
||||||
g.setColor("#202020");
|
|
||||||
g.drawLine(0, 24, 239, 24);
|
|
||||||
g.drawLine(0, 226, 239, 226);
|
|
||||||
g.setColor("#C06000");
|
|
||||||
g.setFontAlign(0, -1);
|
|
||||||
g.drawString(mstr.slice(month*3,month*3+3) + " " + date, 120, 10);
|
|
||||||
g.setFontAlign(-1,-1);
|
|
||||||
g.drawString("STEP " + stepCounter, 0, 230);
|
|
||||||
g.setFontAlign(1,-1);
|
|
||||||
g.drawString("BTY "+E.getBattery(), 240, 230);
|
|
||||||
}
|
|
||||||
|
|
||||||
prevH1 = h1;
|
prevH1 = h1;
|
||||||
prevH2 = h2;
|
prevH2 = h2;
|
||||||
prevM1 = m1;
|
prevM1 = m1;
|
||||||
|
|
@ -348,56 +362,68 @@ function drawTime() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function btn1Func() {
|
function drawData(d) {
|
||||||
if(alarming) {
|
if(!nightMode) {
|
||||||
alarming = false;
|
g.setColor(col_data);
|
||||||
} else {
|
g.setFontAlign(0, -1);
|
||||||
nightMode = !nightMode;
|
g.drawString(` ${d.dow}, ${d.mon3} ${d.date} `, wX/2, relX(0.042), true);
|
||||||
g.setRotation(nightMode ? 1 : 0, 0);
|
g.setFontAlign(-1,-1);
|
||||||
}
|
g.drawString("STEP ", 0, relY(0.82), true);
|
||||||
g.clear();
|
g.drawString(`${d.steps} `,0, relY(0.875), true);
|
||||||
prevH1 = -1;
|
g.setFontAlign(1,-1);
|
||||||
prevH2 = -1;
|
g.drawString(" BTY", relX(0.999), relY(0.82), true);
|
||||||
prevM1 = -1;
|
g.drawString(` ${d.batt}`, relX(0.999), relY(0.875), true);
|
||||||
prevM2 = -1;
|
g.setFontAlign(0,-1);
|
||||||
drawTime();
|
g.setColor(col_shad2);
|
||||||
}
|
g.drawString('BANGLE.JS', wX/2, relY(0.925));
|
||||||
|
|
||||||
function stop () {
|
|
||||||
if (interval) {
|
|
||||||
clearInterval(interval);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function start () {
|
//setWatch(E.showLauncher, BTN1, {repeat:true,edge:"falling"});
|
||||||
if (interval) {
|
if(EMULATOR) {
|
||||||
clearInterval(interval);
|
let d = new Date();
|
||||||
}
|
|
||||||
interval = setInterval(drawTime, 10000);
|
let hour = d.getHours();
|
||||||
drawTime();
|
let minute = d.getMinutes();
|
||||||
|
|
||||||
|
let h1 = Math.floor(hour / 10);
|
||||||
|
let h2 = hour % 10;
|
||||||
|
let m1 = Math.floor(minute / 10);
|
||||||
|
let m2 = minute % 10;
|
||||||
|
|
||||||
|
let data = {
|
||||||
|
h1: h1,
|
||||||
|
h2: h2,
|
||||||
|
m1: m1,
|
||||||
|
m2: m2,
|
||||||
|
hour: hour,
|
||||||
|
min: minute,
|
||||||
|
};
|
||||||
|
|
||||||
|
drawBkgd(nightMode);
|
||||||
|
|
||||||
|
drawTime(data, nightMode);
|
||||||
|
const mstr="JanFebMarAprMayJunJulAugSepOctNovDec";
|
||||||
|
const dowstr = "SunMonTueWedThuFriSat";
|
||||||
|
|
||||||
|
let month = d.getMonth();
|
||||||
|
let dow = d.getDay();
|
||||||
|
data.month = month;
|
||||||
|
data.date = d.getDate();
|
||||||
|
|
||||||
|
data.mon3 = mstr.slice(month*3,month*3+3);
|
||||||
|
data.dow = dowstr.substr(dow*3,3);
|
||||||
|
data.dateStr = data.dow + " " + data.mon3 + " " + data.date;
|
||||||
|
data.steps = 12345;
|
||||||
|
data.batt = E.getBattery() + (Bangle.isCharging() ? "+" : "");
|
||||||
|
data.charging = Bangle.isCharging();
|
||||||
|
|
||||||
|
drawData(data);
|
||||||
|
} else {
|
||||||
|
Bangle.setUI("clock");
|
||||||
|
let v = require("m_vatch.js");
|
||||||
|
v.setDrawTime(drawTime);
|
||||||
|
v.setDrawBackground(drawBkgd);
|
||||||
|
v.setDrawData(drawData);
|
||||||
|
v.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
start();
|
|
||||||
|
|
||||||
|
|
||||||
Bangle.on('lcdPower', function (on) {
|
|
||||||
if (on) {
|
|
||||||
start();
|
|
||||||
} else {
|
|
||||||
stop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
function btn3Func() {
|
|
||||||
showMsg("This is a test message");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show launcher when middle button pressed
|
|
||||||
setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
|
|
||||||
// redraw
|
|
||||||
setWatch(btn1Func, BTN1, {repeat:true,edge:"falling"});
|
|
||||||
setWatch(btn3Func, BTN3, {repeat:true,edge:"falling"});
|
|
||||||
Bangle.on('step', function(cnt) {
|
|
||||||
stepCounter = cnt / 10;
|
|
||||||
});
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue