11{
2- let waiting = false ;
2+ let loading = false ;
3+ let timeoutRef = null ;
34 let settings = Object . assign (
45 require ( 'Storage' ) . readJSON ( "owmweather.default.json" , true ) || { } ,
56 require ( 'Storage' ) . readJSON ( "owmweather.json" , true ) || { }
67 ) ;
7-
8- let completion = function ( ) {
9- waiting = false ;
8+
9+ let refreshMillis = function ( ) {
10+ return settings . refresh * 1000 * 60 + 1 // +1 <- leave some slack
11+ }
12+
13+ let onCompleted = function ( ) {
14+ loading = false ;
1015 settings . updated = Date . now ( ) ;
1116 require ( 'Storage' ) . writeJSON ( "owmweather.json" , settings ) ;
17+ if ( timeoutRef ) clearTimeout ( timeoutRef ) ;
18+ timeoutRef = setTimeout ( loadIfDueAndReschedule , refreshMillis ( ) ) ;
1219 }
1320
14- if ( settings . enabled ) {
21+ let loadIfDueAndReschedule = function ( ) {
22+ // also check if the weather.json file has been updated (e.g. force refresh)
1523 let weather = require ( "Storage" ) . readJSON ( 'weather.json' ) || { } ;
16- if ( weather && weather . weather && weather . weather . time ) lastUpdate = weather . weather . time ;
17-
18- if ( ! settings . updated || settings . updated + settings . refresh * 1000 * 60 < Date . now ( ) ) {
19- setTimeout ( ( ) => {
20- if ( ! waiting ) {
21- waiting = true ;
22- require ( "owmweather" ) . pull ( completion ) ;
23- }
24- } , 5000 ) ;
24+ let lastWeatherUpdate = weather && weather . weather && weather . weather . time && weather . weather . time || 0 ;
25+ if ( lastWeatherUpdate > settings . updated ) {
26+ settings . updated = lastWeatherUpdate ;
2527 }
26- setInterval ( ( ) => {
27- if ( ! waiting && NRF . getSecurityStatus ( ) . connected ) {
28- waiting = true ;
29- require ( "owmweather" ) . pull ( completion ) ;
28+
29+ let MillisUntilDue = settings . updated + refreshMillis ( ) - Date . now ( ) ;
30+ if ( MillisUntilDue <= 0 ) {
31+ if ( ! loading ) {
32+ loading = true ;
33+ require ( "owmweather" ) . pull ( onCompleted ) ;
3034 }
31- } , settings . refresh * 1000 * 60 ) ;
35+ } else {
36+ // called to early, reschedule
37+ // console.log('Weather data is not due yet, rescheduling in ' + MillisUntilDue|0 + 'ms');
38+ if ( timeoutRef ) clearTimeout ( timeoutRef ) ;
39+ timeoutRef = setTimeout ( loadIfDueAndReschedule , MillisUntilDue + 1 ) ;
40+ }
41+ }
42+
43+ if ( settings . enabled ) {
44+ setTimeout ( loadIfDueAndReschedule , 5000 ) ; // run 5 seconds after boot
45+ NRF . on ( 'connect' , loadIfDueAndReschedule ) ; // after reconnect, fetch the weather data right away if it's due
3246 }
33- }
47+ }
0 commit comments