[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