Beispiel #1
0
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; 
		}
	}
}