Last active
August 13, 2021 18:04
-
-
Save gfwilliams/0120896239b7abbe45f008dd27e7b131 to your computer and use it in GitHub Desktop.
Code for Bangle in Jim's MR2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Where on the screen are we? | |
var W = 240; | |
var H = 180; | |
var X = 0; | |
var Y = 30; | |
// Misc setup | |
require("Font7x11Numeric7Seg").add(Graphics); | |
Bangle.setLCDPower(1); | |
Bangle.setLCDTimeout(0); | |
if (Bangle.setLocked) Bangle.setLocked(false); | |
Bluetooth.setConsole(1); // stop console cocking stuff up | |
if (!g.theme) g.theme = {fg:-1,bg:0}; | |
// vars | |
var SLEEP_TIMEOUT = 10*60*1000; // time after which to sleep in msec. 10 min | |
var modeIndex = 0; | |
var SLEEPING = false; | |
var CURRENTMODE; | |
var lastPoked = Date.now(); // when should we last have gone to sleep? | |
// util functions | |
function resetGFX() { | |
Bangle.setLCDOffset(0); | |
//Bangle.lcdWr(0x36,0xA0);Bangle.lcdWr(0x37,[0,0x50]); for other way | |
Bangle.lcdWr(0x36,0x60); Bangle.lcdWr(0x37,[0,0]); | |
g.clear(1); | |
} | |
function changeMode(newMode) { | |
if (CURRENTMODE) CURRENTMODE.kill(); | |
modeIndex = newMode; | |
resetGFX(); | |
CURRENTMODE = MODES[modeIndex](); | |
} | |
function wake() { | |
SLEEPING = false; | |
Bangle.setLCDPower(1); | |
Bangle.setGPSPower(1); | |
changeMode(0); // back to clock | |
} | |
function sleep() { | |
SLEEPING = true; | |
Bangle.setLCDPower(0); | |
Bangle.setGPSPower(0); | |
} | |
function keepAwake() { | |
lastPoked = Date.now(); | |
if (SLEEPING) wake(); | |
} | |
// Utility fns for daylight saving | |
function lastSunday(month, year) { | |
var d = new Date(); | |
var lastDayOfMonth = new Date(d.getFullYear(), month+1, 0); | |
var day = lastDayOfMonth.getDay(); | |
return new Date(lastDayOfMonth.getFullYear(), lastDayOfMonth.getMonth(), lastDayOfMonth.getDate() - day); | |
} | |
function isBST(date) { | |
var d = date || new Date(); | |
var starts = lastSunday(2, d.getFullYear()); | |
starts.setHours(1); | |
var ends = lastSunday(9, d.getFullYear()); | |
starts.setHours(1); | |
return d.getTime() >= starts.getTime() && d.getTime() < ends.getTime(); | |
} | |
var MODES = [ | |
function() { // ======================================= Clock | |
var firstDraw = true; | |
function draw(d) { | |
if (firstDraw) { | |
g.clear(1); | |
firstDraw = false; | |
} | |
if (isBST(d)) // add daylight saving | |
d = new Date(d.getTime() + 3600000); | |
var size = 6; | |
var x = X + (W/2) - size*6, | |
y = Y + (H/2) - size*7; | |
g.reset();//.clearRect(x,y,x+W,y+size*12+8); | |
g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); | |
g.drawString((" "+d.getHours()).substr(-2), x, y, true); | |
g.setFontAlign(-1,-1); | |
g.setColor((d.getSeconds()&1) ? g.theme.fg : g.theme.bg).drawString(":", x,y); | |
g.setColor(g.theme.fg); | |
g.drawString(("0"+d.getMinutes()).substr(-2),x+size*4,y, true); | |
// draw seconds | |
g.setFont("7x11Numeric7Seg",size/2); | |
g.drawString(("0"+d.getSeconds()).substr(-2),x+size*18,y + size*7, true); | |
// date | |
var s = d.toString().split(" ").slice(0,4).join(" "); | |
g.setFont("6x8").setFontAlign(0,-1); | |
g.drawString(" "+s+" ",X+W/2, y + size*12, true); | |
// For working out sizing/alignment | |
//g.drawRect(X,Y,X+W,Y+H); | |
} | |
function drawWait(fix) { | |
firstDraw = true; | |
g.clear(1).setFont("6x8",2).setFontAlign(0,0); | |
g.drawString("Waiting for GPS",X+W/2,Y+H/2); | |
g.setFont("6x8",1).drawString(fix.satellites+" Satellites",X+W/2,Y+H/2+20); | |
} | |
drawWait({satellites:0}); | |
function onGPS(fix) { | |
if (!fix.time) drawWait(fix); | |
else draw(fix.time); | |
} | |
Bangle.on("GPS", onGPS); | |
return { kill : function() { | |
Bangle.removeListener("GPS", onGPS); | |
} | |
}; | |
}, | |
function() { // ======================================= G METER | |
g.clear(); | |
var xy; | |
var maxAccel = 0; | |
function onAccel(a) { // a.x is vertical - ignore! | |
g.reset(); | |
if (xy) { | |
g.setColor("#ff0000").fillRect(xy.x-2, xy.y-2, xy.x+2, xy.y+2); | |
} | |
xy = { | |
x : X + (W/2) + (a.y*W/2), | |
y : Y + (H/2) + (a.z*W/2), | |
}; | |
g.setColor(g.theme.fg).fillRect(xy.x-2, xy.y-2, xy.x+2, xy.y+2); | |
g.setFont("6x8",5).setFontAlign(0,1); | |
var accel = Math.sqrt(a.y*a.y + a.z*a.z); | |
if (accel > maxAccel) | |
maxAccel = accel; | |
g.drawString(" "+maxAccel.toFixed(2)+" ", X+W/2, Y+H-8, true); | |
} | |
Bangle.on("accel", onAccel); | |
return { kill : function() { | |
Bangle.removeListener("accel", onAccel); | |
} | |
}; | |
}, | |
function() { // ======================================= Speedo | |
function onGPS(fix) { | |
//print(fix); | |
g.reset().setFont("7x11Numeric7Seg",6).setFontAlign(0,0); | |
var mph = isFinite(fix.speed) ? Math.round(fix.speed * 0.621371) : "---"; | |
g.drawString(" "+mph+" ", X+W/2, Y+H/2 - 20, true); | |
g.setFont("6x8",2); | |
g.drawString("MPH", X+W/2, Y+H/2 + 40); | |
} | |
onGPS({}); | |
Bangle.on("GPS", onGPS); | |
return { kill : function() { | |
Bangle.removeListener("GPS", onGPS); | |
} | |
}; | |
}, | |
]; | |
wake(); | |
Bangle.on('touch',function() { | |
if (SLEEPING) keepAwake(); | |
var newMode = modeIndex+1; | |
if (newMode>=MODES.length) | |
newMode=0; | |
changeMode(newMode); | |
if (CURRENTMODE) CURRENTMODE.kill(); | |
resetGFX(); | |
CURRENTMODE = MODES[modeIndex](); | |
}); | |
Bangle.on("accel", function(a) { | |
if (a.mag>1.05) keepAwake(); | |
}); | |
setInterval(function() { | |
if (((Date.now()-lastPoked) > SLEEP_TIMEOUT) && !SLEEPING) | |
sleep(); | |
}, 10000); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment