feat: init apple silicon sensors (#210)

This commit is contained in:
Serhiy Mytrovtsiy
2021-04-10 15:50:02 +02:00
parent 3ac95f9952
commit e2de518b75
7 changed files with 284 additions and 112 deletions

31
Modules/Sensors/bridge.h Normal file
View File

@@ -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 <IOKit/hidsystem/IOHIDEventSystemClient.h>
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);

View File

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

View File

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

View File

@@ -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..<CFArrayGetCount(services) {
var value = CFArrayGetValueAtIndex(services, i)
withUnsafePointer(to: &value) { rawPtr in
let service = UnsafeRawPointer(rawPtr).assumingMemoryBound(to: IOHIDServiceClientRef.self)
let namePtr: Unmanaged<CFString>? = 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
}
}

View File

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

View File

@@ -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),
]

View File

@@ -390,6 +390,7 @@
9A343535243E26A0006B19F9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9A343536243E26A0006B19F9 /* LaunchAtLogin.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LaunchAtLogin.entitlements; sourceTree = "<group>"; };
9A34353A243E278D006B19F9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
9A3616E82613C3D400D657B6 /* bridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bridge.h; sourceTree = "<group>"; };
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 = "<group>"; };
9A3E17D8247A94B500449CD1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
@@ -858,6 +859,7 @@
9AE29AF7249A53420071B02D /* values.swift */,
9AE29AEC249A50960071B02D /* Info.plist */,
9AE29AF4249A52870071B02D /* config.plist */,
9A3616E82613C3D400D657B6 /* bridge.h */,
);
path = Sensors;
sourceTree = "<group>";
@@ -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 = "";