/* RTC support module Copyright (C) 2018 by Pavel Chauzov in debug terminal - RTC return current rtc time - RTC YYYY-MM-DD DoW HH:MM:SS setup rtc */ #if RTC_SUPPORT #if RTC_PROVIDER == RTC_PROVIDER_DS3231 #include "rtc/ds3231.h" #elif RTC_PROVIDER == RTC_PROVIDER_DS1307 #include "rtc/ds1307.h" #endif static int _rtc_recovery = 0; //------------------------------------------------------------------------------ // Settings //------------------------------------------------------------------------------ #if TERMINAL_SUPPORT String _rtc_getValue(String data, char sep, int idx) { int found = 0; int si[] = {0, -1}; int maxi = data.length()-1; for(int i=0; i<=maxi && found<=idx; i++) { if(data.charAt(i)==sep || i==maxi) { found++; si[0] = si[1]+1; si[1] = (i == maxi) ? i+1 : i; } } return found>idx ? data.substring(si[0], si[1]) : "0"; } void _rtcInitCommands() { settingsRegisterCommand(F("RTC"), [](Embedis* e) { String rtc; time_t t; tmElements_t tm; if (e->argc == 1) { t = rtcGetTime(); DEBUG_MSG_P(PSTR("[RTC] Local Time: %s\n"), (char *) rtcDateTime(t).c_str()); } if (e->argc > 3) { String sdate = String(e->argv[1]); String sdow = String(e->argv[2]); String stime = String(e->argv[3]); tm.Second = _rtc_getValue(stime,':',2).toInt(); tm.Minute = _rtc_getValue(stime,':',1).toInt(); tm.Hour = _rtc_getValue(stime,':',0).toInt(); tm.Wday = sdow.toInt(); tm.Day = _rtc_getValue(sdate,'-',2).toInt(); tm.Month = _rtc_getValue(sdate,'-',1).toInt(); tm.Year = y2kYearToTm(_rtc_getValue(sdate,'-',0).toInt()-2000); t = makeTime(tm); rtcSetTime(t); setTime(t); DEBUG_MSG_P(PSTR("[RTC] Local Time: %s\n"), (char *) rtcDateTime(t).c_str()); } DEBUG_MSG_P(PSTR("+OK\n")); }); } #endif // TERMINAL_SUPPORT static time_t _rtcSync() { return rtcGetTime(); // defined in the driver } // ----------------------------------------------------------------------------- // Setup // ----------------------------------------------------------------------------- void rtcSetup() { #if TERMINAL_SUPPORT _rtcInitCommands(); #endif // TERMINAL_SUPPORT // overwrite sync provider, // there might be two attempts for NTP synchro on boot setSyncProvider(_rtcSync); // Dump current time from local RTC DEBUG_MSG_P(PSTR("[RTC] Local Time: %s\n"), (char *) rtcDateTime(rtcGetTime()).c_str()); } #endif // RTC_SUPPORT