components/
temperature_stm.rs1use capsules_core::virtualizers::virtual_adc::AdcDevice;
8use capsules_extra::temperature_stm::TemperatureSTM;
9use core::mem::MaybeUninit;
10use kernel::component::Component;
11use kernel::hil::adc;
12use kernel::hil::adc::AdcChannel;
13
14#[macro_export]
15macro_rules! temperature_stm_adc_component_static {
16 ($A:ty $(,)?) => {{
17 let adc_device = components::adc_component_static!($A);
18 let temperature_stm = kernel::static_buf!(
19 capsules_extra::temperature_stm::TemperatureSTM<
20 'static,
21 capsules_core::virtualizers::virtual_adc::AdcDevice<'static, $A>,
22 >
23 );
24
25 (adc_device, temperature_stm)
26 };};
27}
28
29pub type TemperatureSTMComponentType<A> =
30 capsules_extra::temperature_stm::TemperatureSTM<'static, A>;
31
32pub struct TemperatureSTMComponent<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_25: f32,
37}
38
39impl<A: 'static + adc::Adc<'static>> TemperatureSTMComponent<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_25: f32,
45 ) -> TemperatureSTMComponent<A> {
46 TemperatureSTMComponent {
47 adc_mux,
48 adc_channel,
49 slope,
50 v_25,
51 }
52 }
53}
54
55impl<A: 'static + adc::Adc<'static>> Component for TemperatureSTMComponent<A> {
56 type StaticInput = (
57 &'static mut MaybeUninit<AdcDevice<'static, A>>,
58 &'static mut MaybeUninit<TemperatureSTM<'static, AdcDevice<'static, A>>>,
59 );
60 type Output = &'static TemperatureSTM<'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_stm =
67 s.1.write(TemperatureSTM::new(adc_device, self.slope, self.v_25));
68
69 adc_device.set_client(temperature_stm);
70
71 temperature_stm
72 }
73}