mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
feat: init apple silicon sensors (#210)
This commit is contained in:
31
Modules/Sensors/bridge.h
Normal file
31
Modules/Sensors/bridge.h
Normal 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);
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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),
|
||||
]
|
||||
|
||||
@@ -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 = "";
|
||||
|
||||
Reference in New Issue
Block a user