Skip to main content

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::MemoryAllocationCapability;
17use kernel::component::Component;
18use kernel::hil;
19
20#[macro_export]
21macro_rules! temperature_component_static {
22    ($T:ty $(,)?) => {{ kernel::static_buf!(capsules_extra::temperature::TemperatureSensor<'static, $T>) }};
23}
24
25pub type TemperatureComponentType<T> = capsules_extra::temperature::TemperatureSensor<'static, T>;
26
27pub struct TemperatureComponent<
28    T: 'static + hil::sensors::TemperatureDriver<'static>,
29    CAP: MemoryAllocationCapability + 'static,
30> {
31    board_kernel: &'static kernel::Kernel,
32    driver_num: usize,
33    temp_sensor: &'static T,
34    mem_cap: CAP,
35}
36
37impl<
38    T: 'static + hil::sensors::TemperatureDriver<'static>,
39    CAP: MemoryAllocationCapability + 'static,
40> TemperatureComponent<T, CAP>
41{
42    pub fn new(
43        board_kernel: &'static kernel::Kernel,
44        driver_num: usize,
45        temp_sensor: &'static T,
46        mem_cap: CAP,
47    ) -> TemperatureComponent<T, CAP> {
48        TemperatureComponent {
49            board_kernel,
50            driver_num,
51            temp_sensor,
52            mem_cap,
53        }
54    }
55}
56
57impl<
58    T: 'static + hil::sensors::TemperatureDriver<'static>,
59    CAP: MemoryAllocationCapability + 'static,
60> Component for TemperatureComponent<T, CAP>
61{
62    type StaticInput = &'static mut MaybeUninit<TemperatureSensor<'static, T>>;
63    type Output = &'static TemperatureSensor<'static, T>;
64
65    fn finalize(self, s: Self::StaticInput) -> Self::Output {
66        let temp = s.write(TemperatureSensor::new(
67            self.temp_sensor,
68            self.board_kernel
69                .create_grant(self.driver_num, &self.mem_cap),
70        ));
71
72        hil::sensors::TemperatureDriver::set_client(self.temp_sensor, temp);
73        temp
74    }
75}