19
19
#if DEVICE_RTC
20
20
#include <time.h>
21
21
#include "timer_api.h" // software-RTC: use a g-timer for the tick of the RTC
22
+ #include "mbed_mktime.h"
22
23
23
24
#define SW_RTC_TIMER_ID TIMER4
24
25
25
26
static gtimer_t sw_rtc ;
26
- static struct tm rtc_timeinfo ;
27
27
static int sw_rtc_en = 0 ;
28
-
29
- static const u8 dim [14 ] = {
30
- 31 , 0 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 , 31 , 28 };
31
-
32
- static inline bool is_leap_year (unsigned int year )
33
- {
34
- return (!(year % 4 ) && (year % 100 )) || !(year % 400 );
35
- }
36
-
37
-
38
- static u8 days_in_month (u8 month , u8 year )
39
- {
40
- u8 ret = dim [ month - 1 ];
41
- if (ret == 0 )
42
- ret = is_leap_year (year ) ? 29 : 28 ;
43
- return ret ;
44
- }
28
+ static time_t rtc_time ;
45
29
46
30
void sw_rtc_tick_handler (uint32_t id )
47
31
{
48
- if (++ rtc_timeinfo .tm_sec > 59 ) { // Increment seconds, check for overflow
49
- rtc_timeinfo .tm_sec = 0 ; // Reset seconds
50
- if (++ rtc_timeinfo .tm_min > 59 ) { // Increment minutes, check for overflow
51
- rtc_timeinfo .tm_min = 0 ; // Reset minutes
52
- if (++ rtc_timeinfo .tm_hour > 23 ) { // Increment hours, check for overflow
53
- rtc_timeinfo .tm_hour = 0 ; // Reset hours
54
- ++ rtc_timeinfo .tm_yday ; // Increment day of year
55
- if (++ rtc_timeinfo .tm_wday > 6 ) // Increment day of week, check for overflow
56
- rtc_timeinfo .tm_wday = 0 ; // Reset day of week
57
- // Increment day of month, check for overflow
58
- if (++ rtc_timeinfo .tm_mday >
59
- days_in_month (rtc_timeinfo .tm_mon , rtc_timeinfo .tm_year + 1900 )) {
60
- rtc_timeinfo .tm_mday = 1 ; // Reset day of month
61
- if (++ rtc_timeinfo .tm_mon > 11 ) { // Increment month, check for overflow
62
- rtc_timeinfo .tm_mon = 0 ; // Reset month
63
- rtc_timeinfo .tm_yday = 0 ; // Reset day of year
64
- ++ rtc_timeinfo .tm_year ; // Increment year
65
- } // - year
66
- } // - month
67
- } // - day
68
- } // - hour
69
- }
32
+ rtc_time ++ ;
70
33
}
71
34
72
35
void rtc_init (void )
@@ -92,35 +55,15 @@ int rtc_isenabled(void)
92
55
93
56
time_t rtc_read (void )
94
57
{
95
- time_t t ;
96
-
97
- // Convert to timestamp
98
- t = mktime (& rtc_timeinfo );
99
-
100
- return t ;
58
+ return rtc_time ;
101
59
}
102
60
103
61
void rtc_write (time_t t )
104
62
{
105
- // Convert the time in to a tm
106
- struct tm * timeinfo = localtime (& t );
107
-
108
- if (timeinfo == NULL ) {
109
- // Error
110
- return ;
111
- }
112
-
113
63
gtimer_stop (& sw_rtc );
114
64
115
65
// Set the RTC
116
- rtc_timeinfo .tm_sec = timeinfo -> tm_sec ;
117
- rtc_timeinfo .tm_min = timeinfo -> tm_min ;
118
- rtc_timeinfo .tm_hour = timeinfo -> tm_hour ;
119
- rtc_timeinfo .tm_mday = timeinfo -> tm_mday ;
120
- rtc_timeinfo .tm_wday = timeinfo -> tm_wday ;
121
- rtc_timeinfo .tm_yday = timeinfo -> tm_yday ;
122
- rtc_timeinfo .tm_mon = timeinfo -> tm_mon ;
123
- rtc_timeinfo .tm_year = timeinfo -> tm_year ;
66
+ rtc_time = t ;
124
67
125
68
gtimer_start (& sw_rtc );
126
69
}
0 commit comments