/***********************************************************************\ ** ** ** TIMER : pour chronometrer son temps ! ** ** ** ** Fabrice NEYRET - decembre 2001 - copyright iMAGIS ** ** ** \***********************************************************************/ /* CC -Ofast=IP27 -woff 1198,1174,1552 timer.c -o timer -lglut -lGLU -lGL -lXmu -lX11 -lm -I/usr/local/include cc -O3 timer.c -o timer.l686 -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lX11 -lXi -lm -I/usr/local/include */ #include #include #include #include /* #include déjà dans glut.h */ /* #include déjà dans glut.h */ #include #define error(chaine,para) { printf(chaine,para); printf("\n"); exit(-1); } #define warning(chaine,para) { printf(chaine,para); printf("\n"); } typedef float vector[3]; #define vector(P, x,y,z) { P[0]=x; P[1]=y; P[2]=z; } #define MAX(a,b) (((a)>=(b))?(a):(b)) #define MIN(a,b) (((a)<=(b))?(a):(b)) int nb=1, current=0, PRINT=0, BORDER=1, len=1; #define NB_TIMERS 10 float timer[NB_TIMERS], base[NB_TIMERS]; int active[NB_TIMERS]; char* (label[NB_TIMERS]); int persist[NB_TIMERS],col[NB_TIMERS]; int PERSIST=0; int lu=0; int SIZEX=100, SIZEY; float kx=1,ky=1; #define SIZE_PER_TIMER 30 #define set_win_size() { SIZEY = 15+SIZE_PER_TIMER*nb; if (!BORDER) BORDER=-1; } float temps=0; int is_idle=0; #define STEPS_BEFORE_IDLE 150 struct timeval time0, time1; void reset_time() { gettimeofday(&time0,NULL); } void init() { len=1; nb=1; PERSIST=0; reset_time(); memset(timer,0,NB_TIMERS*sizeof(float)); memset(base,0,NB_TIMERS*sizeof(float)); memset(active,0,NB_TIMERS*sizeof(int)); memset(label,0,NB_TIMERS*sizeof(char*)); memset(persist,0,NB_TIMERS*sizeof(int)); memset(col,0xff,NB_TIMERS*sizeof(int)); } float mytime() { gettimeofday(&time1,NULL); return (time1.tv_sec-time0.tv_sec) + 1e-6*(time1.tv_usec-time0.tv_usec); } void active_timer(int i) { if ((i<0)||(i>=NB_TIMERS)) return; if (active[i]) return; active[i] = 1; base[i] = mytime(); } void stop_timer(int i) { void save(); if ((i<0)||(i>=NB_TIMERS)) return; if (!active[i]) return; active[i] = 0; timer[i] += mytime()-base[i]; if (PERSIST) save(); } void reset_timer(int i) { void save(); if ((i<0)||(i>=NB_TIMERS)) return; active[i] = 0; timer[i] = 0; if (PERSIST) save(); } void switch_timer(int i) { if ((i<0)||(i>=NB_TIMERS)) return; if (active[i]) stop_timer(i); else active_timer(i); } void inc_timer(int i) { float t; if ((i<0)||(i>=NB_TIMERS)) return; if (!active[i]) return; t = mytime(); timer[i] += t-base[i]; base [i] = t; } char* built_date(char* buff, int num) { sprintf(buff,"%d:%02d:%02d",num/3600,(num%3600)/60,num%60); return buff; } int date2time(char* buff) { int n,h,m,s; n = sscanf(buff,"%d:%d:%d",&h,&m,&s); switch(n) { case 0: warning("horaire %s mal forme'",buff); return -1; case 1: s=h; h=m=0; break; case 2: s=m; m=h; h=0; break; case 3: break; } return h*3600+m*60+s; } /************ affichage ****************************************/ void afflabel(char *msg, vector P, float scale) { char *p; scale /= (119.05 + 33.33); glPushMatrix(); glTranslatef(P[0],P[1],P[2]); glScalef(scale,scale,scale); for (p = msg; *p; p++) glutStrokeCharacter(GLUT_STROKE_ROMAN, *p); glPopMatrix(); } void affnum(int num, vector P, float scale) { char buff[256]; sprintf(buff,"%d",num); afflabel(buff,P,scale); } void affdate(int num, vector P, float scale) { char buff[256]; afflabel(built_date(buff, num),P,scale); } void redisplay() { /* routine générale d'affichage */ int i; vector P; char buff[256]; void resetgraph(); resetgraph(); /* on réinitialise l'affichage */ for (i=0; iSTEPS_BEFORE_IDLE),.7,.7); vector(P, 3,15+SIZE_PER_TIMER*(nb-1-i),0); if (label[i]) afflabel(label[i],P,10); else affnum((i+1)%10,P,10); glLineWidth(2.); if (active[i]) glColor3ub((col[i]>>16)&255,(col[i]>>8)&255,col[i]&255); else glColor3f(0,0,.8); vector(P, 23+4*((len>2)?len-2:0),12+SIZE_PER_TIMER*(nb-1-i),0); affdate((int)timer[i], P, 20); glLineWidth(1.); } if (PRINT) { printf("\r"); for (i=0; iSTEPS_BEFORE_IDLE) sleep(1); for (i=0; i][] \n" " -p: afficher aussi les timers dans le shell \n" " -b: fenetre sans bord \n" " -a: active le 1er timer tout de suite \n" " -i: ignore config par defaut (~/.timerrc) \n" " -m: considere config memorisee (~/.timerrc) \n" " : nombre de timers \n" " touches: \n" " ESC: quitter \n" " h: ce message \n" " SPACE: on/off du timer sous la souris \n" " 1-9: on/off du timer indique' \n" " p: afficher aussi les timers dans le shell \n" " DEL,ctrl-r: reset du timer sous la souris \n" " ctrl-n: entrer nouvelle valeur du timer sous la souris \n" " fleches: avancer ou reculer les minutes et les secondes \n" " +: ajouter un timer \n" " -: supprimer le dernier timer \n" " b: supprimer/remettre bord de fenetre \n" " (rappel: ALT-F7,ALT-F8 pour deplacer ou retailler fenetre) \n" " souris: \n" " LEFT: on/off du timer sous la souris \n\n" " fichier ~/.timerrc (la ligne de commande prend le pas sur ce fichier)\n" " options [-pbia] \n" " pba: cf options de la ligne de commande \n" " i: ignore ce fichier sauf si -m sur ligne de commande \n" " timer