13
13
14
14
15
15
// -----------------------------------------------------------------------------
16
- app::app () : ah::Scheduler {} {
16
+ app::app ()
17
+ : ah::Scheduler {}
18
+ , mSunrise {0 }
19
+ , mSunset {0 }
20
+ , idTickMqttSecond {MAX_NUM_TICKER}
21
+ , idTickMqttMinute {MAX_NUM_TICKER}
22
+ , idTickMidnight {MAX_NUM_TICKER}
23
+ , idTickReboot {MAX_NUM_TICKER}
24
+ {
17
25
memset (mVersion , 0 , sizeof (char ) * 12 );
18
26
memset (mVersionModules , 0 , sizeof (char ) * 12 );
19
27
}
@@ -51,7 +59,7 @@ void app::setup() {
51
59
#else
52
60
mNetwork = static_cast <AhoyNetwork*>(new AhoyWifi ());
53
61
#endif
54
- mNetwork ->setup (mConfig , & mTimestamp , [this ](bool gotIp) { this ->onNetwork (gotIp); }, [this ](bool gotTime) { this ->onNtpUpdate (gotTime); });
62
+ mNetwork ->setup (mConfig , [this ](bool gotIp) { this ->onNetwork (gotIp); }, [this ](uint32_t gotTime) { this ->onNtpUpdate (gotTime); });
55
63
mNetwork ->begin ();
56
64
57
65
esp_task_wdt_reset ();
@@ -151,15 +159,19 @@ void app::loop(void) {
151
159
void app::onNetwork (bool gotIp) {
152
160
mNetworkConnected = gotIp;
153
161
if (gotIp) {
154
- ah::Scheduler::resetTicker ();
155
- regularTickers (); // reinstall regular tickers
162
+ mNetwork ->updateNtpTime ();
156
163
if (!mConfig ->inst .startWithoutTime ) // already set in regularTickers
157
164
every (std::bind (&app::tickSend, this ), mConfig ->inst .sendInterval , " tSend" );
158
- mTickerInstallOnce = true ;
159
- mSunrise = 0 ; // needs to be set to 0, to reinstall sunrise and ivComm tickers!
160
165
161
- uint32_t nextTrig = (mTimestamp < 0x1337 ) ? 0 : (mConfig ->ntp .interval * 60 );
162
- once (std::bind (&app::tickNtpUpdate, this ), nextTrig, " ntp" );
166
+ #if defined(ENABLE_MQTT)
167
+ if (mMqttEnabled ) {
168
+ if (MAX_NUM_TICKER == idTickMqttSecond)
169
+ idTickMqttSecond = everySec (std::bind (&PubMqttType::tickerSecond, &mMqtt ), " mqttS" );
170
+
171
+ if (MAX_NUM_TICKER == idTickMqttMinute)
172
+ idTickMqttMinute = everyMin (std::bind (&PubMqttType::tickerMinute, &mMqtt ), " mqttM" );
173
+ }
174
+ #endif /* ENABLE_MQTT*/
163
175
}
164
176
}
165
177
@@ -170,9 +182,15 @@ void app::regularTickers(void) {
170
182
everySec ([this ]() { mProtection ->tickSecond (); }, " prot" );
171
183
everySec ([this ]() {mNetwork ->tickNetworkLoop (); }, " net" );
172
184
173
- if (mConfig ->inst .startWithoutTime && ! mNetworkConnected )
185
+ if (mConfig ->inst .startWithoutTime )
174
186
every (std::bind (&app::tickSend, this ), mConfig ->inst .sendInterval , " tSend" );
175
187
188
+
189
+ every ([this ]() { mNetwork ->updateNtpTime (); }, mConfig ->ntp .interval * 60 , " ntp" );
190
+
191
+ if (mConfig ->inst .rstValsNotAvail )
192
+ everyMin (std::bind (&app::tickMinute, this ), " tMin" );
193
+
176
194
// Plugins
177
195
#if defined(PLUGIN_DISPLAY)
178
196
if (DISP_TYPE_T0_NONE != mConfig ->plugin .display .type )
@@ -191,62 +209,32 @@ void app::regularTickers(void) {
191
209
}
192
210
193
211
// -----------------------------------------------------------------------------
194
- void app::onNtpUpdate (bool gotTime) {
195
- mNtpReceived = true ;
196
- if ((0 == mSunrise ) && (0.0 != mConfig ->sun .lat ) && (0.0 != mConfig ->sun .lon )) {
197
- mCalculatedTimezoneOffset = (int8_t )((mConfig ->sun .lon >= 0 ? mConfig ->sun .lon + 7.5 : mConfig ->sun .lon - 7.5 ) / 15 ) * 3600 ;
198
- tickCalcSunrise ();
199
- }
200
-
201
- if (mTickerInstallOnce ) {
202
- mTickerInstallOnce = false ;
203
- #if defined(ENABLE_MQTT)
204
- if (mMqttEnabled ) {
205
- mMqtt .tickerSecond ();
206
- everySec (std::bind (&PubMqttType::tickerSecond, &mMqtt ), " mqttS" );
207
- everyMin (std::bind (&PubMqttType::tickerMinute, &mMqtt ), " mqttM" );
212
+ void app::onNtpUpdate (uint32_t utcTimestamp) {
213
+ if (0 == utcTimestamp) {
214
+ // try again in 5s
215
+ once ([this ]() { mNetwork ->updateNtpTime (); }, 5 , " ntp" );
216
+ } else {
217
+ mTimestamp = utcTimestamp;
218
+ DPRINTLN (DBG_INFO, " [NTP]: " + ah::getDateTimeStr (mTimestamp ) + " UTC" );
219
+
220
+ uint32_t localTime = gTimezone .toLocal (mTimestamp );
221
+ uint32_t midTrig = gTimezone .toUTC (localTime - (localTime % 86400 ) + 86400 ); // next midnight local time
222
+ resetById (idTickMidnight);
223
+ idTickMidnight = onceAt (std::bind (&app::tickMidnight, this ), midTrig, " midNi" );
224
+
225
+ if (mConfig ->sys .schedReboot ) {
226
+ resetById (idTickReboot);
227
+ uint32_t rebootTrig = gTimezone .toUTC (localTime - (localTime % 86400 ) + 86410 ); // reboot 10 secs after midnght
228
+ idTickReboot = onceAt (std::bind (&app::tickReboot, this ), rebootTrig, " midRe" );
208
229
}
209
- #endif /* ENABLE_MQTT*/
210
-
211
- if (mConfig ->inst .rstValsNotAvail )
212
- everyMin (std::bind (&app::tickMinute, this ), " tMin" );
213
230
214
- if (mNtpReceived ) {
215
- uint32_t localTime = gTimezone .toLocal (mTimestamp );
216
- uint32_t midTrig = gTimezone .toUTC (localTime - (localTime % 86400 ) + 86400 ); // next midnight local time
217
- onceAt (std::bind (&app::tickMidnight, this ), midTrig, " midNi" );
218
-
219
- if (mConfig ->sys .schedReboot ) {
220
- uint32_t rebootTrig = gTimezone .toUTC (localTime - (localTime % 86400 ) + 86410 ); // reboot 10 secs after midnght
221
- onceAt (std::bind (&app::tickReboot, this ), rebootTrig, " midRe" );
222
- }
231
+ if ((0 == mSunrise ) && (0.0 != mConfig ->sun .lat ) && (0.0 != mConfig ->sun .lon )) {
232
+ mCalculatedTimezoneOffset = (int8_t )((mConfig ->sun .lon >= 0 ? mConfig ->sun .lon + 7.5 : mConfig ->sun .lon - 7.5 ) / 15 ) * 3600 ;
233
+ tickCalcSunrise ();
223
234
}
224
235
}
225
236
}
226
237
227
- // -----------------------------------------------------------------------------
228
- void app::updateNtp (void ) {
229
- if (mNtpReceived )
230
- onNtpUpdate (true );
231
- }
232
-
233
- // -----------------------------------------------------------------------------
234
- void app::tickNtpUpdate (void ) {
235
- uint32_t nxtTrig = 5 ; // default: check again in 5 sec
236
-
237
- if (!mNtpReceived )
238
- mNetwork ->updateNtpTime ();
239
- else {
240
- nxtTrig = mConfig ->ntp .interval * 60 ; // check again in configured interval
241
- mNtpReceived = false ;
242
- }
243
- yield ();
244
-
245
- updateNtp ();
246
-
247
- once (std::bind (&app::tickNtpUpdate, this ), nxtTrig, " ntp" );
248
- }
249
-
250
238
// -----------------------------------------------------------------------------
251
239
void app::tickCalcSunrise (void ) {
252
240
if (mSunrise == 0 ) // on boot/reboot calc sun values for current time
@@ -528,9 +516,6 @@ void app::resetSystem(void) {
528
516
529
517
mAllIvNotAvail = true ;
530
518
531
- mSunrise = 0 ;
532
- mSunset = 0 ;
533
-
534
519
mMqttEnabled = false ;
535
520
536
521
mSendLastIvId = 0 ;
@@ -539,8 +524,6 @@ void app::resetSystem(void) {
539
524
mSaveReboot = false ;
540
525
541
526
mNetworkConnected = false ;
542
- mNtpReceived = false ;
543
- mTickerInstallOnce = false ;
544
527
}
545
528
546
529
// -----------------------------------------------------------------------------
0 commit comments