diff --git a/APRSISClient.cpp b/APRSISClient.cpp index c1a82e9..49a4f9c 100644 --- a/APRSISClient.cpp +++ b/APRSISClient.cpp @@ -194,17 +194,11 @@ void APRSISClient::enqueueSpot(QString theircall, QString grid, QString comment) enqueueRaw(spotFrame); } -void APRSISClient::enqueueMessage(QString tocall, QString message){ - if(m_localCall.isEmpty()) return; - - auto messageFrame = QString("%1>APRS,TCPIP*::%2:%3\n"); - messageFrame = messageFrame.arg(m_localCall); - messageFrame = messageFrame.arg(tocall + QString(" ").repeated(9-tocall.length())); - messageFrame = messageFrame.arg(message); - enqueueRaw(messageFrame); -} - void APRSISClient::enqueueThirdParty(QString theircall, QString payload){ + if(m_localPasscode != hashCallsign(m_localCall)){ + return; + } + auto frame = QString("%1>%2,APRS,TCPIP*:%3\n"); frame = frame.arg(theircall); frame = frame.arg(m_localCall); diff --git a/APRSISClient.h b/APRSISClient.h index 158e0c9..d078a4e 100644 --- a/APRSISClient.h +++ b/APRSISClient.h @@ -29,13 +29,15 @@ public: m_paused = paused; } - void setLocalStation(QString mycall, QString mygrid){ + void setLocalStation(QString mycall, QString mygrid, QString passcode){ m_localCall = mycall; m_localGrid = mygrid; + m_localPasscode = passcode; } + bool isPasscodeValid(){ return m_localPasscode == QString::number(hashCallsign(m_localCall)); } + void enqueueSpot(QString theircall, QString grid, QString comment); - void enqueueMessage(QString tocall, QString message); void enqueueThirdParty(QString theircall, QString payload); void enqueueRaw(QString aprsFrame); @@ -51,6 +53,7 @@ public slots: private: QString m_localCall; QString m_localGrid; + QString m_localPasscode; QQueue m_frameQueue; QString m_host; diff --git a/Configuration.cpp b/Configuration.cpp index e4b571b..c0f9f60 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -607,6 +607,7 @@ private: QString opCall_; QString aprs_server_name_; + QString aprs_passcode_; port_type aprs_server_port_; QString udp_server_name_; @@ -725,6 +726,7 @@ bool Configuration::split_mode () const {return m_->split_mode ();} QString Configuration::opCall() const {return m_->opCall_;} QString Configuration::aprs_server_name () const {return m_->aprs_server_name_;} auto Configuration::aprs_server_port () const -> port_type {return m_->aprs_server_port_;} +QString Configuration::aprs_passcode() const { return m_->aprs_passcode_; } QString Configuration::udp_server_name () const {return m_->udp_server_name_;} auto Configuration::udp_server_port () const -> port_type {return m_->udp_server_port_;} bool Configuration::accept_udp_requests () const {return m_->accept_udp_requests_;} @@ -1307,6 +1309,7 @@ void Configuration::impl::initialize_models () ui_->opCallEntry->setText (opCall_); ui_->aprs_server_line_edit->setText (aprs_server_name_); ui_->aprs_server_port_spin_box->setValue (aprs_server_port_); + ui_->aprs_passcode_line_edit->setText(aprs_passcode_); ui_->udp_server_line_edit->setText (udp_server_name_); ui_->udp_server_port_spin_box->setValue (udp_server_port_); ui_->accept_udp_requests_check_box->setChecked (accept_udp_requests_); @@ -1533,6 +1536,7 @@ void Configuration::impl::read_settings () opCall_ = settings_->value ("OpCall", "").toString (); aprs_server_name_ = settings_->value ("aprsServer", "rotate.aprs2.net").toString (); aprs_server_port_ = settings_->value ("aprsServerPort", 14580).toUInt (); + aprs_passcode_ = settings_->value ("aprsPasscode", "").toString(); udp_server_name_ = settings_->value ("UDPServer", "127.0.0.1").toString (); udp_server_port_ = settings_->value ("UDPServerPort", 2237).toUInt (); n1mm_server_name_ = settings_->value ("N1MMServer", "127.0.0.1").toString (); @@ -1648,6 +1652,7 @@ void Configuration::impl::write_settings () settings_->setValue ("OpCall", opCall_); settings_->setValue ("aprsServer", aprs_server_name_); settings_->setValue ("aprsServerPort", aprs_server_port_); + settings_->setValue ("aprsPasscode", aprs_passcode_); settings_->setValue ("UDPServer", udp_server_name_); settings_->setValue ("UDPServerPort", udp_server_port_); settings_->setValue ("N1MMServer", n1mm_server_name_); @@ -2070,6 +2075,7 @@ void Configuration::impl::accept () aprs_server_name_ = ui_->aprs_server_line_edit->text(); aprs_server_port_ = ui_->aprs_server_port_spin_box->value(); + aprs_passcode_ = ui_->aprs_passcode_line_edit->text(); auto newUdpEnabled = ui_->udpEnable->isChecked(); auto new_server = ui_->udp_server_line_edit->text (); diff --git a/Configuration.hpp b/Configuration.hpp index 33a1950..a904f9c 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -150,6 +150,7 @@ public: QString opCall() const; QString aprs_server_name () const; port_type aprs_server_port () const; + QString aprs_passcode () const; QString udp_server_name () const; port_type udp_server_port () const; QString n1mm_server_name () const; diff --git a/Configuration.ui b/Configuration.ui index fd5ba89..2e58ed9 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2104,6 +2104,19 @@ for assessing propagation and system performance. + + + + <html><head/><body><p>APRS Server Passcode for Sending APRS Packets</p></body></html> + + + APRS Passcode: + + + + + + diff --git a/mainwindow.cpp b/mainwindow.cpp index 258ca77..aad870a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1210,10 +1210,12 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, connect(ui->tableWidgetRXAll->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MainWindow::on_tableWidgetRXAll_selectionChanged); connect(ui->tableWidgetCalls->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MainWindow::on_tableWidgetCalls_selectionChanged); - // Don't block beacon's first run... m_lastTxTime = QDateTime::currentDateTimeUtc().addSecs(-300); + pskSetLocal(); + aprsSetLocal(); + displayActivity(true); #if 0 @@ -6323,6 +6325,11 @@ QStringList MainWindow::buildFT8MessageFrames(QString const& text){ } qDebug() << "after:" << line; } + + // APRS: + if(dirCmd.trimmed() == "APRS:" && !m_aprsClient->isPasscodeValid()){ + MessageBox::warning_message(this, tr ("Please enter a valid APRS passcode in the settings to send an APRS packet.")); + } } if(useDat){ @@ -8414,6 +8421,7 @@ void MainWindow::aprsSetLocal () auto call = m_config.my_callsign(); auto base = Radio::base_callsign(call); auto grid = m_config.my_grid(); + auto passcode = m_config.aprs_passcode(); #if SPOT_SSID_SUFFIX if(call != base){ @@ -8428,8 +8436,8 @@ void MainWindow::aprsSetLocal () } #endif - qDebug() << "APRSISClient Set Local Station:" << base << grid; - m_aprsClient->setLocalStation(base, grid); + qDebug() << "APRSISClient Set Local Station:" << base << grid << passcode; + m_aprsClient->setLocalStation(base, grid, passcode); } void MainWindow::transmitDisplay (bool transmitting)