int main (int argc, char **argv) { int res, c, verbose=FALSE; int fan, temp, newpwm, oldpwm=0; pid_t pid; uid_t uid; printf("eeepc-fanctld v%s - (c)2012 Pau Oliva Fora <*****@*****.**>\n",VERSION); while ((c = getopt(argc, argv, "vh?")) != EOF) { switch(c) { case 'v': verbose=TRUE; break; case 'h': printf("usage: eeepc-fanctld [-v]\n"); return 0; break; default: fprintf(stderr,"usage: eeepc-fanctld [-v]\n"); return 1; break; } } uid = getuid(); if (uid != 0) { fprintf(stderr, "Error: this daemon must be run as root user.\n"); return 1; } find_eeepc(); sensors_init(NULL); if (!init_sensor_data()) { fprintf(stderr, "Error: Could not find needed sensors\n"); return 1; } if (!pwm_enable(1)) { fprintf(stderr, "Error: could not enable pwm\n"); return 1; } if (!verbose) { if ((pid = fork()) < 0) exit(1); else if (pid != 0) exit(0); /* daemon running here */ setsid(); res=chdir("/"); if (res != 0) { perror("Error: Could not chdir"); exit(1); } umask(0); } signal_installer(); while(1) { temp=get_temp(); if (verbose) { fan=get_fan(); printf("FAN: %d RPM, TEMP: %dºC\n", fan, temp); } if (temp < 55) newpwm=0; else if(temp < 60) newpwm=(10*255)/100; else if(temp < 65) newpwm=(20*255)/100; else if(temp < 67) newpwm=(30*255)/100; else if(temp < 69) newpwm=(40*255)/100; else if(temp < 74) newpwm=(50*255)/100; else if(temp < 77) newpwm=(60*255)/100; else if(temp < 81) newpwm=(65*255)/100; else if(temp < 85) newpwm=(70*255)/100; else if(temp < 91) newpwm=(80*255)/100; else newpwm=255; if (newpwm != oldpwm) { if(verbose) printf("Changing fan speed from: %d to %d\n", oldpwm, newpwm); set_fan(newpwm); oldpwm=newpwm; } usleep(POLLTIME*1000000); } return 0; }
void sensors_server() { bwdebug( DBG_SYS, SENSORS_SERVER_DEBUG_AREA, "SENSORS_SERVER: enters" ); RegisterAs( SENSORS_SERVER_NAME ); // Data structures int notifier_tid, sender_tid; char s88s[10], s88s_prev[10]; Sensor_history sensor_history; Sensor_waiting_list sensors_waiting_list[ NUM_SENSORS ]; All_sensors_waiting_queue all_sensors_waiting_queue; Sensor_server_data server_data; server_data.sensor_history = &sensor_history; server_data.sensor_waiting_list = sensors_waiting_list; server_data.all_sensors_wait_queue = &all_sensors_waiting_queue; // Messages Sensor_msg sensor_msg; Init_sensor_msg init_msg; Sensor_id_list_reply sensor_id_list_reply; // Initialization init_sensor_data( s88s ); init_sensor_data( s88s_prev ); init_sensor_history( &sensor_history ); init_sensor_waiting_lists( sensors_waiting_list ); init_all_sensors_waiting_queue( &all_sensors_waiting_queue ); init_id_list_reply( &sensor_id_list_reply ); init_msg.sensor_data_buff = s88s; init_msg.prev_sensor_data_buff = s88s_prev; notifier_tid = Create( SENSOR_NOTIFIER_PRIORITY, sensors_server_notifier ); bwdebug( DBG_SYS, SENSORS_SERVER_DEBUG_AREA, "SENSORS_SERVER: sensors_server_notifier created [tid: %d priority: %d]", notifier_tid, SENSOR_NOTIFIER_PRIORITY ); Send( notifier_tid, ( char * ) &init_msg, sizeof( init_msg ), 0, 0 ); FOREVER { bwdebug( DBG_SYS, SENSORS_SERVER_DEBUG_AREA, "SENSORS_SERVER: listening for a request" ); Receive( &sender_tid, ( char * ) &sensor_msg, sizeof( sensor_msg ) ); switch( sensor_msg.type ){ case SENSOR_DATA_RECEIVED_MSG: Reply( sender_tid, 0, 0 ); parse_sensors( s88s, s88s_prev, &server_data ); // If this slows down the server put it in a different task. draw_sensor_history( &sensor_history ); store_previous_sensors( s88s, s88s_prev ); break; case WAIT_SENSOR_CHANGE_MSG: // Wait for a particular sensor to be triggered wait_for_sensor( sensors_waiting_list, sender_tid, sensor_msg.sensor_group, sensor_msg.pin_id ); break; case WAIT_ALL_SENSORS_CHANGE_MSG: // Wait for any sensor to be triggered wait_for_all_sensors( &all_sensors_waiting_queue, sender_tid ); break; case GET_SENSOR_LIST_MSG: // Get the list of sensors bwdebug( DBG_USR, TEMP_DEBUG_AREA, "Received msg" ); Reply( sender_tid, ( char * ) &sensor_id_list_reply, sizeof( sensor_id_list_reply ) ); bwdebug( DBG_USR, TEMP_DEBUG_AREA, "Replying msg" ); default: bwdebug( DBG_SYS, SENSORS_SERVER_DEBUG_AREA, "SENSORS_SERVER: Invalid request. [type: %d]", sensor_msg.type ); break; } } }