|
23 | 23 | //! .finalize(components::humidity_component_static!()); |
24 | 24 | //! ``` |
25 | 25 |
|
| 26 | +use capsules_core::virtualizers::selection_policy::SelectionPolicy; |
26 | 27 | use capsules_core::virtualizers::virtual_i2c::{I2CDevice, MuxI2C}; |
27 | 28 | use capsules_extra::bme280::Bme280; |
28 | 29 | use core::mem::MaybeUninit; |
29 | 30 | use kernel::component::Component; |
30 | | -use kernel::hil::i2c; |
| 31 | +use kernel::hil::i2c::{self, NoSMBus}; |
31 | 32 |
|
32 | 33 | // Setup static space for the objects. |
33 | 34 | #[macro_export] |
34 | 35 | macro_rules! bme280_component_static { |
35 | | - ($I:ty $(,)?) => {{ |
36 | | - let i2c_device = |
37 | | - kernel::static_buf!(capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, $I>); |
| 36 | + ($I:ty, $SP:ty $(,)?) => {{ |
| 37 | + let i2c_device = kernel::static_buf!( |
| 38 | + capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, $I, $SP> |
| 39 | + ); |
38 | 40 | let i2c_buffer = kernel::static_buf!([u8; 26]); |
39 | 41 | let bme280 = kernel::static_buf!( |
40 | 42 | capsules_extra::bme280::Bme280< |
41 | 43 | 'static, |
42 | | - capsules_core::virtualizers::virtual_i2c::I2CDevice<$I>, |
| 44 | + capsules_core::virtualizers::virtual_i2c::I2CDevice<$I, $SP>, |
43 | 45 | > |
44 | 46 | ); |
45 | 47 |
|
46 | 48 | (i2c_device, i2c_buffer, bme280) |
47 | 49 | };}; |
| 50 | + ($I:ty $(,)?) => {{ |
| 51 | + use capsules_core::virtualizers::selection_policy::RoundRobinPolicy; |
| 52 | + $crate::bme280_component_static!($I, RoundRobinPolicy) |
| 53 | + };}; |
48 | 54 | } |
49 | 55 |
|
50 | 56 | pub type Bme280ComponentType<I> = capsules_extra::bme280::Bme280<'static, I>; |
51 | 57 |
|
52 | | -pub struct Bme280Component<I: 'static + i2c::I2CMaster<'static>> { |
53 | | - i2c_mux: &'static MuxI2C<'static, I>, |
| 58 | +pub struct Bme280Component< |
| 59 | + I: 'static + i2c::I2CMaster<'static>, |
| 60 | + SPI: 'static + SelectionPolicy<&'static I2CDevice<'static, I, SPI>>, |
| 61 | +> { |
| 62 | + i2c_mux: &'static MuxI2C<'static, I, NoSMBus, SPI>, |
54 | 63 | i2c_address: u8, |
55 | 64 | } |
56 | 65 |
|
57 | | -impl<I: 'static + i2c::I2CMaster<'static>> Bme280Component<I> { |
58 | | - pub fn new(i2c: &'static MuxI2C<'static, I>, i2c_address: u8) -> Self { |
| 66 | +impl< |
| 67 | + I: 'static + i2c::I2CMaster<'static>, |
| 68 | + SPI: 'static + SelectionPolicy<&'static I2CDevice<'static, I, SPI>>, |
| 69 | + > Bme280Component<I, SPI> |
| 70 | +{ |
| 71 | + pub fn new(i2c: &'static MuxI2C<'static, I, NoSMBus, SPI>, i2c_address: u8) -> Self { |
59 | 72 | Bme280Component { |
60 | 73 | i2c_mux: i2c, |
61 | 74 | i2c_address, |
62 | 75 | } |
63 | 76 | } |
64 | 77 | } |
65 | 78 |
|
66 | | -impl<I: 'static + i2c::I2CMaster<'static>> Component for Bme280Component<I> { |
| 79 | +impl< |
| 80 | + I: 'static + i2c::I2CMaster<'static>, |
| 81 | + SPI: 'static + SelectionPolicy<&'static I2CDevice<'static, I, SPI>>, |
| 82 | + > Component for Bme280Component<I, SPI> |
| 83 | +{ |
67 | 84 | type StaticInput = ( |
68 | | - &'static mut MaybeUninit<I2CDevice<'static, I>>, |
| 85 | + &'static mut MaybeUninit<I2CDevice<'static, I, SPI>>, |
69 | 86 | &'static mut MaybeUninit<[u8; 26]>, |
70 | | - &'static mut MaybeUninit<Bme280<'static, I2CDevice<'static, I>>>, |
| 87 | + &'static mut MaybeUninit<Bme280<'static, I2CDevice<'static, I, SPI>>>, |
71 | 88 | ); |
72 | | - type Output = &'static Bme280<'static, I2CDevice<'static, I>>; |
| 89 | + type Output = &'static Bme280<'static, I2CDevice<'static, I, SPI>>; |
73 | 90 |
|
74 | 91 | fn finalize(self, s: Self::StaticInput) -> Self::Output { |
75 | 92 | let bme280_i2c = s.0.write(I2CDevice::new(self.i2c_mux, self.i2c_address)); |
|
0 commit comments