tof_control/pb_control/
pb_vcp.rs

1use crate::constant::*;
2use crate::helper::pb_type::{PBVcp, PBError};
3use crate::device::{ina219, ina226, max11617, pca9548a};
4
5impl PBVcp {
6    pub fn new() -> Self {
7        match Self::read_vcp() {
8            Ok(pb_vcp) => {
9                pb_vcp
10            }
11            Err(_) => {
12                Self {
13                    p3v6_pa_vcp: [f32::MAX; 3],
14                    n1v6_pa_vcp: [f32::MAX; 3],
15                    p3v4f_ltb_vcp: [f32::MAX; 3],
16                    p3v4d_ltb_vcp: [f32::MAX; 3],
17                    p3v6_ltb_vcp: [f32::MAX; 3],
18                    n1v6_ltb_vcp: [f32::MAX; 3],
19                }
20            }
21        }
22    }
23    pub fn read_vcp() -> Result<PBVcp, PBError> {
24        let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, PB_PCA9548A_ADDRESS);
25    
26        i2c_mux.select(PB_P3V6_PA_INA226_CHANNEL)?;
27        let p3v6_pa_ina226 = ina226::INA226::new(
28            I2C_BUS,
29            PB_P3V6_PA_INA226_ADDRESS,
30            PB_P3V6_PA_INA226_RSHUNT,
31            PB_P3V6_PA_INA226_MEC,
32        );
33        p3v6_pa_ina226.configure()?;
34        let p3v6_pa_vcp = p3v6_pa_ina226.read()?;
35
36        i2c_mux.select(PB_ADC_1_CHANNEL)?;
37        let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
38        max11617.setup()?;
39        let n1v6_pa_voltage = max11617.read(PB_N1V6_PA_VOLTAGE_INA201_CHANNEL)? * -1.0;
40        let n1v6_pa_current = max11617.read(PB_N1V6_PA_CURRENT_INA201_CHANNEL)? / 50.0 / 0.1;
41        let n1v6_pa_power = n1v6_pa_voltage.abs() * n1v6_pa_current;
42        let n1v6_pa_vcp = [n1v6_pa_voltage, n1v6_pa_current, n1v6_pa_power];
43
44        i2c_mux.select(PB_LTB_INA219_CHANNEL)?;
45        let p3v4f_ltb_ina219 = ina219::INA219::new(
46            I2C_BUS,
47            PB_P3V4F_LTB_INA219_ADDRESS,
48            PB_P3V4F_LTB_INA219_RSHUNT,
49            PB_P3V4F_LTB_INA219_MEC,
50        );
51        p3v4f_ltb_ina219.configure()?;
52        let p3v4f_ltb_vcp = p3v4f_ltb_ina219.read()?;
53
54        let p3v4d_ltb_ina219 = ina219::INA219::new(
55            I2C_BUS,
56            PB_P3V4D_LTB_INA219_ADDRESS,
57            PB_P3V4D_LTB_INA219_RSHUNT,
58            PB_P3V4D_LTB_INA219_MEC,
59        );
60        p3v4d_ltb_ina219.configure()?;
61        let p3v4d_ltb_vcp = p3v4d_ltb_ina219.read()?;
62
63        let p3v6_ltb_ina219 = ina219::INA219::new(
64            I2C_BUS,
65            PB_P3V6_LTB_INA219_ADDRESS,
66            PB_P3V6_LTB_INA219_RSHUNT,
67            PB_P3V6_LTB_INA219_MEC,
68        );
69        p3v6_ltb_ina219.configure()?;
70        let p3v6_ltb_vcp = p3v6_ltb_ina219.read()?;
71
72        i2c_mux.select(PB_ADC_2_CHANNEL)?;
73        let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
74        max11617.setup()?;
75        let n1v6_ltb_voltage = max11617.read(PB_N1V6_LTB_VOLTAGE_INA202_CHANNEL)? * -1.0;
76        let n1v6_ltb_current = max11617.read(PB_N1V6_LTB_CURRENT_INA202_CHANNEL)? / 100.0 / 0.1;
77        let n1v6_ltb_power = n1v6_ltb_voltage.abs() * n1v6_ltb_current;
78        let n1v6_ltb_vcp = [n1v6_ltb_voltage, n1v6_ltb_current, n1v6_ltb_power];
79
80        i2c_mux.reset()?;
81
82        Ok(
83            PBVcp {
84                p3v6_pa_vcp,
85                n1v6_pa_vcp,
86                p3v4f_ltb_vcp,
87                p3v4d_ltb_vcp,
88                p3v6_ltb_vcp,
89                n1v6_ltb_vcp,
90            }
91        )
92    }
93}
94
95pub fn config_vcp() -> Result<(), PBError> {
96    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, PB_PCA9548A_ADDRESS);
97    
98    i2c_mux.select(PB_P3V6_PA_INA226_CHANNEL)?;
99    let p3v6_pa_ina226 = ina226::INA226::new(
100        I2C_BUS,
101        PB_P3V6_PA_INA226_ADDRESS,
102        PB_P3V6_PA_INA226_RSHUNT,
103        PB_P3V6_PA_INA226_MEC,
104    );
105    for _ in 0..3 {
106        p3v6_pa_ina226.configure()?;
107        p3v6_pa_ina226.read()?;
108    }
109
110    i2c_mux.select(PB_ADC_1_CHANNEL)?;
111    let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
112    max11617.setup()?;
113
114    i2c_mux.select(PB_LTB_INA219_CHANNEL)?;
115    let p3v4f_ltb_ina219 = ina219::INA219::new(
116        I2C_BUS,
117        PB_P3V4F_LTB_INA219_ADDRESS,
118        PB_P3V4F_LTB_INA219_RSHUNT,
119        PB_P3V4F_LTB_INA219_MEC,
120    );
121    for _ in 0..3 {
122        p3v4f_ltb_ina219.configure()?;
123        p3v4f_ltb_ina219.read()?;
124    }
125
126    let p3v4d_ltb_ina219 = ina219::INA219::new(
127        I2C_BUS,
128        PB_P3V4D_LTB_INA219_ADDRESS,
129        PB_P3V4D_LTB_INA219_RSHUNT,
130        PB_P3V4D_LTB_INA219_MEC,
131    );
132    for _ in 0..3 {
133        p3v4d_ltb_ina219.configure()?;
134        p3v4d_ltb_ina219.read()?;
135    }
136
137    let p3v6_ltb_ina219 = ina219::INA219::new(
138        I2C_BUS,
139        PB_P3V6_LTB_INA219_ADDRESS,
140        PB_P3V6_LTB_INA219_RSHUNT,
141        PB_P3V6_LTB_INA219_MEC,
142    );
143    for _ in 0..3 {
144        p3v6_ltb_ina219.configure()?;
145        p3v6_ltb_ina219.read()?;
146    }
147
148    i2c_mux.select(PB_ADC_2_CHANNEL)?;
149    let max11617 = max11617::MAX11617::new(I2C_BUS, PB_MAX11617_ADDRESS);
150    max11617.setup()?;
151
152    i2c_mux.reset()?;
153
154    Ok(())
155}