From fae60f74b74a85fd223dee84508c5e8278e5aa5f Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Fri, 12 Jul 2019 22:19:44 +0200 Subject: [PATCH 1/3] Hyperthreading mode in Bar Chart --- Stats/Modules/CPU/CPU.swift | 17 +++++++ Stats/Modules/CPU/CPUReader.swift | 10 +++- Stats/Modules/Network/Network.swift | 8 ++- Stats/Modules/Network/NetworkReader.swift | 7 +-- Stats/Widgets/BarChart.swift | 3 ++ Stats/Widgets/NetworkView.swift | 60 ++++++++++++----------- Stats/Widgets/Widget.swift | 1 + 7 files changed, 69 insertions(+), 37 deletions(-) diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index 2fa48ed4815..519e3a1b95c 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -18,6 +18,7 @@ class CPU: Module { var available: Observable var color: Observable var label: Observable + var hyperthreading: Observable var reader: Reader = CPUReader() let defaults = UserDefaults.standard @@ -26,6 +27,7 @@ class CPU: Module { init() { self.available = Observable(true) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) + self.hyperthreading = Observable(defaults.object(forKey: "\(name)_hyperthreading") != nil ? defaults.bool(forKey: "\(name)_hyperthreading") : true) self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini self.color = Observable(defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) self.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : true) @@ -34,6 +36,7 @@ class CPU: Module { if self.widgetType == Widgets.BarChart { (self.reader as! CPUReader).perCoreMode = true + (self.reader as! CPUReader).hyperthreading = self.hyperthreading.value } } @@ -64,6 +67,10 @@ class CPU: Module { barChart.state = self.widgetType == Widgets.BarChart ? NSControl.StateValue.on : NSControl.StateValue.off barChart.target = self + let hyperthreading = NSMenuItem(title: "Hyperthreading", action: #selector(toggleHyperthreading), keyEquivalent: "") + hyperthreading.state = self.hyperthreading.value ? NSControl.StateValue.on : NSControl.StateValue.off + hyperthreading.target = self + let color = NSMenuItem(title: "Color", action: #selector(toggleColor), keyEquivalent: "") color.state = self.color.value ? NSControl.StateValue.on : NSControl.StateValue.off color.target = self @@ -79,6 +86,9 @@ class CPU: Module { submenu.addItem(NSMenuItem.separator()) + if self.widgetType == Widgets.BarChart { + submenu.addItem(hyperthreading) + } if self.widgetType == Widgets.BarChart || self.widgetType == Widgets.ChartWithValue || self.widgetType == Widgets.Chart { submenu.addItem(label) } @@ -145,6 +155,13 @@ class CPU: Module { self.active << true } + @objc func toggleHyperthreading(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_hyperthreading") + self.hyperthreading << (sender.state == NSControl.StateValue.on) + (self.reader as! CPUReader).hyperthreading = sender.state == NSControl.StateValue.on + } + @objc func toggleColor(_ sender: NSMenuItem) { sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_color") diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index d227e095dea..bb90eaa5b80 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -20,6 +20,7 @@ class CPUReader: Reader { let CPUUsageLock: NSLock = NSLock() var perCoreMode: Bool = false + var hyperthreading: Bool = true init() { let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ] @@ -59,7 +60,12 @@ class CPUReader: Reader { var totalOnAllCores: Int32 = 0 var usagePerCore: [Double] = [] - for i in 0 ..< Int32(numCPUs) { + var incrementNumber = 1 + if !self.hyperthreading && self.perCoreMode { + incrementNumber = 2 + } + + for i in stride(from: 0, to: Int32(numCPUs), by: incrementNumber){ var inUse: Int32 var total: Int32 if let prevCpuInfo = prevCpuInfo { @@ -80,7 +86,7 @@ class CPUReader: Reader { inUseOnAllCores = inUseOnAllCores + inUse totalOnAllCores = totalOnAllCores + total - usagePerCore.insert((Double(inUse) / Double(total)), at: Int(i)) + usagePerCore.append(Double(inUse) / Double(total)) } if self.perCoreMode { diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index 11d341a313c..959de96f001 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -74,6 +74,10 @@ class Network: Module { arrowsWithText.state = self.widgetType == Widgets.NetworkArrowsWithText ? NSControl.StateValue.on : NSControl.StateValue.off arrowsWithText.target = self + let chart = NSMenuItem(title: "Chart", action: #selector(toggleWidget), keyEquivalent: "") + chart.state = self.widgetType == Widgets.NetworkChart ? NSControl.StateValue.on : NSControl.StateValue.off + chart.target = self + submenu.addItem(dots) submenu.addItem(arrows) submenu.addItem(text) @@ -113,6 +117,8 @@ class Network: Module { widgetCode = Widgets.NetworkDotsWithText case "Arrows with text": widgetCode = Widgets.NetworkArrowsWithText + case "Chart": + widgetCode = Widgets.NetworkChart default: break } @@ -122,7 +128,7 @@ class Network: Module { } for item in self.submenu.items { - if item.title == "Dots" || item.title == "Arrows" || item.title == "Text" || item.title == "Dots with text" || item.title == "Arrows with text" { + if item.title == "Dots" || item.title == "Arrows" || item.title == "Text" || item.title == "Dots with text" || item.title == "Arrows with text" || item.title == "Chart" { item.state = NSControl.StateValue.off } } diff --git a/Stats/Modules/Network/NetworkReader.swift b/Stats/Modules/Network/NetworkReader.swift index ae18a2c9d96..4c04a347c60 100644 --- a/Stats/Modules/Network/NetworkReader.swift +++ b/Stats/Modules/Network/NetworkReader.swift @@ -46,12 +46,7 @@ class NetworkReader: Reader { guard let download = Int64(arr[2]), let upload = Int64(arr[5]) else { return } - - guard let value: Double = Double("\(download).\(upload)") else { - return - } - - self.value << [value] + self.value << [Double(download), Double(upload)] } } diff --git a/Stats/Widgets/BarChart.swift b/Stats/Widgets/BarChart.swift index 5944b2383a0..fb579af3388 100644 --- a/Stats/Widgets/BarChart.swift +++ b/Stats/Widgets/BarChart.swift @@ -122,6 +122,9 @@ class BarChart: NSView, Widget { if self.partitions.count == 1 { width = 18 } + if self.partitions.count == 2 { + width = 28 + } if self.labelEnabled { width += labelPadding } diff --git a/Stats/Widgets/NetworkView.swift b/Stats/Widgets/NetworkView.swift index 32f9488f609..b2824246ac3 100644 --- a/Stats/Widgets/NetworkView.swift +++ b/Stats/Widgets/NetworkView.swift @@ -68,14 +68,14 @@ class NetworkDotsView: NSView, Widget { } func setValue(data: [Double]) { - let value: Double = data.first! + let download: Int64 = Int64(data[0]) + let upload: Int64 = Int64(data[1]) - let values = value.splitAtDecimal() - if self.download != values[0] { - self.download = values[0] + if self.download != download { + self.download = download } - if self.upload != values[1] { - self.upload = values[1] + if self.upload != upload { + self.upload = upload } } @@ -118,10 +118,11 @@ class NetworkTextView: NSView, Widget { } func setValue(data: [Double]) { - let value: Double = data.first! - let values = value.splitAtDecimal() - downloadValue.stringValue = Units(bytes: values[0]).getReadableUnit() - uploadValue.stringValue = Units(bytes: values[1]).getReadableUnit() + let download: Int64 = Int64(data[0]) + let upload: Int64 = Int64(data[1]) + + downloadValue.stringValue = Units(bytes: download).getReadableUnit() + uploadValue.stringValue = Units(bytes: upload).getReadableUnit() } func toggleColor(state: Bool) { @@ -237,13 +238,14 @@ class NetworkArrowsView: NSView, Widget { } func setValue(data: [Double]) { - let value: Double = data.first! - let values = value.splitAtDecimal() - if self.download != values[0] { - self.download = values[0] + let download: Int64 = Int64(data[0]) + let upload: Int64 = Int64(data[1]) + + if self.download != download { + self.download = download } - if self.upload != values[1] { - self.upload = values[1] + if self.upload != upload { + self.upload = upload } } @@ -320,14 +322,15 @@ class NetworkDotsTextView: NSView, Widget { } func setValue(data: [Double]) { - let value: Double = data.first! - let values = value.splitAtDecimal() - if self.download != values[0] { - self.download = values[0] + let download: Int64 = Int64(data[0]) + let upload: Int64 = Int64(data[1]) + + if self.download != download { + self.download = download downloadValue.stringValue = Units(bytes: self.download).getReadableUnit() } - if self.upload != values[1] { - self.upload = values[1] + if self.upload != upload { + self.upload = upload uploadValue.stringValue = Units(bytes: self.upload).getReadableUnit() } } @@ -448,14 +451,15 @@ class NetworkArrowsTextView: NSView, Widget { } func setValue(data: [Double]) { - let value: Double = data.first! - let values = value.splitAtDecimal() - if self.download != values[0] { - self.download = values[0] + let download: Int64 = Int64(data[0]) + let upload: Int64 = Int64(data[1]) + + if self.download != download { + self.download = download downloadValue.stringValue = Units(bytes: self.download).getReadableUnit() } - if self.upload != values[1] { - self.upload = values[1] + if self.upload != upload { + self.upload = upload uploadValue.stringValue = Units(bytes: self.upload).getReadableUnit() } } diff --git a/Stats/Widgets/Widget.swift b/Stats/Widgets/Widget.swift index f0cc71ef52d..827b3c09683 100644 --- a/Stats/Widgets/Widget.swift +++ b/Stats/Widgets/Widget.swift @@ -36,6 +36,7 @@ struct Widgets { static let NetworkText: WidgetType = 2.2 static let NetworkDotsWithText: WidgetType = 2.3 static let NetworkArrowsWithText: WidgetType = 2.4 + static let NetworkChart: WidgetType = 2.5 static let BarChart: WidgetType = 3.0 } From 518d65e35c092a157b8ba0193b00c51540a6ad99 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 13 Jul 2019 21:47:54 +0200 Subject: [PATCH 2/3] v1.2.7 --- CHANGELOG.md | 5 +++++ Stats/Supporting Files/Info.plist | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 499d04643ea..d56451736c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog All notable changes to this project will be documented in this file. +### [v1.2.7] + - added trigger for hyperthreading mode in Bar Chart + - fixed few bugs + ### [v1.2.6] - fixed CPU usage @@ -51,6 +55,7 @@ All notable changes to this project will be documented in this file. ### [v1.0.0] - first release +[v1.2.7]: https://github.com/exelban/stats/releases/tag/v1.2.7 [v1.2.6]: https://github.com/exelban/stats/releases/tag/v1.2.6 [v1.2.5]: https://github.com/exelban/stats/releases/tag/v1.2.5 [v1.2.4]: https://github.com/exelban/stats/releases/tag/v1.2.4 diff --git a/Stats/Supporting Files/Info.plist b/Stats/Supporting Files/Info.plist index d0028172df4..95c2fb8365c 100755 --- a/Stats/Supporting Files/Info.plist +++ b/Stats/Supporting Files/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.6 + 1.2.7 CFBundleVersion 1 LSApplicationCategoryType From e87764e8e9f1f8f7197ac04e049334d13a5e9623 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 13 Jul 2019 21:49:06 +0200 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d56451736c9..e3ccc07267e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. ### [v1.2.7] - - added trigger for hyperthreading mode in Bar Chart + - added hyperthreading mode in Bar Chart for CPU - fixed few bugs ### [v1.2.6]