components/
date_time.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Component for Date and Time initialisation.
6//!
7//! Authors: Irina Bradu <irinabradu.a@gmail.com>
8//!          Remus Rughinis <remus.rughinis.007@gmail.com>
9//!
10//! Usage
11//! -----
12//!
13//! '''rust
14//!     let date_time = components::date_time::DateTimeComponent::new(
15//!         board_kernel,
16//!         capsules_extra::date_time::DRIVER_NUM,
17//!         &peripherals.rtc,
18//!     )
19//!     .finalize(rtc_component_static!(stm32f429zi::rtc::Rtc<'static>));
20//! '''
21
22use 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}