1use capsules_core::virtualizers::virtual_alarm::{MuxAlarm, VirtualMuxAlarm};
20use capsules_core::virtualizers::virtual_i2c::{I2CDevice, MuxI2C};
21use capsules_extra::sht4x::SHT4x;
22use core::mem::MaybeUninit;
23use kernel::component::Component;
24use kernel::hil::i2c;
25use kernel::hil::time::Alarm;
26
27#[macro_export]
29macro_rules! sht4x_component_static {
30 ($A:ty, $I:ty $(,)?) => {{
31 let buffer = kernel::static_buf!([u8; 6]);
32 let i2c_device =
33 kernel::static_buf!(capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, $I>);
34 let sht4x_alarm = kernel::static_buf!(
35 capsules_core::virtualizers::virtual_alarm::VirtualMuxAlarm<'static, $A>
36 );
37 let sht4x = kernel::static_buf!(
38 capsules_extra::sht4x::SHT4x<
39 'static,
40 capsules_core::virtualizers::virtual_alarm::VirtualMuxAlarm<'static, $A>,
41 capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, $I>,
42 >
43 );
44
45 (sht4x_alarm, i2c_device, sht4x, buffer)
46 };};
47}
48
49pub type SHT4xComponentType<A, I> = capsules_extra::sht4x::SHT4x<'static, A, I>;
50
51pub struct SHT4xComponent<A: 'static + Alarm<'static>, I: 'static + i2c::I2CMaster<'static>> {
52 i2c_mux: &'static MuxI2C<'static, I>,
53 i2c_address: u8,
54 alarm_mux: &'static MuxAlarm<'static, A>,
55}
56
57impl<A: 'static + Alarm<'static>, I: 'static + i2c::I2CMaster<'static>> SHT4xComponent<A, I> {
58 pub fn new(
59 i2c_mux: &'static MuxI2C<'static, I>,
60 i2c_address: u8,
61 alarm_mux: &'static MuxAlarm<'static, A>,
62 ) -> SHT4xComponent<A, I> {
63 SHT4xComponent {
64 i2c_mux,
65 i2c_address,
66 alarm_mux,
67 }
68 }
69}
70
71impl<A: 'static + Alarm<'static>, I: 'static + i2c::I2CMaster<'static>> Component
72 for SHT4xComponent<A, I>
73{
74 type StaticInput = (
75 &'static mut MaybeUninit<VirtualMuxAlarm<'static, A>>,
76 &'static mut MaybeUninit<I2CDevice<'static, I>>,
77 &'static mut MaybeUninit<
78 SHT4x<'static, VirtualMuxAlarm<'static, A>, I2CDevice<'static, I>>,
79 >,
80 &'static mut MaybeUninit<[u8; 6]>,
81 );
82 type Output = &'static SHT4x<'static, VirtualMuxAlarm<'static, A>, I2CDevice<'static, I>>;
83
84 fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output {
85 let sht4x_i2c = static_buffer
86 .1
87 .write(I2CDevice::new(self.i2c_mux, self.i2c_address));
88
89 let buffer = static_buffer.3.write([0; 6]);
90
91 let sht4x_alarm = static_buffer.0.write(VirtualMuxAlarm::new(self.alarm_mux));
92 sht4x_alarm.setup();
93
94 let sht4x = static_buffer
95 .2
96 .write(SHT4x::new(sht4x_i2c, buffer, sht4x_alarm));
97 sht4x_i2c.set_client(sht4x);
98 sht4x_alarm.set_alarm_client(sht4x);
99
100 sht4x
101 }
102}