components/
temperature_rp2040.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 the RaspberryPI 2040 built-in temperature sensor.
6
7use capsules_core::virtualizers::virtual_adc::AdcDevice;
8use capsules_extra::temperature_rp2040::TemperatureRp2040;
9use core::mem::MaybeUninit;
10use kernel::component::Component;
11use kernel::hil::adc;
12use kernel::hil::adc::AdcChannel;
13
14#[macro_export]
15macro_rules! temperature_rp2040_adc_component_static {
16    ($A:ty $(,)?) => {{
17        let adc_device = components::adc_component_static!($A);
18        let temperature_rp2040 = kernel::static_buf!(
19            capsules_extra::temperature_rp2040::TemperatureRp2040<
20                'static,
21                capsules_core::virtualizers::virtual_adc::AdcDevice<'static, $A>,
22            >
23        );
24
25        (adc_device, temperature_rp2040)
26    };};
27}
28
29pub type TemperatureRp2040ComponentType<A> =
30    capsules_extra::temperature_rp2040::TemperatureRp2040<'static, A>;
31
32pub struct TemperatureRp2040Component<A: 'static + adc::Adc<'static>> {
33    adc_mux: &'static capsules_core::virtualizers::virtual_adc::MuxAdc<'static, A>,
34    adc_channel: A::Channel,
35    slope: f32,
36    v_27: f32,
37}
38
39impl<A: 'static + adc::Adc<'static>> TemperatureRp2040Component<A> {
40    pub fn new(
41        adc_mux: &'static capsules_core::virtualizers::virtual_adc::MuxAdc<'static, A>,
42        adc_channel: A::Channel,
43        slope: f32,
44        v_27: f32,
45    ) -> TemperatureRp2040Component<A> {
46        TemperatureRp2040Component {
47            adc_mux,
48            adc_channel,
49            slope,
50            v_27,
51        }
52    }
53}
54
55impl<A: 'static + adc::Adc<'static>> Component for TemperatureRp2040Component<A> {
56    type StaticInput = (
57        &'static mut MaybeUninit<AdcDevice<'static, A>>,
58        &'static mut MaybeUninit<TemperatureRp2040<'static, AdcDevice<'static, A>>>,
59    );
60    type Output = &'static TemperatureRp2040<'static, AdcDevice<'static, A>>;
61
62    fn finalize(self, s: Self::StaticInput) -> Self::Output {
63        let adc_device =
64            crate::adc::AdcComponent::new(self.adc_mux, self.adc_channel).finalize(s.0);
65
66        let temperature_rp2040 =
67            s.1.write(TemperatureRp2040::new(adc_device, self.slope, self.v_27));
68
69        adc_device.set_client(temperature_rp2040);
70
71        temperature_rp2040
72    }
73}