From ef6336ab74b3dd1881cd780f64bf701f97d06dbf Mon Sep 17 00:00:00 2001 From: Tw93 Date: Wed, 14 Jan 2026 11:55:24 +0800 Subject: [PATCH] fix: precision issue in battery metrics and adaptive purge UI - cmd/status: use ParseUint to handle negative battery power values correctly - bin/purge: make path truncation adaptive to terminal width --- bin/purge.sh | 9 ++++++++- cmd/status/metrics_battery.go | 14 ++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/bin/purge.sh b/bin/purge.sh index 9d73424..4f7b104 100755 --- a/bin/purge.sh +++ b/bin/purge.sh @@ -98,7 +98,14 @@ perform_purge() { # Function to truncate path in the middle truncate_path() { local path="$1" - local max_len=80 + local term_cols + term_cols=$(tput cols 2>/dev/null || echo 80) + # Reserve some space for the spinner and text (approx 20 chars) + local max_len=$((term_cols - 20)) + # Ensure a reasonable minimum width + if (( max_len < 40 )); then + max_len=40 + fi if [[ ${#path} -le $max_len ]]; then echo "$path" diff --git a/cmd/status/metrics_battery.go b/cmd/status/metrics_battery.go index 3f14b23..74b3b95 100644 --- a/cmd/status/metrics_battery.go +++ b/cmd/status/metrics_battery.go @@ -241,12 +241,14 @@ func collectThermal() ThermalStatus { valStr, _, _ = strings.Cut(valStr, ",") valStr, _, _ = strings.Cut(valStr, "}") valStr = strings.TrimSpace(valStr) - if powerMW, err := strconv.ParseFloat(valStr, 64); err == nil { - // macOS ioreg may return negative values as uint64 (two's complement overflow) - // If value > 2^63, convert from uint64 representation to proper signed value - if powerMW > float64(1<<63) { - powerMW = powerMW - 18446744073709551616.0 // 2^64 - } + + // Use ParseUint to handle potential 64-bit two's complement negative values correctly. + // ioreg might return a large generic integer for negative values. + if valUint, err := strconv.ParseUint(valStr, 10, 64); err == nil { + // Cast to int64 to interpret 2's complement correctly (e.g. MaxUint64 -> -1) + valInt := int64(valUint) + powerMW := float64(valInt) + // Validate reasonable battery power range: -200W to 200W if powerMW > -200000 && powerMW < 200000 { thermal.BatteryPower = powerMW / 1000.0