mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-15 00:34:08 +09:00
feat: added average CPU load to the details
This commit is contained in:
@@ -39,6 +39,7 @@ public class CPU: Module {
|
||||
private var temperatureReader: TemperatureReader? = nil
|
||||
private var frequencyReader: FrequencyReader? = nil
|
||||
private var limitReader: LimitReader? = nil
|
||||
private var averageReader: AverageReader? = nil
|
||||
|
||||
private var usagePerCoreState: Bool {
|
||||
get {
|
||||
@@ -64,6 +65,7 @@ public class CPU: Module {
|
||||
self.loadReader = LoadReader()
|
||||
self.processReader = ProcessReader()
|
||||
self.limitReader = LimitReader(popup: true)
|
||||
self.averageReader = AverageReader(popup: true)
|
||||
|
||||
#if arch(x86_64)
|
||||
self.temperatureReader = TemperatureReader(popup: true)
|
||||
@@ -120,6 +122,11 @@ public class CPU: Module {
|
||||
self.popupView.limitCallback(v)
|
||||
}
|
||||
}
|
||||
self.averageReader?.callbackHandler = { [unowned self] value in
|
||||
if let v = value {
|
||||
self.popupView.averageCallback(v)
|
||||
}
|
||||
}
|
||||
|
||||
if let reader = self.loadReader {
|
||||
self.addReader(reader)
|
||||
@@ -136,6 +143,9 @@ public class CPU: Module {
|
||||
if let reader = self.limitReader {
|
||||
self.addReader(reader)
|
||||
}
|
||||
if let reader = self.averageReader {
|
||||
self.addReader(reader)
|
||||
}
|
||||
}
|
||||
|
||||
private func loadCallback(_ raw: CPU_Load?) {
|
||||
|
||||
@@ -20,6 +20,7 @@ internal class Popup: NSView, Popup_p {
|
||||
private let dashboardHeight: CGFloat = 90
|
||||
private let chartHeight: CGFloat = 90 + Constants.Popup.separatorHeight
|
||||
private let detailsHeight: CGFloat = (22*5) + Constants.Popup.separatorHeight
|
||||
private let averageHeight: CGFloat = (22*3) + Constants.Popup.separatorHeight
|
||||
private let processHeight: CGFloat = 22
|
||||
|
||||
private var systemField: NSTextField? = nil
|
||||
@@ -27,6 +28,9 @@ internal class Popup: NSView, Popup_p {
|
||||
private var idleField: NSTextField? = nil
|
||||
private var shedulerLimitField: NSTextField? = nil
|
||||
private var speedLimitField: NSTextField? = nil
|
||||
private var average1Field: NSTextField? = nil
|
||||
private var average5Field: NSTextField? = nil
|
||||
private var average15Field: NSTextField? = nil
|
||||
|
||||
private var chart: LineChartView? = nil
|
||||
private var circle: PieChartView? = nil
|
||||
@@ -37,6 +41,7 @@ internal class Popup: NSView, Popup_p {
|
||||
private var initializedFrequency: Bool = false
|
||||
private var initializedProcesses: Bool = false
|
||||
private var initializedLimits: Bool = false
|
||||
private var initializedAverage: Bool = false
|
||||
|
||||
private var processes: [ProcessView] = []
|
||||
private var maxFreq: Double = 0
|
||||
@@ -62,7 +67,7 @@ internal class Popup: NSView, Popup_p {
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: Constants.Popup.width,
|
||||
height: self.dashboardHeight + self.chartHeight + self.detailsHeight
|
||||
height: self.dashboardHeight + self.chartHeight + self.detailsHeight + self.averageHeight
|
||||
))
|
||||
self.setFrameSize(NSSize(width: self.frame.width, height: self.frame.height+self.processesHeight))
|
||||
|
||||
@@ -73,11 +78,13 @@ internal class Popup: NSView, Popup_p {
|
||||
gridView.addRow(with: [self.initDashboard()])
|
||||
gridView.addRow(with: [self.initChart()])
|
||||
gridView.addRow(with: [self.initDetails()])
|
||||
gridView.addRow(with: [self.initAverage()])
|
||||
gridView.addRow(with: [self.initProcesses()])
|
||||
|
||||
gridView.row(at: 0).height = self.dashboardHeight
|
||||
gridView.row(at: 1).height = self.chartHeight
|
||||
gridView.row(at: 2).height = self.detailsHeight
|
||||
gridView.row(at: 3).height = self.averageHeight
|
||||
|
||||
self.addSubview(gridView)
|
||||
self.grid = gridView
|
||||
@@ -177,6 +184,21 @@ internal class Popup: NSView, Popup_p {
|
||||
return view
|
||||
}
|
||||
|
||||
private func initAverage() -> NSView {
|
||||
let view: NSView = NSView(frame: NSRect(x: 0, y: 0, width: self.frame.width, height: self.averageHeight))
|
||||
let separator = separatorView(localizedString("Average load"), origin: NSPoint(x: 0, y: self.averageHeight-Constants.Popup.separatorHeight), width: self.frame.width)
|
||||
let container: NSView = NSView(frame: NSRect(x: 0, y: 0, width: self.frame.width, height: separator.frame.origin.y))
|
||||
|
||||
self.average1Field = popupRow(container, n: 2, title: "\(localizedString("1 minute")):", value: "").1
|
||||
self.average5Field = popupRow(container, n: 1, title: "\(localizedString("5 minutes")):", value: "").1
|
||||
self.average15Field = popupRow(container, n: 0, title: "\(localizedString("15 minutes")):", value: "").1
|
||||
|
||||
view.addSubview(separator)
|
||||
view.addSubview(container)
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
private func initProcesses() -> NSView {
|
||||
let view: NSView = NSView(frame: NSRect(x: 0, y: 0, width: self.frame.width, height: self.processesHeight))
|
||||
let separator = separatorView(localizedString("Top processes"), origin: NSPoint(x: 0, y: self.processesHeight-Constants.Popup.separatorHeight), width: self.frame.width)
|
||||
@@ -284,6 +306,24 @@ internal class Popup: NSView, Popup_p {
|
||||
})
|
||||
}
|
||||
|
||||
public func averageCallback(_ value: [Double]) {
|
||||
guard value.count == 3 else {
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async(execute: {
|
||||
if !(self.window?.isVisible ?? false) && self.initializedAverage {
|
||||
return
|
||||
}
|
||||
|
||||
self.average1Field?.stringValue = "\(value[0])"
|
||||
self.average5Field?.stringValue = "\(value[1])"
|
||||
self.average15Field?.stringValue = "\(value[2])"
|
||||
|
||||
self.initializedAverage = true
|
||||
})
|
||||
}
|
||||
|
||||
public func toggleFrequency(state: Bool) {
|
||||
DispatchQueue.main.async(execute: {
|
||||
if let view = self.frequencyCircle {
|
||||
|
||||
@@ -383,6 +383,9 @@ public class FrequencyReader: Reader<Double> {
|
||||
}
|
||||
|
||||
var local: PGSample = 0
|
||||
var value: Double = 0
|
||||
var min: Double = 0
|
||||
var max: Double = 0
|
||||
|
||||
if !self.PG_ReadSample!(0, &local) {
|
||||
self.reconnect()
|
||||
@@ -390,10 +393,6 @@ public class FrequencyReader: Reader<Double> {
|
||||
return
|
||||
}
|
||||
|
||||
var value: Double = 0
|
||||
var min: Double = 0
|
||||
var max: Double = 0
|
||||
|
||||
defer {
|
||||
if !self.PGSample_Release!(self.sample) {
|
||||
error("release self.sample failed", log: self.log)
|
||||
@@ -442,7 +441,6 @@ public class LimitReader: Reader<CPU_Limit> {
|
||||
guard let value = Int(line.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) else {
|
||||
return
|
||||
}
|
||||
|
||||
if line.contains("Scheduler") {
|
||||
self.limits.scheduler = value
|
||||
} else if line.contains("CPUs") {
|
||||
@@ -487,7 +485,6 @@ public class AverageReader: Reader<[Double]> {
|
||||
|
||||
var str = line.trimmingCharacters(in: .whitespaces)
|
||||
let strArr = str.findAndCrop(pattern: "(\\d+(.|,)\\d+ *){3}$").split(separator: " ")
|
||||
|
||||
guard strArr.count == 3 else {
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user