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