Add "ram" keyword to allow 2v06 Espruino builds to cache function that needs to be fast

Fix issue where first digit could get stuck going from "2x:xx" to " x:xx" (fix #365)

also remove accidental commit
pull/383/head
Gordon Williams 2020-05-05 13:41:30 +01:00
parent 69a4c7ce74
commit 7d8d1a8f6f
5 changed files with 8 additions and 210 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
node_modules
package-lock.json
.DS_Store
*.js.bak

View File

@ -108,7 +108,7 @@
{ "id": "mclock",
"name": "Morphing Clock",
"icon": "clock-morphing.png",
"version":"0.04",
"version":"0.05",
"description": "7 segment clock that morphs between minutes and hours",
"tags": "clock",
"type":"clock",

View File

@ -1,3 +1,5 @@
0.02: Modified for use with new bootloader and firmware
0.03: Added Locale based date
0.04: Improve performance, attempt to remove occasional glitch when LCD on (fix #279)
0.05: Add "ram" keyword to allow 2v06 Espruino builds to cache function that needs to be fast
Fix issue where first digit could get stuck going from "2x:xx" to " x:xx" (fix #365)

View File

@ -1,206 +0,0 @@
var locale = require("locale");
var CHARW = 34;
var CHARP = 2;
var Y = 50;
// Offscreen buffer
var buf = Graphics.createArrayBuffer(CHARW+CHARP*2,CHARW*2 + CHARP*2,1,{msb:true});
var bufimg = {width:buf.getWidth(),height:buf.getHeight(),buffer:buf.buffer};
// The last time that we displayed
var lastTime = " ";
// If animating, this is the interval's id
var animInterval;
var timeInterval;
/* Get array of lines from digit d to d+1.
n is the amount (0..1)
maxFive is true is this digit only counts 0..5 */
const DIGITS = {
" ":(g,s,p,n)=>{},
"0":(g,s,p,n)=>{
g.fillRect(1+s*n,1-p, 1+s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1+s*n,1+2*s-p, 1+s,1+2*s+p);
g.fillRect(1+s*n,1+s-p, 1+s*n,1+2*s+p);
g.fillRect(1+s*n-p,1, 1+s*n+p,1+s)},
"1":(g,s,p,n)=>{
g.fillRect(1+(1-n)*s,1-p, 1+s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1+(1-n)*s,1+s-p, 1+s,1+s+p);
g.fillRect(1-p+(1-n)*s,1+s, 1+p+(1-n)*s,1+2*s);
g.fillRect(1+(1-n)*s,1-p+2*s, 1+s,1+p+2*s)},
"2":(g,s,p,n)=>{
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1,1+s-p, 1+s,1+s+p);
g.fillRect(1-p,1+(1+n)*s, 1+p,1+2*s);
g.fillRect(1+s-p,1+(2-n)*s, 1+s+p,1+2*s);
g.fillRect(1,1+2*s-p, 1+s,1+2*s+p)},
"3":(g,s,p,n)=>{
g.fillRect(1,1-p, 1+(1-n)*s,1+p);
g.fillRect(1-p,1, 1+p,n);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1+s*n,1+2*s-p, 1+s,1+2*s+p)},
"4":(g,s,p,n)=>{
g.fillRect(1-p,1, 1+p,1+s);
g.fillRect(1+s,1-p, 1+(1-n)*s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+(1-n)*s);
g.fillRect(1,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1+(1-n)*s,1+2*s-p, 1+s,1+2*s+p)},
"5to0": (g,s,p,n)=>{ // 5 -> 0
g.fillRect(1-p,1, 1+p,1+s);
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1+s*n,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1,1+2*s*p, 1+s,1+2*s+p);
g.fillRect(1,1+2*s-p, 1,1+2*s+p);
g.fillRect(1+s-p,1+(1-n)*s, 1+s+p,1+s);
g.fillRect(1-p,1+s, 1+p,1+(1+n)*s)},
"5to6": (g,s,p,n)=>{ // 5 -> 6
g.fillRect(1-p,1, 1+p,1+s);
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1,1+2*s-p, 1+s,1+2*s+p);
g.fillRect(1-p,2-n, 1+p,1+2*s)},
"6":(g,s,p,n)=>{
g.fillRect(1-p,1, 1+p,1+(1-n)*s);
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1+s*n,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+(1-n)*s, 1+s+p,1+s);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1+s*n,1+2*s-p, 1+s,1+2*s+p);
g.fillRect(1-p,1+(1-n)*s, 1+p,1+s*(2-2*n))},
"7":(g,s,p,n)=>{
g.fillRect(1-p,1, 1+p,n);
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1+(1-n)*s,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1+(1-n)*s,1+2*s-p, 1+s,1+2*s+p);
g.fillRect(1+(1-n)*s-p,1+s, 1+(1-n)*s+p,1+2*s)},
"8":(g,s,p,n)=>{
g.fillRect(1-p,1, 1+p,1+s);
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1,1+s-p, 1+s,1+s+p);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1,1+2*s-p, 1+s,1+2*s+p);
g.fillRect(1-p,1+s, 1+p,1+s*(2-n))},
"9":(g,s,p,n)=>{
g.fillRect(1-p,1, 1+p,1+s);
g.fillRect(1,1-p, 1+s,1+p);
g.fillRect(1+s-p,1, 1+s+p,1+s);
g.fillRect(1,1+s-p, 1+(1-n)*s,1+s+p);
g.fillRect(1-p,1+s, 1+p,1+(1+n)*s);
g.fillRect(1+s-p,1+s, 1+s+p,1+2*s);
g.fillRect(1,1+2*s-p, 1+s,1+2*s+p)},
":":(g,s,p,n)=>{
g.fillRect(1+s*0.4,1+s*0.4-p, 1+s*0.6,1+s*0.4+p);
g.fillRect(1+s*0.6-p,1+s*0.4, 1+s*0.6+p,1+s*0.6);
g.fillRect(1+s*0.6,1+s*0.6-p, 1+s*0.4,1+s*0.6+p);
g.fillRect(1+s*0.4-p,1+s*0.4, 1+s*0.4+p,1+s*0.6);
g.fillRect(1+s*0.4,1+s*1.4-p, 1+s*0.6,1+s*1.4+p);
g.fillRect(1+s*0.6-p,1+s*1.4, 1+s*0.6+p,1+s*1.6);
g.fillRect(1+s*0.6,1+s*1.6-p, 1+s*0.4,1+s*1.6+p);
g.fillRect(1+s*0.4-p,1+s*1.4, 1+s*0.4+p,1+s*1.6)
}};
/* Draw a transition between lastText and thisText.
'n' is the amount - 0..1 */
function drawDigits(lastText,thisText,n) {
const p = CHARP; // padding around digits
const s = CHARW; // character size
var x = p; // x offset
var y = Y+p; // y offset
g.reset();
for (var i=0;i<lastText.length;i++) {
var lastCh = lastText[i];
var thisCh = thisText[i];
if (thisCh==":") x-=4;
if (lastCh!=thisCh) {
var ch, chn = n;
if ((thisCh-1==lastCh ||
(thisCh==0 && lastCh==5) ||
(thisCh==0 && lastCh==9)))
ch = lastCh;
else {
ch = thisCh;
chn = 0;
}
if (ch=="5") ch = (lastCh==5 && thisCh==0)?"5to0":"5to6";
buf.clear();
DIGITS[ch](buf,s,p,chn);
g.drawImage(bufimg,x-1,y-1);
}
if (thisCh==":") x-=4;
x+=s+p+7;
}
}
function drawSeconds() {
var x = CHARW*6 + CHARP*2 - 4;
var y = Y + 2*CHARW + CHARP;
var d = new Date();
g.reset();
g.setFont("6x8");
g.setFontAlign(-1,-1);
g.drawString(("0"+d.getSeconds()).substr(-2), x, y-8, true);
// date
g.setFontAlign(0,-1);
var date = locale.date(d,false);
g.drawString(date, g.getWidth()/2, y+8, true);
}
/* Show the current time, and animate if needed */
function showTime() {
if (animInterval) return; // in animation - quit
var d = new Date();
var t = (" "+d.getHours()).substr(-2)+":"+
("0"+d.getMinutes()).substr(-2);
var l = lastTime;
// same - don't animate
if (t==l || l==" ") {
drawDigits(t,l,0);
drawSeconds();
return;
}
var n = 0;
animInterval = setInterval(function() {
n += 1/10;
if (n>=1) {
n=1;
clearInterval(animInterval);
animInterval = undefined;
}
drawDigits(l,t,n);
}, 20);
lastTime = t;
}
Bangle.on('lcdPower',function(on) {
if (animInterval) {
clearInterval(animInterval);
animInterval = undefined;
}
if (timeInterval) {
clearInterval(timeInterval);
timeInterval = undefined;
}
if (on) {
showTime();
timeInterval = setInterval(showTime, 1000);
}
});
g.clear();
Bangle.loadWidgets();
Bangle.drawWidgets();
// Update time once a second
timeInterval = setInterval(showTime, 1000);
showTime();
// Show launcher when middle button pressed
setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});

View File

@ -6,7 +6,7 @@ var Y = 50; // start height
var buf = Graphics.createArrayBuffer(CHARW+CHARP*2,CHARW*2 + CHARP*2,1,{msb:true});
var bufimg = {width:buf.getWidth(),height:buf.getHeight(),buffer:buf.buffer};
// The last time that we displayed
var lastTime = " ";
var lastTime = "-----";
// If animating, this is the interval's id
var animInterval;
var timeInterval;
@ -112,6 +112,7 @@ const DIGITS = {
/* Draw a transition between lastText and thisText.
'n' is the amount - 0..1 */
function drawDigits(lastText,thisText,n) {
"ram"
const p = CHARP; // padding around digits
const s = CHARW; // character size
var x = 0; // x offset
@ -167,7 +168,7 @@ function showTime() {
("0"+d.getMinutes()).substr(-2);
var l = lastTime;
// same - don't animate
if (t==l || l==" ") {
if (t==l || l=="-----") {
drawDigits(l,t,0);
drawSeconds();
lastTime = t;
@ -199,7 +200,7 @@ Bangle.on('lcdPower',function(on) {
showTime();
timeInterval = setInterval(showTime, 1000);
} else {
lastTime = " ";
lastTime = "-----";
}
});