1 /* -*- c++ -*- */
2 /*
3 * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt
4 * https://gqrx.dk/
5 *
6 * Copyright 2020 Oliver Grossmann.
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 "dxc_options.h"
24 #include "ui_dxc_options.h"
25 #include <QTcpSocket>
26 #include <QString>
27 #include <QStringList>
28 #include "dxc_spots.h"
29
DXCOptions(QWidget * parent)30 DXCOptions::DXCOptions(QWidget *parent) :
31 QDialog(parent),
32 ui(new Ui::DXCOptions)
33 {
34 ui->setupUi(this);
35
36 /* select font for text viewer */
37 auto fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
38 fixedFont.setPointSize(10);
39 ui->plainTextEdit_DXCMonitor->setFont(fixedFont);
40
41 m_socket = new QTcpSocket(this);
42 connect(m_socket, SIGNAL(connected()),this, SLOT(connected()));
43 connect(m_socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
44 connect(m_socket, SIGNAL(readyRead()),this, SLOT(readyToRead()));
45 }
46
~DXCOptions()47 DXCOptions::~DXCOptions()
48 {
49 delete ui;
50 }
51
52 /*! \brief Catch window close events.
53 *
54 * This method is called when the user closes the audio options dialog
55 * window using the window close icon. We catch the event and hide the
56 * dialog but keep it around for later use.
57 */
closeEvent(QCloseEvent * event)58 void DXCOptions::closeEvent(QCloseEvent *event)
59 {
60 hide();
61 event->ignore();
62 }
63
64 /*! \brief Catch window show events. */
showEvent(QShowEvent * event)65 void DXCOptions::showEvent(QShowEvent * event)
66 {
67 Q_UNUSED(event);
68 }
69
on_pushButton_DXCConnect_clicked()70 void DXCOptions::on_pushButton_DXCConnect_clicked()
71 {
72 DXCSpots::Get().setSpotTimeout(ui->lineEdit_DXCSpottimeout->text().toInt());
73 m_socket->connectToHost(ui->lineEdit_DXCAddress->text(),ui->lineEdit_DXCPort->text().toInt());
74 if(!m_socket->waitForConnected(5000))
75 {
76 ui->plainTextEdit_DXCMonitor->appendPlainText(m_socket->errorString());
77 }
78 }
79
on_pushButton_DXCDisconnect_clicked()80 void DXCOptions::on_pushButton_DXCDisconnect_clicked()
81 {
82 m_socket->close();
83 }
84
connected()85 void DXCOptions::connected()
86 {
87 ui->plainTextEdit_DXCMonitor->appendPlainText("Connected");
88 ui->pushButton_DXCConnect->setDisabled(true);
89 ui->pushButton_DXCDisconnect->setEnabled(true);
90 }
91
disconnected()92 void DXCOptions::disconnected()
93 {
94 ui->plainTextEdit_DXCMonitor->appendPlainText("Disconnected");
95 ui->pushButton_DXCDisconnect->setDisabled(true);
96 ui->pushButton_DXCConnect->setEnabled(true);
97 }
98
readyToRead()99 void DXCOptions::readyToRead()
100 {
101 DXCSpotInfo info;
102 QStringList spot;
103 QString incomingMessage;
104
105 incomingMessage = m_socket->readLine();
106 while (incomingMessage.length() > 0)
107 {
108 ui->plainTextEdit_DXCMonitor->appendPlainText(incomingMessage.remove('\a').trimmed());
109 if(incomingMessage.contains("enter your call", Qt::CaseInsensitive)
110 || incomingMessage.contains("login:", Qt::CaseInsensitive))
111 {
112 m_socket->write(ui->lineEdit_DXCUSername->text().append("\n").toUtf8());
113 ui->plainTextEdit_DXCMonitor->appendPlainText(ui->lineEdit_DXCUSername->text());
114 }
115 else if(incomingMessage.contains("DX de", Qt::CaseInsensitive) &&
116 incomingMessage.contains(ui->lineEdit_DXCFilter->text()))
117 {
118 spot = incomingMessage.split(" ", QString::SkipEmptyParts);
119 if (spot.length() >= 5)
120 {
121 info.name = spot[4].trimmed();
122 info.frequency = spot[3].toDouble() * 1000;
123 DXCSpots::Get().add(info);
124 }
125 }
126
127 incomingMessage = m_socket->readLine();
128 }
129 }
130
saveSettings(QSettings * settings)131 void DXCOptions::saveSettings(QSettings *settings)
132 {
133 if (!settings)
134 return;
135
136 settings->beginGroup("dxcluster");
137
138 settings->setValue("DXCAddress", ui->lineEdit_DXCAddress->text());
139 settings->setValue("DXCPort", ui->lineEdit_DXCPort->text());
140 settings->setValue("DXCUsername", ui->lineEdit_DXCUSername->text());
141 settings->setValue("DXCSpotTimeout", ui->lineEdit_DXCSpottimeout->text());
142 settings->setValue("DXCFilter", ui->lineEdit_DXCFilter->text());
143
144 settings->endGroup();
145 }
146
readSettings(QSettings * settings)147 void DXCOptions::readSettings(QSettings *settings)
148 {
149 if (!settings)
150 return;
151
152 settings->beginGroup("dxcluster");
153 ui->lineEdit_DXCAddress->setText(settings->value("DXCAddress", "localhost").toString());
154 ui->lineEdit_DXCPort->setText(settings->value("DXCPort", "7300").toString());
155 ui->lineEdit_DXCUSername->setText(settings->value("DXCUsername", "nocall").toString());
156 ui->lineEdit_DXCSpottimeout->setText(settings->value("DXCSpotTimeout", "10").toString());
157 ui->lineEdit_DXCFilter->setText(settings->value("DXCFilter", "").toString());
158
159 settings->endGroup();
160 }
161