components/
temperature.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 any Temperature sensor.
6//!
7//! Usage
8//! -----
9//! ```rust
10//! let temp = TemperatureComponent::new(board_kernel, nrf52::temperature::TEMP)
11//!     .finalize(components::temperature_component_static!());
12//! ```
13
14use capsules_extra::temperature::TemperatureSensor;
15use core::mem::MaybeUninit;
16use kernel::capabilities;
17use kernel::component::Component;
18use kernel::create_capability;
19use kernel::hil;
20
21#[macro_export]
22macro_rules! temperature_component_static {
23    ($T:ty $(,)?) => {{
24        kernel::static_buf!(capsules_extra::temperature::TemperatureSensor<'static, $T>)
25    };};
26}
27
28pub type TemperatureComponentType<T> = capsules_extra::temperature::TemperatureSensor<'static, T>;
29
30pub struct TemperatureComponent<T: 'static + hil::sensors::TemperatureDriver<'static>> {
31    board_kernel: &'static kernel::Kernel,
32    driver_num: usize,
33    temp_sensor: &'static T,
34}
35
36impl<T: 'static + hil::sensors::TemperatureDriver<'static>> TemperatureComponent<T> {
37    pub fn new(
38        board_kernel: &'static kernel::Kernel,
39        driver_num: usize,
40        temp_sensor: &'static T,
41    ) -> TemperatureComponent<T> {
42        TemperatureComponent {
43            board_kernel,
44            driver_num,
45            temp_sensor,
46        }
47    }
48}
49
50impl<T: 'static + hil::sensors::TemperatureDriver<'static>> Component for TemperatureComponent<T> {
51    type StaticInput = &'static mut MaybeUninit<TemperatureSensor<'static, T>>;
52    type Output = &'static TemperatureSensor<'static, T>;
53
54    fn finalize(self, s: Self::StaticInput) -> Self::Output {
55        let grant_cap = create_capability!(capabilities::MemoryAllocationCapability);
56
57        let temp = s.write(TemperatureSensor::new(
58            self.temp_sensor,
59            self.board_kernel.create_grant(self.driver_num, &grant_cap),
60        ));
61
62        hil::sensors::TemperatureDriver::set_client(self.temp_sensor, temp);
63        temp
64    }
65}