From e2de518b75ca33efc5b9b7985905f0c5480bc1a9 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 10 Apr 2021 15:50:02 +0200 Subject: [PATCH] feat: init apple silicon sensors (#210) --- Modules/Sensors/bridge.h | 31 ++++++ Modules/Sensors/main.swift | 8 +- Modules/Sensors/popup.swift | 10 +- Modules/Sensors/readers.swift | 147 +++++++++++++++++++++++++-- Modules/Sensors/settings.swift | 22 ++-- Modules/Sensors/values.swift | 174 ++++++++++++++++---------------- Stats.xcodeproj/project.pbxproj | 4 + 7 files changed, 284 insertions(+), 112 deletions(-) create mode 100644 Modules/Sensors/bridge.h diff --git a/Modules/Sensors/bridge.h b/Modules/Sensors/bridge.h new file mode 100644 index 00000000..11a19ba2 --- /dev/null +++ b/Modules/Sensors/bridge.h @@ -0,0 +1,31 @@ +// +// bridge.h +// Stats +// +// Created by Serhiy Mytrovtsiy on 30/03/2021. +// Using Swift 5.0. +// Running on macOS 10.15. +// +// Copyright © 2021 Serhiy Mytrovtsiy. All rights reserved. +// +// Based on https://github.com/yujitach/MenuMeters/blob/master/hardware_reader/applesilicon_hardware_reader.m +// + +#include + +typedef struct __IOHIDEvent *IOHIDEventRef; +typedef struct __IOHIDServiceClient *IOHIDServiceClientRef; +#ifdef __LP64__ +typedef double IOHIDFloat; +#else +typedef float IOHIDFloat; +#endif + +#define kIOHIDEventTypeTemperature 15 +#define kIOHIDEventTypePower 25 + +IOHIDEventSystemClientRef IOHIDEventSystemClientCreate(CFAllocatorRef allocator); +int IOHIDEventSystemClientSetMatching(IOHIDEventSystemClientRef client, CFDictionaryRef match); +IOHIDEventRef IOHIDServiceClientCopyEvent(IOHIDServiceClientRef, int64_t , int32_t, int64_t); +CFStringRef IOHIDServiceClientCopyProperty(IOHIDServiceClientRef service, CFStringRef property); +IOHIDFloat IOHIDEventGetFloatValue(IOHIDEventRef event, int32_t field); diff --git a/Modules/Sensors/main.swift b/Modules/Sensors/main.swift index ea3b79a6..d585aeaa 100644 --- a/Modules/Sensors/main.swift +++ b/Modules/Sensors/main.swift @@ -19,8 +19,12 @@ public class Sensors: Module { private var settingsView: Settings public init() { - self.sensorsReader = SensorsReader() - self.settingsView = Settings("Sensors", list: &self.sensorsReader.list) + #if arch(x86_64) + self.sensorsReader = x86_SensorsReader() + #else + self.sensorsReader = AppleSilicon_SensorsReader() + #endif + self.settingsView = Settings("Sensors", list: self.sensorsReader.list) super.init( popup: self.popupView, diff --git a/Modules/Sensors/popup.swift b/Modules/Sensors/popup.swift index e40b4c57..3dac72ea 100644 --- a/Modules/Sensors/popup.swift +++ b/Modules/Sensors/popup.swift @@ -31,7 +31,7 @@ internal class Popup: NSView, Popup_p { return } - var types: [SensorType_t] = [] + var types: [SensorType] = [] values!.forEach { (s: Sensor_t) in if !types.contains(s.type) { types.append(s.type) @@ -43,9 +43,9 @@ internal class Popup: NSView, Popup_p { } var y: CGFloat = 0 - types.reversed().forEach { (typ: SensorType_t) in + types.reversed().forEach { (typ: SensorType) in let filtered = values!.filter{ $0.type == typ } - var groups: [SensorGroup_t] = [] + var groups: [SensorGroup] = [] filtered.forEach { (s: Sensor_t) in if !groups.contains(s.group) { groups.append(s.group) @@ -54,11 +54,11 @@ internal class Popup: NSView, Popup_p { let height: CGFloat = CGFloat((22*filtered.count)) + Constants.Popup.separatorHeight let view: NSView = NSView(frame: NSRect(x: 0, y: y, width: self.frame.width, height: height)) - let separator = SeparatorView(LocalizedString(typ), origin: NSPoint(x: 0, y: view.frame.height - Constants.Popup.separatorHeight), width: self.frame.width) + let separator = SeparatorView(LocalizedString(typ.rawValue), origin: NSPoint(x: 0, y: view.frame.height - Constants.Popup.separatorHeight), width: self.frame.width) view.addSubview(separator) var i: CGFloat = 0 - groups.reversed().forEach { (group: SensorGroup_t) in + groups.reversed().forEach { (group: SensorGroup) in filtered.reversed().filter{ $0.group == group }.forEach { (s: Sensor_t) in let (key, value) = PopupRow(view, n: i, title: "\(s.name):", value: s.formattedValue) key.toolTip = s.key diff --git a/Modules/Sensors/readers.swift b/Modules/Sensors/readers.swift index 5616faca..69145d18 100644 --- a/Modules/Sensors/readers.swift +++ b/Modules/Sensors/readers.swift @@ -13,10 +13,13 @@ import Cocoa import ModuleKit import StatsKit import os.log +import IOKit.hid internal class SensorsReader: Reader<[Sensor_t]> { internal var list: [Sensor_t] = [] - +} + +internal class x86_SensorsReader: SensorsReader { init() { super.init() @@ -52,21 +55,20 @@ internal class SensorsReader: Reader<[Sensor_t]> { } } - for (index, sensor) in list.enumerated().reversed() { + for sensor in list { if let newValue = SMC.shared.getValue(sensor.key) { - // Remove the temperature sensor, if SMC report more that 110 C degree. - if sensor.type == SensorType.Temperature.rawValue && newValue > 110 { - list.remove(at: index) - continue - } - if let idx = list.firstIndex(where: { $0.key == sensor.key }) { list[idx].value = newValue } } } - self.list = list + self.list = list.filter({ (s: Sensor_t) -> Bool in + if s.type == .temperature && s.value > 110 { + return false + } + return true + }) } public override func read() { @@ -78,3 +80,130 @@ internal class SensorsReader: Reader<[Sensor_t]> { self.callback(self.list) } } + +internal class AppleSilicon_SensorsReader: SensorsReader { + private let types: [SensorType] = [.temperature, .current, .voltage] + + init() { + super.init() + + for type in types { + for (name, value) in self.fetch(type: type) { + self.list.append(Sensor_t( + key: name, + name: name, + value: value, + group: .system, + type: type + )) + } + } + + self.list = self.list.filter({ (s: Sensor_t) -> Bool in + switch s.type { + case .temperature: + return s.value < 110 + case .voltage: + return s.value < 300 + case .current: + return s.value < 100 + default: return true + } + }) + } + + public override func read() { + for type in types { + for (name, value) in self.fetch(type: type) { + if let idx = self.list.firstIndex(where: { $0.name == name && $0.type == type }) { + self.list[idx].value = value + } + } + } + self.callback(self.list) + } + + private func fetch(type: SensorType) -> [String: Double] { + var list: [String: Double] = [:] + + var page: Int = 0 + var usage: Int = 0 + var eventType: Int32 = kIOHIDEventTypeTemperature + + // usagePage: + // kHIDPage_AppleVendor = 0xff00, + // kHIDPage_AppleVendorTemperatureSensor = 0xff05, + // kHIDPage_AppleVendorPowerSensor = 0xff08, + // kHIDPage_GenericDesktop + // + // usage: + // kHIDUsage_AppleVendor_TemperatureSensor = 0x0005, + // kHIDUsage_AppleVendorPowerSensor_Current = 0x0002, + // kHIDUsage_AppleVendorPowerSensor_Voltage = 0x0003, + // kHIDUsage_GD_Keyboard + // + + switch type { + case .temperature: + page = 0xff00 + usage = 0x0005 + eventType = kIOHIDEventTypeTemperature + case .current: + page = 0xff08 + usage = 0x0003 + eventType = kIOHIDEventTypePower + case .voltage: + page = 0xff08 + usage = 0x0002 + eventType = kIOHIDEventTypePower + case .power: break + case .fan: break + } + + guard let client = IOHIDEventSystemClientCreate(kCFAllocatorDefault) else { + return list + } + let system: IOHIDEventSystemClient = client.takeRetainedValue() + + let dict = createDeviceMatchingDictionary(usagePage: page, usage: usage) + IOHIDEventSystemClientSetMatching(system, dict) + + guard let services: CFArray = IOHIDEventSystemClientCopyServices(system) else { + return list + } + + for i in 0..? = IOHIDServiceClientCopyProperty(service.pointee, "Product" as CFString) + let eventPtr: IOHIDEventRef? = IOHIDServiceClientCopyEvent(service.pointee, Int64(eventType), 0, 0) + + guard let name = namePtr?.takeUnretainedValue() else { + return + } + var value: Double? = nil + + if eventPtr != nil { + value = IOHIDEventGetFloatValue(eventPtr, eventType << 16) + } + + if let value = value { + list[name as String] = value + } + } + } + + return list + } + + private func createDeviceMatchingDictionary(usagePage: Int, usage: Int) -> CFMutableDictionary { + let dict = [ + kIOHIDPrimaryUsageKey: usage, + kIOHIDPrimaryUsagePageKey: usagePage + ] as NSDictionary + + return dict.mutableCopy() as! NSMutableDictionary + } +} diff --git a/Modules/Sensors/settings.swift b/Modules/Sensors/settings.swift index 0d9ed6c8..afa937f9 100644 --- a/Modules/Sensors/settings.swift +++ b/Modules/Sensors/settings.swift @@ -18,11 +18,11 @@ internal class Settings: NSView, Settings_v { private let title: String private var button: NSPopUpButton? - private let list: UnsafeMutablePointer<[Sensor_t]> + private let list: [Sensor_t] public var callback: (() -> Void) = {} public var setInterval: ((_ value: Int) -> Void) = {_ in } - public init(_ title: String, list: UnsafeMutablePointer<[Sensor_t]>) { + public init(_ title: String, list: [Sensor_t]) { self.title = title self.list = list @@ -44,13 +44,13 @@ internal class Settings: NSView, Settings_v { } public func load(widgets: [widget_t]) { - guard !self.list.pointee.isEmpty else { + guard !self.list.isEmpty else { return } self.subviews.forEach{ $0.removeFromSuperview() } - var types: [SensorType_t] = [] - self.list.pointee.forEach { (s: Sensor_t) in + var types: [SensorType] = [] + self.list.forEach { (s: Sensor_t) in if !types.contains(s.type) { types.append(s.type) } @@ -58,7 +58,7 @@ internal class Settings: NSView, Settings_v { let rowHeight: CGFloat = 30 let settingsHeight: CGFloat = (rowHeight*1) + Constants.Settings.margin - let sensorsListHeight: CGFloat = (rowHeight+Constants.Settings.margin) * CGFloat(self.list.pointee.count) + ((rowHeight+Constants.Settings.margin) * CGFloat(types.count) + 1) + let sensorsListHeight: CGFloat = (rowHeight+Constants.Settings.margin) * CGFloat(self.list.count) + ((rowHeight+Constants.Settings.margin) * CGFloat(types.count) + 1) let height: CGFloat = settingsHeight + sensorsListHeight let x: CGFloat = height < 360 ? 0 : Constants.Settings.margin let view: NSView = NSView(frame: NSRect( @@ -77,16 +77,16 @@ internal class Settings: NSView, Settings_v { )) var y: CGFloat = 0 - types.reversed().forEach { (typ: SensorType_t) in - let filtered = self.list.pointee.filter{ $0.type == typ } - var groups: [SensorGroup_t] = [] + types.reversed().forEach { (typ: SensorType) in + let filtered = self.list.filter{ $0.type == typ } + var groups: [SensorGroup] = [] filtered.forEach { (s: Sensor_t) in if !groups.contains(s.group) { groups.append(s.group) } } - groups.reversed().forEach { (group: SensorGroup_t) in + groups.reversed().forEach { (group: SensorGroup) in filtered.reversed().filter{ $0.group == group }.forEach { (s: Sensor_t) in let row: NSView = ToggleTitleRow( frame: NSRect(x: 0, y: y, width: view.frame.width, height: rowHeight), @@ -103,7 +103,7 @@ internal class Settings: NSView, Settings_v { } let rowTitleView: NSView = NSView(frame: NSRect(x: 0, y: y, width: view.frame.width, height: rowHeight)) - let rowTitle: NSTextField = LabelField(frame: NSRect(x: 0, y: (rowHeight-19)/2, width: view.frame.width, height: 19), LocalizedString(typ)) + let rowTitle: NSTextField = LabelField(frame: NSRect(x: 0, y: (rowHeight-19)/2, width: view.frame.width, height: 19), LocalizedString(typ.rawValue)) rowTitle.font = NSFont.systemFont(ofSize: 14, weight: .regular) rowTitle.textColor = .secondaryLabelColor rowTitle.alignment = .center diff --git a/Modules/Sensors/values.swift b/Modules/Sensors/values.swift index 0c921bf9..2072adaa 100644 --- a/Modules/Sensors/values.swift +++ b/Modules/Sensors/values.swift @@ -11,20 +11,19 @@ import StatsKit -typealias SensorGroup_t = String -enum SensorGroup: SensorGroup_t { +enum SensorGroup: String { case CPU = "CPU" case GPU = "GPU" - case System = "Systems" - case Sensor = "Sensors" + case system = "Systems" + case sensor = "Sensors" } -typealias SensorType_t = String -enum SensorType: SensorType_t { - case Temperature = "Temperature" - case Voltage = "Voltage" - case Power = "Power" - case Fan = "Fan" +enum SensorType: String { + case temperature = "Temperature" + case voltage = "Voltage" + case current = "Current" + case power = "Power" + case fan = "Fan" } struct Sensor_t { @@ -33,20 +32,21 @@ struct Sensor_t { var value: Double = 0 - var group: SensorGroup_t - var type: SensorType_t + var group: SensorGroup + var type: SensorType var unit: String { get { switch self.type { - case SensorType.Temperature.rawValue: + case .temperature: return "°C" - case SensorType.Voltage.rawValue: + case .voltage: return "V" - case SensorType.Power.rawValue: + case .power: return "W" - case SensorType.Fan.rawValue: + case .current: + return "A" + case .fan: return "RPM" - default: return "" } } } @@ -54,34 +54,38 @@ struct Sensor_t { var formattedValue: String { get { switch self.type { - case SensorType.Temperature.rawValue: + case .temperature: return Temperature(value) - case SensorType.Voltage.rawValue: + case .voltage: let val = value >= 100 ? "\(Int(value))" : String(format: "%.3f", value) return "\(val)\(unit)" - case SensorType.Power.rawValue: + case .power: let val = value >= 100 ? "\(Int(value))" : String(format: "%.2f", value) return "\(val)\(unit)" - case SensorType.Fan.rawValue: + case .current: + let val = value >= 100 ? "\(Int(value))" : String(format: "%.2f", value) + return "\(val)\(unit)" + case .fan: return "\(Int(value)) \(unit)" - default: return String(format: "%.2f", value) } } } var formattedMiniValue: String { get { switch self.type { - case SensorType.Temperature.rawValue: + case .temperature: return Temperature(value).replacingOccurrences(of: "C", with: "").replacingOccurrences(of: "F", with: "") - case SensorType.Voltage.rawValue: + case .voltage: let val = value >= 100 ? "\(Int(value))" : String(format: "%.1f", value) return "\(val)\(unit)" - case SensorType.Power.rawValue: + case .power: let val = value >= 100 ? "\(Int(value))" : String(format: "%.1f", value) return "\(val)\(unit)" - case SensorType.Fan.rawValue: + case .current: + let val = value >= 100 ? "\(Int(value))" : String(format: "%.1f", value) + return "\(val)\(unit)" + case .fan: return "\(Int(value)) \(unit)" - default: return String(format: "%.1f", value) } } } @@ -100,78 +104,78 @@ struct Sensor_t { // List of keys: https://github.com/acidanthera/VirtualSMC/blob/master/Docs/SMCSensorKeys.txt let SensorsList: [Sensor_t] = [ /// Temperature - Sensor_t(key: "TA%P", name: "Ambient %", group: SensorGroup.Sensor.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "Th%H", name: "Heatpipe %", group: SensorGroup.Sensor.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TZ%C", name: "Termal zone %", group: SensorGroup.Sensor.rawValue, type: SensorType.Temperature.rawValue), + 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_t(key: "TC0D", name: "CPU diode", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TC0E", name: "CPU diode virtual", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TC0F", name: "CPU diode filtered", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TC0H", name: "CPU heatsink", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TC0P", name: "CPU proximity", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TCAD", name: "CPU package", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), + 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_t(key: "TC%c", name: "CPU core %", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TC%C", name: "CPU core %", group: SensorGroup.CPU.rawValue, type: SensorType.Temperature.rawValue), + 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_t(key: "TCGC", name: "GPU Intel Graphics", group: SensorGroup.GPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TG0D", name: "GPU diode", group: SensorGroup.GPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TGDD", name: "GPU AMD Radeon", group: SensorGroup.GPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TG0H", name: "GPU heatsink", group: SensorGroup.GPU.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TG0P", name: "GPU proximity", group: SensorGroup.GPU.rawValue, type: SensorType.Temperature.rawValue), + 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_t(key: "Tm0P", name: "Mainboard", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "Tp0P", name: "Powerboard", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TB1T", name: "Battery", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TW0P", name: "Airport", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TL0P", name: "Display", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TI%P", name: "Thunderbold %", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), + 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: "TN0D", name: "Northbridge diode", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TN0H", name: "Northbridge heatsink", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), - Sensor_t(key: "TN0P", name: "Northbridge proximity", group: SensorGroup.System.rawValue, type: SensorType.Temperature.rawValue), + 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), /// Voltage - Sensor_t(key: "VCAC", name: "CPU IA", group: SensorGroup.CPU.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VCSC", name: "CPU System Agent", group: SensorGroup.CPU.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VC%C", name: "CPU Core %", group: SensorGroup.CPU.rawValue, type: SensorType.Voltage.rawValue), + 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_t(key: "VCTC", name: "GPU Intel Graphics", group: SensorGroup.GPU.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VG0C", name: "GPU", group: SensorGroup.GPU.rawValue, type: SensorType.Voltage.rawValue), + Sensor_t(key: "VCTC", name: "GPU Intel Graphics", group: .GPU, type: .voltage), + Sensor_t(key: "VG0C", name: "GPU", group: .GPU, type: .voltage), - Sensor_t(key: "VM0R", name: "Memory", group: SensorGroup.System.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "Vb0R", name: "CMOS", group: SensorGroup.System.rawValue, type: SensorType.Voltage.rawValue), + Sensor_t(key: "VM0R", name: "Memory", group: .system, type: .voltage), + Sensor_t(key: "Vb0R", name: "CMOS", group: .system, type: .voltage), - Sensor_t(key: "VD0R", name: "DC In", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VP0R", name: "12V rail", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "Vp0C", name: "12V vcc", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VV2S", name: "3V", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VR3R", name: "3.3V", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VV1S", name: "5V", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VV9S", name: "12V", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), - Sensor_t(key: "VeES", name: "PCI 12V", group: SensorGroup.Sensor.rawValue, type: SensorType.Voltage.rawValue), + 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), /// Power - Sensor_t(key: "PC0C", name: "CPU Core", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCAM", name: "CPU Core (IMON)", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCPC", name: "CPU Package", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCTR", name: "CPU Total", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCPT", name: "CPU Package total", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCPR", name: "CPU Package total (SMC)", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PC0R", name: "CPU Computing high side", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PC0G", name: "CPU GFX", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCEC", name: "CPU VccEDRAM", group: SensorGroup.CPU.rawValue, type: SensorType.Power.rawValue), + 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_t(key: "PCPG", name: "GPU Intel Graphics", group: SensorGroup.GPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PG0R", name: "GPU", group: SensorGroup.GPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCGC", name: "Intel GPU", group: SensorGroup.GPU.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PCGM", name: "Intel GPU (IMON)", group: SensorGroup.GPU.rawValue, type: SensorType.Power.rawValue), + 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_t(key: "PC3C", name: "RAM", group: SensorGroup.Sensor.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PPBR", name: "Battery", group: SensorGroup.Sensor.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PDTR", name: "DC In", group: SensorGroup.Sensor.rawValue, type: SensorType.Power.rawValue), - Sensor_t(key: "PSTR", name: "System total", group: SensorGroup.Sensor.rawValue, type: SensorType.Power.rawValue), + 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: SensorGroup.Sensor.rawValue, type: SensorType.Fan.rawValue), + Sensor_t(key: "F%Ac", name: "Fan #%", group: .sensor, type: .fan), ] diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index feb94147..32577f1f 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -390,6 +390,7 @@ 9A343535243E26A0006B19F9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9A343536243E26A0006B19F9 /* LaunchAtLogin.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LaunchAtLogin.entitlements; sourceTree = ""; }; 9A34353A243E278D006B19F9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + 9A3616E82613C3D400D657B6 /* bridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bridge.h; sourceTree = ""; }; 9A3E17CC247A94AF00449CD1 /* Net.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Net.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9A3E17CF247A94AF00449CD1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9A3E17D8247A94B500449CD1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; @@ -858,6 +859,7 @@ 9AE29AF7249A53420071B02D /* values.swift */, 9AE29AEC249A50960071B02D /* Info.plist */, 9AE29AF4249A52870071B02D /* config.plist */, + 9A3616E82613C3D400D657B6 /* bridge.h */, ); path = Sensors; sourceTree = ""; @@ -2534,6 +2536,7 @@ PRODUCT_BUNDLE_IDENTIFIER = eu.exelban.Stats.Sensors; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = Modules/Sensors/bridge.h; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -2565,6 +2568,7 @@ PRODUCT_BUNDLE_IDENTIFIER = eu.exelban.Stats.Sensors; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = Modules/Sensors/bridge.h; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = "";