diff --git a/include/rtc.hpp b/include/rtc.hpp index 9016096..cc624d4 100644 --- a/include/rtc.hpp +++ b/include/rtc.hpp @@ -12,5 +12,4 @@ extern ESP32Time rtc; extern bool rx_rtc_avail; bool init_rtc(); -void sync_from_rx_rtc(int32_t offset = 0); void set_time(time_t time); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 609f84e..44783d0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1398,7 +1398,6 @@ void setup() { else { rtcset = true; console.print("RX8010SJ is used as a time source"); - sync_from_rx_rtc(); } } else console.print("RX8010SJ is not available at address " + String(RX8010SJ_ADDRESS, HEX)); diff --git a/src/rtc.cpp b/src/rtc.cpp index dc9c110..94f1586 100644 --- a/src/rtc.cpp +++ b/src/rtc.cpp @@ -8,7 +8,7 @@ bool NTPupdated; ESP32Time rtc(0); bool rx_rtc_avail = false; -byte readFromModule(byte address) { +inline byte readFromModule(byte address) { Wire.beginTransmission(RX8010SJ_ADDRESS); Wire.write(address); Wire.endTransmission(); @@ -43,35 +43,7 @@ inline byte sumValueFromBinary(byte binary, byte length) { return sum; } -bool init_rtc() { - rtc.setTime(0); - byte flagregister = readFromModule(0x1E); - if((flagregister >> 1) & 1) { - while((flagregister >> 1) & 1) { - writeToModule(0x1E, 0); // clear VLF - flagregister = readFromModule(0x1E); - } - writeToModule(0x17, 216); // Reserved register - writeToModule(0x1F, 0); // Control register - writeToModule(0x31, 8); // Reserved register - writeToModule(0x32, 0); // IRQ control register - - Wire.beginTransmission(RX8010SJ_ADDRESS); - Wire.write(0x10); - Wire.write(0); - Wire.write(0); - Wire.write(toBCD(12)); - Wire.write(1 << 2); - Wire.write(toBCD(14)); - Wire.write(1); - Wire.write(toBCD(26)); - Wire.endTransmission(); - return true; - } - return false; -} - -void sync_from_rx_rtc(int32_t offset) { +void sync_from_rx_rtc(int32_t offset = 0) { if(!rx_rtc_avail) return; struct tm timeinfo; @@ -97,10 +69,46 @@ void sync_from_rx_rtc(int32_t offset) { } } +bool init_rtc() { + rtc.setTime(0); + byte flagregister = readFromModule(0x1E); + if((flagregister >> 1) & 1) { + while((flagregister >> 1) & 1) { + writeToModule(0x1E, 0); // clear VLF + flagregister = readFromModule(0x1E); + } + writeToModule(0x17, 216); // Reserved register + writeToModule(0x1F, 64); // Control register, stop bit set + + Wire.beginTransmission(RX8010SJ_ADDRESS); + Wire.write(0x31); + Wire.write(8); // Reserved register + Wire.write(0); // IRQ control register + Wire.endTransmission(); + + Wire.beginTransmission(RX8010SJ_ADDRESS); + Wire.write(0x10); + Wire.write(0); + Wire.write(0); + Wire.write(toBCD(12)); + Wire.write(1 << 2); + Wire.write(toBCD(14)); + Wire.write(1); + Wire.write(toBCD(26)); + Wire.endTransmission(); + writeToModule(0x1F, 0); // Unset stop bit + sync_from_rx_rtc(); + return true; + } + sync_from_rx_rtc(); + return false; +} + void set_time(time_t time) { rtc.setTime(time); if(!rx_rtc_avail) return; struct tm* timeinfo = gmtime(&time); + writeToModule(0x1F, 64); Wire.beginTransmission(RX8010SJ_ADDRESS); Wire.write(0x10); Wire.write(toBCD(timeinfo->tm_sec)); @@ -111,4 +119,5 @@ void set_time(time_t time) { Wire.write(toBCD(timeinfo->tm_mon + 1)); Wire.write(toBCD((1900 + timeinfo->tm_year) % 100)); Wire.endTransmission(); + writeToModule(0x1F, 0); } \ No newline at end of file