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