You've already forked TEF6686_ESP32
embed rtc driver, not sure if its that exact but should be better infact
This commit is contained in:
@@ -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) {
|
||||
|
||||
16
src/main.cpp
16
src/main.cpp
@@ -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();
|
||||
|
||||
119
src/rtc.cpp
119
src/rtc.cpp
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user