tof_control/rb_control/
rb_temp.rs

1use crate::constant::*;
2use crate::memory::read_control_reg;
3use crate::helper::rb_type::{RBTemp, RBError};
4use crate::device::{bme280, lis3mdltr, pca9548a, tmp112};
5
6impl RBTemp {
7    pub fn new() -> Self {
8        match Self::read_temp() {
9            Ok(rb_temp) => {
10                rb_temp
11            }
12            Err(_) => {
13                Self {
14                    zynq_temp: f32::MAX,
15                    drs_temp: f32::MAX,
16                    clk_temp: f32::MAX,
17                    adc_temp: f32::MAX,
18                    bme280_temp: f32::MAX,
19                    lis3mdltr_temp: f32::MAX,
20                }
21            }
22        }
23        
24    }
25    pub fn read_temp() -> Result<RBTemp, RBError> {
26        let zynq_temp_adc = read_control_reg(RB_TEMP)?;
27        let zynq_temp = (((zynq_temp_adc & 4095) as f32 * 503.975) / 4096.0) - 273.15;
28
29        let i2c_mux_1 = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_1);
30        let i2c_mux_2 = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
31
32        i2c_mux_1.select(RB_DRS_TMP112_CHANNEL)?;
33        let drs_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_DRS_TMP112_ADDRESS);
34        drs_tmp112.config()?;
35        let drs_temp = drs_tmp112.read()?;
36
37        i2c_mux_1.select(RB_LIS3MDLTR_CHANNEL)?;
38        let lis3mdltr = lis3mdltr::LIS3MDLTR::new(I2C_BUS, RB_LIS3MDLTR_ADDRESS);
39        lis3mdltr.configure()?;
40        let lis3mdltr_temp = lis3mdltr.read_temp()?;
41
42        i2c_mux_1.select(RB_BME280_CHANNEL)?;
43        let bme280 = bme280::BME280::new(I2C_BUS, RB_BME280_ADDRESS);
44        bme280.configure()?;
45        let bme280_temp = bme280.read_all()?[0];
46
47        i2c_mux_2.select(RB_CLK_TMP112_CHANNEL)?;
48        let clk_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_CLK_TMP112_ADDRESS);
49        clk_tmp112.config()?;
50        let clk_temp = clk_tmp112.read()?;
51
52        i2c_mux_2.select(RB_ADC_TMP112_CHANNEL)?;
53        let adc_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_ADC_TMP112_ADDRESS);
54        adc_tmp112.config()?;
55        let adc_temp = adc_tmp112.read()?;
56
57        i2c_mux_1.reset()?;
58        i2c_mux_2.reset()?;
59
60        Ok(
61            RBTemp {
62                zynq_temp,
63                drs_temp,
64                clk_temp,
65                adc_temp,
66                bme280_temp,
67                lis3mdltr_temp,
68            }
69        )
70    }
71    pub fn read_drs_temp() -> Result<f32, RBError> {
72        let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_1);
73        i2c_mux.select(RB_DRS_TMP112_CHANNEL)?;
74        let drs_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_DRS_TMP112_ADDRESS);
75        drs_tmp112.config()?;
76        let drs_temp = drs_tmp112.read()?;
77
78        i2c_mux.reset()?;
79
80        Ok(drs_temp)
81    }
82}
83
84pub fn config_temp() -> Result<(), RBError> {
85    let i2c_mux_1 = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_1);
86    let i2c_mux_2 = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
87
88    i2c_mux_1.select(RB_DRS_TMP112_CHANNEL)?;
89    let drs_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_DRS_TMP112_ADDRESS);
90    drs_tmp112.config()?;
91
92    i2c_mux_2.select(RB_CLK_TMP112_CHANNEL)?;
93    let clk_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_CLK_TMP112_ADDRESS);
94    clk_tmp112.config()?;
95
96    i2c_mux_2.select(RB_ADC_TMP112_CHANNEL)?;
97    let adc_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_ADC_TMP112_ADDRESS);
98    adc_tmp112.config()?;
99
100    i2c_mux_1.reset()?;
101    i2c_mux_2.reset()?;
102
103    Ok(())
104}
105
106pub fn read_drs_temp_raw() -> Result<u16, RBError> {
107    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_1);
108    i2c_mux.select(RB_DRS_TMP112_CHANNEL)?;
109    let drs_tmp112 = tmp112::TMP112::new(I2C_BUS, RB_DRS_TMP112_ADDRESS);
110    drs_tmp112.config()?;
111    let drs_temp_raw = drs_tmp112.read_raw()?;
112
113    i2c_mux.reset()?;
114
115    Ok(drs_temp_raw)
116}
117
118pub fn to_json() -> Result<String, RBError> {
119    let rb_temp = RBTemp::new();
120    let rb_temp_json = serde_json::to_string(&rb_temp)?;
121
122    Ok(rb_temp_json)
123}