Firmware for the b-parasite board, but in Rust!
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();