summaryrefslogtreecommitdiff
path: root/firmware/common/timefuncs.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/common/timefuncs.c')
-rw-r--r--firmware/common/timefuncs.c60
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
26static struct tm tm; 27static struct tm tm;
28#endif
29
30bool 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
28struct tm *get_time(void) 45struct 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
84int 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}