Skip to content

Commit 810adc6

Browse files
committed
Detect minimum and maximum fan speeds
Default to previous values if detection fails. Configuration can still override these values. Fixes #114.
1 parent 4a3ea93 commit 810adc6

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

src/main.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,48 @@ void check_requirements()
9898
}
9999

100100

101+
static int read_value(const char *path)
102+
{
103+
int value = -1;
104+
FILE *file = fopen(path, "r");
105+
if (file != NULL) {
106+
fscanf(file, "%d", &value);
107+
fclose(file);
108+
}
109+
return value;
110+
}
111+
112+
113+
static void set_defaults(void)
114+
{
115+
int i;
116+
char *path;
117+
int value;
118+
for (i = 1; i <= 10; ++i) {
119+
path = smprintf("%s/fan%d_min", APPLESMC_PATH, i);
120+
value = read_value(path);
121+
if (value != -1 && (min_fan_speed == -1 || value < min_fan_speed)) {
122+
min_fan_speed = value;
123+
}
124+
free(path);
125+
126+
path = smprintf("%s/fan%d_max", APPLESMC_PATH, i);
127+
value = read_value(path);
128+
if (value != -1 && (max_fan_speed == -1 || value > max_fan_speed)) {
129+
max_fan_speed = value;
130+
}
131+
free(path);
132+
}
133+
134+
if (min_fan_speed == -1) {
135+
min_fan_speed = 2000;
136+
}
137+
if (max_fan_speed == -1) {
138+
max_fan_speed = 6200;
139+
}
140+
}
141+
142+
101143
int main(int argc, char *argv[])
102144
{
103145

@@ -133,6 +175,7 @@ int main(int argc, char *argv[])
133175

134176

135177
check_requirements();
178+
set_defaults();
136179

137180
// pointer to mbpfan() function in mbpfan.c
138181
void (*fan_control)() = mbpfan;

src/mbpfan.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@
4646
#define min(a,b) ((a) < (b) ? (a) : (b))
4747
#define max(a,b) ((a) > (b) ? (a) : (b))
4848

49-
int min_fan_speed = 2000;
50-
int max_fan_speed = 6200;
49+
// TODO: per-fan minimum and maximum?
50+
int min_fan_speed = -1;
51+
int max_fan_speed = -1;
5152

5253
/* temperature thresholds
5354
* low_temp - temperature below which fan speed will be at minimum
@@ -63,8 +64,7 @@ t_sensors* sensors = NULL;
6364
t_fans* fans = NULL;
6465

6566

66-
static char *smprintf(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
67-
static char *smprintf(const char *fmt, ...)
67+
char *smprintf(const char *fmt, ...)
6868
{
6969
char *buf;
7070
int cnt;
@@ -498,6 +498,17 @@ void mbpfan()
498498

499499
retrieve_settings(NULL);
500500

501+
if (min_fan_speed > max_fan_speed) {
502+
syslog(LOG_INFO, "Invalid fan speeds: %d %d", min_fan_speed, max_fan_speed);
503+
printf("Invalid fan speeds: %d %d\n", min_fan_speed, max_fan_speed);
504+
exit(EXIT_FAILURE);
505+
}
506+
if (low_temp > high_temp || high_temp > max_temp) {
507+
syslog(LOG_INFO, "Invalid temperatures: %d %d %d", low_temp, high_temp, max_temp);
508+
printf("Invalid temperatures: %d %d %d\n", low_temp, high_temp, max_temp);
509+
exit(EXIT_FAILURE);
510+
}
511+
501512
sensors = retrieve_sensors();
502513
fans = retrieve_fans();
503514
set_fans_man(fans);

src/mbpfan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ typedef struct s_sensors t_sensors;
4343
struct s_fans;
4444
typedef struct s_fans t_fans;
4545

46+
char *smprintf(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
47+
4648
/**
4749
* Return true if the kernel is < 3.15.0
4850
*/

0 commit comments

Comments
 (0)