1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/progress_bar/progress_bar.c
2021-04-07 12:05:00 +02:00

106 lines
2.3 KiB
C

/*
* Copyright (C) 2019 Inria
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup sys_progress_bar
* @{
*
* @file
* @brief Progress bar implementation
*
* @author Alexandre Abadie <alexandre.abadie@inria.fr>
*
* @}
*/
#include <stdio.h>
#include <inttypes.h>
#include "progress_bar.h"
void progress_bar_print(char *prefix, char *suffix, uint8_t value)
{
if (value > 100) {
value = 100;
}
/* Hide cursor */
printf("\033[?25l");
/* Hack for pyterm: prepare space for the progress bar */
putchar('\n');
printf("\033[1A");
/* Move cursor at the beginning of the line */
putchar('\r');
/* Display progress bar prefix if any */
if (prefix) {
printf("%s", prefix);
}
printf(CONFIG_PROGRESS_BAR_PREFIX_CHARACTER);
/* Fully reprint the progress bar */
for (unsigned i = 0; i < CONFIG_PROGRESS_BAR_LENGTH; ++i) {
if (100 * i < (uint16_t)(value * CONFIG_PROGRESS_BAR_LENGTH)) {
printf(CONFIG_PROGRESS_BAR_FULL_CHARACTER);
}
else {
printf(CONFIG_PROGRESS_BAR_EMPTY_CHARACTER);
}
}
printf(CONFIG_PROGRESS_BAR_SUFFIX_CHARACTER);
/* Display progress bar suffix if any */
if (suffix) {
printf("%s", suffix);
}
/* Hack for pyterm */
printf("\033[s");
putchar('\n');
printf("\033[u");
/* show cursor */
printf("\033[?25h");
#if defined(MODULE_NEWLIB) || defined(MODULE_PICOLIBC)
fflush(stdout);
#endif
}
void progress_bar_update(progress_bar_t *progress_bar)
{
progress_bar_print(progress_bar->prefix, progress_bar->suffix,
progress_bar->value);
}
void progress_bar_prepare_multi(uint8_t len)
{
/* Give enough space to print all progress bars. */
for (uint8_t i = 0; i < len; ++i) {
putchar('\n');
}
}
void progress_bar_update_multi(progress_bar_t *progress_bar_list, uint8_t len)
{
/* Move cursor to the line of the first progress bar. */
printf("\033[%dA", len);
for (uint8_t i = 0; i < len; ++i) {
/* Display each progress bar as usual */
progress_bar_update(&progress_bar_list[i]);
/* Move cursor to next progress bar line. */
putchar('\n');
}
}