feat: moved Fans to the top at the Sensors. Refactor the Sensor type to be more generic. Added Fan structure to the Sensors module. (first steps to merge Fans and Sensors modules)

This commit is contained in:
Serhiy Mytrovtsiy
2021-08-07 12:33:23 +03:00
parent bda7ad29b8
commit 74031a6e3c
5 changed files with 169 additions and 92 deletions

View File

@@ -62,13 +62,13 @@ public class Sensors: Module {
}
}
private func usageCallback(_ raw: [Sensor_t]?) {
private func usageCallback(_ raw: [Sensor_p]?) {
guard let value = raw else {
return
}
var list: [KeyValue_t] = []
value.forEach { (s: Sensor_t) in
value.forEach { (s: Sensor_p) in
if s.state {
list.append(KeyValue_t(key: s.key, value: s.formattedMiniValue))
}

View File

@@ -25,13 +25,13 @@ internal class Popup: NSView, Popup_p {
fatalError("init(coder:) has not been implemented")
}
internal func setup(_ values: [Sensor_t]?) {
internal func setup(_ values: [Sensor_p]?) {
guard values != nil else {
return
}
var types: [SensorType] = []
values!.forEach { (s: Sensor_t) in
values!.forEach { (s: Sensor_p) in
if !types.contains(s.type) {
types.append(s.type)
}
@@ -45,7 +45,7 @@ internal class Popup: NSView, Popup_p {
types.reversed().forEach { (typ: SensorType) in
let filtered = values!.filter{ $0.type == typ }
var groups: [SensorGroup] = []
filtered.forEach { (s: Sensor_t) in
filtered.forEach { (s: Sensor_p) in
if !groups.contains(s.group) {
groups.append(s.group)
}
@@ -58,7 +58,7 @@ internal class Popup: NSView, Popup_p {
var i: CGFloat = 0
groups.reversed().forEach { (group: SensorGroup) in
filtered.reversed().filter{ $0.group == group }.forEach { (s: Sensor_t) in
filtered.reversed().filter{ $0.group == group }.forEach { (s: Sensor_p) in
let (key, value) = popupRow(view, n: i, title: "\(s.name):", value: s.formattedValue)
key.toolTip = s.key
self.list[s.key] = value
@@ -74,10 +74,10 @@ internal class Popup: NSView, Popup_p {
self.sizeCallback?(self.frame.size)
}
internal func usageCallback(_ values: [Sensor_t]) {
internal func usageCallback(_ values: [Sensor_p]) {
DispatchQueue.main.async(execute: {
if self.window?.isVisible ?? false {
values.forEach { (s: Sensor_t) in
values.forEach { (s: Sensor_p) in
if self.list[s.key] != nil {
self.list[s.key]?.stringValue = s.formattedValue
}

View File

@@ -13,8 +13,8 @@ import Cocoa
import Kit
import IOKit.hid
internal class SensorsReader: Reader<[Sensor_t]> {
internal var list: [Sensor_t] = []
internal class SensorsReader: Reader<[Sensor_p]> {
internal var list: [Sensor_p] = []
}
internal class x86_SensorsReader: SensorsReader {
@@ -22,23 +22,40 @@ internal class x86_SensorsReader: SensorsReader {
super.init()
var available: [String] = SMC.shared.getAllKeys()
var list: [Sensor_t] = []
var list: [Sensor] = []
guard let count = SMC.shared.getValue("FNum") else {
return
}
debug("Found \(Int(count)) fans", log: self.log)
for i in 0..<Int(count) {
self.list.append(Fan(
id: i,
key: "F\(i)Ac",
name: SMC.shared.getStringValue("F\(i)ID") ?? "Fan #\(i)",
minSpeed: SMC.shared.getValue("F\(i)Mn") ?? 1,
maxSpeed: SMC.shared.getValue("F\(i)Mx") ?? 1,
value: SMC.shared.getValue("F\(i)Ac") ?? 0,
mode: self.getFanMode(i)
))
}
available = available.filter({ (key: String) -> Bool in
switch key.prefix(1) {
case "T", "V", "P", "F": return true
case "T", "V", "P": return true
default: return false
}
})
SensorsList.forEach { (s: Sensor_t) in
SensorsList.forEach { (s: Sensor) in
if let idx = available.firstIndex(where: { $0 == s.key }) {
list.append(s)
available.remove(at: idx)
}
}
SensorsList.filter{ $0.key.contains("%") }.forEach { (s: Sensor_t) in
SensorsList.filter{ $0.key.contains("%") }.forEach { (s: Sensor) in
var index = 1
for i in 0..<10 {
let key = s.key.replacingOccurrences(of: "%", with: "\(i)")
@@ -61,7 +78,7 @@ internal class x86_SensorsReader: SensorsReader {
}
}
self.list = list.filter({ (s: Sensor_t) -> Bool in
self.list += list.filter({ (s: Sensor) -> Bool in
if s.type == .temperature && s.value > 110 {
return false
}
@@ -77,6 +94,23 @@ internal class x86_SensorsReader: SensorsReader {
}
self.callback(self.list)
}
private func getFanMode(_ id: Int) -> FanMode {
let fansMode: Int = Int(SMC.shared.getValue("FS! ") ?? 0)
var mode: FanMode = .automatic
if fansMode == 0 {
mode = .automatic
} else if fansMode == 3 {
mode = .forced
} else if fansMode == 1 && id == 0 {
mode = .forced
} else if fansMode == 2 && id == 1 {
mode = .forced
}
return mode
}
}
internal class AppleSilicon_SensorsReader: SensorsReader {
@@ -89,7 +123,7 @@ internal class AppleSilicon_SensorsReader: SensorsReader {
self.fetch(type: type)
}
self.list = self.list.filter({ (s: Sensor_t) -> Bool in
self.list = self.list.filter({ (s: Sensor_p) -> Bool in
switch s.type {
case .temperature:
return s.value < 110 && s.value >= 0
@@ -152,7 +186,7 @@ internal class AppleSilicon_SensorsReader: SensorsReader {
if let idx = self.list.firstIndex(where: { $0.name == name }) {
self.list[idx].value = value
} else {
self.list.append(Sensor_t(
self.list.append(Sensor(
key: name,
name: name,
value: value,

View File

@@ -17,11 +17,11 @@ internal class Settings: NSView, Settings_v {
private let title: String
private var button: NSPopUpButton?
private let list: [Sensor_t]
private let list: [Sensor_p]
public var callback: (() -> Void) = {}
public var setInterval: ((_ value: Int) -> Void) = {_ in }
public init(_ title: String, list: [Sensor_t]) {
public init(_ title: String, list: [Sensor_p]) {
self.title = title
self.list = list
@@ -49,7 +49,7 @@ internal class Settings: NSView, Settings_v {
self.subviews.forEach{ $0.removeFromSuperview() }
var types: [SensorType] = []
self.list.forEach { (s: Sensor_t) in
self.list.forEach { (s: Sensor_p) in
if !types.contains(s.type) {
types.append(s.type)
}
@@ -79,14 +79,14 @@ internal class Settings: NSView, Settings_v {
types.reversed().forEach { (typ: SensorType) in
let filtered = self.list.filter{ $0.type == typ }
var groups: [SensorGroup] = []
filtered.forEach { (s: Sensor_t) in
filtered.forEach { (s: Sensor_p) in
if !groups.contains(s.group) {
groups.append(s.group)
}
}
groups.reversed().forEach { (group: SensorGroup) in
filtered.reversed().filter{ $0.group == group }.forEach { (s: Sensor_t) in
filtered.reversed().filter{ $0.group == group }.forEach { (s: Sensor_p) in
let row: NSView = toggleTitleRow(
frame: NSRect(x: 0, y: y, width: view.frame.width, height: rowHeight),
title: s.name,

View File

@@ -11,22 +11,36 @@
import Kit
enum SensorGroup: String {
internal enum SensorGroup: String {
case CPU = "CPU"
case GPU = "GPU"
case system = "Systems"
case sensor = "Sensors"
}
enum SensorType: String {
internal enum SensorType: String {
case temperature = "Temperature"
case voltage = "Voltage"
case current = "Current"
case power = "Power"
case fan = "Fan"
case fan = "Fans"
}
struct Sensor_t {
internal protocol Sensor_p {
var key: String { get }
var name: String { get }
var value: Double { get set }
var state: Bool { get }
var group: SensorGroup { get }
var type: SensorType { get }
var unit: String { get }
var formattedValue: String { get }
var formattedMiniValue: String { get }
}
internal struct Sensor: Sensor_p {
var key: String
var name: String
@@ -34,6 +48,7 @@ struct Sensor_t {
var group: SensorGroup
var type: SensorType
var unit: String {
get {
switch self.type {
@@ -96,89 +111,117 @@ struct Sensor_t {
}
}
func copy() -> Sensor_t {
return Sensor_t(key: self.key, name: self.name, group: self.group, type: self.type)
func copy() -> Sensor {
return Sensor(key: self.key, name: self.name, group: self.group, type: self.type)
}
}
internal struct Fan: Sensor_p {
let id: Int
var key: String
var name: String
let minSpeed: Double
let maxSpeed: Double
var value: Double
var mode: FanMode
var group: SensorGroup = .sensor
var type: SensorType = .fan
var unit: String = "RPM"
var formattedValue: String {
get {
return "\(Int(value)) RPM"
}
}
var formattedMiniValue: String {
get {
return "\(Int(value))"
}
}
var state: Bool {
get {
return Store.shared.bool(key: "sensor_\(self.key)", defaultValue: false)
}
}
}
// List of keys: https://github.com/acidanthera/VirtualSMC/blob/master/Docs/SMCSensorKeys.txt
let SensorsList: [Sensor_t] = [
let SensorsList: [Sensor] = [
// Temperature
Sensor_t(key: "TA%P", name: "Ambient %", group: .sensor, type: .temperature),
Sensor_t(key: "Th%H", name: "Heatpipe %", group: .sensor, type: .temperature),
Sensor_t(key: "TZ%C", name: "Termal zone %", group: .sensor, type: .temperature),
Sensor(key: "TA%P", name: "Ambient %", group: .sensor, type: .temperature),
Sensor(key: "Th%H", name: "Heatpipe %", group: .sensor, type: .temperature),
Sensor(key: "TZ%C", name: "Termal zone %", group: .sensor, type: .temperature),
Sensor_t(key: "TC0D", name: "CPU diode", group: .CPU, type: .temperature),
Sensor_t(key: "TC0E", name: "CPU diode virtual", group: .CPU, type: .temperature),
Sensor_t(key: "TC0F", name: "CPU diode filtered", group: .CPU, type: .temperature),
Sensor_t(key: "TC0H", name: "CPU heatsink", group: .CPU, type: .temperature),
Sensor_t(key: "TC0P", name: "CPU proximity", group: .CPU, type: .temperature),
Sensor_t(key: "TCAD", name: "CPU package", group: .CPU, type: .temperature),
Sensor(key: "TC0D", name: "CPU diode", group: .CPU, type: .temperature),
Sensor(key: "TC0E", name: "CPU diode virtual", group: .CPU, type: .temperature),
Sensor(key: "TC0F", name: "CPU diode filtered", group: .CPU, type: .temperature),
Sensor(key: "TC0H", name: "CPU heatsink", group: .CPU, type: .temperature),
Sensor(key: "TC0P", name: "CPU proximity", group: .CPU, type: .temperature),
Sensor(key: "TCAD", name: "CPU package", group: .CPU, type: .temperature),
Sensor_t(key: "TC%c", name: "CPU core %", group: .CPU, type: .temperature),
Sensor_t(key: "TC%C", name: "CPU core %", group: .CPU, type: .temperature),
Sensor(key: "TC%c", name: "CPU core %", group: .CPU, type: .temperature),
Sensor(key: "TC%C", name: "CPU core %", group: .CPU, type: .temperature),
Sensor_t(key: "TCGC", name: "GPU Intel Graphics", group: .GPU, type: .temperature),
Sensor_t(key: "TG0D", name: "GPU diode", group: .GPU, type: .temperature),
Sensor_t(key: "TGDD", name: "GPU AMD Radeon", group: .GPU, type: .temperature),
Sensor_t(key: "TG0H", name: "GPU heatsink", group: .GPU, type: .temperature),
Sensor_t(key: "TG0P", name: "GPU proximity", group: .GPU, type: .temperature),
Sensor(key: "TCGC", name: "GPU Intel Graphics", group: .GPU, type: .temperature),
Sensor(key: "TG0D", name: "GPU diode", group: .GPU, type: .temperature),
Sensor(key: "TGDD", name: "GPU AMD Radeon", group: .GPU, type: .temperature),
Sensor(key: "TG0H", name: "GPU heatsink", group: .GPU, type: .temperature),
Sensor(key: "TG0P", name: "GPU proximity", group: .GPU, type: .temperature),
Sensor_t(key: "Tm0P", name: "Mainboard", group: .system, type: .temperature),
Sensor_t(key: "Tp0P", name: "Powerboard", group: .system, type: .temperature),
Sensor_t(key: "TB1T", name: "Battery", group: .system, type: .temperature),
Sensor_t(key: "TW0P", name: "Airport", group: .system, type: .temperature),
Sensor_t(key: "TL0P", name: "Display", group: .system, type: .temperature),
Sensor_t(key: "TI%P", name: "Thunderbold %", group: .system, type: .temperature),
Sensor_t(key: "TH%A", name: "Disk % (A)", group: .system, type: .temperature),
Sensor_t(key: "TH%B", name: "Disk % (B)", group: .system, type: .temperature),
Sensor_t(key: "TH%C", name: "Disk % (C)", group: .system, type: .temperature),
Sensor(key: "Tm0P", name: "Mainboard", group: .system, type: .temperature),
Sensor(key: "Tp0P", name: "Powerboard", group: .system, type: .temperature),
Sensor(key: "TB1T", name: "Battery", group: .system, type: .temperature),
Sensor(key: "TW0P", name: "Airport", group: .system, type: .temperature),
Sensor(key: "TL0P", name: "Display", group: .system, type: .temperature),
Sensor(key: "TI%P", name: "Thunderbold %", group: .system, type: .temperature),
Sensor(key: "TH%A", name: "Disk % (A)", group: .system, type: .temperature),
Sensor(key: "TH%B", name: "Disk % (B)", group: .system, type: .temperature),
Sensor(key: "TH%C", name: "Disk % (C)", group: .system, type: .temperature),
Sensor_t(key: "TN0D", name: "Northbridge diode", group: .system, type: .temperature),
Sensor_t(key: "TN0H", name: "Northbridge heatsink", group: .system, type: .temperature),
Sensor_t(key: "TN0P", name: "Northbridge proximity", group: .system, type: .temperature),
Sensor(key: "TN0D", name: "Northbridge diode", group: .system, type: .temperature),
Sensor(key: "TN0H", name: "Northbridge heatsink", group: .system, type: .temperature),
Sensor(key: "TN0P", name: "Northbridge proximity", group: .system, type: .temperature),
// Voltage
Sensor_t(key: "VCAC", name: "CPU IA", group: .CPU, type: .voltage),
Sensor_t(key: "VCSC", name: "CPU System Agent", group: .CPU, type: .voltage),
Sensor_t(key: "VC%C", name: "CPU Core %", group: .CPU, type: .voltage),
Sensor(key: "VCAC", name: "CPU IA", group: .CPU, type: .voltage),
Sensor(key: "VCSC", name: "CPU System Agent", group: .CPU, type: .voltage),
Sensor(key: "VC%C", name: "CPU Core %", group: .CPU, type: .voltage),
Sensor_t(key: "VCTC", name: "GPU Intel Graphics", group: .GPU, type: .voltage),
Sensor_t(key: "VG0C", name: "GPU", group: .GPU, type: .voltage),
Sensor(key: "VCTC", name: "GPU Intel Graphics", group: .GPU, type: .voltage),
Sensor(key: "VG0C", name: "GPU", group: .GPU, type: .voltage),
Sensor_t(key: "VM0R", name: "Memory", group: .system, type: .voltage),
Sensor_t(key: "Vb0R", name: "CMOS", group: .system, type: .voltage),
Sensor(key: "VM0R", name: "Memory", group: .system, type: .voltage),
Sensor(key: "Vb0R", name: "CMOS", group: .system, type: .voltage),
Sensor_t(key: "VD0R", name: "DC In", group: .sensor, type: .voltage),
Sensor_t(key: "VP0R", name: "12V rail", group: .sensor, type: .voltage),
Sensor_t(key: "Vp0C", name: "12V vcc", group: .sensor, type: .voltage),
Sensor_t(key: "VV2S", name: "3V", group: .sensor, type: .voltage),
Sensor_t(key: "VR3R", name: "3.3V", group: .sensor, type: .voltage),
Sensor_t(key: "VV1S", name: "5V", group: .sensor, type: .voltage),
Sensor_t(key: "VV9S", name: "12V", group: .sensor, type: .voltage),
Sensor_t(key: "VeES", name: "PCI 12V", group: .sensor, type: .voltage),
Sensor(key: "VD0R", name: "DC In", group: .sensor, type: .voltage),
Sensor(key: "VP0R", name: "12V rail", group: .sensor, type: .voltage),
Sensor(key: "Vp0C", name: "12V vcc", group: .sensor, type: .voltage),
Sensor(key: "VV2S", name: "3V", group: .sensor, type: .voltage),
Sensor(key: "VR3R", name: "3.3V", group: .sensor, type: .voltage),
Sensor(key: "VV1S", name: "5V", group: .sensor, type: .voltage),
Sensor(key: "VV9S", name: "12V", group: .sensor, type: .voltage),
Sensor(key: "VeES", name: "PCI 12V", group: .sensor, type: .voltage),
// Power
Sensor_t(key: "PC0C", name: "CPU Core", group: .CPU, type: .power),
Sensor_t(key: "PCAM", name: "CPU Core (IMON)", group: .CPU, type: .power),
Sensor_t(key: "PCPC", name: "CPU Package", group: .CPU, type: .power),
Sensor_t(key: "PCTR", name: "CPU Total", group: .CPU, type: .power),
Sensor_t(key: "PCPT", name: "CPU Package total", group: .CPU, type: .power),
Sensor_t(key: "PCPR", name: "CPU Package total (SMC)", group: .CPU, type: .power),
Sensor_t(key: "PC0R", name: "CPU Computing high side", group: .CPU, type: .power),
Sensor_t(key: "PC0G", name: "CPU GFX", group: .CPU, type: .power),
Sensor_t(key: "PCEC", name: "CPU VccEDRAM", group: .CPU, type: .power),
Sensor(key: "PC0C", name: "CPU Core", group: .CPU, type: .power),
Sensor(key: "PCAM", name: "CPU Core (IMON)", group: .CPU, type: .power),
Sensor(key: "PCPC", name: "CPU Package", group: .CPU, type: .power),
Sensor(key: "PCTR", name: "CPU Total", group: .CPU, type: .power),
Sensor(key: "PCPT", name: "CPU Package total", group: .CPU, type: .power),
Sensor(key: "PCPR", name: "CPU Package total (SMC)", group: .CPU, type: .power),
Sensor(key: "PC0R", name: "CPU Computing high side", group: .CPU, type: .power),
Sensor(key: "PC0G", name: "CPU GFX", group: .CPU, type: .power),
Sensor(key: "PCEC", name: "CPU VccEDRAM", group: .CPU, type: .power),
Sensor_t(key: "PCPG", name: "GPU Intel Graphics", group: .GPU, type: .power),
Sensor_t(key: "PG0R", name: "GPU", group: .GPU, type: .power),
Sensor_t(key: "PCGC", name: "Intel GPU", group: .GPU, type: .power),
Sensor_t(key: "PCGM", name: "Intel GPU (IMON)", group: .GPU, type: .power),
Sensor(key: "PCPG", name: "GPU Intel Graphics", group: .GPU, type: .power),
Sensor(key: "PG0R", name: "GPU", group: .GPU, type: .power),
Sensor(key: "PCGC", name: "Intel GPU", group: .GPU, type: .power),
Sensor(key: "PCGM", name: "Intel GPU (IMON)", group: .GPU, type: .power),
Sensor_t(key: "PC3C", name: "RAM", group: .sensor, type: .power),
Sensor_t(key: "PPBR", name: "Battery", group: .sensor, type: .power),
Sensor_t(key: "PDTR", name: "DC In", group: .sensor, type: .power),
Sensor_t(key: "PSTR", name: "System total", group: .sensor, type: .power),
// Fans
Sensor_t(key: "F%Ac", name: "Fan #%", group: .sensor, type: .fan)
Sensor(key: "PC3C", name: "RAM", group: .sensor, type: .power),
Sensor(key: "PPBR", name: "Battery", group: .sensor, type: .power),
Sensor(key: "PDTR", name: "DC In", group: .sensor, type: .power),
Sensor(key: "PSTR", name: "System total", group: .sensor, type: .power)
]