From 993f9093351a6766fbd866cb577c66b4384db885 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 17 Feb 2021 16:46:58 +0000 Subject: [PATCH] add geiss clock --- apps.json | 24 ++++++ apps/geissclk/ChangeLog | 1 + apps/geissclk/clock-icon.js | 1 + apps/geissclk/clock.js | 148 ++++++++++++++++++++++++++++++++++++ apps/geissclk/clock.png | Bin 0 -> 2074 bytes apps/geissclk/precompute.js | 108 ++++++++++++++++++++++++++ 6 files changed, 282 insertions(+) create mode 100644 apps/geissclk/ChangeLog create mode 100644 apps/geissclk/clock-icon.js create mode 100644 apps/geissclk/clock.js create mode 100644 apps/geissclk/clock.png create mode 100644 apps/geissclk/precompute.js 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;nCh6Mfqh-1u#LiK`lb9az#-dnsi zwICXW13;oW`pL!?(A^5}#aeskxtaYL>6rb0q)AwUSNj^y%prSagL~t zA}I8(jp`rlYIsmpICxPFU(y6h!84(1wO52Iy ze0B8gWwUMIzoy8LTX&$PU|Yqz(kfta;A^LLH_pyi!UAlY0ZR6`meP0&X0$_~UJduF#tXT`p0#dP+ zM-E>H|JI^eHt=5u8i2GD^5w_^%&9Ql zyhYzyyy!+mST)a$RNJ5jo4l+2RMm;ep>ukeZaxFd6f|iuzjm&KuQF(-UKYm=S+$JiNX(FCNxZuThaFP+dOKodtFZbU0_~w#)i$Vfg}% zH9v*O_dsh$irz2n-@V|3>|&Cs-^dxiI{FUQ_}SENmjEDA^KgA#*tzxmc7A6e~x6rIU<}?<#urd z;to0(V5*%Dnc~d=(%PT>u?F@5U>&)+2ErkQ4)2!O7Fm2~uvDJ1QawGkw8+Pm~)*3(CU z#~=qM-h8BXHCV--eighE)_#~ZSViC+6*^oSd+zETIg$WBndkdl z%;a2IaEb7}U!a3|=V3Gx>GoEpR+!wiMg=Wnu@`-~`l3WYCVQCKRmc<%aVwC?YL2_? zA*6~4l8IFa?Z7$=j!cguW-eyh8UVunKY{*xNMcew;$}tJX+=7mQ#F5-wqy{s|HuNg z>+Y$(u^Wu);|g;DaLCGx_>dTxV*4{$0*xU8nhS@Cn-ffn?FZH}I_cqriu}~Q>%evS z!A%j6-I-`IhIWNV$nCDVNf~3SnO^+>=mIkKU3)$|2S<>RWmMpt!gL_*PV&~-8s|$G z`8KNafb&jW&-5q)O1c*szf+D3ZwtIG(BaIg+G8F53c3JD>qY-CFh{BkR68&js6q_r z1L}jz{&sg@XcaBTeiVW3rj8vM@DJjIC${hW8}qPP9{A zcdES1>R@2_@4zIP8An{felWZbSf=RXf_#&42f(op)mL9@om-BMF2%sV%w0Y6bC+oO z?fQH`F@9I#K0ldw*$Fw0@Fd7gghMKP%dL%l+-prekrzIs%^w_U1ttNz#m#-6(QHj% zeX*oS>ie#kaNskl@^ytIaHtr3-U#@~#2dipMuQ;mlEwZi*4o!|jnD$;`H{P%<*ICS zZmW78z`UEO4dVJfFxiTJHYQ$wzN2_C&_b4HL6#wbw?TgB2L31A*4~Y!!Vh;g+==Qk z;IfyMZDTFopBfPOJ%CX*mU`P!ibYyR!*ugOpb0o?T<>0)x9<#q?ybKg2+V#&pYc{6 zed_A#_3X~ZrDF6=;IvyCyImF^@(U$JH(fxGUa|+Y%5lBbqwocUUh_WSCle_kAtGzt zm8l(2II}C2CDNYm)*WbZ>w21t!RIqUeg>RV^ukzKnZv1KFDKb#!;1!Kanv?STi+G9 zu@{=Ck*LV~z);uSpAzH|gw0n@aFm>g9Tj1m5NY4%tH+mx>1G|B2RGbacjIh7ndtG8iQVPX zMYM7RlxiQ@BVVQL{{lX0`=1vO`K7)TQ)KU0LVT0#zmg^!hBs(c_5c6?07*qoM6N<$ Eg0xHPyZ`_I literal 0 HcmV?d00001 diff --git a/apps/geissclk/precompute.js b/apps/geissclk/precompute.js new file mode 100644 index 000000000..91f41229b --- /dev/null +++ b/apps/geissclk/precompute.js @@ -0,0 +1,108 @@ +// PALETTES --------------------------- +E.showMessage("Precomputing\npalettes\n\nPlease wait...\n0 / 3"); +(function() { // fire + for (var i=0;i<256;i++) { + var r = Math.min(i*6,240); + var g = Math.min(i*3,240); + var b = E.clip((i-192)*8,0,240); + pal[i] = (b>>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