mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-15 00:34:08 +09:00
fix: fixed cases when cpu total freq will be NaN (#3086)
This commit is contained in:
@@ -31,16 +31,11 @@ public struct CPU_Load: Codable, RemoteType {
|
||||
}
|
||||
}
|
||||
|
||||
public struct CPU_Frequency: Codable, RemoteType {
|
||||
var value: Double = 0
|
||||
public struct CPU_Frequency: Codable {
|
||||
var value: Double? = nil
|
||||
var eCore: Double? = nil
|
||||
var pCore: Double? = nil
|
||||
var sCore: Double? = nil
|
||||
|
||||
public func remote() -> Data? {
|
||||
let string = "1,1,\(self.value)$"
|
||||
return string.data(using: .utf8)
|
||||
}
|
||||
}
|
||||
|
||||
public struct CPU_Limit: Codable {
|
||||
|
||||
@@ -458,15 +458,17 @@ internal class Popup: PopupWrapper {
|
||||
}
|
||||
|
||||
if (self.window?.isVisible ?? false) || !self.initializedFrequency {
|
||||
if value.value > self.maxFreq {
|
||||
self.maxFreq = value.value
|
||||
}
|
||||
|
||||
self.coresFreqField?.stringValue = "\(Int(value.value)) MHz"
|
||||
if let circle = self.frequencyCircle {
|
||||
circle.setValue((100*value.value)/self.maxFreq)
|
||||
circle.setText("\((value.value/1000).rounded(toPlaces: 2))")
|
||||
circle.toolTip = "\(localizedString("CPU frequency")): \(Int(value.value)) MHz - \(((100*value.value)/self.maxFreq).rounded(toPlaces: 2))%"
|
||||
if let v = value.value {
|
||||
if v > self.maxFreq {
|
||||
self.maxFreq = v
|
||||
}
|
||||
|
||||
self.coresFreqField?.stringValue = "\(Int(v)) MHz"
|
||||
if let circle = self.frequencyCircle {
|
||||
circle.setValue((100*v)/self.maxFreq)
|
||||
circle.setText("\((v/1000).rounded(toPlaces: 2))")
|
||||
circle.toolTip = "\(localizedString("CPU frequency")): \(Int(v)) MHz - \(((100*v)/self.maxFreq).rounded(toPlaces: 2))%"
|
||||
}
|
||||
}
|
||||
|
||||
if let v = value.eCore {
|
||||
|
||||
@@ -372,14 +372,14 @@ public class FrequencyReader: Reader<CPU_Frequency> {
|
||||
|
||||
for sample in samples {
|
||||
guard sample.group == "CPU Stats" else { continue }
|
||||
if sample.channel.starts(with: "ECPU") {
|
||||
if sample.channel.contains("ECPU") {
|
||||
eCore.append(self.calculateFrequencies(dict: sample.delta, freqs: self.eCoreFreqs))
|
||||
}
|
||||
if sample.channel.starts(with: self.sCoreCount == 0 ? "PCPU" : "MCPU") {
|
||||
if sample.channel.contains(self.sCoreCount == 0 ? "PCPU" : "MCPU") {
|
||||
pCore.append(self.calculateFrequencies(dict: sample.delta, freqs: self.pCoreFreqs))
|
||||
}
|
||||
if self.sCoreCount != 0 {
|
||||
if sample.channel.starts(with: "PCPU") {
|
||||
if sample.channel.contains("PCPU") {
|
||||
sCore.append(self.calculateFrequencies(dict: sample.delta, freqs: self.sCoreFreqs))
|
||||
}
|
||||
}
|
||||
@@ -400,8 +400,22 @@ public class FrequencyReader: Reader<CPU_Frequency> {
|
||||
let pFreq: Double? = pCores.isEmpty ? nil : pCores.reduce(0, +) / Double(self.measurementCount)
|
||||
let sFreq: Double? = sCores.isEmpty ? nil : sCores.reduce(0, +) / Double(self.measurementCount)
|
||||
|
||||
let activeCores: Double = (eFreq != nil ? self.eCoreCount : 0) + (sFreq != nil ? self.sCoreCount : 0) + (pFreq != nil ? self.pCoreCount : 0)
|
||||
let value: Double = ((eFreq ?? 0) * self.eCoreCount + (sFreq ?? 0) * self.sCoreCount + (pFreq ?? 0) * self.pCoreCount) / activeCores
|
||||
var activeCores: Double = 0
|
||||
var totalFreq: Double = 0
|
||||
|
||||
if let freq = eFreq {
|
||||
activeCores += self.eCoreCount
|
||||
totalFreq += freq * self.eCoreCount
|
||||
}
|
||||
if let freq = pFreq {
|
||||
activeCores += self.pCoreCount
|
||||
totalFreq += freq * self.pCoreCount
|
||||
}
|
||||
if let freq = sFreq {
|
||||
activeCores += self.sCoreCount
|
||||
totalFreq += freq * self.sCoreCount
|
||||
}
|
||||
let value: Double? = activeCores > 0 ? totalFreq / activeCores : nil
|
||||
|
||||
self.callback(CPU_Frequency(value: value, eCore: eFreq, pCore: pFreq, sCore: sFreq))
|
||||
self.isReading = false
|
||||
|
||||
@@ -58,6 +58,9 @@ public struct drive: Codable {
|
||||
if usedSpace < 0 {
|
||||
usedSpace = 0
|
||||
}
|
||||
if total == 0 {
|
||||
return 0
|
||||
}
|
||||
return Double(usedSpace) / Double(total)
|
||||
}
|
||||
|
||||
@@ -319,10 +322,14 @@ public class Disk: Module {
|
||||
}
|
||||
case "$percentage":
|
||||
var percentage: Int
|
||||
switch pair.value {
|
||||
case "used": percentage = Int((Double(d.size - d.free) / Double(d.size)) * 100)
|
||||
case "free": percentage = Int((Double(d.free) / Double(d.size)) * 100)
|
||||
default: return
|
||||
if d.size == 0 {
|
||||
percentage = 0
|
||||
} else {
|
||||
switch pair.value {
|
||||
case "used": percentage = Int((Double(d.size - d.free) / Double(d.size)) * 100)
|
||||
case "free": percentage = Int((Double(d.free) / Double(d.size)) * 100)
|
||||
default: return
|
||||
}
|
||||
}
|
||||
replacement = "\(percentage < 0 ? 0 : percentage)%"
|
||||
default: return
|
||||
|
||||
@@ -30,6 +30,7 @@ extension CWPHYMode: @retroactive CustomStringConvertible {
|
||||
case .mode11g: return "802.11g"
|
||||
case .mode11n: return "802.11n"
|
||||
case .mode11ax: return "802.11ax"
|
||||
case .mode11be: return "802.11be"
|
||||
case .modeNone: return "none"
|
||||
@unknown default: return "unknown"
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(MARKETING_VERSION)</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>776</string>
|
||||
<string>777</string>
|
||||
<key>Description</key>
|
||||
<string>Simple macOS system monitor in your menu bar</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.12.6</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>776</string>
|
||||
<string>777</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
|
||||
Reference in New Issue
Block a user