implement some prettyping-inspired display instead of textual
authorAntoine Beaupré <anarcat@koumbit.org>
Tue, 3 Dec 2013 01:45:58 +0000 (20:45 -0500)
committerAntoine Beaupré <anarcat@koumbit.org>
Tue, 3 Dec 2013 01:46:21 +0000 (20:46 -0500)
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
src/oping.c
src/oping.h

index 1326783..c266883 100644 (file)
@@ -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
index 79d7569..b3a191e 100644 (file)
 #include <sys/types.h>
 #endif
 
+#include <locale.h>
+
 #if USE_NCURSES
 # define NCURSES_OPAQUE 1
-# include <ncurses.h>
+/* http://newsgroups.derkeiler.com/Archive/Rec/rec.games.roguelike.development/2010-09/msg00050.html */
+# define _X_OPEN_SOURCE_EXTENDED
+# include <ncursesw/ncurses.h>
 
 # 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
index cd7d62f..2a5bc3a 100644 (file)
@@ -59,6 +59,9 @@ typedef struct pingobj pingobj_t;
 #define PING_DEF_AF      AF_UNSPEC
 #define PING_DEF_DATA    "liboping -- ICMP ping library <http://octo.it/liboping/>"
 
+#define BARS_LEN 8
+extern const char *bars[BARS_LEN];
+
 /*
  * Method definitions
  */