Skip to content

Instantly share code, notes, and snippets.

@gfwilliams
Last active August 13, 2021 18:04
Show Gist options
  • Save gfwilliams/0120896239b7abbe45f008dd27e7b131 to your computer and use it in GitHub Desktop.
Save gfwilliams/0120896239b7abbe45f008dd27e7b131 to your computer and use it in GitHub Desktop.
Code for Bangle in Jim's MR2
// 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