aboutsummaryrefslogtreecommitdiffstats
path: root/gr-qtgui/lib/time_sink_f_impl.h
blob: 9669be447002668974cbdad74b3a67a6a4f15885 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* -*- c++ -*- */
/*
 * Copyright 2011-2013,2015 Free Software Foundation, Inc.
 *
 * This file is part of GNU Radio
 *
 * GNU Radio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 *
 * GNU Radio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with GNU Radio; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

#ifndef INCLUDED_QTGUI_TIME_SINK_F_IMPL_H
#define INCLUDED_QTGUI_TIME_SINK_F_IMPL_H

#include <gnuradio/qtgui/time_sink_f.h>

#include <gnuradio/high_res_timer.h>
#include <gnuradio/qtgui/timedisplayform.h>

namespace gr {
namespace qtgui {

class QTGUI_API time_sink_f_impl : public time_sink_f
{
private:
    void initialize();

    int d_size, d_buffer_size;
    double d_samp_rate;
    std::string d_name;
    unsigned int d_nconnections;

    int d_index, d_start, d_end;
    std::vector<float*> d_fbuffers;
    std::vector<double*> d_buffers;
    std::vector<std::vector<gr::tag_t>> d_tags;

    int d_argc;
    char* d_argv;
    QWidget* d_parent;
    TimeDisplayForm* d_main_gui;

    gr::high_res_timer_type d_update_time;
    gr::high_res_timer_type d_last_time;

    // Members used for triggering scope
    trigger_mode d_trigger_mode;
    trigger_slope d_trigger_slope;
    float d_trigger_level;
    int d_trigger_channel;
    int d_trigger_delay;
    pmt::pmt_t d_trigger_tag_key;
    bool d_triggered;
    int d_trigger_count;
    int d_initial_delay; // used for limiting d_trigger_delay

    void _reset();
    void _npoints_resize();
    void _adjust_tags(int adj);
    void _gui_update_trigger();
    void _test_trigger_tags(int nitems);
    void _test_trigger_norm(int nitems, gr_vector_const_void_star inputs);
    bool _test_trigger_slope(const float* in) const;

    // Handles message input port for displaying PDU samples.
    void handle_pdus(pmt::pmt_t msg);

public:
    time_sink_f_impl(int size,
                     double samp_rate,
                     const std::string& name,
                     unsigned int nconnections,
                     QWidget* parent = NULL);
    ~time_sink_f_impl();

    bool check_topology(int ninputs, int noutputs);

    void exec_();
    QWidget* qwidget();

#ifdef ENABLE_PYTHON
    PyObject* pyqwidget();
#else
    void* pyqwidget();
#endif

    void set_y_axis(double min, double max);
    void set_y_label(const std::string& label, const std::string& unit = "");
    void set_update_time(double t);
    void set_title(const std::string& title);
    void set_line_label(unsigned int which, const std::string& label);
    void set_line_color(unsigned int which, const std::string& color);
    void set_line_width(unsigned int which, int width);
    void set_line_style(unsigned int which, int style);
    void set_line_marker(unsigned int which, int marker);
    void set_nsamps(const int size);
    void set_samp_rate(const double samp_rate);
    void set_line_alpha(unsigned int which, double alpha);
    void set_trigger_mode(trigger_mode mode,
                          trigger_slope slope,
                          float level,
                          float delay,
                          int channel,
                          const std::string& tag_key = "");

    std::string title();
    std::string line_label(unsigned int which);
    std::string line_color(unsigned int which);
    int line_width(unsigned int which);
    int line_style(unsigned int which);
    int line_marker(unsigned int which);
    double line_alpha(unsigned int which);

    void set_size(int width, int height);

    int nsamps() const;

    void enable_menu(bool en);
    void enable_grid(bool en);
    void enable_autoscale(bool en);
    void enable_stem_plot(bool en);
    void enable_semilogx(bool en);
    void enable_semilogy(bool en);
    void enable_control_panel(bool en);
    void enable_tags(unsigned int which, bool en);
    void enable_tags(bool en);
    void enable_axis_labels(bool en);
    void disable_legend();

    void reset();

    int work(int noutput_items,
             gr_vector_const_void_star& input_items,
             gr_vector_void_star& output_items);
};

} /* namespace qtgui */
} /* namespace gr */

#endif /* INCLUDED_QTGUI_TIME_SINK_F_IMPL_H */