tof_control/pa_control/
pa_temp.rs1use 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}