From e33082f0cab3b2ea171c4cb06848c459843f6897 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 30 Dec 2020 14:43:18 +0100 Subject: [PATCH] fix: battery health on Apple Silicon (#246) --- Modules/Battery/main.swift | 2 +- Modules/Battery/popup.swift | 5 ++++- Modules/Battery/readers.swift | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Modules/Battery/main.swift b/Modules/Battery/main.swift index b249eab5..a14f08a9 100644 --- a/Modules/Battery/main.swift +++ b/Modules/Battery/main.swift @@ -16,7 +16,7 @@ import IOKit.ps struct Battery_Usage: value_t { var powerSource: String = "" - var state: String = "" + var state: String? = nil var isCharged: Bool = false var isCharging: Bool = false var level: Double = 0 diff --git a/Modules/Battery/popup.swift b/Modules/Battery/popup.swift index 2b2428b5..d025d3cd 100644 --- a/Modules/Battery/popup.swift +++ b/Modules/Battery/popup.swift @@ -246,7 +246,10 @@ internal class Popup: NSView, Popup_p { self.timeField?.stringValue = LocalizedString("Fully charged") } - self.healthField?.stringValue = "\(value.health) % (\(value.state))" + self.healthField?.stringValue = "\(value.health)%" + if let state = value.state { + self.healthField?.stringValue += " (\(state))" + } self.cyclesField?.stringValue = "\(value.cycles)" self.amperageField?.stringValue = "\(abs(value.amperage)) mA" diff --git a/Modules/Battery/readers.swift b/Modules/Battery/readers.swift index 3da43fcc..7b03f3e0 100644 --- a/Modules/Battery/readers.swift +++ b/Modules/Battery/readers.swift @@ -63,7 +63,7 @@ internal class UsageReader: Reader { for ps in psList { if let list = IOPSGetPowerSourceDescription(psInfo, ps).takeUnretainedValue() as? Dictionary { self.usage.powerSource = list[kIOPSPowerSourceStateKey] as? String ?? "AC Power" - self.usage.state = list[kIOPSBatteryHealthKey] as? String ?? "0" + self.usage.state = list[kIOPSBatteryHealthKey] as? String self.usage.isCharged = list[kIOPSIsChargedKey] as? Bool ?? false self.usage.isCharging = self.getBoolValue("IsCharging" as CFString) ?? false self.usage.level = Double(list[kIOPSCurrentCapacityKey] as? Int ?? 0) / 100 @@ -79,7 +79,11 @@ internal class UsageReader: Reader { let maxCapacity = self.getIntValue("MaxCapacity" as CFString) ?? 1 let designCapacity = self.getIntValue("DesignCapacity" as CFString) ?? 1 + #if arch(x86_64) self.usage.health = (100 * maxCapacity) / designCapacity + #else + self.usage.health = maxCapacity + #endif self.usage.amperage = self.getIntValue("Amperage" as CFString) ?? 0 self.usage.voltage = self.getVoltage() ?? 0