On Fri, 27 Nov 2015 15:35:24 +0100
Bernhard Nortmann <[email protected]> wrote:

> This patch adds some additional commands, and implements corresponding
> progress callbacks that produce output for the 'dialog' utility:
> http://invisible-island.net/dialog/dialog.html
> 
> The simple "*-with-gauge" just emits percentage numbers, line by line,
> while "-witch-xgauge" outputs extended information to update the
> dialog prompt. Both are meant for directly piping theoutput:
> sunxi-fel write-with-gauge <...> | dialog --gauge "FEL upload" 6 70
> 
> Signed-off-by: Bernhard Nortmann <[email protected]>
> ---
>  fel.c      | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  progress.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
>  progress.h |  2 ++
>  3 files changed, 106 insertions(+)
> 
> diff --git a/fel.c b/fel.c
> index 13565f3..2e948fd 100644
> --- a/fel.c
> +++ b/fel.c
> @@ -1272,8 +1272,13 @@ int main(int argc, char **argv)
>                       "       read address length file        Write memory 
> contents into file\n"
>                       "       write address file              Store file 
> contents into memory\n"
>                       "       write-with-progress addr file   \"write\" with 
> progress bar\n"
> +                     "       write-with-gauge addr file      Output progress 
> for \"dialog --gauge\"\n"
> +                     "       write-with-xgauge addr file     Extended gauge 
> output (updates prompt)\n"
>                       "       multi[write] # addr file ...    
> \"write-with-progress\" multiple files,\n"
>                       "                                       sharing a 
> common progress status\n"
> +                     "       multi[write]-with-gauge ...     like their 
> \"write-with-*\" counterpart,\n"
> +                     "       multi[write]-with-xgauge ...      but following 
> the 'multi' syntax:\n"
> +                     "                                         <#> addr file 
> [addr file [...]]\n"
>                       "       ver[sion]                       Show BROM 
> version\n"
>                       "       clear address length            Clear memory\n"
>                       "       fill address length value       Fill memory\n"
> @@ -1348,6 +1353,19 @@ int main(int argc, char **argv)
>                               file_upload(handle, argv[3], strtoul(argv[2], 
> NULL, 0));
>                       }
>                       skip=3;
> +             } else if (strcmp(argv[1], "write-with-gauge") == 0 && argc > 
> 3) {
> +                     size_t size = file_size(argv[3]);
> +                     if (size > 0) {
> +                             progress_start(progress_gauge, size);
> +                             file_upload(handle, argv[3], strtoul(argv[2], 
> NULL, 0));
> +                     }
> +                     skip=3;
> +             } else if (strcmp(argv[1], "write-with-xgauge") == 0 && argc > 
> 3) {
> +                     size_t size = file_size(argv[3]);
> +                     if (size > 0) {
> +                             progress_start(progress_gauge_xxx, size);
> +                             file_upload(handle, argv[3], strtoul(argv[2], 
> NULL, 0));
> +                     }
>               } else if ((strcmp(argv[1], "multiwrite") == 0 ||
>                           strcmp(argv[1], "multi") == 0) && argc > 4) {
>                       size_t count = strtoul(argv[2], NULL, 0); /* file count 
> */
> @@ -1369,6 +1387,48 @@ int main(int argc, char **argv)
>  
>                               skip += count * 2;
>                       }
> +             } else if ((strcmp(argv[1], "multiwrite-with-gauge") == 0 ||
> +                         strcmp(argv[1], "multi-with-gauge") == 0) && argc > 
> 4) {
> +                     size_t count = strtoul(argv[2], NULL, 0); /* file count 
> */
> +                     skip = 2;
> +                     if (count > 0) {
> +                             unsigned int i;
> +
> +                             /* get all file sizes, keeping track of total 
> bytes */
> +                             size_t total_bytes = 0;
> +                             for (i = 0; i < count; i++)
> +                                     total_bytes += file_size(argv[4 + i*2]);
> +
> +                             progress_start(progress_gauge, total_bytes);
> +
> +                             /* now transfer each file in turn */
> +                             for (i = 0; i < count; i++)
> +                                     file_upload(handle, argv[4 + i*2],
> +                                                 strtoul(argv[3 + i*2], 
> NULL, 0));
> +
> +                             skip += count * 2;
> +                     }
> +             } else if ((strcmp(argv[1], "multiwrite-with-xgauge") == 0 ||
> +                         strcmp(argv[1], "multi-with-xgauge") == 0) && argc 
> > 4) {
> +                     size_t count = strtoul(argv[2], NULL, 0); /* file count 
> */
> +                     skip = 2;
> +                     if (count > 0) {
> +                             unsigned int i;
> +
> +                             /* get all file sizes, keeping track of total 
> bytes */
> +                             size_t total_bytes = 0;
> +                             for (i = 0; i < count; i++)
> +                                     total_bytes += file_size(argv[4 + i*2]);
> +
> +                             progress_start(progress_gauge_xxx, total_bytes);
> +
> +                             /* now transfer each file in turn */
> +                             for (i = 0; i < count; i++)
> +                                     file_upload(handle, argv[4 + i*2],
> +                                                 strtoul(argv[3 + i*2], 
> NULL, 0));
> +
> +                             skip += count * 2;
> +                     }

Don't we have a redundant code duplication here (copied from the
"multiwrite" command implementation)?

