On Mon, 2003-02-03 at 21:31, Ralph Siemsen wrote: > How about the next best thing: a silent machine that turns on its fan > if it is about to overheat? I can make my binary available if wanted. > ftp://ftp.netwinder.org/users/g/guinan/fand.c
I had some problems with the original fand.c so I rewrote it. I've attached my version to this message. -- ------------ Alex Holden - http://www.linuxhacker.org ------------ If it doesn't work, you're not hitting it with a big enough hammer
/* * Jamie Guinan, December 1998 * Tidied up somewhat by Alex Holden, January 2001. * * Turns the fan off when the temperature gets down to two degrees below the * low thermostat setting, and turns it back on again when it reaches the * low setting. This gives a two degree hysteresis band, which seems to give * good results for me. Changes to the thermostat settings are automatically * detected, and the fan is always turned back on again on exit except when * kill -9'ed. * * Copyright: Free for redistribution, modifications welcome, as * long as credits maintained. * * Warranty: None whatsoever. */ #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <sys/ioctl.h> #include <asm/therm.h> #define THERMDEV "/dev/temperature" int therm_fd; void set_fan(int i) { ioctl(therm_fd, CMD_SET_FAN, &i); } /* On exit, turn the fan on first. */ void exit_handler(void) { set_fan(1); } void daemonise() { switch(fork()) { case 0: /* Child. */ break; case -1: /* Error. */ exit(1); break; default: /* Parent. */ exit(0); } /* No controlling terminal. */ setsid(); } void initialise(void) { /* Go into background */ daemonise(); /* Open the thermostat device. */ if((therm_fd = open(THERMDEV, O_RDONLY)) == -1) exit(1); /* Make sure we turn the fan back on on exit. */ atexit(exit_handler); } int main(int argc, char *argv[]) { struct therm ts; int temp; /* Initialise the program */ initialise(); /* Main loop */ while(1) { /* Get the current temperature */ ioctl(therm_fd, CMD_GET_TEMPERATURE, &temp); /* Get the current thermostat settings */ ioctl(therm_fd, CMD_GET_THERMOSTATE2, &ts); /* Turn the fan off if we are 2 degrees below the low setting */ if(temp <= (ts.lo - 2)) set_fan(0); /* Turn the fan on if we are at or above the low setting */ else if(temp >= ts.lo) set_fan(1); /* Wait a second between each reading */ sleep(1); } return 0; }