Skip to content

Commit

Permalink
Support reading raw IR
Browse files Browse the repository at this point in the history
  • Loading branch information
eldruin committed Mar 10, 2020
1 parent 0afc028 commit 7bf4f05
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 32 deletions.
10 changes: 10 additions & 0 deletions src/device_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,14 @@ where
let t = f32::from(t) * 0.02 - 273.15;
Ok(t)
}

/// Read the channel 1 raw IR data
pub fn raw_ir_channel1(&mut self) -> Result<u16, Error<E>> {
self.read_u16(mlx90614::Register::RAW_IR1)
}

/// Read the channel 2 raw IR data
pub fn raw_ir_channel2(&mut self) -> Result<u16, Error<E>> {
self.read_u16(mlx90614::Register::RAW_IR2)
}
}
2 changes: 2 additions & 0 deletions src/register_access.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ pub const DEV_ADDR: u8 = 0x5A;
pub mod mlx90614 {
pub struct Register {}
impl Register {
pub const RAW_IR1: u8 = 0x04;
pub const RAW_IR2: u8 = 0x05;
pub const TA: u8 = 0x06;
pub const TOBJ1: u8 = 0x07;
pub const TOBJ2: u8 = 0x08;
Expand Down
2 changes: 2 additions & 0 deletions tests/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ pub const ADDR: u8 = 0x5A;
pub mod mlx90614 {
pub struct Register {}
impl Register {
pub const RAW_IR1: u8 = 0x04;
pub const RAW_IR2: u8 = 0x05;
pub const TA: u8 = 0x06;
pub const TOBJ1: u8 = 0x07;
pub const TOBJ2: u8 = 0x08;
Expand Down
96 changes: 64 additions & 32 deletions tests/integration.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
mod common;
use crate::common::{destroy, mlx90614, new_mlx90614, ADDR};
use crate::common::{destroy, mlx90614::Register as Reg4, new_mlx90614, ADDR};
use embedded_hal_mock::i2c::Transaction as I2cTrans;
use mlx9061x::Error;

Expand All @@ -9,57 +9,89 @@ fn can_create_and_destroy() {
destroy(sensor);
}

macro_rules! read_ambient_temp_test {
($name:ident, $data0:expr, $data1:expr, $data2:expr, $expected:expr) => {
macro_rules! read_f32_test {
($name:ident, $method:ident, $reg:expr, $data0:expr, $data1:expr, $data2:expr, $expected:expr) => {
#[test]
fn $name() {
let mut sensor = new_mlx90614(&[I2cTrans::write_read(
ADDR,
vec![mlx90614::Register::TA],
vec![$reg],
vec![$data0, $data1, $data2],
)]);
let t = sensor.ambient_temperature().unwrap();
let t = sensor.$method().unwrap();
assert_near!(t, $expected, 0.1);
destroy(sensor);
}
};
}
read_ambient_temp_test!(can_read_ambient_temp1, 225, 57, 233, 23.19);
read_ambient_temp_test!(can_read_ambient_temp2, 97, 58, 86, 25.75);
read_ambient_temp_test!(can_read_ambient_temp3, 107, 58, 212, 25.95);
read_ambient_temp_test!(can_read_ambient_temp4, 38, 58, 102, 24.57);
read_f32_test!(read_ta1, ambient_temperature, Reg4::TA, 225, 57, 233, 23.19);
read_f32_test!(read_ta2, ambient_temperature, Reg4::TA, 97, 58, 86, 25.75);
read_f32_test!(read_ta3, ambient_temperature, Reg4::TA, 107, 58, 212, 25.95);
read_f32_test!(read_ta4, ambient_temperature, Reg4::TA, 38, 58, 102, 24.57);

#[test]
fn can_read_obj1_temperature() {
let mut sensor = new_mlx90614(&[I2cTrans::write_read(
ADDR,
vec![mlx90614::Register::TOBJ1],
vec![38, 58, 112],
)]);
let t = sensor.object1_temperature().unwrap();
assert_near!(t, 24.57, 0.1);
destroy(sensor);
}
read_f32_test!(
read_object1_temp,
object1_temperature,
Reg4::TOBJ1,
38,
58,
112,
24.57
);

#[test]
fn can_read_obj2_temperature() {
let mut sensor = new_mlx90614(&[I2cTrans::write_read(
ADDR,
vec![mlx90614::Register::TOBJ2],
vec![38, 58, 162],
)]);
let t = sensor.object2_temperature().unwrap();
assert_near!(t, 24.57, 0.1);
destroy(sensor);
}
read_f32_test!(
read_object2_temp,
object2_temperature,
Reg4::TOBJ2,
38,
58,
162,
24.57
);

#[test]
fn read_ambient_temperature_crc_mismatch() {
let mut sensor = new_mlx90614(&[I2cTrans::write_read(
ADDR,
vec![mlx90614::Register::TA],
vec![Reg4::TA],
vec![225, 57, 234],
)]);
assert_crc_mismatch!(sensor.ambient_temperature());
destroy(sensor);
}

macro_rules! read_u16_test {
($name:ident, $method:ident, $reg:expr, $data0:expr, $data1:expr, $data2:expr, $expected:expr) => {
#[test]
fn $name() {
let mut sensor = new_mlx90614(&[I2cTrans::write_read(
ADDR,
vec![$reg],
vec![$data0, $data1, $data2],
)]);
let v = sensor.$method().unwrap();
assert_eq!(v, $expected);
destroy(sensor);
}
};
}

read_u16_test!(
read_raw_ir1,
raw_ir_channel1,
Reg4::RAW_IR1,
0x26,
0x3A,
0x4A,
0x3A26
);

read_u16_test!(
read_raw_ir2,
raw_ir_channel2,
Reg4::RAW_IR2,
0x26,
0x3A,
0x5C,
0x3A26
);

0 comments on commit 7bf4f05

Please sign in to comment.