tof_control/ltb_control/
ltb_temp.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use i2cdev::core::*;
use i2cdev::linux::LinuxI2CDevice;

use crate::constant::*;
use crate::helper::ltb_type::{LTBTemp, LTBError};
use crate::device::tmp112;

impl LTBTemp {
    pub fn new() -> Self {
        match Self::read_temp() {
            Ok(ltb_temp) => {
                ltb_temp
            }
            Err(_) => {
                Self {
                    trenz_temp: f32::MAX,
                    board_temp: f32::MAX,
                }
            }
        }
    }
    pub fn read_temp() -> Result<LTBTemp, LTBError> {
        let trenz_temp = Self::trenz_temp()?;
        let board_temp = Self::board_temp()?;

        Ok(
            LTBTemp {
                trenz_temp,
                board_temp,
            }
        )
    }
    pub fn board_temp() -> Result<f32, LTBError> {
        let board_tmp112 = tmp112::TMP112::new(I2C_BUS, LTB_TMP112_ADDRESS);
        board_tmp112.config()?;
        let board_temp = board_tmp112.read()?;

        Ok(board_temp)
    }
    pub fn trenz_temp() -> Result<f32, LTBError> {
        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", I2C_BUS), LTB_TRENZ_ADDRESS)?;
        let trenz_temp_raw = dev.smbus_read_i2c_block_data(LTB_TRENZ_TEMP_OFFSET as u8, 2)?;
        let trenz_temp_adc =
            (((trenz_temp_raw[0] as u16) << 4) | ((trenz_temp_raw[1] as u16) >> 4)) & 0xFFF;
        let trenz_temp = (((trenz_temp_adc & 4095) as f32 * 503.975) / 4096.0) - 273.15;

        Ok(trenz_temp)
    }
}

pub fn config_temp() -> Result<(), LTBError> {
    let ltb_tmp112 = tmp112::TMP112::new(I2C_BUS, LTB_TMP112_ADDRESS);
    ltb_tmp112.config()?;

    Ok(())
}