tof_control/ltb_control/
ltb_temp.rs

1use i2cdev::core::*;
2use i2cdev::linux::LinuxI2CDevice;
3
4use crate::constant::*;
5use crate::helper::ltb_type::{LTBTemp, LTBError};
6use crate::device::tmp112;
7
8impl LTBTemp {
9    pub fn new() -> Self {
10        match Self::read_temp() {
11            Ok(ltb_temp) => {
12                ltb_temp
13            }
14            Err(_) => {
15                Self {
16                    trenz_temp: f32::MAX,
17                    board_temp: f32::MAX,
18                }
19            }
20        }
21    }
22    pub fn read_temp() -> Result<LTBTemp, LTBError> {
23        let trenz_temp = Self::trenz_temp()?;
24        let board_temp = Self::board_temp()?;
25
26        Ok(
27            LTBTemp {
28                trenz_temp,
29                board_temp,
30            }
31        )
32    }
33    pub fn board_temp() -> Result<f32, LTBError> {
34        let board_tmp112 = tmp112::TMP112::new(I2C_BUS, LTB_TMP112_ADDRESS);
35        board_tmp112.config()?;
36        let board_temp = board_tmp112.read()?;
37
38        Ok(board_temp)
39    }
40    pub fn trenz_temp() -> Result<f32, LTBError> {
41        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", I2C_BUS), LTB_TRENZ_ADDRESS)?;
42        let trenz_temp_raw = dev.smbus_read_i2c_block_data(LTB_TRENZ_TEMP_OFFSET as u8, 2)?;
43        let trenz_temp_adc =
44            (((trenz_temp_raw[0] as u16) << 4) | ((trenz_temp_raw[1] as u16) >> 4)) & 0xFFF;
45        let trenz_temp = (((trenz_temp_adc & 4095) as f32 * 503.975) / 4096.0) - 273.15;
46
47        Ok(trenz_temp)
48    }
49}
50
51pub fn config_temp() -> Result<(), LTBError> {
52    let ltb_tmp112 = tmp112::TMP112::new(I2C_BUS, LTB_TMP112_ADDRESS);
53    ltb_tmp112.config()?;
54
55    Ok(())
56}