@@ -24,6 +24,25 @@ impl Time {
2424 }
2525}
2626
27+ #[ derive( Clone , Copy , Debug ) ]
28+ pub struct Date {
29+ day : u8 ,
30+ date : u8 ,
31+ month : u8 ,
32+ year : u16 ,
33+ }
34+
35+ impl Date {
36+ pub fn new ( day : u8 , date : u8 , month : u8 , year : u16 ) -> Self {
37+ Self {
38+ day : day,
39+ date : date,
40+ month : month,
41+ year : year
42+ }
43+ }
44+ }
45+
2746/// RTC Abstraction
2847pub struct Rtc {
2948 rtc : RTC
@@ -84,6 +103,7 @@ impl Rtc {
84103 }
85104 init_mode ( & rtc, false ) ;
86105
106+ // TODO configuration for output pins
87107 rtc. or . modify ( |_, w| {
88108 w. rtc_alarm_type ( )
89109 . clear_bit ( )
@@ -138,7 +158,6 @@ impl Rtc {
138158 {
139159 let timer = self . rtc . tr . read ( ) ;
140160 let cr = self . rtc . cr . read ( ) ;
141- let ht = timer. ht ( ) . bits ( ) ;
142161 time = Time :: new ( bcd2_to_byte ( ( timer. ht ( ) . bits ( ) , timer. hu ( ) . bits ( ) ) ) ,
143162 bcd2_to_byte ( ( timer. mnt ( ) . bits ( ) , timer. mnu ( ) . bits ( ) ) ) ,
144163 bcd2_to_byte ( ( timer. st ( ) . bits ( ) , timer. su ( ) . bits ( ) ) ) ,
@@ -150,6 +169,53 @@ impl Rtc {
150169
151170 time
152171 }
172+
173+ pub fn set_date ( & self , date : & Date ) {
174+ write_protection ( & self . rtc , false ) ;
175+ {
176+ init_mode ( & self . rtc , true ) ;
177+ {
178+ let ( dt, du) = byte_to_bcd2 ( date. date ) ;
179+ let ( mt, mu) = byte_to_bcd2 ( date. month ) ;
180+ let ( yt, yu) = byte_to_bcd2 ( ( date. year - 1970_u16 ) as u8 ) ;
181+
182+ self . rtc . dr . write ( |w| unsafe {
183+ w. dt ( ) . bits ( dt)
184+ . du ( ) . bits ( du)
185+ . mt ( ) . bit ( mt > 0 )
186+ . mu ( ) . bits ( mu)
187+ . yt ( ) . bits ( yt)
188+ . yu ( ) . bits ( yu)
189+ . wdu ( ) . bits ( date. day )
190+ } ) ;
191+
192+
193+ }
194+ init_mode ( & self . rtc , false ) ;
195+ }
196+ write_protection ( & self . rtc , true ) ;
197+ }
198+
199+ pub fn get_date ( & self ) -> Date {
200+ let date;
201+ write_protection ( & self . rtc , false ) ;
202+ {
203+ init_mode ( & self . rtc , true ) ;
204+ {
205+ let dater = self . rtc . dr . read ( ) ;
206+ let ( yt, yu) = ( dater. yt ( ) . bits ( ) , dater. yu ( ) . bits ( ) ) ;
207+ date = Date :: new ( dater. wdu ( ) . bits ( ) ,
208+ bcd2_to_byte ( ( dater. dt ( ) . bits ( ) , dater. du ( ) . bits ( ) ) ) ,
209+ bcd2_to_byte ( ( dater. mt ( ) . bit ( ) as u8 , dater. mu ( ) . bits ( ) ) ) ,
210+ ( bcd2_to_byte ( ( dater. yt ( ) . bits ( ) , dater. yu ( ) . bits ( ) ) ) as u16 + 1970_u16 ) as u16 ,
211+ ) ;
212+ }
213+ init_mode ( & self . rtc , false ) ;
214+ }
215+ write_protection ( & self . rtc , true ) ;
216+
217+ date
218+ }
153219
154220}
155221
0 commit comments