From 76dfd50e748a1a60d5d86d46ad426a1f9aad1f97 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Sun, 3 May 2020 22:25:51 -0400 Subject: [PATCH] Added new command HEARTBEAT SNR for sending heartbeat ACKs --- mainwindow.cpp | 12 +++++-- varicode.cpp | 95 ++++++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 53 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index fad642e..4310c4c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -6691,7 +6691,7 @@ int MainWindow::writeMessageTextToUI(QDateTime date, QString text, int freq, boo // fixup duplicate acks auto tc = c.document()->find(text); - if(!tc.isNull() && tc.selectedText() == text && text.contains(" ACK ")){ + if(!tc.isNull() && tc.selectedText() == text && (text.contains(" ACK ") || text.contains(" HEARTBEAT SNR "))){ tc.select(QTextCursor::BlockUnderCursor); if(tc.selectedText().trimmed().startsWith(date.time().toString())){ @@ -8378,7 +8378,7 @@ void MainWindow::sendHeartbeatAck(QString to, int snr, QString extra){ QString("%1 SNR %2 %3").arg(to).arg(Varicode::formatSNR(snr)).arg(extra).trimmed() : QString("%1 ACK %2").arg(to).arg(extra).trimmed(); #else - auto message = QString("%1 SNR %2 %3").arg(to).arg(Varicode::formatSNR(snr)).arg(extra).trimmed(); + auto message = QString("%1 HEARTBEAT SNR %2 %3").arg(to).arg(Varicode::formatSNR(snr)).arg(extra).trimmed(); #endif auto f = m_config.heartbeat_anywhere() ? -1 : findFreeFreqOffset(500, 1000, 50); @@ -11504,6 +11504,12 @@ void MainWindow::processCommandActivity() { continue; } + // PROCESS HEARTBEAT SNR + else if (d.cmd == " HEARTBEAT SNR"){ + qDebug() << "skipping incoming hb snr" << d.text; + continue; + } + // PROCESS CQ else if (d.cmd == " CQ"){ qDebug() << "skipping incoming cq" << d.text; @@ -12174,7 +12180,7 @@ void MainWindow::displayBandActivity() { // hide heartbeat items if (!ui->actionShow_Band_Heartbeats_and_ACKs->isChecked()){ // hide heartbeats and acks if we have heartbeating hidden - if(item.text.contains(" @HB ") || item.text.contains(" HEARTBEAT ") || item.text.contains(" ACK ")){ + if(item.text.contains(" @HB ") || item.text.contains(" HEARTBEAT ")){ shouldDisplay = false; // hide the previous item if this it shouldn't be displayed either... diff --git a/varicode.cpp b/varicode.cpp index aa2b52c..3ba512b 100644 --- a/varicode.cpp +++ b/varicode.cpp @@ -45,66 +45,68 @@ QString alphanumeric = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /@"}; // callsign QMap directed_cmds = { // any changes here need to be made also in the directed regular xpression for parsing // ?*^&@ - {" HEARTBEAT", -1 }, // this is my heartbeat (unused except for faux processing of HBs as directed commands) - {" HB", -1 }, // this is my heartbeat (unused except for faux processing of HBs as directed commands) - {" CQ", -1 }, // this is my cq (unused except for faux processing of CQs as directed commands) + {" HEARTBEAT", -1 }, // this is my heartbeat (unused except for faux processing of HBs as directed commands) + {" HB", -1 }, // this is my heartbeat (unused except for faux processing of HBs as directed commands) + {" CQ", -1 }, // this is my cq (unused except for faux processing of CQs as directed commands) - {" SNR?", 0 }, // query snr - {"?", 0 }, // compat + {" SNR?", 0 }, // query snr + {"?", 0 }, // compat - {" DIT DIT", 1 }, // two bits + {" DIT DIT", 1 }, // two bits - {" HEARING?", 3 }, // query station calls heard + {" HEARING?", 3 }, // query station calls heard - {" GRID?", 4 }, // query grid + {" GRID?", 4 }, // query grid - {">", 5 }, // relay message + {">", 5 }, // relay message - {" STATUS?", 6 }, // query idle message + {" STATUS?", 6 }, // query idle message - {" STATUS", 7 }, // this is my status + {" STATUS", 7 }, // this is my status - {" HEARING", 8 }, // these are the stations i'm hearing + {" HEARING", 8 }, // these are the stations i'm hearing - {" MSG", 9 }, // this is a complete message + {" MSG", 9 }, // this is a complete message - {" MSG TO:", 10 }, // store message at a station + {" MSG TO:", 10 }, // store message at a station - {" QUERY", 11 }, // generic query + {" QUERY", 11 }, // generic query - {" QUERY MSGS", 12 }, // do you have any stored messages? - {" QUERY MSGS?", 12 }, // do you have any stored messages? + {" QUERY MSGS", 12 }, // do you have any stored messages? + {" QUERY MSGS?", 12 }, // do you have any stored messages? - {" QUERY CALL", 13 }, // can you transmit a ping to callsign? + {" QUERY CALL", 13 }, // can you transmit a ping to callsign? - // {" ", 14 }, // reserved + // {" ", 14 }, // reserved - {" GRID", 15 }, // this is my current grid locator + {" GRID", 15 }, // this is my current grid locator - {" INFO?", 16 }, // what is your info message? - {" INFO", 17 }, // this is my info message + {" INFO?", 16 }, // what is your info message? + {" INFO", 17 }, // this is my info message - {" FB", 18 }, // fine business - {" HW CPY?", 19 }, // how do you copy? - {" SK", 20 }, // end of contact - {" RR", 21 }, // roger roger + {" FB", 18 }, // fine business + {" HW CPY?", 19 }, // how do you copy? + {" SK", 20 }, // end of contact + {" RR", 21 }, // roger roger - {" QSL?", 22 }, // do you copy? - {" QSL", 23 }, // i copy + {" QSL?", 22 }, // do you copy? + {" QSL", 23 }, // i copy - {" CMD", 24 }, // command + {" CMD", 24 }, // command - {" SNR", 25 }, // seen a station at the provided snr - {" NO", 26 }, // negative confirm - {" YES", 27 }, // confirm - {" 73", 28 }, // best regards, end of contact + {" SNR", 25 }, // seen a station at the provided snr + {" NO", 26 }, // negative confirm + {" YES", 27 }, // confirm + {" 73", 28 }, // best regards, end of contact - {" NACK", 2 }, // negative acknowledge - {" ACK", 29 }, // acknowledge (digits deprecated in 2.2) + {" NACK", 2 }, // negative acknowledge + {" ACK", 14 }, // acknowledge (was reserved in 2.1) - {" AGN?", 30 }, // repeat message - {" ", 31 }, // send freetext (weird artifact) - {" ", 31 }, // send freetext + {" HEARTBEAT SNR", 29 }, // (was ACK in 2.1, now deprecated) + + {" AGN?", 30 }, // repeat message + {" ", 31 }, // send freetext (weird artifact) + {" ", 31 }, // send freetext }; // commands allowed to be processed @@ -117,7 +119,7 @@ QSet autoreply_cmds = {0, 3, 4, 6, 9, 10, 11, 12, 13, 16, 30}; QSet buffered_cmds = {5, 9, 10, 11, 12, 13, 15, 24}; // commands that may include an SNR value -QSet snr_cmds = {25}; +QSet snr_cmds = {25, 29}; // commands that are checksummed and their crc size QMap checksum_cmds = { @@ -132,7 +134,7 @@ QMap checksum_cmds = { }; QString callsign_pattern = QString("(?[@]?[A-Z0-9/]+)"); -QString optional_cmd_pattern = QString("(?\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|NACK|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|INFO|GRID|DIT DIT)(?=[ ]|$))|[?> ]))?"); +QString optional_cmd_pattern = QString("(?\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|NACK|ACK|73|YES|NO|HEARTBEAT SNR|SNR|QSL|RR|SK|FB|INFO|GRID|DIT DIT)(?=[ ]|$))|[?> ]))?"); 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)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?"); @@ -142,7 +144,7 @@ QRegularExpression directed_re("^" + optional_cmd_pattern + optional_num_pattern); -QRegularExpression heartbeat_re(R"(^\s*(?[@](?:ALLCALL|HB)\s+)?(?CQ CQ CQ|CQ DX|CQ QRP|CQ CONTEST|CQ FIELD|CQ FD|CQ CQ|CQ|HB|HEARTBEAT)(?:\s(?[A-R]{2}[0-9]{2}))?\b)"); +QRegularExpression heartbeat_re(R"(^\s*(?[@](?:ALLCALL|HB)\s+)?(?CQ CQ CQ|CQ DX|CQ QRP|CQ CONTEST|CQ FIELD|CQ FD|CQ CQ|CQ|HB|HEARTBEAT(?!\s+SNR))(?:\s(?[A-R]{2}[0-9]{2}))?\b)"); QRegularExpression compound_re("^\\s*[`]" + callsign_pattern + @@ -1168,7 +1170,7 @@ quint8 Varicode::packCmd(quint8 cmd, quint8 num, bool *pPackedNum){ // [1][X][6] // X = 0 == SNR // X = 1 == DEADBEEF - value = ((1 << 1) | (int)(cmdStr == " DEADBEEF")) << 6; + value = ((1 << 1) | (int)(cmdStr == " HEARTBEAT SNR")) << 6; value = value + (num & ((1<<6)-1)); if(pPackedNum) *pPackedNum = true; } else { @@ -1190,8 +1192,7 @@ quint8 Varicode::unpackCmd(quint8 value, quint8 *pNum){ // so we zero them out when unpacking so we don't display them even if // they were encoded that way. if(value & (1<<6)){ - if(pNum) *pNum = 0; - cmd = directed_cmds[" ACK"]; + cmd = directed_cmds[" HEARTBEAT SNR"]; } return cmd; } else { @@ -1658,12 +1659,6 @@ QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){ unpacked.append(to); unpacked.append(cmd); - // this is a temporary HACK for ACKs - ack digits were deprecated in 2.2 (for reasons) - // this will prevent displaying the digits even when transmitted by a pre 2.2 station - if(cmd == " ACK"){ - extra = 0; - } - if(extra != 0){ if(Varicode::isSNRCommand(cmd)){ unpacked.append(Varicode::formatSNR((int)extra-31));