ESP32-PaxCounter/src/rtctime.cpp

80 lines
2.0 KiB
C++
Raw Normal View History

2022-02-22 13:11:46 +01:00
#ifdef HAS_RTC // we have hardware RTC
2019-01-20 22:38:53 +01:00
#include "rtctime.h"
// Local logging tag
2019-02-27 00:52:27 +01:00
static const char TAG[] = __FILE__;
RtcDS3231<TwoWire> Rtc(Wire); // RTC hardware i2c interface
// initialize RTC
2019-02-24 13:47:18 +01:00
uint8_t rtc_init(void) {
Wire.begin(HAS_RTC);
Rtc.Begin(MY_DISPLAY_SDA, MY_DISPLAY_SCL);
// configure RTC chip
Rtc.Enable32kHzPin(false);
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);
if (!Rtc.GetIsRunning()) {
ESP_LOGI(TAG, "RTC not running, starting now");
Rtc.SetIsRunning(true);
}
2019-03-24 00:15:04 +01:00
#if (TIME_SYNC_COMPILEDATE)
// initialize a blank RTC without battery backup with build time
RtcDateTime tt = Rtc.GetDateTime();
time_t t = tt.Epoch32Time(); // sec2000 -> epoch
if (!Rtc.IsDateTimeValid() || !timeIsValid(t)) {
ESP_LOGW(TAG, "RTC has no recent time, setting to compiletime");
Rtc.SetDateTime(RtcDateTime(mkgmtime(compileTime()) -
SECS_YR_2000)); // epoch -> sec2000
}
2019-03-19 20:56:08 +01:00
#endif
ESP_LOGI(TAG, "RTC initialized");
return 1; // success
// failure
// return 0
} // rtc_init()
uint8_t set_rtctime(time_t t) { // t is sec epoch time
2019-03-19 01:46:20 +01:00
#ifdef RTC_INT // sync rtc 1Hz pulse on top of second
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); // off
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock); // start
2019-03-19 01:46:20 +01:00
#endif
Rtc.SetDateTime(RtcDateTime(t - SECS_YR_2000)); // epoch -> sec2000
ESP_LOGI(TAG, "RTC time synced");
return 1; // success
2019-01-20 22:38:53 +01:00
} // set_rtctime()
2022-01-26 16:21:44 +01:00
time_t get_rtctime(uint16_t *msec) {
2019-02-22 22:28:35 +01:00
time_t t = 0;
2022-01-26 16:21:44 +01:00
*msec = 0;
if (Rtc.IsDateTimeValid() && Rtc.GetIsRunning()) {
RtcDateTime tt = Rtc.GetDateTime();
t = tt.Epoch32Time(); // sec2000 -> epoch
}
2022-03-05 18:49:50 +01:00
// if we have a RTC pulse, we calculate msec
2022-01-26 16:21:44 +01:00
#ifdef RTC_INT
2022-03-05 19:08:35 +01:00
uint16_t ppsDiff = millis() - lastRTCpulse;
if (ppsDiff < 1000)
*msec = ppsDiff;
else {
ESP_LOGD(TAG, "no pulse from RTC");
return 0;
}
2022-01-26 16:21:44 +01:00
#endif
2022-03-05 18:49:50 +01:00
return t;
2019-01-21 16:16:39 +01:00
} // get_rtctime()
2019-01-21 16:16:39 +01:00
float get_rtctemp(void) {
RtcTemperature temp = Rtc.GetTemperature();
return temp.AsFloatDegC();
2019-01-28 23:59:52 +01:00
} // get_rtctemp()
#endif // HAS_RTC