Add NTP update state. Refactoring.
This commit is contained in:
@@ -41,12 +41,17 @@ bool TimeManager::ntp_sync_successful(void) const
|
||||
*
|
||||
* @retval true if last update was successful
|
||||
*/
|
||||
bool TimeManager::ntp_time_update(bool init)
|
||||
ntp_update_state TimeManager::ntp_time_update(bool init)
|
||||
{
|
||||
// Check if minimum update delay has elapsed
|
||||
if (!init && (((system_get_time() - _ntp_sync_timestamp_us) <= _ntp_retry_delay_us) || ((system_get_time() - _ntp_sync_timestamp_us) <= (_ntp_update_period_s * 1000000))))
|
||||
if (!init && ((system_get_time() - _ntp_sync_timestamp_us) <= _ntp_retry_delay_us))
|
||||
{
|
||||
return false;
|
||||
return NTP_UPDATE_RETRY_DELAY; // could be replaced with appropriate enum
|
||||
}
|
||||
|
||||
if (!init && ((system_get_time() - _ntp_sync_timestamp_us) <= (_ntp_update_period_s * 1000000)))
|
||||
{
|
||||
return NTP_UPDATE_TOO_EARLY; // could be replaced with appropriate enum
|
||||
}
|
||||
|
||||
if (init)
|
||||
@@ -54,8 +59,8 @@ bool TimeManager::ntp_time_update(bool init)
|
||||
set_up_ntp(); // set up NTP server once
|
||||
}
|
||||
|
||||
bool ntp_update_successful = false; // NTP time update
|
||||
struct tm time_info; // local NTP time info
|
||||
ntp_update_state ntp_update_state = NTP_UPDATE_PENDING; // NTP time update
|
||||
struct tm time_info; // local NTP time info
|
||||
|
||||
_ntp_sync_timestamp_us = system_get_time(); // NTP update start time
|
||||
|
||||
@@ -65,15 +70,15 @@ bool TimeManager::ntp_time_update(bool init)
|
||||
localtime_r(&_time_now_ntp, &time_info); // convert time
|
||||
yield(); // since this loop could take up to NTP_MAX_UPDATE_TIME_US
|
||||
|
||||
} while (((system_get_time() - _ntp_sync_timestamp_us) <= NTP_MAX_UPDATE_TIME_US) && (time_info.tm_year < (NTP_MININUM_RX_YEAR - NTP_MININUM_YEAR)));
|
||||
} while (((system_get_time() - _ntp_sync_timestamp_us) <= NTP_MAX_UPDATE_TIME_US) && (time_info.tm_year < (NTP_MININUM_RX_YEAR - NTP_START_YEAR)));
|
||||
|
||||
ntp_update_successful = (time_info.tm_year <= (NTP_MININUM_RX_YEAR - NTP_MININUM_YEAR)) ? false : true; // sanity check
|
||||
ntp_update_state = (time_info.tm_year <= (NTP_MININUM_RX_YEAR - NTP_START_YEAR)) ? NTP_UPDATE_FAILED : NTP_UPDATE_OK; // sanity check
|
||||
|
||||
if (ntp_update_successful == true)
|
||||
if (ntp_update_state == NTP_UPDATE_OK)
|
||||
{
|
||||
_ntp_sync_timestamp_us = system_get_time(); // save NTP update timestamp
|
||||
_time_info = time_info; // take over time_info to member variable
|
||||
log_time(_time_info); // log current time
|
||||
log_time(); // log current time
|
||||
|
||||
if (!init && (abs(_time_now_ntp - _time_now_local) > 10)) // in the case that the local time drifted more than 10s in _ntp_update_period_s
|
||||
{
|
||||
@@ -93,7 +98,7 @@ bool TimeManager::ntp_time_update(bool init)
|
||||
logger.log_string("NTP-Update was not successful. Retrying in " + String(_ntp_retry_delay_us / 1000) + "ms.\n");
|
||||
}
|
||||
|
||||
return ntp_update_successful;
|
||||
return ntp_update_state;
|
||||
}
|
||||
|
||||
bool TimeManager::ntp_update_failed_prolonged(void) const
|
||||
@@ -113,10 +118,22 @@ int TimeManager::tm_hour(void)
|
||||
return _time_info.tm_hour;
|
||||
}
|
||||
|
||||
int TimeManager::tm_day(void)
|
||||
{
|
||||
localtime_r(&_time_now_local, &_time_info); // convert time
|
||||
return _time_info.tm_mday + 1; // add 1 to get actual day
|
||||
}
|
||||
|
||||
int TimeManager::tm_year(void)
|
||||
{
|
||||
localtime_r(&_time_now_local, &_time_info); // convert time
|
||||
return _time_info.tm_year;
|
||||
return _time_info.tm_year + NTP_START_YEAR; // add start year to get actual year
|
||||
}
|
||||
|
||||
int TimeManager::tm_mon(void)
|
||||
{
|
||||
localtime_r(&_time_now_local, &_time_info); // convert time
|
||||
return _time_info.tm_mon + 1; // add 1 to get actual month
|
||||
}
|
||||
|
||||
bool TimeManager::tm_isdst(void)
|
||||
@@ -125,7 +142,10 @@ bool TimeManager::tm_isdst(void)
|
||||
return _time_info.tm_isdst > 0;
|
||||
}
|
||||
|
||||
// TODO
|
||||
/**
|
||||
* @brief Sets up the timer ISR
|
||||
*
|
||||
*/
|
||||
void TimeManager::set_up_timer_isr(void) const
|
||||
{
|
||||
// set up timer interrupt after NTP update is done
|
||||
@@ -139,6 +159,10 @@ void TimeManager::set_up_timer_isr(void) const
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets up the NTP server config
|
||||
*
|
||||
*/
|
||||
void TimeManager::set_up_ntp(void) const
|
||||
{
|
||||
if ((_tz != nullptr) && (_ntp_server != nullptr))
|
||||
@@ -153,6 +177,16 @@ void TimeManager::set_up_ntp(void) const
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log time_info as string.
|
||||
*
|
||||
* @param local_time
|
||||
*/
|
||||
void TimeManager::log_time() const
|
||||
{
|
||||
log_time(_time_info);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log time_info as string.
|
||||
*
|
||||
|
||||
@@ -195,7 +195,7 @@ void setup()
|
||||
}
|
||||
|
||||
// get initial time
|
||||
if (tm_mgr.ntp_time_update(true))
|
||||
if (tm_mgr.ntp_time_update(true) == NTP_UPDATE_OK)
|
||||
{
|
||||
// show the current time for short time in words
|
||||
String timeMessage = time_to_string(tm_mgr.tm_hour(), tm_mgr.tm_min());
|
||||
@@ -251,6 +251,9 @@ void loop()
|
||||
if ((current_time_us - last_heartbeat_us) >= PERIOD_HEARTBEAT_US)
|
||||
{
|
||||
send_heartbeat(); // send heartbeat update
|
||||
|
||||
tm_mgr.log_time(); // TODO rm
|
||||
|
||||
last_heartbeat_us = system_get_time();
|
||||
delay(10);
|
||||
}
|
||||
@@ -282,11 +285,11 @@ void loop()
|
||||
{
|
||||
if (tm_mgr.ntp_sync_successful() == true) // regular case
|
||||
{
|
||||
tm_mgr.ntp_time_update(); // NTP time update
|
||||
(void)tm_mgr.ntp_time_update(); // NTP time update
|
||||
}
|
||||
else // if there was never a NTP time update before (set up failed)
|
||||
{
|
||||
tm_mgr.ntp_time_update(true); // NTP time update with init!
|
||||
(void)tm_mgr.ntp_time_update(true); // NTP time update with init!
|
||||
}
|
||||
|
||||
if (tm_mgr.ntp_update_failed_prolonged() == true)
|
||||
|
||||
Reference in New Issue
Block a user