diff --git a/apps.json b/apps.json index 1f7078fe8..fbe8b953f 100644 --- a/apps.json +++ b/apps.json @@ -269,6 +269,30 @@ {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} ] }, + { "id": "geissclk", + "name": "Geiss Clock", + "icon": "clock.png", + "version":"0.01", + "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", + "tags": "clock", + "type":"clock", + "storage": [ + {"name":"geissclk.app.js","url":"clock.js"}, + {"name":"geissclk.precompute.js","url":"precompute.js"}, + {"name":"geissclk.img","url":"clock-icon.js","evaluate":true} + ], + "data": [ + {"name":"geissclk.0.map"}, + {"name":"geissclk.1.map"}, + {"name":"geissclk.2.map"}, + {"name":"geissclk.3.map"}, + {"name":"geissclk.4.map"}, + {"name":"geissclk.5.map"}, + {"name":"geissclk.0.pal"}, + {"name":"geissclk.1.pal"}, + {"name":"geissclk.2.pal"} + ] + }, { "id": "trex", "name": "T-Rex", "icon": "trex.png", diff --git a/apps/geissclk/ChangeLog b/apps/geissclk/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/geissclk/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/geissclk/clock-icon.js b/apps/geissclk/clock-icon.js new file mode 100644 index 000000000..723d17cc0 --- /dev/null +++ b/apps/geissclk/clock-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4X/AoMF/3G/2m/wOCmoaKmtAAgVQBYsFoECwALMAA0JBZQABBYIbBBaVUBYMVBYkBIIILDgEKGYUBqkA6oLB6sAlQLDqsAioLBCAOq4AkCqtAivCBYMC1YwDitQgtCwNUhWsOwlUBYVQlWwJAlVgtSxNQFwnwGANBqWFqQuE1QwBqNewtKFwgLBGANWytq2EFWoU6gWBqoLBFwNVYIZZBqtXyurioLF1W1q/W1tVPIIxE1NV72VqpTDDAleEIgADnWq3qgBTIYADvQuBAAVUBYla1XVBYYbDyt632qd40Fqulquq0ALFOwO16t6BYpxBvWX6tW0aoDXwNU1XXNQMD1T7CAwPC1abBegPqFodQdQILCO4hxBlWxq2FoqaFBYOBcYNxQggLCToOBqAwBTgwLCiqoGgtCJ4L0BBYsVBYRmBBY0CwEUJ4IwFBYkVBYsMBYI0CJAwLDAA4L2A=")) diff --git a/apps/geissclk/clock.js b/apps/geissclk/clock.js new file mode 100644 index 000000000..de880d808 --- /dev/null +++ b/apps/geissclk/clock.js @@ -0,0 +1,148 @@ +var W = 79, H = 64; +/*var compiled = E.compiledC(` +// void transl(int, int, int ) +int transl(unsigned char *map, unsigned char *imgfrom, unsigned char *imgto) { + int n = 0; + const int W = 79; + const int H = 64; + for (int y=0;y>4)&0x0F) - 8; + int ax = nx&7; + int ay = ny&7; + int a = (nx>>3) + ((ny>>3)*W); + int c = 0; + if (a>=0 && a<(W*H-(W+1))) { + c = imgfrom[a]*(8-ax)*(8-ay) + + imgfrom[a+1]*(ax)*(8-ay) + + imgfrom[a+W]*(8-ax)*(ay) + + imgfrom[a+W+1]*(ax)*(ay); + c = (c>>6) - 4; + if (c<0) c=0; + } + imgto[n] = c; + n++; + } +} +`);*/ +var compiled = (function(){ + var bin=atob("Len3TwAnT/BPCPsAAJMI+wfzAOsDCdMYAZMAJhn4BkAAnQTwDwMD68YDBesUFAg7CDzdEE/q5AoI+wpaQfJvNapFItgB6woOA/AHAxH4CsCe+AGww/EIBQX7DPwD+wvMnvhPsATwBwQF+wv1ZUPE8QgKCvsMXJ74UFBrQwT7A8SkEQQ8JOrkdADgACQBm5xVATZPLsLRATdAL7bRA7C96PCPAAA="); + return { + transl:E.nativeCall(1, "void(int, int, int )", bin), + }; +})(); + +require("Font7x11Numeric7Seg").add(Graphics); + +// Allocate the data +var dataa = new Uint8Array(W*H); +var datab = new Uint8Array(W*H); +var map = new Uint8Array(W*H); +var pal = new Uint16Array(256); +var PALETTES = 3; +var MAPS = 6; + +// If we're missing any maps, compute them! +(function() { + var files = require("Storage").list(/^geissclk/); + var allOk = true; + for (var n=0;n>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8); + }pal[255] = 65535; +})() +require("Storage").write("geissclk.0.pal",pal.buffer); +E.showMessage("Precomputing\npalettes\n\nPlease wait...\n1 / 3"); +(function() { // gunge + for (var i=0;i<256;i++) { + var r = 0; + var g = Math.min(i*3,255); + var b = Math.min(i,255); + pal[i] = (b>>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8); + }pal[255] = 65535; +})() +require("Storage").write("geissclk.1.pal",pal.buffer); +E.showMessage("Precomputing\npalettes\n\nPlease wait...\n2 / 3"); +(function() { // 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]; + var g = cl[1]; + var b = cl[2]; + pal[i] = (b>>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8); + }pal[255] = 65535;pal[255] = 65535; +})() +require("Storage").write("geissclk.2.pal",pal.buffer); + + +// MAPS ---------------------------------------------- +E.showMessage("Precomputing\nmaps\n\nPlease wait...\n0"); +// straight out +(function() { "ram"; var n = 0; for (var y=0;y3)?0.5:-0.5); + dy = (-dy/d) + (((x&7)>3)?0.5:-0.5); + map[n++] = ((dx*3 + 8) & 0x0F) | (((dy*3 + 8) & 0x0F)<<4); + } +}})() +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