#include #include #include #define max(a,b) (a < b) ? b : a void tempmon(int target, int crit); int main(void) { const int temp_target = 55, temp_crit = 80; while (1) { tempmon(temp_target, temp_crit); sleep(1); } return (0); } void tempmon(int target, int crit) { int tempa, tempb, maxtemp, i; size_t temp_size = sizeof(tempa); const char *fans[] = {"backside", "cpu_a_intake", "cpu_b_intake", "cpu_a_exhaust", "cpu_b_exhaust", NULL}; double factor; sysctlbyname("dev.smusat.0.cpu_a0_diode_temp", &tempa, &temp_size, NULL, 0); sysctlbyname("dev.smusat.0.cpu_a1_diode_temp", &tempb, &temp_size, NULL, 0); printf("Temps: %d/%d\n", tempa, tempb); maxtemp = max(tempa, tempb); factor = (double)(maxtemp - target) / (double)(crit - target); printf("Fractional Excess: %lf\n", factor); if (factor < 0) factor = 0; for (i = 0; fans[i] != NULL; i++) { const char *fan; char sysctlname[64]; int fanmin, fanmax, fanrpm; fan = fans[i]; sprintf(sysctlname, "dev.smu.0.fans.%s.minrpm", fan); sysctlbyname(sysctlname, &fanmin, &temp_size, NULL, 0); sprintf(sysctlname, "dev.smu.0.fans.%s.maxrpm", fan); sysctlbyname(sysctlname, &fanmax, &temp_size, NULL, 0); fanrpm = factor*(fanmax - fanmin) + fanmin; printf("Setting fan %s to %d RPM\n", fan, fanrpm); sprintf(sysctlname, "dev.smu.0.fans.%s.rpm", fan); sysctlbyname(sysctlname, NULL, NULL, &fanrpm, temp_size); } }