1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

[svn] Revert to calculating ETA based on average download speed.

Published in <sxspu17sl10.fsf@florida.arsdigita.de>.
This commit is contained in:
hniksic 2002-04-10 07:10:03 -07:00
parent 538307f151
commit 1600aaeaa6
2 changed files with 41 additions and 39 deletions

View File

@ -1,3 +1,12 @@
2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
* progress.c (create_image): Revert to calculating ETA based on
average download speed.
(create_image): Don't print ETA until the download has been active
for at least 3 seconds.
(create_image): When ETA is not available, don't print anything.
The previous version would print --:--.
2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com> 2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
* progress.c (bar_update): Keep updating a subinterval until it * progress.c (bar_update): Keep updating a subinterval until it

View File

@ -565,14 +565,6 @@ bar_finish (void *progress, long dltime)
{ {
struct bar_progress *bp = progress; struct bar_progress *bp = progress;
/* If the download was faster than the granularity of the timer,
fake some output so that we don't get the ugly "----.--" rate at
the download finish. */
if (bp->hist.summed_times == 0)
bp->hist.summed_times = 1;
if (dltime == 0)
dltime = 1;
create_image (bp, dltime); create_image (bp, dltime);
display_image (bp->buffer); display_image (bp->buffer);
@ -600,8 +592,7 @@ create_image (struct bar_progress *bp, long dl_total_time)
char *size_legible = legible (size); char *size_legible = legible (size);
int size_legible_len = strlen (size_legible); int size_legible_len = strlen (size_legible);
long recent_time = bp->hist.summed_times; struct bar_progress_hist *hist = &bp->hist;
long recent_bytes = bp->hist.summed_bytes;
/* The progress bar should look like this: /* The progress bar should look like this:
xx% [=======> ] nn,nnn 12.34K/s ETA 00:00 xx% [=======> ] nn,nnn 12.34K/s ETA 00:00
@ -700,11 +691,12 @@ create_image (struct bar_progress *bp, long dl_total_time)
p += strlen (p); p += strlen (p);
/* " 1012.45K/s" */ /* " 1012.45K/s" */
if (recent_time && recent_bytes) if (hist->summed_times && hist->summed_bytes)
{ {
static char *short_units[] = { "B/s", "K/s", "M/s", "G/s" }; static char *short_units[] = { "B/s", "K/s", "M/s", "G/s" };
int units = 0; int units = 0;
double dlrate = calc_rate (recent_bytes, recent_time, &units); double dlrate;
dlrate = calc_rate (hist->summed_bytes, hist->summed_times, &units);
sprintf (p, " %7.2f%s", dlrate, short_units[units]); sprintf (p, " %7.2f%s", dlrate, short_units[units]);
p += strlen (p); p += strlen (p);
} }
@ -712,22 +704,28 @@ create_image (struct bar_progress *bp, long dl_total_time)
APPEND_LITERAL (" --.--K/s"); APPEND_LITERAL (" --.--K/s");
/* " ETA xx:xx:xx" */ /* " ETA xx:xx:xx" */
if (bp->total_length > 0 && recent_bytes > 0) if (bp->total_length > 0 && dl_total_time > 3000)
{ {
long eta; long eta;
int eta_hrs, eta_min, eta_sec; int eta_hrs, eta_min, eta_sec;
/* Don't change the value of ETA more than approximately once /* Don't change the value of ETA more than approximately once
per second; doing so would cause flashing without providing per second; doing so would cause flashing without providing
any value to the user. */ any value to the user. */
if (dl_total_time - bp->last_eta_time < 900 if (dl_total_time - bp->last_eta_time < 900
&& bp->last_eta_value != 0) && bp->last_eta_value != 0)
eta = bp->last_eta_value; eta = bp->last_eta_value;
else else
{ {
double tm_sofar = (double)recent_time / 1000; /* Calculate ETA using the average download speed to predict
the future speed. If you want to use the current speed
instead, replace dl_total_time with hist->summed_times
and bp->count with hist->summed_bytes. I found that
doing that results in a very jerky and ultimately
unreliable ETA. */
double time_sofar = (double)dl_total_time / 1000;
long bytes_remaining = bp->total_length - size; long bytes_remaining = bp->total_length - size;
eta = (long) (tm_sofar * bytes_remaining / recent_bytes); eta = (long) (time_sofar * bytes_remaining / bp->count);
bp->last_eta_value = eta; bp->last_eta_value = eta;
bp->last_eta_time = dl_total_time; bp->last_eta_time = dl_total_time;
} }
@ -736,34 +734,29 @@ create_image (struct bar_progress *bp, long dl_total_time)
eta_min = eta / 60, eta %= 60; eta_min = eta / 60, eta %= 60;
eta_sec = eta; eta_sec = eta;
/* Pad until the end of screen. The padding is dependent on the
hour value. */
if (eta_hrs == 0 || eta_hrs > 99)
/* Hours not printed: pad with three spaces (two digits and
colon). */
APPEND_LITERAL (" ");
else if (eta_hrs < 10)
/* Hours printed with one digit: pad with one space. */
*p++ = ' ';
else
/* Hours printed with two digits: we're using maximum width,
don't pad. */
;
APPEND_LITERAL (" ETA ");
if (eta_hrs > 99) if (eta_hrs > 99)
/* Bogus value, probably due to a calculation overflow. Print goto no_eta;
something safe to avoid overstepping the buffer bounds. */
sprintf (p, "--:--"); if (eta_hrs == 0)
else if (eta_hrs > 0) {
sprintf (p, "%d:%02d:%02d", eta_hrs, eta_min, eta_sec); /* Hours not printed: pad with three spaces. */
APPEND_LITERAL (" ");
sprintf (p, " ETA %02d:%02d", eta_min, eta_sec);
}
else else
sprintf (p, "%02d:%02d", eta_min, eta_sec); {
if (eta_hrs < 10)
/* Hours printed with one digit: pad with one space. */
*p++ = ' ';
sprintf (p, " ETA %d:%02d:%02d", eta_hrs, eta_min, eta_sec);
}
p += strlen (p); p += strlen (p);
} }
else if (bp->total_length > 0) else if (bp->total_length > 0)
APPEND_LITERAL (" ETA --:--"); {
no_eta:
APPEND_LITERAL (" ");
}
assert (p - bp->buffer <= bp->width); assert (p - bp->buffer <= bp->width);