From dec095d2d952b06413ab7c839ed60a2f21f4fb87 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 6 Mar 2021 20:23:56 +0000 Subject: [PATCH 01/17] First test version of numeral clock --- apps/numeralclock/ChangeLog | 1 + apps/numeralclock/README.md | 18 ++ apps/numeralclock/app.png | Bin 0 -> 22651 bytes apps/numeralclock/numeralclock-icon.js | 1 + apps/numeralclock/numeralclock.js | 297 +++++++++++++++++++++++++ apps/numeralclock/numeralclock.png | Bin 0 -> 2944 bytes 6 files changed, 317 insertions(+) create mode 100644 apps/numeralclock/ChangeLog create mode 100644 apps/numeralclock/README.md create mode 100644 apps/numeralclock/app.png create mode 100644 apps/numeralclock/numeralclock-icon.js create mode 100644 apps/numeralclock/numeralclock.js create mode 100644 apps/numeralclock/numeralclock.png diff --git a/apps/numeralclock/ChangeLog b/apps/numeralclock/ChangeLog new file mode 100644 index 000000000..d53df991b --- /dev/null +++ b/apps/numeralclock/ChangeLog @@ -0,0 +1 @@ +0.01: Initial Release diff --git a/apps/numeralclock/README.md b/apps/numeralclock/README.md new file mode 100644 index 000000000..00f716e4a --- /dev/null +++ b/apps/numeralclock/README.md @@ -0,0 +1,18 @@ +# Sliding Text Clock - See the time in different languages + +Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently only English, French and Japanese are supported + +![](app.png) + +## Usage + +Use Button 1 (the top right button) to change the language + + +## Requests + +[Reach out to Adrian](https://www.github.com/awkirk71) if you have feature requests or notice bugs. + +## Creator + +Made by [Adrian Kirk](https://www.github.com/awkirk71). diff --git a/apps/numeralclock/app.png b/apps/numeralclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3680c3ce6043399affba29faae9712cc283c7a9c GIT binary patch literal 22651 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 Z>57pLf7UNFR9qo-wKeqAD<9at{vRnE{6+u( literal 0 HcmV?d00001 diff --git a/apps/numeralclock/numeralclock-icon.js b/apps/numeralclock/numeralclock-icon.js new file mode 100644 index 000000000..2fc42f023 --- /dev/null +++ b/apps/numeralclock/numeralclock-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("lEowkE/4A/AH//+czCSKbBgXziYhKEQXxgMQgERgASIkf/CgM/+UBiISBCZAUBn4DBmcybAUTHZIUEmEQkcgl5gLJ4XygQCBj50MAYUQCZ3/HgXwkcyiZqBJxQoC+UD+cPXBIIBBQcwHIMBNwpNFDocQBoMwM4IUEn4kBMIZ3DAAMgQYoZCCYg6CVhKJFEQJyIn4VBkZrFDAgIJBxCqHO5DmJT4v/mQSIKxA+DDIIADCRJEDZgRCKIgjUHHJAPCPhprFExwSDJRgPDN5oUHCJ4A/AH4AIA==")) diff --git a/apps/numeralclock/numeralclock.js b/apps/numeralclock/numeralclock.js new file mode 100644 index 000000000..bad86adeb --- /dev/null +++ b/apps/numeralclock/numeralclock.js @@ -0,0 +1,297 @@ +const screen_center_x = g.getWidth()/2; +const screen_center_y = g.getHeight()/2; + +require("FontCopasetic40x58Numeric").add(Graphics); + +class Hand { + constructor(centerX, + centerY, + length, + tolerance, + draw_test, + red, + green, + blue){ + this.centerX = centerX; + this.centerY = centerY; + this.length = length; + this.red = red; + this.green = green; + this.blue = blue; + this.last_x = centerX; + this.last_y = centerY; + this.tolerance = tolerance; + this.draw_test = draw_test; + this.angle = -1; + this.last_draw_time = null; + } + // method to move the hand to a new angle + moveTo(angle){ + if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle,this.last_draw_time) ){ + g.setColor(0,0,0); + g.drawLine(this.centerX, this.centerY, this.last_x, this.last_y); + g.setColor(this.red,this.green,this.blue); + x2 = this.centerX + this.length*Math.cos(angle); + y2 = this.centerY + this.length*Math.sin(angle); + g.setColor(this.red,this.green,this.blue); + g.drawLine(this.centerX, this.centerY, x2, y2); + this.last_x = x2; + this.last_y = y2; + this.angle = angle; + this.last_draw_time = new Date(); + return true; + } else { + return false; + } + } +} + +class ThickHand { + constructor(centerX, + centerY, + length, + tolerance, + draw_test, + red, + green, + blue, + start_height, + thickness){ + this.centerX = centerX; + this.centerY = centerY; + this.length = length; + this.red = red; + this.green = green; + this.blue = blue; + this.thickness = thickness; + this.start_height = start_height; + this.delta_top = Math.atan(thickness/(2*length)); + this.delta_base = Math.atan(thickness/(2*start_height)); + this.last_x1 = centerX; + this.last_y1 = centerY; + this.last_x2 = centerX; + this.last_y2 = centerY; + this.last_x3 = centerX; + this.last_y3 = centerY; + this.last_x4 = centerX; + this.last_y4 = centerY; + this.tolerance = tolerance; + this.draw_test = draw_test; + this.angle = -1; + this.last_draw_time = null; + } + // method to move the hand to a new angle + moveTo(angle){ + if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle - this.delta_base,this.angle + this.delta_base ,this.last_draw_time) ){ + g.setColor(0,0,0); + g.fillPoly([this.last_x1, + this.last_y1, + this.last_x2, + this.last_y2, + this.last_x3, + this.last_y3, + this.last_x4, + this.last_y4 + ]); + g.setColor(this.red,this.green,this.blue); + // bottom left + x1 = this.centerX + + this.start_height*Math.cos(angle - this.delta_base); + y1 = this.centerY + this.start_height*Math.sin(angle - this.delta_base); + // bottom right + x2 = this.centerX + + this.start_height*Math.cos(angle + this.delta_base); + y2 = this.centerY + this.start_height*Math.sin(angle + this.delta_base); + // top right + x3 = this.centerX + this.length*Math.cos(angle + this.delta_top); + y3 = this.centerY + this.length*Math.sin(angle + this.delta_top); + // top left + x4 = this.centerX + this.length*Math.cos(angle - this.delta_top); + y4 = this.centerY + this.length*Math.sin(angle - this.delta_top); + g.setColor(this.red,this.green,this.blue); + g.fillPoly([x1,y1, + x2,y2, + x3,y3, + x4,y4 + ]); + this.last_x1 = x1; + this.last_y1 = y1; + this.last_x2 = x2; + this.last_y2 = y2; + this.last_x3 = x3; + this.last_y3 = y3; + this.last_x4 = x4; + this.last_y4 = y4; + this.angle = angle; + this.last_draw_time = new Date(); + return true; + } else { + return false; + } + } +} + +let seconds_hand = new Hand(screen_center_x, + screen_center_y, + 100, + 0, + (angle, last_draw_time) => false, + 0.5,0.5,0.5); + +let minutes_hand_redraw = function(angle, last_draw_time){ + return seconds_hand.angle > angle && + Math.abs(seconds_hand.angle - angle) <2*Math.PI/25 && + new Date().getTime() - last_draw_time.getTime() > 500; +}; + +let minutes_hand = new Hand(screen_center_x, + screen_center_y, + 80, + 2*Math.PI/250, + minutes_hand_redraw, + 1.0,1.0,1.0); + +let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ + return seconds_hand.angle >= angle_from && + seconds_hand.angle <= angle_to && + new Date().getTime() - last_draw_time.getTime() > 500; +}; +let hours_hand = new ThickHand(screen_center_x, + screen_center_y, + 40, + 2*Math.PI/600, + hour_hand_redraw, + 1.0,1.0,1.0, + 5, + 4); + +function draw_clock(){ + date = new Date(); + draw_hour_digit(date); + draw_seconds(date); + draw_mins(date); + draw_hours(date); +} + +function draw_seconds(date){ + seconds = date.getSeconds() + date.getMilliseconds()/1000; + seconds_frac = seconds / 60; + seconds_angle = 2*Math.PI*seconds_frac - (Math.PI/2.0); + seconds_hand.moveTo(seconds_angle); +} + + +function draw_mins(date,seconds_angle){ + mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); + mins_frac = mins / 60; + mins_angle = 2*Math.PI*mins_frac - (Math.PI/2.0); + redraw = minutes_hand.moveTo(mins_angle); + if(redraw){ + //console.log(date.getSeconds() + " redraw mins"); + } +} + +function draw_hours(date){ + hours = (date.getHours() % 12) + date.getMinutes()/60 + date.getSeconds()/3600; + hours_frac = hours / 12; + hours_angle = 2*Math.PI*hours_frac - (Math.PI/2.0); + redraw = hours_hand.moveTo(hours_angle); + if(redraw){ + //console.log(date.getSeconds() + " redraw hours"); + } +} + +let curr_hour_x = -1; +let curr_hour_y = -1; +let curr_hour_str = null; +const font_width = 40; +const font_height = 58; +function draw_hour_digit(date){ + hours = date.getHours() % 12; + mins = date.getMinutes(); + if(mins > 30){ + hours = (hours +1) % 12; + } + if(hours == 0){ + hours = 12; + } + hours_frac = hours / 12; + angle = 2*Math.PI*hours_frac - (Math.PI/2.0); + x = screen_center_x + 70*Math.cos(angle) - font_width/2; + y = screen_center_y + 70*Math.sin(angle) - font_height/2; + g.setFontCopasetic40x58Numeric(); + txt = hours.toString(); + if(curr_hour_str != null && curr_hour_str != txt){ + g.setColor(0,0,0); + g.drawString(curr_hour_str,curr_hour_x,curr_hour_y); + console.log("erasing old hour"); + } + g.setColor(1,1,1); + g.drawString(txt,x,y); + curr_hour_x = x; + curr_hour_y = y; + curr_hour_str = txt; +} + +// The interval reference for updating the clock +let intervalRef = null; + +function clearTimers(){ + if(intervalRef) { + clearInterval(intervalRef); + intervalRef = null; + } +} + +function startTimers(){ + setTimeout(scheduleDrawClock,1000); + draw_clock(); +} + +function scheduleDrawClock(){ + if(intervalRef) clearTimers(); + intervalRef = setInterval(draw_clock, 100); + draw_clock(); +} + +function reset_clock(){ + g.clear(); +} + +Bangle.on('lcdPower', (on) => { + if (on) { + console.log("lcdPower: on"); + Bangle.drawWidgets(); + reset_clock(); + startTimers(); + } else { + console.log("lcdPower: off"); + reset_clock(); + clearTimers(); + } +}); + +Bangle.on('faceUp',function(up){ + console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn()); + if (up && !Bangle.isLCDOn()) { + //console.log("faceUp and LCD off"); + clearTimers(); + Bangle.setLCDPower(true); + } +}); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +startTimers(); + +// Show launcher when middle button pressed +setWatch(Bangle.showLauncher, BTN2,{repeat:false,edge:"falling"}); + +function button1pressed(){ + console.log("button 1 pressed"); +} + +// Handle button 1 being pressed +setWatch(button1pressed, BTN1,{repeat:true,edge:"falling"}); + diff --git a/apps/numeralclock/numeralclock.png b/apps/numeralclock/numeralclock.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899 GIT binary patch literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ literal 0 HcmV?d00001 From d631fc36d0dfe265b2e706631ee407574b8e8353 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 6 Mar 2021 20:29:59 +0000 Subject: [PATCH 02/17] Added numeral clock --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index 7d782041e..46bda1a10 100644 --- a/apps.json +++ b/apps.json @@ -226,6 +226,19 @@ {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true} ] }, + { "id": "numeralclock", + "name": "Numeral Clock", + "icon": "numeralclock.png", + "version":"0.01", + "description": "Smooth sweep secondhand with single hour numeral", + "tags": "clock", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"numeralclock.app.js","url":"numeralclock.js"}, + {"name":"numeralclock.img","url":"numeralclock-icon.js","evaluate":true} + ] + }, { "id": "imgclock", "name": "Image background clock", "shortName":"Image Clock", From 53fbe9ceee05fd975906491d37711d14341f9818 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 6 Mar 2021 20:43:16 +0000 Subject: [PATCH 03/17] Changed name to sweep clock (name clash) --- apps/sweepclock/ChangeLog | 1 + apps/sweepclock/README.md | 18 ++++++++++++++++++ apps/sweepclock/app.png | Bin 0 -> 22651 bytes apps/sweepclock/sweepclock-icon.js | 1 + apps/sweepclock/sweepclock.js | Bin 0 -> 2944 bytes 5 files changed, 20 insertions(+) create mode 100644 apps/sweepclock/ChangeLog create mode 100644 apps/sweepclock/README.md create mode 100644 apps/sweepclock/app.png create mode 100644 apps/sweepclock/sweepclock-icon.js create mode 100644 apps/sweepclock/sweepclock.js diff --git a/apps/sweepclock/ChangeLog b/apps/sweepclock/ChangeLog new file mode 100644 index 000000000..d53df991b --- /dev/null +++ b/apps/sweepclock/ChangeLog @@ -0,0 +1 @@ +0.01: Initial Release diff --git a/apps/sweepclock/README.md b/apps/sweepclock/README.md new file mode 100644 index 000000000..00f716e4a --- /dev/null +++ b/apps/sweepclock/README.md @@ -0,0 +1,18 @@ +# Sliding Text Clock - See the time in different languages + +Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently only English, French and Japanese are supported + +![](app.png) + +## Usage + +Use Button 1 (the top right button) to change the language + + +## Requests + +[Reach out to Adrian](https://www.github.com/awkirk71) if you have feature requests or notice bugs. + +## Creator + +Made by [Adrian Kirk](https://www.github.com/awkirk71). diff --git a/apps/sweepclock/app.png b/apps/sweepclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3680c3ce6043399affba29faae9712cc283c7a9c GIT binary patch literal 22651 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 Z>57pLf7UNFR9qo-wKeqAD<9at{vRnE{6+u( literal 0 HcmV?d00001 diff --git a/apps/sweepclock/sweepclock-icon.js b/apps/sweepclock/sweepclock-icon.js new file mode 100644 index 000000000..2fc42f023 --- /dev/null +++ b/apps/sweepclock/sweepclock-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("lEowkE/4A/AH//+czCSKbBgXziYhKEQXxgMQgERgASIkf/CgM/+UBiISBCZAUBn4DBmcybAUTHZIUEmEQkcgl5gLJ4XygQCBj50MAYUQCZ3/HgXwkcyiZqBJxQoC+UD+cPXBIIBBQcwHIMBNwpNFDocQBoMwM4IUEn4kBMIZ3DAAMgQYoZCCYg6CVhKJFEQJyIn4VBkZrFDAgIJBxCqHO5DmJT4v/mQSIKxA+DDIIADCRJEDZgRCKIgjUHHJAPCPhprFExwSDJRgPDN5oUHCJ4A/AH4AIA==")) diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js new file mode 100644 index 0000000000000000000000000000000000000000..9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899 GIT binary patch literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ literal 0 HcmV?d00001 From 1ed7d15a159df7bb3d36a08746e956101dd1061d Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 6 Mar 2021 20:43:57 +0000 Subject: [PATCH 04/17] Renamed to Sweep Clock --- apps/sweepclock/sweeptext.png | Bin 0 -> 2944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/sweepclock/sweeptext.png diff --git a/apps/sweepclock/sweeptext.png b/apps/sweepclock/sweeptext.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899 GIT binary patch literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ literal 0 HcmV?d00001 From bc35f06d89e0290acf4ff37997f5ecca5b8f0565 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 6 Mar 2021 20:45:10 +0000 Subject: [PATCH 05/17] Renamed --- apps.json | 10 +- apps/numeralclock/ChangeLog | 1 - apps/numeralclock/README.md | 18 -- apps/numeralclock/app.png | Bin 22651 -> 0 bytes apps/numeralclock/numeralclock-icon.js | 1 - apps/numeralclock/numeralclock.js | 297 ------------------------- apps/numeralclock/numeralclock.png | Bin 2944 -> 0 bytes 7 files changed, 5 insertions(+), 322 deletions(-) delete mode 100644 apps/numeralclock/ChangeLog delete mode 100644 apps/numeralclock/README.md delete mode 100644 apps/numeralclock/app.png delete mode 100644 apps/numeralclock/numeralclock-icon.js delete mode 100644 apps/numeralclock/numeralclock.js delete mode 100644 apps/numeralclock/numeralclock.png diff --git a/apps.json b/apps.json index 46bda1a10..c1dd9afd9 100644 --- a/apps.json +++ b/apps.json @@ -226,17 +226,17 @@ {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true} ] }, - { "id": "numeralclock", - "name": "Numeral Clock", - "icon": "numeralclock.png", + { "id": "sweepclock", + "name": "Sweep Clock", + "icon": "sweepclock.png", "version":"0.01", "description": "Smooth sweep secondhand with single hour numeral", "tags": "clock", "type":"clock", "allow_emulator":true, "storage": [ - {"name":"numeralclock.app.js","url":"numeralclock.js"}, - {"name":"numeralclock.img","url":"numeralclock-icon.js","evaluate":true} + {"name":"sweepclock.app.js","url":"sweepclock.js"}, + {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true} ] }, { "id": "imgclock", diff --git a/apps/numeralclock/ChangeLog b/apps/numeralclock/ChangeLog deleted file mode 100644 index d53df991b..000000000 --- a/apps/numeralclock/ChangeLog +++ /dev/null @@ -1 +0,0 @@ -0.01: Initial Release diff --git a/apps/numeralclock/README.md b/apps/numeralclock/README.md deleted file mode 100644 index 00f716e4a..000000000 --- a/apps/numeralclock/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Sliding Text Clock - See the time in different languages - -Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently only English, French and Japanese are supported - -![](app.png) - -## Usage - -Use Button 1 (the top right button) to change the language - - -## Requests - -[Reach out to Adrian](https://www.github.com/awkirk71) if you have feature requests or notice bugs. - -## Creator - -Made by [Adrian Kirk](https://www.github.com/awkirk71). diff --git a/apps/numeralclock/app.png b/apps/numeralclock/app.png deleted file mode 100644 index 3680c3ce6043399affba29faae9712cc283c7a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22651 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 Z>57pLf7UNFR9qo-wKeqAD<9at{vRnE{6+u( diff --git a/apps/numeralclock/numeralclock-icon.js b/apps/numeralclock/numeralclock-icon.js deleted file mode 100644 index 2fc42f023..000000000 --- a/apps/numeralclock/numeralclock-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("lEowkE/4A/AH//+czCSKbBgXziYhKEQXxgMQgERgASIkf/CgM/+UBiISBCZAUBn4DBmcybAUTHZIUEmEQkcgl5gLJ4XygQCBj50MAYUQCZ3/HgXwkcyiZqBJxQoC+UD+cPXBIIBBQcwHIMBNwpNFDocQBoMwM4IUEn4kBMIZ3DAAMgQYoZCCYg6CVhKJFEQJyIn4VBkZrFDAgIJBxCqHO5DmJT4v/mQSIKxA+DDIIADCRJEDZgRCKIgjUHHJAPCPhprFExwSDJRgPDN5oUHCJ4A/AH4AIA==")) diff --git a/apps/numeralclock/numeralclock.js b/apps/numeralclock/numeralclock.js deleted file mode 100644 index bad86adeb..000000000 --- a/apps/numeralclock/numeralclock.js +++ /dev/null @@ -1,297 +0,0 @@ -const screen_center_x = g.getWidth()/2; -const screen_center_y = g.getHeight()/2; - -require("FontCopasetic40x58Numeric").add(Graphics); - -class Hand { - constructor(centerX, - centerY, - length, - tolerance, - draw_test, - red, - green, - blue){ - this.centerX = centerX; - this.centerY = centerY; - this.length = length; - this.red = red; - this.green = green; - this.blue = blue; - this.last_x = centerX; - this.last_y = centerY; - this.tolerance = tolerance; - this.draw_test = draw_test; - this.angle = -1; - this.last_draw_time = null; - } - // method to move the hand to a new angle - moveTo(angle){ - if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle,this.last_draw_time) ){ - g.setColor(0,0,0); - g.drawLine(this.centerX, this.centerY, this.last_x, this.last_y); - g.setColor(this.red,this.green,this.blue); - x2 = this.centerX + this.length*Math.cos(angle); - y2 = this.centerY + this.length*Math.sin(angle); - g.setColor(this.red,this.green,this.blue); - g.drawLine(this.centerX, this.centerY, x2, y2); - this.last_x = x2; - this.last_y = y2; - this.angle = angle; - this.last_draw_time = new Date(); - return true; - } else { - return false; - } - } -} - -class ThickHand { - constructor(centerX, - centerY, - length, - tolerance, - draw_test, - red, - green, - blue, - start_height, - thickness){ - this.centerX = centerX; - this.centerY = centerY; - this.length = length; - this.red = red; - this.green = green; - this.blue = blue; - this.thickness = thickness; - this.start_height = start_height; - this.delta_top = Math.atan(thickness/(2*length)); - this.delta_base = Math.atan(thickness/(2*start_height)); - this.last_x1 = centerX; - this.last_y1 = centerY; - this.last_x2 = centerX; - this.last_y2 = centerY; - this.last_x3 = centerX; - this.last_y3 = centerY; - this.last_x4 = centerX; - this.last_y4 = centerY; - this.tolerance = tolerance; - this.draw_test = draw_test; - this.angle = -1; - this.last_draw_time = null; - } - // method to move the hand to a new angle - moveTo(angle){ - if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle - this.delta_base,this.angle + this.delta_base ,this.last_draw_time) ){ - g.setColor(0,0,0); - g.fillPoly([this.last_x1, - this.last_y1, - this.last_x2, - this.last_y2, - this.last_x3, - this.last_y3, - this.last_x4, - this.last_y4 - ]); - g.setColor(this.red,this.green,this.blue); - // bottom left - x1 = this.centerX + - this.start_height*Math.cos(angle - this.delta_base); - y1 = this.centerY + this.start_height*Math.sin(angle - this.delta_base); - // bottom right - x2 = this.centerX + - this.start_height*Math.cos(angle + this.delta_base); - y2 = this.centerY + this.start_height*Math.sin(angle + this.delta_base); - // top right - x3 = this.centerX + this.length*Math.cos(angle + this.delta_top); - y3 = this.centerY + this.length*Math.sin(angle + this.delta_top); - // top left - x4 = this.centerX + this.length*Math.cos(angle - this.delta_top); - y4 = this.centerY + this.length*Math.sin(angle - this.delta_top); - g.setColor(this.red,this.green,this.blue); - g.fillPoly([x1,y1, - x2,y2, - x3,y3, - x4,y4 - ]); - this.last_x1 = x1; - this.last_y1 = y1; - this.last_x2 = x2; - this.last_y2 = y2; - this.last_x3 = x3; - this.last_y3 = y3; - this.last_x4 = x4; - this.last_y4 = y4; - this.angle = angle; - this.last_draw_time = new Date(); - return true; - } else { - return false; - } - } -} - -let seconds_hand = new Hand(screen_center_x, - screen_center_y, - 100, - 0, - (angle, last_draw_time) => false, - 0.5,0.5,0.5); - -let minutes_hand_redraw = function(angle, last_draw_time){ - return seconds_hand.angle > angle && - Math.abs(seconds_hand.angle - angle) <2*Math.PI/25 && - new Date().getTime() - last_draw_time.getTime() > 500; -}; - -let minutes_hand = new Hand(screen_center_x, - screen_center_y, - 80, - 2*Math.PI/250, - minutes_hand_redraw, - 1.0,1.0,1.0); - -let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ - return seconds_hand.angle >= angle_from && - seconds_hand.angle <= angle_to && - new Date().getTime() - last_draw_time.getTime() > 500; -}; -let hours_hand = new ThickHand(screen_center_x, - screen_center_y, - 40, - 2*Math.PI/600, - hour_hand_redraw, - 1.0,1.0,1.0, - 5, - 4); - -function draw_clock(){ - date = new Date(); - draw_hour_digit(date); - draw_seconds(date); - draw_mins(date); - draw_hours(date); -} - -function draw_seconds(date){ - seconds = date.getSeconds() + date.getMilliseconds()/1000; - seconds_frac = seconds / 60; - seconds_angle = 2*Math.PI*seconds_frac - (Math.PI/2.0); - seconds_hand.moveTo(seconds_angle); -} - - -function draw_mins(date,seconds_angle){ - mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); - mins_frac = mins / 60; - mins_angle = 2*Math.PI*mins_frac - (Math.PI/2.0); - redraw = minutes_hand.moveTo(mins_angle); - if(redraw){ - //console.log(date.getSeconds() + " redraw mins"); - } -} - -function draw_hours(date){ - hours = (date.getHours() % 12) + date.getMinutes()/60 + date.getSeconds()/3600; - hours_frac = hours / 12; - hours_angle = 2*Math.PI*hours_frac - (Math.PI/2.0); - redraw = hours_hand.moveTo(hours_angle); - if(redraw){ - //console.log(date.getSeconds() + " redraw hours"); - } -} - -let curr_hour_x = -1; -let curr_hour_y = -1; -let curr_hour_str = null; -const font_width = 40; -const font_height = 58; -function draw_hour_digit(date){ - hours = date.getHours() % 12; - mins = date.getMinutes(); - if(mins > 30){ - hours = (hours +1) % 12; - } - if(hours == 0){ - hours = 12; - } - hours_frac = hours / 12; - angle = 2*Math.PI*hours_frac - (Math.PI/2.0); - x = screen_center_x + 70*Math.cos(angle) - font_width/2; - y = screen_center_y + 70*Math.sin(angle) - font_height/2; - g.setFontCopasetic40x58Numeric(); - txt = hours.toString(); - if(curr_hour_str != null && curr_hour_str != txt){ - g.setColor(0,0,0); - g.drawString(curr_hour_str,curr_hour_x,curr_hour_y); - console.log("erasing old hour"); - } - g.setColor(1,1,1); - g.drawString(txt,x,y); - curr_hour_x = x; - curr_hour_y = y; - curr_hour_str = txt; -} - -// The interval reference for updating the clock -let intervalRef = null; - -function clearTimers(){ - if(intervalRef) { - clearInterval(intervalRef); - intervalRef = null; - } -} - -function startTimers(){ - setTimeout(scheduleDrawClock,1000); - draw_clock(); -} - -function scheduleDrawClock(){ - if(intervalRef) clearTimers(); - intervalRef = setInterval(draw_clock, 100); - draw_clock(); -} - -function reset_clock(){ - g.clear(); -} - -Bangle.on('lcdPower', (on) => { - if (on) { - console.log("lcdPower: on"); - Bangle.drawWidgets(); - reset_clock(); - startTimers(); - } else { - console.log("lcdPower: off"); - reset_clock(); - clearTimers(); - } -}); - -Bangle.on('faceUp',function(up){ - console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn()); - if (up && !Bangle.isLCDOn()) { - //console.log("faceUp and LCD off"); - clearTimers(); - Bangle.setLCDPower(true); - } -}); - -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); -startTimers(); - -// Show launcher when middle button pressed -setWatch(Bangle.showLauncher, BTN2,{repeat:false,edge:"falling"}); - -function button1pressed(){ - console.log("button 1 pressed"); -} - -// Handle button 1 being pressed -setWatch(button1pressed, BTN1,{repeat:true,edge:"falling"}); - diff --git a/apps/numeralclock/numeralclock.png b/apps/numeralclock/numeralclock.png deleted file mode 100644 index 9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ From b5e9aebcd552c86754393c2113d670981593e182 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 6 Mar 2021 20:50:48 +0000 Subject: [PATCH 06/17] BUGIFX: incorrect files copied --- apps/sweepclock/sweepclock.js | Bin 2944 -> 8388 bytes apps/sweepclock/sweeptext.png | Bin 2944 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/sweepclock/sweeptext.png diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899..bad86adebcea629a4aafc2dd3944a614b57b40b0 100644 GIT binary patch literal 8388 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 Tj+HFHXdnY;)<6tr*kj+{s&K%k literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ diff --git a/apps/sweepclock/sweeptext.png b/apps/sweepclock/sweeptext.png deleted file mode 100644 index 9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ From 9c2aa52e591cb7f778191b36889a4ad27f4b3714 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sun, 7 Mar 2021 00:23:23 +0000 Subject: [PATCH 07/17] BUGFIX: clock not refreshing after faceup --- apps/sweepclock/sweepclock.png | Bin 0 -> 2944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/sweepclock/sweepclock.png diff --git a/apps/sweepclock/sweepclock.png b/apps/sweepclock/sweepclock.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899 GIT binary patch literal 2944 zcmZ`*c{r478-K@=OgNT`kj5Z{nK2B}*k#F)C7dBkmKlvK!we>lH6`I>3t37BIb@$K zGl=@Kv`|{x$ocaUatH3<4LeSZORW82Lk}WZ*FF6 z%aRK0y>}1mpY)~Ck0rRg4J-`+pyv9%Pww2TGsM%())D~1jsie*8~|*wOwscI5R3qT z#d83loecn@gglxJn&lv4G3Gc+OW+tw-wSYqgaJ;L24Z~xNE~2CV`;!Cki>W07NqbE z!vO&Cc!290#)&1_%Z#_=d;05n;frTSq>?hvw{uRl?ntONau&}QjuGaL%} z3L#z4fnqGJAw~f~ScnD;0YgA_!4L=p9pr`6wly~SMrWOLpyx>>f;Jo;8X5`&-Pb&yLekHF~B#N4Y&8llXQ{aD1S5mz+>w#JjOzK+ItKde8Ioe8OqK*Rsh z^N&o-zcPRD{GDkO;2RKhhT!grWjFRU*$<{~Xf&KXiyvmQJNU0w*5q};X!!SAqzkUC z%Vu3;o-gLc26hF^d#@*8ZqBLL_FIJ>dX-P*9?8deJ)YdZ=^M-8!Q-| z98EJxb)wo1#H$;o+A6|roJvzUE4K8v^+!#?hQ@JR1inV)J1JsWaz?o7^=ny$@echek2Uic7cT32d(TP)XL`{0|Fu&&T54%?51JB99^ zKucXmyn5)$40s%z}I zREk+$-0Rya4gQ;5$r2#mcvD$DJ-1U97BewC*ZBAQ78ZJ@rB7w8uanCf@lo__S&WRl zygU|{NY6ShG4w`I_qLmWZh{JAf`jX7aZknT&NYxiLQY-$7>fPKL~mlNEZjdr#g2~?TWeHN3inkWSHVU%&PON&zWp`qQwZagZKR}sq0#e1z8 zqHbd_#)EC1;J_}Du)yWZi8IU@f%Mca^6hn;x3>iU4alpmd5>(ttC03mu!+1?T@yJ)dvwfDYLVB_=!D9GH+*}rcX|K-+&t!PS5{UgBp1-Ue&XZez35n_wA$Jm zPFVM4#<0#yb`AJz=y#hO?1^j_ltT9Z-lcuN$jI1BEE^qBAHc%T?J1>zV;YO;w0Uo|BSFiD^U4Z4O6WP}lT#rWif^=`iyR9{+I=hnA}O zPdKFQ{eBnc=flG#!@tzy9P6JW7Nr;tmCkrkbaxt>z|*}x5x;Z)US-XC;79|55k~p* zc2Kg=St?aa9O-!wX_0l%(tPhUg2`mgyr}VXFzR{YAUNgP1gBoXh#ojly2c&S>0nn* z6>&>=x0m4MxG0;bxAQ4hk-WX);^Y9nJE*OZayYpo}p z^pVrT<((Vu;{un29x#1yz zQ~B3&mvIv0j`a9VOc0rD%=ox-o_Fba?U|C~PUtgkmyTR6qi9OqW(LQGBRzfr-&E;L z^)cVrc&0blsG=SX7%IdEs$_uE-b-E~7g_OLj?IbV6c_J#TCqHJavFiu*cUw&XKydD z@#v=u=}rWmHndK}qvHK8TxI#mnGRnz77q4cL=|9<%kFP?O*j=AJ)zT|`9@ezMHIe* zlCMt0dgk}X3R<6SadnN zoVSkS1U=T|IVt>~)B9t2q4c6{)=-WgI1s^d%6?Mqj>6{*56z`J^Jb`_w8ne<=1bm%(Z8q~}{(VJj4& zH(V&WSh309Dl02%8*?rYBz>Ls)us}pKj;i`GO4@>4#@^4)!aaiFYVIdajGO9^gCAy zU+e9htPfH9qA&i`N6vdGlX}_Y1OF%UB@YsHq@(2bsZTpc^jBS>GOZvxbEp~zX+c;Y x=O*s_fJz?Uv_y&;&e?V}0F383?_0Qccs_-Xr)kc)nX})R<|j`ZR~nv+{Vz=r_@V#+ literal 0 HcmV?d00001 From cc68a1be1c4e4ee43c3c897724fcf9fcd35e723e Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sun, 7 Mar 2021 00:31:23 +0000 Subject: [PATCH 08/17] Sweep hand now red --- apps.json | 2 +- apps/sweepclock/sweepclock.js | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps.json b/apps.json index c1dd9afd9..faee5cd53 100644 --- a/apps.json +++ b/apps.json @@ -229,7 +229,7 @@ { "id": "sweepclock", "name": "Sweep Clock", "icon": "sweepclock.png", - "version":"0.01", + "version":"0.02", "description": "Smooth sweep secondhand with single hour numeral", "tags": "clock", "type":"clock", diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index bad86adeb..794993429 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -4,13 +4,13 @@ const screen_center_y = g.getHeight()/2; require("FontCopasetic40x58Numeric").add(Graphics); class Hand { - constructor(centerX, - centerY, - length, - tolerance, + constructor(centerX, + centerY, + length, + tolerance, draw_test, - red, - green, + red, + green, blue){ this.centerX = centerX; this.centerY = centerY; @@ -131,17 +131,18 @@ class ThickHand { } } +let force_redraw = false; let seconds_hand = new Hand(screen_center_x, screen_center_y, 100, 0, (angle, last_draw_time) => false, - 0.5,0.5,0.5); + 1.0,0.0,0.0); let minutes_hand_redraw = function(angle, last_draw_time){ - return seconds_hand.angle > angle && + return force_redraw || (seconds_hand.angle > angle && Math.abs(seconds_hand.angle - angle) <2*Math.PI/25 && - new Date().getTime() - last_draw_time.getTime() > 500; + new Date().getTime() - last_draw_time.getTime() > 500); }; let minutes_hand = new Hand(screen_center_x, @@ -152,9 +153,9 @@ let minutes_hand = new Hand(screen_center_x, 1.0,1.0,1.0); let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ - return seconds_hand.angle >= angle_from && + return force_redraw || (seconds_hand.angle >= angle_from && seconds_hand.angle <= angle_to && - new Date().getTime() - last_draw_time.getTime() > 500; + new Date().getTime() - last_draw_time.getTime() > 500); }; let hours_hand = new ThickHand(screen_center_x, screen_center_y, @@ -171,6 +172,7 @@ function draw_clock(){ draw_seconds(date); draw_mins(date); draw_hours(date); + force_redraw = false; } function draw_seconds(date){ @@ -244,7 +246,7 @@ function clearTimers(){ } function startTimers(){ - setTimeout(scheduleDrawClock,1000); + setTimeout(scheduleDrawClock,100); draw_clock(); } @@ -256,6 +258,7 @@ function scheduleDrawClock(){ function reset_clock(){ g.clear(); + force_redraw = true; } Bangle.on('lcdPower', (on) => { From 4d71953caeaf325113d34233790e15bde4c42c63 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 13 Mar 2021 00:07:36 +0000 Subject: [PATCH 09/17] ock now has ROman Numeral support --- apps.json | 2 +- apps/sweepclock/sweepclock.js | 243 +++++++++++++++++++++++++++++----- 2 files changed, 209 insertions(+), 36 deletions(-) diff --git a/apps.json b/apps.json index faee5cd53..b27e3bed0 100644 --- a/apps.json +++ b/apps.json @@ -229,7 +229,7 @@ { "id": "sweepclock", "name": "Sweep Clock", "icon": "sweepclock.png", - "version":"0.02", + "version":"0.03", "description": "Smooth sweep secondhand with single hour numeral", "tags": "clock", "type":"clock", diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 794993429..10111501f 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -1,9 +1,28 @@ +/** +* Adrian Kirk 2021-03 +* Simple Clock showing 1 numeral for the hour +* with a smooth sweep second. +*/ + const screen_center_x = g.getWidth()/2; const screen_center_y = g.getHeight()/2; require("FontCopasetic40x58Numeric").add(Graphics); class Hand { + /** + * Pure virtual class for all Hand classes to extend. + * a hand class will have 1 main function + * moveTo which will move the hand to the given angle. + */ + moveTo(angle){} +} + +class ThinHand extends Hand { + /** + * The thin hand is created from a simple line, so its easy and fast + * to draw. + */ constructor(centerX, centerY, length, @@ -18,23 +37,37 @@ class Hand { this.red = red; this.green = green; this.blue = blue; + // The last x and y coordinates (not the centre) of the last draw this.last_x = centerX; this.last_y = centerY; + // tolerance is the angle tolerance (from the last draw) + // in radians for a redraw to be called. this.tolerance = tolerance; + // draw test is a predicate (angle, time). This is called + // when the hand thinks that it does not have to draw (from its internal tests) + // to see if it has to draw because of another object. this.draw_test = draw_test; + // The current angle of the hand. Set to -1 initially this.angle = -1; this.last_draw_time = null; } // method to move the hand to a new angle moveTo(angle){ - if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle,this.last_draw_time) ){ + // first test to see of the angle called is beyond the tolerance + // for a redraw + if(Math.abs(angle - this.angle) > this.tolerance || + // and then call the predicate to see if a redraw is needed + this.draw_test(this.angle,this.last_draw_time) ){ + // rub out the old hand line g.setColor(0,0,0); g.drawLine(this.centerX, this.centerY, this.last_x, this.last_y); + // Now draw the new hand line g.setColor(this.red,this.green,this.blue); x2 = this.centerX + this.length*Math.cos(angle); y2 = this.centerY + this.length*Math.sin(angle); g.setColor(this.red,this.green,this.blue); g.drawLine(this.centerX, this.centerY, x2, y2); + // and store the last draw details for the next call this.last_x = x2; this.last_y = y2; this.angle = angle; @@ -46,7 +79,11 @@ class Hand { } } -class ThickHand { +class ThickHand extends Hand { + /** + * The thick hand is created from a filled polygone, so its slower to + * draw so to be used sparingly with few redraws + */ constructor(centerX, centerY, length, @@ -130,28 +167,31 @@ class ThickHand { } } } - +// The force draw is set to true to force all objects to redraw themselves let force_redraw = false; -let seconds_hand = new Hand(screen_center_x, +// The seconds hand is the main focus and is set to redraw on every cycle +let seconds_hand = new ThinHand(screen_center_x, screen_center_y, 100, 0, (angle, last_draw_time) => false, 1.0,0.0,0.0); - +// The minute hand is set to redraw at a 250th of a circle, +// when the second hand is ontop or slighly overtaking +// or when a force_redraw is called let minutes_hand_redraw = function(angle, last_draw_time){ return force_redraw || (seconds_hand.angle > angle && Math.abs(seconds_hand.angle - angle) <2*Math.PI/25 && new Date().getTime() - last_draw_time.getTime() > 500); }; - -let minutes_hand = new Hand(screen_center_x, +let minutes_hand = new ThinHand(screen_center_x, screen_center_y, 80, 2*Math.PI/250, minutes_hand_redraw, 1.0,1.0,1.0); - +// The hour hand is a thick hand so we have to redraw when the minute hand +// overlaps from its behind andle coverage to its ahead angle coverage. let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ return force_redraw || (seconds_hand.angle >= angle_from && seconds_hand.angle <= angle_to && @@ -174,15 +214,16 @@ function draw_clock(){ draw_hours(date); force_redraw = false; } - +// drawing the second the millisecond as we need the fine gradation +// for the sweep second hand. function draw_seconds(date){ seconds = date.getSeconds() + date.getMilliseconds()/1000; seconds_frac = seconds / 60; seconds_angle = 2*Math.PI*seconds_frac - (Math.PI/2.0); seconds_hand.moveTo(seconds_angle); } - - +// drawing the minute includes the second and millisec to make the +// movement as continuous as possible. function draw_mins(date,seconds_angle){ mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); mins_frac = mins / 60; @@ -199,17 +240,159 @@ function draw_hours(date){ hours_angle = 2*Math.PI*hours_frac - (Math.PI/2.0); redraw = hours_hand.moveTo(hours_angle); if(redraw){ - //console.log(date.getSeconds() + " redraw hours"); + console.log(date.getSeconds() + " redraw hours"); } } -let curr_hour_x = -1; -let curr_hour_y = -1; -let curr_hour_str = null; -const font_width = 40; -const font_height = 58; +/** +* We want to be able to change the font so we set up +* pure virtual for all fonts implementtions to use +*/ +class NumeralFont { + /** + * The screen dimensions of what we are going to + * display for the given hour. + */ + getDimensions(hour){return [0,0];} + /** + * The characters that are going to be returned for + * the hour. + */ + hour_txt(hour){ return ""; } + /** + * method to draw text at the required coordinates + */ + draw(hour_txt,x,y){ return "";} +} + +class CopasetFont extends NumeralFont{ + constructor(){ + this.dimension_map = { + 1 : [20,58], + 2 : [30,58], + 3 : [30,58], + 4 : [30,58], + 5 : [30,58], + 6 : [40,58], + 7 : [30,58], + 8 : [40,58], + 9 : [40,58], + 10: [50,40], + 11: [40,58], + 12: [40,58] + }; + } + getDimensions(hour){return this.dimension_map[hour];} + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + /* dim = [20,58]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + g.setFontCopasetic40x58Numeric(); + g.drawString(hour_txt,x,y); + } +} + + +class RomanNumeralFont extends NumeralFont{ + constructor(){ + this.txt_map = { + 1 : 'I', + 2 : 'II', + 3 : 'III', + 4 : 'IV', + 5 : 'V', + 6 : 'VI', + 7 : 'VII', + 8 : 'VIII', + 9 : 'IX', + 10: 'X', + 11: 'XI', + 12: 'XII' + }; + this.dimension_map = { + 1 : [10,40], + 2 : [25,40], + 3 : [40,40], + 4 : [40,40], + 5 : [30,40], + 6 : [40,40], + 7 : [60,40], + 8 : [70,40], + 9 : [40,40], + 10: [20,40], + 11: [40,40], + 12: [60,40] + }; + } + getDimensions(hour){ return this.dimension_map[hour];} + hour_txt(hour){ return this.txt_map[hour]; } + draw(hour_txt,x,y){ + g.setFont("Vector",40); + g.drawString(hour_txt,x,y); + } +} + + +class HourScriber { + constructor(numeral_font){ + this.numeral_font = numeral_font; + this.curr_numeral_font = numeral_font; + this.curr_hour_x = -1; + this.curr_hour_y = -1; + this.curr_hour_str = null; + this.radius = 70; + } + setNumeralFont(numeral_font){ + this.numeral_font = numeral_font; + } + drawHour(hours){ + hours_frac = hours / 12; + angle = 2*Math.PI*hours_frac; + dimensions = this.numeral_font.getDimensions(hours); + // we set the radial coord to be in the middle + // of the drawn text. + x = screen_center_x + this.radius*Math.sin(angle) - dimensions[0]/2; + y = screen_center_y - this.radius*Math.cos(angle) - dimensions[1]/2; + txt = this.numeral_font.hour_txt(hours); + if(this.curr_hour_str != null && this.curr_hour_str != txt){ + g.setColor(0,0,0); + this.curr_numeral_font.draw(this.curr_hour_str, + this.curr_hour_x, + this.curr_hour_y); + console.log("erasing old hour"); + } + g.setColor(1,1,1); + this.numeral_font.draw(txt,x,y); + this.curr_numeral_font = this.numeral_font; + this.curr_hour_x = x; + this.curr_hour_y = y; + this.curr_hour_str = txt; + } +} + +let numeral_fonts = [new CopasetFont(), new RomanNumeralFont()]; +let numeral_fonts_index = 0; +let hour_scriber = new HourScriber(numeral_fonts[numeral_fonts_index]); + +function next_font(){ + numeral_fonts_index = numeral_fonts_index + 1; + if(numeral_fonts_index >= numeral_fonts.length){ + numeral_fonts_index = 0; + } + hour_scriber.setNumeralFont( + numeral_fonts[numeral_fonts_index]); + force_redraw = true; +} + function draw_hour_digit(date){ hours = date.getHours() % 12; + //hours = date.getMinutes() % 12; mins = date.getMinutes(); if(mins > 30){ hours = (hours +1) % 12; @@ -217,25 +400,12 @@ function draw_hour_digit(date){ if(hours == 0){ hours = 12; } - hours_frac = hours / 12; - angle = 2*Math.PI*hours_frac - (Math.PI/2.0); - x = screen_center_x + 70*Math.cos(angle) - font_width/2; - y = screen_center_y + 70*Math.sin(angle) - font_height/2; - g.setFontCopasetic40x58Numeric(); - txt = hours.toString(); - if(curr_hour_str != null && curr_hour_str != txt){ - g.setColor(0,0,0); - g.drawString(curr_hour_str,curr_hour_x,curr_hour_y); - console.log("erasing old hour"); - } - g.setColor(1,1,1); - g.drawString(txt,x,y); - curr_hour_x = x; - curr_hour_y = y; - curr_hour_str = txt; + //hours = 1; + hour_scriber.drawHour(hours); } -// The interval reference for updating the clock +// Boiler plate code for setting up the clock +// below let intervalRef = null; function clearTimers(){ @@ -250,6 +420,9 @@ function startTimers(){ draw_clock(); } +// The clock redraw is set to 100ms. This is the smallest number +// that give the (my) human eye the illusion of a continious sweep +// second hand. function scheduleDrawClock(){ if(intervalRef) clearTimers(); intervalRef = setInterval(draw_clock, 100); @@ -292,7 +465,7 @@ startTimers(); setWatch(Bangle.showLauncher, BTN2,{repeat:false,edge:"falling"}); function button1pressed(){ - console.log("button 1 pressed"); + next_font(); } // Handle button 1 being pressed From dd0d3a61ac2551f843272901d3e6da3bb0fda1c5 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sun, 14 Mar 2021 20:59:04 +0000 Subject: [PATCH 10/17] Only redraw the digit when it needs to --- apps.json | 2 +- apps/sweepclock/sweepclock.js | 177 ++++++++++++++++++++++++++-------- 2 files changed, 140 insertions(+), 39 deletions(-) diff --git a/apps.json b/apps.json index b27e3bed0..ace232eeb 100644 --- a/apps.json +++ b/apps.json @@ -229,7 +229,7 @@ { "id": "sweepclock", "name": "Sweep Clock", "icon": "sweepclock.png", - "version":"0.03", + "version":"0.04", "description": "Smooth sweep secondhand with single hour numeral", "tags": "clock", "type":"clock", diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 10111501f..802361f56 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -63,8 +63,8 @@ class ThinHand extends Hand { g.drawLine(this.centerX, this.centerY, this.last_x, this.last_y); // Now draw the new hand line g.setColor(this.red,this.green,this.blue); - x2 = this.centerX + this.length*Math.cos(angle); - y2 = this.centerY + this.length*Math.sin(angle); + x2 = this.centerX + this.length*Math.sin(angle); + y2 = this.centerY - this.length*Math.cos(angle); g.setColor(this.red,this.green,this.blue); g.drawLine(this.centerX, this.centerY, x2, y2); // and store the last draw details for the next call @@ -133,18 +133,18 @@ class ThickHand extends Hand { g.setColor(this.red,this.green,this.blue); // bottom left x1 = this.centerX + - this.start_height*Math.cos(angle - this.delta_base); - y1 = this.centerY + this.start_height*Math.sin(angle - this.delta_base); + this.start_height*Math.sin(angle - this.delta_base); + y1 = this.centerY - this.start_height*Math.cos(angle - this.delta_base); // bottom right x2 = this.centerX + - this.start_height*Math.cos(angle + this.delta_base); - y2 = this.centerY + this.start_height*Math.sin(angle + this.delta_base); + this.start_height*Math.sin(angle + this.delta_base); + y2 = this.centerY - this.start_height*Math.cos(angle + this.delta_base); // top right - x3 = this.centerX + this.length*Math.cos(angle + this.delta_top); - y3 = this.centerY + this.length*Math.sin(angle + this.delta_top); + x3 = this.centerX + this.length*Math.sin(angle + this.delta_top); + y3 = this.centerY - this.length*Math.cos(angle + this.delta_top); // top left - x4 = this.centerX + this.length*Math.cos(angle - this.delta_top); - y4 = this.centerY + this.length*Math.sin(angle - this.delta_top); + x4 = this.centerX + this.length*Math.sin(angle - this.delta_top); + y4 = this.centerY - this.length*Math.cos(angle - this.delta_top); g.setColor(this.red,this.green,this.blue); g.fillPoly([x1,y1, x2,y2, @@ -219,7 +219,7 @@ function draw_clock(){ function draw_seconds(date){ seconds = date.getSeconds() + date.getMilliseconds()/1000; seconds_frac = seconds / 60; - seconds_angle = 2*Math.PI*seconds_frac - (Math.PI/2.0); + seconds_angle = 2*Math.PI*seconds_frac; seconds_hand.moveTo(seconds_angle); } // drawing the minute includes the second and millisec to make the @@ -227,20 +227,20 @@ function draw_seconds(date){ function draw_mins(date,seconds_angle){ mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); mins_frac = mins / 60; - mins_angle = 2*Math.PI*mins_frac - (Math.PI/2.0); + mins_angle = 2*Math.PI*mins_frac; redraw = minutes_hand.moveTo(mins_angle); if(redraw){ - //console.log(date.getSeconds() + " redraw mins"); + console.log("redraw mins"); } } function draw_hours(date){ hours = (date.getHours() % 12) + date.getMinutes()/60 + date.getSeconds()/3600; hours_frac = hours / 12; - hours_angle = 2*Math.PI*hours_frac - (Math.PI/2.0); + hours_angle = 2*Math.PI*hours_frac; redraw = hours_hand.moveTo(hours_angle); if(redraw){ - console.log(date.getSeconds() + " redraw hours"); + console.log("redraw hours"); } } @@ -277,7 +277,7 @@ class CopasetFont extends NumeralFont{ 7 : [30,58], 8 : [40,58], 9 : [40,58], - 10: [50,40], + 10: [50,58], 11: [40,58], 12: [40,58] }; @@ -285,7 +285,7 @@ class CopasetFont extends NumeralFont{ getDimensions(hour){return this.dimension_map[hour];} hour_txt(hour){ return hour.toString(); } draw(hour_txt,x,y){ - /* dim = [20,58]; + /*dim = [50,58]; g.setColor(0.5,0,0); g.fillPoly([x,y, x+dim[0],y, @@ -338,48 +338,151 @@ class RomanNumeralFont extends NumeralFont{ } } +function reifyasin(x,y,asin_angle){ + if(x >= 0 && y >= 0){ + return asin_angle; + } else if(x >= 0 && y < 0){ + return Math.PI - asin_angle; + } else if(x < 0 && y < 0){ + return Math.PI - asin_angle; + } else { + return 2*Math.PI + asin_angle; + } +} + +function rebaseNegative(angle){ + if(angle > Math.PI){ + return angle - 2*Math.PI; + } else { + return angle; + } +} + +function rebasePositive(angle){ + if(angle < 0){ + return angle + 2*Math.PI; + } else { + return angle; + } +} class HourScriber { - constructor(numeral_font){ + constructor(radius, numeral_font, draw_test){ + this.radius = radius; this.numeral_font = numeral_font; + this.draw_test = draw_test; this.curr_numeral_font = numeral_font; this.curr_hour_x = -1; this.curr_hour_y = -1; + this.curr_hours = -1; this.curr_hour_str = null; - this.radius = 70; + this.last_draw_time = null; } setNumeralFont(numeral_font){ this.numeral_font = numeral_font; } drawHour(hours){ - hours_frac = hours / 12; - angle = 2*Math.PI*hours_frac; - dimensions = this.numeral_font.getDimensions(hours); - // we set the radial coord to be in the middle - // of the drawn text. - x = screen_center_x + this.radius*Math.sin(angle) - dimensions[0]/2; - y = screen_center_y - this.radius*Math.cos(angle) - dimensions[1]/2; - txt = this.numeral_font.hour_txt(hours); - if(this.curr_hour_str != null && this.curr_hour_str != txt){ + changed = false; + if(this.curr_hours != hours || this.curr_numeral_font !=this.numeral_font){ g.setColor(0,0,0); this.curr_numeral_font.draw(this.curr_hour_str, this.curr_hour_x, this.curr_hour_y); console.log("erasing old hour"); + hours_frac = hours / 12; + angle = 2*Math.PI*hours_frac; + dimensions = this.numeral_font.getDimensions(hours); + // we set the radial coord to be in the middle + // of the drawn text. + width = dimensions[0]; + height = dimensions[1]; + delta_center_x = this.radius*Math.sin(angle) - width/2; + delta_center_y = this.radius*Math.cos(angle) + height/2; + this.curr_hour_x = screen_center_x + delta_center_x; + this.curr_hour_y = screen_center_y - delta_center_y; + this.curr_hour_str = this.numeral_font.hour_txt(hours); + // now work out the angle of the beginning and the end of the + // text box so we know when to redraw + // bottom left angle + x1 = delta_center_x; + y1 = delta_center_y; + r1 = Math.sqrt(x1*x1 + y1*y1); + angle1 = reifyasin(x1,y1,Math.asin(x1/r1)); + // bottom right angle + x2 = delta_center_x; + y2 = delta_center_y - height; + r2 = Math.sqrt(x2*x2 + y2*y2); + angle2 = reifyasin(x2,y2,Math.asin(x2/r2)); + // top left angle + x3 = delta_center_x + width; + y3 = delta_center_y; + r3 = Math.sqrt(x3*x3 + y3*y3); + angle3 = reifyasin(x3,y3, Math.asin(x3/r3)); + // top right angle + x4 = delta_center_x + width; + y4 = delta_center_y - height; + r4 = Math.sqrt(x4*x4 + y4*y4); + angle4 = reifyasin(x4,y4,Math.asin(x4/r4)); + if(Math.min(angle1,angle2,angle3,angle4) < Math.PI && Math.max(angle1,angle2,angle3,angle4) > 1.5*Math.PI){ + angle1 = rebaseNegative(angle1); + angle2 = rebaseNegative(angle2); + angle3 = rebaseNegative(angle3); + angle3 = rebaseNegative(angle4); + this.angle_from = rebasePositive( Math.min(angle1,angle2,angle3,angle4) ); + this.angle_to = rebasePositive( Math.max(angle1,angle2,angle3,angle4) ); + } else { + this.angle_from = Math.min(angle1,angle2,angle3,angle4); + this.angle_to = Math.max(angle1,angle2,angle3,angle4); + } + //console.log(angle1 + "/" + angle2 + " / " + angle3 + " / " + angle4); + //console.log( this.angle_from + " to " + this.angle_to); + this.curr_hours = hours; + this.curr_numeral_font = this.numeral_font; + changed = true; + } + if(changed || + this.draw_test(this.angle_from, this.angle_to, this.last_draw_time) ){ + g.setColor(1,1,1); + this.numeral_font.draw(this.curr_hour_str,this.curr_hour_x,this.curr_hour_y); + this.last_draw_time = new Date(); + console.log("redraw digit"); } - g.setColor(1,1,1); - this.numeral_font.draw(txt,x,y); - this.curr_numeral_font = this.numeral_font; - this.curr_hour_x = x; - this.curr_hour_y = y; - this.curr_hour_str = txt; } } let numeral_fonts = [new CopasetFont(), new RomanNumeralFont()]; let numeral_fonts_index = 0; -let hour_scriber = new HourScriber(numeral_fonts[numeral_fonts_index]); - +/** +* predicate for deciding when the digit has to be redrawn +*/ +let hour_numeral_redraw = function(angle_from, angle_to, last_draw_time){ + seconds_hand_angle = seconds_hand.angle; + // we have to cope with the 12 problem where the + // left side of the box has a value almost 2PI and the right + // side has a small positive value. The values are rebased so + // that they can be compared + if(angle_from > angle_to && angle_from > 1.5*Math.PI){ + angle_from = angle_from - 2*Math.PI; + if(seconds_hand_angle > Math.PI) + seconds_hand_angle = seconds_hand_angle - 2*Math.PI; + } + //console.log("initial:" + angle_from + "/" + angle_to + " seconds " + seconds_hand_angle); + redraw = force_redraw || + (seconds_hand_angle >= angle_from && seconds_hand_angle <= angle_to) || + (minutes_hand.last_draw_time.getTime() > last_draw_time.getTime()); + if(redraw){ + //console.log(angle_from + "/" + angle_to + " seconds " + seconds_hand_angle); + } + return redraw; +}; +let hour_scriber = new HourScriber(70, + numeral_fonts[numeral_fonts_index], + hour_numeral_redraw + ); +/** +* Called from button 1 to change the numerals that are +* displayed on the clock face +*/ function next_font(){ numeral_fonts_index = numeral_fonts_index + 1; if(numeral_fonts_index >= numeral_fonts.length){ @@ -392,7 +495,6 @@ function next_font(){ function draw_hour_digit(date){ hours = date.getHours() % 12; - //hours = date.getMinutes() % 12; mins = date.getMinutes(); if(mins > 30){ hours = (hours +1) % 12; @@ -400,7 +502,6 @@ function draw_hour_digit(date){ if(hours == 0){ hours = 12; } - //hours = 1; hour_scriber.drawHour(hours); } From 0a27d4d63fd7cca0c3406550883f62d7452834cd Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Fri, 19 Mar 2021 23:55:56 +0000 Subject: [PATCH 11/17] Adding the proper supporting images and comments --- apps.json | 4 +-- apps/sweepclock/README.md | 9 +++-- apps/sweepclock/app.png | Bin 22651 -> 29609 bytes apps/sweepclock/sweepclock.js | 59 +++++++++++++++++++++++++-------- apps/sweepclock/sweepclock.png | Bin 2944 -> 3427 bytes 5 files changed, 53 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index ace232eeb..93eb03582 100644 --- a/apps.json +++ b/apps.json @@ -229,8 +229,8 @@ { "id": "sweepclock", "name": "Sweep Clock", "icon": "sweepclock.png", - "version":"0.04", - "description": "Smooth sweep secondhand with single hour numeral", + "version":"0.01", + "description": "Smooth sweep secondhand with single hour numeral. Use button1 to toggle the numeral font", "tags": "clock", "type":"clock", "allow_emulator":true, diff --git a/apps/sweepclock/README.md b/apps/sweepclock/README.md index 00f716e4a..a12e9660b 100644 --- a/apps/sweepclock/README.md +++ b/apps/sweepclock/README.md @@ -1,13 +1,16 @@ -# Sliding Text Clock - See the time in different languages +# Sweep Clock -Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently only English, French and Japanese are supported +The Sweep Clock provides a clock with a perfectly smooth sweep second hand with a single Numeral Display. ![](app.png) ## Usage -Use Button 1 (the top right button) to change the language +Use Button 1 (the top right button) to change the numeral types (currently European and Roman) +##Further Details + +For further details of design and working please visit [The Project Page](https://www.notion.so/adrianwkirk/Sweep-hand-clock-6aa5b6b3d1074d4e87fc947975b1e4b7) ## Requests diff --git a/apps/sweepclock/app.png b/apps/sweepclock/app.png index 3680c3ce6043399affba29faae9712cc283c7a9c..1310ca904de00117f5ad8106ab7f33ab3541fa31 100644 GIT binary patch literal 29609 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 Z>57pLf7UNFR9qo-wKeqAD<9at{vRnE{6+u( diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 802361f56..282841491 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -92,7 +92,7 @@ class ThickHand extends Hand { red, green, blue, - start_height, + base_height, thickness){ this.centerX = centerX; this.centerY = centerY; @@ -101,9 +101,16 @@ class ThickHand extends Hand { this.green = green; this.blue = blue; this.thickness = thickness; - this.start_height = start_height; + this.base_height = base_height; + // angle from the center to the top corners of the rectangle this.delta_top = Math.atan(thickness/(2*length)); - this.delta_base = Math.atan(thickness/(2*start_height)); + // angle from the center to the bottom corners of the rectangle + this.delta_base = Math.atan(thickness/(2*base_height)); + // the radius that the bottom corners of the rectangle move through + this.vertex_radius_base = Math.sqrt( (thickness*thickness/4) + base_height * base_height); + // the radius that the top corners of the rectangle move through + this.vertex_radius_top = Math.sqrt( (thickness*thickness/4) + length * length); + // last records the last plotted values (so we don't have to keep recalculating this.last_x1 = centerX; this.last_y1 = centerY; this.last_x2 = centerX; @@ -112,7 +119,10 @@ class ThickHand extends Hand { this.last_y3 = centerY; this.last_x4 = centerX; this.last_y4 = centerY; + // The change in angle from the last plotted angle before we actually redraw this.tolerance = tolerance; + // predicate test that is called if the hand is not going to redraw to see + // if there is an externally defined reason for redrawing (like another hand) this.draw_test = draw_test; this.angle = -1; this.last_draw_time = null; @@ -132,19 +142,19 @@ class ThickHand extends Hand { ]); g.setColor(this.red,this.green,this.blue); // bottom left - x1 = this.centerX + - this.start_height*Math.sin(angle - this.delta_base); - y1 = this.centerY - this.start_height*Math.cos(angle - this.delta_base); + x1 = this.centerX + + this.vertex_radius_base*Math.sin(angle - this.delta_base); + y1 = this.centerY - this.vertex_radius_base*Math.cos(angle - this.delta_base); // bottom right - x2 = this.centerX + - this.start_height*Math.sin(angle + this.delta_base); - y2 = this.centerY - this.start_height*Math.cos(angle + this.delta_base); + x2 = this.centerX + + this.vertex_radius_base*Math.sin(angle + this.delta_base); + y2 = this.centerY - this.vertex_radius_base*Math.cos(angle + this.delta_base); // top right - x3 = this.centerX + this.length*Math.sin(angle + this.delta_top); - y3 = this.centerY - this.length*Math.cos(angle + this.delta_top); + x3 = this.centerX + this.vertex_radius_top*Math.sin(angle + this.delta_top); + y3 = this.centerY - this.vertex_radius_top*Math.cos(angle + this.delta_top); // top left - x4 = this.centerX + this.length*Math.sin(angle - this.delta_top); - y4 = this.centerY - this.length*Math.cos(angle - this.delta_top); + x4 = this.centerX + this.vertex_radius_top*Math.sin(angle - this.delta_top); + y4 = this.centerY - this.vertex_radius_top*Math.cos(angle - this.delta_top); g.setColor(this.red,this.green,this.blue); g.fillPoly([x1,y1, x2,y2, @@ -267,6 +277,8 @@ class NumeralFont { class CopasetFont extends NumeralFont{ constructor(){ + // dimesion map provides the dimesions of the character for + // each number for plotting and collision detection this.dimension_map = { 1 : [20,58], 2 : [30,58], @@ -285,7 +297,10 @@ class CopasetFont extends NumeralFont{ getDimensions(hour){return this.dimension_map[hour];} hour_txt(hour){ return hour.toString(); } draw(hour_txt,x,y){ - /*dim = [50,58]; + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions + dim = [50,58]; g.setColor(0.5,0,0); g.fillPoly([x,y, x+dim[0],y, @@ -301,6 +316,7 @@ class CopasetFont extends NumeralFont{ class RomanNumeralFont extends NumeralFont{ constructor(){ + // text map provides the mapping between hour and roman numeral this.txt_map = { 1 : 'I', 2 : 'II', @@ -315,6 +331,8 @@ class RomanNumeralFont extends NumeralFont{ 11: 'XI', 12: 'XII' }; + // dimesion map provides the dimesions of the characters for + // each hour for plotting and collision detection this.dimension_map = { 1 : [10,40], 2 : [25,40], @@ -338,6 +356,10 @@ class RomanNumeralFont extends NumeralFont{ } } +// The problem with the trig inverse functions on +// a full circle is that the sector information will be lost +// Choosing to use arcsin because you can get back the +// sector with the help of the original coordinates function reifyasin(x,y,asin_angle){ if(x >= 0 && y >= 0){ return asin_angle; @@ -350,6 +372,8 @@ function reifyasin(x,y,asin_angle){ } } +// rebase and angle so be between -pi and pi +// rather than 0 to 2PI function rebaseNegative(angle){ if(angle > Math.PI){ return angle - 2*Math.PI; @@ -358,6 +382,8 @@ function rebaseNegative(angle){ } } +// rebase an angle so that it is between 0 to 2pi +// rather than -pi to pi function rebasePositive(angle){ if(angle < 0){ return angle + 2*Math.PI; @@ -366,6 +392,11 @@ function rebasePositive(angle){ } } +/** +* The Hour Scriber is responsible for drawing the numeral +* on the screen at the requested angle. +* It allows for the font to be changed on the fly. +*/ class HourScriber { constructor(radius, numeral_font, draw_test){ this.radius = radius; diff --git a/apps/sweepclock/sweepclock.png b/apps/sweepclock/sweepclock.png index 9ebf691b3b3ca6cfef8dfbb1d6fc18e1e61d7899..fcf38162eb9c6bca0d739a43a298435d57bdf4df 100644 GIT binary patch delta 2631 zcmV-N3b^%v7vma`U;%`YVNn}k000010001B0000100W=_00RI300962005D}92sVT z=V$-`010qNS#tmY4#WTe4#WYKD-Ij6_I3h)3DrqNK~z`?l~`MERM!>$#xpi!k5g`q z6>Qg+5@Qmlb_x{^6$Ih{6;&GbA$>>_sg8mmM9l*d5>1S1;( zZKIeJCou$bF__x;0>ltpJNSN?>H5|_>zp$)cB^jboW1wj>+F@7PAyguN zkqGzztmVz7v|S@dIXRvZDL1C1v{y<7W3d==b8|60J&n1!IT=rhmZZuVb26FKCi(fy zSDZx|q0yY29Iaj3fRbj9qlL%WHd)HEQGI;55>_PKYR}OaCTLi{xqlzc&CM!MRrN3|l*%r;8O#X7s$ri$v=;K1 z8Dwp3YNl9Djsq5^b1d9fkR*!rR4SeNZ>dSy3?i%T#&JBw&E>aR0@)yhaI zNEJ@gY2Y{#dC}^-bdnfGFt{ z2yk^rN@M1>jnhm%^`IJ5W&y^UAicu2^{wWRwOO0d+}s#ONAKgmK5|BvMxHoKtxjHQ{hSOfx!b8sOpFFX8>@!w=Ee*ocynQVp+7N@Yc_ z+eicuI3%mBLkbmPs#Csn-a3HZT)cj%P-HXhNrh|ML|Jg-teltIwjDdLJqIj z3_5zu7=r`u1f5|W@xicvN4ka1+6?d5*r9Zst7F+ae(=ZQVNjmV}dq?oX3ooL$v=q~`Gs5V3LM-ZJgr5}3{P*Ja zMJhFC_nBj-5(AN`!01+U+ziFzd2;7oP?0TLw;@qjh*@SZ)TfYtGPR}mv+Z&k4vTlp zcr*3n!XQY>>N!b&G!t?Nx3;#T;i*knyY>g@>+i$eJ9iZ1js5{F|Mr8JnVFWGHi(Wn zB3!d=4>tktW$Uw651L`szQBuXi8G-Py*D*8gQM@iuiRgJ@j2p)7NNGbPWwYc_hjR^ zg}#8g`N_dt{BiZ5dCO{!X0?Tul=Y@MI5XL~H@dsg-rkOX<4sMn1`qp6dk35cneH#- zK~9tAIMIM<*kc26zF+z=JZ=2t%k_C_BWoLGKkN3UTt(3H*5bcHJCYZ#_LdK7`9x zuA<_*m6({E)B`=oMN-GZfJjISCkgX-Q9Y=FjD)AmK$3244Q)J*ftv$(=GmW89j;#O zl+cc$sHjLX=Q!f|`Emy{#R}x8lHVVqNM$lXDv>XLu0I3d6D4A78;F4J7OV9Mj=OSp zW)i=B{WnO?OrgBIT+=HWUc`)&@49IlD^dqdVCbde^pF&5n=Z%Z#@JR5 zI%4{pVP#1abXsl~o0!pPk8OLbZ?(~V{tz!|5)djN zyHi91`T22-jea8=;&uG|`R7qqRwki~Vq|2*Uw2Nzz4>9z!f|W6k^c?O_|j_va-d`l zx(3lk1Vp|Z7nd(z!mod|52ye3cT`nX=?%MC(+4?VO3 zomZ}4=-xfO`V1%|Vlq4l=wbIeE|>&Cru5g`9Ip$p?9EDA?(dfL<&TAU2xvR|PhvxT zeZB0~tE#ZBu1>-65Dw3nhG~qn0@+M|ES;T~1rTo?iHP*`_c>Aq4<@}xVCq@~?M=yF0X;%D$ng*GF9x*fd z^T9u1@7}#QE+64_kJq6|(y3bcQez^pWXTdejOk65=brl+wr%?nc>I)QGc-HA6!JrCs0os(I>R|C-@0XG6}ZrG3A2GaItwrjTEL`qBl2WqpnZ4ZTy@8(Y9vo{rhSz@i8p010qNS#tmY z3ljhU3ljkVnw%K30s(dce+T|aL_t(o3GJ9!Y?Rj($Ipysys;Q;s1swrLA6LQ6!1c9 z8ft^HG?kLKG(qV@McR@^ky^P@(uXucky0ryQCg{y1FiZ%`#{=93PMDL1aJ(vETNDX zmnB1Huhm#q&YYF4TOXGrM~<4MGacSV>&a9HaR-8XdV1`M%di@jDJWPd^XJbuMYu5% ziOTlvKT(herLuCP(Z}NxYSCLVFfbr5y|hERy1Hcl{(s4;e^slbwe`3xT2!Ex9M9

