/*
 * Copyright 2016 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.
 */

#include "display_qt.h"

mywindow::mywindow() : QWidget()
{
    // We'll use a horizontal layout of two QTabWidgets
    layout = new QHBoxLayout();

    // Create the tab widgets
    tab0 = new QTabWidget();
    tab1 = new QTabWidget();

    // Add the tab widgets to the layou
    layout->addWidget(tab0);
    layout->addWidget(tab1);

    // Set the layout as the main widget's layou
    setLayout(layout);

    // Simple resizing of the app
    resize(2000, 800);

    // sample rate
    int rate = 48000;

    // Create the GNU Radio top block
    tb = make_top_block("display_qt");

    // Source will be sine wave in noise
    src0 = analog::sig_source_f::make(rate, analog::GR_SIN_WAVE, 1500, 1);
    src1 = analog::noise_source_f::make(analog::GR_GAUSSIAN, 0.1);

    // Combine signal and noise; add throttle
    src = blocks::add_ff::make();
    thr = blocks::throttle::make(sizeof(float), rate);

    // Create the QTGUI sinks
    // Time, Freq, Waterfall, and Histogram sinks
    tsnk = qtgui::time_sink_f::make(1024, rate, "", 1);
    fsnk = qtgui::freq_sink_f::make(1024, fft::window::WIN_HANN, 0, rate, "", 1);
    wsnk = qtgui::waterfall_sink_f::make(1024, fft::window::WIN_HANN, 0, rate, "", 1);
    hsnk = qtgui::histogram_sink_f::make(1024, 100, -2, 2, "", 1);

    // Turn off the legend on these plots
    tsnk->disable_legend();
    fsnk->disable_legend();
    hsnk->disable_legend();

    // Connect the graph
    tb->connect(src0, 0, src, 0);
    tb->connect(src1, 0, src, 1);
    tb->connect(src, 0, thr, 0);
    tb->connect(thr, 0, tsnk, 0);
    tb->connect(thr, 0, fsnk, 0);
    tb->connect(thr, 0, wsnk, 0);
    tb->connect(thr, 0, hsnk, 0);

    // Get the raw QWidget objects from the GNU Radio blocks
    qtgui_time_sink_win = tsnk->qwidget();
    qtgui_freq_sink_win = fsnk->qwidget();
    qtgui_waterfall_sink_win = wsnk->qwidget();
    qtgui_histogram_sink_win = hsnk->qwidget();

    // Plug the widgets into the tabs
    tab0->addTab(qtgui_time_sink_win, "Time");
    tab0->addTab(qtgui_histogram_sink_win, "Hist");
    tab1->addTab(qtgui_freq_sink_win, "Freq");
    tab1->addTab(qtgui_waterfall_sink_win, "Waterfall");
}

mywindow::~mywindow() {}

void mywindow::start() { tb->start(); }

void mywindow::quitting()
{
    tb->stop();
    tb->wait();
}

int main(int argc, char** argv)
{
    // The global QT application
    QApplication app(argc, argv);

    mywindow* w = new mywindow();

    QObject::connect(&app, SIGNAL(aboutToQuit()), w, SLOT(quitting()));

    w->start(); // Start the flowgraph
    w->show();  // show the window
    app.exec(); // run the QT executor loop

    return 0;
}
