From 68d713ec1a7027113f1fa20df598a63539511593 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Antoine=20Beaupr=C3=A9?= Date: Mon, 2 Dec 2013 20:45:58 -0500 Subject: [PATCH] implement some prettyping-inspired display instead of textual this is a first stab at porting "prettyping.sh" into noping. the idea is to show a histogram of ping times instead of numerical values. with some work, we could actually show both, but this focuses on implementing the hard part (the histogram) properly. it is very rudimentary for now: * the math may be wrong for the size of the bar, I was mostly in a rush to make unicode work and have something pretty quickly. * all hosts are on the same line: each should have its own line * the histogram should be displayed in a separate window * it should use background colors as well * it should fallback when the terminal is not unicode-capable * the scaling logic is fully automatic, which necessarily gives weird results at first this requires switching to the ncursesw library and other unicode ncurses hackery described in this post: http://newsgroups.derkeiler.com/Archive/Rec/rec.games.roguelike.development/2010-09/msg00050.html pretty ping is a awk/bash script, MIT-licensed, available here: https://bitbucket.org/denilsonsa/small_scripts/src/tip/prettyping.sh --- src/Makefile.am | 2 +- src/oping.c | 57 ++++++++++++++++++++++++++++----------------------------- src/oping.h | 3 +++ 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 1326783..c266883 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,7 +46,7 @@ bin_PROGRAMS += noping noping_SOURCES = oping.c noping_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_NCURSES=1 -noping_LDADD = liboping.la -lm -lncurses +noping_LDADD = liboping.la -lm -lncursesw if BUILD_WITH_LIBRT noping_LDADD += -lrt endif diff --git a/src/oping.c b/src/oping.c index 79d7569..b3a191e 100644 --- a/src/oping.c +++ b/src/oping.c @@ -74,9 +74,13 @@ #include #endif +#include + #if USE_NCURSES # define NCURSES_OPAQUE 1 -# include +/* http://newsgroups.derkeiler.com/Archive/Rec/rec.games.roguelike.development/2010-09/msg00050.html */ +# define _X_OPEN_SOURCE_EXTENDED +# include # define OPING_GREEN 1 # define OPING_YELLOW 2 @@ -85,6 +89,8 @@ #include "oping.h" +const char *bars[BARS_LEN] = { "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█" }; + #ifndef _POSIX_SAVED_IDS # define _POSIX_SAVED_IDS 0 #endif @@ -879,30 +885,26 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ if (has_colors () == TRUE) { int color = OPING_GREEN; - double average = context_get_average (context); - double stddev = context_get_stddev (context); - - if ((latency < (average - (2 * stddev))) - || (latency > (average + (2 * stddev)))) - color = OPING_RED; - else if ((latency < (average - stddev)) - || (latency > (average + stddev))) - color = OPING_YELLOW; - - HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i ", - data_len, context->host, context->addr, - sequence, recv_ttl, - format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); - if ((recv_qos != 0) || (opt_send_qos != 0)) - { - HOST_PRINTF ("qos=%s ", - format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); - } - HOST_PRINTF ("time="); - wattron (main_win, COLOR_PAIR(color)); - HOST_PRINTF ("%.2f", latency); + float ratio = 0; + int index = 0; + + ratio = ( latency - context->latency_min ) / ( context->latency_max - context->latency_min ); + if (ratio > 2/3.0) { + color = OPING_RED; + } + else if (ratio > 1/3.0) { + color = OPING_YELLOW; + } + index = (int) (ratio * BARS_LEN * 3); /* 3 colors */ + /* HOST_PRINTF ("%%r%f-ia%d-", ratio, index); */ + index = index % (BARS_LEN-1); + /* HOST_PRINTF ("im%d-", index); */ + if (index < 0 || index >= BARS_LEN) { + index = 0; /* safety check */ + } + wattron (main_win, COLOR_PAIR(color)); + HOST_PRINTF (bars[index]); wattroff (main_win, COLOR_PAIR(color)); - HOST_PRINTF (" ms\n"); } else { @@ -926,13 +928,9 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ #if USE_NCURSES if (has_colors () == TRUE) { - HOST_PRINTF ("echo reply from %s (%s): icmp_seq=%u ", - context->host, context->addr, - sequence); wattron (main_win, COLOR_PAIR(OPING_RED) | A_BOLD); - HOST_PRINTF ("timeout"); + HOST_PRINTF ("!"); wattroff (main_win, COLOR_PAIR(OPING_RED) | A_BOLD); - HOST_PRINTF ("\n"); } else { @@ -1026,6 +1024,7 @@ int main (int argc, char **argv) /* {{{ */ } #endif + setlocale(LC_ALL, ""); optind = read_options (argc, argv); #if !_POSIX_SAVED_IDS diff --git a/src/oping.h b/src/oping.h index cd7d62f..2a5bc3a 100644 --- a/src/oping.h +++ b/src/oping.h @@ -59,6 +59,9 @@ typedef struct pingobj pingobj_t; #define PING_DEF_AF AF_UNSPEC #define PING_DEF_DATA "liboping -- ICMP ping library " +#define BARS_LEN 8 +extern const char *bars[BARS_LEN]; + /* * Method definitions */ -- 2.11.0