SDRAngel  4.11.5
Developer docs for <a href="https://github.com/f4exb/sdrangel">SDRangel<\a>, an Open Source Qt5 / OpenGL 3.0+ SDR and signal analyzer frontend to various hardware.
ammodgui.cpp
Go to the documentation of this file.
1 // Copyright (C) 2016 Edouard Griffiths, F4EXB //
3 // //
4 // This program is free software; you can redistribute it and/or modify //
5 // it under the terms of the GNU General Public License as published by //
6 // the Free Software Foundation as version 3 of the License, or //
7 // (at your option) any later version. //
8 // //
9 // This program is distributed in the hope that it will be useful, //
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of //
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
12 // GNU General Public License V3 for more details. //
13 // //
14 // You should have received a copy of the GNU General Public License //
15 // along with this program. If not, see <http://www.gnu.org/licenses/>. //
17 
18 #include <QDockWidget>
19 #include <QMainWindow>
20 #include <QFileDialog>
21 #include <QTime>
22 #include <QDebug>
23 
24 #include "device/deviceuiset.h"
25 #include "dsp/upchannelizer.h"
26 
27 #include "plugin/pluginapi.h"
28 #include "util/simpleserializer.h"
29 #include "util/db.h"
30 #include "dsp/dspengine.h"
31 #include "gui/crightclickenabler.h"
32 #include "gui/audioselectdialog.h"
34 #include "mainwindow.h"
35 
36 #include "ui_ammodgui.h"
37 #include "ammodgui.h"
38 
39 AMModGUI* AMModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx)
40 {
41  AMModGUI* gui = new AMModGUI(pluginAPI, deviceUISet, channelTx);
42  return gui;
43 }
44 
46 {
47  delete this;
48 }
49 
50 void AMModGUI::setName(const QString& name)
51 {
52  setObjectName(name);
53 }
54 
55 QString AMModGUI::getName() const
56 {
57  return objectName();
58 }
59 
62 }
63 
64 void AMModGUI::setCenterFrequency(qint64 centerFrequency)
65 {
66  m_channelMarker.setCenterFrequency(centerFrequency);
67  applySettings();
68 }
69 
71 {
74  applySettings(true);
75 }
76 
77 QByteArray AMModGUI::serialize() const
78 {
79  return m_settings.serialize();
80 }
81 
82 bool AMModGUI::deserialize(const QByteArray& data)
83 {
84  if(m_settings.deserialize(data)) {
86  applySettings(true);
87  return true;
88  } else {
90  return false;
91  }
92 }
93 
94 bool AMModGUI::handleMessage(const Message& message)
95 {
97  {
98  m_recordSampleRate = ((AMMod::MsgReportFileSourceStreamData&)message).getSampleRate();
99  m_recordLength = ((AMMod::MsgReportFileSourceStreamData&)message).getRecordLength();
100  m_samplesCount = 0;
102  return true;
103  }
105  {
106  m_samplesCount = ((AMMod::MsgReportFileSourceStreamTiming&)message).getSamplesCount();
108  return true;
109  }
110  else if (AMMod::MsgConfigureAMMod::match(message))
111  {
112  const AMMod::MsgConfigureAMMod& cfg = (AMMod::MsgConfigureAMMod&) message;
113  m_settings = cfg.getSettings();
114  blockApplySettings(true);
115  displaySettings();
116  blockApplySettings(false);
117  return true;
118  }
119  else if (CWKeyer::MsgConfigureCWKeyer::match(message))
120  {
122  ui->cwKeyerGUI->setSettings(cfg.getSettings());
123  ui->cwKeyerGUI->displaySettings();
124  return true;
125  }
126  else
127  {
128  return false;
129  }
130 }
131 
133 {
134  ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
136  applySettings();
137 }
138 
140 {
141  Message* message;
142 
143  while ((message = getInputMessageQueue()->pop()) != 0)
144  {
145  if (handleMessage(*message))
146  {
147  delete message;
148  }
149  }
150 }
151 
153 {
156  applySettings();
157 }
158 
160 {
161  ui->rfBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1));
162  m_settings.m_rfBandwidth = value * 100.0;
163  m_channelMarker.setBandwidth(value * 100);
164  applySettings();
165 }
166 
168 {
169  ui->modPercentText->setText(QString("%1").arg(value));
170  m_settings.m_modFactor = value / 100.0;
171  applySettings();
172 }
173 
175 {
176  ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
177  m_settings.m_volumeFactor = value / 10.0;
178  applySettings();
179 }
180 
182 {
183  ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2));
184  m_settings.m_toneFrequency = value * 10.0;
185  applySettings();
186 }
187 
188 
190 {
191  m_settings.m_channelMute = checked;
192  applySettings();
193 }
194 
196 {
197  m_settings.m_playLoop = checked;
198  applySettings();
199 }
200 
201 void AMModGUI::on_play_toggled(bool checked)
202 {
203  ui->tone->setEnabled(!checked); // release other source inputs
204  ui->morseKeyer->setEnabled(!checked);
205  ui->mic->setEnabled(!checked);
207  applySettings();
208  ui->navTimeSlider->setEnabled(!checked);
209  m_enableNavTime = !checked;
210 }
211 
212 void AMModGUI::on_tone_toggled(bool checked)
213 {
214  ui->play->setEnabled(!checked); // release other source inputs
215  ui->morseKeyer->setEnabled(!checked);
216  ui->mic->setEnabled(!checked);
218  applySettings();
219 }
220 
222 {
223  ui->play->setEnabled(!checked); // release other source inputs
224  ui->tone->setEnabled(!checked); // release other source inputs
225  ui->mic->setEnabled(!checked);
227  applySettings();
228 }
229 
230 void AMModGUI::on_mic_toggled(bool checked)
231 {
232  ui->play->setEnabled(!checked); // release other source inputs
233  ui->morseKeyer->setEnabled(!checked);
234  ui->tone->setEnabled(!checked); // release other source inputs
236  applySettings();
237 }
238 
240 {
242  applySettings();
243 }
244 
246 {
247  ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2));
248  m_settings.m_feedbackVolumeFactor = value / 100.0;
249  applySettings();
250 }
251 
253 {
254  if (m_enableNavTime && ((value >= 0) && (value <= 100)))
255  {
256  int t_sec = (m_recordLength * value) / 100;
257  QTime t(0, 0, 0, 0);
258  t = t.addSecs(t_sec);
259 
261  m_amMod->getInputMessageQueue()->push(message);
262  }
263 }
264 
266 {
267  (void) checked;
268  QString fileName = QFileDialog::getOpenFileName(this,
269  tr("Open raw audio file"), ".", tr("Raw audio Files (*.raw)"), 0, QFileDialog::DontUseNativeDialog);
270 
271  if (fileName != "")
272  {
273  m_fileName = fileName;
274  ui->recordFileText->setText(m_fileName);
275  ui->play->setEnabled(true);
277  }
278 }
279 
281 {
282  qDebug() << "FileSourceGui::configureFileName: " << m_fileName.toStdString().c_str();
284  m_amMod->getInputMessageQueue()->push(message);
285 }
286 
287 void AMModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
288 {
289  (void) widget;
290  (void) rollDown;
291 }
292 
293 void AMModGUI::onMenuDialogCalled(const QPoint &p)
294 {
296  {
303  dialog.move(p);
304  dialog.exec();
305 
314 
315  setWindowTitle(m_settings.m_title);
317 
318  applySettings();
319  }
320 
322 }
323 
324 AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent) :
325  RollupWidget(parent),
326  ui(new Ui::AMModGUI),
327  m_pluginAPI(pluginAPI),
328  m_deviceUISet(deviceUISet),
329  m_channelMarker(this),
330  m_doApplySettings(true),
331  m_recordLength(0),
332  m_recordSampleRate(48000),
333  m_samplesCount(0),
334  m_tickCount(0),
335  m_enableNavTime(false)
336 {
337  ui->setupUi(this);
338  setAttribute(Qt::WA_DeleteOnClose, true);
339  connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
340  connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
341 
342  m_amMod = (AMMod*) channelTx; //new AMMod(m_deviceUISet->m_deviceSinkAPI);
344 
345  connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
346 
347  CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->mic);
348  connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect()));
349 
350  CRightClickEnabler *feedbackRightClickEnabler = new CRightClickEnabler(ui->feedbackEnable);
351  connect(feedbackRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioFeedbackSelect()));
352 
353  ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
354  ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
355  ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
356 
357  m_channelMarker.blockSignals(true);
358  m_channelMarker.setColor(Qt::yellow);
361  m_channelMarker.setTitle("AM Modulator");
363  m_channelMarker.blockSignals(false);
364  m_channelMarker.setVisible(true); // activate signal on the last setting only
365 
367  m_settings.setCWKeyerGUI(ui->cwKeyerGUI);
368 
372 
373  connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor()));
374 
375  ui->play->setEnabled(false);
376  ui->play->setChecked(false);
377  ui->tone->setChecked(false);
378  ui->morseKeyer->setChecked(false);
379  ui->mic->setChecked(false);
380 
381  ui->cwKeyerGUI->setCWKeyer(m_amMod->getCWKeyer());
382 
383  connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
384  connect(m_amMod, SIGNAL(levelChanged(qreal, qreal, int)), ui->volumeMeter, SLOT(levelChanged(qreal, qreal, int)));
385 
386  displaySettings();
387  applySettings(true);
388 }
389 
391 {
393  delete m_amMod; // TODO: check this: when the GUI closes it has to delete the modulator
394  delete ui;
395 }
396 
398 {
399  m_doApplySettings = !block;
400 }
401 
402 void AMModGUI::applySettings(bool force)
403 {
404  if (m_doApplySettings)
405  {
407 
410  m_amMod->getInputMessageQueue()->push(msgConfigure);
411 
413  m_amMod->getInputMessageQueue()->push(message);
414  }
415 }
416 
418 {
419  m_channelMarker.blockSignals(true);
423  m_channelMarker.blockSignals(false);
424  m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
425 
427  setWindowTitle(m_channelMarker.getTitle());
428 
429  blockApplySettings(true);
430 
431  ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
432 
433  ui->rfBW->setValue(roundf(m_settings.m_rfBandwidth / 100.0));
434  ui->rfBWText->setText(QString("%1 kHz").arg(m_settings.m_rfBandwidth / 1000.0, 0, 'f', 1));
435 
436  int modPercent = roundf(m_settings.m_modFactor * 100.0);
437  ui->modPercent->setValue(modPercent);
438  ui->modPercentText->setText(QString("%1").arg(modPercent));
439 
440  ui->toneFrequency->setValue(roundf(m_settings.m_toneFrequency / 10.0));
441  ui->toneFrequencyText->setText(QString("%1k").arg(m_settings.m_toneFrequency / 1000.0, 0, 'f', 2));
442 
443  ui->volume->setValue(roundf(m_settings.m_volumeFactor * 10.0));
444  ui->volumeText->setText(QString("%1").arg(m_settings.m_volumeFactor, 0, 'f', 1));
445 
446  ui->channelMute->setChecked(m_settings.m_channelMute);
447  ui->playLoop->setChecked(m_settings.m_playLoop);
448 
449  ui->tone->setEnabled((m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputTone) || (m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputNone));
450  ui->mic->setEnabled((m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputAudio) || (m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputNone));
451  ui->play->setEnabled((m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputFile) || (m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputNone));
452  ui->morseKeyer->setEnabled((m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputCWTone) || (m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputNone));
453 
454  ui->tone->setChecked(m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputTone);
455  ui->mic->setChecked(m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputAudio);
456  ui->play->setChecked(m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputFile);
457  ui->morseKeyer->setChecked(m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputCWTone);
458 
459  ui->feedbackEnable->setChecked(m_settings.m_feedbackAudioEnable);
460  ui->feedbackVolume->setValue(roundf(m_settings.m_feedbackVolumeFactor * 100.0));
461  ui->feedbackVolumeText->setText(QString("%1").arg(m_settings.m_feedbackVolumeFactor, 0, 'f', 2));
462 
463  blockApplySettings(false);
464 }
465 
466 void AMModGUI::leaveEvent(QEvent*)
467 {
469 }
470 
471 void AMModGUI::enterEvent(QEvent*)
472 {
474 }
475 
477 {
478  qDebug("AMModGUI::audioSelect");
479  AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName, true); // true for input
480  audioSelect.exec();
481 
482  if (audioSelect.m_selected)
483  {
485  applySettings();
486  }
487 }
488 
490 {
491  qDebug("AMModGUI::audioFeedbackSelect");
492  AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName, false); // false for output
493  audioSelect.exec();
494 
495  if (audioSelect.m_selected)
496  {
498  applySettings();
499  }
500 }
501 
503 {
504  double powDb = CalcDb::dbPower(m_amMod->getMagSq());
505  m_channelPowerDbAvg(powDb);
506  ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
507 
509  {
511  m_amMod->getInputMessageQueue()->push(message);
512  }
513 }
514 
516 {
517  QTime recordLength(0, 0, 0, 0);
518  recordLength = recordLength.addSecs(m_recordLength);
519  QString s_time = recordLength.toString("HH:mm:ss");
520  ui->recordLengthText->setText(s_time);
522 }
523 
525 {
526  int t_sec = 0;
527  int t_msec = 0;
528 
529  if (m_recordSampleRate > 0)
530  {
531  t_msec = ((m_samplesCount * 1000) / m_recordSampleRate) % 1000;
533  }
534 
535  QTime t(0, 0, 0, 0);
536  t = t.addSecs(t_sec);
537  t = t.addMSecs(t_msec);
538  QString s_timems = t.toString("HH:mm:ss.zzz");
539  QString s_time = t.toString("HH:mm:ss");
540  ui->relTimeText->setText(s_timems);
541 
542  if (!m_enableNavTime)
543  {
544  float posRatio = (float) t_sec / (float) m_recordLength;
545  ui->navTimeSlider->setValue((int) (posRatio * 100.0));
546  }
547 }
void enterEvent(QEvent *)
Definition: ammodgui.cpp:471
void configureFileName()
Definition: ammodgui.cpp:280
void removeTxChannelInstance(PluginInstanceGUI *pluginGUI)
virtual qint64 getCenterFrequency() const
Definition: ammodgui.cpp:60
int m_samplesCount
Definition: ammodgui.h:75
static MainWindow * getInstance()
Definition: mainwindow.h:73
void blockApplySettings(bool block)
Definition: ammodgui.cpp:397
const QString & getReverseAPIAddress() const
void on_deltaFrequency_changed(qint64 value)
Definition: ammodgui.cpp:152
virtual void destroy()
Definition: ammodgui.cpp:45
Definition: ammod.h:47
static const QString m_channelIdURI
Definition: ammod.h:249
float m_feedbackVolumeFactor
Definition: ammodsettings.h:48
void on_modPercent_valueChanged(int value)
Definition: ammodgui.cpp:167
void on_feedbackVolume_valueChanged(int value)
Definition: ammodgui.cpp:245
void channelMarkerChangedByCursor()
Definition: ammodgui.cpp:132
int getCenterFrequency() const
Definition: channelmarker.h:42
void registerTxChannelInstance(const QString &channelName, PluginInstanceGUI *pluginGUI)
Definition: deviceuiset.cpp:88
void push(Message *message, bool emitSignal=true)
Push message onto queue.
bool m_feedbackAudioEnable
Definition: ammodsettings.h:49
uint16_t m_reverseAPIDeviceIndex
Definition: ammodsettings.h:53
void handleSourceMessages()
Definition: ammodgui.cpp:139
static double dbPower(double magsq, double floor=1e-12)
Definition: db.cpp:22
void on_channelMute_toggled(bool checked)
Definition: ammodgui.cpp:189
const AMModSettings & getSettings() const
Definition: ammod.h:55
void leaveEvent(QEvent *)
Definition: ammodgui.cpp:466
virtual MessageQueue * getInputMessageQueue()
Definition: ammodgui.h:55
void updateWithStreamData()
Definition: ammodgui.cpp:515
void on_play_toggled(bool checked)
Definition: ammodgui.cpp:201
void updateWithStreamTime()
Definition: ammodgui.cpp:524
MessageQueue * getInputMessageQueue()
Get the queue for asynchronous inbound communication.
QByteArray serialize() const
void on_rfBW_valueChanged(int value)
Definition: ammodgui.cpp:159
void setReverseAPIChannelIndex(uint16_t channelIndex)
QString m_reverseAPIAddress
Definition: ammodsettings.h:51
CWKeyer * getCWKeyer()
Definition: ammod.h:247
void resetContextMenuType()
Definition: rollupwidget.h:50
void addChannelMarker(ChannelMarker *channelMarker)
Add channel marker to spectrum.
Definition: deviceuiset.cpp:72
Ui::AMModGUI * ui
Definition: ammodgui.h:62
bool m_enableNavTime
Definition: ammodgui.h:77
static MsgConfigureFileSourceStreamTiming * create()
Definition: ammod.h:144
MovingAverageUtil< double, double, 20 > m_channelPowerDbAvg
Definition: ammodgui.h:70
void on_mic_toggled(bool checked)
Definition: ammodgui.cpp:230
PluginAPI * m_pluginAPI
Definition: ammodgui.h:63
void audioSelect()
Definition: ammodgui.cpp:476
ContextMenuType m_contextMenuType
Definition: rollupwidget.h:33
int m_recordSampleRate
Definition: ammodgui.h:74
Fixed< IntType, IntBits > arg(const std::complex< Fixed< IntType, IntBits > > &val)
Definition: fixed.h:2401
DeviceUISet * m_deviceUISet
Definition: ammodgui.h:64
void setReverseAPIDeviceIndex(uint16_t deviceIndex)
quint32 m_recordLength
Definition: ammodgui.h:73
void audioFeedbackSelect()
Definition: ammodgui.cpp:489
QByteArray serialize() const
Definition: ammodgui.cpp:77
double getMagSq() const
Definition: ammod.h:245
float m_volumeFactor
Definition: ammodsettings.h:40
bool deserialize(const QByteArray &data)
void onWidgetRolled(QWidget *widget, bool rollDown)
Definition: ammodgui.cpp:287
void setChannelMarker(Serializable *channelMarker)
Definition: ammodsettings.h:61
void resetToDefaults()
void setSourceOrSinkStream(bool sourceOrSinkStream)
Definition: channelmarker.h:75
static DSPEngine * instance()
Definition: dspengine.cpp:51
void setTitleColor(const QColor &c)
void setHighlighted(bool highlighted)
std::size_t m_tickCount
Definition: ammodgui.h:76
virtual bool handleMessage(const Message &message)
Definition: ammodgui.cpp:94
void resetToDefaults()
Definition: ammodgui.cpp:70
QString m_fileName
Definition: ammodgui.h:72
void on_morseKeyer_toggled(bool checked)
Definition: ammodgui.cpp:221
void addRollupWidget(QWidget *widget)
Add rollup widget to channel window.
Definition: deviceuiset.cpp:77
virtual void setMessageQueueToGUI(MessageQueue *queue)
void displaySettings()
Definition: ammodgui.cpp:417
bool m_doApplySettings
Definition: ammodgui.h:67
void onMenuDialogCalled(const QPoint &p)
Definition: ammodgui.cpp:293
const QString & getTitle() const
Definition: channelmarker.h:38
static bool match(const Message *message)
Definition: message.cpp:45
void on_navTimeSlider_valueChanged(int value)
Definition: ammodgui.cpp:252
static MsgConfigureFileSourceName * create(const QString &fileName)
Definition: ammod.h:104
void tick()
Definition: ammodgui.cpp:502
ChannelMarker m_channelMarker
Definition: ammodgui.h:65
quint32 m_rgbColor
Definition: ammodsettings.h:43
QString m_feedbackAudioDeviceName
This is the audio device you send the audio samples to for audio feedback.
Definition: ammodsettings.h:47
void on_tone_toggled(bool checked)
Definition: ammodgui.cpp:212
void setCWKeyerGUI(Serializable *cwKeyerGUI)
Definition: ammodsettings.h:62
uint16_t m_reverseAPIChannelIndex
Definition: ammodsettings.h:54
void on_feedbackEnable_toggled(bool checked)
Definition: ammodgui.cpp:239
QString m_title
Definition: ammodsettings.h:44
qint64 m_inputFrequencyOffset
Definition: ammodsettings.h:36
AMMod * m_amMod
Definition: ammodgui.h:69
void setReverseAPIAddress(const QString &address)
QString m_audioDeviceName
This is the audio device you get the audio samples from.
Definition: ammodsettings.h:46
virtual ~AMModGUI()
Definition: ammodgui.cpp:390
void setColor(const QColor &color)
static MsgConfigureChannelizer * create(int sampleRate, int centerFrequency)
Definition: ammod.h:81
static MsgConfigureFileSourceSeek * create(int seekPercentage)
Definition: ammod.h:125
virtual void setCenterFrequency(qint64 centerFrequency)
Definition: ammodgui.cpp:64
void on_playLoop_toggled(bool checked)
Definition: ammodgui.cpp:195
void applySettings(bool force=false)
Definition: ammodgui.cpp:402
void setVisible(bool visible)
static AMModGUI * create(PluginAPI *pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx)
Definition: ammodgui.cpp:39
void setBandwidth(int bandwidth)
bool m_useReverseAPI
Definition: ammodsettings.h:50
const QColor & getColor() const
Definition: channelmarker.h:64
void setTitle(const QString &title)
float m_toneFrequency
Definition: ammodsettings.h:39
void setName(const QString &name)
Definition: ammodgui.cpp:50
void on_toneFrequency_valueChanged(int value)
Definition: ammodgui.cpp:181
void setCenterFrequency(int centerFrequency)
QString getName() const
Definition: ammodgui.cpp:55
AMModInputAF m_modAFInput
Definition: ammodsettings.h:45
bool deserialize(const QByteArray &data)
Definition: ammodgui.cpp:82
void widgetRolled(QWidget *widget, bool rollDown)
void on_showFileDialog_clicked(bool checked)
Definition: ammodgui.cpp:265
void setUseReverseAPI(bool useReverseAPI)
AMModSettings m_settings
Definition: ammodgui.h:66
const CWKeyerSettings & getSettings() const
Definition: cwkeyer.h:60
static MsgConfigureAMMod * create(const AMModSettings &settings, bool force)
Definition: ammod.h:58
void on_volume_valueChanged(int value)
Definition: ammodgui.cpp:174
AMModGUI(PluginAPI *pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget *parent=0)
Definition: ammodgui.cpp:324
uint16_t m_reverseAPIPort
Definition: ammodsettings.h:52