From d34faf8a2b2d12652cd1923d600fe9938ed3506e Mon Sep 17 00:00:00 2001 From: JV <61598758+yngv27@users.noreply.github.com> Date: Mon, 23 Aug 2021 16:38:14 -0400 Subject: [PATCH] Update nixie.app.js Works on both Bangle 1 and Bangle 2 --- apps/nixie/nixie.app.js | 318 ++++++++++++++++++++++------------------ 1 file changed, 172 insertions(+), 146 deletions(-) diff --git a/apps/nixie/nixie.app.js b/apps/nixie/nixie.app.js index f1cd245f1..a62590f75 100644 --- a/apps/nixie/nixie.app.js +++ b/apps/nixie/nixie.app.js @@ -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(); +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); g.setFont("8x12", 1); 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 nightMode = false; -function showMsg(msg) { - alarming = true; - g.setFontAlign(0,-1); - 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; +// our scale factor +let xs = 0.5 * wX/240; +let ys = 0.75 * wY/240; let prevH1 = -1; let prevH2 = -1; @@ -52,7 +49,7 @@ let prevM1 = -1; let prevM2 = -1; -let points0 = [ +let points0 = new Uint8Array([ 0, 40, 1, 35, 7, 20, @@ -79,11 +76,11 @@ let points0 = [ 1, 64, 0, 59, 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, 6, 13, 17, 5, @@ -103,11 +100,11 @@ let points2 = [ 0, 25, 8, 80, 0, 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, 26, 42, 15, 46, @@ -148,9 +145,9 @@ let points8 = [ 18, 34, 28, 39, 40, 40, - ]; + ]); -let points6 = [ +let points6 = new Uint8Array([ 50, 0, 4, 56, 1, 66, @@ -171,9 +168,9 @@ let points6 = [ 26, 42, 15, 46, 4, 56, - ]; + ]); -let points3 = [ +let points3 = new Uint8Array([ 1, 77, 6, 87, 17, 94, @@ -190,12 +187,12 @@ let points3 = [ 39, 40, 79, 0, 1, 0 - ]; + ]); -let points7 = [ 0, 0, 79, 0, 30, 99 ]; +let points7 = new Uint8Array([ 0, 0, 79, 0, 30, 99 ]); -let points9 = []; -let points5 = [ +let points9 = new Uint8Array(points6.length); +let points5 = new Uint8Array([ 1, 77, 6, 87, 17, 94, @@ -215,7 +212,7 @@ let points5 = [ 15, 46, 27, 0, 79, 0, - ]; +]); function drawPoints(points, x0, 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]; function eraseDigit(d, x, y) { - if(d < 0) return; - g.setColor("#000000"); + if(d < 0 || d > 9) return; + g.setColor(col_bg); if(nightMode) { drawPoints(pointsArray[d], x, y); return; @@ -263,84 +260,101 @@ function eraseDigit(d, x, y) { function drawDigit(d, x, y) { if(nightMode) { - g.setColor("#206040"); + g.setColor(col_nm); drawPoints(pointsArray[d], x, y); return; } - g.setColor("#202020"); + g.setColor(col_off); for (let idx = pointsArray.length - 1; idx >= 0 ; idx--) { 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); - 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); - g.setColor("#FFC000"); + g.setColor(col_hi); drawPoints(pointsArray[d], x, y); - g.setColor("#202020"); + g.setColor(col_off); } else { drawPoints(pointsArray[idx], x, y); } } } -function drawTime() { - const mstr="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"; +function drawBkgd(nm) { + g.clear(); + prevH1=-1;prevH2=-1;prevM1=-1;prevM2=-1; + if(nm) return; + + if(!isB2) { + // tube images + g.setColor(col_shad2); - let d = new Date(); - let hour = d.getHours(); - let minute = d.getMinutes(); - let month = d.getMonth(); - let date = d.getDate(); + [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); - let h1 = Math.floor(hour / 10); - let h2 = hour % 10; - let m1 = Math.floor(minute / 10); - let m2 = minute % 10; +} + +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) { return; } + nightMode = nm; if(h1 != prevH1) { - eraseDigit(prevH1, 10, 80); - drawDigit(h1, 10, 80); + eraseDigit(prevH1, dx[0], dy[0]); + drawDigit(h1, dx[0], dy[0]); } if(h2 != prevH2) { - eraseDigit(prevH2, 65, 80); - drawDigit(h2, 65, 80); + eraseDigit(prevH2, dx[1], dy[1]); + drawDigit(h2, dx[1], dy[1]); } if(m1 != prevM1) { - eraseDigit(prevM1, 135, 80); - drawDigit(m1, 135, 80); + eraseDigit(prevM1, dx[2], dy[2]); + drawDigit(m1, dx[2], dy[2]); } if(m2 != prevM2) { - eraseDigit(prevM2, 190, 80); - drawDigit(m2, 190, 80); + eraseDigit(prevM2, dx[3], dy[3]); + 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; prevH2 = h2; prevM1 = m1; @@ -348,56 +362,68 @@ function drawTime() { } -function btn1Func() { - if(alarming) { - alarming = false; - } else { - nightMode = !nightMode; - g.setRotation(nightMode ? 1 : 0, 0); - } - g.clear(); - prevH1 = -1; - prevH2 = -1; - prevM1 = -1; - prevM2 = -1; - drawTime(); -} - -function stop () { - if (interval) { - clearInterval(interval); +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)); } } -function start () { - if (interval) { - clearInterval(interval); - } - interval = setInterval(drawTime, 10000); - drawTime(); +//setWatch(E.showLauncher, BTN1, {repeat:true,edge:"falling"}); +if(EMULATOR) { + let d = new Date(); + + let hour = d.getHours(); + 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; -});