00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1997 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ ETA.CPP 00007 Nombre paquete............... - 00008 Lenguaje fuente.............. C 00009 Estado....................... Utilizable 00010 Dependencia Hard/OS.......... - 00011 Codigo condicional........... - 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Comentario 00016 ------- -------- -------- ---------- 00017 1.0.0 20/03/97 Borja inicial. 00018 00019 ======================== Contenido ======================== 00020 <DOC> 00021 Gestion de "Tiempo Estimado de LLegada" (ETA). 00022 Para hacer tipicas barritas de porcentaje para terminar 00023 el proceso, o simplemente indicar cuanto tiempo se estima 00024 para terminar un proceso. 00025 </DOC> 00026 =========================================================== 00027 */ 00028 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00029 /**********************************************************/ 00030 00031 #include <stdio.h> 00032 00033 #include "eta.hpp" 00034 00035 //<DOC> 00036 /**********************************************************/ 00037 /* Inicializa (lo mismo que el constructor). 00038 {n} es el "Punto de destino" sabiendo que partimos de 0. 00039 {refreshTimeSec} es el numero de segundos para generar un 00040 valor de refresco (ver getRefresh()) */ 00041 00042 VOID ETA::init( DOUBLE n, DOUBLE refreshTimeSec ) 00043 //</DOC> 00044 { 00045 nf = n; 00046 ni = 0; 00047 rt = refreshTimeSec; 00048 ti = -rt*1000; 00049 c.reset(); 00050 c.start(); 00051 } 00052 00053 //<DOC> 00054 /**********************************************************/ 00055 /* {devuelve} los segundos estimados para terminar el 00056 proceso. En {pos} debemos indicar la posicion actual (sabiendo 00057 que partimos de 0 y el final es el parametro {n} del constructor 00058 o de la funcion init() */ 00059 00060 DOUBLE ETA::getETASec( DOUBLE pos ) 00061 //</DOC> 00062 { 00063 if (!pos) return 0; 00064 00065 return ((nf-pos)/pos*c.ms())/1000; 00066 } 00067 00068 //<DOC> 00069 /**********************************************************/ 00070 /* Como getETASec() solo que {devuelve} una cadena de 00071 texto formateada como hh:mm:ss (con dias si son dias! 00072 xxd/hh:mm:ss) 00073 con el tiempo estimado para terminar el proceso . La cadena 00074 es estatica e interna, no modificarla ni liberar memoria! */ 00075 00076 CHAR *ETA::getETATxt( DOUBLE pos ) 00077 //<DOC> 00078 { 00079 DOUBLE t; 00080 LONG h, m, s; 00081 DOUBLE d; 00082 static CHAR internalstr[40]; 00083 00084 t = getETASec(pos); 00085 00086 d = floor(t/(24.*3600)); 00087 t -= d*(24.*3600); 00088 h = (LONG)(t/3600); 00089 t -= h*3600; 00090 m = (LONG)(t/60); 00091 t -= m*60; 00092 s = (LONG)t; 00093 00094 if (d) sprintf(internalstr,"%.0fd/%ld:%02ld:%02ld",d,h,m,s); 00095 else sprintf(internalstr,"%ld:%02ld:%02ld",h,m,s); 00096 00097 return internalstr; 00098 00099 } 00100 00101 //<DOC> 00102 /**********************************************************/ 00103 /* {devuelve} TRUE cuando debemos actualizar (refrescar) 00104 la estimacion de tiempo para terminar, y FALSE el resto del 00105 tiempo. Se produce un refresco cada {refreshTimeSec} segundos 00106 (parametro indicado en init() o en el constructor). */ 00107 00108 BOOL ETA::getRefresh( VOID ) 00109 //</DOC> 00110 { 00111 DOUBLE t = c.ms(); 00112 BOOL r = (((t-ti)/1000)>=rt); 00113 00114 if (r) ti = t; 00115 return r; 00116 } 00117 00118 //<DOC> 00119 /**********************************************************/ 00120 /* {devuelve} el porcentaje del proceso que ya hemos hecho. 00121 Es un valor entre 0 (al inicio) y 100 (al final). En {pos} 00122 debemos indicar la posicion actual (sabiendo que partimos 00123 de 0 y el final es el parametro {n} del constructor o de 00124 la funcion init() */ 00125 00126 DOUBLE ETA::getPercent( DOUBLE pos ) 00127 //</DOC> 00128 { 00129 if (!nf) return 100; 00130 00131 return (pos/nf)*100; 00132 } 00133 00134 /**********************************************************/