mirror of
https://github.com/hholtmann/smcFanControl.git
synced 2025-11-04 19:49:16 +01:00
Merge pull request #6 from denis2342/master
fixes the decoding of int values. this is important for the correct readout of the number of keys
This commit is contained in:
@ -37,7 +37,7 @@ UInt32 _strtoul(char *str, int size, int base)
|
||||
if (base == 16)
|
||||
total += str[i] << (size - 1 - i) * 8;
|
||||
else
|
||||
total += (unsigned char) (str[i] << (size - 1 - i) * 8);
|
||||
total += ((unsigned char) (str[i]) << (size - 1 - i) * 8);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
@ -52,7 +52,7 @@ void _ultostr(char *str, UInt32 val)
|
||||
(unsigned int) val);
|
||||
}
|
||||
|
||||
float _strtof(char *str, int size, int e)
|
||||
float _strtof(unsigned char *str, int size, int e)
|
||||
{
|
||||
float total = 0;
|
||||
int i;
|
||||
@ -65,6 +65,8 @@ float _strtof(char *str, int size, int e)
|
||||
total += str[i] << (size - 1 - i) * (8 - e);
|
||||
}
|
||||
|
||||
total += (str[size-1] & 0x03) * 0.25;
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
@ -75,11 +77,50 @@ void smc_init(){
|
||||
void smc_close(){
|
||||
SMCClose(conn);
|
||||
}
|
||||
|
||||
void printFP1F(SMCVal_t val)
|
||||
{
|
||||
printf("%.5f ", ntohs(*(UInt16*)val.bytes) / 32768.0);
|
||||
}
|
||||
|
||||
void printFP4C(SMCVal_t val)
|
||||
{
|
||||
printf("%.5f ", ntohs(*(UInt16*)val.bytes) / 4096.0);
|
||||
}
|
||||
|
||||
void printFP5B(SMCVal_t val)
|
||||
{
|
||||
printf("%.5f ", ntohs(*(UInt16*)val.bytes) / 2048.0);
|
||||
}
|
||||
|
||||
void printFP6A(SMCVal_t val)
|
||||
{
|
||||
printf("%.4f ", ntohs(*(UInt16*)val.bytes) / 1024.0);
|
||||
}
|
||||
|
||||
void printFP79(SMCVal_t val)
|
||||
{
|
||||
printf("%.4f ", ntohs(*(UInt16*)val.bytes) / 512.0);
|
||||
}
|
||||
|
||||
void printFP88(SMCVal_t val)
|
||||
{
|
||||
printf("%.3f ", ntohs(*(UInt16*)val.bytes) / 256.0);
|
||||
}
|
||||
|
||||
void printFPA6(SMCVal_t val)
|
||||
{
|
||||
printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 64.0);
|
||||
}
|
||||
|
||||
void printFPC4(SMCVal_t val)
|
||||
{
|
||||
printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 16.0);
|
||||
}
|
||||
|
||||
void printFPE2(SMCVal_t val)
|
||||
{
|
||||
/* FIXME: This decode is incomplete, last 2 bits are dropped */
|
||||
|
||||
printf("%.0f ", _strtof(val.bytes, val.dataSize, 2));
|
||||
printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 4.0);
|
||||
}
|
||||
|
||||
void printUInt(SMCVal_t val)
|
||||
@ -87,6 +128,71 @@ void printUInt(SMCVal_t val)
|
||||
printf("%u ", (unsigned int) _strtoul(val.bytes, val.dataSize, 10));
|
||||
}
|
||||
|
||||
void printSP1E(SMCVal_t val)
|
||||
{
|
||||
printf("%.5f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 16384.0);
|
||||
}
|
||||
|
||||
void printSP3C(SMCVal_t val)
|
||||
{
|
||||
printf("%.5f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 4096.0);
|
||||
}
|
||||
|
||||
void printSP4B(SMCVal_t val)
|
||||
{
|
||||
printf("%.4f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 2048.0);
|
||||
}
|
||||
|
||||
void printSP5A(SMCVal_t val)
|
||||
{
|
||||
printf("%.4f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 1024.0);
|
||||
}
|
||||
|
||||
void printSP69(SMCVal_t val)
|
||||
{
|
||||
printf("%.3f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 512.0);
|
||||
}
|
||||
|
||||
void printSP78(SMCVal_t val)
|
||||
{
|
||||
printf("%.3f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 256.0);
|
||||
}
|
||||
|
||||
void printSP87(SMCVal_t val)
|
||||
{
|
||||
printf("%.3f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 128.0);
|
||||
}
|
||||
|
||||
void printSP96(SMCVal_t val)
|
||||
{
|
||||
printf("%.2f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 64.0);
|
||||
}
|
||||
|
||||
void printSPB4(SMCVal_t val)
|
||||
{
|
||||
printf("%.2f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 16.0);
|
||||
}
|
||||
|
||||
void printSPF0(SMCVal_t val)
|
||||
{
|
||||
printf("%.0f ", (float)ntohs(*(UInt16*)val.bytes));
|
||||
}
|
||||
|
||||
void printSI8(SMCVal_t val)
|
||||
{
|
||||
printf("%d ", (signed char)*val.bytes);
|
||||
}
|
||||
|
||||
void printSI16(SMCVal_t val)
|
||||
{
|
||||
printf("%d ", ntohs(*(SInt16*)val.bytes));
|
||||
}
|
||||
|
||||
void printPWM(SMCVal_t val)
|
||||
{
|
||||
printf("%.1f%% ", ntohs(*(UInt16*)val.bytes) * 100 / 65536.0);
|
||||
}
|
||||
|
||||
void printBytesHex(SMCVal_t val)
|
||||
{
|
||||
int i;
|
||||
@ -106,8 +212,50 @@ void printVal(SMCVal_t val)
|
||||
(strcmp(val.dataType, DATATYPE_UINT16) == 0) ||
|
||||
(strcmp(val.dataType, DATATYPE_UINT32) == 0))
|
||||
printUInt(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FPE2) == 0)
|
||||
else if (strcmp(val.dataType, DATATYPE_FP1F) == 0 && val.dataSize == 2)
|
||||
printFP1F(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FP4C) == 0 && val.dataSize == 2)
|
||||
printFP4C(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FP5B) == 0 && val.dataSize == 2)
|
||||
printFP5B(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FP6A) == 0 && val.dataSize == 2)
|
||||
printFP6A(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FP79) == 0 && val.dataSize == 2)
|
||||
printFP79(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FP88) == 0 && val.dataSize == 2)
|
||||
printFP88(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FPA6) == 0 && val.dataSize == 2)
|
||||
printFPA6(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FPC4) == 0 && val.dataSize == 2)
|
||||
printFPC4(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2)
|
||||
printFPE2(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP1E) == 0 && val.dataSize == 2)
|
||||
printSP1E(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP3C) == 0 && val.dataSize == 2)
|
||||
printSP3C(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP4B) == 0 && val.dataSize == 2)
|
||||
printSP4B(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP5A) == 0 && val.dataSize == 2)
|
||||
printSP5A(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP69) == 0 && val.dataSize == 2)
|
||||
printSP69(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2)
|
||||
printSP78(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP87) == 0 && val.dataSize == 2)
|
||||
printSP87(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SP96) == 0 && val.dataSize == 2)
|
||||
printSP96(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SPB4) == 0 && val.dataSize == 2)
|
||||
printSPB4(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SPF0) == 0 && val.dataSize == 2)
|
||||
printSPF0(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SI8) == 0 && val.dataSize == 1)
|
||||
printSI8(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_SI16) == 0 && val.dataSize == 2)
|
||||
printSI16(val);
|
||||
else if (strcmp(val.dataType, DATATYPE_PWM) == 0 && val.dataSize == 2)
|
||||
printPWM(val);
|
||||
|
||||
printBytesHex(val);
|
||||
}
|
||||
@ -381,6 +529,9 @@ kern_return_t SMCPrintFans(void)
|
||||
for (i = 0; i < totalFans; i++)
|
||||
{
|
||||
printf("\nFan #%d:\n", i);
|
||||
sprintf(key, "F%dID", i);
|
||||
SMCReadKey(key, &val);
|
||||
printf(" Fan ID : %s\n", val.bytes+4);
|
||||
sprintf(key, "F%dAc", i);
|
||||
SMCReadKey(key, &val);
|
||||
printf(" Actual speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2));
|
||||
|
||||
@ -38,11 +38,36 @@
|
||||
#define SMC_CMD_READ_PLIMIT 11
|
||||
#define SMC_CMD_READ_VERS 12
|
||||
|
||||
#define DATATYPE_FP1F "fp1f"
|
||||
#define DATATYPE_FP4C "fp4c"
|
||||
#define DATATYPE_FP5B "fp5b"
|
||||
#define DATATYPE_FP6A "fp6a"
|
||||
#define DATATYPE_FP79 "fp79"
|
||||
#define DATATYPE_FP88 "fp88"
|
||||
#define DATATYPE_FPA6 "fpa6"
|
||||
#define DATATYPE_FPC4 "fpc4"
|
||||
#define DATATYPE_FPE2 "fpe2"
|
||||
|
||||
#define DATATYPE_SP1E "sp1e"
|
||||
#define DATATYPE_SP3C "sp3c"
|
||||
#define DATATYPE_SP4B "sp4b"
|
||||
#define DATATYPE_SP5A "sp5a"
|
||||
#define DATATYPE_SP69 "sp69"
|
||||
#define DATATYPE_SP78 "sp78"
|
||||
#define DATATYPE_SP87 "sp87"
|
||||
#define DATATYPE_SP96 "sp96"
|
||||
#define DATATYPE_SPB4 "spb4"
|
||||
#define DATATYPE_SPF0 "spf0"
|
||||
|
||||
#define DATATYPE_UINT8 "ui8 "
|
||||
#define DATATYPE_UINT16 "ui16"
|
||||
#define DATATYPE_UINT32 "ui32"
|
||||
|
||||
#define DATATYPE_SI8 "si8 "
|
||||
#define DATATYPE_SI16 "si16"
|
||||
|
||||
#define DATATYPE_PWM "{pwm"
|
||||
|
||||
typedef struct {
|
||||
char major;
|
||||
char minor;
|
||||
@ -65,7 +90,7 @@ typedef struct {
|
||||
char dataAttributes;
|
||||
} SMCKeyData_keyInfo_t;
|
||||
|
||||
typedef char SMCBytes_t[32];
|
||||
typedef unsigned char SMCBytes_t[32];
|
||||
|
||||
typedef struct {
|
||||
UInt32 key;
|
||||
@ -97,5 +122,4 @@ kern_return_t SMCClose(io_connect_t conn);
|
||||
void smc_init();
|
||||
void smc_close();
|
||||
|
||||
float _strtof(char *str, int size, int e);
|
||||
|
||||
float _strtof(unsigned char *str, int size, int e);
|
||||
|
||||
Reference in New Issue
Block a user