From 7ddf0d673dbb0dbcb6b534db92da5797b9c22ba6 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Tue, 20 Apr 2004 10:23:57 +0000 Subject: Reworked the time get/set functions git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4522 a1c6a512-1295-4272-9138-f99709370657 --- firmware/common/timefuncs.c | 60 ++++++++++++++++++++++++++++++++++++++++++++ firmware/include/timefuncs.h | 21 +++------------- 2 files changed, 64 insertions(+), 17 deletions(-) (limited to 'firmware') 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 } diff --git a/firmware/include/timefuncs.h b/firmware/include/timefuncs.h index 3845b946c5..5c6719e709 100644 --- a/firmware/include/timefuncs.h +++ b/firmware/include/timefuncs.h @@ -21,24 +21,11 @@ #define _TIMEFUNCS_H_ #include "config.h" - -#ifndef SIMULATOR - -struct tm -{ - int tm_sec; /* seconds */ - int tm_min; /* minutes */ - int tm_hour; /* hours */ - int tm_mday; /* day of the month */ - int tm_mon; /* month */ - int tm_year; /* year since 1900 */ - int tm_wday; /* day of the week */ - int tm_yday; /* day in the year */ - int tm_isdst; /* daylight saving time */ -}; - -#endif +#include +#include "time.h" struct tm *get_time(void); +int set_time(struct tm *tm); +bool valid_time(struct tm *tm); #endif /* _TIMEFUNCS_H_ */ -- cgit v1.2.3