feat: added average CPU load to the details

This commit is contained in:
Serhiy Mytrovtsiy
2021-09-07 19:53:13 +02:00
parent 8431297f84
commit 58be03d807
3 changed files with 54 additions and 7 deletions

View File

@@ -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?) {

View File

@@ -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 {

View File

@@ -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
}