Added support for MacBookPro15,1 ( Mid 2018 )

Modified they way fans are controlled ( via FxTg instead of FxMn )
Added reset to auto mode on exit
This commit is contained in:
Wojciech Lazarski
2018-08-10 14:08:35 +02:00
parent 2308d9b194
commit e35ada4887
4 changed files with 119 additions and 34 deletions

View File

@ -42,6 +42,7 @@
// Number of fans reported by the hardware. // Number of fans reported by the hardware.
int g_numFans = 0; int g_numFans = 0;
NSUserDefaults *defaults; NSUserDefaults *defaults;
#pragma mark **Init-Methods** #pragma mark **Init-Methods**
@ -538,9 +539,22 @@ NSUserDefaults *defaults;
int i; int i;
[FanControl setRights]; [FanControl setRights];
[FavoritesController setSelectionIndex:cIndex]; [FavoritesController setSelectionIndex:cIndex];
for (i=0;i<[[FavoritesController arrangedObjects][cIndex][PREF_FAN_ARRAY] count];i++) {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMn",i] value:[[FanController arrangedObjects][i][PREF_FAN_SELSPEED] tohex]]; if ([[MachineDefaults computerModel] rangeOfString:@"MacBookPro15"].location != NSNotFound) {
} for (i=0;i<[[FavoritesController arrangedObjects][cIndex][PREF_FAN_ARRAY] count];i++) {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMd",i] value:@"01"];
float f_val = [[FanController arrangedObjects][i][PREF_FAN_SELSPEED] floatValue];
uint8 *vals = (uint8*)&f_val;
//NSString str_val = ;
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dTg",i] value:[NSString stringWithFormat:@"%02x%02x%02x%02x",vals[0],vals[1],vals[2],vals[3]]];
}
}
else {
for (i=0;i<[[FavoritesController arrangedObjects][cIndex][PREF_FAN_ARRAY] count];i++) {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMn",i] value:[[FanController arrangedObjects][i][PREF_FAN_SELSPEED] tohex]];
}
}
NSMenu *submenu = [[NSMenu alloc] init]; NSMenu *submenu = [[NSMenu alloc] init];
for(i=0;i<[[FavoritesController arrangedObjects] count];i++){ for(i=0;i<[[FavoritesController arrangedObjects] count];i++){
@ -659,7 +673,12 @@ NSUserDefaults *defaults;
NSLog(@"Error deleting %@",machinesPath); NSLog(@"Error deleting %@",machinesPath);
} }
error = nil; error = nil;
if ([[MachineDefaults computerModel] rangeOfString:@"MacBookPro15"].location != NSNotFound) {
for (int i=0;i<[[FavoritesController arrangedObjects][0][PREF_FAN_ARRAY] count];i++) {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMd",i] value:@"00"];
}
}
NSString *domainName = [[NSBundle mainBundle] bundleIdentifier]; NSString *domainName = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:domainName]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:domainName];

View File

