summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-qtgui/grc/qtgui_time_raster_x.block.yml36
-rw-r--r--gr-qtgui/include/gnuradio/qtgui/TimeRasterDisplayPlot.h11
-rw-r--r--gr-qtgui/include/gnuradio/qtgui/time_raster_sink_b.h4
-rw-r--r--gr-qtgui/include/gnuradio/qtgui/time_raster_sink_f.h4
-rw-r--r--gr-qtgui/include/gnuradio/qtgui/timerasterdisplayform.h5
-rw-r--r--gr-qtgui/lib/TimeRasterDisplayPlot.cc312
-rw-r--r--gr-qtgui/lib/time_raster_sink_b_impl.cc20
-rw-r--r--gr-qtgui/lib/time_raster_sink_b_impl.h4
-rw-r--r--gr-qtgui/lib/time_raster_sink_f_impl.cc20
-rw-r--r--gr-qtgui/lib/time_raster_sink_f_impl.h4
-rw-r--r--gr-qtgui/lib/timerasterdisplayform.cc24
-rw-r--r--gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_b_pydoc_template.h12
-rw-r--r--gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_f_pydoc_template.h12
-rw-r--r--gr-qtgui/python/qtgui/bindings/time_raster_sink_b_python.cc25
-rw-r--r--gr-qtgui/python/qtgui/bindings/time_raster_sink_f_python.cc26
15 files changed, 496 insertions, 23 deletions
diff --git a/gr-qtgui/grc/qtgui_time_raster_x.block.yml b/gr-qtgui/grc/qtgui_time_raster_x.block.yml
index 3f1733069e..26746cd61a 100644
--- a/gr-qtgui/grc/qtgui_time_raster_x.block.yml
+++ b/gr-qtgui/grc/qtgui_time_raster_x.block.yml
@@ -31,6 +31,36 @@ parameters:
label: Num. Cols
dtype: int
default: 256
+- id: x_label
+ label: X-Axis Label
+ dtype: string
+ default: '""'
+ hide: part
+- id: x_start_value
+ label: X-Axis Start Value
+ dtype: float
+ default: 0.0
+ hide: part
+- id: x_end_value
+ label: X-Axis End Value
+ dtype: float
+ default: 0.0
+ hide: part
+- id: y_label
+ label: Y-Axis Label
+ dtype: string
+ default: '""'
+ hide: part
+- id: y_start_value
+ label: Y-Axis Start Value
+ dtype: float
+ default: 0.0
+ hide: part
+- id: y_end_value
+ label: Y-Axis End Value
+ dtype: float
+ default: 0.0
+ hide: part
- id: grid
label: Grid
dtype: enum
@@ -243,6 +273,10 @@ templates:
self.${id}.set_intensity_range(${zmin}, ${zmax})
self.${id}.enable_grid(${grid})
self.${id}.enable_axis_labels(${axislabels})
+ self.${id}.set_x_label(${x_label})
+ self.${id}.set_x_range(${x_start_value}, ${x_end_value})
+ self.${id}.set_y_label(${y_label})
+ self.${id}.set_y_range(${y_start_value}, ${y_end_value})
labels = [${label1}, ${label2}, ${label3}, ${label4}, ${label5},
${label6}, ${label7}, ${label8}, ${label9}, ${label10}]
@@ -264,5 +298,7 @@ templates:
documentation: |-
The GUI hint can be used to position the widget within the application. The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. Both the tab specification and the grid position are optional.
+
+ Note that for user-defined axis values, numbers will be scaled to their power of 10 3-unit grouping (e.g. Giga, Mega, Kilo, milli, nano (u), pico) and appended with the first letter descriptor for a more concise display.
file_format: 1
diff --git a/gr-qtgui/include/gnuradio/qtgui/TimeRasterDisplayPlot.h b/gr-qtgui/include/gnuradio/qtgui/TimeRasterDisplayPlot.h
index d855a74b1b..68f6bea4e1 100644
--- a/gr-qtgui/include/gnuradio/qtgui/TimeRasterDisplayPlot.h
+++ b/gr-qtgui/include/gnuradio/qtgui/TimeRasterDisplayPlot.h
@@ -50,6 +50,10 @@ public:
void setNumCols(double cols);
void setAlpha(unsigned int which, int alpha);
void setSampleRate(double samprate);
+ void setXLabel(const std::string& label);
+ void setXAxis(double start, double end);
+ void setYLabel(const std::string& label);
+ void setYAxis(double start, double end);
double numRows() const;
double numCols() const;
@@ -100,6 +104,13 @@ private:
QColor d_high_intensity;
int d_color_bar_title_font_size;
+
+ std::string d_x_label;
+ double d_x_start_value;
+ double d_x_end_value;
+ std::string d_y_label;
+ double d_y_start_value;
+ double d_y_end_value;
};
#endif /* TIMERASTER_DISPLAY_PLOT_H */
diff --git a/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_b.h b/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_b.h
index 7c1c59d202..6570fda0c2 100644
--- a/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_b.h
+++ b/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_b.h
@@ -84,6 +84,10 @@ public:
virtual void* pyqwidget() = 0;
#endif
+ virtual void set_x_label(const std::string& label) = 0;
+ virtual void set_x_range(double start, double end) = 0;
+ virtual void set_y_label(const std::string& label) = 0;
+ virtual void set_y_range(double start, double end) = 0;
virtual void set_update_time(double t) = 0;
virtual void set_title(const std::string& title) = 0;
virtual void set_line_label(unsigned int which, const std::string& label) = 0;
diff --git a/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_f.h b/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_f.h
index 0c42d04c0c..d96cbe7a0b 100644
--- a/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_f.h
+++ b/gr-qtgui/include/gnuradio/qtgui/time_raster_sink_f.h
@@ -80,6 +80,10 @@ public:
virtual void* pyqwidget() = 0;
#endif
+ virtual void set_x_label(const std::string& label) = 0;
+ virtual void set_x_range(double start, double end) = 0;
+ virtual void set_y_label(const std::string& label) = 0;
+ virtual void set_y_range(double start, double end) = 0;
virtual void set_update_time(double t) = 0;
virtual void set_title(const std::string& title) = 0;
virtual void set_line_label(unsigned int which, const std::string& label) = 0;
diff --git a/gr-qtgui/include/gnuradio/qtgui/timerasterdisplayform.h b/gr-qtgui/include/gnuradio/qtgui/timerasterdisplayform.h
index 497d81afaf..cc4fdc041a 100644
--- a/gr-qtgui/include/gnuradio/qtgui/timerasterdisplayform.h
+++ b/gr-qtgui/include/gnuradio/qtgui/timerasterdisplayform.h
@@ -58,6 +58,11 @@ public slots:
void setSampleRate(const double samprate);
void setSampleRate(const QString& rate) override;
+ void setXAxis(double min, double max);
+ void setXLabel(const std::string& label);
+ void setYAxis(double min, double max);
+ void setYLabel(const std::string& label);
+
void setIntensityRange(const double minIntensity, const double maxIntensity);
void setMaxIntensity(const QString& m);
void setMinIntensity(const QString& m);
diff --git a/gr-qtgui/lib/TimeRasterDisplayPlot.cc b/gr-qtgui/lib/TimeRasterDisplayPlot.cc
index 8c2edf111e..5eab0aa92a 100644
--- a/gr-qtgui/lib/TimeRasterDisplayPlot.cc
+++ b/gr-qtgui/lib/TimeRasterDisplayPlot.cc
@@ -19,6 +19,7 @@
#include <qwt_plot_layout.h>
#include <qwt_scale_draw.h>
#include <QColor>
+#include <cmath>
#include <iostream>
#if QWT_VERSION < 0x060100
@@ -38,15 +39,92 @@ namespace pt = boost::posix_time;
**********************************************************************/
class QwtXScaleDraw : public QwtScaleDraw, public TimeScaleData
{
+protected:
+ double d_start_value;
+ double d_end_value;
+ double d_delta_value;
+ int d_max_scale;
+ double d_ten_scale;
+ std::string d_units;
+
public:
- QwtXScaleDraw() : QwtScaleDraw(), TimeScaleData() {}
+ QwtXScaleDraw(double start_value = 0.0, double end_value = 0.0, int max_scale = 1024)
+ : QwtScaleDraw(),
+ TimeScaleData(),
+ d_start_value(start_value),
+ d_end_value(end_value),
+ d_max_scale(max_scale),
+ d_ten_scale(1.0)
+ {
+ d_delta_value = d_end_value - d_start_value;
+
+ if ((d_delta_value != 0.0f) && (d_start_value > 0.0f || d_end_value > 0.0f)) {
+ double test_value;
+ if (d_start_value > 0.0f) {
+ test_value = d_start_value;
+ } else {
+ test_value = d_end_value;
+ }
+
+ double units10 = floor(log10(test_value));
+
+ d_ten_scale = pow(10, units10);
+
+ // We'll get positive units for d_start_value >= 1.0, negative for
+ // 0<d_start_value<1.0
+ int units3 = int(floor(units10 / 3.0));
+ d_ten_scale = pow(10, units3 * 3);
+
+ switch (units3) {
+ case 1:
+ d_units = "K";
+ break;
+ case 2:
+ d_units = "M";
+ break;
+ case 3:
+ d_units = "G";
+ break;
+ case 4:
+ d_units = "T";
+ break;
+ case 5:
+ d_units = "P";
+ break;
+ case -1:
+ d_units = "m";
+ break;
+ case -2:
+ d_units = "u";
+ break;
+ case -3:
+ d_units = "n";
+ break;
+ case -4:
+ d_units = "p";
+ break;
+ }
+ }
+ }
+
~QwtXScaleDraw() override {}
QwtText label(double value) const override
{
- double secs = double(value * getSecondsPerLine());
- return QwtText(QString::number(secs, 'f', 2));
+ if (d_start_value == d_end_value) {
+ // no scale was provided. Default to seconds.
+ double secs = double(value * getSecondsPerLine());
+ return QwtText(QString::number(secs, 'f', 2));
+ } else {
+ // User-defined scale provided.
+ double x_label =
+ d_start_value + (double)value / (double)d_max_scale * d_delta_value;
+
+ // scale for units tag
+ x_label /= d_ten_scale;
+ return QwtText(QString("").sprintf("%.3f%s", x_label, d_units.c_str()));
+ }
}
virtual void initiateUpdate()
@@ -63,15 +141,81 @@ public:
class QwtYScaleDraw : public QwtScaleDraw
{
public:
- QwtYScaleDraw() : QwtScaleDraw(), d_rows(0) {}
+ QwtYScaleDraw(double start_value = 0.0, double end_value = 0.0, int max_scale = 1024)
+ : QwtScaleDraw(),
+ d_rows(max_scale),
+ d_start_value(start_value),
+ d_end_value(end_value),
+ d_max_scale(max_scale),
+ d_ten_scale(1.0)
+ {
+ d_delta_value = d_end_value - d_start_value;
+
+ if ((d_delta_value != 0.0f) && (d_start_value > 0.0f || d_end_value > 0.0f)) {
+ double test_value;
+ if (d_start_value > 0.0f) {
+ test_value = d_start_value;
+ } else {
+ test_value = d_end_value;
+ }
+
+ double units10 = floor(log10(test_value));
+
+ d_ten_scale = pow(10, units10);
+
+ // We'll get positive units for d_start_value >= 1.0, negative for
+ // 0<d_start_value<1.0
+ int units3 = int(floor(units10 / 3.0));
+ d_ten_scale = pow(10, units3 * 3);
+
+ switch (units3) {
+ case 1:
+ d_units = "K";
+ break;
+ case 2:
+ d_units = "M";
+ break;
+ case 3:
+ d_units = "G";
+ break;
+ case 4:
+ d_units = "T";
+ break;
+ case 5:
+ d_units = "P";
+ break;
+ case -1:
+ d_units = "m";
+ break;
+ case -2:
+ d_units = "u";
+ break;
+ case -3:
+ d_units = "n";
+ break;
+ case -4:
+ d_units = "p";
+ break;
+ }
+ }
+ }
~QwtYScaleDraw() override {}
QwtText label(double value) const override
{
- if (d_rows > 0)
- value = d_rows - value;
- return QwtText(QString::number(value, 'f', 0));
+ if (d_start_value == d_end_value) {
+ // no scale was provided. Default to row number.
+ return QwtText(QString("").sprintf("%.0f", value));
+ } else {
+ // User-defined scale provided.
+ double y_label =
+ d_start_value + (double)value / (double)d_rows * d_delta_value;
+
+ // scale for units tag
+ y_label /= d_ten_scale;
+ return QwtText(QString("").sprintf("%.3f%s", y_label, d_units.c_str()));
+ }
}
virtual void initiateUpdate()
@@ -85,6 +229,13 @@ public:
private:
double d_rows;
+
+ double d_start_value;
+ double d_end_value;
+ double d_delta_value;
+ int d_max_scale;
+ double d_ten_scale;
+ std::string d_units;
};
class TimePrecisionClass
@@ -117,19 +268,34 @@ public:
TimeRasterZoomer(QwtPlotCanvas* canvas,
double rows,
double cols,
- const unsigned int timePrecision)
+ const unsigned int timePrecision,
+ double x_start_value = 0.0,
+ double x_end_value = 0.0,
+ double y_start_value = 0.0,
+ double y_end_value = 0.0)
#else /* QWT_VERSION < 0x060100 */
TimeRasterZoomer(QWidget* canvas,
double rows,
double cols,
- const unsigned int timePrecision)
+ const unsigned int timePrecision,
+ double x_start_value = 0.0,
+ double x_end_value = 0.0,
+ double y_start_value = 0.0,
+ double y_end_value = 0.0)
#endif /* QWT_VERSION < 0x060100 */
: QwtPlotZoomer(canvas),
TimePrecisionClass(timePrecision),
TimeScaleData(),
d_rows(static_cast<double>(rows)),
- d_cols(static_cast<double>(cols))
+ d_cols(static_cast<double>(cols)),
+ d_x_start_value(x_start_value),
+ d_x_end_value(x_end_value),
+ d_y_start_value(y_start_value),
+ d_y_end_value(y_end_value)
{
+ d_x_delta_value = d_x_end_value - d_x_start_value;
+ d_y_delta_value = d_y_end_value - d_y_start_value;
+
setTrackerMode(QwtPicker::AlwaysOn);
}
@@ -137,6 +303,20 @@ public:
virtual void updateTrackerText() { updateDisplay(); }
+ void setXAxis(double min, double max)
+ {
+ d_x_start_value = min;
+ d_x_end_value = max;
+ d_x_delta_value = max - min;
+ }
+
+ void setYAxis(double min, double max)
+ {
+ d_y_start_value = min;
+ d_y_end_value = max;
+ d_y_delta_value = max - min;
+ }
+
void setUnitType(const std::string& type) { d_unitType = type; }
void setColumns(const double cols) { d_cols = cols; }
@@ -148,19 +328,50 @@ protected:
QwtText trackerText(QPoint const& p) const override
{
QwtDoublePoint dp = QwtPlotZoomer::invTransform(p);
- double x = dp.x() * getSecondsPerLine();
- // double y = dp.y() * getSecondsPerLine() * d_cols;
- double y = floor(d_rows - dp.y());
- QwtText t(QString("%1 %2, %3")
- .arg(x, 0, 'f', getTimePrecision())
- .arg(d_unitType.c_str())
- .arg(y, 0, 'f', 0));
- return t;
+
+ if (d_x_start_value == d_x_end_value) {
+ // Original seconds in hover text
+ double x = dp.x() * getSecondsPerLine();
+ double y = dp.y();
+
+ if (d_y_start_value != d_y_end_value) {
+ y = d_y_start_value + y / (double)d_rows * d_y_delta_value;
+ }
+
+ QwtText t(QString("%1 %2, %3")
+ .arg(x, 0, 'f', getTimePrecision())
+ .arg(d_unitType.c_str())
+ .arg(y, 0, 'f', 0));
+ return t;
+ } else {
+ // Hover based on user-defined scale
+ double x = dp.x();
+ double y = dp.y();
+ if (d_y_start_value != d_y_end_value) {
+ y = d_y_start_value + y / (double)d_rows * d_y_delta_value;
+ }
+
+ double x_label = d_x_start_value + x / (double)d_cols * d_x_delta_value;
+ if ((d_y_delta_value > 999.0) or (d_y_delta_value <= 1.0)) {
+ QwtText t(QString(QString("").sprintf("%.2f, %.2e", x_label, y)));
+ return t;
+ } else {
+ QwtText t(QString(QString("").sprintf("%.2f, %.0f", x_label, y)));
+ return t;
+ }
+ }
}
private:
std::string d_unitType;
double d_rows, d_cols;
+ double d_x_start_value;
+ double d_x_end_value;
+ double d_x_delta_value;
+ double d_y_start_value;
+ double d_y_end_value;
+ double d_y_delta_value;
+ int d_max_scale;
};
/*********************************************************************
@@ -168,7 +379,13 @@ private:
*********************************************************************/
TimeRasterDisplayPlot::TimeRasterDisplayPlot(
int nplots, double samp_rate, double rows, double cols, QWidget* parent)
- : DisplayPlot(nplots, parent)
+ : DisplayPlot(nplots, parent),
+ d_x_label(""),
+ d_x_start_value(0.0),
+ d_x_end_value(0.0),
+ d_y_label(""),
+ d_y_start_value(0.0),
+ d_y_end_value(0.0)
{
d_zoomer = NULL; // need this for proper init
@@ -180,8 +397,10 @@ TimeRasterDisplayPlot::TimeRasterDisplayPlot(
d_numPoints = d_cols;
d_color_bar_title_font_size = 18;
- setAxisScaleDraw(QwtPlot::xBottom, new QwtXScaleDraw());
- setAxisScaleDraw(QwtPlot::yLeft, new QwtYScaleDraw());
+ setAxisScaleDraw(QwtPlot::xBottom,
+ new QwtXScaleDraw(d_x_start_value, d_x_end_value, cols));
+ setAxisScaleDraw(QwtPlot::yLeft,
+ new QwtYScaleDraw(d_y_start_value, d_y_end_value, rows));
for (unsigned int i = 0; i < d_nplots; ++i) {
d_data.push_back(new TimeRasterData(d_rows, d_cols));
@@ -205,7 +424,14 @@ TimeRasterDisplayPlot::TimeRasterDisplayPlot(
// MidButton for the panning
// RightButton: zoom out by 1
// Ctrl+RighButton: zoom out to full size
- d_zoomer = new TimeRasterZoomer(canvas(), d_rows, d_cols, 0);
+ d_zoomer = new TimeRasterZoomer(canvas(),
+ d_rows,
+ d_cols,
+ 0,
+ d_x_start_value,
+ d_x_end_value,
+ d_y_start_value,
+ d_y_end_value);
#if QWT_VERSION < 0x060000
d_zoomer->setSelectionFlags(QwtPicker::RectSelection | QwtPicker::DragSelection);
#endif
@@ -255,12 +481,22 @@ void TimeRasterDisplayPlot::reset()
QwtXScaleDraw* xScale = (QwtXScaleDraw*)axisScaleDraw(QwtPlot::xBottom);
xScale->setSecondsPerLine(sec_per_samp);
- setAxisTitle(QwtPlot::xBottom, QString("Time (%1)").arg(strunits[iunit].c_str()));
+ if (d_x_label.length() > 0) {
+ setAxisTitle(QwtPlot::xBottom, QString(d_x_label.c_str()));
+ } else {
+ setAxisTitle(QwtPlot::xBottom, QString("Time (%1)").arg(strunits[iunit].c_str()));
+ }
xScale->initiateUpdate();
+ if (d_y_label.length() > 0) {
+ setAxisTitle(QwtPlot::yLeft, d_y_label.c_str());
+ }
+
// Load up the new base zoom settings
if (d_zoomer) {
double display_units = 4;
+ ((TimeRasterZoomer*)d_zoomer)->setXAxis(d_x_start_value, d_x_end_value);
+ ((TimeRasterZoomer*)d_zoomer)->setYAxis(d_y_start_value, d_y_end_value);
((TimeRasterZoomer*)d_zoomer)->setColumns(d_cols);
((TimeRasterZoomer*)d_zoomer)->setRows(d_rows);
((TimeRasterZoomer*)d_zoomer)->setSecondsPerLine(sec_per_samp);
@@ -302,6 +538,36 @@ void TimeRasterDisplayPlot::setSampleRate(double samprate)
reset();
}
+void TimeRasterDisplayPlot::setXAxis(double min, double max)
+{
+ d_x_start_value = min;
+ d_x_end_value = max;
+ setAxisScaleDraw(QwtPlot::xBottom,
+ new QwtXScaleDraw(d_x_start_value, d_x_end_value, d_cols));
+ reset();
+}
+
+void TimeRasterDisplayPlot::setXLabel(const std::string& label)
+{
+ d_x_label = label;
+ reset();
+}
+
+void TimeRasterDisplayPlot::setYAxis(double min, double max)
+{
+ d_y_start_value = min;
+ d_y_end_value = max;
+ setAxisScaleDraw(QwtPlot::yLeft,
+ new QwtYScaleDraw(d_y_start_value, d_y_end_value, d_rows));
+ reset();
+}
+
+void TimeRasterDisplayPlot::setYLabel(const std::string& label)
+{
+ d_y_label = label;
+ reset();
+}
+
double TimeRasterDisplayPlot::numRows() const { return d_rows; }
double TimeRasterDisplayPlot::numCols() const { return d_cols; }
diff --git a/gr-qtgui/lib/time_raster_sink_b_impl.cc b/gr-qtgui/lib/time_raster_sink_b_impl.cc
index bf2812fd97..b936bb5ebc 100644
--- a/gr-qtgui/lib/time_raster_sink_b_impl.cc
+++ b/gr-qtgui/lib/time_raster_sink_b_impl.cc
@@ -155,6 +155,26 @@ PyObject* time_raster_sink_b_impl::pyqwidget()
void* time_raster_sink_b_impl::pyqwidget() { return NULL; }
#endif
+void time_raster_sink_b_impl::set_x_label(const std::string& label)
+{
+ d_main_gui->setXLabel(label);
+}
+
+void time_raster_sink_b_impl::set_x_range(double start, double end)
+{
+ d_main_gui->setXAxis(start, end);
+}
+
+void time_raster_sink_b_impl::set_y_label(const std::string& label)
+{
+ d_main_gui->setYLabel(label);
+}
+
+void time_raster_sink_b_impl::set_y_range(double start, double end)
+{
+ d_main_gui->setYAxis(start, end);
+}
+
void time_raster_sink_b_impl::set_update_time(double t)
{
// convert update time to ticks
diff --git a/gr-qtgui/lib/time_raster_sink_b_impl.h b/gr-qtgui/lib/time_raster_sink_b_impl.h
index 4ffff9b8f6..ec81f97b6a 100644
--- a/gr-qtgui/lib/time_raster_sink_b_impl.h
+++ b/gr-qtgui/lib/time_raster_sink_b_impl.h
@@ -76,6 +76,10 @@ public:
void* pyqwidget();
#endif
+ void set_x_label(const std::string& label);
+ void set_x_range(double start, double end);
+ void set_y_label(const std::string& label);
+ void set_y_range(double start, double end);
void set_update_time(double t) override;
void set_title(const std::string& title) override;
void set_line_label(unsigned int which, const std::string& label) override;
diff --git a/gr-qtgui/lib/time_raster_sink_f_impl.cc b/gr-qtgui/lib/time_raster_sink_f_impl.cc
index fd18413948..793c229b9e 100644
--- a/gr-qtgui/lib/time_raster_sink_f_impl.cc
+++ b/gr-qtgui/lib/time_raster_sink_f_impl.cc
@@ -153,6 +153,26 @@ PyObject* time_raster_sink_f_impl::pyqwidget()
void* time_raster_sink_f_impl::pyqwidget() { return NULL; }
#endif
+void time_raster_sink_f_impl::set_x_label(const std::string& label)
+{
+ d_main_gui->setXLabel(label);
+}
+
+void time_raster_sink_f_impl::set_x_range(double start, double end)
+{
+ d_main_gui->setXAxis(start, end);
+}
+
+void time_raster_sink_f_impl::set_y_label(const std::string& label)
+{
+ d_main_gui->setYLabel(label);
+}
+
+void time_raster_sink_f_impl::set_y_range(double start, double end)
+{
+ d_main_gui->setYAxis(start, end);
+}
+
void time_raster_sink_f_impl::set_update_time(double t)
{
// convert update time to ticks
diff --git a/gr-qtgui/lib/time_raster_sink_f_impl.h b/gr-qtgui/lib/time_raster_sink_f_impl.h
index b85128dad7..3ca6bf0af7 100644
--- a/gr-qtgui/lib/time_raster_sink_f_impl.h
+++ b/gr-qtgui/lib/time_raster_sink_f_impl.h
@@ -75,6 +75,10 @@ public:
void* pyqwidget();
#endif
+ void set_x_label(const std::string& label);
+ void set_x_range(double start, double end);
+ void set_y_label(const std::string& label);
+ void set_y_range(double start, double end);
void set_update_time(double t) override;
void set_title(const std::string& title) override;
void set_line_label(unsigned int which, const std::string& label) override;
diff --git a/gr-qtgui/lib/timerasterdisplayform.cc b/gr-qtgui/lib/timerasterdisplayform.cc
index 3ce29731b5..360cd65a6d 100644
--- a/gr-qtgui/lib/timerasterdisplayform.cc
+++ b/gr-qtgui/lib/timerasterdisplayform.cc
@@ -177,6 +177,30 @@ void TimeRasterDisplayForm::customEvent(QEvent* e)
}
}
+void TimeRasterDisplayForm::setXAxis(double min, double max)
+{
+ getPlot()->setXAxis(min, max);
+ getPlot()->replot();
+}
+
+void TimeRasterDisplayForm::setXLabel(const std::string& label)
+{
+ getPlot()->setXLabel(label);
+ getPlot()->replot();
+}
+
+void TimeRasterDisplayForm::setYAxis(double min, double max)
+{
+ getPlot()->setYAxis(min, max);
+ getPlot()->replot();
+}
+
+void TimeRasterDisplayForm::setYLabel(const std::string& label)
+{
+ getPlot()->setYLabel(label);
+ getPlot()->replot();
+}
+
void TimeRasterDisplayForm::setNumRows(double rows)
{
getPlot()->setNumRows(rows);
diff --git a/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_b_pydoc_template.h b/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_b_pydoc_template.h
index 90ab0ec5fd..4ca1ce62ee 100644
--- a/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_b_pydoc_template.h
+++ b/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_b_pydoc_template.h
@@ -36,6 +36,18 @@ static const char* __doc_gr_qtgui_time_raster_sink_b_qwidget = R"doc()doc";
static const char* __doc_gr_qtgui_time_raster_sink_b_pyqwidget = R"doc()doc";
+static const char* __doc_gr_qtgui_time_raster_sink_b_set_x_label = R"doc()doc";
+
+
+static const char* __doc_gr_qtgui_time_raster_sink_b_set_x_range = R"doc()doc";
+
+
+static const char* __doc_gr_qtgui_time_raster_sink_b_set_y_label = R"doc()doc";
+
+
+static const char* __doc_gr_qtgui_time_raster_sink_b_set_y_range = R"doc()doc";
+
+
static const char* __doc_gr_qtgui_time_raster_sink_b_set_update_time = R"doc()doc";
diff --git a/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_f_pydoc_template.h b/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_f_pydoc_template.h
index 7d2420c628..c8b20bbaa9 100644
--- a/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_f_pydoc_template.h
+++ b/gr-qtgui/python/qtgui/bindings/docstrings/time_raster_sink_f_pydoc_template.h
@@ -36,6 +36,18 @@ static const char* __doc_gr_qtgui_time_raster_sink_f_qwidget = R"doc()doc";
static const char* __doc_gr_qtgui_time_raster_sink_f_pyqwidget = R"doc()doc";
+static const char* __doc_gr_qtgui_time_raster_sink_f_set_x_label = R"doc()doc";
+
+
+static const char* __doc_gr_qtgui_time_raster_sink_f_set_x_range = R"doc()doc";
+
+
+static const char* __doc_gr_qtgui_time_raster_sink_f_set_y_label = R"doc()doc";
+
+
+static const char* __doc_gr_qtgui_time_raster_sink_f_set_y_range = R"doc()doc";
+
+
static const char* __doc_gr_qtgui_time_raster_sink_f_set_update_time = R"doc()doc";
diff --git a/gr-qtgui/python/qtgui/bindings/time_raster_sink_b_python.cc b/gr-qtgui/python/qtgui/bindings/time_raster_sink_b_python.cc
index b4cd8c1c9e..8e4de7f443 100644
--- a/gr-qtgui/python/qtgui/bindings/time_raster_sink_b_python.cc
+++ b/gr-qtgui/python/qtgui/bindings/time_raster_sink_b_python.cc
@@ -76,6 +76,31 @@ void bind_time_raster_sink_b(py::module& m)
},
D(time_raster_sink_b, pyqwidget))
+ .def("set_x_range",
+ &time_raster_sink_b::set_x_range,
+ py::arg("min"),
+ py::arg("max"),
+ D(time_raster_sink_b, set_x_range))
+
+
+ .def("set_x_label",
+ &time_raster_sink_b::set_x_label,
+ py::arg("label"),
+ D(time_raster_sink_b, set_x_label))
+
+
+ .def("set_y_range",
+ &time_raster_sink_b::set_y_range,
+ py::arg("min"),
+ py::arg("max"),
+ D(time_raster_sink_b, set_y_range))
+
+
+ .def("set_y_label",
+ &time_raster_sink_b::set_y_label,
+ py::arg("label"),
+ D(time_raster_sink_b, set_y_label))
+
.def("set_update_time",
&time_raster_sink_b::set_update_time,
diff --git a/gr-qtgui/python/qtgui/bindings/time_raster_sink_f_python.cc b/gr-qtgui/python/qtgui/bindings/time_raster_sink_f_python.cc
index 8c640d6101..4665015eeb 100644
--- a/gr-qtgui/python/qtgui/bindings/time_raster_sink_f_python.cc
+++ b/gr-qtgui/python/qtgui/bindings/time_raster_sink_f_python.cc
@@ -76,6 +76,32 @@ void bind_time_raster_sink_f(py::module& m)
},
D(time_raster_sink_f, pyqwidget))
+ .def("set_x_range",
+ &time_raster_sink_f::set_x_range,
+ py::arg("min"),
+ py::arg("max"),
+ D(time_raster_sink_f, set_x_range))
+
+
+ .def("set_x_label",
+ &time_raster_sink_f::set_x_label,
+ py::arg("label"),
+ D(time_raster_sink_f, set_x_label))
+
+
+ .def("set_y_range",
+ &time_raster_sink_f::set_y_range,
+ py::arg("min"),
+ py::arg("max"),
+ D(time_raster_sink_f, set_y_range))
+
+
+ .def("set_y_label",
+ &time_raster_sink_f::set_y_label,
+ py::arg("label"),
+ D(time_raster_sink_f, set_y_label))
+
+
.def("set_update_time",
&time_raster_sink_f::set_update_time,
py::arg("t"),