Skip to content

Commit

Permalink
Implement measurement decode
Browse files Browse the repository at this point in the history
  • Loading branch information
rnestler authored and dbrgn committed Dec 21, 2022
1 parent 7abcd2a commit cc9ebf9
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 0 deletions.
1 change: 1 addition & 0 deletions common/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
37 changes: 37 additions & 0 deletions common/src/measurement.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use bitfield::{bitfield, Bit, BitRange};
use bitvec::prelude::*;

#[derive(Copy, Clone, Default)]
pub struct U12(u16);
Expand Down Expand Up @@ -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 {
Expand All @@ -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::<Msb0>()[*bit_index..*bit_index + Self::SIZE].load_le();
*bit_index += Self::SIZE;
U12(val)
}
}

impl MeasurementValue for u16 {
Expand All @@ -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::<Msb0>()[*bit_index..*bit_index + Self::SIZE].load_le();
*bit_index += Self::SIZE;
val
}
}

bitfield! {
Expand Down Expand Up @@ -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)]
Expand Down
40 changes: 40 additions & 0 deletions firmware/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit cc9ebf9

Please sign in to comment.