diff --git a/decodedtext.cpp b/decodedtext.cpp index 1d26837..65cc343 100644 --- a/decodedtext.cpp +++ b/decodedtext.cpp @@ -126,7 +126,7 @@ bool DecodedText::tryUnpackHeartbeat(){ // Heartbeat Alt Type // --------------- - // 1 0 BCN + // 1 0 HB // 1 1 CQ isHeartbeat_ = true; isAlt_ = isAlt; diff --git a/mainwindow.cpp b/mainwindow.cpp index b7317f9..c9a6c5f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3853,7 +3853,7 @@ void MainWindow::readFromStdout() //readFromStdout // convert HEARTBEAT to a directed command and process... cmd.from = cd.call; cmd.to = "@ALLCALL"; - cmd.cmd = " ACTIVE"; + cmd.cmd = " HB"; cmd.snr = cd.snr; cmd.bits = cd.bits; cmd.grid = cd.grid; @@ -6495,7 +6495,8 @@ void MainWindow::on_clearAction_triggered(QObject * sender){ void MainWindow::on_hbMacroButton_clicked(){ QString mycall = m_config.my_callsign(); QString mygrid = m_config.my_grid().left(4); - QString message = QString("%1: ACTIVE %2").arg(mycall).arg(mygrid).trimmed(); + QString status = ui->activeButton->isChecked() ? "ACTIVE" : "IDLE"; + QString message = QString("%1: HB %2 %3").arg(mycall).arg(status).arg(mygrid).trimmed(); addMessageText(message); @@ -6849,7 +6850,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 idle?").arg(call).trimmed()); + auto stationIdleQueryAction = menu->addAction(QString("%1 STATUS? - Is your station active or inactive?").arg(call).trimmed()); stationIdleQueryAction->setDisabled(isAllCall); connect(stationIdleQueryAction, &QAction::triggered, this, [this](){ @@ -7141,7 +7142,7 @@ QMap MainWindow::buildMacroValues(){ {"", m_config.my_qth()}, {"", m_config.cq_message()}, {"", m_config.reply_message()}, - {"", (ui->activeButton->isChecked() ? "ACTIVE" : "INACTIVE")}, + {"", (ui->activeButton->isChecked() ? "ACTIVE" : "IDLE")}, }; auto selectedCall = callsignSelected(); @@ -8267,9 +8268,8 @@ void MainWindow::updateButtonDisplay(){ auto selectedCallsign = callsignSelected(true); bool emptyCallsign = selectedCallsign.isEmpty(); - bool isActive = ui->activeButton->isChecked(); - ui->hbMacroButton->setDisabled(isTransmitting || !isActive); + ui->hbMacroButton->setDisabled(isTransmitting); ui->cqMacroButton->setDisabled(isTransmitting); ui->replyMacroButton->setDisabled(isTransmitting || emptyCallsign); ui->snrMacroButton->setDisabled(isTransmitting || emptyCallsign); @@ -8612,7 +8612,7 @@ void MainWindow::processRxActivity() { continue; } - if(d.isDirected && d.text.contains(": ACTIVE")){ // TODO: HEARTBEAT + if(d.isDirected && d.text.contains(": HB ")){ // TODO: HEARTBEAT continue; } @@ -8936,7 +8936,7 @@ void MainWindow::processCommandActivity() { bool shouldDisplay = true; // don't display ping allcalls - if(isAllCall && (d.cmd != " " || ad.text.contains(": ACTIVE"))){ // || d.cmd == " HEARTBEAT")){ + if(isAllCall && (d.cmd != " " || ad.text.contains(": HB "))){ shouldDisplay = false; } @@ -9018,7 +9018,7 @@ void MainWindow::processCommandActivity() { if(ui->activeButton->isChecked()){ reply = QString("%1 ACTIVE").arg(d.from); } else { - reply = QString("%1 INACTIVE").arg(d.from); + reply = QString("%1 IDLE").arg(d.from); } } @@ -9152,7 +9152,7 @@ void MainWindow::processCommandActivity() { } // PROCESS ACTIVE HEARTBEAT - else if (d.cmd == " ACTIVE" && ui->autoReplyButton->isChecked() && !ui->selcalButton->isChecked()){ + else if (d.cmd == " HB" && ui->autoReplyButton->isChecked() && !ui->selcalButton->isChecked()){ reply = QString("%1 ACK %2").arg(d.from).arg(Varicode::formatSNR(d.snr)); if(isAllCall){ @@ -9247,7 +9247,7 @@ void MainWindow::processCommandActivity() { } // do not queue @ALLCALL replies if auto-reply is not checked or it's a ping reply - if(!ui->autoReplyButton->isChecked() && isAllCall && !d.cmd.contains("ACTIVE")){ + if(!ui->autoReplyButton->isChecked() && isAllCall && !d.cmd.contains(" HB")){ continue; } diff --git a/varicode.cpp b/varicode.cpp index 495bc63..f7afebc 100644 --- a/varicode.cpp +++ b/varicode.cpp @@ -54,7 +54,7 @@ QMap directed_cmds = { {" QTC?", 2 }, // query station message {"&", 2 }, // compat - //{"$", 3 }, // query station(s) heard + //{"$", 3 }, // unused {" GRID?", 4 }, // query grid {"^", 4 }, // compat @@ -64,17 +64,18 @@ QMap directed_cmds = { {" STATUS?", 6 }, // query idle message {"*", 6 }, // compat - //{"!", 7 }, // alert message + //{"!", 7 }, // unused {"#", 8 }, // all or nothing message {" TU", 9 }, // thank you - {" ACTIVE", 10 }, // i have been active in the past 10 minutes - {" INACTIVE", 11 }, // i have not been active in the past 10 minutes + {" ACTIVE", 10 }, // i am active + {" IDLE", 11 }, // i am idle - //{" HEARTBEAT", -1 }, // this is my ping (unused except for faux processing of pings as directed commands) - //{" HEARTBEAT ACK", 12 }, // i acknowledge your ping at this SNR + {" HB", -1 }, // this is my heartbeat (unused except for faux processing of HBs as directed commands) + + //{"", 12 }, // unused {" QUERY", 13 }, // can you transmit a ping to callsign? @@ -115,7 +116,7 @@ QMap checksum_cmds = { }; QString callsign_pattern = QString("(?[@]?[A-Z0-9/]+)"); -QString optional_cmd_pattern = QString("(?\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|QRZ[?]|SNR[?]|QTC[?]|QTH[?]|GRID[?]|STATUS[?]|(?:(?:QUERY|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|QTC|GRID|INACTIVE|ACTIVE|TU)(?=[ ]|$))|[?*^&@#> ]))?"); +QString optional_cmd_pattern = QString("(?\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|QRZ[?]|SNR[?]|QTC[?]|QTH[?]|GRID[?]|STATUS[?]|(?:(?:QUERY|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|QTC|GRID|ACTIVE|IDLE|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]))?"); @@ -125,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}|ACTIVE)(?:\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 (ACTIVE|IDLE))(?:\s(?[A-R]{2}[0-9]{2}))?\b)"); QRegularExpression compound_re("^\\s*[`]" + callsign_pattern + @@ -208,8 +209,8 @@ QMap cqs = { }; QMap hbs = { - { 0, "ACTIVE" }, - { 1, "INACTIVE" }, + { 0, "HB ACTIVE" }, + { 1, "HB IDLE" }, }; @@ -1144,7 +1145,8 @@ bool Varicode::isCompoundCallsign(const QString &callsign){ // CQCQCQ EM73 // CQ DX EM73 // CQ QRP EM73 -// ACTIVE EM73 +// HB ACTIVE EM73 +// HB IDLE EM73 QString Varicode::packHeartbeatMessage(QString const &text, const QString &callsign, int *n){ QString frame; @@ -1158,8 +1160,8 @@ QString Varicode::packHeartbeatMessage(QString const &text, const QString &calls // Heartbeat Alt Type // --------------- - // 1 0 ACTIVE - // 1 1 CQCQCQ + // 1 0 HB + // 1 1 CQ auto type = parsedText.captured("type"); auto isAlt = type.startsWith("CQ"); @@ -1174,11 +1176,11 @@ QString Varicode::packHeartbeatMessage(QString const &text, const QString &calls packed_extra = Varicode::packGrid(extra); } - quint8 cqNumber = cqs.key(type, 0); + quint8 cqNumber = hbs.key(type, 0); if(isAlt){ packed_extra |= (1<<15); - cqNumber = hbs.key(type, 0); + cqNumber = cqs.key(type, 0); } frame = packCompoundFrame(callsign, FrameHeartbeat, packed_extra, cqNumber);