JM&z;HMsUav=T zb90Taq@+al?){s(chn4%mF2YD(-d+hzt(2xX!!6|y5fBreyvE!$*XU|_`=gwcq;>C*%aB3V+ zVbUKNT@16&m!$#jNPmC7T)1#igMOI-#ii^Ki_m@a(Ghv-sUOMOwH4~#urxI_NlD2v zxpwWkt(%&DE$_VZd(G%^<0C9)Gcs6^GT~U(A*ishe^444ejuNHcGBEaUS57D&f@A$ zuQWDpmABs7C2zjDO9A~#t@JYk?)CaLqlYCB2$(!vPuX!T=RVVcoiU3M0MJ-0W`gVL z9#waD$=6>8EwkNyEb{8BzmykW+%E6F`v-M#$aE48g@udd^5qVbk;r(T@n&ad8x55p z-N@)-f0z)6AjPQ)Mkh~x;zWxkPqifi;GiQZh{@8@hvem#e=aY)@MBr9V1Z@szJ33Y z=H@?X;RcK&^XAQy;^JbR-!b_Z02!$koxy^M`bHdGzaFr7qb}y==F7Tu>*V6aOXgk< z;_-Mb=&{x-uk2JXyRAG`R&J6F8`jIEOJ7*Ff7jP<(KuZzOO`A#FC0DkiR~c+L!?^s zE`XfEoiN2>Q6W1iEhkR2n$ojp&&buQS1nV?SU^uq#1(j+W%T>+H_J26JS+9}^(tXh zs;a6HC2zd(JNfFXfPyQMva*$0$T!L6&719DBpG2tjYa?Dpincz;oCOH$0N?@=!g@I ze-0^K+_`oOnEHzj@Exv!~hKqcfpr)EOM?bq*ffuXL?O&z@Z(EC6))@IfaSyzZPo-(~>1 zyFdVeDFcDGcgf!c;_A-kb%H8=k?cr zYcw}*T(d*L4;}L0X=(Y?W;`CT!+RjW_Y_@R)z{aj*H^Y?S+>K^Y_u3TvsJjs$g za0kip;fMdUtFE!}aoM-;?|QS$pK^^6Te-P88Zu)RGE0{hO-TskF!J*9<=C-fe^x`w z%2p8LUb`>3hFBLB6{+wAcE?s!thp0kiS`I^WLfGYi$DMTf+=|W?Oj?{3Z~RLHjo{S z#*|mIp?Gi#IQHFgH9kHj>(_tJ;?eZrvewp3o96EGZGw&f; zx^#)PO#nd=r)9cAxlMX|d-a|ke=$oZ7h;qrj|4A(r@8{!c!K7E61IBvYAZpLF2)6H zy25EZ6Q}0By(wj7Wd_LYKG=8H@B$KgJOS{ThU-#1OY=ZWN9S|u)M>$UG$+XNA1zpCQ1Vezcwe^$&^jXh`>1n&JT)ApV^z_p|)VM7)fB-@$hjA^G3X=C6hIph; z426Q4gaaBH%gwFq<3;2!GByi<b zV75&r3INzUe!Ru*S*%LZ0GtHCos=^`(TM||IA#!H@FxSa4gHhRf(ater2F#n@~kWA z=(r*c4Gks` Date: Sat, 20 Mar 2021 00:10:48 +0000 Subject: [PATCH 12/17] Fixed typo in README file for sweep clock --- apps/sweepclock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sweepclock/README.md b/apps/sweepclock/README.md index a12e9660b..51920f8f1 100644 --- a/apps/sweepclock/README.md +++ b/apps/sweepclock/README.md @@ -8,7 +8,7 @@ The Sweep Clock provides a clock with a perfectly smooth sweep second hand with Use Button 1 (the top right button) to change the numeral types (currently European and Roman) -##Further Details +## Further Details For further details of design and working please visit [The Project Page](https://www.notion.so/adrianwkirk/Sweep-hand-clock-6aa5b6b3d1074d4e87fc947975b1e4b7) From 846adb8d092bdbcca45d8a9edac59330fb570fd9 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 20 Mar 2021 00:25:00 +0000 Subject: [PATCH 13/17] Adding proper icon to sweep clock --- apps/sweepclock/sweepclock-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sweepclock/sweepclock-icon.js b/apps/sweepclock/sweepclock-icon.js index 2fc42f023..49d854061 100644 --- a/apps/sweepclock/sweepclock-icon.js +++ b/apps/sweepclock/sweepclock-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("lEowkE/4A/AH//+czCSKbBgXziYhKEQXxgMQgERgASIkf/CgM/+UBiISBCZAUBn4DBmcybAUTHZIUEmEQkcgl5gLJ4XygQCBj50MAYUQCZ3/HgXwkcyiZqBJxQoC+UD+cPXBIIBBQcwHIMBNwpNFDocQBoMwM4IUEn4kBMIZ3DAAMgQYoZCCYg6CVhKJFEQJyIn4VBkZrFDAgIJBxCqHO5DmJT4v/mQSIKxA+DDIIADCRJEDZgRCKIgjUHHJAPCPhprFExwSDJRgPDN5oUHCJ4A/AH4AIA==")) +require("heatshrink").decompress(atob("+HwwkE/4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AC+cikU/If4AzkEAgEBPH4Ay+R2BAAMCIv4AxmJ3DgDw/AGMwiB2CiEfI34AwkDvEgZG/AF/zdwZ3/O+Z2EgEfI/4Av+R3Fl5H/AF/xO4s/I/4AvmB2EgJ3/AGEgO4kCI34AwiB3EgZG/AF/zOwkAiZH/AF/yO4svI/4Av+J3Fn5H/AF8wO4pG/AGEgOwkCI34AwiB3EgZG/AF/zOwh3/AGPyO4sfI/4Av+J2EiE/I/4AvmDvFO/532gRG/AGEQOwcBgZG/AF/zdwkAO/533j5H/AF/xO4s/I/4AvmB3/O/kBI34AwiB3EgRG/AF/zOwkAgZH/O+0fI/4Av+R3Fl5H/AF8wO4s/I/531gJG/AGEgO4kCI34Av+Z2EgEDI/53wgJ3Ej5H/AF/yd4svI/4AvmB3Fn5H/O+sBI34AwkB3EgRG/AF/zOwkAgZH/O+0fI/4Av+R3Fl5H/AF8wO4s/I/531gJ3/AGEgO4kCI34Av+cQO4kDI/53wOwkAj5H/AF/yO4svI/4Av+J3Fn5H/AF8wOwkBI34AwkB3EgRG/AF/ziB3EgZH/O+B2EgEfI/4Av+R3Fl5H/AF/xO4s/I/4AvmB2EgJG/AGEgO4kCI34AwiB3EgZG/AF/zOwkAiZH/AF/yO4svI/4Av+J3Fn5H/AF8wO/4A2kEQOwcCI34AwOwkAgZG/AF/zOwh3/AGPygJ3El5H/AF/xd4s/I/4AvmB3/AG0gOwkCI34AwiB3EgZG/AF/zOwh3/O/EvI/4Av+J3Fn5H/AF8wO/4A2kB2EgRG/AGEQO4kDI34Av+Z2EO/534j5H/AF/xOwkQn5H/AF8wd4p3/O+MQOwcBI34Au+czOwkAgZI/AFp1GO/4Av+R2BPA0vJX4Ar+btHO/4AumB2IgECJf7urOxLw/d28AgLw/d2wABn5P/AE/xO5sfJ/4AnmEQO5kCJ/4AnOxoABn5Q/AEvzOxx3/AE/yO58fKP4AlmB3PgZR/O/4A/ADsgOx0BO/4Amdx8AgRR/AEnzgJ3/AGvyd/4A2+B2PgJ3/AEswd6EDKX4AkkB3/AG0yiEAgJ3/AGnzmLvOl5R/AE8zeQIAKiE/J/7ysPZJ3/eVkggEBOw0BJf4Albo3zmTuHgZR/AEnygUjeRJ3/AFUwNAMSeRsfKX4AkcgcBeQ/zkIMBiCFGAH4Ad+cBcYjyH/8yiEAO/4Ak+J2ENgLyJkRS/AEkgO4jyMAH4Aj+Z2IAALyIAH4Ai+R3KeX4ArmEQPBjy/AFB2NeX4Ao+R2PAAMCKf4AjmB2QgJ3/AEkQd6MDKf4Ai+cBO/4A1+B2RO/4AkkB3/AGvzgJ3Sj5V/AEMwOyR3/AEcgO6cvKv4Ag+Z2TO/4AimB3/AG0gO/4A1+cBO6k/K/4AfmB2UO/7uhiB3/AGvyOyp3/AEEwd/4A1+buWO/4AfmJ3XLH4AekB2WgJY/ADvygJ3/AGswOyx3/AD3zOy53/AD3xO7ECLX4AckEQO/4A0+UBd/4A1mB2YO/4Ac+Z2ZO/7u3O/7u3O/4AbmJ3/AG0QiB3/AGnxgLv/d2x2bO/4AZmR2cO/4AY+cQd/4A1mMBd/7u1Orp3/ADEgO/4A1+R2fO/7uXiB3/AGkwd0B3/ACnyO0J3/ACkgO8UBMn4ARmJ2iO/4AS+Z2jO/4ANn4EDkB3kgBr/AB8xgJ3lUYgA/ABPzgEQO/4A0kB1lO/4APmMBO/4A0+R1nO/4AN+cgO9MvNn4AKmJ2pO/4ALmR2qO/4AK+cQO9cfN34AIkB2rgEDN34AHmMAd9h3/AA/zdtgABgRw/AA0gO90BOH7u1AAM/OX7v1O/4AHmB3vl5x/AAvxO98DOP4AF+ZWOiB3/AE5oNgR3ggRETmczO+EwKpkiOz8AgM/IaMyCwMSO9/yKZcCQpoAUO6PzCwcTPF8giBTJl4LKAC8vIKEwGoUBgKPRADsxdxS5EADzYJ+ciNYg0FiCPRADo2BchEv+RsXERAABgbnJVIIGD+UBC5zwnG4oABgRJCAC0gBRIlBWBDkF+IWEgJ3u+YBBZg5EBmDXKABcBO5UAn45HV4R34OwJGBmLIHn5eLABcCmB3Wj7v4AAZuFXYL5IAB8DO5ZrDO4gKBiDvD+QjGOdrwBAYRvDdwJJDO8RgICgIzCGpETd+KyCgMAn5BCAoIAEgL3Pj53LNghwEmYzCWoz6FAGEyVwjvHgUgO50vO5ahDABgcDgMBO2YABXQh3HgZ3tGwkv+YNGDp4AiO48fO58/O5kfG58yiEAiYNJPGPzgLeGO50BO5sDHKMzJB0hQ4L/HO8a3Bbwp3OgX/+IONAD6mCeoL3qmB4EbxxoD+T+MdRpfK+b3F+cgI4MDOtIABLwpmBO5xDBO5jLCABMxgESn4PHN4MBkYIEOwMBO9n/kB3F+J3dj6pNMRCuDQYfzO4LvtGIMhI4nzgJnO+aHOABEwbQUBHg8AN40/XwUvO9gABPAR3CIAR3agQuJFAjjDfY0BDYgJBgQTGAFKrBMwLGDABS7CYIQAKKhCPFl4PF+ILDfgXzAQMzO2A1BkDvBXQh3MmAQPO5gMFO4p1CAGvzmb1Ebxp3Nj4rIiANCiB3LgQsCPQjxxKBB3K+R3MgYnIkAnDMQwjEDRL12kJDBgJ3J+Z3MgImImAjBiMCVZcfO/xFBmTyIZ4cgPBjhGNYsvBg8xBYMCUYZ5/PI5lDmB2LiBqIEgMikYxJmUimbu/PJZ3D+bvMO5IA/PLZlEkD8GAAcCK34AjmUgiYGD+R2JgM/Kf7zlmYGEkB0GAQMjKP5+tiB4GO354wkR5CgMin4KCAYYA/PNczAAJD/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHI=")) From 13408e97ed23d5227e61a48d803aeeabd3e781c0 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 20 Mar 2021 00:30:46 +0000 Subject: [PATCH 14/17] 2nd attempt at changing the icon --- apps/sweepclock/sweepclock-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sweepclock/sweepclock-icon.js b/apps/sweepclock/sweepclock-icon.js index 49d854061..58bbb5bb9 100644 --- a/apps/sweepclock/sweepclock-icon.js +++ b/apps/sweepclock/sweepclock-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("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")) +require("heatshrink").decompress(atob("+HwgP/AH4A/AH4A/8YdcwAdcgE/DjX+Dr0fDrX8Dv4AY/AdeWbYdd+Adev4d48AdeDjQd84EBDv4AXwEDDv4AXgEHDv4AW/0Ah4d/AC38gEfDv4AW/EAn4d/AC3wgF/Dv4AW8EADjQd84EBDv4AXwEDDv4AXgAddg4d4/wdeh4d4/gdej4d4/Aden4d4+Adev4d/AC3ggAcaDvnAgId/AC+AgYd/AC8Ag4d/AC3+gEPDv4AW/kAj4d/AC34gE/Dv4AW+EAv4dagAdbLAIdbLAIdb8AdBSrXADrmADoMfWTcAh4cY/wdCg4d2/gdCgYd2/AdCgId/ACnwDsEADu3gDvyVZ4DR6/wdcLQcDDrP4Drn/DrrTBg4bYx///gdawACCDrMAn7yBh4dZHAP+DrH+WIIEB54dXSQMAK7IdDgIdZ/AdBS4QdbaDPwDoSXCAC3gDoZaYDrvADod/DuuADrgcDDu3+Drn8DvX4DrnwDoiyXDrvgDrnADrmADvQcEDq/+Drn8DvX4DrnwDrngDrnADrmADvQcFDq3+Drn8Drn4DrnwDrngDrnADrjuGDqwcGDqruHDqruHDqruHDqrQHDqrQHDqrQHDqocHDqiyIDqiyIDqnwDriyIDqiyIDqgcIDqayJDqayJDqayJDqayJDqayJgF/DiH+DhIdSWRQdSWRQdS8AdcWRUAn4dQDhQd/AB2ADpUfDtyzLDrsPDqHgCgMCDpngv4dK+AUBgwdM4BfLDoUEDo8HUwhfL/AUBhgdK5//EYoAG/gUBjAdKwYdN/wUBnAdHgYOBgYPBDpYrBgF4DQi5CDoUBDp2AgCYCDrHggIdFa4UBLKPwgYdLSpzSBh4dLQ4TvLWgMfDpEAQ4gdMLYUAiAZChwdG4EfDq9/UoYEDDpkwDpQAD/ghKDqP4n61KgE4DIUeAYQUH+B7KDpngDYV/Dpf8gF4DIUfAYbQCLoPgn4dL/8AvgdKH4LTBDpngDo8PFIQdBwEPSpZoBvwdOeBn8Doc/wAdFKgIdOCYQdFg4dV4AdJSoYdO+AdCEIUDWYwdOLQQdG4DvDDp/gDoICBgEBBAPzAQP4Dh5vDLoQdCACpOBDoRZCAC0f/DvEAC/+DoKsQW5ivBADPgg4caAH4A/AH4A//4=")) From 20ed1abb2385a8da7d56c8951fbe6b03164fdbc8 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 20 Mar 2021 00:35:09 +0000 Subject: [PATCH 15/17] attempt 3 at the sweep clock icon --- apps/sweepclock/sweepclock-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sweepclock/sweepclock-icon.js b/apps/sweepclock/sweepclock-icon.js index 58bbb5bb9..a22ec25ab 100644 --- a/apps/sweepclock/sweepclock-icon.js +++ b/apps/sweepclock/sweepclock-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("+HwgP/AH4A/AH4A/8YdcwAdcgE/DjX+Dr0fDrX8Dv4AY/AdeWbYdd+Adev4d48AdeDjQd84EBDv4AXwEDDv4AXgEHDv4AW/0Ah4d/AC38gEfDv4AW/EAn4d/AC3wgF/Dv4AW8EADjQd84EBDv4AXwEDDv4AXgAddg4d4/wdeh4d4/gdej4d4/Aden4d4+Adev4d/AC3ggAcaDvnAgId/AC+AgYd/AC8Ag4d/AC3+gEPDv4AW/kAj4d/AC34gE/Dv4AW+EAv4dagAdbLAIdbLAIdb8AdBSrXADrmADoMfWTcAh4cY/wdCg4d2/gdCgYd2/AdCgId/ACnwDsEADu3gDvyVZ4DR6/wdcLQcDDrP4Drn/DrrTBg4bYx///gdawACCDrMAn7yBh4dZHAP+DrH+WIIEB54dXSQMAK7IdDgIdZ/AdBS4QdbaDPwDoSXCAC3gDoZaYDrvADod/DuuADrgcDDu3+Drn8DvX4DrnwDoiyXDrvgDrnADrmADvQcEDq/+Drn8DvX4DrnwDrngDrnADrmADvQcFDq3+Drn8Drn4DrnwDrngDrnADrjuGDqwcGDqruHDqruHDqruHDqrQHDqrQHDqrQHDqocHDqiyIDqiyIDqnwDriyIDqiyIDqgcIDqayJDqayJDqayJDqayJDqayJgF/DiH+DhIdSWRQdSWRQdS8AdcWRUAn4dQDhQd/AB2ADpUfDtyzLDrsPDqHgCgMCDpngv4dK+AUBgwdM4BfLDoUEDo8HUwhfL/AUBhgdK5//EYoAG/gUBjAdKwYdN/wUBnAdHgYOBgYPBDpYrBgF4DQi5CDoUBDp2AgCYCDrHggIdFa4UBLKPwgYdLSpzSBh4dLQ4TvLWgMfDpEAQ4gdMLYUAiAZChwdG4EfDq9/UoYEDDpkwDpQAD/ghKDqP4n61KgE4DIUeAYQUH+B7KDpngDYV/Dpf8gF4DIUfAYbQCLoPgn4dL/8AvgdKH4LTBDpngDo8PFIQdBwEPSpZoBvwdOeBn8Doc/wAdFKgIdOCYQdFg4dV4AdJSoYdO+AdCEIUDWYwdOLQQdG4DvDDp/gDoICBgEBBAPzAQP4Dh5vDLoQdCACpOBDoRZCAC0f/DvEAC/+DoKsQW5ivBADPgg4caAH4A/AH4A//4=")) +require("heatshrink").decompress(atob("/4AdmU/CaMgCaUQCaPzgQmR+UDCaPxCaUwj525gJ2/CZ0vMSJ2SkEACaCJBgEPRKEAgJ3Q+cxE6Myn8yO6EggMjMSR3Q+ASBgCdRO4KJQCaMwCaPzCQQTPEwYTOJoYTO+cQCaKHCAAizLkEQYgQTF+YTHmMAkITEj//l8wl4UHkcwiIRBAQMD/8/CZKLBiUAiEigMCBAMzCwMyPI8zPQMzgMBn/yh/zgZSICoMxn5kC+ZmBPhY3CHAIAbA==")) From ed3cf621b0b93d917c52c64c90c2b5359241e221 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 20 Mar 2021 00:43:34 +0000 Subject: [PATCH 16/17] next attempt at the sweep clock icon --- apps/sweepclock/sweepclock-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sweepclock/sweepclock-icon.js b/apps/sweepclock/sweepclock-icon.js index a22ec25ab..20a114caa 100644 --- a/apps/sweepclock/sweepclock-icon.js +++ b/apps/sweepclock/sweepclock-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("/4AdmU/CaMgCaUQCaPzgQmR+UDCaPxCaUwj525gJ2/CZ0vMSJ2SkEACaCJBgEPRKEAgJ3Q+cxE6Myn8yO6EggMjMSR3Q+ASBgCdRO4KJQCaMwCaPzCQQTPEwYTOJoYTO+cQCaKHCAAizLkEQYgQTF+YTHmMAkITEj//l8wl4UHkcwiIRBAQMD/8/CZKLBiUAiEigMCBAMzCwMyPI8zPQMzgMBn/yh/zgZSICoMxn5kC+ZmBPhY3CHAIAbA==")) +require("heatshrink").decompress(atob("lEowkE/4AdmU/CaMgCaUQCaPzgQmR+UDCaPxCaUwj525gJ2/CZ0vMSJ2SkEACaCJBgEPRKEAgJ3Q+cxE6Myn8yO6EggMjMSR3Q+ASBgCdRO4KJQCaMwCaPzCQQTPEwYTOJoYTO+cQCaKHCAAizLkEQYgQTF+YTHmMAkITEj//l8wl4UHkcwiIRBAQMD/8/CZKLBiUAiEigMCBAMzCwMyPI8zPQMzgMBn/yh/zgZSICoMxn5kC+ZmBPhY3CHAIAbA")) From f1ec8463e446f3f4fece123dc2ce453c3560b7d8 Mon Sep 17 00:00:00 2001 From: adrian w kirk Date: Sat, 20 Mar 2021 01:05:48 +0000 Subject: [PATCH 17/17] correcting for failed travis test --- apps/sweepclock/sweepclock.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/sweepclock/sweepclock.js b/apps/sweepclock/sweepclock.js index 282841491..286e0bf8e 100644 --- a/apps/sweepclock/sweepclock.js +++ b/apps/sweepclock/sweepclock.js @@ -31,6 +31,7 @@ class ThinHand extends Hand { red, green, blue){ + super(); this.centerX = centerX; this.centerY = centerY; this.length = length; @@ -94,6 +95,7 @@ class ThickHand extends Hand { blue, base_height, thickness){ + super(); this.centerX = centerX; this.centerY = centerY; this.length = length; @@ -277,6 +279,7 @@ class NumeralFont { class CopasetFont extends NumeralFont{ constructor(){ + super(); // dimesion map provides the dimesions of the character for // each number for plotting and collision detection this.dimension_map = { @@ -316,6 +319,7 @@ class CopasetFont extends NumeralFont{ class RomanNumeralFont extends NumeralFont{ constructor(){ + super(); // text map provides the mapping between hour and roman numeral this.txt_map = { 1 : 'I',