tof_control/rb_control/
rb_info.rs

1use sysinfo::{DiskExt, System, SystemExt};
2use i2cdev::core::*;
3use i2cdev::linux::LinuxI2CDevice;
4
5use crate::constant::*;
6use crate::memory::read_control_reg;
7
8use crate::helper::rb_type::{RBInfo, RBError};
9use crate::rb_control::rb_mode;
10
11impl RBInfo {
12    pub fn new() -> Self {
13
14        match Self::read_all_info() {
15            Ok(rb_info) => {
16                rb_info
17            }
18            Err(_) => {
19                Self {
20                    board_id: u8::MAX,
21                    sub_board: u8::MAX,
22                    lol: u8::MAX,
23                    lol_stable: u8::MAX,
24                    trig_rate: u16::MAX,
25                    fw_version: "0.0.0".to_string(),
26                    fw_hash: "XXXXX".to_string(),
27                    uptime: u32::MAX,
28                    sd_usage: u8::MAX,
29                    input_mode: "Input Mode Error".to_string(),
30                    rat_num: u8::MAX,
31                    rat_pos: u8::MAX,
32                    rb_pos: u8::MAX,
33                }
34            }
35        }
36        
37    }
38    pub fn read_all_info() -> Result<RBInfo, RBError> {
39        let board_id = Self::read_board_id()?;
40        let sub_board = Self::read_sub_board()?;
41        let lol = Self::read_lol()?;
42        let lol_stable = Self::read_lol_stable()?;
43        let trig_rate = Self::read_trig_rate()?;
44        // Additional Info
45        let fw_version = Self::read_fw_version()?;
46        let fw_hash = Self::read_fw_hash()?;
47        let uptime = Self::read_uptime();
48        let sd_usage = Self::read_sd_usage();
49        let input_mode = Self::read_input_mode()?;
50        let rat_num = Self::read_rat_num()?;
51        let rat_pos = Self::read_rat_pos()?;
52        let rb_pos = Self::read_rb_pos()?;
53
54        Ok(
55            RBInfo {
56                board_id,
57                sub_board,
58                lol,
59                lol_stable,
60                trig_rate,
61                fw_version,
62                fw_hash,
63                uptime,
64                sd_usage,
65                input_mode,
66                rat_num,
67                rat_pos,
68                rb_pos,
69            }
70        )
71    }
72    pub fn read_board_id() -> Result<u8, RBError> {
73        let mut board_id = read_control_reg(BOARD_ID)? as u8;
74        if board_id > 50 {
75            board_id = u8::MAX;
76        }
77        
78        Ok(board_id)
79    }
80    pub fn read_sub_board() -> Result<u8, RBError> {
81        let sub_board: u8;
82
83        let mut ltb_i2c = LinuxI2CDevice::new(&format!("/dev/i2c-{}", I2C_BUS), LTB_TRENZ_ADDRESS)?;
84        let mut pb_i2c = LinuxI2CDevice::new(&format!("/dev/i2c-{}", I2C_BUS), PB_PCA9548A_ADDRESS)?;
85
86        if ltb_i2c.smbus_read_byte().is_ok() {
87            sub_board = 1;
88        } else if pb_i2c.smbus_read_byte().is_ok() {
89            sub_board = 2;
90        } else {
91            sub_board = 0;
92        }
93
94        Ok(sub_board)
95    }
96    pub fn read_lol() -> Result<u8, RBError> {
97        let mut lol = read_control_reg(LOSS_OF_LOCK)? as u8;
98        lol = lol & 0x01;
99
100        Ok(lol)
101    }
102    pub fn read_lol_stable() -> Result<u8, RBError> {
103        let mut lol_stable = read_control_reg(LOSS_OF_LOCK_STABLE)? as u8;
104        lol_stable = (lol_stable >> 1) & 0x01;
105
106        Ok(lol_stable)
107    }
108    pub fn read_trig_rate() -> Result<u16, RBError> {
109        let trig_rate = read_control_reg(MT_TRIGGER_RATE)? as u16;
110
111        Ok(trig_rate)
112    }
113    pub fn read_fw_version() -> Result<String, RBError> {
114        let fw_version_raw = read_control_reg(GLOBAL_VER)?;
115
116        let mut fw_version = format!("{:08X}", fw_version_raw);
117        let major_ver = i64::from_str_radix(&fw_version[..2], 16)?;
118        let minor_ver = i64::from_str_radix(&fw_version[2..4], 16)?;
119        let patch = i64::from_str_radix(&fw_version[4..], 16)?;
120        fw_version = format!("{}.{}.{}", major_ver, minor_ver, patch);
121
122        Ok(fw_version)
123    }
124    pub fn read_fw_hash() -> Result<String, RBError> {
125        let fw_hash = format!("{:02X}",read_control_reg(GLOBAL_SHA)?);
126
127        Ok(fw_hash)
128    }
129    pub fn read_uptime() -> u32 {
130        let sys = System::new_all();
131        let uptime = sys.uptime();
132
133        return uptime as u32
134    }
135    pub fn read_sd_usage() -> u8 {
136        let sys = System::new_all();
137
138        let mut available_space = Default::default();
139        let mut total_space = Default::default();
140        for disk in sys.disks() {
141            available_space = disk.available_space();
142            total_space = disk.total_space();
143        }
144
145        let sd_usage: f32 = (1.0 - (available_space as f32 / total_space as f32)) * 100.0;
146
147        return sd_usage as u8
148    }
149    pub fn read_input_mode() -> Result<String, RBError> {
150        let input_mode = rb_mode::read_input_mode()?;
151
152        Ok(input_mode)
153    }
154    pub fn read_rat_num() -> Result<u8, RBError> {
155        let board_id = Self::read_board_id()?;
156        let rat_num: u8;
157        match board_id {
158            15 | 3 => rat_num = 1,
159            14 | 32 => rat_num = 2,
160            29 | 31 => rat_num = 3,
161            13 | 35 => rat_num = 4,
162            21 | 23 => rat_num = 5,
163            24 | 27 => rat_num = 6,
164            19 | 20 => rat_num = 7,
165            25 | 16 => rat_num = 8,
166            30 | 8 => rat_num = 9,
167            11 | 1 => rat_num = 10,
168            22 | 26 => rat_num = 11,
169            40 | 39 => rat_num = 12,
170            18 | 9 => rat_num = 13,
171            42 | 41 => rat_num = 14,
172            4 | 2 => rat_num = 15,
173            44 | 46 => rat_num = 16,
174            17 | 7 => rat_num = 17,
175            34 | 33 => rat_num = 18,
176            6 | 36 => rat_num = 19,
177            5 | 28 => rat_num = 20,
178            48 | 47 => rat_num = 21,
179            49 | 37 => rat_num = 22,
180            _ => rat_num = 0,
181        }
182
183        Ok(rat_num)
184    }
185    pub fn read_rat_pos() -> Result<u8, RBError> {
186        let rat_num = Self::read_rat_num()?;
187        /*
188        rat_pos = 0 => Not Flight RAT
189        rat_pos = 1 => CBE RAT
190        rat_pos = 2 => UMB RAT
191        rat_pos = 3 => COR RAT
192        rat_pos = 4 => CBE/COR RAT
193        */
194        let rat_pos: u8;
195        match rat_num {
196            1 => rat_pos = 2,
197            2 => rat_pos = 2,
198            3 => rat_pos = 2,
199            4 => rat_pos = 2,
200            5 => rat_pos = 2,
201            6 => rat_pos = 2,
202            7 => rat_pos = 4,
203            8 => rat_pos = 1,
204            9 => rat_pos = 4,
205            10 => rat_pos = 4,
206            11 => rat_pos = 4,
207            12 => rat_pos = 1,
208            13 => rat_pos = 4,
209            14 => rat_pos = 4,
210            15 => rat_pos = 4,
211            16 => rat_pos = 1,
212            17 => rat_pos = 4,
213            18 => rat_pos = 3,
214            19 => rat_pos = 1,
215            20 => rat_pos = 3,
216            _ => rat_pos = 0,
217        }
218
219        Ok(rat_pos)
220    }
221    /*
222    rb_pos = 0 => Not in RAT
223    rb_pos = 1 => RB1
224    rb_pos = 2 => RB2
225    */
226    pub fn read_rb_pos() -> Result<u8, RBError> {
227        let rb_pos = Self::read_sub_board()?;
228
229        Ok(rb_pos)
230    }
231}