Initial tx cycle cleanup

This commit is contained in:
Jordan Sherer 2018-10-09 17:33:30 -04:00
parent ad563c0aed
commit aa2c41f124
2 changed files with 2 additions and 821 deletions

View File

@ -687,8 +687,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
txMsgButtonGroup->addButton(ui->txrb6,6);
set_dateTimeQSO(-1);
connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int)));
connect (ui->decodedTextBrowser, &DisplayText::selectCallsign, this, &MainWindow::doubleClickOnCall2);
connect (ui->decodedTextBrowser2, &DisplayText::selectCallsign, this, &MainWindow::doubleClickOnCall);
connect (ui->decodedTextBrowser, &DisplayText::erased, this, &MainWindow::band_activity_cleared);
connect (ui->decodedTextBrowser2, &DisplayText::erased, this, &MainWindow::rx_frequency_activity_cleared);
@ -973,7 +972,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
QByteArray cfname=fname.toLocal8Bit();
fftwf_import_wisdom_from_filename(cfname);
//genStdMsgs(m_rpt);
m_ntx = 6;
ui->txrb6->setChecked(true);
@ -2245,7 +2243,6 @@ void MainWindow::fastSink(qint64 frames)
m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(),
m_config.color_NewCall(),m_config.ppfx());
m_bDecoded=true;
auto_sequence (decodedtext, ui->sbFtol->value (), std::numeric_limits<unsigned>::max ());
if (m_mode != "ISCAT") postDecode (true, decodedtext.string ());
writeAllTxt(message);
bool stdMsg = decodedtext.report(m_baseCall,
@ -3514,7 +3511,6 @@ void::MainWindow::fast_decode_done()
// extract details and send to PSKreporter
//if (stdMsg) pskPost (decodedtext);
}
if (tmax >= 0.0) auto_sequence (decodedtext, ui->sbFtol->value (), ui->sbFtol->value ());
}
m_startAnother=m_loopall;
m_nPick=0;
@ -3860,25 +3856,6 @@ void MainWindow::readFromStdout() //readFromStdout
bool bDisplayRight=bAvgMsg;
int audioFreq=decodedtext.frequencyOffset();
if(m_mode=="FT8") {
auto const& parts = decodedtext.string ().split (' ', QString::SkipEmptyParts);
if (parts.size () > 6) {
auto for_us = parts[5].contains (m_baseCall)
|| ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= 10);
if(m_baseCall==m_config.my_callsign() and m_baseCall!=parts[5]) for_us=false;
if(m_bCallingCQ && !m_bAutoReply && for_us && ui->cbFirst->isChecked() and
!m_config.bFox() and !m_config.bHound()) {
m_bDoubleClicked=true;
m_bAutoReply = true;
if(!m_config.bFox()) processMessage (decodedtext);
ui->cbFirst->setStyleSheet("");
}
if(m_config.bFox() and decodedtext.string().contains(" DE ")) for_us=true; //Hound with compound callsign
if(m_config.bFox() and for_us and (audioFreq<1000)) bDisplayRight=true;
if(!m_config.bFox() and (for_us or (abs(audioFreq - m_wideGraph->rxFreq()) <= 10))) bDisplayRight=true;
}
}
if(abs(audioFreq - m_wideGraph->rxFreq()) <= 10){
bDisplayRight=true;
}
@ -3899,8 +3876,6 @@ void MainWindow::readFromStdout() //readFromStdout
}
if(m_mode!="FT8" or !m_config.bHound()) {
if(m_mode=="FT8" or m_mode=="QRA64" or m_mode=="JT4" or m_mode=="JT65" or
m_mode=="JT9") auto_sequence (decodedtext, 25, 50);
postDecode (true, decodedtext.string ());
// find and extract any report for myCall, but save in m_rptRcvd only if it's from DXcall
@ -3993,95 +3968,6 @@ QString MainWindow::lookupCallInCompoundCache(QString const &call){
return m_compoundCallCache.value(call, call);
}
//
// start_tolerance - only respond to "DE ..." and free text 73
// messages within +/- this value
//
// stop_tolerance - kill Tx if running station is seen to reply to
// another caller and we are going to transmit within
// +/- this value of the reply to another caller
//
void MainWindow::auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance)
{
auto const& message_words = message.messageWords ();
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size ();
bool is_OK=false;
if(m_mode=="MSK144" and message.string().indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true;
if (message_words.size () > 2 && (message.isStandardMessage () || (is_73 or is_OK))) {
auto df = message.frequencyOffset ();
auto within_tolerance =
(qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance)
|| qAbs (ui->TxFreqSpinBox->value () - df) <= int (start_tolerance));
bool acceptable_73 = is_73
&& m_QSOProgress >= ROGER_REPORT
&& ((message.isStandardMessage ()
&& (message_words.contains (m_baseCall)
|| message_words.contains (m_config.my_callsign ())
|| message_words.contains (ui->dxCallEntry->text ())
|| message_words.contains (Radio::base_callsign (ui->dxCallEntry->text ()))
|| message_words.contains ("DE")))
|| !message.isStandardMessage ()); // free text 73/RR73
if (m_auto
&& (REPLYING == m_QSOProgress
|| (!ui->tx1->isEnabled () && REPORT == m_QSOProgress))
&& qAbs (ui->TxFreqSpinBox->value () - df) <= int (stop_tolerance)
&& message_words.at (1) != "DE"
&& !message_words.at (1).contains (QRegularExpression {"(^(CQ|QRZ))|" + m_baseCall})
&& message_words.at (2).contains (Radio::base_callsign (ui->dxCallEntry->text ()))) {
// auto stop to avoid accidental QRM
ui->stopTxButton->click (); // halt any transmission
}
else if (m_auto // transmit allowed
&& ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked() // auto-sequencing allowed
&& ((!m_bCallingCQ // not calling CQ/QRZ
&& !m_sentFirst73 // not finished QSO
&& ((message_words.at (1).contains (m_baseCall)
// being called and not already in a QSO
&& message_words.at (2).contains (Radio::base_callsign (ui->dxCallEntry->text ())))
// type 2 compound replies
|| (within_tolerance
&& (acceptable_73
|| ("DE" == message_words.at (1) && message_words.at (2).contains (Radio::base_callsign (m_hisCall)))))))
|| (m_bCallingCQ && m_bAutoReply
// look for type 2 compound call replies on our Tx and Rx offsets
&& ((within_tolerance && "DE" == message_words.at (1))
|| message_words.at (1).contains (m_baseCall)))))
{
if(!m_config.bFox()) processMessage (message);
}
}
}
void MainWindow::pskPost (DecodedText const& decodedtext)
{
#if 0
if (m_diskData || !m_config.spot_to_reporting_networks() || decodedtext.isLowConfidence ()) return;
QString msgmode=m_mode;
if(m_mode=="JT9+JT65") {
msgmode="JT9";
if (decodedtext.isJT65()) msgmode="JT65";
}
QString deCall;
QString grid;
decodedtext.deCallAndGrid(/*out*/deCall,grid);
int audioFrequency = decodedtext.frequencyOffset();
if(m_mode=="FT8" or m_mode=="MSK144") {
audioFrequency=decodedtext.string().mid(16,4).toInt();
}
int snr = decodedtext.snr();
pskSetLocal ();
if(grid.contains (grid_regexp)) {
// qDebug() << "To PSKreporter:" << deCall << grid << frequency << msgmode << snr;
// psk_Reporter->addRemoteStation(deCall,grid,QString::number(frequency),msgmode,
// QString::number(snr),QString::number(DriftingDateTime::currentDateTime().toTime_t()));
pskLogReport(msgmode, audioFrequency, snr, deCall, grid);
}
#endif
}
void MainWindow::pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid){
if(!m_config.spot_to_reporting_networks()) return;
@ -4201,6 +4087,7 @@ void MainWindow::guiUpdate()
tx1 += m_TRperiod;
tx2 += m_TRperiod;
}
tx2 += m_TRperiod;
qint64 ms = DriftingDateTime::currentMSecsSinceEpoch() % 86400000;
int nsec=ms/1000;
@ -4845,11 +4732,6 @@ void MainWindow::on_txrb4_toggled (bool status)
void MainWindow::on_txrb4_doubleClicked ()
{
// RR73 only allowed if not a type 2 compound callsign
auto const& my_callsign = m_config.my_callsign ();
auto is_compound = my_callsign != m_baseCall;
m_send_RR73 = !((is_compound && !shortList (my_callsign)) || m_send_RR73);
genStdMsgs (m_rpt);
}
void MainWindow::on_txrb5_toggled (bool status)
@ -4861,7 +4743,6 @@ void MainWindow::on_txrb5_toggled (bool status)
void MainWindow::on_txrb5_doubleClicked ()
{
genStdMsgs (m_rpt, true);
}
void MainWindow::on_txrb6_toggled(bool status)
@ -4920,11 +4801,6 @@ void MainWindow::on_txb4_clicked()
void MainWindow::on_txb4_doubleClicked()
{
// RR73 only allowed if not a type 2 compound callsign
auto const& my_callsign = m_config.my_callsign ();
auto is_compound = my_callsign != m_baseCall;
m_send_RR73 = !((is_compound && !shortList (my_callsign)) || m_send_RR73);
genStdMsgs (m_rpt);
}
void MainWindow::on_txb5_clicked()
@ -4937,7 +4813,6 @@ void MainWindow::on_txb5_clicked()
void MainWindow::on_txb5_doubleClicked()
{
genStdMsgs (m_rpt, true);
}
void MainWindow::on_txb6_clicked()
@ -4949,611 +4824,6 @@ void MainWindow::on_txb6_clicked()
if (m_transmitting) m_restart=true;
}
void MainWindow::doubleClickOnCall2(Qt::KeyboardModifiers modifiers)
{
set_dateTimeQSO(-1); // reset our QSO start time
m_decodedText2=true;
doubleClickOnCall(modifiers);
m_decodedText2=false;
}
void MainWindow::doubleClickOnCall(Qt::KeyboardModifiers modifiers)
{
QTextCursor cursor;
if(m_mode=="ISCAT") {
MessageBox::information_message (this,
"Double-click not presently implemented for ISCAT mode");
}
if(m_decodedText2) {
cursor=ui->decodedTextBrowser->textCursor();
} else {
cursor=ui->decodedTextBrowser2->textCursor();
}
if(modifiers==(Qt::ShiftModifier + Qt::ControlModifier + Qt::AltModifier)) {
cursor.setPosition(0);
} else {
cursor.setPosition(cursor.selectionStart());
}
DecodedText message {cursor.block().text(), ("MSK144" == m_mode || "FT8" == m_mode) &&
ui->cbVHFcontest->isChecked(), m_config.my_grid ()};
m_bDoubleClicked = true;
processMessage (message, modifiers);
}
void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifiers modifiers)
{
// decode keyboard modifiers we are interested in
auto shift = modifiers.testFlag (Qt::ShiftModifier);
auto ctrl = modifiers.testFlag (Qt::ControlModifier);
// auto alt = modifiers.testFlag (Qt::AltModifier);
// basic mode sanity checks
auto const& parts = message.string ().split (' ', QString::SkipEmptyParts);
if (parts.size () < 5) return;
auto const& mode = parts.at (4).left (1);
if (("JT9+JT65" == m_mode && !("@" == mode || "#" == mode))
|| ("JT65" == m_mode && mode != "#")
|| ("JT9" == m_mode && mode != "@")
|| ("MSK144" == m_mode && !("&" == mode || "^" == mode))
|| ("QRA64" == m_mode && mode.left (1) != ":")) {
return;
}
//Skip the rest if no decoded text extracted
int frequency = message.frequencyOffset();
if (message.isTX()) {
if (!m_config.enable_VHF_features()) {
if(!shift) ui->RxFreqSpinBox->setValue(frequency); //Set Rx freq
if((ctrl or shift) and !ui->cbHoldTxFreq->isChecked ()) {
ui->TxFreqSpinBox->setValue(frequency); //Set Tx freq
}
}
return;
}
// check for CQ with listening frequency
if (parts.size () >= 7
&& (m_bFastMode || m_mode=="FT8")
&& "CQ" == parts[5]
&& m_config.is_transceiver_online ()) {
bool ok;
auto kHz = parts[6].toUInt (&ok);
if (ok && kHz >= 10 && 3 == parts[6].size ()) {
// QSY Freq for answering CQ nnn
setRig (m_freqNominal / 1000000 * 1000000 + 1000 * kHz);
ui->decodedTextBrowser2->displayQSY (QString {"QSY %1"}.arg (m_freqNominal / 1e6, 7, 'f', 3));
}
}
int nmod = message.timeInSeconds () % (2*m_TRperiod);
m_txFirst=(nmod!=0);
ui->txFirstCheckBox->setChecked(m_txFirst);
auto const& message_words = message.messageWords ();
if (message_words.size () < 2) return;
QString hiscall;
QString hisgrid;
message.deCallAndGrid(/*out*/hiscall,hisgrid);
int nWarn=0;
QString warnMsg;
if(m_mode=="MSK144" and message.string().indexOf(hiscall+" R ")>0 and
!ui->cbVHFcontest->isChecked()) {
warnMsg=tr("Should you be operating in NA VHF Contest mode?");
nWarn=1;
}
if((m_mode=="FT8" or m_mode=="MSK144") and hisgrid.contains(grid_regexp) and
m_rigState.frequency()>50000000 and !m_bCheckedContest) {
double utch=0.0;
int nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter;
azdist_(const_cast <char *> (m_config.my_grid().toLatin1().constData()),
const_cast <char *> (hisgrid.toLatin1().constData()),&utch,
&nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6);
if(nDkm>10000) {
warnMsg=tr("Locator in decoded message seems to imply\n"
"a distance greater than 10,000 km. Should\n"
"you be operating in NA VHF Contest mode?");
nWarn=2;
}
}
if(nWarn>0) {
QMessageBox msgBox;
msgBox.setWindowTitle("Contest mode?");
msgBox.setText(warnMsg);
msgBox.setStandardButtons(QMessageBox::Yes);
msgBox.addButton(QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::Yes);
if(msgBox.exec() == QMessageBox::Yes){
ui->cbVHFcontest->setChecked(true);
if(nWarn==2) {
on_DecodeButton_clicked (true);
}
} else {
ui->cbVHFcontest->setChecked(false);
}
m_bCheckedContest=true;
}
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size ();
if (!is_73 and !message.isStandardMessage() and (nWarn==0)) {
qDebug () << "Not processing message - hiscall:" << hiscall << "hisgrid:" << hisgrid;
return;
}
// only allow automatic mode changes between JT9 and JT65, and when not transmitting
if (!m_transmitting and m_mode == "JT9+JT65") {
if (message.isJT9())
{
m_modeTx="JT9";
ui->pbTxMode->setText("Tx JT9 @");
m_wideGraph->setModeTx(m_modeTx);
} else if (message.isJT65()) {
m_modeTx="JT65";
ui->pbTxMode->setText("Tx JT65 #");
m_wideGraph->setModeTx(m_modeTx);
}
} else if ((message.isJT9 () and m_modeTx != "JT9" and m_mode != "JT4") or
(message.isJT65 () and m_modeTx != "JT65" and m_mode != "JT4")) {
// if we are not allowing mode change then don't process decode
return;
}
QString firstcall = message.call();
if(firstcall.length()==5 and firstcall.mid(0,3)=="CQ ") firstcall="CQ";
if(!m_bFastMode and (!m_config.enable_VHF_features() or m_mode=="FT8")) {
// Don't change Tx freq if in a fast mode, or VHF features enabled; also not if a
// station is calling me, unless CTRL or SHIFT is held down.
if ((Radio::is_callsign (firstcall)
&& firstcall != m_config.my_callsign () && firstcall != m_baseCall
&& firstcall != "DE")
|| "CQ" == firstcall || "QRZ" == firstcall || ctrl || shift) {
if ((!m_config.bHound () || m_mode != "FT8")
&& (!ui->cbHoldTxFreq->isChecked () || shift || ctrl)) {
ui->TxFreqSpinBox->setValue(frequency);
}
if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") &&
m_mode != "QRA64" && m_mode!="FT8") {
return;
}
}
}
// prior DX call (possible QSO partner)
auto qso_partner_base_call = Radio::base_callsign (ui->dxCallEntry-> text ());
auto base_call = Radio::base_callsign (hiscall);
// Determine appropriate response to received message
auto dtext = " " + message.string () + " ";
int gen_msg {0};
if(dtext.contains (" " + m_baseCall + " ")
|| dtext.contains ("<" + m_baseCall + " ")
|| dtext.contains ("/" + m_baseCall + " ")
|| dtext.contains (" " + m_baseCall + "/")
|| (firstcall == "DE" /*&& ((t4.size () > 7 && t4.at(7) != "73") || t4.size () <= 7)*/))
{
if (message_words.size () > 3 // enough fields for a normal message
&& (message_words.at (1).contains (m_baseCall) || "DE" == message_words.at (1))
&& message_words.at (2).contains (qso_partner_base_call)
&& !message_words.at (3).contains (grid_regexp)) // but no grid on end of msg
{
QString r=message_words.at (3);
if(m_QSOProgress >= ROGER_REPORT && (r=="RRR" || r.toInt()==73 || "RR73" == r)) {
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 5;
if (ui->rbGenMsg->isChecked ()) m_ntx=7;
m_gen_message_is_cq = false;
}
else {
m_ntx=5;
ui->txrb5->setChecked(true);
}
m_QSOProgress = SIGNOFF;
} else if((m_QSOProgress >= REPORT
|| (m_QSOProgress >= REPLYING && (m_mode=="MSK144" or m_mode=="FT8")
&& ui->cbVHFcontest->isChecked())) && r.mid(0,1)=="R") {
m_ntx=4;
m_QSOProgress = ROGERS;
ui->txrb4->setChecked(true);
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 4;
m_ntx=7;
m_gen_message_is_cq = false;
}
} else if(m_QSOProgress >= CALLING && r.toInt()>=-50 && r.toInt()<=49) {
m_ntx=3;
m_QSOProgress = ROGER_REPORT;
ui->txrb3->setChecked(true);
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 3;
m_ntx=7;
m_gen_message_is_cq = false;
}
}
else { // nothing for us
return;
}
}
else if (m_QSOProgress >= ROGERS
&& message_words.size () > 2 && message_words.at (1).contains (m_baseCall) && message_words.at (2) == "73") {
// 73 back to compound call holder
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 5;
if (ui->rbGenMsg->isChecked ()) m_ntx=7;
m_gen_message_is_cq = false;
}
else {
m_ntx=5;
ui->txrb5->setChecked(true);
}
m_QSOProgress = SIGNOFF;
}
else if (!(m_bAutoReply && m_QSOProgress > CALLING)) {
if ((message_words.size () > 4 && message_words.at (1).contains (m_baseCall) && message_words.at (4) == "OOO")
|| ((m_mode=="MSK144" or m_mode=="FT8") && ui->cbVHFcontest->isChecked())) {
// EME short code report or MSK144/FT8 contest mode reply, send back Tx3
m_ntx = 3;
m_QSOProgress = ROGER_REPORT;
ui->txrb3->setChecked (true);
if (ui->tabWidget->currentIndex () == 1) {
gen_msg = 3;
m_ntx = 7;
m_gen_message_is_cq = false;
}
} else if (!is_73) { // don't respond to sign off messages
m_ntx=2;
m_QSOProgress = REPORT;
ui->txrb2->setChecked(true);
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 2;
m_ntx=7;
m_gen_message_is_cq = false;
}
if (m_bDoubleClickAfterCQnnn and m_transmitting) {
on_stopTxButton_clicked();
TxAgainTimer.start(1500);
}
m_bDoubleClickAfterCQnnn=false;
}
else {
return; // nothing we need to respond to
}
}
else { // nothing for us
return;
}
}
else if (firstcall == "DE" && message_words.size () > 3 && message_words.at (3) == "73") {
if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) {
// 73 back to compound call holder
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 5;
m_ntx=7;
m_gen_message_is_cq = false;
}
else {
m_ntx=5;
ui->txrb5->setChecked(true);
}
m_QSOProgress = SIGNOFF;
}
else {
// treat like a CQ/QRZ
if (ui->tx1->isEnabled ()) {
m_ntx = 1;
m_QSOProgress = REPLYING;
ui->txrb1->setChecked (true);
}
else {
m_ntx = 2;
m_QSOProgress = REPORT;
ui->txrb2->setChecked (true);
}
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 1;
m_ntx=7;
m_gen_message_is_cq = false;
}
}
}
else if (is_73 && !message.isStandardMessage ()) {
if(ui->tabWidget->currentIndex()==1) {
gen_msg = 5;
if (ui->rbGenMsg->isChecked ()) m_ntx=7;
m_gen_message_is_cq = false;
}
else {
m_ntx=5;
ui->txrb5->setChecked(true);
}
m_QSOProgress = SIGNOFF;
}
else // just work them
{
if (ui->tx1->isEnabled ()) {
m_ntx = 1;
m_QSOProgress = REPLYING;
ui->txrb1->setChecked (true);
}
else {
m_ntx = 2;
m_QSOProgress = REPORT;
ui->txrb2->setChecked (true);
}
if (1 == ui->tabWidget->currentIndex ()) {
gen_msg = m_ntx;
m_ntx=7;
m_gen_message_is_cq = false;
}
}
// if we get here then we are reacting to the message
if (m_bAutoReply) m_bCallingCQ = CALLING == m_QSOProgress;
if (ui->RxFreqSpinBox->isEnabled () and m_mode != "MSK144" and !shift) {
ui->RxFreqSpinBox->setValue (frequency); //Set Rx freq
}
QString s1 = m_QSOText.trimmed ();
QString s2 = message.string ().trimmed();
if (s1!=s2 and !message.isTX()) {
if (!s2.contains(m_baseCall) or m_mode=="MSK144") { // Taken care of elsewhere if for_us and slow mode
ui->decodedTextBrowser2->displayDecodedText(message, m_baseCall,
false, m_logBook,m_config.color_CQ(), m_config.color_MyCall(),
m_config.color_DXCC(),m_config.color_NewCall(),m_config.ppfx());
}
m_QSOText = s2;
}
if (Radio::is_callsign (hiscall)
&& (base_call != qso_partner_base_call || base_call != hiscall)) {
if (qso_partner_base_call != base_call) {
// clear the DX grid if the base call of his call is different
// from the current DX call
ui->dxGridEntry->clear ();
}
// his base call different or his call more qualified
// i.e. compound version of same base call
ui->dxCallEntry->setText (hiscall);
}
if (hisgrid.contains (grid_regexp)) {
if(ui->dxGridEntry->text().mid(0,4) != hisgrid) ui->dxGridEntry->setText(hisgrid);
}
if (!ui->dxGridEntry->text ().size ())
lookup();
m_hisGrid = ui->dxGridEntry->text();
QString rpt = message.report();
int n=rpt.toInt();
if(m_mode=="MSK144" and m_bShMsgs) {
int n=rpt.toInt();
if(n<=-2) n=-3;
if(n>=-1 and n<=1) n=0;
if(n>=2 and n<=4) n=3;
if(n>=5 and n<=7) n=6;
if(n>=8 and n<=11) n=10;
if(n>=12 and n<=14) n=13;
if(n>=15) n=16;
rpt=QString::number(n);
}
ui->rptSpinBox->setValue(n);
if (!m_nTx73) { // Don't genStdMsgs if we're already sending 73.
genStdMsgs(rpt);
if (gen_msg) {
switch (gen_msg) {
case 1: ui->genMsg->setText (ui->tx1->text ()); break;
case 2: ui->genMsg->setText (ui->tx2->text ()); break;
case 3: ui->genMsg->setText (ui->tx3->text ()); break;
case 4: ui->genMsg->setText (ui->tx4->text ()); break;
case 5: ui->genMsg->setText (ui->tx5->currentText ()); break;
}
if (gen_msg != 5) { // allow user to pre-select a free message
ui->rbGenMsg->setChecked (true);
}
}
}
if(m_transmitting) m_restart=true;
if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked () && !m_bDoubleClicked) return;
if(m_config.quick_call()) auto_tx_mode(true);
m_bDoubleClicked=false;
}
void MainWindow::genCQMsg ()
{
if(m_config.my_callsign().size () && m_config.my_grid().size ()) {
auto const& grid = m_config.my_callsign () != m_baseCall && shortList (m_config.my_callsign ()) ? QString {} : m_config.my_grid ();
if (ui->cbCQTx->isEnabled () && ui->cbCQTx->isVisible () && ui->cbCQTx->isChecked ()) {
msgtype (QString {"CQ %1 %2 %3"}
.arg (m_freqNominal / 1000 - m_freqNominal / 1000000 * 1000, 3, 10, QChar {'0'})
.arg (m_config.my_callsign())
.arg (grid.left (4)),
ui->tx6);
} else {
msgtype (QString {"%1 %2 %3"}.arg(m_CQtype).arg(m_config.my_callsign()).arg(grid.left(4)),ui->tx6);
}
if ((m_mode=="JT4" or m_mode=="QRA64") and ui->cbShMsgs->isChecked()) {
if (ui->cbTx6->isChecked ()) {
msgtype ("@1250 (SEND MSGS)", ui->tx6);
} else {
msgtype ("@1000 (TUNE)", ui->tx6);
}
}
} else {
ui->tx6->clear ();
}
}
void MainWindow::genStdMsgs(QString rpt, bool unconditional)
{
genCQMsg ();
auto const& hisCall=ui->dxCallEntry->text();
if(!hisCall.size ()) {
ui->labAz->clear ();
// ui->labDist->clear ();
ui->tx1->clear ();
ui->tx2->clear ();
ui->tx3->clear ();
ui->tx4->clear ();
if (unconditional) { // leave in place in case it needs
// sending again
ui->tx5->lineEdit ()->clear ();
}
ui->genMsg->clear ();
m_gen_message_is_cq = false;
return;
}
auto const& my_callsign = m_config.my_callsign ();
auto is_compound = my_callsign != m_baseCall;
auto is_type_one = is_compound && shortList (my_callsign);
auto const& my_grid = m_config.my_grid ().left (4);
auto const& hisBase = Radio::base_callsign (hisCall);
auto eme_short_codes = m_config.enable_VHF_features () && ui->cbShMsgs->isChecked () && m_mode == "JT65";
QString t0=hisBase + " " + m_baseCall + " ";
QString t00=t0;
QString t {t0 + my_grid};
msgtype(t, ui->tx1);
if (eme_short_codes) {
t=t+" OOO";
msgtype(t, ui->tx2);
msgtype("RO", ui->tx3);
msgtype(m_send_RR73 ? "RR73" : "RRR", ui->tx4);
msgtype("73", ui->tx5->lineEdit ());
} else {
int n=rpt.toInt();
rpt.sprintf("%+2.2d",n);
if(m_mode=="MSK144" or m_mode=="FT8") {
if(ui->cbVHFcontest->isChecked()) {
t=t0 + my_grid;
msgtype(t, ui->tx2);
t=t0 + "R " + my_grid;
msgtype(t, ui->tx3);
}
}
if(m_mode=="MSK144" and m_bShMsgs) {
int i=t0.length()-1;
t0="<" + t0.mid(0,i) + "> ";
if(!ui->cbVHFcontest->isChecked()) {
if(n<=-2) n=-3;
if(n>=-1 and n<=1) n=0;
if(n>=2 and n<=4) n=3;
if(n>=5 and n<=7) n=6;
if(n>=8 and n<=11) n=10;
if(n>=12 and n<=14) n=13;
if(n>=15) n=16;
rpt.sprintf("%+2.2d",n);
}
}
if((m_mode!="MSK144" and m_mode!="FT8") or !ui->cbVHFcontest->isChecked()) {
t=t00 + rpt;
msgtype(t, ui->tx2);
t=t0 + "R" + rpt;
msgtype(t, ui->tx3);
}
t=t0 + (m_send_RR73 ? "RR73" : "RRR");
if ((m_mode=="JT4" || m_mode=="QRA64") && m_bShMsgs) t="@1500 (RRR)";
msgtype(t, ui->tx4);
t=t0 + "73";
if (m_mode=="JT4" || m_mode=="QRA64") {
if (m_bShMsgs) t="@1750 (73)";
msgtype(t, ui->tx5->lineEdit ());
}
else if ("MSK144" == m_mode && m_bShMsgs) {
msgtype(t, ui->tx5->lineEdit ());
}
else if (unconditional || hisBase != m_lastCallsign || !m_lastCallsign.size ()) {
// only update tx5 when forced or callsign changes
msgtype(t, ui->tx5->lineEdit ());
m_lastCallsign = hisBase;
}
}
if (is_compound) {
if (is_type_one) {
t=hisBase + " " + my_callsign;
msgtype(t, ui->tx1);
} else {
t = "DE " + my_callsign + " ";
switch (m_config.type_2_msg_gen ())
{
case Configuration::type_2_msg_1_full:
msgtype(t + my_grid, ui->tx1);
if (!eme_short_codes) {
if ((m_mode=="MSK144" || m_mode=="FT8")
&& ui->cbVHFcontest->isChecked()) {
msgtype(t + "R " + my_grid, ui->tx3);
}
else {
msgtype(t + "R" + rpt, ui->tx3);
}
if ((m_mode != "JT4" && m_mode != "QRA64") || !m_bShMsgs) {
msgtype(t + "73", ui->tx5->lineEdit ());
}
}
break;
case Configuration::type_2_msg_3_full:
if ((m_mode=="MSK144" || m_mode=="FT8")
&& ui->cbVHFcontest->isChecked()) {
msgtype(t + "R " + my_grid, ui->tx3);
msgtype(t + "RRR", ui->tx4);
}
else {
msgtype(t00 + my_grid, ui->tx1);
msgtype(t + "R" + rpt, ui->tx3);
}
if (!eme_short_codes && ((m_mode != "JT4" && m_mode != "QRA64") || !m_bShMsgs)) {
msgtype(t + "73", ui->tx5->lineEdit ());
}
break;
case Configuration::type_2_msg_5_only:
msgtype(t00 + my_grid, ui->tx1);
if (!eme_short_codes) {
if ((m_mode=="MSK144" || m_mode=="FT8")
&& ui->cbVHFcontest->isChecked()) {
msgtype(t + "R " + my_grid, ui->tx3);
msgtype(t + "RRR", ui->tx4);
}
else {
msgtype(t0 + "R" + rpt, ui->tx3);
}
}
// don't use short codes here as in a sked with a type 2
// prefix we would never send out prefix/suffix
msgtype(t + "73", ui->tx5->lineEdit ());
break;
}
}
if (hisCall != hisBase
&& m_config.type_2_msg_gen () != Configuration::type_2_msg_5_only
&& !eme_short_codes) {
// cfm we have his full call copied as we could not do this earlier
t = hisCall + " 73";
msgtype(t, ui->tx5->lineEdit ());
}
} else {
if (hisCall != hisBase and !m_config.bHound()) {
if (shortList(hisCall)) {
// cfm we know his full call with a type 1 tx1 message
t = hisCall + " " + my_callsign;
msgtype(t, ui->tx1);
}
else if (!eme_short_codes
&& ("MSK144" != m_mode || !m_bShMsgs)) {
t=hisCall + " 73";
msgtype(t, ui->tx5->lineEdit ());
}
}
}
m_rpt=rpt;
if(m_config.bHound() and is_compound) ui->tx1->setText("DE " + m_config.my_callsign());
}
void MainWindow::TxAgain()
{
auto_tx_mode(true);
@ -5572,7 +4842,6 @@ void MainWindow::clearDX ()
m_rptRcvd.clear ();
m_qsoStart.clear ();
m_qsoStop.clear ();
genStdMsgs (QString {});
if (ui->tabWidget->currentIndex() == 1) {
ui->genMsg->setText(ui->tx6->text());
m_ntx=7;
@ -6484,7 +5753,6 @@ void MainWindow::on_dxGridEntry_textChanged (QString const& grid)
void MainWindow::on_genStdMsgsPushButton_clicked() //genStdMsgs button
{
genStdMsgs(m_rpt);
}
void MainWindow::on_logQSOButton_clicked() //Log QSO button
@ -6616,7 +5884,6 @@ void MainWindow::displayWidgets(qint64 n)
}
ui->tabWidget->setTabEnabled(3, "FT8" == m_mode);
m_lastCallsign.clear (); // ensures Tx5 is updated for new modes
genStdMsgs (m_rpt, true);
}
void MainWindow::on_actionFT8_triggered()
@ -6988,7 +6255,6 @@ void MainWindow::enable_DXCC_entity (bool on)
void MainWindow::on_pbCallCQ_clicked()
{
genStdMsgs(m_rpt);
ui->genMsg->setText(ui->tx6->text());
m_ntx=7;
m_QSOProgress = CALLING;
@ -7000,7 +6266,6 @@ void MainWindow::on_pbCallCQ_clicked()
void MainWindow::on_pbAnswerCaller_clicked()
{
genStdMsgs(m_rpt);
QString t=ui->tx3->text();
int i0=t.indexOf(" R-");
if(i0<0) i0=t.indexOf(" R+");
@ -7016,7 +6281,6 @@ void MainWindow::on_pbAnswerCaller_clicked()
void MainWindow::on_pbSendRRR_clicked()
{
genStdMsgs(m_rpt);
ui->genMsg->setText(ui->tx4->text());
m_ntx=7;
m_QSOProgress = ROGERS;
@ -7027,7 +6291,6 @@ void MainWindow::on_pbSendRRR_clicked()
void MainWindow::on_pbAnswerCQ_clicked()
{
genStdMsgs(m_rpt);
ui->genMsg->setText(ui->tx1->text());
QString t=ui->tx2->text();
int i0=t.indexOf("/");
@ -7042,7 +6305,6 @@ void MainWindow::on_pbAnswerCQ_clicked()
void MainWindow::on_pbSendReport_clicked()
{
genStdMsgs(m_rpt);
ui->genMsg->setText(ui->tx3->text());
m_ntx=7;
m_QSOProgress = ROGER_REPORT;
@ -7054,7 +6316,6 @@ void MainWindow::on_pbSendReport_clicked()
void MainWindow::on_pbSend73_clicked()
{
genStdMsgs(m_rpt);
ui->genMsg->setText(ui->tx5->currentText());
m_ntx=7;
m_QSOProgress = SIGNOFF;
@ -7842,7 +7103,6 @@ void MainWindow::on_rptSpinBox_valueChanged(int n)
}
m_rpt=QString::number(n);
int ntx0=m_ntx;
genStdMsgs(m_rpt);
m_ntx=ntx0;
if(m_ntx==1) ui->txrb1->setChecked(true);
if(m_ntx==2) ui->txrb2->setChecked(true);
@ -8133,7 +7393,6 @@ void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const&
if (old_freqNominal != m_freqNominal)
{
m_freqTxNominal = m_freqNominal;
genCQMsg ();
}
if (m_monitoring)
@ -8599,7 +7858,6 @@ void MainWindow::on_cbShMsgs_toggled(bool b)
int itone0=itone[0];
int ntx=m_ntx;
m_lastCallsign.clear (); // ensure Tx5 gets updated
genStdMsgs(m_rpt);
itone[0]=itone0;
if(ntx==1) ui->txrb1->setChecked(true);
if(ntx==2) ui->txrb2->setChecked(true);
@ -8616,72 +7874,6 @@ void MainWindow::on_cbSWL_toggled(bool b)
void MainWindow::on_cbTx6_toggled(bool)
{
genCQMsg ();
}
// Takes a decoded CQ line and sets it up for reply
void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 delta_frequency
, QString const& mode, QString const& message_text
, bool /*low_confidence*/, quint8 modifiers)
{
if (!m_config.accept_udp_requests ())
{
return;
}
QString format_string {"%1 %2 %3 %4 %5 %6"};
auto const& time_string = time.toString ("~" == mode || "&" == mode ? "hhmmss" : "hhmm");
auto cqtext = format_string
.arg (time_string)
.arg (snr, 3)
.arg (delta_time, 4, 'f', 1)
.arg (delta_frequency, 4)
.arg (mode, -2)
.arg (message_text);
auto messages = ui->decodedTextBrowser->toPlainText ();
auto position = messages.lastIndexOf (cqtext);
if (position < 0)
{
// try again with with -0.0 delta time
position = messages.lastIndexOf (format_string
.arg (time_string)
.arg (snr, 3)
.arg ('-' + QString::number (delta_time, 'f', 1), 4)
.arg (delta_frequency, 4)
.arg (mode, -2)
.arg (message_text));
}
if (position >= 0)
{
if (m_config.udpWindowToFront ())
{
show ();
raise ();
activateWindow ();
}
if (m_config.udpWindowRestore () && isMinimized ())
{
showNormal ();
raise ();
}
// find the linefeed at the end of the line
position = ui->decodedTextBrowser->toPlainText().indexOf(QChar::LineFeed,position);
if (message_text.contains (QRegularExpression {R"(^(CQ |CQDX |QRZ ))"})) {
// a message we are willing to accept and auto reply to
m_bDoubleClicked = true;
}
auto start = messages.left (position).lastIndexOf (QChar::LineFeed) + 1;
DecodedText message {messages.mid (start, position - start), ("MSK144" == m_mode || "FT8" == m_mode) &&
ui->cbVHFcontest->isChecked(), m_config.my_grid ()};
Qt::KeyboardModifiers kbmod {modifiers << 24};
processMessage (message, kbmod);
tx_watchdog (false);
QApplication::alert (this);
}
else
{
qDebug () << "process reply message ignored, decode not found:" << cqtext;
}
}
void MainWindow::locationChange (QString const& location)
@ -8703,7 +7895,6 @@ void MainWindow::locationChange (QString const& location)
qDebug() << "locationChange: Grid supplied is " << grid;
if (m_config.my_grid () != grid) {
m_config.set_dynamic_location (grid);
genStdMsgs (m_rpt, false);
statusUpdate ();
}
} else {
@ -10773,7 +9964,6 @@ void MainWindow::setRig (Frequency f)
if (f)
{
m_freqNominal = f;
genCQMsg ();
m_freqTxNominal = m_freqNominal;
if (m_astroWidget) m_astroWidget->nominal_frequency (m_freqNominal, m_freqTxNominal);
}
@ -10856,7 +10046,6 @@ void MainWindow::on_sbCQTxFreq_valueChanged(int)
void MainWindow::on_cbCQTx_toggled(bool b)
{
ui->sbCQTxFreq->setEnabled(b);
genCQMsg();
if(b) {
ui->txrb6->setChecked(true);
m_ntx=6;

View File

@ -120,8 +120,6 @@ public slots:
void diskDat();
void freezeDecode(int n);
void guiUpdate();
void doubleClickOnCall (Qt::KeyboardModifiers);
void doubleClickOnCall2(Qt::KeyboardModifiers);
void readFromStdout();
void p1ReadFromStdout();
void setXIT(int n, Frequency base = 0u);
@ -417,7 +415,6 @@ private:
private:
void astroUpdate ();
void writeAllTxt(QString message);
void auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance);
void hideMenus(bool b);
NetworkAccessManager m_network_manager;
@ -860,8 +857,6 @@ private:
void writeSettings();
void createStatusBar();
void updateStatusBar();
void genStdMsgs(QString rpt, bool unconditional = false);
void genCQMsg();
void clearDX ();
void lookup();
void ba2msg(QByteArray ba, char* message);
@ -874,14 +869,11 @@ private:
void rigFailure (QString const& reason);
void pskSetLocal ();
void aprsSetLocal ();
void pskPost(DecodedText const& decodedtext);
void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid);
void aprsLogReport(int offset, int snr, QString callsign, QString grid);
Radio::Frequency dialFrequency();
void displayDialFrequency ();
void transmitDisplay (bool);
void processMessage(DecodedText const&, Qt::KeyboardModifiers = 0);
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence, quint8 modifiers);
void locationChange(QString const& location);
void replayDecodes ();
void postDecode (bool is_new, QString const& message);