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 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 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 pub fn read_rb_pos() -> Result<u8, RBError> {
227 let rb_pos = Self::read_sub_board()?;
228
229 Ok(rb_pos)
230 }
231}