added RTC timesync during startup
This commit is contained in:
parent
ac28348acf
commit
bde7fb2bcf
@ -5,9 +5,17 @@
|
|||||||
#include <Wire.h> // must be included here so that Arduino library object file references work
|
#include <Wire.h> // must be included here so that Arduino library object file references work
|
||||||
#include <RtcDS3231.h>
|
#include <RtcDS3231.h>
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
useless = 0, // waiting for good enough signal
|
||||||
|
dirty = 1, // time data available but inconfident
|
||||||
|
reserve = 2, // clock was once synced but now may deviate
|
||||||
|
synced_LORA = 3, // clock driven by LORAWAN network
|
||||||
|
synced_GPS = 4 // best possible quality, clock is driven by GPS
|
||||||
|
} clock_state_t;
|
||||||
|
|
||||||
int rtc_init(void);
|
int rtc_init(void);
|
||||||
int set_rtc(uint32_t UTCTime);
|
int set_rtc(uint32_t UTCTime, clock_state_t state);
|
||||||
int set_rtc(RtcDateTime now);
|
int set_rtc(RtcDateTime now, clock_state_t state);
|
||||||
uint32_t get_rtc();
|
uint32_t get_rtc();
|
||||||
float get_rtc_temp();
|
float get_rtc_temp();
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ void do_timesync() {
|
|||||||
now.hour = gps.time.hour();
|
now.hour = gps.time.hour();
|
||||||
now.minute = gps.time.minute();
|
now.minute = gps.time.minute();
|
||||||
now.second = gps.time.second();
|
now.second = gps.time.second();
|
||||||
set_rtc(now);
|
set_rtc(now, synced_GPS);
|
||||||
#endif
|
#endif
|
||||||
ESP_LOGI(TAG, "Time synced by GPS to %02d:%02d:%02d", hour(), minute(),
|
ESP_LOGI(TAG, "Time synced by GPS to %02d:%02d:%02d", hour(), minute(),
|
||||||
second());
|
second());
|
||||||
@ -153,6 +153,13 @@ void do_timesync() {
|
|||||||
ESP_LOGI(TAG, "Network time request scheduled");
|
ESP_LOGI(TAG, "Network time request scheduled");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// use on board time if board has RTC
|
||||||
|
#ifdef HAS_RTC
|
||||||
|
setTime(get_rtc());
|
||||||
|
ESP_LOGI(TAG, "Time synced by RTC to %02d:%02d:%02d", hour(), minute(),
|
||||||
|
second());
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TIME_SYNC_INTERVAL
|
#endif // TIME_SYNC_INTERVAL
|
||||||
} // do_timesync()
|
} // do_timesync()
|
||||||
|
|
||||||
|
@ -456,7 +456,7 @@ void user_request_network_time_callback(void *pVoidUserUTCTime,
|
|||||||
// Update system time with time read from the network
|
// Update system time with time read from the network
|
||||||
setTime(*pUserUTCTime);
|
setTime(*pUserUTCTime);
|
||||||
#ifdef HAS_RTC
|
#ifdef HAS_RTC
|
||||||
set_rtc(*pUserUTCTime);
|
set_rtc(*pUserUTCTime, synced_LORA);
|
||||||
#endif
|
#endif
|
||||||
ESP_LOGI(TAG, "Time synced by LoRa network to %02d:%02d:%02d", hour(),
|
ESP_LOGI(TAG, "Time synced by LoRa network to %02d:%02d:%02d", hour(),
|
||||||
minute(), second());
|
minute(), second());
|
||||||
|
@ -175,6 +175,9 @@ void setup() {
|
|||||||
#ifdef HAS_RTC
|
#ifdef HAS_RTC
|
||||||
strcat_P(features, " RTC");
|
strcat_P(features, " RTC");
|
||||||
assert(rtc_init());
|
assert(rtc_init());
|
||||||
|
setTime(get_rtc());
|
||||||
|
ESP_LOGI(TAG, "Time synced by RTC to %02d:%02d:%02d", hour(), minute(),
|
||||||
|
second());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// initialize wifi antenna
|
// initialize wifi antenna
|
||||||
|
11
src/rtc.cpp
11
src/rtc.cpp
@ -7,6 +7,8 @@ static const char TAG[] = "main";
|
|||||||
|
|
||||||
RtcDS3231<TwoWire> Rtc(Wire);
|
RtcDS3231<TwoWire> Rtc(Wire);
|
||||||
|
|
||||||
|
clock_state_t RTC_state = useless;
|
||||||
|
|
||||||
// initialize RTC
|
// initialize RTC
|
||||||
int rtc_init() {
|
int rtc_init() {
|
||||||
|
|
||||||
@ -24,6 +26,7 @@ int rtc_init() {
|
|||||||
if (!Rtc.IsDateTimeValid()) {
|
if (!Rtc.IsDateTimeValid()) {
|
||||||
ESP_LOGW(TAG, "RTC has no valid RTC date/time, setting to compilation date");
|
ESP_LOGW(TAG, "RTC has no valid RTC date/time, setting to compilation date");
|
||||||
Rtc.SetDateTime(compiled);
|
Rtc.SetDateTime(compiled);
|
||||||
|
RTC_state = useless;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Rtc.GetIsRunning()) {
|
if (!Rtc.GetIsRunning()) {
|
||||||
@ -32,10 +35,12 @@ int rtc_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtcDateTime now = Rtc.GetDateTime();
|
RtcDateTime now = Rtc.GetDateTime();
|
||||||
|
RTC_state = reserve;
|
||||||
|
|
||||||
if (now < compiled) {
|
if (now < compiled) {
|
||||||
ESP_LOGI(TAG, "RTC date/time is older than compilation date, updating)");
|
ESP_LOGI(TAG, "RTC date/time is older than compilation date, updating)");
|
||||||
Rtc.SetDateTime(compiled);
|
Rtc.SetDateTime(compiled);
|
||||||
|
RTC_state = useless;
|
||||||
}
|
}
|
||||||
|
|
||||||
// configure RTC chip
|
// configure RTC chip
|
||||||
@ -56,26 +61,28 @@ error:
|
|||||||
|
|
||||||
} // rtc_init()
|
} // rtc_init()
|
||||||
|
|
||||||
int set_rtc(uint32_t UTCTime) {
|
int set_rtc(uint32_t UTCTime, clock_state_t state) {
|
||||||
// return = 0 -> error / return = 1 -> success
|
// return = 0 -> error / return = 1 -> success
|
||||||
#ifdef HAS_RTC
|
#ifdef HAS_RTC
|
||||||
// block i2c bus access
|
// block i2c bus access
|
||||||
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
|
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
|
||||||
Rtc.SetDateTime(RtcDateTime(UTCTime));
|
Rtc.SetDateTime(RtcDateTime(UTCTime));
|
||||||
xSemaphoreGive(I2Caccess); // release i2c bus access
|
xSemaphoreGive(I2Caccess); // release i2c bus access
|
||||||
|
RTC_state = state;
|
||||||
return 1;
|
return 1;
|
||||||
} // while
|
} // while
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
} // set_rtc()
|
} // set_rtc()
|
||||||
|
|
||||||
int set_rtc(RtcDateTime now) {
|
int set_rtc(RtcDateTime now, clock_state_t state) {
|
||||||
// return = 0 -> error / return = 1 -> success
|
// return = 0 -> error / return = 1 -> success
|
||||||
#ifdef HAS_RTC
|
#ifdef HAS_RTC
|
||||||
// block i2c bus access
|
// block i2c bus access
|
||||||
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
|
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
|
||||||
Rtc.SetDateTime(now);
|
Rtc.SetDateTime(now);
|
||||||
xSemaphoreGive(I2Caccess); // release i2c bus access
|
xSemaphoreGive(I2Caccess); // release i2c bus access
|
||||||
|
RTC_state = state;
|
||||||
return 1;
|
return 1;
|
||||||
} // while
|
} // while
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user