tof_control/pa_control/
pa_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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use crate::constant::*;
use crate::helper::pa_type::{PATemp, PAError};
use crate::device::{max11615, max11617, pca9548a};

impl PATemp {
    pub fn new() -> Self {
        match Self::read_temp() {
            Ok(pa_temps) => {
                pa_temps
            }
            Err(_) => {
                Self {
                    pa_temps: [f32::MAX; 16]
                }
            }
        }
    }

    pub fn read_temp() -> Result<PATemp, PAError> {
        let mut pa_temps: [f32; 16] = Default::default();

        let pa_channels = [
            PA_TEMP_1_CHNANNEL, PA_TEMP_2_CHNANNEL, PA_TEMP_3_CHNANNEL, PA_TEMP_4_CHNANNEL,
            PA_TEMP_5_CHNANNEL, PA_TEMP_6_CHNANNEL, PA_TEMP_7_CHNANNEL, PA_TEMP_8_CHNANNEL,
            PA_TEMP_9_CHNANNEL, PA_TEMP_10_CHNANNEL, PA_TEMP_11_CHNANNEL, PA_TEMP_12_CHNANNEL,
            PA_TEMP_13_CHNANNEL, PA_TEMP_14_CHNANNEL, PA_TEMP_15_CHNANNEL, PA_TEMP_16_CHNANNEL,
        ];
        let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, PB_PCA9548A_ADDRESS);
        i2c_mux.select(PB_ADC_1_CHANNEL)?;
        let max11615 = max11615::MAX11615::new(I2C_BUS, PB_MAX11615_ADDRESS);
        max11615.setup()?;
        let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
        max11617.setup()?;

        for i in 0..=7 {
            if (0..=3).contains(&i) {
                let preamp_temp_raw = max11615.read(pa_channels[i])?;
                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
            } else {
                let preamp_temp_raw = max11617.read(pa_channels[i])?;
                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
            }
        }

        i2c_mux.select(PB_ADC_2_CHANNEL)?;
        max11615.setup()?;
        max11617.setup()?;

        for i in 8..=15 {
            if (8..=11).contains(&i) {
                let preamp_temp_raw = max11615.read(pa_channels[i])?;
                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
            } else {
                let preamp_temp_raw = max11617.read(pa_channels[i])?;
                pa_temps[i] = Self::voltage_to_temp(preamp_temp_raw);
            }
        }

        i2c_mux.reset()?;

        Ok(
            PATemp {
                pa_temps
            }
        )


    }
    pub fn read_signle_temp(ch: usize) -> Result<f32, PAError> {
        let pa_temp;

        let pa_channels = [
            PA_TEMP_1_CHNANNEL, PA_TEMP_2_CHNANNEL, PA_TEMP_3_CHNANNEL, PA_TEMP_4_CHNANNEL,
            PA_TEMP_5_CHNANNEL, PA_TEMP_6_CHNANNEL, PA_TEMP_7_CHNANNEL, PA_TEMP_8_CHNANNEL,
            PA_TEMP_9_CHNANNEL, PA_TEMP_10_CHNANNEL, PA_TEMP_11_CHNANNEL, PA_TEMP_12_CHNANNEL,
            PA_TEMP_13_CHNANNEL, PA_TEMP_14_CHNANNEL, PA_TEMP_15_CHNANNEL, PA_TEMP_16_CHNANNEL,
        ];

        let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, PB_PCA9548A_ADDRESS);
        let max11615 = max11615::MAX11615::new(I2C_BUS, PB_MAX11615_ADDRESS);
        let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
        
        match ch {
            0..=3 => {
                i2c_mux.select(PB_ADC_1_CHANNEL)?;
                max11615.setup()?;
                let pa_temp_raw = max11615.read(pa_channels[ch])?;
                pa_temp = Self::voltage_to_temp(pa_temp_raw);
            }
            4..=7 => {
                i2c_mux.select(PB_ADC_1_CHANNEL)?;
                max11617.setup()?;
                let pa_temp_raw = max11617.read(pa_channels[ch])?;
                pa_temp = Self::voltage_to_temp(pa_temp_raw);
            }
            8..=11 => {
                i2c_mux.select(PB_ADC_2_CHANNEL)?;
                max11615.setup()?;
                let pa_temp_raw = max11615.read(pa_channels[ch])?;
                pa_temp = Self::voltage_to_temp(pa_temp_raw);
            }
            12..=15 => {
                i2c_mux.select(PB_ADC_2_CHANNEL)?;
                max11617.setup()?;
                let pa_temp_raw = max11617.read(pa_channels[ch])?;
                pa_temp = Self::voltage_to_temp(pa_temp_raw);
            }
            _ => {
                pa_temp = f32::MAX;
            }
        }

        i2c_mux.reset()?;

        Ok(pa_temp)
    }
    
    fn voltage_to_temp(voltage: f32) -> f32 {
        let mut temperature = (voltage - 0.5) * 100.0;
        if -60.0 > temperature || temperature > 150.0 {
            temperature = f32::MAX;
        }

        temperature
    }
}