Skip to content

Commit

Permalink
feat: add interval option
Browse files Browse the repository at this point in the history
  • Loading branch information
narugit committed Aug 18, 2024
1 parent 1c3d3cb commit 17cb9ae
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,25 @@ Usage:
-c : list CPU temperatures (Celsius)
-g : list GPU temperatures (Celsius)
-h : help
-i : set interval in milliseconds (e.g. -i25, valid range is 20-1000, default: 1000)
-l : list all keys and values
-f : fail-soft mode to store recent valid sensor value
-v : version
-n : tries to query the temperature sensors for n times (e.g. -n3) (1 second interval) until a valid value is returned
-n : tries to query the temperature sensors for n times (e.g. -n3) until a valid value is returned

$ smctemp -c
64.2

$ smctemp -g
36.2
```

## Note for M2 Mac Users
On M2 Macs, sensor values may be unstable as described in the following issue:
- https://github.com/narugit/smctemp/pull/14
- https://github.com/narugit/smctemp/issues/32

For M2 Macs, using the `-n`, `-i`, and `-f` options can help obtain more stable sensor values.
Try tuning these options to get better results.

The recommended settings are `-i25 -n40 -f` (See also https://github.com/narugit/smctemp/issues/32#issuecomment-2287304793).
23 changes: 21 additions & 2 deletions main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ void usage(char* prog) {
std::cout << " -c : list CPU temperatures (Celsius)" << std::endl;
std::cout << " -g : list GPU temperatures (Celsius)" << std::endl;
std::cout << " -h : help" << std::endl;
std::cout << " -i : set interval in milliseconds (e.g. -i25, valid range is 20-1000, default: 1000)"
<< std::endl;
std::cout << " -l : list all keys and values" << std::endl;
std::cout << " -f : fail-soft mode to store recent valid sensor value" << std::endl;
std::cout << " -v : version" << std::endl;
Expand All @@ -21,19 +23,31 @@ void usage(char* prog) {
int main(int argc, char *argv[]) {
int c;
unsigned int attempts = 1;
unsigned int interval_ms = 1'000;

kern_return_t result;
int op = smctemp::kOpNone;
bool isFailSoft = false;

while ((c = getopt(argc, argv, "clvfhn:g")) != -1) {
while ((c = getopt(argc, argv, "clvfhn:gi:")) != -1) {
switch(c) {
case 'c':
op = smctemp::kOpReadCpuTemp;
break;
case 'g':
op = smctemp::kOpReadGpuTemp;
break;
case 'i':
if (optarg) {
unsigned int temp_interval;
auto [ptr, ec] = std::from_chars(optarg, optarg + strlen(optarg), temp_interval);
if (ec != std::errc() || temp_interval < 20 || temp_interval > 1000) {
std::cerr << "Invalid argument provided for -i (integer between 20 and 1000 is required)" << std::endl;
return 1;
}
interval_ms = temp_interval;
}
break;
case 'n':
if (optarg) {
auto [ptr, ec] = std::from_chars(optarg, optarg + strlen(optarg), attempts);
Expand Down Expand Up @@ -91,7 +105,7 @@ int main(int argc, char *argv[]) {
if (smc_temp.IsValidTemperature(temp, valid_temperature_limits)) {
break;
} else {
usleep(1'000'000);
usleep(interval_ms * 1'000);
attempts--;
}
}
Expand All @@ -105,6 +119,11 @@ int main(int argc, char *argv[]) {
}
}
std::cout << std::fixed << std::setprecision(1) << temp << std::endl;
if (temp == 0.0) {
std::cerr << "Could not get valid sensor value. Please use `-n` option and `-i` option." << std::endl;
std::cerr << "In M2 Mac, it would be work fine with `-i25 -n40 -f` options.`" << std::endl;
return 1;
}
break;
}

Expand Down

0 comments on commit 17cb9ae

Please sign in to comment.