mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-08-01 13:42:39 -04:00
prototype automated checking of OTPs
This commit is contained in:
parent
c2531f675e
commit
6ddc7cf7f9
@ -146,7 +146,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
|
|||||||
access='stream')
|
access='stream')
|
||||||
write(47) params%yymmdd,params%nutc,id2(1:20),id2(1:180000)
|
write(47) params%yymmdd,params%nutc,id2(1:20),id2(1:180000)
|
||||||
close(47)
|
close(47)
|
||||||
call execute_command_line(trim(exe_dir)//'/sfrx '//'"'//trim(temp_dir)//'/fort.47"')
|
call execute_command_line(trim(exe_dir)//'/sfrx OTP '//'"'//trim(temp_dir)//'/fort.47"')
|
||||||
else
|
else
|
||||||
call timer('decft8 ',0)
|
call timer('decft8 ',0)
|
||||||
newdat=params%newdat
|
newdat=params%newdat
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "pimpl_h.hpp"
|
#include "pimpl_h.hpp"
|
||||||
|
|
||||||
class Configuration;
|
class Configuration;
|
||||||
class QDateTime;
|
|
||||||
class QSqlTableModel;
|
class QSqlTableModel;
|
||||||
class QTextStream;
|
class QTextStream;
|
||||||
class AD1CCty;
|
class AD1CCty;
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
#include "echograph.h"
|
#include "echograph.h"
|
||||||
#include "fastplot.h"
|
#include "fastplot.h"
|
||||||
#include "fastgraph.h"
|
#include "fastgraph.h"
|
||||||
|
#include "foxotpcode.h"
|
||||||
#include "about.h"
|
#include "about.h"
|
||||||
#include "messageaveraging.h"
|
#include "messageaveraging.h"
|
||||||
#include "activeStations.h"
|
#include "activeStations.h"
|
||||||
@ -72,6 +73,7 @@
|
|||||||
#include "models/StationList.hpp"
|
#include "models/StationList.hpp"
|
||||||
#include "validators/LiveFrequencyValidator.hpp"
|
#include "validators/LiveFrequencyValidator.hpp"
|
||||||
#include "Network/MessageClient.hpp"
|
#include "Network/MessageClient.hpp"
|
||||||
|
#include "Network/FoxVerifier.hpp"
|
||||||
#include "Network/wsprnet.h"
|
#include "Network/wsprnet.h"
|
||||||
#include "signalmeter.h"
|
#include "signalmeter.h"
|
||||||
#include "HelpTextWindow.hpp"
|
#include "HelpTextWindow.hpp"
|
||||||
@ -194,7 +196,7 @@ extern "C" {
|
|||||||
|
|
||||||
void jpl_setup_(char* fname, FCL len);
|
void jpl_setup_(char* fname, FCL len);
|
||||||
}
|
}
|
||||||
|
QList<FoxVerifier *> m_verifications;
|
||||||
int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols
|
int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols
|
||||||
int volatile itone0[MAX_NUM_SYMBOLS]; //Dummy array, data not actually used
|
int volatile itone0[MAX_NUM_SYMBOLS]; //Dummy array, data not actually used
|
||||||
int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID
|
int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID
|
||||||
@ -1038,6 +1040,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
ui->actionAuto_Clear_Avg->setChecked(m_ndepth&128);
|
ui->actionAuto_Clear_Avg->setChecked(m_ndepth&128);
|
||||||
|
|
||||||
m_UTCdisk=-1;
|
m_UTCdisk=-1;
|
||||||
|
m_UTCdiskDateTime=QDateTime{}; // UTCDateTime of file being read from disk.
|
||||||
m_fCPUmskrtd=0.0;
|
m_fCPUmskrtd=0.0;
|
||||||
m_bFastDone=false;
|
m_bFastDone=false;
|
||||||
m_bAltV=false;
|
m_bAltV=false;
|
||||||
@ -2473,8 +2476,9 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Qt::Key_X:
|
case Qt::Key_X:
|
||||||
|
|
||||||
if(e->modifiers() & Qt::AltModifier) {
|
if(e->modifiers() & Qt::AltModifier) {
|
||||||
foxTest();
|
//foxTest();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2482,6 +2486,29 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
|
|||||||
QMainWindow::keyPressEvent (e);
|
QMainWindow::keyPressEvent (e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::handleVerifyMsg(int status, QDateTime ts, QString callsign, QString code, QString const &response) {
|
||||||
|
(void)status;
|
||||||
|
(void)code;
|
||||||
|
if (response.length() > 0) {
|
||||||
|
QString msg = FoxVerifier::formatDecodeMessage(ts, callsign, response);
|
||||||
|
if (msg.length() > 0)
|
||||||
|
ui->decodedTextBrowser->displayDecodedText(DecodedText{msg}, m_config.my_callsign(), m_mode, m_config.DXCC(),
|
||||||
|
m_logBook, m_currentBand, m_config.ppfx());
|
||||||
|
write_all("Ck",msg);
|
||||||
|
}
|
||||||
|
LOG_INFO(QString("FoxVerifier response for [%1]: - [%2]").arg(callsign).arg(response).toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MainWindow::userAgent() {
|
||||||
|
// see User-Agent format definition https://www.rfc-editor.org/rfc/rfc9110#name-user-agent
|
||||||
|
//
|
||||||
|
QString platform = "(" + QSysInfo::prettyProductName()+"; "+QSysInfo::productType() + " " + QSysInfo::productVersion() + "; " +
|
||||||
|
QSysInfo::currentCpuArchitecture() + "; " +
|
||||||
|
QString("rv:%1").arg(QSysInfo::kernelVersion()) + ")";
|
||||||
|
QString userAgent = QString{"WSJT-X/" + version() + "_" + m_revision}.simplified() + " " +platform;
|
||||||
|
return userAgent;
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::bumpFqso(int n) //bumpFqso()
|
void MainWindow::bumpFqso(int n) //bumpFqso()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -3141,6 +3168,11 @@ void MainWindow::read_wav_file (QString const& fname)
|
|||||||
int i1=fname.indexOf(".wav");
|
int i1=fname.indexOf(".wav");
|
||||||
m_nutc0=m_UTCdisk;
|
m_nutc0=m_UTCdisk;
|
||||||
m_UTCdisk=fname.mid(i0+1,i1-i0-1).toInt();
|
m_UTCdisk=fname.mid(i0+1,i1-i0-1).toInt();
|
||||||
|
if (i0 > 6) {
|
||||||
|
m_UTCdiskDateTime = QDateTime::fromString("20" + fname.mid(i0 - 6, 13) + "Z", "yyyyMMdd_hhmmsst").toUTC();
|
||||||
|
} else
|
||||||
|
m_UTCdiskDateTime = QDateTime{};
|
||||||
|
|
||||||
m_wav_future_watcher.setFuture (QtConcurrent::run ([this, fname] {
|
m_wav_future_watcher.setFuture (QtConcurrent::run ([this, fname] {
|
||||||
auto basename = fname.mid (fname.lastIndexOf ('/') + 1);
|
auto basename = fname.mid (fname.lastIndexOf ('/') + 1);
|
||||||
auto pos = fname.indexOf (".wav", 0, Qt::CaseInsensitive);
|
auto pos = fname.indexOf (".wav", 0, Qt::CaseInsensitive);
|
||||||
@ -4183,7 +4215,9 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
}
|
}
|
||||||
if(navg>=2) bAvgMsg=true;
|
if(navg>=2) bAvgMsg=true;
|
||||||
}
|
}
|
||||||
write_all("Rx",line_read.trimmed());
|
if (!line_read.trimmed().contains("$VERIFY$")) {
|
||||||
|
write_all("Rx", line_read.trimmed());
|
||||||
|
}
|
||||||
int ntime=6;
|
int ntime=6;
|
||||||
if(m_TRperiod>=60) ntime=4;
|
if(m_TRperiod>=60) ntime=4;
|
||||||
if (line_read.left(ntime) != m_tBlankLine && QString::fromUtf8(line_read.constData()).left(4).contains(QRegularExpression {"\\d\\d\\d\\d"})) {
|
if (line_read.left(ntime) != m_tBlankLine && QString::fromUtf8(line_read.constData()).left(4).contains(QRegularExpression {"\\d\\d\\d\\d"})) {
|
||||||
@ -4237,64 +4271,103 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
m_bDisplayedOnce=true;
|
m_bDisplayedOnce=true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DecodedText decodedtext1=decodedtext0;
|
|
||||||
if((m_mode=="FT4" or m_mode=="FT8") and bDisplayPoints and decodedtext1.isStandardMessage()) {
|
// remove verifications that are done
|
||||||
|
QMutableListIterator < FoxVerifier * > it(m_verifications);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
if (it.next()->finished()) {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DecodedText decodedtext1 = decodedtext0;
|
||||||
|
if ((m_mode == "FT4" or m_mode == "FT8") and bDisplayPoints and decodedtext1.isStandardMessage()) {
|
||||||
ARRL_Digi_Update(decodedtext1);
|
ARRL_Digi_Update(decodedtext1);
|
||||||
}
|
}
|
||||||
if (ui->labDXped->text()=="Super Hound" && decodedtext0.mid(3,18).contains(" verified")) {
|
|
||||||
verified = true;
|
if (ui->labDXped->text() == "Super Hound" && (decodedtext0.mid(24, 8) == "$VERIFY$")) {
|
||||||
ui->labDXped->setStyleSheet("QLabel {background-color: #00ff00; color: black;}");
|
// $VERIFY$ foxcall otp
|
||||||
|
// QString test_return = QString{"203630 -12 0.1 775 ~ $VERIFY$ K8R 920749"};
|
||||||
|
QStringList lineparts;
|
||||||
|
lineparts = decodedtext0.string().split(' ', SkipEmptyParts);
|
||||||
|
|
||||||
|
QDateTime verifyDateTime;
|
||||||
|
if (m_diskData) {
|
||||||
|
verifyDateTime = m_UTCdiskDateTime; // get the date set from reading the wav file
|
||||||
|
} else {
|
||||||
|
verifyDateTime = QDateTime(QDateTime::currentDateTimeUtc().date(),
|
||||||
|
QTime::fromString(lineparts[0], "hhmmss"));
|
||||||
|
}
|
||||||
|
FoxVerifier *fv = new FoxVerifier(MainWindow::userAgent(),
|
||||||
|
&m_network_manager,
|
||||||
|
"https://www.9dx.cc",
|
||||||
|
lineparts[6], // foxcall
|
||||||
|
verifyDateTime,
|
||||||
|
lineparts[7]); // otp
|
||||||
|
connect(fv, &FoxVerifier::verifyComplete, this, &MainWindow::handleVerifyMsg);
|
||||||
|
m_verifications << fv;
|
||||||
} else {
|
} else {
|
||||||
if (decodedtext0.mid(4,2).contains("00") or decodedtext0.mid(4,2).contains("30")) verified = false;
|
|
||||||
}
|
|
||||||
if ((!verified && ui->labDXped->isVisible()) or ui->labDXped->text()!="Super Hound")
|
|
||||||
ui->labDXped->setStyleSheet("QLabel {background-color: red; color: white;}");
|
|
||||||
ui->decodedTextBrowser->displayDecodedText (decodedtext1, m_config.my_callsign (), m_mode, m_config.DXCC (),
|
|
||||||
m_logBook, m_currentBandPeriod, m_config.ppfx (),
|
|
||||||
ui->cbCQonly->isVisible() && ui->cbCQonly->isChecked(),
|
|
||||||
haveFSpread, fSpread, bDisplayPoints, m_points);
|
|
||||||
if((m_mode=="FT4" or m_mode=="FT8") and bDisplayPoints and decodedtext1.isStandardMessage()) {
|
|
||||||
QString deCall,deGrid;
|
|
||||||
decodedtext.deCallAndGrid(/*out*/deCall,deGrid);
|
|
||||||
bool bWorkedOnBand=(ui->decodedTextBrowser->CQPriority()!="New Call on Band") and ui->decodedTextBrowser->CQPriority()!="";
|
|
||||||
if(bWorkedOnBand) activeWorked(deCall,m_currentBand);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_config.highlight_DXcall () && (m_hisCall!="") && ((decodedtext.string().contains(QRegularExpression {"(\\w+) " + m_hisCall}))
|
if (ui->labDXped->text() == "Super Hound" && decodedtext0.mid(3, 18).contains(" verified")) {
|
||||||
|| (decodedtext.string().contains(QRegularExpression {"(\\w+) <" + m_hisCall +">"}))
|
verified = true;
|
||||||
|| (decodedtext.string().contains(QRegularExpression {"<(\\w+)> " + m_hisCall}))
|
write_all("Vf",decodedtext0.string());
|
||||||
|| (decodedtext.string().contains(QRegularExpression {"<...> " + m_hisCall})))) {
|
ui->labDXped->setStyleSheet("QLabel {background-color: #00ff00; color: black;}");
|
||||||
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255,0,0), QColor(255,255,255), true); // highlight dxCallEntry
|
} else {
|
||||||
QTimer::singleShot (500, [=] { // repeated highlighting to override JTAlert
|
if (decodedtext0.mid(4, 2).contains("00") or decodedtext0.mid(4, 2).contains("30")) verified = false;
|
||||||
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255,0,0), QColor(255,255,255), true);
|
}
|
||||||
});
|
if ((!verified && ui->labDXped->isVisible()) or ui->labDXped->text() != "Super Hound")
|
||||||
QTimer::singleShot (1000, [=] { // repeated highlighting to override JTAlert
|
ui->labDXped->setStyleSheet("QLabel {background-color: red; color: white;}");
|
||||||
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255,0,0), QColor(255,255,255), true);
|
ui->decodedTextBrowser->displayDecodedText(decodedtext1, m_config.my_callsign(), m_mode, m_config.DXCC(),
|
||||||
});
|
m_logBook, m_currentBandPeriod, m_config.ppfx(),
|
||||||
QTimer::singleShot (2500, [=] { // repeated highlighting to override JTAlert
|
ui->cbCQonly->isVisible() && ui->cbCQonly->isChecked(),
|
||||||
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255,0,0), QColor(255,255,255), true);
|
haveFSpread, fSpread, bDisplayPoints, m_points);
|
||||||
});
|
if ((m_mode == "FT4" or m_mode == "FT8") and bDisplayPoints and decodedtext1.isStandardMessage()) {
|
||||||
}
|
QString deCall, deGrid;
|
||||||
if (m_config.highlight_DXgrid () && (m_hisGrid!="") && (decodedtext.string().contains(m_hisGrid))) {
|
decodedtext.deCallAndGrid(/*out*/deCall, deGrid);
|
||||||
ui->decodedTextBrowser->highlight_callsign(m_hisGrid, QColor(0,0,255), QColor(255,255,255), true); // highlight dxGridEntry
|
bool bWorkedOnBand = (ui->decodedTextBrowser->CQPriority() != "New Call on Band") and
|
||||||
}
|
ui->decodedTextBrowser->CQPriority() != "";
|
||||||
|
if (bWorkedOnBand) activeWorked(deCall, m_currentBand);
|
||||||
|
}
|
||||||
|
|
||||||
if(m_bBestSPArmed && m_mode=="FT4" && CALLING == m_QSOProgress) {
|
if (m_config.highlight_DXcall() && (m_hisCall != "") &&
|
||||||
QString messagePriority=ui->decodedTextBrowser->CQPriority();
|
((decodedtext.string().contains(QRegularExpression{"(\\w+) " + m_hisCall}))
|
||||||
if(messagePriority!="") {
|
|| (decodedtext.string().contains(QRegularExpression{"(\\w+) <" + m_hisCall + ">"}))
|
||||||
if(messagePriority=="New Call on Band"
|
|| (decodedtext.string().contains(QRegularExpression{"<(\\w+)> " + m_hisCall}))
|
||||||
and m_BestCQpriority!="New Call on Band"
|
|| (decodedtext.string().contains(QRegularExpression{"<...> " + m_hisCall})))) {
|
||||||
and m_BestCQpriority!="New Multiplier") {
|
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255, 0, 0), QColor(255, 255, 255),
|
||||||
m_BestCQpriority="New Call on Band";
|
true); // highlight dxCallEntry
|
||||||
m_bDoubleClicked = true;
|
QTimer::singleShot(500, [=] { // repeated highlighting to override JTAlert
|
||||||
processMessage(decodedtext0);
|
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255, 0, 0), QColor(255, 255, 255), true);
|
||||||
}
|
});
|
||||||
if(messagePriority=="New DXCC"
|
QTimer::singleShot(1000, [=] { // repeated highlighting to override JTAlert
|
||||||
and m_BestCQpriority!="New DXCC"
|
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255, 0, 0), QColor(255, 255, 255), true);
|
||||||
and m_BestCQpriority!="New Multiplier") {
|
});
|
||||||
m_BestCQpriority="New DXCC";
|
QTimer::singleShot(2500, [=] { // repeated highlighting to override JTAlert
|
||||||
m_bDoubleClicked = true;
|
ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255, 0, 0), QColor(255, 255, 255), true);
|
||||||
processMessage(decodedtext0);
|
});
|
||||||
|
}
|
||||||
|
if (m_config.highlight_DXgrid() && (m_hisGrid != "") && (decodedtext.string().contains(m_hisGrid))) {
|
||||||
|
ui->decodedTextBrowser->highlight_callsign(m_hisGrid, QColor(0, 0, 255), QColor(255, 255, 255),
|
||||||
|
true); // highlight dxGridEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_bBestSPArmed && m_mode == "FT4" && CALLING == m_QSOProgress) {
|
||||||
|
QString messagePriority = ui->decodedTextBrowser->CQPriority();
|
||||||
|
if (messagePriority != "") {
|
||||||
|
if (messagePriority == "New Call on Band"
|
||||||
|
and m_BestCQpriority != "New Call on Band"
|
||||||
|
and m_BestCQpriority != "New Multiplier") {
|
||||||
|
m_BestCQpriority = "New Call on Band";
|
||||||
|
m_bDoubleClicked = true;
|
||||||
|
processMessage(decodedtext0);
|
||||||
|
}
|
||||||
|
if (messagePriority == "New DXCC"
|
||||||
|
and m_BestCQpriority != "New DXCC"
|
||||||
|
and m_BestCQpriority != "New Multiplier") {
|
||||||
|
m_BestCQpriority = "New DXCC";
|
||||||
|
m_bDoubleClicked = true;
|
||||||
|
processMessage(decodedtext0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10875,7 +10948,7 @@ void MainWindow::write_all(QString txRx, QString message)
|
|||||||
t = t.asprintf("%5d",ui->TxFreqSpinBox->value());
|
t = t.asprintf("%5d",ui->TxFreqSpinBox->value());
|
||||||
if (txRx=="Tx") msg=" 0 0.0" + t + " " + message;
|
if (txRx=="Tx") msg=" 0 0.0" + t + " " + message;
|
||||||
auto time = QDateTime::currentDateTimeUtc ();
|
auto time = QDateTime::currentDateTimeUtc ();
|
||||||
if( txRx=="Rx" && !m_bFastMode ) time=m_dateTimeSeqStart;
|
if( (txRx=="Rx" || txRx=="Ck") && !m_bFastMode ) time=m_dateTimeSeqStart;
|
||||||
|
|
||||||
if (txRx=="Rx") {
|
if (txRx=="Rx") {
|
||||||
t = t.asprintf("%10.3f ",m_freqNominalPeriod/1.e6); // prevent writing of wrong frequencies
|
t = t.asprintf("%10.3f ",m_freqNominalPeriod/1.e6); // prevent writing of wrong frequencies
|
||||||
@ -11151,14 +11224,43 @@ void MainWindow::on_jt65Button_clicked()
|
|||||||
on_actionJT65_triggered();
|
on_actionJT65_triggered();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::sfox_tx()
|
void MainWindow::sfox_tx() {
|
||||||
{
|
auto fname{QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_1.dat")).toLocal8Bit()};
|
||||||
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_1.dat")).toLocal8Bit()};
|
|
||||||
QStringList args{fname};
|
QStringList args{fname};
|
||||||
|
qint32 otp_key = 0;
|
||||||
args.append(m_config.my_callsign());
|
args.append(m_config.my_callsign());
|
||||||
|
#ifdef FOX_OTP
|
||||||
|
if (m_config.FoxKey().startsWith("OTP:", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
LOG_INFO("OTP: Generating OTP key");
|
||||||
|
if (m_config.FoxKey().length() > 19) {
|
||||||
|
QString foxCodeSeed = m_config.FoxKey().mid(4);
|
||||||
|
char output[7];
|
||||||
|
QDateTime dateTime = dateTime.currentDateTime();
|
||||||
|
QByteArray ba = foxCodeSeed.toLocal8Bit();
|
||||||
|
char *c_str = ba.data();
|
||||||
|
int return_length;
|
||||||
|
if (6 == (return_length = create_totp(c_str, output, dateTime.toTime_t(), 30, 0)))
|
||||||
|
{
|
||||||
|
otp_key = QString(output).toInt();
|
||||||
|
LOG_INFO(QString("TOTP: %1 [%2]").arg(output).arg(otp_key).toStdString());
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
LOG_INFO(QString("TOTP: Incorrect return length %1").arg(return_length));
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
showStatusMessage (tr ("TOTP: seed not long enough."));
|
||||||
|
LOG_INFO(QString("TOTP: seed not long enough"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.append(QString("OTP:%1").arg(otp_key));
|
||||||
|
#else
|
||||||
args.append(m_config.FoxKey());
|
args.append(m_config.FoxKey());
|
||||||
|
#endif
|
||||||
// qDebug() << "aa" << QDir::toNativeSeparators(m_appDir)+QDir::separator()+"sftx";
|
// qDebug() << "aa" << QDir::toNativeSeparators(m_appDir)+QDir::separator()+"sftx";
|
||||||
// qDebug() << "bb" << args;
|
// qDebug() << "bb" << args;
|
||||||
|
LOG_INFO(QString("%1 %2").arg(QDir::toNativeSeparators(m_appDir)+QDir::separator()+"sftx").arg(args.join(" ")).toStdString());
|
||||||
p2.start(QDir::toNativeSeparators(m_appDir)+QDir::separator()+"sftx", args);
|
p2.start(QDir::toNativeSeparators(m_appDir)+QDir::separator()+"sftx", args);
|
||||||
p2.waitForFinished();
|
p2.waitForFinished();
|
||||||
auto fname2 {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_2.dat")).toLocal8Bit()};
|
auto fname2 {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_2.dat")).toLocal8Bit()};
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
#include <QQueue>
|
#include <QQueue>
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
#include <QFutureWatcher>
|
#include <QFutureWatcher>
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QCalendar>
|
||||||
|
|
||||||
#include "MultiGeometryWidget.hpp"
|
#include "MultiGeometryWidget.hpp"
|
||||||
#include "NonInheritingProcess.hpp"
|
#include "NonInheritingProcess.hpp"
|
||||||
@ -494,6 +496,7 @@ private:
|
|||||||
FrequencyList_v2_101::const_iterator m_frequency_list_fcal_iter;
|
FrequencyList_v2_101::const_iterator m_frequency_list_fcal_iter;
|
||||||
qint32 m_nTx73;
|
qint32 m_nTx73;
|
||||||
qint32 m_UTCdisk;
|
qint32 m_UTCdisk;
|
||||||
|
QDateTime m_UTCdiskDateTime;
|
||||||
qint32 m_wait;
|
qint32 m_wait;
|
||||||
qint32 m_isort;
|
qint32 m_isort;
|
||||||
qint32 m_max_dB;
|
qint32 m_max_dB;
|
||||||
@ -889,6 +892,8 @@ private:
|
|||||||
void activeWorked(QString call, QString band);
|
void activeWorked(QString call, QString band);
|
||||||
void read_log();
|
void read_log();
|
||||||
void refreshPileupList();
|
void refreshPileupList();
|
||||||
|
QString userAgent();
|
||||||
|
void handleVerifyMsg(int status, QDateTime ts, QString callsign, QString code, QString const &response);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int killbyname(const char* progName);
|
extern int killbyname(const char* progName);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user