tof_control/pb_control/
pb_vcp.rs1use 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}