Use SMC for temp and only use IOHIDSensor based on a whitelist for when SMC is unavailable

This commit is contained in:
Raafat Akkad
2022-12-03 14:47:15 +00:00
parent 346eceb501
commit 23b6083523
6 changed files with 35 additions and 26 deletions

View File

@ -25,7 +25,7 @@
#import "NSFileManager+DirectoryLocations.h"
#import "smc.h"
#import "smcWrapper.h"
#import "IOKitSensor.h"
#import "IOHIDSensor.h"
#import "MachineDefaults.h"
#import "Power.h"

View File

@ -151,7 +151,7 @@ NSUserDefaults *defaults;
@0, PREF_CHARGING_SELECTION,
@0, PREF_MENU_DISPLAYMODE,
#if TARGET_CPU_ARM64
@"",PREF_TEMPERATURE_SENSOR,
@"Tp0D",PREF_TEMPERATURE_SENSOR,
#else
@"TC0D",PREF_TEMPERATURE_SENSOR,
#endif
@ -338,6 +338,13 @@ NSUserDefaults *defaults;
}
- (BOOL)usesIOHIDForTemperature {
#if TARGET_CPU_ARM64
return [[MachineDefaults computerModel] rangeOfString:@"MacBookPro17"].length > 0;
#else
return false;
#endif
}
// Called via a timer mechanism. This is where all the temp / RPM reading is done.
//reads fan data and updates the gui
@ -403,11 +410,11 @@ NSUserDefaults *defaults;
if (bNeedTemp == true) {
// Read current temperature and format text for the menubar.
#if TARGET_CPU_ARM64
c_temp = [IOKitSensor getSOCTemperature];
#else
c_temp = [smcWrapper get_maintemp];
#endif
if ([self usesIOHIDForTemperature]) {
c_temp = [IOHIDSensor getSOCTemperature];
} else {
c_temp = [smcWrapper get_maintemp];
}
if ([[defaults objectForKey:PREF_TEMP_UNIT] intValue]==0) {
temp = [NSString stringWithFormat:@"%@%CC",@(c_temp),(unsigned short)0xb0];
@ -543,13 +550,13 @@ NSUserDefaults *defaults;
}
-(void)setFansToAuto:(bool)is_auto {
for (int fan_index=0;fan_index<[[FavoritesController arrangedObjects][0][PREF_FAN_ARRAY] count];fan_index++) {
[self setFanToAuto:fan_index is_auto:is_auto];
}
for (int fan_index=0;fan_index<[[FavoritesController arrangedObjects][0][PREF_FAN_ARRAY] count];fan_index++) {
[self setFanToAuto:fan_index is_auto:is_auto];
}
}
-(void)setFanToAuto:(int)fan_index is_auto:(bool)is_auto {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMd",fan_index] value:is_auto ? @"00" : @"01"];
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMd",fan_index] value:is_auto ? @"00" : @"01"];
}
//set the new fan settings
@ -750,8 +757,8 @@ NSUserDefaults *defaults;
- (void)systemWillSleep:(id)sender{
#if TARGET_CPU_ARM64
[FanControl setRights];
[self setFansToAuto:true];
[FanControl setRights];
[self setFansToAuto:true];
#endif
}

View File

@ -49,7 +49,7 @@ void IOHIDEventSystemClientSetMatching(IOHIDEventSystemClientRef, CFDictionaryRe
IOHIDEventRef IOHIDServiceClientCopyEvent(IOHIDServiceClientRef, int64_t, int32_t, int64_t);
IOHIDFloat IOHIDEventGetFloatValue(IOHIDEventRef event, uint32_t field);
@interface IOKitSensor : NSObject {
@interface IOHIDSensor : NSObject {
}
+ (float) getSOCTemperature;

View File

@ -20,13 +20,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#import "IOKitSensor.h"
#import "IOHIDSensor.h"
@implementation IOKitSensor
@implementation IOHIDSensor
static BOOL isSOCSensor(CFStringRef sensorName) {
return CFStringHasPrefix(sensorName, CFSTR("PMU")) &&
!CFStringHasSuffix(sensorName, CFSTR("tcal")); // Ignore "PMU tcal" as it seems static
return CFStringFind(sensorName, CFSTR("SOC"), kCFCompareCaseInsensitive).location != kCFNotFound;
}
static float toOneDecimalPlace(float value) {
@ -34,7 +33,6 @@ static float toOneDecimalPlace(float value) {
}
+ (float) getSOCTemperature {
IOHIDEventSystemClientRef eventSystemClient = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
CFArrayRef services = IOHIDEventSystemClientCopyServices(eventSystemClient);
if (services) {
@ -62,7 +60,7 @@ static float toOneDecimalPlace(float value) {
CFRelease(services);
CFRelease(eventSystemClient);
float avgSOCTemp = socSensorCount > 0 ? socSensorSum / socSensorCount: 0.0f;
float avgSOCTemp = socSensorCount > 0 ? socSensorSum / socSensorCount : 0.0f;
return toOneDecimalPlace(avgSOCTemp);
}

View File

@ -70,7 +70,11 @@ NSArray *allSensors;
NSString *sensor = [[NSUserDefaults standardUserDefaults] objectForKey:PREF_TEMPERATURE_SENSOR];
SMCReadKey2((char*)[sensor UTF8String], &val,conn);
retValue = [self convertToNumber:val];
#if TARGET_CPU_ARM64
allSensors = [NSArray arrayWithObjects:@"Tp01",@"Tp05",@"Tp09",@"Tp0b",@"Tp0D",@"Tp0H",@"Tp0L",@"Tp0P",@"Tp0T",@"Tp0X",nil];
#else
allSensors = [NSArray arrayWithObjects:@"TC0D",@"TC0P",@"TCAD",@"TC0H",@"TC0F",@"TCAH",@"TCBH",nil];
#endif
if (retValue<=0 || floor(retValue) == 129 ) { //workaround for some iMac Models
for (NSString *sensor in allSensors) {
SMCReadKey2((char*)[sensor UTF8String], &val,conn);