Modified Geissclk for Bangle.js 2

pull/2862/head
Gordon Williams 2023-07-04 16:19:30 +01:00
parent 0414dd5515
commit 026778f656
4 changed files with 70 additions and 27 deletions

View File

@ -2,3 +2,4 @@
0.02: BTN2->launcher, use smaller text to allow "20:00" to fit on screen
0.03: Changed setWatch to Bangle.setUI
0.04: Tell clock widgets to hide.
0.05: Making geissclock work on Bangle.js 2 (but only animate when unlocked!)

View File

@ -1,4 +1,7 @@
var W = 79, H = 64;
// if screen is always on, only animate when unlocked
var isScreenAlwaysOn = process.env.BOARD=="BANGLEJS2";
/*var compiled = E.compiledC(`
// void transl(int, int, int )
int transl(unsigned char *map, unsigned char *imgfrom, unsigned char *imgto) {
@ -46,6 +49,7 @@ var map = new Uint8Array(W*H);
var pal = new Uint16Array(256);
var PALETTES = 3;
var MAPS = 6;
var animInterval;
// If we're missing any maps, compute them!
(function() {
@ -65,6 +69,8 @@ function randomPalette() {
var n = (0|Math.random()*200000) % PALETTES;
var p = new Uint8Array(pal.buffer);
p.set(require("Storage").readArrayBuffer("geissclk."+n+".pal"));
if (!g.theme.dark) // if not dark, invert colors
E.mapInPlace(pal,pal,x=>x^0xFFFF);
}
function randomMap() {
@ -93,7 +99,7 @@ var im = {
};
var lastSeconds = -1;
function iterate() { "ram"
function iterate(clearBuf) { "ram"
var d = new Date();
var time = require("locale").time(d,1);
var seconds = d.getSeconds().toString().padStart(2,0);
@ -108,27 +114,59 @@ function iterate() { "ram"
gfx.buffer = dataa.buffer;
}
var x,y,n,t = getTime()/10;
var amt = 100*Bangle.getAccel().diff;
for (var i=0;i<amt;i++) {
//x = Math.round((W/2) + 20*Math.sin(t));
//y = Math.round((H/2) + 20*Math.cos(t));
//t += 0.628;
x = 1+(Math.random()*(W-2))|0;
y = 1+(Math.random()*(H-2))|0;
dataa[x + y*W] = 240;
if (clearBuf) {
gfx.clear();
} else { // do geiss animation
var amt = 100*Bangle.getAccel().diff;
for (var i=0;i<amt;i++) {
//x = Math.round((W/2) + 20*Math.sin(t));
//y = Math.round((H/2) + 20*Math.cos(t));
//t += 0.628;
x = 1+(Math.random()*(W-2))|0;
y = 1+(Math.random()*(H-2))|0;
dataa[x + y*W] = 240;
}
compiled.transl(addrmap, addra, addrb);
}
compiled.transl(addrmap, addra, addrb);
x = 8;
gfx.setFont("5x9Numeric7Seg",2);
gfx.drawString(time, x, 20);
gfx.setFont("5x9Numeric7Seg");
gfx.drawString(seconds, x+55, 30);
if (!clearBuf) { // don't draw seconds if not animating
gfx.setFont("5x9Numeric7Seg");
gfx.drawString(seconds, x+55, 30);
}
// firmwares pre-2v09 wouldn't accelerate a 3x blit if it went right to the RHS - hence we're 79px not 80
g.drawImage(im,1,24,{scale:3});
if (g.getWidth()==176) // Bangle.js 2
g.drawImage(im,8,24,{scale:2});
else
g.drawImage(im,3,24,{scale:3});
}
if (isScreenAlwaysOn) {
Bangle.on('lock',function(on) {
if (animInterval) {
clearInterval(animInterval);
animInterval = undefined;
}
if (!on) { // not locked - animate!
randomMap();
randomPalette();
iterate();
animInterval = setInterval(iterate, 50);
} else {
iterate(true); // just clear
animInterval = setTimeout(function() {
iterate(true);
animInterval = setInterval(function() {
iterate(true);
}, 60000);
}, 60000 - (Date.now() % 60000));
}
});
}
Bangle.on('lcdPower',function(on) {
if (animInterval) {
@ -144,11 +182,15 @@ Bangle.on('lcdPower',function(on) {
});
// Show launcher when button pressed
Bangle.setUI("clock");g.clear();
Bangle.setUI("clock");
g.clear(1);
Bangle.loadWidgets();
Bangle.drawWidgets();
iterate();
animInterval = setInterval(iterate, 50);
iterate(true);
if (Bangle.isLCDOn() && (!isScreenAlwaysOn || !Bangle.isLocked())) {
console.log("Starting");
animInterval = setInterval(iterate, 50);
}

View File

@ -1,12 +1,12 @@
{
"id": "geissclk",
"name": "Geiss Clock",
"version": "0.04",
"version": "0.05",
"description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation",
"icon": "clock.png",
"type": "clock",
"tags": "clock",
"supports": ["BANGLEJS"],
"supports": ["BANGLEJS","BANGLEJS2"],
"storage": [
{"name":"geissclk.app.js","url":"clock.js"},
{"name":"geissclk.precompute.js","url":"precompute.js"},

View File

@ -1,6 +1,6 @@
// PALETTES ---------------------------
E.showMessage("Precomputing\npalettes\n\nPlease wait...\n0 / 3");
(function() { // fire
(function() { "jit" // fire
for (var i=0;i<256;i++) {
var r = Math.min(i*6,240);
var g = Math.min(i*3,240);
@ -10,7 +10,7 @@ E.showMessage("Precomputing\npalettes\n\nPlease wait...\n0 / 3");
})()
require("Storage").write("geissclk.0.pal",pal.buffer);
E.showMessage("Precomputing\npalettes\n\nPlease wait...\n1 / 3");
(function() { // gunge
(function() { "jit" // gunge
for (var i=0;i<256;i++) {
var r = 0;
var g = Math.min(i*3,255);
@ -20,7 +20,7 @@ E.showMessage("Precomputing\npalettes\n\nPlease wait...\n1 / 3");
})()
require("Storage").write("geissclk.1.pal",pal.buffer);
E.showMessage("Precomputing\npalettes\n\nPlease wait...\n2 / 3");
(function() { // rainbow
(function() { "jit" // rainbow
for (var i=0;i<256;i++) {
var cl = E.HSBtoRGB((48+i)/128,1,Math.min(i/16,0.9),true);
var r = cl[0];
@ -35,7 +35,7 @@ require("Storage").write("geissclk.2.pal",pal.buffer);
// MAPS ----------------------------------------------
E.showMessage("Precomputing\nmaps\n\nPlease wait...\n0 / 5");
// straight out
(function() { "ram"; var n = 0; for (var y=0;y<H;y++) {
(function() { "jit"; var n = 0; for (var y=0;y<H;y++) {
for (var x=0;x<W;x++) {
var dx = x-(W/2);
var dy = y-(H/2);
@ -49,7 +49,7 @@ E.showMessage("Precomputing\nmaps\n\nPlease wait...\n0 / 5");
require("Storage").write("geissclk.0.map",map);
E.showMessage("Precomputing\nmaps\n\nPlease wait...\n1 / 5");
// ripple out
(function() { "ram"; var n = 0; for (var y=0;y<H;y++) {
(function() { "jit"; var n = 0; for (var y=0;y<H;y++) {
for (var x=0;x<W;x++) {
var dx = x-(W/2);
var dy = y-(H/2);
@ -63,7 +63,7 @@ E.showMessage("Precomputing\nmaps\n\nPlease wait...\n1 / 5");
require("Storage").write("geissclk.1.map",map);
E.showMessage("Precomputing\nmaps\n\nPlease wait...\n2 / 5");
// twisty outwards
(function() { "ram"; var n = 0; for (var y=0;y<H;y++) {
(function() { "jit"; var n = 0; for (var y=0;y<H;y++) {
for (var x=0;x<W;x++) {
var dx = x-(W/2);
var dy = y-(H/2);
@ -76,7 +76,7 @@ E.showMessage("Precomputing\nmaps\n\nPlease wait...\n2 / 5");
require("Storage").write("geissclk.2.map",map);
E.showMessage("Precomputing\nmaps\n\nPlease wait...\n3 / 5");
// spiral
(function() { "ram"; var n = 0; for (var y=0;y<H;y++) {
(function() { "jit"; var n = 0; for (var y=0;y<H;y++) {
for (var x=0;x<W;x++) {
var dx = x-(W/2);
var dy = y-(H/2);
@ -89,7 +89,7 @@ E.showMessage("Precomputing\nmaps\n\nPlease wait...\n3 / 5");
require("Storage").write("geissclk.3.map",map);
E.showMessage("Precomputing\nmaps\n\nPlease wait...\n4 / 5");
// blur down
(function() { "ram"; var n=0; for (var y=0;y<H;y++) {
(function() { "jit"; var n=0; for (var y=0;y<H;y++) {
for (var x=0;x<W;x++) {
map[n++] = 136 - 6*16 + (y&1)*8-4;
}
@ -97,7 +97,7 @@ E.showMessage("Precomputing\nmaps\n\nPlease wait...\n4 / 5");
require("Storage").write("geissclk.4.map",map);
E.showMessage("Precomputing\nmaps\n\nPlease wait...\n5 / 5");
// twisty
(function() { "ram"; var n=0; for (var y=0;y<H;y++) {
(function() { "jit"; var n=0; for (var y=0;y<H;y++) {
for (var x=0;x<W;x++) {
dx = Math.sin(y*0.2);
dy = Math.cos(x*0.2);