1use capsules_core::virtualizers::virtual_alarm::{MuxAlarm, VirtualMuxAlarm};
39use capsules_core::virtualizers::virtual_spi::{MuxSpiMaster, VirtualSpiMasterDevice};
40use capsules_extra::lpm013m126::Lpm013m126;
41use core::mem::MaybeUninit;
42use kernel::component::Component;
43use kernel::hil::spi::{SpiMaster, SpiMasterDevice};
44use kernel::hil::time::Alarm;
45use kernel::hil::{self, gpio};
46
47#[macro_export]
49macro_rules! lpm013m126_component_static {
50 ($A:ty, $P:ty, $S:ty $(,)?) => {{
51 let alarm = kernel::static_buf!(
52 capsules_core::virtualizers::virtual_alarm::VirtualMuxAlarm<'static, $A>
53 );
54 let buffer = kernel::static_buf!([u8; capsules_extra::lpm013m126::BUF_LEN]);
55 let spi_device = kernel::static_buf!(
56 capsules_core::virtualizers::virtual_spi::VirtualSpiMasterDevice<'static, $S>
57 );
58 let lpm013m126 = kernel::static_buf!(
59 capsules_extra::lpm013m126::Lpm013m126<
60 'static,
61 VirtualMuxAlarm<'static, $A>,
62 $P,
63 VirtualSpiMasterDevice<'static, $S>,
64 >
65 );
66
67 (alarm, buffer, spi_device, lpm013m126)
68 }};
69}
70
71pub struct Lpm013m126Component<A, P, S>
72where
73 A: 'static + Alarm<'static>,
74 P: 'static + gpio::Pin,
75 S: 'static + SpiMaster<'static>,
76{
77 spi: &'static MuxSpiMaster<'static, S>,
78 chip_select: S::ChipSelect,
79 disp: &'static P,
80 extcomin: &'static P,
81 alarm_mux: &'static MuxAlarm<'static, A>,
82}
83
84impl<A, P, S> Lpm013m126Component<A, P, S>
85where
86 A: 'static + Alarm<'static>,
87 P: 'static + gpio::Pin,
88 S: 'static + SpiMaster<'static>,
89{
90 pub fn new<I: kernel::hil::spi::cs::IntoChipSelect<S::ChipSelect, hil::spi::cs::ActiveHigh>>(
91 spi: &'static MuxSpiMaster<'static, S>,
92
93 chip_select: I,
94 disp: &'static P,
95 extcomin: &'static P,
96 alarm_mux: &'static MuxAlarm<'static, A>,
97 ) -> Self {
98 Self {
99 spi,
100 chip_select: chip_select.into_cs(),
101 disp,
102 extcomin,
103 alarm_mux,
104 }
105 }
106}
107
108impl<A, P, S> Component for Lpm013m126Component<A, P, S>
109where
110 A: 'static + Alarm<'static>,
111 P: 'static + gpio::Pin,
112 S: 'static + SpiMaster<'static>,
113{
114 type StaticInput = (
115 &'static mut MaybeUninit<VirtualMuxAlarm<'static, A>>,
116 &'static mut MaybeUninit<[u8; capsules_extra::lpm013m126::BUF_LEN]>,
117 &'static mut MaybeUninit<VirtualSpiMasterDevice<'static, S>>,
118 &'static mut MaybeUninit<
119 Lpm013m126<'static, VirtualMuxAlarm<'static, A>, P, VirtualSpiMasterDevice<'static, S>>,
120 >,
121 );
122 type Output = &'static Lpm013m126<
123 'static,
124 VirtualMuxAlarm<'static, A>,
125 P,
126 VirtualSpiMasterDevice<'static, S>,
127 >;
128
129 fn finalize(self, s: Self::StaticInput) -> Self::Output {
130 let lpm013m126_alarm = s.0.write(VirtualMuxAlarm::new(self.alarm_mux));
131 lpm013m126_alarm.setup();
132
133 let buffer = s.1.write([0; capsules_extra::lpm013m126::BUF_LEN]);
134
135 let spi_device =
136 s.2.write(VirtualSpiMasterDevice::new(self.spi, self.chip_select));
137 spi_device.setup();
138
139 let lpm013m126 = s.3.write(
140 Lpm013m126::new(
141 spi_device,
142 self.extcomin,
143 self.disp,
144 lpm013m126_alarm,
145 buffer,
146 )
147 .unwrap(),
148 );
149 spi_device.set_client(lpm013m126);
150 lpm013m126_alarm.set_alarm_client(lpm013m126);
151 lpm013m126.setup().unwrap();
156 lpm013m126
157 }
158}