@ -37,18 +37,44 @@ NSArray *allSensors;
SMCClose(conn); SMCClose(conn);
} }
+(int)convertToNumber:(SMCVal_t) val
{
float fval = -1.0f;
if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) {
memcpy(&fval,val.bytes,sizeof(float));
}
else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2) {
fval = _strtof(val.bytes, val.dataSize, 2);
}
else if (strcmp(val.dataType, DATATYPE_UINT16) == 0 && val.dataSize == 2) {
fval = (float)_strtoul((char *)val.bytes, val.dataSize, 10);
}
else if (strcmp(val.dataType, DATATYPE_UINT8) == 0 && val.dataSize == 1) {
fval = (float)val.bytes[0];
}
else if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2) {
fval = ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64;
}
else {
NSLog(@"%@", [NSString stringWithFormat:@"Unknown val:%s size-%d",val.dataType,val.dataSize]);
}
return (int)fval;
}
+(float)readTempSensors +(float)readTempSensors
{ {
float retValue; float retValue;
SMCVal_t val; SMCVal_t val;
NSString *sensor = [[NSUserDefaults standardUserDefaults] objectForKey:PREF_TEMPERATURE_SENSOR]; NSString *sensor = [[NSUserDefaults standardUserDefaults] objectForKey:PREF_TEMPERATURE_SENSOR];
SMCReadKey2((char*)[sensor UTF8String], &val,conn); SMCReadKey2((char*)[sensor UTF8String], &val,conn);
retValue= ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64; retValue = [self convertToNumber:val];
allSensors = [NSArray arrayWithObjects:@"TC0D",@"TC0P",@"TCAD",@"TC0H",@"TC0F",@"TCAH",@"TCBH",nil]; allSensors = [NSArray arrayWithObjects:@"TC0D",@"TC0P",@"TCAD",@"TC0H",@"TC0F",@"TCAH",@"TCBH",nil];
if (retValue<=0 || floor(retValue) == 129 ) { //workaround for some iMac Models if (retValue<=0 || floor(retValue) == 129 ) { //workaround for some iMac Models
for (NSString *sensor in allSensors) { for (NSString *sensor in allSensors) {
SMCReadKey2((char*)[sensor UTF8String], &val,conn); SMCReadKey2((char*)[sensor UTF8String], &val,conn);
retValue= ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64; retValue= [self convertToNumber:val];
if (retValue>0 && floor(retValue) != 129 ) { if (retValue>0 && floor(retValue) != 129 ) {
[[NSUserDefaults standardUserDefaults] setObject:sensor forKey:PREF_TEMPERATURE_SENSOR]; [[NSUserDefaults standardUserDefaults] setObject:sensor forKey:PREF_TEMPERATURE_SENSOR];
[[NSUserDefaults standardUserDefaults] synchronize]; [[NSUserDefaults standardUserDefaults] synchronize];
@ -86,8 +112,8 @@ NSArray *allSensors;
SMCReadKey2(keyA, &valA,conn); SMCReadKey2(keyA, &valA,conn);
sprintf(keyB, "TCBH"); sprintf(keyB, "TCBH");
SMCReadKey2(keyB, &valB,conn); SMCReadKey2(keyB, &valB,conn);
float c_tempA= ((valA.bytes[0] * 256 + valA.bytes[1]) >> 2)/64.0; float c_tempA= [self convertToNumber:valA];
float c_tempB= ((valB.bytes[0] * 256 + valB.bytes[1]) >> 2)/64.0; float c_tempB= [self convertToNumber:valB];
int i_tempA, i_tempB; int i_tempA, i_tempB;
if (c_tempA < c_tempB) if (c_tempA < c_tempB)
{ {
@ -107,7 +133,7 @@ NSArray *allSensors;
//kern_return_t result; //kern_return_t result;
sprintf(key, "F%dAc", fan_number); sprintf(key, "F%dAc", fan_number);
SMCReadKey2(key, &val,conn); SMCReadKey2(key, &val,conn);
int running= _strtof(val.bytes, val.dataSize, 2); int running= [self convertToNumber:val];
return running; return running;
} }
@ -116,7 +142,7 @@ NSArray *allSensors;
SMCVal_t val; SMCVal_t val;
int totalFans; int totalFans;
SMCReadKey2("FNum", &val,conn); SMCReadKey2("FNum", &val,conn);
totalFans = _strtoul((char *)val.bytes, val.dataSize, 10); totalFans = [self convertToNumber:val];
return totalFans; return totalFans;
} }
@ -126,17 +152,24 @@ NSArray *allSensors;
SMCVal_t val; SMCVal_t val;
//kern_return_t result; //kern_return_t result;
NSMutableString *desc; NSMutableString *desc;
// desc=[[NSMutableString alloc] initWithFormat:@"Fan #%d: ",fan_number+1];
desc=[[NSMutableString alloc]init]; sprintf(key, "F%dID", fan_number);
sprintf(key, "F%dID", fan_number); SMCReadKey2(key, &val,conn);
SMCReadKey2(key, &val,conn);
int i; if(val.dataSize>0){
for (i = 0; i < val.dataSize; i++) { desc=[[NSMutableString alloc]init];
if ((int)val.bytes[i]>32) { int i;
temp=(unsigned char)val.bytes[i]; for (i = 0; i < val.dataSize; i++) {
[desc appendFormat:@"%c",temp]; if ((int)val.bytes[i]>32) {
} temp=(unsigned char)val.bytes[i];
} [desc appendFormat:@"%c",temp];
}
}
}
else {
//On MacBookPro 15.1 descriptions aren't available
desc=[[NSMutableString alloc] initWithFormat:@"Fan #%d: ",fan_number+1];
}
return desc; return desc;
} }
@ -147,7 +180,7 @@ NSArray *allSensors;
//kern_return_t result; //kern_return_t result;
sprintf(key, "F%dMn", fan_number); sprintf(key, "F%dMn", fan_number);
SMCReadKey2(key, &val,conn); SMCReadKey2(key, &val,conn);
int min= _strtof(val.bytes, val.dataSize, 2); int min= [self convertToNumber:val];
return min; return min;
} }
@ -157,7 +190,7 @@ NSArray *allSensors;
//kern_return_t result; //kern_return_t result;
sprintf(key, "F%dMx", fan_number); sprintf(key, "F%dMx", fan_number);
SMCReadKey2(key, &val,conn); SMCReadKey2(key, &val,conn);
int max= _strtof(val.bytes, val.dataSize, 2); int max= [self convertToNumber:val];
return max; return max;
} }

View File

