diff --git a/Modules/CPU/main.swift b/Modules/CPU/main.swift index 5a3eca1d..4b40db40 100644 --- a/Modules/CPU/main.swift +++ b/Modules/CPU/main.swift @@ -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?) { diff --git a/Modules/CPU/popup.swift b/Modules/CPU/popup.swift index 6966678b..b6ab5854 100644 --- a/Modules/CPU/popup.swift +++ b/Modules/CPU/popup.swift @@ -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 { diff --git a/Modules/CPU/readers.swift b/Modules/CPU/readers.swift index 7708c69e..f30ec6eb 100644 --- a/Modules/CPU/readers.swift +++ b/Modules/CPU/readers.swift @@ -383,6 +383,9 @@ public class FrequencyReader: Reader { } 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 { 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 { 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 }