0 | 0 |
/* $Revision$ */
|
|
1 |
#include <math.h>
|
1 | 2 |
#include <poll.h>
|
2 | 3 |
#include <stdarg.h>
|
3 | 4 |
#include <stdio.h>
|
|
10 | 11 |
|
11 | 12 |
#include "error.h"
|
12 | 13 |
#include "gen.h"
|
|
14 |
#include "kalman.h"
|
13 | 15 |
#ifdef FW
|
14 | 16 |
#include "fft.h"
|
15 | 17 |
#endif
|
|
26 | 28 |
|
27 | 29 |
double graph_limit = 99999999.9;
|
28 | 30 |
double hz = 1.0;
|
|
31 |
|
|
32 |
double graph_avg = 0.0, graph_sd = 0.0, graph_min = 999999999999.0, graph_max = -99999999999999999.0;
|
|
33 |
int graph_n = 0;
|
29 | 34 |
|
30 | 35 |
double *history = NULL, *history_temp = NULL, *history_fft = NULL;
|
31 | 36 |
char *history_set = NULL;
|
|
222 | 227 |
init_pair(C_GREEN, COLOR_GREEN, COLOR_BLACK);
|
223 | 228 |
init_pair(C_RED, COLOR_RED, COLOR_BLACK);
|
224 | 229 |
|
|
230 |
kalman_init(0.0);
|
|
231 |
|
225 | 232 |
recreate_terminal();
|
226 | 233 |
}
|
227 | 234 |
|
|
456 | 463 |
}
|
457 | 464 |
#endif
|
458 | 465 |
|
459 | |
void draw_graph(void)
|
|
466 |
void draw_graph(double val)
|
460 | 467 |
{
|
461 | 468 |
int index = 0, n = min(max_x, history_n);
|
462 | |
double sd = 0.0, avg = 0.0, mi = 0.0, ma = 0.0;
|
463 | |
stats_t h_stats;
|
464 | |
|
465 | |
init_statst(&h_stats);
|
|
469 |
double avg = 0, sd = 0;
|
|
470 |
double mi = 0.0, ma = 0.0, diff = 0.0;
|
|
471 |
|
|
472 |
graph_min = min(val, graph_min);
|
|
473 |
graph_max = max(val, graph_max);
|
|
474 |
|
|
475 |
graph_avg += val;
|
|
476 |
graph_sd += val * val;
|
|
477 |
graph_n++;
|
|
478 |
|
|
479 |
avg = graph_avg / (double)graph_n;
|
|
480 |
sd = sqrt((graph_sd / (double)graph_n) - pow(avg, 2.0));
|
|
481 |
|
|
482 |
mi = max(graph_min, max(0.0, avg - sd));
|
|
483 |
ma = min(graph_max, avg + sd);
|
|
484 |
diff = ma - mi;
|
|
485 |
|
|
486 |
if (diff == 0.0)
|
|
487 |
diff = 1.0;
|
|
488 |
|
|
489 |
wattron(w_line1, A_REVERSE);
|
|
490 |
mvwprintw(w_line1, 0, 0, "graph range: %7.2fms - %7.2fms ", mi, ma);
|
|
491 |
wattroff(w_line1, A_REVERSE);
|
|
492 |
wnoutrefresh(w_line1);
|
|
493 |
|
|
494 |
/* fprintf(stderr, "%d| %f %f %f %f\n", h_stats.n, mi, avg, ma, sd); */
|
466 | 495 |
|
467 | 496 |
for(index=0; index<n; index++)
|
468 | 497 |
{
|
469 | |
if (history_set[index])
|
|
498 |
char overflow = 0, limitter = 0;
|
|
499 |
double val = 0, height = 0;
|
|
500 |
int i_h = 0;
|
|
501 |
|
|
502 |
if (history[index] < graph_limit)
|
|
503 |
val = history[index];
|
|
504 |
else
|
470 | 505 |
{
|
471 | |
double val = history[index] < graph_limit ? history[index] : graph_limit;
|
472 | |
|
473 | |
update_statst(&h_stats, val);
|
|
506 |
val = graph_limit;
|
|
507 |
limitter = 1;
|
474 | 508 |
}
|
475 | |
}
|
476 | |
|
477 | |
if (h_stats.n)
|
478 | |
{
|
479 | |
double diff = 0.0;
|
480 | |
|
481 | |
avg = h_stats.avg / (double)h_stats.n;
|
482 | |
sd = calc_sd(&h_stats);
|
483 | |
|
484 | |
mi = max(h_stats.min, max(0.0, avg - sd));
|
485 | |
ma = min(h_stats.max, avg + sd);
|
486 | |
diff = ma - mi;
|
487 | |
|
488 | |
if (diff == 0.0)
|
489 | |
diff = 1.0;
|
490 | |
|
491 | |
wattron(w_line1, A_REVERSE);
|
492 | |
mvwprintw(w_line1, 0, 0, "graph range: %7.2fms - %7.2fms ", mi, ma);
|
493 | |
wattroff(w_line1, A_REVERSE);
|
494 | |
wnoutrefresh(w_line1);
|
495 | |
|
496 | |
/* fprintf(stderr, "%d| %f %f %f %f\n", h_stats.n, mi, avg, ma, sd); */
|
497 | |
|
498 | |
for(index=0; index<h_stats.n; index++)
|
|
509 |
|
|
510 |
height = (val - mi) / diff;
|
|
511 |
|
|
512 |
if (height > 1.0)
|
499 | 513 |
{
|
500 | |
char overflow = 0, limitter = 0;
|
501 | |
double val = 0, height = 0;
|
502 | |
int i_h = 0;
|
503 | |
|
504 | |
if (history[index] < graph_limit)
|
505 | |
val = history[index];
|
506 | |
else
|
507 | |
{
|
508 | |
val = graph_limit;
|
509 | |
limitter = 1;
|
510 | |
}
|
511 | |
|
512 | |
height = (val - mi) / (ma - mi);
|
513 | |
|
514 | |
if (height > 1.0)
|
515 | |
{
|
516 | |
height = 1.0;
|
517 | |
overflow = 1;
|
518 | |
}
|
519 | |
|
520 | |
i_h = (int)(height * stats_h);
|
521 | |
/* fprintf(stderr, "%d %f %f %d %d\n", index, history[index], height, i_h, overflow); */
|
522 | |
|
523 | |
draw_column(w_stats, max_x - (1 + index), i_h, overflow, limitter);
|
|
514 |
height = 1.0;
|
|
515 |
overflow = 1;
|
524 | 516 |
}
|
|
517 |
|
|
518 |
i_h = (int)(height * stats_h);
|
|
519 |
/* fprintf(stderr, "%d %f %f %d %d\n", index, history[index], height, i_h, overflow); */
|
|
520 |
|
|
521 |
draw_column(w_stats, max_x - (1 + index), i_h, overflow, limitter);
|
525 | 522 |
}
|
526 | 523 |
}
|
527 | 524 |
|
528 | 525 |
void update_stats(stats_t *resolve, stats_t *connect, stats_t *request, stats_t *total, stats_t *ssl_setup, int n_ok, int n_fail, const char *last_connect_str, const char *fp, char use_tfo, char dg, char use_ssl)
|
529 | 526 |
{
|
|
527 |
double k = 0.0;
|
530 | 528 |
char force_redraw = 0;
|
531 | 529 |
struct pollfd p = { 0, POLLIN, 0 };
|
532 | 530 |
|
|
555 | 553 |
mvwprintw(w_stats, 4, 0, "total : %6.2f %6.2f %6.2f %6.2f %6.2f",
|
556 | 554 |
total -> cur, total -> min, total -> avg / (double)total -> n, total -> max, calc_sd(total));
|
557 | 555 |
|
558 | |
mvwprintw(w_stats, 5, 0, "ok: %4d, fail: %4d%s, scc: %.3f", n_ok, n_fail, use_tfo ? ", with TFO" : "", get_cur_scc());
|
|
556 |
k = kalman_do(total -> cur);
|
|
557 |
|
|
558 |
mvwprintw(w_stats, 5, 0, "ok: %4d, fail: %4d%s, scc: %.3f, kalman: %.3f", n_ok, n_fail, use_tfo ? ", with TFO" : "", get_cur_scc(), k);
|
559 | 559 |
|
560 | 560 |
buflen = snprintf(buffer, sizeof buffer, "http result code: %s, SSL fingerprint: %s", last_connect_str, fp ? fp : "n/a");
|
561 | 561 |
|
|
584 | 584 |
|
585 | 585 |
if (dg)
|
586 | 586 |
{
|
587 | |
draw_graph();
|
|
587 |
draw_graph(k);
|
588 | 588 |
#ifdef FW
|
589 | 589 |
draw_fft();
|
590 | 590 |
#endif
|