@ -1,6 +1,6 @@
/* /*
* Apple System Management Control (SMC) Tool * Apple System Management Control (SMC) Tool
* Copyright (C) 2006 devnull * Copyright (C) 2006 devnull
* Portions Copyright (C) 2013 Michael Wilber * Portions Copyright (C) 2013 Michael Wilber
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -58,7 +58,7 @@ UInt32 _strtoul(char *str, int size, int base)
void _ultostr(char *str, UInt32 val) void _ultostr(char *str, UInt32 val)
{ {
str[0] = '\0'; str[0] = '\0';
sprintf(str, "%c%c%c%c", sprintf(str, "%c%c%c%c",
(unsigned int) val >> 24, (unsigned int) val >> 24,
(unsigned int) val >> 16, (unsigned int) val >> 16,
(unsigned int) val >> 8, (unsigned int) val >> 8,
@ -83,6 +83,12 @@ float _strtof(unsigned char *str, int size, int e)
return total; return total;
} }
void printFLT(SMCVal_t val)
{
float fval;
memcpy(&fval,val.bytes,sizeof(float));
printf("%.0f ", fval);
}
void printFP1F(SMCVal_t val) void printFP1F(SMCVal_t val)
{ {
@ -218,6 +224,8 @@ void printVal(SMCVal_t val)
(strcmp(val.dataType, DATATYPE_UINT16) == 0) || (strcmp(val.dataType, DATATYPE_UINT16) == 0) ||
(strcmp(val.dataType, DATATYPE_UINT32) == 0)) (strcmp(val.dataType, DATATYPE_UINT32) == 0))
printUInt(val); printUInt(val);
else if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4)
printFLT(val);
else if (strcmp(val.dataType, DATATYPE_FP1F) == 0 && val.dataSize == 2) else if (strcmp(val.dataType, DATATYPE_FP1F) == 0 && val.dataSize == 2)
printFP1F(val); printFP1F(val);
else if (strcmp(val.dataType, DATATYPE_FP4C) == 0 && val.dataSize == 2) else if (strcmp(val.dataType, DATATYPE_FP4C) == 0 && val.dataSize == 2)
@ -504,6 +512,28 @@ kern_return_t SMCPrintAll(void)
return kIOReturnSuccess; return kIOReturnSuccess;
} }
//Fix me with other types
float getFloatFromVal(SMCVal_t val)
{
float fval = -1.0f;
if (val.dataSize > 0)
{
if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) {
memcpy(&fval,val.bytes,sizeof(float));
}
else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2) {
fval = _strtof(val.bytes, val.dataSize, 2);
}
else if (strcmp(val.dataType, DATATYPE_UINT16) == 0 && val.dataSize == 2) {
fval = (float)_strtoul((char *)val.bytes, val.dataSize, 10);
}
}
return fval;
}
kern_return_t SMCPrintFans(void) kern_return_t SMCPrintFans(void)
{ {
kern_return_t result; kern_return_t result;
@ -523,22 +553,24 @@ kern_return_t SMCPrintFans(void)
printf("\nFan #%d:\n", i); printf("\nFan #%d:\n", i);
sprintf(key, "F%dID", i); sprintf(key, "F%dID", i);
SMCReadKey(key, &val); SMCReadKey(key, &val);
printf(" Fan ID : %s\n", val.bytes+4); if(val.dataSize > 0) {
sprintf(key, "F%dAc", i); printf(" Fan ID : %s\n", val.bytes+4);
SMCReadKey(key, &val); }
printf(" Actual speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2)); sprintf(key, "F%dAc", i);
SMCReadKey(key, &val);
printf(" Actual speed : %.0f\n", getFloatFromVal(val));
sprintf(key, "F%dMn", i); sprintf(key, "F%dMn", i);
SMCReadKey(key, &val); SMCReadKey(key, &val);
printf(" Minimum speed: %.0f\n", _strtof(val.bytes, val.dataSize, 2)); printf(" Minimum speed: %.0f\n", getFloatFromVal(val));
sprintf(key, "F%dMx", i); sprintf(key, "F%dMx", i);
SMCReadKey(key, &val); SMCReadKey(key, &val);
printf(" Maximum speed: %.0f\n", _strtof(val.bytes, val.dataSize, 2)); printf(" Maximum speed: %.0f\n", getFloatFromVal(val));
sprintf(key, "F%dSf", i); sprintf(key, "F%dSf", i);
SMCReadKey(key, &val); SMCReadKey(key, &val);
printf(" Safe speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2)); printf(" Safe speed : %.0f\n", getFloatFromVal(val));
sprintf(key, "F%dTg", i); sprintf(key, "F%dTg", i);
SMCReadKey(key, &val); SMCReadKey(key, &val);
printf(" Target speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2)); printf(" Target speed : %.0f\n", getFloatFromVal(val));
SMCReadKey("FS! ", &val); SMCReadKey("FS! ", &val);
if ((_strtoul((char *)val.bytes, 2, 16) & (1 << i)) == 0) if ((_strtoul((char *)val.bytes, 2, 16) & (1 << i)) == 0)
printf(" Mode : auto\n"); printf(" Mode : auto\n");

View File

@ -40,6 +40,7 @@
#define SMC_CMD_READ_PLIMIT 11 #define SMC_CMD_READ_PLIMIT 11
#define SMC_CMD_READ_VERS 12 #define SMC_CMD_READ_VERS 12
#define DATATYPE_FLT "flt "
#define DATATYPE_FP1F "fp1f" #define DATATYPE_FP1F "fp1f"
#define DATATYPE_FP4C "fp4c" #define DATATYPE_FP4C "fp4c"
#define DATATYPE_FP5B "fp5b" #define DATATYPE_FP5B "fp5b"