Firmware for the b-parasite board, but in Rust!
at main 1.7 kB view raw
1use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, signal::Signal, watch::Watch}; 2use sachy_bthome::{ 3 Battery1Per, Humidity1Per, Illuminance10mLux, Moisture1Per, Temperature10mK, Voltage1mV, 4}; 5use sachy_shtc3::Measurement; 6 7#[derive(Debug, Clone)] 8#[cfg_attr(feature = "defmt", derive(defmt::Format))] 9#[repr(align(8))] 10pub struct AdcMeasurements { 11 pub battery: Battery1Per, 12 pub voltage: Voltage1mV, 13 pub moisture: Moisture1Per, 14 pub lux: Illuminance10mLux, 15} 16 17impl AdcMeasurements { 18 pub fn new(battery: f32, voltage: f32, moisture: f32, lux: f32) -> Self { 19 let battery = (battery * 100.0) as u8; 20 let voltage = (voltage * 1000.0) as u16; 21 let moisture = (moisture * 100.0) as u8; 22 let lux = (lux * 100.0) as u32; 23 24 Self { 25 battery: battery.into(), 26 voltage: voltage.into(), 27 moisture: moisture.into(), 28 lux: lux.into(), 29 } 30 } 31} 32 33#[derive(Debug, Clone)] 34#[cfg_attr(feature = "defmt", derive(defmt::Format))] 35#[repr(align(8))] 36pub struct Shtc3Measurement { 37 pub temperature: Temperature10mK, 38 pub humidity: Humidity1Per, 39} 40 41impl Shtc3Measurement { 42 pub fn new(measurement: Measurement) -> Self { 43 Self { 44 temperature: measurement.temperature.as_10mk_celsius().into(), 45 humidity: measurement.humidity.as_1k_percent().into(), 46 } 47 } 48} 49 50pub static SHTC3_MEASUREMENT: Signal<ThreadModeRawMutex, Shtc3Measurement> = Signal::new(); 51pub static ADC_MEASUREMENT: Signal<ThreadModeRawMutex, AdcMeasurements> = Signal::new(); 52pub static START_MEASUREMENTS: Watch<ThreadModeRawMutex, (), 4> = Watch::new();