ups_monitor/
ups_monitor.rs1use std::io::{self, Write};
5use std::thread;
6use std::time::{Duration, SystemTime, UNIX_EPOCH};
7use waveshare_ups_hat_e::UpsHatE;
8
9const CLEAR_SCREEN: &str = "\x1b[2J";
10const CURSOR_HOME: &str = "\x1b[H";
11const BOLD: &str = "\x1b[1m";
12const RESET: &str = "\x1b[0m";
13
14fn main() -> Result<(), Box<dyn std::error::Error>> {
15 let mut ups = UpsHatE::new();
16 let mut stdout = io::stdout();
17
18 loop {
19 let battery = ups.get_battery_state()?;
20 let power = ups.get_power_state()?;
21 let vbus = ups.get_usbc_vbus()?;
22 let cells = ups.get_cell_voltage()?;
23
24 print!("{CLEAR_SCREEN}{CURSOR_HOME}");
25
26 let epoch_secs = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs();
27
28 println!("{BOLD}UPS HAT (E) Monitor{RESET}");
29 println!("═══════════════════════════════════════════");
30 println!("Unix time: {epoch_secs}");
31 println!();
32
33 println!("{BOLD}Power{RESET}");
35 println!(" State: {:?}", power.charging_state);
36 println!(" Activity: {:?}", power.charger_activity);
37 println!(" USB-C In: {:?}", power.usbc_input_state);
38 println!(" USB-C PD: {:?}", power.usbc_power_delivery);
39 println!();
40
41 println!("{BOLD}Battery{RESET}");
43 println!(" Charge: {}%", battery.remaining_percent);
44 println!(" Voltage: {} mV", battery.millivolts);
45 println!(" Current: {} mA", battery.milliamps);
46 println!(" Capacity: {} mAh", battery.remaining_capacity_milliamphours);
47 if battery.milliamps < 0 {
48 println!(" Est. Runtime: {} min", battery.remaining_runtime_minutes);
49 } else if battery.time_to_full_minutes > 0 {
50 println!(" Time Full: {} min", battery.time_to_full_minutes);
51 }
52 println!();
53
54 println!("{BOLD}USB-C VBUS{RESET}");
56 println!(" Voltage: {} mV", vbus.millivolts);
57 println!(" Current: {} mA", vbus.milliamps);
58 println!(" Power: {} mW", vbus.milliwatts);
59 println!();
60
61 println!("{BOLD}Cell Voltages{RESET}");
63 println!(" Cell 1: {} mV", cells.cell_1_millivolts);
64 println!(" Cell 2: {} mV", cells.cell_2_millivolts);
65 println!(" Cell 3: {} mV", cells.cell_3_millivolts);
66 println!(" Cell 4: {} mV", cells.cell_4_millivolts);
67 println!();
68
69 println!("Press Ctrl+C to exit");
70
71 stdout.flush()?;
72 thread::sleep(Duration::from_secs(2));
73 }
74}