MAXIM DS3231 accurate Real Time Clock Library
Fork of DS3231 by
Diff: ARM_RTC.cpp
- Revision:
- 3:1af2ff7cfe26
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ARM_RTC.cpp Mon Jul 23 12:25:27 2018 +0000 @@ -0,0 +1,360 @@ +#include "ARM_RTC.h" + +ARM_RTC::ARM_RTC() +{ + setTimeZone(1); + dayLightSaving = true; +} + +bool ARM_RTC::checkTimeLost(void) +{ + return (atoi(getFormatedDateTime("%Y")) <= 2015) ? true : false; +} + +// BCD to decimal conversion +int ARM_RTC::bcd2dec(int bcd) +{ + return(((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F)); +} + +// decimal to BCD conversion +int ARM_RTC::dec2bcd(int dec) +{ + return((dec / 10) * 16 + (dec % 10)); +} + +void ARM_RTC::setTimeZone(double TZ) +{ + timeZoneOffset = (uint32_t) (TZ * 3600.0f); +} + +double ARM_RTC::getTimeZone(void) +{ + return (double)timeZoneOffset / 3600.0f; +} + +void ARM_RTC::setDate(int day, int month, int year) +{ + printf("%d-%d-%d\n", day, month, year); + // First read + time_t rawtime; + struct tm t; + struct tm * t2; + + time(&rawtime); + t2 = localtime(&rawtime); + + if (year<100) { + year+=2000; + } + if (year > 1900) + t.tm_year = year - 1900; // adjust for tm structure required values + else + t.tm_year = year; + t.tm_mon = month - 1; // adjust for tm structure required values + t.tm_mday = day; + t.tm_hour = t2->tm_hour; + t.tm_min = t2->tm_min; + t.tm_sec = t2->tm_sec; + + // Set system date and time + rawtime = mktime(&t); // seconds since the Epoch + set_time(rawtime); + +// time_t t_seconds = time(NULL); +// char buffer[32]; +// strftime(buffer, 32, "%A %d-%m-%Y %H:%M:%S", localtime(&t_seconds)); +// printf("%s\n", buffer); +} + +// set time register +void ARM_RTC::setTime(int hours, int minutes, int seconds) +{ + // First read + time_t rawtime; + struct tm t; + struct tm * t2; + + time(&rawtime); + t2 = localtime(&rawtime); + + t.tm_hour = hours; + t.tm_min = minutes; + t.tm_sec = seconds; + t.tm_year = t2->tm_year; +// t.tm_year = 2016-1900; + t.tm_mon = t2->tm_mon; + t.tm_mday = t2->tm_mday; +// t.tm_wday = t2->tm_wday; +// printf("%d-%d-%d %d:%d:%d\n", t.tm_year, t.tm_mon+1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); + + // Set system date and time + rawtime = mktime(&t); // seconds since the Epoch + set_time(rawtime); + +// time_t t_seconds = time(NULL); +// char buffer[32]; +// strftime(buffer, 32, "%A %d-%m-%Y %H:%M:%S", localtime(&t_seconds)); +// printf("%s\n", buffer); +} + +void ARM_RTC::setDateTime(int day, int month, int year, int hours, int minutes, int seconds) +{ + // First read + time_t rawtime; + struct tm t; + struct tm * t2; + + time(&rawtime); + t2 = localtime(&rawtime); + + if (year<100) { + year+=2000; + } + if (year > 1900) + t.tm_year = year - 1900; // adjust for tm structure required values + else + t.tm_year = year; + t.tm_mon = month - 1; // adjust for tm structure required values + t.tm_mday = day; + + t.tm_hour = hours; + t.tm_min = minutes; + t.tm_sec = seconds; + + // Set system date and time + rawtime = mktime(&t); // seconds since the Epoch + set_time(rawtime); + +// time_t t_seconds = time(NULL); +// char buffer[32]; +// strftime(buffer, 32, "%A %d-%m-%Y %H:%M:%S", localtime(&t_seconds)); +// printf("%s\n", buffer); +} + + +// read the date and time registers and set system clock +void ARM_RTC::setSystemClock(void) +{ +// int dayOfWeek, day, month, year, hours, minutes, seconds; +// readDateTime(&dayOfWeek, &day, &month, &year, &hours, &minutes, &seconds); + +// getDateTime(&t); + +// time_t secondsEpoch = mktime(&t); // seconds since the Epoch + // Get weekday +// t = *localtime(&secondsEpoch); +// set_time(secondsEpoch); +} + +void ARM_RTC::readDateTime(void) +{ + // First read + time_t rawtime; + struct tm t; + struct tm * t2; + time(&rawtime); + t2 = localtime(&rawtime); + +// time(&secondsEpoch); +// t = localtime(&secondsEpoch); +} + +void ARM_RTC::getDateTime(struct tm *t) +{ + time(&secondsEpoch); + t = localtime(&secondsEpoch); +} + +void ARM_RTC::setDateTime(struct tm *time) +{ + secondsEpoch = mktime(time); // seconds since the Epoch + set_time(secondsEpoch); +} + +void ARM_RTC::setDateTimeSecsSince1900(uint32_t secsSince1900) +{ + setDateTimeSecsSince1970(secsSince1900 - NTP_OFFSET); +} + +void ARM_RTC::setDateTimeSecsSince1970(uint32_t secsSince1970) +{ + set_time(secsSince1970); +} + +// read the date and time registers and return secondsEpoch +uint32_t ARM_RTC::getDateTimeSecsSince1970(void) +{ + return (mktime(&t) - timeZoneOffset); // seconds since the Epoch +} + +// read the date and time registers and return secondsEpoch +time_t ARM_RTC::getDateTimeSecsSince1970TZ(void) +{ + return mktime(&t); // seconds since the Epoch +} + +int ARM_RTC::getDayOfWeek(int mday, int month, int year) // y > 1752, 1 <= m <= 12 +{ + t.tm_year = year - 1900; // adjust for tm structure required values + t.tm_mon = month - 1; // adjust for tm structure required values + t.tm_mday = mday; + t.tm_hour = 0; + t.tm_min = 0; + t.tm_sec = 0; + time_t secondsEpoch = mktime(&t); // seconds since the Epoch + t = *localtime(&secondsEpoch); + return t.tm_wday; // (0=Sunday, 6=Saturday) + +// static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; +// year -= month < 3; +// return ((year + year/4 - year/100 + year/400 + t[month-1] + mday) % 7) + 1; // 01 - 07, 01 = Sunday +} + +char * ARM_RTC::getDayOfWeekName(void) // y > 1752, 1 <= m <= 12 +{ + time_t secondsEpoch = mktime(&t); // seconds since the Epoch + t = *localtime(&secondsEpoch); + strftime(buffer, 32, "%a", localtime(&secondsEpoch)); + return buffer; +} + +// char *buffer; +// buffer = ARM_RTC.getFormatedDateTime("%A %d-%m-%Y %H:%M:%S"); +// TFT.gotoxy(0,7); +// TFT.printf("Date: %s\n", buffer); +char * ARM_RTC::getFormatedDateTime(char *format) +{ + time_t t_seconds = time(NULL); + strftime(buffer, 40, format, localtime(&t_seconds)); + return buffer; +} + +bool ARM_RTC::getSummerTime(void) +{ + getDateTime(&t); + + time_t secondsEpoch = mktime(&t); // seconds since the Epoch + t = *localtime(&secondsEpoch); + strftime(buffer, 32, "%j", localtime(&secondsEpoch)); + int dayOfYearC = atoi(buffer); + + strftime(buffer, 32, "%Y", localtime(&secondsEpoch)); + int year = atoi(buffer); + + int index = (year - 2011) * 5; + if (index < 0) + index = 0; + if (index > 440) // (2099 - 2011) * 5 = 440 + index = 440; + + int monthS = atoi(SummerTime[index+1]); + int dayS = atoi(SummerTime[index+2]); + + t.tm_mon = monthS - 1; // adjust for tm structure required values + t.tm_mday = dayS; + secondsEpoch = mktime(&t); // seconds since the Epoch + t = *localtime(&secondsEpoch); + strftime(buffer, 32, "%j", localtime(&secondsEpoch)); + int dayOfYearS = atoi(buffer); + + int monthE = atoi(SummerTime[index+3]); + int dayE = atoi(SummerTime[index+4]); + + t.tm_mon = monthE - 1; // adjust for tm structure required values + t.tm_mday = dayE; + secondsEpoch = mktime(&t); // seconds since the Epoch + t = *localtime(&secondsEpoch); + strftime(buffer, 32, "%j", localtime(&secondsEpoch)); + int dayOfYearE = atoi(buffer); + + return ((dayOfYearC >= dayOfYearS) && (dayOfYearC < dayOfYearE)) ? true : false; +} + +int ARM_RTC::dayOfYearC(void) +{ + getDateTime(&t); + + time_t secondsEpoch = mktime(&t); // seconds since the Epoch + strftime(buffer, 32, "%j", localtime(&secondsEpoch)); + return atoi(buffer); +} + +char * ARM_RTC::getSunRise(void) +{ + return (char*) SunRise[dayOfYearC()]; +} + +char * ARM_RTC::getSunSet(void) +{ + return (char*) SunSet[dayOfYearC()]; +} + +char * ARM_RTC::getDayLength(void) +{ + return (char*) DayLength[dayOfYearC()]; +} + +int ARM_RTC::getSunRiseMinute(void) +{ + int doy = dayOfYearC(); + int h = atoi(substr((char*)SunRise[doy], 0, 2)); + int m = atoi(substr((char*)SunRise[doy], 3, 2)); + return h * 60 + m; +} + +int ARM_RTC::getSunSetMinute(void) +{ + int doy = dayOfYearC(); + int h = atoi(substr((char*)SunSet[doy], 0, 2)); + int m = atoi(substr((char*)SunSet[doy], 3, 2)); + return h * 60 + m; +} + +bool ARM_RTC::checkSunRise(void) +{ + int dayOfWeek, mday, month, year, hours, minutes, seconds; +// readDateTime(&dayOfWeek, &mday, &month, &year, &hours, &minutes, &seconds); + +// t.tm_year = year - 1900; // adjust for tm structure required values +// t.tm_mon = month - 1; // adjust for tm structure required values +// t.tm_mday = mday; +// t.tm_hour = 0; +// t.tm_min = 0; +// t.tm_sec = 0; + + int absMinute = t.tm_hour * 60 + t.tm_min; + int SunRiseMinute = getSunRiseMinute(); + int SunSetMinute = getSunSetMinute(); + + return ((absMinute >= SunRiseMinute) && (absMinute < SunSetMinute)) ? true : false; +} + +void ARM_RTC::substr(char *s, char *d, int pos, int len) +{ + char *t; + s = s+pos; + t = s+len; + while (s != t) { + *d=*s; + s++; + d++; + } + *d='\0'; +} + +char * ARM_RTC::substr(char *s, int pos, int len) +{ + char *t; + char *d; + d = buffer; + s = s+pos; + t = s+len; + while (s != t) { + *d=*s; + s++; + d++; + } + *d='\0'; + return buffer; +}