diff options
Diffstat (limited to 'firmware/common/timefuncs.c')
-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 @@ | |||
23 | #include "timefuncs.h" | 23 | #include "timefuncs.h" |
24 | #include "debug.h" | 24 | #include "debug.h" |
25 | 25 | ||
26 | #ifndef SIMULATOR | ||
26 | static struct tm tm; | 27 | static struct tm tm; |
28 | #endif | ||
29 | |||
30 | bool valid_time(struct tm *tm) | ||
31 | { | ||
32 | if (tm->tm_hour < 0 || tm->tm_hour > 23 || | ||
33 | tm->tm_sec < 0 || tm->tm_sec > 59 || | ||
34 | tm->tm_min < 0 || tm->tm_min > 59 || | ||
35 | tm->tm_year < 100 || tm->tm_year > 199 || | ||
36 | tm->tm_mon < 0 || tm->tm_mon > 11 || | ||
37 | tm->tm_wday < 1 || tm->tm_wday > 7 || | ||
38 | tm->tm_mday < 1 || tm->tm_mday > 31) | ||
39 | return false; | ||
40 | else | ||
41 | return true; | ||
42 | } | ||
43 | |||
27 | 44 | ||
28 | struct tm *get_time(void) | 45 | struct tm *get_time(void) |
29 | { | 46 | { |
47 | #ifndef SIMULATOR | ||
30 | #ifdef HAVE_RTC | 48 | #ifdef HAVE_RTC |
31 | char rtcbuf[8]; | 49 | char rtcbuf[8]; |
32 | 50 | ||
@@ -41,6 +59,8 @@ struct tm *get_time(void) | |||
41 | tm.tm_mon = ((rtcbuf[6] & 0x10) >> 4) * 10 + (rtcbuf[6] & 0x0f) - 1; | 59 | tm.tm_mon = ((rtcbuf[6] & 0x10) >> 4) * 10 + (rtcbuf[6] & 0x0f) - 1; |
42 | tm.tm_year = ((rtcbuf[7] & 0xf0) >> 4) * 10 + (rtcbuf[7] & 0x0f) + 100; | 60 | tm.tm_year = ((rtcbuf[7] & 0xf0) >> 4) * 10 + (rtcbuf[7] & 0x0f) + 100; |
43 | tm.tm_wday = rtcbuf[4] & 0x07; | 61 | tm.tm_wday = rtcbuf[4] & 0x07; |
62 | if(tm.tm_wday == 7) | ||
63 | tm.tm_wday = 0; | ||
44 | tm.tm_yday = 0; /* Not implemented for now */ | 64 | tm.tm_yday = 0; /* Not implemented for now */ |
45 | tm.tm_isdst = -1; /* Not implemented for now */ | 65 | tm.tm_isdst = -1; /* Not implemented for now */ |
46 | #else | 66 | #else |
@@ -55,4 +75,44 @@ struct tm *get_time(void) | |||
55 | tm.tm_isdst = -1; /* Not implemented for now */ | 75 | tm.tm_isdst = -1; /* Not implemented for now */ |
56 | #endif | 76 | #endif |
57 | return &tm; | 77 | return &tm; |
78 | #else | ||
79 | time_t now = time(NULL); | ||
80 | return localtime(&now); | ||
81 | #endif | ||
82 | } | ||
83 | |||
84 | int set_time(struct tm *tm) | ||
85 | { | ||
86 | #ifdef HAVE_RTC | ||
87 | int rc; | ||
88 | int tmp; | ||
89 | |||
90 | if (valid_time(tm)) | ||
91 | { | ||
92 | rc = rtc_write(1, ((tm->tm_sec/10) << 4) | (tm->tm_sec%10)); | ||
93 | rc |= rtc_write(2, ((tm->tm_min/10) << 4) | (tm->tm_min%10)); | ||
94 | rc |= rtc_write(3, ((tm->tm_hour/10) << 4) | (tm->tm_hour%10)); | ||
95 | tmp = tm->tm_wday; | ||
96 | if(tmp == 0) | ||
97 | tmp = 7; | ||
98 | rc |= rtc_write(4, tmp); | ||
99 | rc |= rtc_write(5, ((tm->tm_mday/10) << 4) | (tm->tm_mday%10)); | ||
100 | rc |= rtc_write(6, (((tm->tm_mon+1)/10) << 4) | ((tm->tm_mon+1)%10)); | ||
101 | rc |= rtc_write(7, (((tm->tm_year-100)/10) << 4) | ((tm->tm_year-100)%10)); | ||
102 | |||
103 | rc |= rtc_write(8, 0x80); /* Out=1, calibration = 0 */ | ||
104 | |||
105 | if(rc) | ||
106 | return -1; | ||
107 | else | ||
108 | return 0; | ||
109 | } | ||
110 | else | ||
111 | { | ||
112 | return -2; | ||
113 | } | ||
114 | #else | ||
115 | (void)tm; | ||
116 | return 0; | ||
117 | #endif | ||
58 | } | 118 | } |