From: alex Date: Thu, 26 Jul 2001 02:22:18 +0000 (+0000) Subject: Added VDEF TOTAL X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=e2254ef9cc30afbd4daeb7815ad27672cbdc9f46;p=rrdtool.git Added VDEF TOTAL Moved most typedefs etc. to rrd_graph.h git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@46 a5681a0c-68f1-0310-ab6d-d61299d08faa --- diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 313c518..dcb1545 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -4,7 +4,10 @@ * rrd__graph.c make creates ne rrds ****************************************************************************/ +#if 0 #include "rrd_tool.h" +#endif + #include #include #include @@ -13,7 +16,9 @@ #include #include #endif -#include "rrd_rpncalc.h" + +#include "rrd_graph.h" +#include "rrd_graph_helper.h" #define SmallFont gdLucidaNormal10 #define LargeFont gdLucidaBold12 @@ -26,56 +31,6 @@ # define DPRINT(x) #endif -#define DEF_NAM_FMT "%29[_A-Za-z0-9]" - -enum tmt_en {TMT_SECOND=0,TMT_MINUTE,TMT_HOUR,TMT_DAY, - TMT_WEEK,TMT_MONTH,TMT_YEAR}; - -enum grc_en {GRC_CANVAS=0,GRC_BACK,GRC_SHADEA,GRC_SHADEB, - GRC_GRID,GRC_MGRID,GRC_FONT,GRC_FRAME,GRC_ARROW,__GRC_END__}; - - -enum gf_en {GF_PRINT=0,GF_GPRINT,GF_COMMENT,GF_HRULE,GF_VRULE,GF_LINE1, - GF_LINE2,GF_LINE3,GF_AREA,GF_STACK,GF_TICK, - GF_DEF, GF_CDEF, GF_VDEF}; - -enum if_en {IF_GIF=0,IF_PNG=1}; - -enum vdef_op_en { - VDEF_MAXIMUM /* like the MAX in (G)PRINT */ - ,VDEF_MINIMUM /* like the MIN in (G)PRINT */ - ,VDEF_AVERAGE /* like the AVERAGE in (G)PRINT */ - ,VDEF_PERCENT /* Nth percentile */ - ,VDEF_FIRST /* first non-unknown value and time */ - ,VDEF_LAST /* last non-unknown value and time */ - }; -typedef struct vdef_t { - enum vdef_op_en op; - double param; /* parameter for function, if applicable */ - double val; /* resulting value */ - time_t when; /* timestamp, if applicable */ -} vdef_t; - -typedef struct col_trip_t { - int red; /* red = -1 is no color */ - int green; - int blue; - int i; /* color index assigned in gif image i=-1 is unasigned*/ -} col_trip_t; - - -typedef struct xlab_t { - long minsec; /* minimum sec per pix */ - enum tmt_en gridtm; /* grid interval in what ?*/ - long gridst; /* how many whats per grid*/ - enum tmt_en mgridtm; /* label interval in what ?*/ - long mgridst; /* how many whats per label*/ - enum tmt_en labtm; /* label interval in what ?*/ - long labst; /* how many whats per label*/ - long precis; /* label precision -> label placement*/ - char *stst; /* strftime string*/ -} xlab_t; - xlab_t xlab[] = { {0, TMT_SECOND,30, TMT_MINUTE,5, TMT_MINUTE,5, 0,"%H:%M"}, {2, TMT_MINUTE,1, TMT_MINUTE,5, TMT_MINUTE,5, 0,"%H:%M"}, @@ -110,11 +65,6 @@ double yloglab[][12]= {{ 1e9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* sensible y label intervals ...*/ -typedef struct ylab_t { - double grid; /* grid spacing */ - int lfac[4]; /* associated label spacing*/ -} ylab_t; - ylab_t ylab[]= { {0.1, {1,2, 5,10}}, {0.2, {1,5,10,20}}, @@ -144,133 +94,6 @@ col_trip_t graph_col[] = { /* default colors */ {255,0,0,-1} /*arrow*/ }; -/* this structure describes the elements which can make up a graph. - because they are quite diverse, not all elements will use all the - possible parts of the structure. */ -#ifdef HAVE_SNPRINTF -#define FMT_LEG_LEN 200 -#else -#define FMT_LEG_LEN 2000 -#endif - -typedef struct graph_desc_t { - enum gf_en gf; /* graphing function */ - char vname[30]; /* name of the variable */ - long vidx; /* gdes reference */ - char rrd[255]; /* name of the rrd_file containing data */ - char ds_nam[DS_NAM_SIZE]; /* data source name */ - long ds; /* data source number */ - enum cf_en cf; /* consolidation function */ - col_trip_t col; /* graph color */ - char format[FMT_LEG_LEN+5]; /* format for PRINT AND GPRINT */ - char legend[FMT_LEG_LEN+5]; /* legend*/ - gdPoint legloc; /* location of legend */ - double yrule; /* value for y rule line and for VDEF */ - time_t xrule; /* time for x rule line and for VDEF */ - vdef_t vf; /* instruction for VDEF function */ - rpnp_t *rpnp; /* instructions for CDEF function */ - - /* description of data fetched for the graph element */ - time_t start,end; /* timestaps for first and last data element */ - unsigned long step; /* time between samples */ - unsigned long ds_cnt; /* how many data sources are there in the fetch */ - long data_first; /* first pointer to this data */ - char **ds_namv; /* name of datasources in the fetch. */ - rrd_value_t *data; /* the raw data drawn from the rrd */ - rrd_value_t *p_data; /* processed data, xsize elments */ - -} graph_desc_t; - -#define ALTYGRID 0x01 /* use alternative y grid algorithm */ -#define ALTAUTOSCALE 0x02 /* use alternative algorithm to find lower and upper bounds */ -#define ALTAUTOSCALE_MAX 0x04 /* use alternative algorithm to find upper bounds */ -#define NOLEGEND 0x08 /* use no legend */ - -typedef struct image_desc_t { - - /* configuration of graph */ - - char graphfile[MAXPATH]; /* filename for graphic */ - long xsize,ysize; /* graph area size in pixels */ - col_trip_t graph_col[__GRC_END__]; /* real colors for the graph */ - char ylegend[200]; /* legend along the yaxis */ - char title[200]; /* title for graph */ - int draw_x_grid; /* no x-grid at all */ - int draw_y_grid; /* no x-grid at all */ - xlab_t xlab_user; /* user defined labeling for xaxis */ - char xlab_form[200]; /* format for the label on the xaxis */ - - double ygridstep; /* user defined step for y grid */ - int ylabfact; /* every how many y grid shall a label be written ? */ - - time_t start,end; /* what time does the graph cover */ - unsigned long step; /* any preference for the default step ? */ - rrd_value_t minval,maxval; /* extreme values in the data */ - int rigid; /* do not expand range even with - values outside */ - char* imginfo; /* construct an xorigin \ @@ -326,8 +149,6 @@ ytr(image_desc_t *im, double value){ } } - - /* conversion function for symbolic entry names */ @@ -1309,7 +1130,7 @@ print_calc(image_desc_t *im, char ***prdata) */ vidx = im->gdes[i].vidx; if (im->gdes[vidx].gf==GF_VDEF) { /* simply use vals */ - printval = im->gdes[vidx].yrule; + printval = im->gdes[vidx].vf.val; } else { /* need to calculate max,min,avg etcetera */ max_ii =((im->gdes[vidx].end - im->gdes[vidx].start) @@ -2776,7 +2597,7 @@ rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize) for(i=optind+1;ivf.op = VDEF_MAXIMUM; else if (!strcmp("AVERAGE",func)) gdes->vf.op = VDEF_AVERAGE; else if (!strcmp("MINIMUM",func)) gdes->vf.op = VDEF_MINIMUM; + else if (!strcmp("TOTAL", func)) gdes->vf.op = VDEF_TOTAL; else if (!strcmp("FIRST", func)) gdes->vf.op = VDEF_FIRST; else if (!strcmp("LAST", func)) gdes->vf.op = VDEF_LAST; else { @@ -3330,6 +3130,7 @@ char *str; case VDEF_MAXIMUM: case VDEF_AVERAGE: case VDEF_MINIMUM: + case VDEF_TOTAL: case VDEF_FIRST: case VDEF_LAST: if (isnan(param)) { @@ -3369,7 +3170,7 @@ printf("DEBUG: start == %lu, end == %lu, %lu steps\n" ); #endif - switch (im->gdes[gdi].vf.op) { + switch (dst->vf.op) { case VDEF_PERCENT: { rrd_value_t * array; int field; @@ -3387,7 +3188,7 @@ printf("DEBUG: start == %lu, end == %lu, %lu steps\n" field = (steps-1)*dst->vf.param/100; dst->vf.val = array[field]; dst->vf.when = 0; /* no time component */ -#if 1 +#if 0 for(step=0;stepds_cnt])) { sum += data[step*src->ds_cnt]; cnt ++; - } - step++; + }; } if (cnt) { - dst->vf.val = sum/cnt; - dst->vf.when = 0; /* no time component */ + if (dst->vf.op == VDEF_TOTAL) { + dst->vf.val = sum*src->step; + dst->vf.when = cnt*src->step; /* not really "when" */ + } else { + dst->vf.val = sum/cnt; + dst->vf.when = 0; /* no time component */ + }; } else { dst->vf.val = DNAN; dst->vf.when = 0; @@ -3486,7 +3292,7 @@ printf("DEBUG: %3li:%10.2f %c\n",step,array[step],step==field?'*':' '); return 0; } -/* NaN <= -INF <= finite_values <= INF */ +/* NaN < -INF < finite_values < INF */ int vdef_percent_compar(a,b) const void *a,*b; @@ -3508,3 +3314,4 @@ const void *a,*b; /* If we reach this, both values must be finite */ if ( *(double *)a < *(double *)b ) return -1; else return 1; } +