Skip to content

Commit

Permalink
Add max energy
Browse files Browse the repository at this point in the history
  • Loading branch information
decodism committed Sep 1, 2023
1 parent 19b053b commit 83c10ce
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 3 deletions.
27 changes: 27 additions & 0 deletions BatFiKit/Sources/AppShared/Formatters.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Foundation
import L10n

public let timeFormatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
Expand All @@ -31,3 +32,29 @@ public let percentageFormatter: NumberFormatter = {
formatter.maximumFractionDigits = 0
return formatter
}()

public let energyFormatter: MeasurementFormatter = {
let formatter = CustomMeasurementFormatter()
formatter.unitOptions = .providedUnit
formatter.unitStyle = .short
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.minimumFractionDigits = 3
numberFormatter.maximumFractionDigits = 3
formatter.numberFormatter = numberFormatter
return formatter
}()

private class CustomMeasurementFormatter: MeasurementFormatter {
override func string(from measurement: Measurement<Unit>) -> String {
var string = super.string(from: measurement)
if unitStyle == .short {
string.removeAll { $0.isWhitespace }
}
return string
}
}

public extension UnitEnergy {
static let wattHours = UnitEnergy(symbol: L10n.UnitEnergy.WattHours.symbol, converter: UnitConverterLinear(coefficient: 3600))
}
7 changes: 5 additions & 2 deletions BatFiKit/Sources/AppShared/PowerState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public struct PowerState: CustomStringConvertible, Equatable {
public let batteryTemperature: Double
public let chargerConnected: Bool
public let optimizedBatteryChargingEngaged: Bool
public let batteryMaxEnergy: Double

public init(
batteryLevel: Int,
Expand All @@ -30,7 +31,8 @@ public struct PowerState: CustomStringConvertible, Equatable {
batteryCapacity: Double,
batteryTemperature: Double,
chargerConnected: Bool,
optimizedBatteryChargingEngaged: Bool
optimizedBatteryChargingEngaged: Bool,
batteryMaxEnergy: Double
) {
self.batteryLevel = batteryLevel
self.isCharging = isCharging
Expand All @@ -42,11 +44,12 @@ public struct PowerState: CustomStringConvertible, Equatable {
self.batteryTemperature = batteryTemperature
self.chargerConnected = chargerConnected
self.optimizedBatteryChargingEngaged = optimizedBatteryChargingEngaged
self.batteryMaxEnergy = batteryMaxEnergy
}

public var description: String {
"""
PowerState |==> is charging: \(isCharging), battery level: \(batteryLevel), power source: \(powerSource), time left: \(timeLeft), time to charge: \(timeToCharge), cycle count: \(batteryCycleCount), battery capacity: \(batteryCapacity), battery temperature: \(batteryTemperature)°C, charger connected: \(chargerConnected), optimized battery charging engaged: \(optimizedBatteryChargingEngaged)
PowerState |==> is charging: \(isCharging), battery level: \(batteryLevel), power source: \(powerSource), time left: \(timeLeft), time to charge: \(timeToCharge), cycle count: \(batteryCycleCount), battery capacity: \(batteryCapacity), battery temperature: \(batteryTemperature)°C, charger connected: \(chargerConnected), optimized battery charging engaged: \(optimizedBatteryChargingEngaged), battery max energy: \(batteryMaxEnergy)Wh
"""
}
}
4 changes: 4 additions & 0 deletions BatFiKit/Sources/BatteryInfo/BatteryInfoView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ public struct BatteryInfoView: View {
label: l10n.Additional.batteryCapacity,
info: percentageFormatter.string(from: NSNumber(floatLiteral: powerState.batteryCapacity))!
)
BatteryAdditionalInfo(
label: l10n.Additional.fullChargeEnergy,
info: energyFormatter.string(from: Measurement(value: powerState.batteryMaxEnergy, unit: UnitEnergy.wattHours))
)
}
.frame(maxWidth: .infinity)
}
Expand Down
14 changes: 13 additions & 1 deletion BatFiKit/Sources/ClientsLive/PowerSourceClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,17 @@ private func getPowerSourceInfo() throws -> PowerState {
throw PowerSourceError.infoMissing
}
let batteryHealth = Double(maxCapacity) / Double(designCapacity)

guard
let batteryData: [String: Any] = getValue("BatteryData", from: service),
let lifetimeData = batteryData["LifetimeData"] as? [String: Any],
let minimumPackVoltage = lifetimeData["MinimumPackVoltage"] as? Int,
let maximumPackVoltage = lifetimeData["MaximumPackVoltage"] as? Int
else {
throw PowerSourceError.infoMissing
}
let midVoltage = ((Double(minimumPackVoltage) / 1000) + (Double(maximumPackVoltage) / 1000)) / 2
let maxEnergy = (Double(maxCapacity) / 1000) * midVoltage

let powerState = PowerState(
batteryLevel: batteryLevel,
Expand All @@ -167,7 +178,8 @@ private func getPowerSourceInfo() throws -> PowerState {
batteryCapacity: batteryHealth,
batteryTemperature: batteryTemperature,
chargerConnected: chargerConnected,
optimizedBatteryChargingEngaged: optimizedBatteryCharging
optimizedBatteryChargingEngaged: optimizedBatteryCharging,
batteryMaxEnergy: maxEnergy
)
return powerState
}
8 changes: 8 additions & 0 deletions BatFiKit/Sources/L10n/Strings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ public enum L10n {
public static let batteryCapacity = L10n.tr("Localizable", "battery_info.label.additional.battery_capacity", fallback: "Battery Health")
/// Cycle Count
public static let cycleCount = L10n.tr("Localizable", "battery_info.label.additional.cycle_count", fallback: "Cycle Count")
/// Full Charge Energy
public static let fullChargeEnergy = L10n.tr("Localizable", "battery_info.label.additional.full_charge_energy", fallback: "Full Charge Energy")
/// Power Source
public static let powerSource = L10n.tr("Localizable", "battery_info.label.additional.power_source", fallback: "Power Source")
/// Temperature
Expand Down Expand Up @@ -310,6 +312,12 @@ public enum L10n {
}
}
}
public enum UnitEnergy {
public enum WattHours {
/// Wh
public static let symbol = L10n.tr("Localizable", "unit_energy.watt_hours.symbol", fallback: "Wh")
}
}
}
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
Expand Down
2 changes: 2 additions & 0 deletions BatFiKit/Sources/L10n/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"battery_info.label.additional.cycle_count" = "Cycle Count";
"battery_info.label.additional.power_source" = "Power Source";
"battery_info.label.additional.temperature" = "Temperature";
"battery_info.label.additional.full_charge_energy" = "Full Charge Energy";
"battery_info.label.info_missing" = "Info is missing";
"battery_info.label.main.battery" = "Battery";
"battery_info.label.main.time.calculating" = "Calculating…";
Expand Down Expand Up @@ -95,4 +96,5 @@
"settings.tab.title.charging" = "Charging";
"settings.tab.title.general" = "General";
"settings.tab.title.notifications" = "Notifications";
"unit_energy.watt_hours.symbol" = "Wh";
"texterify_timestamp" = "2023-07-17T22:40:34Z";

0 comments on commit 83c10ce

Please sign in to comment.