tof_control/pa_control/
pa_temp.rs

1use crate::constant::*;
2use crate::helper::pa_type::{PATemp, PAError};
3use crate::device::{max11615, max11617, pca9548a};
4
5impl PATemp {
6    pub fn new() -> Self {
7        match Self::read_temp() {
8            Ok(pa_temps) => {
9                pa_temps
10            }
11            Err(_) => {
12                Self {
13                    pa_temps: [f32::MAX; 16]
14                }
15            }
16        }
17    }
18
19    pub fn read_temp() -> Result<PATemp, PAError> {
20        let mut pa_temps: [f32; 16] = Default::default();
21
22        let pa_channels = [
23            PA_TEMP_1_CHNANNEL, PA_TEMP_2_CHNANNEL, PA_TEMP_3_CHNANNEL, PA_TEMP_4_CHNANNEL,
24            PA_TEMP_5_CHNANNEL, PA_TEMP_6_CHNANNEL, PA_TEMP_7_CHNANNEL, PA_TEMP_8_CHNANNEL,
25            PA_TEMP_9_CHNANNEL, PA_TEMP_10_CHNANNEL, PA_TEMP_11_CHNANNEL, PA_TEMP_12_CHNANNEL,
26            PA_TEMP_13_CHNANNEL, PA_TEMP_14_CHNANNEL, PA_TEMP_15_CHNANNEL, PA_TEMP_16_CHNANNEL,
27        ];
28        let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, PB_PCA9548A_ADDRESS);
29        i2c_mux.select(PB_ADC_1_CHANNEL)?;
30        let max11615 = max11615::MAX11615::new(I2C_BUS, PB_MAX11615_ADDRESS);
31        max11615.setup()?;
32        let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
33        max11617.setup()?;
34
35        for i in 0..=7 {
36            if (0..=3).contains(&i) {
37                let preamp_temp_raw = max11615.read(pa_channels[i])?;
38                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
39            } else {
40                let preamp_temp_raw = max11617.read(pa_channels[i])?;
41                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
42            }
43        }
44
45        i2c_mux.select(PB_ADC_2_CHANNEL)?;
46        max11615.setup()?;
47        max11617.setup()?;
48
49        for i in 8..=15 {
50            if (8..=11).contains(&i) {
51                let preamp_temp_raw = max11615.read(pa_channels[i])?;
52                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
53            } else {
54                let preamp_temp_raw = max11617.read(pa_channels[i])?;
55                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
56            }
57        }
58
59        i2c_mux.reset()?;
60
61        Ok(
62            PATemp {
63                pa_temps
64            }
65        )
66
67
68    }
69    pub fn read_signle_temp(ch: usize) -> Result<f32, PAError> {
70        let pa_temp;
71
72        let pa_channels = [
73            PA_TEMP_1_CHNANNEL, PA_TEMP_2_CHNANNEL, PA_TEMP_3_CHNANNEL, PA_TEMP_4_CHNANNEL,
74            PA_TEMP_5_CHNANNEL, PA_TEMP_6_CHNANNEL, PA_TEMP_7_CHNANNEL, PA_TEMP_8_CHNANNEL,
75            PA_TEMP_9_CHNANNEL, PA_TEMP_10_CHNANNEL, PA_TEMP_11_CHNANNEL, PA_TEMP_12_CHNANNEL,
76            PA_TEMP_13_CHNANNEL, PA_TEMP_14_CHNANNEL, PA_TEMP_15_CHNANNEL, PA_TEMP_16_CHNANNEL,
77        ];
78
79        let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, PB_PCA9548A_ADDRESS);
80        let max11615 = max11615::MAX11615::new(I2C_BUS, PB_MAX11615_ADDRESS);
81        let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
82        
83        match ch {
84            0..=3 => {
85                i2c_mux.select(PB_ADC_1_CHANNEL)?;
86                max11615.setup()?;
87                let pa_temp_raw = max11615.read(pa_channels[ch])?;
88                pa_temp = Self::voltage_to_temp(pa_temp_raw);
89            }
90            4..=7 => {
91                i2c_mux.select(PB_ADC_1_CHANNEL)?;
92                max11617.setup()?;
93                let pa_temp_raw = max11617.read(pa_channels[ch])?;
94                pa_temp = Self::voltage_to_temp(pa_temp_raw);
95            }
96            8..=11 => {
97                i2c_mux.select(PB_ADC_2_CHANNEL)?;
98                max11615.setup()?;
99                let pa_temp_raw = max11615.read(pa_channels[ch])?;
100                pa_temp = Self::voltage_to_temp(pa_temp_raw);
101            }
102            12..=15 => {
103                i2c_mux.select(PB_ADC_2_CHANNEL)?;
104                max11617.setup()?;
105                let pa_temp_raw = max11617.read(pa_channels[ch])?;
106                pa_temp = Self::voltage_to_temp(pa_temp_raw);
107            }
108            _ => {
109                pa_temp = f32::MAX;
110            }
111        }
112
113        i2c_mux.reset()?;
114
115        Ok(pa_temp)
116    }
117    
118    fn voltage_to_temp(voltage: f32) -> f32 {
119        let mut temperature = (voltage - 0.5) * 100.0;
120        if -60.0 > temperature || temperature > 150.0 {
121            temperature = f32::MAX;
122        }
123
124        temperature
125    }
126}