1use core::mem::MaybeUninit;
23
24use capsules_extra::date_time::DateTimeCapsule;
25use kernel::capabilities;
26use kernel::component::Component;
27use kernel::create_capability;
28use kernel::hil::date_time;
29
30#[macro_export]
31macro_rules! date_time_component_static {
32    ($R:ty $(,)?) => {{
33        let rtc = kernel::static_buf!(capsules_extra::date_time::DateTimeCapsule<'static, $R>);
34        (rtc)
35    };};
36}
37
38pub struct DateTimeComponent<D: 'static + date_time::DateTime<'static>> {
39    board_kernel: &'static kernel::Kernel,
40    driver_num: usize,
41    rtc: &'static D,
42}
43
44impl<D: 'static + date_time::DateTime<'static>> DateTimeComponent<D> {
45    pub fn new(
46        board_kernel: &'static kernel::Kernel,
47        driver_num: usize,
48        rtc: &'static D,
49    ) -> DateTimeComponent<D> {
50        DateTimeComponent {
51            board_kernel,
52            driver_num,
53            rtc,
54        }
55    }
56}
57
58impl<D: 'static + date_time::DateTime<'static> + kernel::deferred_call::DeferredCallClient>
59    Component for DateTimeComponent<D>
60{
61    type StaticInput = &'static mut MaybeUninit<DateTimeCapsule<'static, D>>;
62
63    type Output = &'static DateTimeCapsule<'static, D>;
64
65    fn finalize(self, s: Self::StaticInput) -> Self::Output {
66        let grant_dt = create_capability!(capabilities::MemoryAllocationCapability);
67        let grant_date_time = self.board_kernel.create_grant(self.driver_num, &grant_dt);
68
69        let date_time = s.write(DateTimeCapsule::new(self.rtc, grant_date_time));
70        date_time::DateTime::set_client(self.rtc, date_time);
71        date_time
72    }
73}