1 /* -*- c++ -*- */
2 /*
3  * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt
4  *           https://gqrx.dk/
5  *
6  * Copyright 2012-2013 Alexandru Csete OZ9AEC.
7  *
8  * Gqrx is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3, or (at your option)
11  * any later version.
12  *
13  * Gqrx is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Gqrx; see the file COPYING.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street,
21  * Boston, MA 02110-1301, USA.
22  */
23 #include <QDebug>
24 #include <QString>
25 #include "agc_options.h"
26 #include "ui_agc_options.h"
27 
CAgcOptions(QWidget * parent)28 CAgcOptions::CAgcOptions(QWidget *parent) :
29     QDialog(parent),
30     ui(new Ui::CAgcOptions)
31 {
32     ui->setupUi(this);
33 }
34 
~CAgcOptions()35 CAgcOptions::~CAgcOptions()
36 {
37     delete ui;
38 }
39 
40 /*! \brief Catch window close events.
41  *
42  * This method is called when the user closes the dialog window using the
43  * window close icon. We catch the event and hide the dialog but keep it
44  * around for later use.
45  */
closeEvent(QCloseEvent * event)46 void CAgcOptions::closeEvent(QCloseEvent *event)
47 {
48     hide();
49     event->ignore();
50 }
51 
52 /*! \brief Get current gain slider value. */
gain()53 int CAgcOptions::gain()
54 {
55     return ui->gainSlider->value();
56 }
57 
58 /*! \brief Set AGC preset. */
setPreset(agc_preset_e preset)59 void CAgcOptions::setPreset(agc_preset_e preset)
60 {
61     switch (preset)
62     {
63     case AGC_FAST:
64         setDecay(100);
65         enableDecay(false);
66         setSlope(0);
67         enableSlope(false);
68         enableGain(false);
69         break;
70 
71     case AGC_MEDIUM:
72         setDecay(500);
73         enableDecay(false);
74         setSlope(0);
75         enableSlope(false);
76         enableGain(false);
77         break;
78 
79     case AGC_SLOW:
80         setDecay(2000);
81         enableDecay(false);
82         setSlope(0);
83         enableSlope(false);
84         enableGain(false);
85         break;
86 
87     case AGC_USER:
88         enableDecay(true);
89         enableSlope(true);
90         enableGain(false);
91         break;
92 
93     case AGC_OFF:
94         enableGain(true);
95         break;
96 
97     default:
98         qDebug() << __func__ << "Invalid AGC preset" << preset;
99         break;
100 
101     }
102 }
103 
104 /*! \brief Set new gain slider value. */
setGain(int value)105 void CAgcOptions::setGain(int value)
106 {
107     ui->gainSlider->setValue(value);
108     ui->gainLabel->setText(QString("%1 dB").arg(ui->gainSlider->value()));
109 }
110 
111 /*! \brief Enable or disable gain slider.
112  *  \param enabled Whether the slider should be enabled or not.
113  *
114  * The gain slider is enabled when AGC is OFF to provide manual gain
115  * control. It is disabled when AGC is ON.
116  */
enableGain(bool enabled)117 void CAgcOptions::enableGain(bool enabled)
118 {
119     ui->gainLabel->setEnabled(enabled);
120     ui->gainSlider->setEnabled(enabled);
121     ui->label1->setEnabled(enabled);
122 }
123 
124 /*! \brief Get current AGC threshold. */
threshold()125 int CAgcOptions::threshold()
126 {
127     return ui->thresholdSlider->value();
128 }
129 
130 /*! \brief Set new AGC threshold. */
setThreshold(int value)131 void CAgcOptions::setThreshold(int value)
132 {
133     ui->thresholdSlider->setValue(value);
134     ui->thresholdLabel->setText(QString("%1 dB").arg(ui->thresholdSlider->value()));
135 }
136 
137 /*! \brief Get current AGC slope. */
slope()138 int CAgcOptions::slope()
139 {
140     return ui->slopeSlider->value();
141 }
142 
143 /*! \brief Set new AGC slope. */
setSlope(int value)144 void CAgcOptions::setSlope(int value)
145 {
146     ui->slopeSlider->setValue(value);
147     ui->slopeLabel->setText(QString("%1 dB").arg(ui->slopeSlider->value()));
148 }
149 
150 /*! \brief Enable or disable AGC slope slider.
151  *  \param enabled Whether the slider should be enabled or not.
152  *
153  * The slope slider is enabled when AGC is in user mode.
154  */
enableSlope(bool enabled)155 void CAgcOptions::enableSlope(bool enabled)
156 {
157     ui->slopeSlider->setEnabled(enabled);
158     ui->slopeLabel->setEnabled(enabled);
159     ui->label3->setEnabled(enabled);
160 }
161 
162 /*! \brief Get current decay value. */
decay()163 int CAgcOptions::decay()
164 {
165     return ui->decaySlider->value();
166 }
167 
168 /*! \brief Set new decay value. */
setDecay(int value)169 void CAgcOptions::setDecay(int value)
170 {
171     ui->decaySlider->setValue(value);
172     ui->decayLabel->setText(QString("%1 ms").arg(ui->decaySlider->value()));
173 }
174 
175 /*! \brief Enable or disable AGC decay slider.
176  *  \param enabled Whether the slider should be enabled or not.
177  *
178  * The decay slider is enabled when AGC is in user mode.
179  */
enableDecay(bool enabled)180 void CAgcOptions::enableDecay(bool enabled)
181 {
182     ui->decaySlider->setEnabled(enabled);
183     ui->decayLabel->setEnabled(enabled);
184     ui->label4->setEnabled(enabled);
185 }
186 
187 /*! \brief Get current state of AGC hang button. */
hang()188 bool CAgcOptions::hang()
189 {
190     return ui->hangButton->isChecked();
191 }
192 
193 /*! \brief Set state og AGC hang button. */
setHang(bool checked)194 void CAgcOptions::setHang(bool checked)
195 {
196     ui->hangButton->setChecked(checked);
197 }
198 
199 
200 
201 /*! \brief AGC gain slider value has changed. */
on_gainSlider_valueChanged(int gain)202 void CAgcOptions::on_gainSlider_valueChanged(int gain)
203 {
204     ui->gainLabel->setText(QString("%1 dB").arg(ui->gainSlider->value()));
205     emit gainChanged(gain);
206 }
207 
208 /*! \brief AGC threshold slider value has changed. */
on_thresholdSlider_valueChanged(int threshold)209 void CAgcOptions::on_thresholdSlider_valueChanged(int threshold)
210 {
211     ui->thresholdLabel->setText(QString("%1 dB").arg(ui->thresholdSlider->value()));
212     emit thresholdChanged(threshold);
213 }
214 
215 /*! \brief AGC slope slider value has changed. */
on_slopeSlider_valueChanged(int slope)216 void CAgcOptions::on_slopeSlider_valueChanged(int slope)
217 {
218     ui->slopeLabel->setText(QString("%1 dB").arg(ui->slopeSlider->value()));
219     emit slopeChanged(slope);
220 }
221 
222 /*! \brief AGC decay slider value has changed. */
on_decaySlider_valueChanged(int decay)223 void CAgcOptions::on_decaySlider_valueChanged(int decay)
224 {
225     ui->decayLabel->setText(QString("%1 ms").arg(ui->decaySlider->value()));
226     emit decayChanged(decay);
227 }
228 
229 /*! \brief AGC hang button has been toggled. */
on_hangButton_toggled(bool checked)230 void CAgcOptions::on_hangButton_toggled(bool checked)
231 {
232     ui->hangButton->setText(checked ? tr("Enabled") : tr("Disabled"));
233     emit hangChanged(checked);
234 }
235