diff options
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/timefuncs.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/firmware/common/timefuncs.c b/firmware/common/timefuncs.c index 23444e2e43..e682454ce2 100644 --- a/firmware/common/timefuncs.c +++ b/firmware/common/timefuncs.c @@ -23,10 +23,28 @@ #include "timefuncs.h" #include "debug.h" +#ifndef SIMULATOR static struct tm tm; +#endif + +bool valid_time(struct tm *tm) +{ + if (tm->tm_hour < 0 || tm->tm_hour > 23 || + tm->tm_sec < 0 || tm->tm_sec > 59 || + tm->tm_min < 0 || tm->tm_min > 59 || + tm->tm_year < 100 || tm->tm_year > 199 || + tm->tm_mon < 0 || tm->tm_mon > 11 || + tm->tm_wday < 1 || tm->tm_wday > 7 || + tm->tm_mday < 1 || tm->tm_mday > 31) + return false; + else + return true; +} + struct tm *get_time(void) { +#ifndef SIMULATOR #ifdef HAVE_RTC char rtcbuf[8]; @@ -41,6 +59,8 @@ struct tm *get_time(void) tm.tm_mon = ((rtcbuf[6] & 0x10) >> 4) * 10 + (rtcbuf[6] & 0x0f) - 1; tm.tm_year = ((rtcbuf[7] & 0xf0) >> 4) * 10 + (rtcbuf[7] & 0x0f) + 100; tm.tm_wday = rtcbuf[4] & 0x07; + if(tm.tm_wday == 7) + tm.tm_wday = 0; tm.tm_yday = 0; /* Not implemented for now */ tm.tm_isdst = -1; /* Not implemented for now */ #else @@ -55,4 +75,44 @@ struct tm *get_time(void) tm.tm_isdst = -1; /* Not implemented for now */ #endif return &tm; +#else + time_t now = time(NULL); + return localtime(&now); +#endif +} + +int set_time(struct tm *tm) +{ +#ifdef HAVE_RTC + int rc; + int tmp; + + if (valid_time(tm)) + { + rc = rtc_write(1, ((tm->tm_sec/10) << 4) | (tm->tm_sec%10)); + rc |= rtc_write(2, ((tm->tm_min/10) << 4) | (tm->tm_min%10)); + rc |= rtc_write(3, ((tm->tm_hour/10) << 4) | (tm->tm_hour%10)); + tmp = tm->tm_wday; + if(tmp == 0) + tmp = 7; + rc |= rtc_write(4, tmp); + rc |= rtc_write(5, ((tm->tm_mday/10) << 4) | (tm->tm_mday%10)); + rc |= rtc_write(6, (((tm->tm_mon+1)/10) << 4) | ((tm->tm_mon+1)%10)); + rc |= rtc_write(7, (((tm->tm_year-100)/10) << 4) | ((tm->tm_year-100)%10)); + + rc |= rtc_write(8, 0x80); /* Out=1, calibration = 0 */ + + if(rc) + return -1; + else + return 0; + } + else + { + return -2; + } +#else + (void)tm; + return 0; +#endif } |