If I understand it correctly, only the progress callback function is
different in all these implementations.

>               } else if (strcmp(argv[1], "read") == 0 && argc > 4) {
>                       size_t size = strtoul(argv[3], NULL, 0);
>                       void *buf = malloc(size);
> diff --git a/progress.c b/progress.c
> index 05d8f8b..47ea893 100644
> --- a/progress.c
> +++ b/progress.c
> @@ -119,3 +119,47 @@ void progress_bar(size_t total, size_t done)
>  
>       fflush(stdout);
>  }
> +
> +/*
> + * Progress callback that emits percentage numbers, each on a separate line.
> + * The output is suitable for piping it into "dialog --gauge".
> + *
> + * sunxi-fel multiwrite-with-gauge <...> \
> + *   | dialog --title "FEL upload progress" \
> + *            --gauge "" 5 70
> + */
> +void progress_gauge(size_t total, size_t done)
> +{
> +     if (total > 0) {
> +             printf("%.0f\n", (float)done / total * 100);
> +             fflush(stdout);
> +     }
> +}
> +
> +/*
> + * A more sophisticated version of progress_gauge() that also updates the
> + * prompt (caption) with additional information. This uses a feature of
> + * the dialog utility that parses "XXX" delimiters - see 'man dialog'.
> + *
> + * sunxi-fel multiwrite-with-xgauge <...> \
> + *   | dialog --title "FEL upload progress" \
> + *            --backtitle "Please wait..." \
> + *            --gauge "" 6 70
> + */
> +void progress_gauge_xxx(size_t total, size_t done)
> +{
> +     if (total > 0) {
> +             double speed = rate(done, progress_elapsed());
> +             double eta = estimate(total - done, speed);
> +             printf("XXX\n");
> +             printf("%.0f\n", (float)done / total * 100);
> +             if (done < total)
> +                     printf("%zu of %zu, %.1f kB/s, ETA %s\n",
> +                             done, total, kilo(speed), format_ETA(eta));
> +             else
> +                     printf("Done: %.1f kB, at %.1f kB/s\n",
> +                             kilo(done), kilo(speed));
> +             printf("XXX\n");
> +             fflush(stdout);
> +     }
> +}
> diff --git a/progress.h b/progress.h
> index 5eb767f..ccd2945 100644
> --- a/progress.h
> +++ b/progress.h
> @@ -36,5 +36,7 @@ void progress_update(size_t bytes_done);
>  
>  /* progress callback implementations for various display styles */
>  void progress_bar(size_t total, size_t done);
> +void progress_gauge(size_t total, size_t done);
> +void progress_gauge_xxx(size_t total, size_t done);
>  
>  #endif /* _SUNXI_TOOLS_PROGRESS_H */

Other than this, looks good.

-- 
Best regards,
Siarhei Siamashka

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to