From 4bb2087f595665fd3a27bd607cfd98bc723d12e9 Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Sun, 14 Jan 2024 16:06:07 -0500 Subject: [PATCH] humidity: use templated sensor --- boards/apollo3/lora_things_plus/src/main.rs | 5 +++-- boards/apollo3/redboard_artemis_nano/src/main.rs | 5 +++-- boards/clue_nrf52840/src/main.rs | 5 +++-- boards/components/src/humidity.rs | 10 ++++++---- boards/hail/src/main.rs | 5 +++-- boards/imix/src/main.rs | 5 +++-- boards/nano33ble/src/main.rs | 5 +++-- boards/wm1110dev/src/main.rs | 5 +++-- capsules/extra/src/humidity.rs | 16 +++++++++------- 9 files changed, 36 insertions(+), 25 deletions(-) diff --git a/boards/apollo3/lora_things_plus/src/main.rs b/boards/apollo3/lora_things_plus/src/main.rs index 97f81d6717..ff2750737f 100644 --- a/boards/apollo3/lora_things_plus/src/main.rs +++ b/boards/apollo3/lora_things_plus/src/main.rs @@ -109,6 +109,7 @@ type BME280Sensor = components::bme280::Bme280ComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, apollo3::iom::Iom<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; /// A structure representing this platform that holds references to all /// capsules for this platform. @@ -147,7 +148,7 @@ struct LoRaThingsPlus { VirtualMuxAlarm<'static, apollo3::stimer::STimer<'static>>, >, temperature: &'static TemperatureDriver, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, air_quality: &'static capsules_extra::air_quality::AirQualitySensor<'static>, scheduler: &'static RoundRobinSched<'static>, systick: cortexm4::systick::SysTick, @@ -363,7 +364,7 @@ unsafe fn setup() -> ( capsules_extra::humidity::DRIVER_NUM, bme280, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(BME280Sensor)); BME280 = Some(bme280); let ccs811 = Ccs811Component::new(mux_i2c, 0x5B).finalize( diff --git a/boards/apollo3/redboard_artemis_nano/src/main.rs b/boards/apollo3/redboard_artemis_nano/src/main.rs index 0ea17a0b5d..f311e7c6c0 100644 --- a/boards/apollo3/redboard_artemis_nano/src/main.rs +++ b/boards/apollo3/redboard_artemis_nano/src/main.rs @@ -81,6 +81,7 @@ type BME280Sensor = components::bme280::Bme280ComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, apollo3::iom::Iom<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; /// A structure representing this platform that holds references to all /// capsules for this platform. @@ -111,7 +112,7 @@ struct RedboardArtemisNano { VirtualMuxAlarm<'static, apollo3::stimer::STimer<'static>>, >, temperature: &'static TemperatureDriver, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, air_quality: &'static capsules_extra::air_quality::AirQualitySensor<'static>, scheduler: &'static RoundRobinSched<'static>, systick: cortexm4::systick::SysTick, @@ -323,7 +324,7 @@ unsafe fn setup() -> ( capsules_extra::humidity::DRIVER_NUM, bme280, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(BME280Sensor)); BME280 = Some(bme280); let ccs811 = Ccs811Component::new(mux_i2c, 0x5B) diff --git a/boards/clue_nrf52840/src/main.rs b/boards/clue_nrf52840/src/main.rs index 25bd77bca7..dfbf0ecca6 100644 --- a/boards/clue_nrf52840/src/main.rs +++ b/boards/clue_nrf52840/src/main.rs @@ -143,6 +143,7 @@ type SHT3xSensor = components::sht3x::SHT3xComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, nrf52840::i2c::TWI<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; /// Supported drivers by the platform pub struct Platform { @@ -187,7 +188,7 @@ pub struct Platform { >, adc: &'static capsules_core::adc::AdcVirtualized<'static>, temperature: &'static TemperatureDriver, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, scheduler: &'static RoundRobinSched<'static>, systick: cortexm4::systick::SysTick, } @@ -629,7 +630,7 @@ unsafe fn start() -> ( capsules_extra::humidity::DRIVER_NUM, sht3x, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(SHT3xSensor)); //-------------------------------------------------------------------------- // TFT diff --git a/boards/components/src/humidity.rs b/boards/components/src/humidity.rs index 938c163f39..cddfe62633 100644 --- a/boards/components/src/humidity.rs +++ b/boards/components/src/humidity.rs @@ -20,11 +20,13 @@ use kernel::hil; #[macro_export] macro_rules! humidity_component_static { - () => {{ - kernel::static_buf!(capsules_extra::humidity::HumiditySensor<'static>) + ($H: ty $(,)?) => {{ + kernel::static_buf!(capsules_extra::humidity::HumiditySensor<'static, $H>) };}; } +pub type HumidityComponentType = capsules_extra::humidity::HumiditySensor<'static, H>; + pub struct HumidityComponent> { board_kernel: &'static kernel::Kernel, driver_num: usize, @@ -46,8 +48,8 @@ impl> HumidityComponent { } impl> Component for HumidityComponent { - type StaticInput = &'static mut MaybeUninit>; - type Output = &'static HumiditySensor<'static>; + type StaticInput = &'static mut MaybeUninit>; + type Output = &'static HumiditySensor<'static, T>; fn finalize(self, s: Self::StaticInput) -> Self::Output { let grant_cap = create_capability!(capabilities::MemoryAllocationCapability); diff --git a/boards/hail/src/main.rs b/boards/hail/src/main.rs index ff5deadf63..013783eeda 100644 --- a/boards/hail/src/main.rs +++ b/boards/hail/src/main.rs @@ -53,6 +53,7 @@ type SI7021Sensor = components::si7021::SI7021ComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, sam4l::i2c::I2CHw<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; /// A structure representing this platform that holds references to all /// capsules for this platform. @@ -69,7 +70,7 @@ struct Hail { ambient_light: &'static capsules_extra::ambient_light::AmbientLight<'static>, temp: &'static TemperatureDriver, ninedof: &'static capsules_extra::ninedof::NineDof<'static>, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, spi: &'static capsules_core::spi_controller::Spi< 'static, capsules_core::virtualizers::virtual_spi::VirtualSpiMasterDevice< @@ -340,7 +341,7 @@ unsafe fn start() -> ( capsules_extra::humidity::DRIVER_NUM, si7021, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(SI7021Sensor)); // Configure the ISL29035, device address 0x44 let isl29035 = components::isl29035::Isl29035Component::new(sensors_i2c, mux_alarm).finalize( diff --git a/boards/imix/src/main.rs b/boards/imix/src/main.rs index a24c5de9bc..c1583b8b6f 100644 --- a/boards/imix/src/main.rs +++ b/boards/imix/src/main.rs @@ -113,6 +113,7 @@ type SI7021Sensor = components::si7021::SI7021ComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, sam4l::i2c::I2CHw<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; struct Imix { pconsole: &'static capsules_core::process_console::ProcessConsole< @@ -131,7 +132,7 @@ struct Imix { gpio: &'static capsules_core::gpio::GPIO<'static, sam4l::gpio::GPIOPin<'static>>, alarm: &'static AlarmDriver<'static, VirtualMuxAlarm<'static, sam4l::ast::Ast<'static>>>, temp: &'static TemperatureDriver, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, ambient_light: &'static capsules_extra::ambient_light::AmbientLight<'static>, adc: &'static capsules_core::adc::AdcDedicated<'static, sam4l::adc::Adc<'static>>, led: &'static capsules_core::led::LedDriver< @@ -473,7 +474,7 @@ pub unsafe fn main() { capsules_extra::humidity::DRIVER_NUM, si7021, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(SI7021Sensor)); let fxos8700 = components::fxos8700::Fxos8700Component::new(mux_i2c, 0x1e, &peripherals.pc[13]) .finalize(components::fxos8700_component_static!( diff --git a/boards/nano33ble/src/main.rs b/boards/nano33ble/src/main.rs index 9b72b67a08..bba9227889 100644 --- a/boards/nano33ble/src/main.rs +++ b/boards/nano33ble/src/main.rs @@ -119,6 +119,7 @@ type HTS221Sensor = components::hts221::Hts221ComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, nrf52840::i2c::TWI<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; /// Supported drivers by the platform pub struct Platform { @@ -143,7 +144,7 @@ pub struct Platform { >, proximity: &'static capsules_extra::proximity::ProximitySensor<'static>, temperature: &'static TemperatureDriver, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, gpio: &'static capsules_core::gpio::GPIO<'static, nrf52::gpio::GPIOPin<'static>>, led: &'static capsules_core::led::LedDriver< 'static, @@ -510,7 +511,7 @@ pub unsafe fn start() -> ( capsules_extra::humidity::DRIVER_NUM, hts221, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(HTS221Sensor)); //-------------------------------------------------------------------------- // WIRELESS diff --git a/boards/wm1110dev/src/main.rs b/boards/wm1110dev/src/main.rs index 8d4a11e95d..e4620652d5 100644 --- a/boards/wm1110dev/src/main.rs +++ b/boards/wm1110dev/src/main.rs @@ -91,6 +91,7 @@ type SHT4xSensor = components::sht4x::SHT4xComponentType< capsules_core::virtualizers::virtual_i2c::I2CDevice<'static, nrf52840::i2c::TWI<'static>>, >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type HumidityDriver = components::humidity::HumidityComponentType; /// Supported drivers by the platform pub struct Platform { @@ -111,7 +112,7 @@ pub struct Platform { >, >, temperature: &'static TemperatureDriver, - humidity: &'static capsules_extra::humidity::HumiditySensor<'static>, + humidity: &'static HumidityDriver, lr1110_gpio: &'static capsules_core::gpio::GPIO<'static, nrf52840::gpio::GPIOPin<'static>>, lr1110_spi: &'static capsules_core::spi_controller::Spi< 'static, @@ -351,7 +352,7 @@ pub unsafe fn start() -> ( capsules_extra::humidity::DRIVER_NUM, sht4x, ) - .finalize(components::humidity_component_static!()); + .finalize(components::humidity_component_static!(SHT4xSensor)); //-------------------------------------------------------------------------- // LoRa (SPI + GPIO) diff --git a/capsules/extra/src/humidity.rs b/capsules/extra/src/humidity.rs index 9b4e9493b2..2c1cb7a401 100644 --- a/capsules/extra/src/humidity.rs +++ b/capsules/extra/src/humidity.rs @@ -73,17 +73,17 @@ pub struct App { subscribed: bool, } -pub struct HumiditySensor<'a> { - driver: &'a dyn hil::sensors::HumidityDriver<'a>, +pub struct HumiditySensor<'a, H: hil::sensors::HumidityDriver<'a>> { + driver: &'a H, apps: Grant, AllowRoCount<0>, AllowRwCount<0>>, busy: Cell, } -impl<'a> HumiditySensor<'a> { +impl<'a, H: hil::sensors::HumidityDriver<'a>> HumiditySensor<'a, H> { pub fn new( - driver: &'a dyn hil::sensors::HumidityDriver<'a>, + driver: &'a H, grant: Grant, AllowRoCount<0>, AllowRwCount<0>>, - ) -> HumiditySensor<'a> { + ) -> HumiditySensor<'a, H> { HumiditySensor { driver: driver, apps: grant, @@ -119,7 +119,9 @@ impl<'a> HumiditySensor<'a> { } } -impl hil::sensors::HumidityClient for HumiditySensor<'_> { +impl<'a, H: hil::sensors::HumidityDriver<'a>> hil::sensors::HumidityClient + for HumiditySensor<'a, H> +{ fn callback(&self, humidity_val: usize) { self.busy.set(false); @@ -134,7 +136,7 @@ impl hil::sensors::HumidityClient for HumiditySensor<'_> { } } -impl SyscallDriver for HumiditySensor<'_> { +impl<'a, H: hil::sensors::HumidityDriver<'a>> SyscallDriver for HumiditySensor<'a, H> { fn command( &self, command_num: usize,