diff --git a/README.md b/README.md index fa0fcfb..d6108b2 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,10 @@ 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 -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 @@ -38,3 +39,13 @@ $ smctemp -c $ 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` and `-i` options can help obtain more stable sensor values. +Try tuning these options to get better results. + +The recommended settings are `-i25 -n1000` (See also https://github.com/narugit/smctemp/issues/32#issuecomment-2287304793). diff --git a/main.cc b/main.cc index 8fbe24f..6f88c60 100644 --- a/main.cc +++ b/main.cc @@ -11,6 +11,7 @@ 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 << " -v : version" << std::endl; std::cout << " -n : tries to query the temperature sensors for n times (e.g. -n3)"; @@ -20,11 +21,12 @@ 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; - while ((c = getopt(argc, argv, "clvhn:g")) != -1) { + while ((c = getopt(argc, argv, "clvhn:gi:")) != -1) { switch(c) { case 'c': op = smctemp::kOpReadCpuTemp; @@ -32,6 +34,17 @@ int main(int argc, char *argv[]) { 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); @@ -85,11 +98,15 @@ int main(int argc, char *argv[]) { if (temp > 0.0) { break; } else { - usleep(1'000'000); + usleep(interval_ms * 1'000); attempts--; } } 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 -n1000` options.`" << std::endl; + } break; }