1 /* -*- c++ -*- */ 2 /* 3 * Copyright 2012,2014-2015 Free Software Foundation, Inc. 4 * 5 * This file is part of GNU Radio 6 * 7 * GNU Radio is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 3, or (at your option) 10 * any later version. 11 * 12 * GNU Radio is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Radio; see the file COPYING. If not, write to 19 * the Free Software Foundation, Inc., 51 Franklin Street, 20 * Boston, MA 02110-1301, USA. 21 */ 22 23 #ifndef INCLUDED_QTGUI_FREQ_SINK_F_H 24 #define INCLUDED_QTGUI_FREQ_SINK_F_H 25 26 #ifdef ENABLE_PYTHON 27 #include <Python.h> 28 #endif 29 30 #include <gnuradio/filter/firdes.h> 31 #include <gnuradio/qtgui/api.h> 32 #include <gnuradio/qtgui/trigger_mode.h> 33 #include <gnuradio/sync_block.h> 34 #include <qapplication.h> 35 36 namespace gr { 37 namespace qtgui { 38 39 /*! 40 * \brief A graphical sink to display multiple signals in frequency. 41 * \ingroup instrumentation_blk 42 * \ingroup qtgui_blk 43 * 44 * \details 45 * This is a QT-based graphical sink the takes set of a floating 46 * point streams and plots the PSD. Each signal is plotted with a 47 * different color, and the \a set_title and \a set_color 48 * functions can be used to change the label and color for a given 49 * input number. 50 * 51 * The sink supports plotting streaming float data or 52 * messages. The message port is named "in". The two modes cannot 53 * be used simultaneously, and \p nconnections should be set to 0 54 * when using the message mode. GRC handles this issue by 55 * providing the "Float Message" type that removes the streaming 56 * port(s). 57 * 58 * This sink can plot messages that contain either uniform vectors 59 * of float 32 values (pmt::is_f32vector) or PDUs where the data 60 * is a uniform vector of float 32 values. 61 * 62 * Message Ports: 63 * 64 * - freq (input): 65 * Receives a PMT pair: (intern("freq"), double(frequency)). 66 * This is used to retune the center frequency of the 67 * display's x-axis. 68 * 69 * - bw (input): 70 * Receives a PMT pair: (intern("bw"), double(bandwidth)). 71 * This is used to programmatically change the bandwidth of 72 * of the display's x-axis. 73 * 74 * - freq (output): 75 * Produces a PMT pair with (intern("freq"), double(frequency)). 76 * When a user double-clicks on the display, the block 77 * produces and emits a message containing the frequency of 78 * where on the x-axis the user clicked. This value can be 79 * used by other blocks to update their frequency setting. 80 * 81 * To perform click-to-tune behavior, this output 'freq' 82 * port can be redirected to this block's input 'freq' port 83 * to catch the message and update the center frequency of 84 * the display. 85 */ 86 class QTGUI_API freq_sink_f : virtual public sync_block 87 { 88 public: 89 // gr::qtgui::freq_sink_f::sptr 90 typedef boost::shared_ptr<freq_sink_f> sptr; 91 92 /*! 93 * \brief Build a floating point PSD sink. 94 * 95 * \param fftsize size of the FFT to compute and display. If using 96 * the PDU message port to plot samples, the length of 97 * each PDU must be a multiple of the FFT size. 98 * \param wintype type of window to apply (see gr::fft::window::win_type) 99 * \param fc center frequency of signal (use for x-axis labels) 100 * \param bw bandwidth of signal (used to set x-axis labels) 101 * \param name title for the plot 102 * \param nconnections number of signals to be connected to the 103 * sink. The PDU message port is always available for a 104 * connection, and this value must be set to 0 if only 105 * the PDU message port is being used. 106 * \param parent a QWidget parent object, if any 107 */ 108 static sptr make(int fftsize, 109 int wintype, 110 double fc, 111 double bw, 112 const std::string& name, 113 int nconnections = 1, 114 QWidget* parent = NULL); 115 116 virtual void exec_() = 0; 117 virtual QWidget* qwidget() = 0; 118 119 #ifdef ENABLE_PYTHON 120 virtual PyObject* pyqwidget() = 0; 121 #else 122 virtual void* pyqwidget() = 0; 123 #endif 124 125 virtual void set_fft_size(const int fftsize) = 0; 126 virtual int fft_size() const = 0; 127 virtual void set_fft_average(const float fftavg) = 0; 128 virtual float fft_average() const = 0; 129 virtual void set_fft_window(const gr::filter::firdes::win_type win) = 0; 130 virtual gr::filter::firdes::win_type fft_window() = 0; 131 132 virtual void set_frequency_range(const double centerfreq, const double bandwidth) = 0; 133 virtual void set_y_axis(double min, double max) = 0; 134 135 virtual void set_update_time(double t) = 0; 136 137 virtual void set_title(const std::string& title) = 0; 138 virtual void set_y_label(const std::string& label, const std::string& unit) = 0; 139 virtual void set_line_label(unsigned int which, const std::string& label) = 0; 140 virtual void set_line_color(unsigned int which, const std::string& color) = 0; 141 virtual void set_line_width(unsigned int which, int width) = 0; 142 virtual void set_line_style(unsigned int which, int style) = 0; 143 virtual void set_line_marker(unsigned int which, int marker) = 0; 144 virtual void set_line_alpha(unsigned int which, double alpha) = 0; 145 146 /*! 147 * Pass "true" to this function to only show the positive half 148 * of the spectrum. By default, this plotter shows the full 149 * spectrum (positive and negative halves). 150 */ 151 virtual void set_plot_pos_half(bool half) = 0; 152 153 /*! 154 * Set up a trigger for the sink to know when to start 155 * plotting. Useful to isolate events and avoid noise. 156 * 157 * The trigger modes are Free, Auto, Normal, and Tag (see 158 * gr::qtgui::trigger_mode). The first three are like a normal 159 * trigger function. Free means free running with no trigger, 160 * auto will trigger if the trigger event is seen, but will 161 * still plot otherwise, and normal will hold until the trigger 162 * event is observed. The Tag trigger mode allows us to trigger 163 * off a specific stream tag. The tag trigger is based only on 164 * the name of the tag, so when a tag of the given name is seen, 165 * the trigger is activated. 166 * 167 * In auto and normal mode, we look to see if the magnitude of 168 * the any FFT point is over the set level. 169 * 170 * \param mode The trigger_mode: free, auto, normal, or tag. 171 * \param level The magnitude of the trigger even for auto or normal modes. 172 * \param channel Which input channel to use for the trigger events. 173 * \param tag_key The name (as a string) of the tag to trigger off 174 * of if using the tag mode. 175 */ 176 virtual void set_trigger_mode(trigger_mode mode, 177 float level, 178 int channel, 179 const std::string& tag_key = "") = 0; 180 181 virtual std::string title() = 0; 182 virtual std::string line_label(unsigned int which) = 0; 183 virtual std::string line_color(unsigned int which) = 0; 184 virtual int line_width(unsigned int which) = 0; 185 virtual int line_style(unsigned int which) = 0; 186 virtual int line_marker(unsigned int which) = 0; 187 virtual double line_alpha(unsigned int which) = 0; 188 189 virtual void set_size(int width, int height) = 0; 190 191 virtual void enable_menu(bool en = true) = 0; 192 virtual void enable_grid(bool en = true) = 0; 193 virtual void enable_autoscale(bool en = true) = 0; 194 virtual void enable_control_panel(bool en = true) = 0; 195 virtual void enable_max_hold(bool en) = 0; 196 virtual void enable_min_hold(bool en) = 0; 197 virtual void clear_max_hold() = 0; 198 virtual void clear_min_hold() = 0; 199 virtual void disable_legend() = 0; 200 virtual void reset() = 0; 201 virtual void enable_axis_labels(bool en = true) = 0; 202 203 QApplication* d_qApplication; 204 }; 205 206 } /* namespace qtgui */ 207 } /* namespace gr */ 208 209 #endif /* INCLUDED_QTGUI_FREQ_SINK_F_H */ 210