ups_monitor/
ups_monitor.rs

1// Copyright (c) 2025 Stuart Stock
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use 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        // Power state
34        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        // Battery
42        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        // USB-C VBUS
55        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        // Cell voltages
62        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}