diff --git a/Configuration.cpp b/Configuration.cpp index 7fac6f4..88a6735 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -644,6 +644,7 @@ private: bool ppfx_; bool clear_callsign_; bool miles_; + bool avoid_allcall_; bool quick_call_; bool disable_TX_on_73_; int heartbeat_; @@ -775,6 +776,7 @@ bool Configuration::DXCC () const {return m_->DXCC_;} bool Configuration::ppfx() const {return m_->ppfx_;} bool Configuration::clear_callsign () const {return m_->clear_callsign_;} bool Configuration::miles () const {return m_->miles_;} +bool Configuration::avoid_allcall () const {return m_->avoid_allcall_;} bool Configuration::quick_call () const {return m_->quick_call_;} bool Configuration::disable_TX_on_73 () const {return m_->disable_TX_on_73_;} int Configuration::heartbeat () const {return m_->heartbeat_;} @@ -1385,6 +1387,7 @@ void Configuration::impl::initialize_models () ui_->prompt_to_log_check_box->setChecked (prompt_to_log_); ui_->clear_callsign_check_box->setChecked (clear_callsign_); ui_->miles_check_box->setChecked (miles_); + ui_->avoid_allcall_checkbox->setChecked(avoid_allcall_); ui_->quick_call_check_box->setChecked (quick_call_); ui_->disable_TX_on_73_check_box->setChecked (disable_TX_on_73_); ui_->heartbeat_spin_box->setValue (heartbeat_); @@ -1695,6 +1698,7 @@ void Configuration::impl::read_settings () ppfx_ = settings_->value ("PrincipalPrefix", false).toBool (); clear_callsign_ = settings_->value ("ClearCallGrid", false).toBool (); miles_ = settings_->value ("Miles", false).toBool (); + avoid_allcall_ = settings_->value ("AvoidAllcall", false).toBool (); quick_call_ = settings_->value ("QuickCall", false).toBool (); disable_TX_on_73_ = settings_->value ("73TxDisable", false).toBool (); heartbeat_ = settings_->value ("TxBeacon", 30).toInt (); @@ -1830,6 +1834,7 @@ void Configuration::impl::write_settings () settings_->setValue ("PrincipalPrefix", ppfx_); settings_->setValue ("ClearCallGrid", clear_callsign_); settings_->setValue ("Miles", miles_); + settings_->setValue ("AvoidAllcall", avoid_allcall_); settings_->setValue ("QuickCall", quick_call_); settings_->setValue ("73TxDisable", disable_TX_on_73_); settings_->setValue ("TxBeacon", heartbeat_); @@ -2319,6 +2324,7 @@ void Configuration::impl::accept () prompt_to_log_ = ui_->prompt_to_log_check_box->isChecked (); clear_callsign_ = ui_->clear_callsign_check_box->isChecked (); miles_ = ui_->miles_check_box->isChecked (); + avoid_allcall_ = ui_->avoid_allcall_checkbox->isChecked(); quick_call_ = ui_->quick_call_check_box->isChecked (); disable_TX_on_73_ = ui_->disable_TX_on_73_check_box->isChecked (); heartbeat_ = ui_->heartbeat_spin_box->value (); diff --git a/Configuration.hpp b/Configuration.hpp index ce0b1cf..f7a3660 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -135,6 +135,7 @@ public: bool ppfx() const; bool clear_callsign () const; bool miles () const; + bool avoid_allcall () const; bool quick_call () const; bool disable_TX_on_73 () const; int heartbeat () const; diff --git a/Configuration.ui b/Configuration.ui index e183610..d33c2f6 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -98,30 +98,6 @@ - - - - Station callsign. - - - - - - - IARU Region - - - - - - - IARU Region: - - - region_combo_box - - - @@ -132,6 +108,19 @@ + + + + <html><head/><body><p>Enter a comma separated list of callsign groups (e.g., @GROUP/1, @ARES, @RACES, etc). <br/><br/>Each group behaves similarly to @ALLCALL. Messages that are directed to the group are printed at all participating stations.</p></body></html> + + + + + + @GROUP1, ... + + + @@ -143,22 +132,49 @@ - + Callsign Groups (comma separated): - - + + - <html><head/><body><p>Enter a comma separated list of callsign groups (e.g., @GROUP/1, @ARES, @RACES, etc). <br/><br/>Each group behaves similarly to @ALLCALL. Messages that are directed to the group are printed at all participating stations.</p></body></html> + Station callsign. + + + + + + + Do not participate in the @ALLCALL group + + + false + + + + + + + false + + + IARU Region + + + + + + + false - + IARU Region: - - @ALLCALL, ... + + region_combo_box @@ -279,8 +295,8 @@ 0 0 - 724 - 489 + 654 + 482 @@ -389,11 +405,11 @@ - - - Allow heartbeat transmissions outside of heartbeat sub-channel (500Hz - 1000Hz) - - + + + Allow heartbeat transmissions outside of heartbeat sub-channel (500Hz - 1000Hz) + + @@ -876,7 +892,7 @@ text message. 0 0 - 718 + 264 435 @@ -1715,8 +1731,8 @@ radio interface behave as expected. 0 0 - 760 - 502 + 266 + 329 @@ -2028,8 +2044,8 @@ both here. 0 0 - 746 - 554 + 508 + 525 @@ -2485,8 +2501,8 @@ for assessing propagation and system performance. 0 0 - 760 - 502 + 487 + 341 @@ -2592,7 +2608,7 @@ for assessing propagation and system performance. - Working Frequencies + Frequencies @@ -3063,8 +3079,8 @@ QListView::item:hover { 0 0 - 738 - 378 + 271 + 195 @@ -4065,12 +4081,12 @@ soundcard changes - - - - + + + + diff --git a/mainwindow.cpp b/mainwindow.cpp index c743dab..a8d0c9e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1125,7 +1125,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, return; } - if(!ensureCallsignSet(true) || !ensureSelcalCallsignSelected(true)){ + if(!ensureCallsignSet(true)){ return; } @@ -1448,15 +1448,14 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, gridButtonLayout->setColumnMinimumWidth(0, width); gridButtonLayout->setColumnMinimumWidth(1, width); gridButtonLayout->setColumnMinimumWidth(2, width); - gridButtonLayout->setColumnMinimumWidth(3, width); gridButtonLayout->setColumnStretch(0, 1); gridButtonLayout->setColumnStretch(1, 1); gridButtonLayout->setColumnStretch(2, 1); - gridButtonLayout->setColumnStretch(3, 1); pskSetLocal(); aprsSetLocal(); + clearActivity(); displayActivity(true); /* @@ -1747,7 +1746,6 @@ void MainWindow::writeSettings() m_settings->setValue("TextVerticalSplitter", ui->textVerticalSplitter->saveState()); m_settings->setValue("ShowTimeDrift", ui->driftSyncFrame->isVisible()); m_settings->setValue("TimeDrift", ui->driftSpinBox->value()); - m_settings->setValue("SelCal", ui->selcalButton->isChecked()); m_settings->setValue("ShowTooltips", ui->actionShow_Tooltips->isChecked()); m_settings->endGroup(); @@ -1862,7 +1860,6 @@ void MainWindow::readSettings() } ui->driftSyncFrame->setVisible(m_settings->value("ShowTimeDrift", false).toBool()); ui->driftSpinBox->setValue(m_settings->value("TimeDrift", 0).toInt()); - ui->selcalButton->setChecked(m_settings->value("SelCal", false).toBool()); ui->actionShow_Tooltips->setChecked(m_settings->value("ShowTooltips", true).toBool()); m_settings->endGroup(); @@ -2367,9 +2364,7 @@ void rebuildMacQAction(QMenu *menu, QAction *existingAction){ void MainWindow::on_menuControl_aboutToShow(){ ui->actionEnable_Spotting->setChecked(ui->spotButton->isChecked()); - ui->actionEnable_Active->setChecked(ui->activeButton->isChecked()); ui->actionEnable_Auto_Reply->setChecked(ui->autoReplyButton->isChecked()); - ui->actionEnable_Selcall->setChecked(ui->selcalButton->isChecked()); QMenu * heartbeatMenu = new QMenu(this->menuBar()); buildHeartbeatMenu(heartbeatMenu); @@ -2394,14 +2389,6 @@ void MainWindow::on_actionEnable_Auto_Reply_toggled(bool checked){ ui->autoReplyButton->setChecked(checked); } -void MainWindow::on_actionEnable_Active_toggled(bool checked){ - ui->activeButton->setChecked(checked); -} - -void MainWindow::on_actionEnable_Selcall_toggled(bool checked){ - ui->selcalButton->setChecked(checked); -} - void MainWindow::on_menuWindow_aboutToShow(){ ui->actionShow_Fullscreen->setChecked((windowState() & Qt::WindowFullScreen) == Qt::WindowFullScreen); @@ -2770,33 +2757,6 @@ void MainWindow::on_monitorTxButton_toggled(bool checked){ resetPushButtonToggleText(ui->monitorTxButton); } -void MainWindow::on_selcalButton_toggled(bool checked){ -#if SELCAL_SHOULD_HIDE_BAND_ACTIVITY - if(checked){ - if(ui->tableWidgetRXAll->isVisible()){ - ui->tableWidgetRXAll->setVisible(false); - m_bandActivityWasVisible = true; - } else { - m_bandActivityWasVisible = false; - } - } else { - ui->tableWidgetRXAll->setVisible(m_bandActivityWasVisible); - } -#endif - - if(checked && callsignSelected() == "@ALLCALL"){ - clearCallsignSelected(); - } - - if(checked){ - resetAutomaticIntervalTransmissions(true, true); - } - - resetPushButtonToggleText(ui->selcalButton); - - displayCallActivity(); -} - void MainWindow::on_tuneButton_toggled(bool checked){ resetPushButtonToggleText(ui->tuneButton); } @@ -2805,43 +2765,6 @@ void MainWindow::on_spotButton_toggled(bool checked){ resetPushButtonToggleText(ui->spotButton); } -void MainWindow::on_activeButton_toggled(bool checked){ -#if 0 - // clear the ping queue when you toggle the button - m_txHeartbeatQueue.clear(); - displayBandActivity(); - - // then process the action - if(checked){ - scheduleHeartbeat(false); - } else { - pauseHeartbeat(); - } -#endif - - // we call this so hb button disabled state is updated - updateButtonDisplay(); - - resetPushButtonToggleText(ui->activeButton); -} - -#if 0 -void MainWindow::on_heartbeatButton_toggled(bool checked){ - // clear the ping queue when you toggle the button - m_txHeartbeatQueue.clear(); - displayBandActivity(); - - // then process the action - if(checked){ - scheduleHeartbeat(false); - } else { - pauseHeartbeat(); - } - - resetPushButtonToggleText(ui->heartbeatButton); -} -#endif - void MainWindow::auto_tx_mode (bool state) { ui->autoButton->setChecked (state); @@ -5433,7 +5356,8 @@ void MainWindow::createAllcallTableRows(QTableWidget *table, QString const &sele int startCol = 1; - if(!ui->selcalButton->isChecked()){ + if(!m_config.avoid_allcall()) + { table->insertRow(table->rowCount()); foreach(auto cd, m_callActivity.values()){ @@ -5689,19 +5613,6 @@ bool MainWindow::ensureCallsignSet(bool alert){ return true; } -bool MainWindow::ensureSelcalCallsignSelected(bool alert){ - auto selectedCallsign = callsignSelected(true); - bool isAllCall = isAllCallIncluded(selectedCallsign); - bool missingCall = selectedCallsign.isEmpty(); - bool blockTransmit = ui->selcalButton->isChecked() && (isAllCall || missingCall); - - if(blockTransmit && alert){ - MessageBox::warning_message(this, tr ("Please select or enter a callsign to direct this message while SELCALL is enabled.")); - } - - return !blockTransmit; -} - bool MainWindow::ensureKeyNotStuck(QString const& text){ // be annoying and drop messages with all the same character to reduce spam... if(text.length() > 5 && QString(text).replace(text.at(0), "").trimmed().isEmpty()){ @@ -5730,11 +5641,6 @@ void MainWindow::createMessage(QString const& text){ return; } - if(!ensureSelcalCallsignSelected()){ - on_stopTxButton_clicked(); - return; - } - if(!ensureNotIdle()){ on_stopTxButton_clicked(); return; @@ -6797,8 +6703,7 @@ void MainWindow::buildRepeatMenu(QMenu *menu, QPushButton * button, int * interv void MainWindow::sendHeartbeat(){ QString mycall = m_config.my_callsign(); QString mygrid = m_config.my_grid().left(4); - QString status = ui->activeButton->isChecked() ? "ACTIVE" : "IDLE"; - QString message = QString("%1: HB %2 %3").arg(mycall).arg(status).arg(mygrid).trimmed(); + QString message = QString("%1: HB %2").arg(mycall).arg(mygrid).trimmed(); auto f = m_config.heartbeat_anywhere() ? -1 : findFreeFreqOffset(500, 1000, 50); @@ -7210,7 +7115,7 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){ if(m_config.transmit_directed()) toggleTx(true); }); - auto stationIdleQueryAction = menu->addAction(QString("%1 STATUS? - Is your station active or inactive?").arg(call).trimmed()); + auto stationIdleQueryAction = menu->addAction(QString("%1 STATUS? - What is the status of your station (auto, version, etc)?").arg(call).trimmed()); stationIdleQueryAction->setDisabled(isAllCall); connect(stationIdleQueryAction, &QAction::triggered, this, [this](){ @@ -7474,8 +7379,7 @@ QMap MainWindow::buildMacroValues(){ {"", m_config.my_station()}, {"", m_config.my_qth()}, {"", m_config.cq_message()}, - {"", m_config.reply_message()}, - {"", (ui->activeButton->isChecked() ? "ACTIVE" : "IDLE")}, + {"", m_config.reply_message()} }; auto selectedCall = callsignSelected(); @@ -8660,9 +8564,8 @@ void MainWindow::updateRepeatButtonDisplay(){ void MainWindow::updateTextDisplay(){ bool isTransmitting = m_transmitting || m_txFrameCount > 0; bool emptyText = ui->extFreeTextMsgEdit->toPlainText().isEmpty(); - bool invalidSelcal = !ensureSelcalCallsignSelected(false); - ui->startTxButton->setDisabled(isTransmitting || emptyText || invalidSelcal); + ui->startTxButton->setDisabled(isTransmitting || emptyText); if(m_txTextDirty){ // debounce frame and word count @@ -8790,7 +8693,7 @@ void MainWindow::updateTxButtonDisplay(){ ui->startTxButton->setFlat(true); } else { ui->startTxButton->setText(m_txFrameCountEstimate <= 0 ? QString("Send") : QString("Send (%1)").arg(m_txFrameCountEstimate)); - ui->startTxButton->setEnabled(m_txFrameCountEstimate > 0 && ensureSelcalCallsignSelected(false)); + ui->startTxButton->setEnabled(m_txFrameCountEstimate > 0); ui->startTxButton->setFlat(false); } } @@ -8944,7 +8847,10 @@ void MainWindow::observeTimeDeltaForAverage(float delta){ } // display average - ui->driftAvgLabel->setText(QString("Avg Time Delta: %1 ms").arg(m_timeDeltaMsMMA)); + if(m_timeDeltaMsMMA < -15.0F || m_timeDeltaMsMMA > 15.0F){ + resetTimeDeltaAverage(); + } + ui->driftAvgLabel->setText(QString("Avg Time Delta: %1 ms").arg((int)m_timeDeltaMsMMA)); } void MainWindow::resetTimeDeltaAverage(){ @@ -9015,7 +8921,7 @@ void MainWindow::processRxActivity() { int prevOffset = d.freq; if(hasExistingMessageBuffer(d.freq, false, &prevOffset) && ( (m_messageBuffer[prevOffset].cmd.to == m_config.my_callsign()) || - // (isAllCallIncluded(m_messageBuffer[prevOffset].cmd.to) && !ui->selcalButton->isChecked()) || // don't incrementally print allcalls + // (isAllCallIncluded(m_messageBuffer[prevOffset].cmd.to)) || // uncomment this if we want to incrementally print allcalls (isGroupCallIncluded(m_messageBuffer[prevOffset].cmd.to)) ) ){ @@ -9042,10 +8948,6 @@ void MainWindow::processRxActivity() { if(d.isDirected && d.text.contains(": HB ")){ // TODO: HEARTBEAT continue; } - - if(ui->selcalButton->isChecked()){ - continue; - } } // TODO: incremental printing of directed messages @@ -9342,8 +9244,9 @@ void MainWindow::processCommandActivity() { continue; } - // if selcal is enabled and this is an allcall, take no action. - if (isAllCall && ui->selcalButton->isChecked()) { + // we're only responding to allcalls if we are participating in the allcall group + // but, don't avoid for heartbeats...those are technically allcalls but are processed differently + if(isAllCall && m_config.avoid_allcall() && d.cmd != " HB"){ continue; } @@ -9457,11 +9360,7 @@ void MainWindow::processCommandActivity() { // QUERIED ACTIVE else if (d.cmd == " STATUS?" && !isAllCall) { - if(ui->activeButton->isChecked()){ - reply = QString("%1 ACTIVE").arg(d.from); - } else { - reply = QString("%1 IDLE").arg(d.from); - } + reply = QString("%1 AUTO:%2 VER:%3").arg(d.from).arg(ui->autoReplyButton->isChecked() ? "ON" : "OFF").arg(version()); } // QUERIED GRID @@ -9585,7 +9484,7 @@ void MainWindow::processCommandActivity() { // PROCESS ACTIVE HEARTBEAT // if we have auto reply enabled and we are heartbeating and selcall is not enabled - else if (d.cmd == " HB" && ui->autoReplyButton->isChecked() && ui->hbMacroButton->isChecked() && m_hbInterval > 0 && !ui->selcalButton->isChecked()){ + else if (d.cmd == " HB" && ui->autoReplyButton->isChecked() && ui->hbMacroButton->isChecked() && m_hbInterval > 0){ sendHeartbeatAck(d.from, d.snr); if(isAllCall){ @@ -9598,7 +9497,7 @@ void MainWindow::processCommandActivity() { } // PROCESS BUFFERED QUERY - else if (d.cmd == " QUERY" && ui->autoReplyButton->isChecked() && !ui->selcalButton->isChecked()){ + else if (d.cmd == " QUERY" && ui->autoReplyButton->isChecked()){ auto who = d.text; if(who.isEmpty()){ continue; @@ -11100,21 +10999,18 @@ void MainWindow::tx_watchdog (bool triggered) // if the watchdog is triggered...we're no longer active bool wasAuto = ui->autoReplyButton->isChecked(); - bool wasActive = ui->activeButton->isChecked(); bool wasHB = ui->hbMacroButton->isChecked(); bool wasCQ = ui->cqMacroButton->isChecked(); // save the button states ui->autoReplyButton->setChecked(false); - ui->activeButton->setChecked(false); ui->hbMacroButton->setChecked(false); ui->cqMacroButton->setChecked(false); - MessageBox::warning_message(this, QString("Attempting to transmit, but you have been inactive for more than %1 minutes.").arg(m_config.watchdog())); + MessageBox::warning_message(this, QString("You have been inactive for more than %1 minutes.").arg(m_config.watchdog())); // restore the button states ui->autoReplyButton->setChecked(wasAuto); - ui->activeButton->setChecked(wasActive); ui->hbMacroButton->setChecked(wasHB); ui->cqMacroButton->setChecked(wasCQ); } diff --git a/mainwindow.h b/mainwindow.h index cbe3a76..f016dc4 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -151,7 +151,6 @@ public slots: void restoreMessage(); void initializeDummyData(); bool ensureCallsignSet(bool alert=true); - bool ensureSelcalCallsignSelected(bool alert=true); bool ensureKeyNotStuck(QString const& text); bool ensureNotIdle(); void createMessage(QString const& text); @@ -174,9 +173,7 @@ private slots: void on_tx6_editingFinished(); void on_menuControl_aboutToShow(); void on_actionEnable_Spotting_toggled(bool checked); - void on_actionEnable_Active_toggled(bool checked); void on_actionEnable_Auto_Reply_toggled(bool checked); - void on_actionEnable_Selcall_toggled(bool checked); void on_menuWindow_aboutToShow(); void on_actionShow_Fullscreen_triggered(bool checked); void on_actionShow_Frequency_Clock_triggered(bool checked); @@ -360,10 +357,8 @@ private slots: void on_autoReplyButton_toggled(bool checked); void on_monitorButton_toggled(bool checked); void on_monitorTxButton_toggled(bool checked); - void on_selcalButton_toggled(bool checked); void on_tuneButton_toggled(bool checked); void on_spotButton_toggled(bool checked); - void on_activeButton_toggled(bool checked); void on_actionMessage_averaging_triggered(); void on_actionFox_Log_triggered(); diff --git a/mainwindow.ui b/mainwindow.ui index c647882..af036a3 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -476,7 +476,7 @@ QPushButton:checked { QFrame::Plain - + QLayout::SetMinimumSize @@ -715,120 +715,39 @@ QPushButton:checked { + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 10 + + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 10 + + + + - - - true - - - - 0 - 0 - - - - - 0 - 30 - - - - - 16777215 - 16777215 - - - - - 9 - - - - <html><head/><body><p>Register your station as active or idle</p></body></html> - - - QPushButton { - background-color:lightgray; - padding:0.25em 0.25em; font-weight:normal; - border-style:solid; - border-width:0px; - border-radius:2px; - } - -QPushButton:checked { - background-color:#6699ff; -} - - - ACTIVE - - - true - - - false - - - - - - - true - - - - 0 - 0 - - - - - 0 - 30 - - - - - 16777215 - 16777215 - - - - - 9 - - - - true - - - <html><head/><body><p>Enable or disable selective calling (i.e., only directed messages to you will be displayed in the RX area)</p></body></html> - - - QPushButton { - background-color:lightgray; - padding:0.25em 0.25em; font-weight:normal; - border-style:solid; - border-width:0px; - border-radius:2px; - } - -QPushButton:checked { - background-color:#6699ff; -} - - - SELCALL - - - true - - - false - - - - true @@ -883,7 +802,7 @@ QPushButton:checked { - + true @@ -938,87 +857,55 @@ QPushButton:checked { - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 10 - - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 10 - - - - - - - - false - - - - 0 - 0 - - - - - 0 - 30 - - - - - 9 - - - - false - - - QPushButton { - background-color:lightgray; - padding:0.25em 0.25em; font-weight:normal; - border-style:solid; - border-width:0px; - border-radius:2px; - } - -QPushButton:checked { - background-color:#6699ff; -} - - - TURBO - - - true - - - + + + + false + + + + 0 + 0 + + + + + 0 + 30 + + + + + 9 + + + + false + + + QPushButton { + background-color:lightgray; + padding:0.25em 0.25em; font-weight:normal; + border-style:solid; + border-width:0px; + border-radius:2px; +} + +QPushButton:checked { +background-color:#6699ff; +} + + + TURBO + + + true + + + diff --git a/varicode.cpp b/varicode.cpp index 944a7e1..5c16e91 100644 --- a/varicode.cpp +++ b/varicode.cpp @@ -71,11 +71,10 @@ QMap directed_cmds = { {" TU", 9 }, // thank you - {" ACTIVE", 10 }, // i am active - {" IDLE", 11 }, // i am idle - {" HB", -1 }, // this is my heartbeat (unused except for faux processing of HBs as directed commands) + // {" ", 10 }, // unused + // {" ", 11 }, // unused // {" ", 12 }, // unused {" QUERY", 13 }, // can you transmit a ping to callsign? @@ -103,7 +102,7 @@ QMap directed_cmds = { {" ", 31 }, // send freetext }; -QSet allowed_cmds = {-1, 0, 1, 2, 3, 4, 5, 6, /*7,*/ /*8,*/ 9, 10, 11, /*12,*/ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, /*24,*/ 25, 26, 27, 28, 29, 30, 31}; +QSet allowed_cmds = {-1, 0, 1, 2, 3, 4, 5, 6, /*7,*/ /*8,*/ 9, /*10,*/ /*11,*/ /*12,*/ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, /*24,*/ 25, 26, 27, 28, 29, 30, 31}; QSet buffered_cmds = {3, 5, /*6,*/ /*7,*/ 13, 14, 15}; @@ -117,7 +116,7 @@ QMap checksum_cmds = { }; QString callsign_pattern = QString("(?[@]?[A-Z0-9/]+)"); -QString optional_cmd_pattern = QString("(?\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|SNR[?]|QTC[?]|QTH[?]|GRID[?]|STATUS[?]|HEARING[?]|(?:(?:QUERY|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|QTC|GRID|ACTIVE|IDLE|TU)(?=[ ]|$))|[?*^&@$> ]))?"); +QString optional_cmd_pattern = QString("(?\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|SNR[?]|QTC[?]|QTH[?]|GRID[?]|STATUS[?]|HEARING[?]|(?:(?:QUERY|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|QTC|GRID|TU)(?=[ ]|$))|[?*^&@$> ]))?"); QString optional_grid_pattern = QString("(?\\s?[A-R]{2}[0-9]{2})?"); QString optional_extended_grid_pattern = QString("^(?\\s?(?:[A-R]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*))?"); QString optional_num_pattern = QString("(?(?<=SNR|ACK)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?"); @@ -127,7 +126,7 @@ QRegularExpression directed_re("^" + optional_cmd_pattern + optional_num_pattern); -QRegularExpression heartbeat_re(R"(^\s*(?CQCQCQ|CQ QRPP?|CQ DX|CQ TEST|CQ( CQ){0,2}|HB (ACTIVE|IDLE))(?:\s(?[A-R]{2}[0-9]{2}))?\b)"); +QRegularExpression heartbeat_re(R"(^\s*(?CQCQCQ|CQ QRPP?|CQ DX|CQ TEST|CQ( CQ){0,2}|HB)(?:\s(?[A-R]{2}[0-9]{2}))?\b)"); QRegularExpression compound_re("^\\s*[`]" + callsign_pattern + @@ -210,8 +209,8 @@ QMap cqs = { }; QMap hbs = { - { 0, "HB ACTIVE" }, - { 1, "HB IDLE" }, + { 0, "HB" }, // HB ACTIVE + { 1, "HB" }, // HB IDLE }; @@ -1146,8 +1145,7 @@ bool Varicode::isCompoundCallsign(const QString &callsign){ // CQCQCQ EM73 // CQ DX EM73 // CQ QRP EM73 -// HB ACTIVE EM73 -// HB IDLE EM73 +// HB EM73 QString Varicode::packHeartbeatMessage(QString const &text, const QString &callsign, int *n){ QString frame;