components/
temperature.rs1use 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}