diff --git a/common/utils/T/tracer/gui.c b/common/utils/T/tracer/gui.c index 2963e4c34875c9c7c0823d4d037109067df74ce0..46e06d2e1f0579fbabc4473e9d035acd847350bf 100644 --- a/common/utils/T/tracer/gui.c +++ b/common/utils/T/tracer/gui.c @@ -55,7 +55,7 @@ static void *input_signal_plotter(void *_) iqbuf[2*i+1]*iqbuf[2*i+1])); } - xy_plot_set_points(eNB_data.g, eNB_data.input_signal, + xy_plot_set_points(eNB_data.g, eNB_data.input_signal, 0, length, x, y); if (pthread_mutex_unlock(&eNB_data.input_signal_lock)) abort(); @@ -70,6 +70,7 @@ void t_gui_start(void) widget *plot = new_xy_plot(g, 512, 100, "eNB 0 input signal", 20); widget_add_child(g, win, plot, -1); xy_plot_set_range(g, plot, 0, 76800, 30, 70); + xy_plot_new_plot(g, plot, FOREGROUND_COLOR); eNB_data.input_signal = plot; eNB_data.input_signal_length = 76800 * 4; diff --git a/common/utils/T/tracer/gui/gui.h b/common/utils/T/tracer/gui/gui.h index 92f336ada7e29f4b1e17a0333f2ac96198053e78..78507f7f4ff17ce7fc9fb245c4e54ff27df45fe6 100644 --- a/common/utils/T/tracer/gui/gui.h +++ b/common/utils/T/tracer/gui/gui.h @@ -32,10 +32,11 @@ void label_set_clickable(gui *gui, widget *label, int clickable); void container_set_child_growable(gui *_gui, widget *_this, widget *child, int growable); +int xy_plot_new_plot(gui *gui, widget *this, int color); void xy_plot_set_range(gui *gui, widget *this, float xmin, float xmax, float ymin, float ymax); void xy_plot_set_points(gui *gui, widget *this, - int npoints, float *x, float *y); + int plot, int npoints, float *x, float *y); void textlist_add(gui *gui, widget *this, const char *text, int position, int color); diff --git a/common/utils/T/tracer/gui/gui_defs.h b/common/utils/T/tracer/gui/gui_defs.h index 463d9bf8a091ae7e94aec3c52b6eae2f1fb4f8b1..dd769221790c84939271a85f2cdb1f1c860349a6 100644 --- a/common/utils/T/tracer/gui/gui_defs.h +++ b/common/utils/T/tracer/gui/gui_defs.h @@ -95,11 +95,15 @@ struct textlist_widget { int background_color; }; -struct xy_plot_widget { - struct widget common; +struct xy_plot_plot { float *x; float *y; int npoints; + int color; +}; + +struct xy_plot_widget { + struct widget common; char *label; int label_width; int label_height; @@ -109,6 +113,8 @@ struct xy_plot_widget { float ymin, ymax; int wanted_width; int wanted_height; + struct xy_plot_plot *plots; + int nplots; }; struct button_widget { diff --git a/common/utils/T/tracer/gui/xy_plot.c b/common/utils/T/tracer/gui/xy_plot.c index c1ca608f4954f2d289a7a22f51f4f0d02b6c02f5..ca17fb4eab55b60238af6cd8f4b2cda954cc2702 100644 --- a/common/utils/T/tracer/gui/xy_plot.c +++ b/common/utils/T/tracer/gui/xy_plot.c @@ -21,6 +21,7 @@ static void paint(gui *_gui, widget *_this) float allocated_ymin, allocated_ymax; float center; int i; + int n; # define FLIP(v) (-(v) + allocated_plot_height-1) @@ -134,23 +135,25 @@ static void paint(gui *_gui, widget *_this) + this->label_baseline, this->label); - /* points */ - float ax, bx, ay, by; - ax = (allocated_plot_width-1) / (allocated_xmax - allocated_xmin); - bx = -ax * allocated_xmin; - ay = (allocated_plot_height-1) / (allocated_ymax - allocated_ymin); - by = -ay * allocated_ymin; - for (i = 0; i < this->npoints; i++) { - int x, y; - x = ax * this->x[i] + bx; - y = ay * this->y[i] + by; - if (x >= 0 && x < allocated_plot_width && - y >= 0 && y < allocated_plot_height) - x_add_point(g->x, - this->common.x + this->vrule_width + x, - this->common.y + FLIP(y)); + for (n = 0; n < this->nplots; n++) { + /* points */ + float ax, bx, ay, by; + ax = (allocated_plot_width-1) / (allocated_xmax - allocated_xmin); + bx = -ax * allocated_xmin; + ay = (allocated_plot_height-1) / (allocated_ymax - allocated_ymin); + by = -ay * allocated_ymin; + for (i = 0; i < this->plots[n].npoints; i++) { + int x, y; + x = ax * this->plots[n].x[i] + bx; + y = ay * this->plots[n].y[i] + by; + if (x >= 0 && x < allocated_plot_width && + y >= 0 && y < allocated_plot_height) + x_add_point(g->x, + this->common.x + this->vrule_width + x, + this->common.y + FLIP(y)); + } + x_plot_points(g->x, g->xwin, this->plots[n].color); } - x_plot_points(g->x, g->xwin, FOREGROUND_COLOR); } static void hints(gui *_gui, widget *_w, int *width, int *height) @@ -186,6 +189,8 @@ widget *new_xy_plot(gui *_gui, int width, int height, char *label, w->xmax = 1; w->ymin = -1; w->ymax = 1; + w->plots = NULL; + w->nplots = 0; w->common.paint = paint; w->common.hints = hints; @@ -199,6 +204,31 @@ widget *new_xy_plot(gui *_gui, int width, int height, char *label, /* public functions */ /*************************************************************************/ +int xy_plot_new_plot(gui *_gui, widget *_this, int color) +{ + int ret; + struct gui *g = _gui; + struct xy_plot_widget *this = _this; + + glock(g); + + ret = this->nplots; + + this->nplots++; + this->plots = realloc(this->plots, + this->nplots * sizeof(struct xy_plot_plot)); + if (this->plots == NULL) abort(); + + this->plots[ret].x = NULL; + this->plots[ret].y = NULL; + this->plots[ret].npoints = 0; + this->plots[ret].color = color; + + gunlock(g); + + return ret; +} + void xy_plot_set_range(gui *_gui, widget *_this, float xmin, float xmax, float ymin, float ymax) { @@ -217,7 +247,7 @@ void xy_plot_set_range(gui *_gui, widget *_this, gunlock(g); } -void xy_plot_set_points(gui *_gui, widget *_this, +void xy_plot_set_points(gui *_gui, widget *_this, int plot, int npoints, float *x, float *y) { struct gui *g = _gui; @@ -225,16 +255,16 @@ void xy_plot_set_points(gui *_gui, widget *_this, glock(g); - if (npoints != this->npoints) { - free(this->x); - free(this->y); - this->x = calloc(sizeof(float), npoints); - this->y = calloc(sizeof(float), npoints); - this->npoints = npoints; + if (npoints != this->plots[plot].npoints) { + free(this->plots[plot].x); + free(this->plots[plot].y); + this->plots[plot].x = calloc(sizeof(float), npoints); + this->plots[plot].y = calloc(sizeof(float), npoints); + this->plots[plot].npoints = npoints; } - memcpy(this->x, x, npoints * sizeof(float)); - memcpy(this->y, y, npoints * sizeof(float)); + memcpy(this->plots[plot].x, x, npoints * sizeof(float)); + memcpy(this->plots[plot].y, y, npoints * sizeof(float)); send_event(g, DIRTY, this->common.id);