BangleApps/apps/nixie/app.js

428 lines
9.4 KiB
JavaScript
Raw Normal View History

const EMULATOR = false;
// which Bangle?
const isB2 = g.getWidth() < 200;
// global coordinate system
const wX = g.getWidth();
const wY = g.getHeight();
// 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";
2024-03-04 20:34:50 +00:00
//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);
2020-07-17 18:38:24 +00:00
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="))
};
2024-03-04 20:34:50 +00:00
/*var imgTubeBW = {
width : 46, height : 92, bpp : 1,
buffer : require("heatshrink").decompress(atob("AD0EAomAAgcCBQkQEykwAgcP/gFD/wKECok4AgcB4A7DgwQEjAFEsYWExg2DhkgAoVAE4kA8AEDgZqEhw+JgA+DCwIKEhhrJCyJELFqBbQIiByLIk6gWZyC3WOSItWOVq3nCywA="))
2024-03-04 20:34:50 +00:00
};*/
2020-07-17 18:38:24 +00:00
require("Font8x12").add(Graphics);
g.setFont("8x12", 1);
2024-03-04 20:34:50 +00:00
//let alarming = false;
2020-07-17 18:58:08 +00:00
let nightMode = false;
// our scale factor
let xs = 0.5 * wX/240;
let ys = 0.75 * wY/240;
2020-07-17 18:38:24 +00:00
let prevH1 = -1;
let prevH2 = -1;
let prevM1 = -1;
let prevM2 = -1;
let points0 = new Uint8Array([
2020-07-17 18:38:24 +00:00
0, 40,
1, 35,
7, 20,
16, 8,
28, 2,
40, 0,
51, 2,
63, 10,
72, 20,
77, 35,
78, 40,
78, 59,
77, 64,
72, 79,
63, 89,
51, 97,
40, 99,
28, 97,
16, 91,
7, 79,
1, 64,
0, 59,
0, 40
]);
2020-07-17 18:38:24 +00:00
let points1 = new Uint8Array([ 40, 99, 40, 0]);
2020-07-17 18:38:24 +00:00
let points2 = new Uint8Array([ 0, 25,
2020-07-17 18:38:24 +00:00
2, 22,
6, 13,
17, 5,
28, 2,
40, 0,
52, 2,
63, 5,
74, 13,
79, 23,
79, 28,
74, 38,
63, 46,
51, 54,
40, 58,
29, 62,
17, 68,
8, 80,
0, 99,
79, 99
]);
2020-07-17 18:38:24 +00:00
let points4 = new Uint8Array([ 60, 99, 60, 0, 0, 75, 79, 75 ]);
2020-07-17 18:38:24 +00:00
let points8 = new Uint8Array([
2020-07-17 18:38:24 +00:00
40, 40,
26, 42,
15, 46,
4, 56,
1, 66,
1, 77,
6, 87,
17, 94,
28, 97,
38, 99,
42, 99,
52, 97,
63, 94,
74, 87,
79, 77,
79, 66,
75, 56,
64, 46,
54, 42,
40, 40,
52, 39,
62, 34,
69, 29,
72, 23,
72, 19,
69, 12,
62, 6,
52, 2,
40, 0,
28, 2,
18, 6,
11, 12,
8, 19,
8, 23,
11, 29,
18, 34,
28, 39,
40, 40,
]);
2020-07-17 18:38:24 +00:00
let points6 = new Uint8Array([
2020-07-17 18:38:24 +00:00
50, 0,
4, 56,
1, 66,
1, 77,
6, 87,
17, 94,
28, 97,
40, 99,
52, 97,
63, 94,
74, 87,
79, 77,
79, 66,
75, 56,
64, 46,
52, 42,
40, 40,
26, 42,
15, 46,
4, 56,
]);
2020-07-17 18:38:24 +00:00
let points3 = new Uint8Array([
2020-07-17 18:38:24 +00:00
1, 77,
6, 87,
17, 94,
28, 97,
40, 99,
52, 97,
63, 94,
74, 87,
79, 77,
79, 66,
75, 56,
64, 46,
52, 42,
39, 40,
79, 0,
1, 0
]);
2020-07-17 18:38:24 +00:00
let points7 = new Uint8Array([ 0, 0, 79, 0, 30, 99 ]);
2020-07-17 18:38:24 +00:00
let points9 = new Uint8Array(points6.length);
let points5 = new Uint8Array([
2020-07-17 18:38:24 +00:00
1, 77,
6, 87,
17, 94,
28, 97,
38, 99,
42, 99,
52, 97,
63, 94,
74, 87,
79, 77,
79, 66,
75, 56,
64, 46,
54, 42,
40, 40,
26, 42,
15, 46,
27, 0,
79, 0,
]);
2020-07-17 18:38:24 +00:00
function drawPoints(points, x0, y0) {
let x = points[0]*xs+x0, y = points[1]*ys+y0;
//g.drawEllipse(x-2, y-2, x+2, y+2);
g.moveTo(x, y);
for(let idx=1; idx*2 < points.length; idx ++) {
let x = points[idx*2]*xs+x0;
let y = points[idx*2+1]*ys+y0;
//g.drawEllipse(x-2, y-2, x+2, y+2);
g.lineTo(x, y);
}
}
2020-07-17 18:58:08 +00:00
/* create 5 from 2 */
/* uncomment if you want the 5 to look more authentic (but uglier)
2020-07-17 18:38:24 +00:00
for (let idx=0; idx*2 < points2.length; idx++) {
points5[idx*2] = points2[idx*2];
points5[idx*2+1] = 99-points2[idx*2+1];
}
*/
2020-07-17 18:58:08 +00:00
/* create 9 from 6 */
2020-07-17 18:38:24 +00:00
for (let idx=0; idx*2 < points6.length; idx++) {
points9[idx*2] = 79-points6[idx*2];
points9[idx*2+1] = 99-points6[idx*2+1];
}
2024-03-13 10:51:40 +00:00
const pointsArray = [points0, points1, points2, points3, points4, points5, points6, points7, points8, points9];
2020-07-17 18:38:24 +00:00
function eraseDigit(d, x, y) {
if(d < 0 || d > 9) return;
g.setColor(col_bg);
2020-07-17 18:58:08 +00:00
if(nightMode) {
drawPoints(pointsArray[d], x, y);
return;
}
drawPoints(pointsArray[d], x-2, y-2);
2020-07-17 18:38:24 +00:00
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-1, y-1);
drawPoints(pointsArray[d], x+1, y-1);
drawPoints(pointsArray[d], x-1, y+1);
drawPoints(pointsArray[d], x+1, y+1);
}
function drawDigit(d, x, y) {
2020-07-17 18:58:08 +00:00
if(nightMode) {
g.setColor(col_nm);
2020-07-17 18:58:08 +00:00
drawPoints(pointsArray[d], x, y);
return;
}
g.setColor(col_off);
2020-07-17 18:38:24 +00:00
for (let idx = pointsArray.length - 1; idx >= 0 ; idx--) {
if(idx == d) {
g.setColor(col_shad1);
2020-07-17 18:38:24 +00:00
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(col_shad2);
2020-07-17 18:38:24 +00:00
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);
2020-07-17 18:58:08 +00:00
g.setColor(col_hi);
2020-07-17 18:38:24 +00:00
drawPoints(pointsArray[d], x, y);
g.setColor(col_off);
2020-07-17 18:38:24 +00:00
} else {
drawPoints(pointsArray[idx], x, y);
}
}
}
2020-07-17 18:58:08 +00:00
function drawBkgd(nm) {
g.clear();
prevH1=-1;prevH2=-1;prevM1=-1;prevM2=-1;
if(nm) return;
if(!isB2) {
// tube images
g.setColor(col_shad2);
[relX(0),relX(0.25),relX(0.5),relX(0.75)].forEach((v,i,a) => {
g.drawImage(imgTube,v,relY(0.225));
});
// 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);
2020-07-17 18:38:24 +00:00
}
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;
2020-07-17 18:38:24 +00:00
if(h1 == prevH1 && h2 == prevH2 && m1 == prevM1 && m2 == prevM2) {
return;
}
nightMode = nm;
2020-07-17 18:58:08 +00:00
2020-07-17 18:38:24 +00:00
if(h1 != prevH1) {
eraseDigit(prevH1, dx[0], dy[0]);
drawDigit(h1, dx[0], dy[0]);
2020-07-17 18:38:24 +00:00
}
if(h2 != prevH2) {
eraseDigit(prevH2, dx[1], dy[1]);
drawDigit(h2, dx[1], dy[1]);
2020-07-17 18:38:24 +00:00
}
if(m1 != prevM1) {
eraseDigit(prevM1, dx[2], dy[2]);
drawDigit(m1, dx[2], dy[2]);
2020-07-17 18:58:08 +00:00
}
2020-07-17 18:38:24 +00:00
if(m2 != prevM2) {
eraseDigit(prevM2, dx[3], dy[3]);
drawDigit(m2, dx[3], dy[3]);
2020-07-17 18:58:08 +00:00
}
2020-07-17 18:38:24 +00:00
prevH1 = h1;
prevH2 = h2;
prevM1 = m1;
prevM2 = m2;
2020-07-17 18:58:08 +00:00
}
function drawData(d) {
if(!nightMode) {
g.setColor(col_data);
g.setFontAlign(0, -1);
g.drawString(` ${d.dow}, ${d.mon3} ${d.date} `, wX/2, relX(0.042), true);
g.setFontAlign(-1,-1);
g.drawString("STEP ", 0, relY(0.82), true);
g.drawString(`${d.steps} `,0, relY(0.875), true);
g.setFontAlign(1,-1);
g.drawString(" BTY", relX(0.999), relY(0.82), true);
g.drawString(` ${d.batt}`, relX(0.999), relY(0.875), true);
g.setFontAlign(0,-1);
g.setColor(col_shad2);
g.drawString('BANGLE.JS', wX/2, relY(0.925));
2020-07-17 18:58:08 +00:00
}
2020-07-17 18:38:24 +00:00
}
//setWatch(E.showLauncher, BTN1, {repeat:true,edge:"falling"});
if(EMULATOR) {
let d = new Date();
2020-07-17 18:38:24 +00:00
let hour = d.getHours();
let minute = d.getMinutes();
2020-07-17 18:38:24 +00:00
let h1 = Math.floor(hour / 10);
let h2 = hour % 10;
let m1 = Math.floor(minute / 10);
let m2 = minute % 10;
2020-07-17 18:38:24 +00:00
let data = {
h1: h1,
h2: h2,
m1: m1,
m2: m2,
hour: hour,
min: minute,
};
2020-07-17 18:38:24 +00:00
drawBkgd(nightMode);
2020-07-17 18:38:24 +00:00
drawTime(data, nightMode);
const mstr="JanFebMarAprMayJunJulAugSepOctNovDec";
const dowstr = "SunMonTueWedThuFriSat";
2020-07-17 18:38:24 +00:00
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();
2020-07-17 18:38:24 +00:00
}