diff --git a/common/Cargo.toml b/common/Cargo.toml index b66405e..3b519bf 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -16,3 +16,4 @@ hex = { version = "0.4", features = ["serde"], optional = true } serde = { version = "1", optional = true } serde_repr = { version = "0.1", optional = true } bitfield = "0.13" +bitvec = { version = "1.0", default-features = false } diff --git a/common/src/measurement.rs b/common/src/measurement.rs index a433cbd..1f83a80 100644 --- a/common/src/measurement.rs +++ b/common/src/measurement.rs @@ -1,4 +1,5 @@ use bitfield::{bitfield, Bit, BitRange}; +use bitvec::prelude::*; #[derive(Copy, Clone, Default)] pub struct U12(u16); @@ -27,6 +28,7 @@ pub struct MeasurementMessage { trait MeasurementValue { const SIZE: usize; fn encode(&self, output: &mut EncodedMeasurement<[u8; MAX_MSG_LEN]>, bit_index: &mut usize); + fn decode(data: &[u8], bit_index: &mut usize) -> Self; } impl MeasurementValue for U12 { @@ -35,6 +37,12 @@ impl MeasurementValue for U12 { output.set_bit_range(*bit_index + Self::SIZE - 1, *bit_index, self.0); *bit_index += Self::SIZE; } + + fn decode(data: &[u8], bit_index: &mut usize) -> U12 { + let val: u16 = data.view_bits::()[*bit_index..*bit_index + Self::SIZE].load_le(); + *bit_index += Self::SIZE; + U12(val) + } } impl MeasurementValue for u16 { @@ -43,6 +51,12 @@ impl MeasurementValue for u16 { output.set_bit_range(*bit_index + Self::SIZE - 1, *bit_index, *self); *bit_index += Self::SIZE; } + + fn decode(data: &[u8], bit_index: &mut usize) -> u16 { + let val: u16 = data.view_bits::()[*bit_index..*bit_index + Self::SIZE].load_le(); + *bit_index += Self::SIZE; + val + } } bitfield! { @@ -99,6 +113,29 @@ impl MeasurementMessage { } encoder.finish() } + + pub fn decode(data: &[u8]) -> MeasurementMessage { + let mut measurement_message = MeasurementMessage::default(); + let data_mask = data[0]; + let mut bit_index = 8; + if data_mask.bit(0) { + let val = U12::decode(data, &mut bit_index); + measurement_message.t_water = Some(val); + } + if data_mask.bit(1) { + let val = u16::decode(data, &mut bit_index); + measurement_message.t_inside = Some(val); + } + if data_mask.bit(2) { + let val = u16::decode(data, &mut bit_index); + measurement_message.rh_inside = Some(val); + } + if data_mask.bit(2) { + let val = U12::decode(data, &mut bit_index); + measurement_message.v_supply = Some(val); + } + measurement_message + } } #[cfg(test)] diff --git a/firmware/Cargo.lock b/firmware/Cargo.lock index d86b83a..9f70331 100644 --- a/firmware/Cargo.lock +++ b/firmware/Cargo.lock @@ -69,6 +69,18 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" +[[package]] +name = "bitvec" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1489fcb93a5bb47da0462ca93ad252ad6af2145cce58d10d46a83931ba9f016b" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "byteorder" version = "1.4.3" @@ -213,11 +225,18 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a100ebf2aadd97481fce0b1265ea470460578ac5441fd9d624e8170753f51a9f" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "gfroerli-common" version = "0.1.0" dependencies = [ "bitfield", + "bitvec", ] [[package]] @@ -448,6 +467,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2a38df5b15c8d5c7e8654189744d8e396bddc18ad48041a500ce52d6948941f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "regex" version = "1.5.6" @@ -655,6 +680,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "unicode-xid" version = "0.2.2" @@ -687,3 +718,12 @@ checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" dependencies = [ "vcell", ] + +[[package]] +name = "wyz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +dependencies = [ + "tap", +]