embed rtc driver, not sure if its that exact but should be better infact

This commit is contained in:
2026-01-15 23:35:47 +01:00
parent 2f24be697d
commit a3f1c194ba
14 changed files with 185 additions and 2036 deletions

View File

@@ -1104,13 +1104,13 @@ void TEF6686::readRDS(byte showrdserrors) {
memset(rt_buffer, 0x20, 64);
rt_buffer[64] = '\0';
memset(segments_received, 3, sizeof(segments_received));
memset(segments_received, 99, sizeof(segments_received));
rtABold = rds.rtAB;
}
uint8_t segment_address = (rds.rdsB & 0xf);
if(segments_received[segment_address] > (rds.rdsCerror + rds.rdsBerror)) {
if(segments_received[segment_address] >= (rds.rdsCerror + rds.rdsBerror)) {
segments_received[segment_address] = rds.rdsCerror + rds.rdsBerror;
uint8_t offset = segment_address * 4;
@@ -1625,7 +1625,7 @@ void TEF6686::clearRDS(bool fullsearchrds) {
rds.aid_counter = af_number = 0;
afmethodBprobe = afmethodBtrigger = _hasEnhancedRT = false;
rds.ps12error = rds.ps34error = rds.ps56error = rds.ps78error = true;
memset(segments_received, 3, sizeof(segments_received));
memset(segments_received, 99, sizeof(segments_received));
}
void TEF6686::tone(uint16_t time, int16_t amplitude, uint16_t frequency) {

View File

@@ -1393,19 +1393,9 @@ void setup() {
rtc.setTime(0);
if(rx_rtc_avail) {
bool reset = rx_rtc.initModule(); // initModule, not initAdapter, adapter also reinits wire
if(reset) {
RX8010SJ::DateTime defaulttime = RX8010SJ::DateTime();
defaulttime.second = 0;
defaulttime.minute = 0;
defaulttime.hour = 0;
defaulttime.dayOfWeek = 2;
defaulttime.dayOfMonth = 14;
defaulttime.month = 1;
defaulttime.year = 26;
rx_rtc.writeDateTime(defaulttime);
console.print("RX8010SJ was reset, no time");
} else {
bool reset = init_rtc();
if(reset) console.print("RX8010SJ was reset, no time");
else {
rtcset = true;
console.print("RX8010SJ is used as a time source");
sync_from_rx_rtc();

View File

@@ -1,45 +1,114 @@
#include "rtc.hpp"
// the hardware rtc driver was made with the support of Wh1teRabbitHU's implementation
bool rtcset;
bool NTPupdated;
ESP32Time rtc(0);
bool rx_rtc_avail = false;
RX8010SJ::Adapter rx_rtc = RX8010SJ::Adapter(RX8010SJ_ADDRESS);
void timeToDateTime(time_t t, struct RX8010SJ::DateTime* dateTime) {
struct tm* timeinfo = gmtime(&t);
dateTime->second = timeinfo->tm_sec;
dateTime->minute = timeinfo->tm_min;
dateTime->hour = timeinfo->tm_hour;
dateTime->dayOfWeek = (timeinfo->tm_wday + 6) % 7;
dateTime->dayOfMonth = timeinfo->tm_mday;
dateTime->month = timeinfo->tm_mon + 1;
dateTime->year = (timeinfo->tm_year + 1900) % 100;
byte readFromModule(byte address) {
Wire.beginTransmission(RX8010SJ_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(RX8010SJ_ADDRESS, 1);
if (Wire.available()) return Wire.read();
return -1;
}
time_t dateTimeToTime(const struct RX8010SJ::DateTime* dateTime) {
struct tm timeinfo;
timeinfo.tm_sec = dateTime->second;
timeinfo.tm_min = dateTime->minute;
timeinfo.tm_hour = dateTime->hour;
timeinfo.tm_mday = dateTime->dayOfMonth;
timeinfo.tm_mon = dateTime->month - 1;
timeinfo.tm_year = dateTime->year + 100;
timeinfo.tm_isdst = 0;
return mktime(&timeinfo);
inline void writeToModule(byte address, byte data) {
Wire.beginTransmission(RX8010SJ_ADDRESS);
Wire.write(address);
Wire.write(data);
Wire.endTransmission();
}
inline byte toBCD(byte val) {
return ((val / 10) << 4) | (val % 10);
}
inline byte sumValueFromBinary(byte binary, byte length) {
byte sum = 0;
for (byte i = 0; i < length; i++) {
byte value;
if (i < 4 ) value = 1 << i;
else value = 10 * (1 << (i - 4));
sum += ((binary >> i) & 1) == 1 ? value : 0;
}
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) {
if(!rx_rtc_avail) return;
RX8010SJ::DateTime dateTime = rx_rtc.readDateTime();
rtc.setTime(dateTimeToTime(&dateTime) + offset);
struct tm timeinfo;
Wire.beginTransmission(RX8010SJ_ADDRESS);
Wire.write(0x10);
Wire.endTransmission();
Wire.requestFrom(RX8010SJ_ADDRESS, 7);
if (Wire.available()) {
timeinfo.tm_sec = sumValueFromBinary(Wire.read(), 7);
timeinfo.tm_min = sumValueFromBinary(Wire.read(), 7);
timeinfo.tm_hour = sumValueFromBinary(Wire.read(), 6);
auto dayOfWeekBin = Wire.read();
for (int i = 0; i < 7; i++) {
if (dayOfWeekBin & (1u << i)) timeinfo.tm_wday += i;
}
timeinfo.tm_mday = sumValueFromBinary(Wire.read(), 6);
timeinfo.tm_mon = sumValueFromBinary(Wire.read(), 5) - 1;
timeinfo.tm_year = sumValueFromBinary(Wire.read(), 8) + 100;
rtc.setTime(mktime(&timeinfo) + offset);
}
}
void set_time(time_t time) {
rtc.setTime(time);
if(!rx_rtc_avail) return;
RX8010SJ::DateTime rx_currenttime = RX8010SJ::DateTime();
timeToDateTime(time, &rx_currenttime);
rx_rtc.writeDateTime(rx_currenttime);
struct tm* timeinfo = gmtime(&time);
Wire.beginTransmission(RX8010SJ_ADDRESS);
Wire.write(0x10);
Wire.write(toBCD(timeinfo->tm_sec));
Wire.write(toBCD(timeinfo->tm_min));
Wire.write(toBCD(timeinfo->tm_hour));
Wire.write(1 << timeinfo->tm_wday);
Wire.write(toBCD(timeinfo->tm_mday));
Wire.write(toBCD(timeinfo->tm_mon + 1));
Wire.write(toBCD((1900 + timeinfo->tm_year) % 100));
Wire.endTransmission();
}