1+ {
12const defaultSettings = {
23 loadWidgets : false ,
34 textAboveHands : false ,
@@ -11,9 +12,9 @@ const zahlpos=(function() {
1112 let z = [ ] ;
1213 let sk = 1 ;
1314 for ( let i = - 10 ; i < 50 ; i += 5 ) {
14- let win = i * 2 * Math . PI / 60 ;
15- let xsk = c . x + 2 + Math . cos ( win ) * ( c . x - 10 ) ,
16- ysk = c . y + 2 + Math . sin ( win ) * ( c . x - 10 ) ;
15+ let win = i * 2 * Math . PI / 60 ;
16+ let xsk = c . x + 2 + Math . cos ( win ) * ( c . x - 10 ) ,
17+ ysk = c . y + 2 + Math . sin ( win ) * ( c . x - 10 ) ;
1718 if ( sk == 3 ) { xsk -= 10 ; }
1819 if ( sk == 6 ) { ysk -= 10 ; }
1920 if ( sk == 9 ) { xsk += 10 ; }
@@ -25,18 +26,15 @@ const zahlpos=(function() {
2526 return z ;
2627} ) ( ) ;
2728
28- let unlock = false ;
29-
30- function zeiger ( len , dia , tim ) {
29+ const zeiger = function ( len , dia , tim ) {
3130 const x = c . x + Math . cos ( tim ) * len / 2 ,
3231 y = c . y + Math . sin ( tim ) * len / 2 ,
3332 d = { "d" :3 , "x" :dia / 2 * Math . cos ( tim + Math . PI / 2 ) , "y" :dia / 2 * Math . sin ( tim + Math . PI / 2 ) } ,
3433 pol = [ c . x - d . x , c . y - d . y , c . x + d . x , c . y + d . y , x + d . x , y + d . y , x - d . x , y - d . y ] ;
3534 return pol ;
35+ } ;
3636
37- }
38-
39- function drawHands ( d ) {
37+ const drawHands = function ( d ) {
4038 let m = d . getMinutes ( ) , h = d . getHours ( ) , s = d . getSeconds ( ) ;
4139 g . setColor ( 1 , 1 , 1 ) ;
4240
@@ -61,32 +59,60 @@ function drawHands(d) {
6159 g . fillPoly ( sekz , true ) ;
6260 }
6361 g . fillCircle ( c . x , c . y , 4 ) ;
64- }
62+ } ;
6563
66- function drawText ( d ) {
64+ const drawText = function ( d ) {
6765 g . setFont ( "Vector" , 10 ) ;
6866 g . setBgColor ( 0 , 0 , 0 ) ;
6967 g . setColor ( 1 , 1 , 1 ) ;
70- let dateStr = require ( "locale" ) . date ( d ) ;
68+ const dateStr = require ( "locale" ) . date ( d ) ;
7169 g . drawString ( dateStr , c . x , c . y + 20 , true ) ;
72- let batStr = Math . round ( E . getBattery ( ) / 5 ) * 5 + "%" ;
70+ const batStr = Math . round ( E . getBattery ( ) / 5 ) * 5 + "%" ;
7371 if ( Bangle . isCharging ( ) ) {
7472 g . setBgColor ( 1 , 0 , 0 ) ;
7573 }
7674 g . drawString ( batStr , c . x , c . y + 40 , true ) ;
77- }
75+ } ;
7876
79- function drawNumbers ( ) {
77+ const drawNumbers = function ( ) {
8078 //draws the numbers on the screen
8179 g . setFont ( "Vector" , 20 ) ;
8280 g . setColor ( 1 , 1 , 1 ) ;
8381 g . setBgColor ( 0 , 0 , 0 ) ;
8482 for ( let i = 0 ; i < 12 ; i ++ ) {
85- g . drawString ( zahlpos [ i ] [ 0 ] , zahlpos [ i ] [ 1 ] , zahlpos [ i ] [ 2 ] , true ) ;
83+ g . drawString ( zahlpos [ i ] [ 0 ] , zahlpos [ i ] [ 1 ] , zahlpos [ i ] [ 2 ] , true ) ;
8684 }
87- }
85+ } ;
86+
87+ let drawTimeout ;
88+ let queueMillis = 1000 ;
89+ let unlock = true ;
90+
91+ const updateState = function ( ) {
92+ if ( Bangle . isLCDOn ( ) ) {
93+ if ( ! Bangle . isLocked ( ) ) {
94+ queueMillis = 1000 ;
95+ unlock = true ;
96+ } else {
97+ queueMillis = 60000 ;
98+ unlock = false ;
99+ }
100+ draw ( ) ;
101+ } else {
102+ if ( drawTimeout ) clearTimeout ( drawTimeout ) ;
103+ drawTimeout = undefined ;
104+ }
105+ } ;
106+
107+ const queueDraw = function ( ) {
108+ if ( drawTimeout ) clearTimeout ( drawTimeout ) ;
109+ drawTimeout = setTimeout ( function ( ) {
110+ drawTimeout = undefined ;
111+ draw ( ) ;
112+ } , queueMillis - ( Date . now ( ) % queueMillis ) ) ;
113+ } ;
88114
89- function draw ( ) {
115+ const draw = function ( ) {
90116 // draw black rectangle in the middle to clear screen from scale and hands
91117 g . setColor ( 0 , 0 , 0 ) ;
92118 g . fillRect ( 10 , 10 , 2 * c . x - 10 , 2 * c . x - 10 ) ;
@@ -100,10 +126,11 @@ function draw(){
100126 } else {
101127 drawText ( d ) ; drawHands ( d ) ;
102128 }
103- }
129+ queueDraw ( ) ;
130+ } ;
104131
105132//draws the scale once the app is startet
106- function drawScale ( ) {
133+ const drawScale = function ( ) {
107134 // clear the screen
108135 g . setBgColor ( 0 , 0 , 0 ) ;
109136 g . clear ( ) ;
@@ -117,36 +144,35 @@ function drawScale(){
117144 g . fillRect ( 10 , 10 , 2 * c . x - 10 , 2 * c . x - 10 ) ;
118145 g . setColor ( 1 , 1 , 1 ) ;
119146 }
120- }
147+ } ;
121148
122149//// main running sequence ////
123150
124151// Show launcher when middle button pressed, and widgets that we're clock
125- Bangle . setUI ( "clock" ) ;
152+ Bangle . setUI ( {
153+ mode : "clock" ,
154+ remove : function ( ) {
155+ Bangle . removeListener ( 'lcdPower' , updateState ) ;
156+ Bangle . removeListener ( 'lock' , updateState ) ;
157+ Bangle . removeListener ( 'charging' , draw ) ;
158+ // We clear drawTimout after removing all listeners, because they can add one again
159+ if ( drawTimeout ) clearTimeout ( drawTimeout ) ;
160+ drawTimeout = undefined ;
161+ require ( "widget_utils" ) . show ( ) ;
162+ }
163+ } ) ;
126164// Load widgets if needed, and make them show swipeable
127165if ( settings . loadWidgets ) {
128166 Bangle . loadWidgets ( ) ;
129167 require ( "widget_utils" ) . swipeOn ( ) ;
130168} else if ( global . WIDGETS ) require ( "widget_utils" ) . hide ( ) ;
131- // Clear the screen once, at startup
132- drawScale ( ) ;
133- draw ( ) ;
134-
135- let secondInterval = setInterval ( draw , 1000 ) ;
136169
137170// Stop updates when LCD is off, restart when on
138- Bangle . on ( 'lcdPower' , on => {
139- if ( secondInterval ) clearInterval ( secondInterval ) ;
140- secondInterval = undefined ;
141- if ( on ) {
142- secondInterval = setInterval ( draw , 1000 ) ;
143- draw ( ) ; // draw immediately
144- }
145- } ) ;
146- Bangle . on ( 'lock' , on => {
147- unlock = ! on ;
148- if ( secondInterval ) clearInterval ( secondInterval ) ;
149- secondInterval = setInterval ( draw , unlock ? 1000 : 60000 ) ;
150- draw ( ) ; // draw immediately
151- } ) ;
152- Bangle . on ( 'charging' , on => { draw ( ) ; } ) ;
171+ Bangle . on ( 'lcdPower' , updateState ) ;
172+ Bangle . on ( 'lock' , updateState ) ;
173+ Bangle . on ( 'charging' , draw ) ; // Immediately redraw when charger (dis)connected
174+
175+ updateState ( ) ;
176+ drawScale ( ) ;
177+ draw ( ) ;
178+ }
0 commit comments