aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-05-30 12:57:16 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2009-05-30 12:57:16 +0300
commit2a6ef4f51500091e535b2b47d709eee5cd52468c (patch)
treee3e28622c41b8b477acf1f2be6db9955b7ab4c6b
parentfbc8bdac6efb0c63a73c5105bbf4ecb304187e44 (diff)
downloadtagr-2a6ef4f51500091e535b2b47d709eee5cd52468c.tar.gz
tagr-2a6ef4f51500091e535b2b47d709eee5cd52468c.tar.bz2
Adjust vertical axis as needed.HEADmaster
* src/graph.c (default_monitor): New global. (find_max): New function. (draw_graph): Adjust max rate if requested. * src/grid.c (ygrid_create): Use mon->ystep_absolute to determine the type of grid. * src/readconfig.c (cb_monitor): Handle `monitor default'. (monitor_kw): New statements: max-adjust and y-step-absolute. (tagr_kw): Remove rate-units kw. * src/tagr.h (struct monitor): New members: max_adjust and ystep_absolute. (default_monitor): New extern.
-rw-r--r--src/graph.c51
-rw-r--r--src/grid.c5
-rw-r--r--src/readconfig.c42
-rw-r--r--src/tagr.h20
4 files changed, 85 insertions, 33 deletions
diff --git a/src/graph.c b/src/graph.c
index 80b2a97..89f02a1 100644
--- a/src/graph.c
+++ b/src/graph.c
@@ -54,8 +54,18 @@ int graph_ysize = 100;
54int graph_h_margin[2] = { 100, 14 }; 54int graph_h_margin[2] = { 100, 14 };
55int graph_v_margin[2] = { 14, 35 }; 55int graph_v_margin[2] = { 14, 35 };
56 56
57/* FIXME: I18N?? */ 57struct monitor default_monitor = {
58char *rate_unit = "Bytes per Second"; 58 NULL,
59 NULL,
60 NULL,
61 "Bytes per Second", /* rate_unit, FIXME: I18N?? */
62 0, /* max_rate */
63 0, /* max_adjust */
64 1.0, /* scale */
65 0.1, /* ystep */
66 0, /* ystep_absolute */
67 0 /* swap */
68};
59 69
60#define make_color_index(g, ar) \ 70#define make_color_index(g, ar) \
61 gdImageColorAllocate (g, (ar)[0], (ar)[1], (ar)[2]) 71 gdImageColorAllocate (g, (ar)[0], (ar)[1], (ar)[2])
@@ -70,6 +80,24 @@ draw_vtext (gdImagePtr graph, int color, const char *text)
70 (unsigned char *) text, color); 80 (unsigned char *) text, color);
71} 81}
72 82
83static double
84find_max (queue_t *dataq)
85{
86 int i, n = queue_count (dataq);
87 double mval = 0;
88 struct traffic_history *th;
89
90 for (i = 0; i < n; i++)
91 {
92 th = queue_get_ptr (dataq, i);
93 if (mval < th->inrate)
94 mval = th->inrate;
95 if (mval < th->outrate)
96 mval = th->outrate;
97 }
98 return mval;
99}
100
73int 101int
74draw_graph (FILE *fp, 102draw_graph (FILE *fp,
75 struct monitor *mon, 103 struct monitor *mon,
@@ -89,13 +117,25 @@ draw_graph (FILE *fp,
89 int full_xsize = graph_xsize + graph_h_margin[0] + graph_h_margin[1]; 117 int full_xsize = graph_xsize + graph_h_margin[0] + graph_h_margin[1];
90 int full_ysize = graph_ysize + graph_v_margin[0] + graph_v_margin[1]; 118 int full_ysize = graph_ysize + graph_v_margin[0] + graph_v_margin[1];
91 grid_t grid; 119 grid_t grid;
92 double ymax = mon->max_rate; 120 double ymax;
121
122 if (mon->max_adjust)
123 {
124 double amax = find_max (dataq);
125 if (amax > mon->max_rate)
126 {
127 unsigned long n = (amax - mon->max_rate + mon->max_adjust - 1) /
128 mon->max_adjust;
129 mon->max_rate += n * mon->max_adjust;
130 }
131 }
132 ymax = mon->max_rate;
93 133
94 yscale = (double) graph_ysize / ymax; 134 yscale = (double) graph_ysize / ymax;
95 xscale = (double) graph_xsize / xmax; 135 xscale = (double) graph_xsize / xmax;
96 136
97#define ytr(y) \ 137#define ytr(y) \
98 (unsigned long) ((ymax >= (y) ? (ymax - (y)) : ymax) * \ 138 (unsigned long) ((ymax >= (y) ? (ymax - (y)) : 0) * \
99 yscale + graph_h_margin[1]) 139 yscale + graph_h_margin[1])
100#define xtr(x) \ 140#define xtr(x) \
101 (unsigned long) (growright ? \ 141 (unsigned long) (growright ? \
@@ -213,8 +253,7 @@ draw_graph (FILE *fp,
213 double d; 253 double d;
214 char *str = NULL; 254 char *str = NULL;
215 255
216 draw_vtext (graph, i_grid, 256 draw_vtext (graph, i_grid, mon->rate_unit);
217 mon->rate_unit ? mon->rate_unit : rate_unit);
218 257
219 /* Draw vertical grid */ 258 /* Draw vertical grid */
220 while ((d = grid_next (grid, &str, NULL)) < ymax) 259 while ((d = grid_next (grid, &str, NULL)) < ymax)
diff --git a/src/grid.c b/src/grid.c
index 08e1c08..4ecb576 100644
--- a/src/grid.c
+++ b/src/grid.c
@@ -95,7 +95,10 @@ ygrid_create (grid_t grid, void *cdata)
95{ 95{
96 struct monitor *mon = cdata; 96 struct monitor *mon = cdata;
97 struct ygrid_data *gr = xmalloc (sizeof (*gr)); 97 struct ygrid_data *gr = xmalloc (sizeof (*gr));
98 gr->step = mon->ystep; 98 if (mon->ystep_absolute)
99 gr->step = mon->ystep;
100 else
101 gr->step = mon->ystep * mon->max_rate;
99 return gr; 102 return gr;
100} 103}
101 104
diff --git a/src/readconfig.c b/src/readconfig.c
index 1c22cb1..a60f19d 100644
--- a/src/readconfig.c
+++ b/src/readconfig.c
@@ -98,29 +98,35 @@ cb_monitor (enum grecs_callback_command cmd,
98 return 1; 98 return 1;
99 } 99 }
100 mon = xzalloc (sizeof (*mon)); 100 mon = xzalloc (sizeof (*mon));
101 *mon = default_monitor;
101 mon->id = strdup (value->v.string); 102 mon->id = strdup (value->v.string);
102 mon->scale = 1.0; 103 mon->name = NULL;
103 mon->ystep = 100.; 104 mon->dir = NULL;
104 *pdata = mon; 105 *pdata = mon;
105 break; 106 break;
106 107
107 case grecs_callback_section_end: 108 case grecs_callback_section_end:
108 mon = *pdata; 109 mon = *pdata;
109 if (mon->max_rate == 0) 110 if (strcmp (mon->id, "default") == 0)
111 default_monitor = *mon;
112 else
110 { 113 {
111 grecs_error (locus, 0, _("maximum speed not set")); 114 if (mon->max_rate == 0 && mon->max_adjust == 0)
112 free (mon); 115 {
113 return 0; 116 grecs_error (locus, 0, _("maximum speed not set"));
117 free (mon);
118 return 0;
119 }
120 if (!mon->name)
121 mon->name = strdup (mon->id);
122 if (!mon->dir)
123 mon->dir = strdup (mon->id);
124 if (mon_count == 0)
125 obstack_init (&mon_stack);
126
127 obstack_grow (&mon_stack, mon, sizeof *mon);
128 mon_count++;
114 } 129 }
115 if (!mon->name)
116 mon->name = strdup (mon->id);
117 if (!mon->dir)
118 mon->dir = strdup (mon->id);
119 if (mon_count == 0)
120 obstack_init (&mon_stack);
121
122 obstack_grow (&mon_stack, mon, sizeof *mon);
123 mon_count++;
124 free (mon); 130 free (mon);
125 *pdata = NULL; 131 *pdata = NULL;
126 break; 132 break;
@@ -174,6 +180,8 @@ static struct grecs_keyword monitor_kw[] = {
174 grecs_type_string, NULL, offsetof(struct monitor, dir) }, 180 grecs_type_string, NULL, offsetof(struct monitor, dir) },
175 { "max-speed", NULL, N_("Maximum speed"), 181 { "max-speed", NULL, N_("Maximum speed"),
176 grecs_type_ulong, NULL, offsetof(struct monitor, max_rate) }, 182 grecs_type_ulong, NULL, offsetof(struct monitor, max_rate) },
183 { "max-adjust", NULL, N_("Adjust maximum by this value when needed"),
184 grecs_type_ulong, NULL, offsetof(struct monitor, max_adjust) },
177 { "rate-units", NULL, N_("Name of rate units"), 185 { "rate-units", NULL, N_("Name of rate units"),
178 grecs_type_string, NULL, offsetof(struct monitor, rate_unit) }, 186 grecs_type_string, NULL, offsetof(struct monitor, rate_unit) },
179 { "scale", N_("arg: double"), N_("Scaling factor"), 187 { "scale", N_("arg: double"), N_("Scaling factor"),
@@ -182,6 +190,8 @@ static struct grecs_keyword monitor_kw[] = {
182 { "y-step", N_("arg: double"), N_("Step for Y axis"), 190 { "y-step", N_("arg: double"), N_("Step for Y axis"),
183 grecs_type_string, NULL, offsetof(struct monitor, ystep), 191 grecs_type_string, NULL, offsetof(struct monitor, ystep),
184 cb_double}, 192 cb_double},
193 { "y-step-absolute", NULL, N_("y-step is an absolute value"),
194 grecs_type_bool, NULL, offsetof(struct monitor, ystep_absolute) },
185 { "swap", NULL, N_("Swap in and out rates"), 195 { "swap", NULL, N_("Swap in and out rates"),
186 grecs_type_bool, NULL, offsetof(struct monitor, swap) }, 196 grecs_type_bool, NULL, offsetof(struct monitor, swap) },
187 { NULL } 197 { NULL }
@@ -488,8 +498,6 @@ static struct grecs_keyword tagr_kw[] = {
488 N_("Idle timeout for stream connections"), 498 N_("Idle timeout for stream connections"),
489 grecs_type_uint, &stream_idle_timeout }, 499 grecs_type_uint, &stream_idle_timeout },
490 500
491 { "rate-units", NULL, N_("Name of rate units"),
492 grecs_type_string, &rate_unit },
493 { "number-suffixes", N_("suffixes"), 501 { "number-suffixes", N_("suffixes"),
494 N_("Not implemented") /* FIXME */, 502 N_("Not implemented") /* FIXME */,
495 grecs_type_string, NULL, 0, cb_number_suffixes }, 503 grecs_type_string, NULL, 0, cb_number_suffixes },
diff --git a/src/tagr.h b/src/tagr.h
index 5d7c3e0..6ed7ca2 100644
--- a/src/tagr.h
+++ b/src/tagr.h
@@ -43,14 +43,16 @@
43 43
44struct monitor 44struct monitor
45{ 45{
46 char *id; 46 char *id; /* Monitor ID */
47 char *name; 47 char *name; /* Full name */
48 char *dir; 48 char *dir; /* Output directory */
49 char *rate_unit; 49 char *rate_unit; /* Rate units */
50 unsigned long max_rate; 50 unsigned long max_rate; /* Max. rate value */
51 double scale; 51 unsigned long max_adjust; /* Adjustment for max. rate */
52 double ystep; 52 double scale; /* Y (rate) scale */
53 int swap; 53 double ystep; /* Step of Y grid, in fractions of max_rate */
54 int ystep_absolute; /* When true, ystep is an absolute value */
55 int swap; /* Swap input and output rates */
54}; 56};
55 57
56extern int preprocess_only; 58extern int preprocess_only;
@@ -75,8 +77,8 @@ extern char *html_template;
75extern char *html_input_file; 77extern char *html_input_file;
76extern int html_input_line; 78extern int html_input_line;
77extern int verbose_level; 79extern int verbose_level;
78extern char *rate_unit;
79 80
81extern s