[Programación] Re: [Programación] Re: [Programación] Cantidad de datos antes de fgets

Gustavo Guillermo Pérez programacion@lugro.org.ar
Fri, 3 Jun 2005 11:22:16 -0500


El Jueves, 2 de Junio de 2005 20:44, Nicolás Aimetti escribió:
> Hola...
>
> Para husmear en el contenido de un puntero FILE (como es stdin) podes
> hacer algo así:
>     #include <stdio.h>
>     int main(void){
>         char c = getc(stdin);
>         printf(">>: %d\n", (stdin->_IO_read_end)-(stdin->_IO_read_ptr));
>         return 0;
>     }
Bueno, voy a ser más específico, unos amigos me pidieron un programa para 
arbitrar unos torneos de Taekwondo, usando JoyPads USB que los desarmé y 
conecté a las cajitas que van a marcar los tantos, (siguen siendo joypads).
Hice un prototipo en Java pero no quiero usar Java porque lo quiero compilar 
con la uClibc, entonces traduje el prototipo a "C" porque necesito usar 
hardware bastante obsoleto para aprovecharlo, bueno, en java tengo una 
propiedad de un inputstream que es int available() que devuelve cuantos bytes 
se pueden leer sin bloquear, entonces yo revisaba esa cantidad y sólo si era 
mayor a 8 bytes que son los que transmite la API del joystick leía un botón, 
entonces no se bloqueaba la ejecución y podía cerrar el nodo /dev/input/jsX y 
si alguien desconectaba un joypad, se liberaba ese archivo y el proximo que 
conectaba se ocupaba por ese, lo cierto es que al pasarlo a "C" no supe como 
saber si me voy a bloquear leyendo datos o todavía no, porque como es un 
nodo, no puedo leer el tamaño del archivo porque no tiene tamaño, lo cierto 
es que usé threads, pthreads para ser más precisos, pero mi programa se clava 
eternamente al desconectar el joypad, el hilo principal si detecta que se 
desconectó pero el hilo que leia botones queda trabado en el fgets.

Este es el código de los hilos que leen los botones, la función que es lanzada 
como hilo por el main();

void scan_joy(int j){
int i=j;
FILE *rfile;
char buff[IN_BYTES];
char b1[1];
int offset=0;
while(1){
    while(joypads[i].joy_plug==0){sleep(2);}

 rfile=fopen(joypads[i].joy_dev,"rb");
 if (rfile!=NULL) {
//ScanButtons está adentro de esta función
// fprintf(stderr,"Tratando de leer archivos\n");
/* while(!feof(rfile)){
 fgets(buff,2,rfile);
 //permitir a los otros threads hacer algo
 sched_yield();
 fprintf(stderr,"[js%i:%i]",i,buff[0]);
 }
*/
 while(!feof(rfile)){
 b1[0]=buff[2];
 fgets(buff,IN_BYTES-offset,rfile);
 //permitir a los otros threads hacer algo
 sched_yield();
 sleep(0.5+i/10);
 int discard=0;
 printf("Dentro de mientras no sea el fin de archivo js%i:%i:%i:%i:%i:%i:%i:
%i:%i:%i 
\n",i,buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7],buff[8]);
 if(b1[0]!=buff[2] && (b1[0]==buff[1] || (b1[0]+1)==buff[1]))
{offset=1;fprintf(stderr,"MERDEEE[%i]!!!\n",i);printf("MERDEEE[%i]!!!
\n",i);}else{offset=0;}
 if (buff[6]>=0){
 if(buff[4]==0){if(joypads[i].joy_pressed==1)joypads[i].joy_pressed=0;else 
discard=1;}
 else{if(joypads[i].joy_pressed==0)joypads[i].joy_pressed=1;else discard=1;}
 joypads[i].joy_button=buff[7]*256*256+buff[6]*256+buff[5];
   if(!discard){
 if(joypads[i].joy_pressed){
 fprintf(stderr,"JOY:%i:BTN-P:%i\n",i,joypads[i].joy_button);}else{
 fprintf(stderr,"JOY:%i:BTN-R:%i\n",i,joypads[i].joy_button);}
    }//endif discard
    else{discard=0;fprintf(stderr,"J__:%i:BTN-R:
%i\n",i,joypads[i].joy_button);}
 }//endif
 }//end while

 fprintf(stderr,"Fin de archivo js%i",i);
 joypads[i].joy_plug=1;
 fclose(rfile);}
 }//end while
 
} //end scan_joy(int i)


-- 
Gustavo Guillermo Pérez
Compunauta uLinux
www.ulinux.tk