diff --git a/mainwindow.cpp b/mainwindow.cpp
index 58e0fa0..a2f1c93 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -2654,7 +2654,6 @@ bool MainWindow::eventFilter (QObject * object, QEvent * event)
// fall through
case QEvent::MouseButtonPress:
// reset the Tx watchdog
- qDebug() << event;
resetIdleTimer();
tx_watchdog (false);
break;
@@ -6269,6 +6268,30 @@ void MainWindow::on_replyMacroButton_clicked(){
if(m_config.transmit_directed()) toggleTx(true);
}
+void MainWindow::on_snrMacroButton_clicked(){
+ QString call = callsignSelected();
+ if(call.isEmpty()){
+ return;
+ }
+
+ auto now = DriftingDateTime::currentDateTimeUtc();
+ int callsignAging = m_config.callsign_aging();
+ if(!m_callActivity.contains(call)){
+ return;
+ }
+
+ auto cd = m_callActivity[call];
+ if (callsignAging && cd.utcTimestamp.secsTo(now) / 60 >= callsignAging) {
+ return;
+ }
+
+ auto snr = Varicode::formatSNR(cd.snr);
+
+ addMessageText(QString("%1 SNR %2").arg(call).arg(snr));
+
+ if(m_config.transmit_directed()) toggleTx(true);
+}
+
void MainWindow::on_qthMacroButton_clicked(){
QString qth = m_config.my_qth();
if(qth.isEmpty()){
@@ -6394,6 +6417,10 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
auto grid = m_config.my_grid();
+ bool emptyQTC = m_config.my_station().isEmpty();
+ bool emptyQTH = m_config.my_qth().isEmpty();
+ bool emptyGrid = m_config.my_grid().isEmpty();
+
auto callAction = menu->addAction(QString("Send a directed message to selected callsign"));
connect(callAction, &QAction::triggered, this, [this](){
@@ -6438,9 +6465,52 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
if(m_config.transmit_directed()) toggleTx(true);
});
+ auto qtcAction = menu->addAction(QString("%1 QTC - Send my station message").arg(call).trimmed());
+ qtcAction->setDisabled(emptyQTC);
+ connect(qtcAction, &QAction::triggered, this, [this](){
+
+ QString selectedCall = callsignSelected();
+ if(selectedCall.isEmpty()){
+ return;
+ }
+
+ addMessageText(QString("%1 QTC %2").arg(selectedCall).arg(m_config.my_station()), true);
+
+ if(m_config.transmit_directed()) toggleTx(true);
+ });
+
+ auto qthAction = menu->addAction(QString("%1 QTH - Send my station location message").arg(call).trimmed());
+ qthAction->setDisabled(emptyQTH);
+ connect(qthAction, &QAction::triggered, this, [this](){
+
+ QString selectedCall = callsignSelected();
+ if(selectedCall.isEmpty()){
+ return;
+ }
+
+ addMessageText(QString("%1 QTH %2").arg(selectedCall).arg(m_config.my_qth()), true);
+
+ if(m_config.transmit_directed()) toggleTx(true);
+ });
+
+
+ auto gridAction = menu->addAction(QString("%1 GRID %2 - Send my current station Maidenhead grid locator").arg(call).arg(grid).trimmed());
+ gridAction->setDisabled(emptyGrid);
+ connect(gridAction, &QAction::triggered, this, [this](){
+
+ QString selectedCall = callsignSelected();
+ if(selectedCall.isEmpty()){
+ return;
+ }
+
+ addMessageText(QString("%1 GRID %2").arg(selectedCall).arg(m_config.my_grid()), true);
+
+ if(m_config.transmit_directed()) toggleTx(true);
+ });
+
menu->addSeparator();
- auto snrQueryAction = menu->addAction(QString("%1? - What is my signal report?").arg(call));
+ auto snrQueryAction = menu->addAction(QString("%1 SNR? - What is my signal report?").arg(call));
snrQueryAction->setDisabled(isAllCall);
connect(snrQueryAction, &QAction::triggered, this, [this](){
@@ -6449,12 +6519,12 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
return;
}
- addMessageText(QString("%1?").arg(selectedCall), true);
+ addMessageText(QString("%1 SNR?").arg(selectedCall), true);
if(m_config.transmit_directed()) toggleTx(true);
});
- auto qthQueryAction = menu->addAction(QString("%1@ - What is your QTH message?").arg(call));
+ auto qthQueryAction = menu->addAction(QString("%1 QTH? - What is your QTH message?").arg(call));
qthQueryAction->setDisabled(isAllCall);
connect(qthQueryAction, &QAction::triggered, this, [this](){
@@ -6463,12 +6533,12 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
return;
}
- addMessageText(QString("%1@").arg(selectedCall), true);
+ addMessageText(QString("%1 QTH?").arg(selectedCall), true);
if(m_config.transmit_directed()) toggleTx(true);
});
- auto gridQueryAction = menu->addAction(QString("%1^ - What is your current grid locator?").arg(call));
+ auto gridQueryAction = menu->addAction(QString("%1 GRID? - What is your current grid locator?").arg(call));
gridQueryAction->setDisabled(isAllCall);
connect(gridQueryAction, &QAction::triggered, this, [this](){
@@ -6477,12 +6547,12 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
return;
}
- addMessageText(QString("%1^").arg(selectedCall), true);
+ addMessageText(QString("%1 GRID?").arg(selectedCall), true);
if(m_config.transmit_directed()) toggleTx(true);
});
- auto stationMessageQueryAction = menu->addAction(QString("%1&& - What is your station message?").arg(call).trimmed());
+ auto stationMessageQueryAction = menu->addAction(QString("%1 QTC? - What is your station message?").arg(call).trimmed());
stationMessageQueryAction->setDisabled(isAllCall);
connect(stationMessageQueryAction, &QAction::triggered, this, [this](){
@@ -6491,12 +6561,12 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
return;
}
- addMessageText(QString("%1&").arg(selectedCall), true);
+ addMessageText(QString("%1 QTC?").arg(selectedCall), true);
if(m_config.transmit_directed()) toggleTx(true);
});
- auto stationIdleQueryAction = menu->addAction(QString("%1* - Is your station active or idle?").arg(call).trimmed());
+ auto stationIdleQueryAction = menu->addAction(QString("%1 STATUS? - Is your station active or idle?").arg(call).trimmed());
stationIdleQueryAction->setDisabled(isAllCall);
connect(stationIdleQueryAction, &QAction::triggered, this, [this](){
@@ -6505,7 +6575,7 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
return;
}
- addMessageText(QString("%1*").arg(selectedCall), true);
+ addMessageText(QString("%1 STATUS?").arg(selectedCall), true);
if(m_config.transmit_directed()) toggleTx(true);
});
@@ -6575,56 +6645,6 @@ void MainWindow::buildQueryMenu(QMenu * menu, QString call){
addMessageText(QString("%1 HEARTBEAT REQ [CALLSIGN]?").arg(selectedCall), true, true);
});
- menu->addSeparator();
-
- bool emptyQTC = m_config.my_station().isEmpty();
- bool emptyQTH = m_config.my_qth().isEmpty();
- bool emptyGrid = m_config.my_grid().isEmpty();
-
- auto qtcAction = menu->addAction(QString("%1 QTC - Send my station message").arg(call).trimmed());
- qtcAction->setDisabled(emptyQTC);
- connect(qtcAction, &QAction::triggered, this, [this](){
-
- QString selectedCall = callsignSelected();
- if(selectedCall.isEmpty()){
- return;
- }
-
- addMessageText(QString("%1 QTC %2").arg(selectedCall).arg(m_config.my_station()), true);
-
- if(m_config.transmit_directed()) toggleTx(true);
- });
-
- auto qthAction = menu->addAction(QString("%1 QTH - Send my station location message").arg(call).trimmed());
- qthAction->setDisabled(emptyQTH);
- connect(qthAction, &QAction::triggered, this, [this](){
-
- QString selectedCall = callsignSelected();
- if(selectedCall.isEmpty()){
- return;
- }
-
- addMessageText(QString("%1 QTH %2").arg(selectedCall).arg(m_config.my_qth()), true);
-
- if(m_config.transmit_directed()) toggleTx(true);
- });
-
-
- auto gridAction = menu->addAction(QString("%1 GRID %2 - Send my current station Maidenhead grid locator").arg(call).arg(grid).trimmed());
- gridAction->setDisabled(emptyGrid);
- connect(gridAction, &QAction::triggered, this, [this](){
-
- QString selectedCall = callsignSelected();
- if(selectedCall.isEmpty()){
- return;
- }
-
- addMessageText(QString("%1 GRID %2").arg(selectedCall).arg(m_config.my_grid()), true);
-
- if(m_config.transmit_directed()) toggleTx(true);
- });
-
-
menu->addSeparator();
auto agnAction = menu->addAction(QString("%1 AGN? - Please repeat your last transmission").arg(call).trimmed());
@@ -7933,6 +7953,7 @@ void MainWindow::updateButtonDisplay(){
ui->cqMacroButton->setDisabled(isTransmitting);
ui->replyMacroButton->setDisabled(isTransmitting || emptyCallsign);
+ ui->snrMacroButton->setDisabled(isTransmitting || emptyCallsign);
ui->qtcMacroButton->setDisabled(isTransmitting || m_config.my_station().isEmpty());
ui->qthMacroButton->setDisabled(isTransmitting || m_config.my_qth().isEmpty());
ui->macrosMacroButton->setDisabled(isTransmitting);
@@ -8627,12 +8648,12 @@ void MainWindow::processCommandActivity() {
int freq = -1;
// QUERIED SNR
- if (d.cmd == "?" && !isAllCall) {
+ if (d.cmd == " SNR?" && !isAllCall) {
reply = QString("%1 SNR %2").arg(d.from).arg(Varicode::formatSNR(d.snr));
}
// QUERIED QTH
- else if (d.cmd == "@" && !isAllCall) {
+ else if (d.cmd == " QTH?" && !isAllCall) {
QString qth = m_config.my_qth();
if (qth.isEmpty()) {
continue;
@@ -8642,7 +8663,7 @@ void MainWindow::processCommandActivity() {
}
// QUERIED ACTIVE
- else if (d.cmd == "*" && !isAllCall) {
+ else if (d.cmd == " STATUS?" && !isAllCall) {
if(m_idleMinutes < 10){
reply = QString("%1 ACTIVE").arg(d.from);
} else {
@@ -8651,7 +8672,7 @@ void MainWindow::processCommandActivity() {
}
// QUERIED GRID
- else if (d.cmd == "^" && !isAllCall) {
+ else if (d.cmd == " GRID?" && !isAllCall) {
QString grid = m_config.my_grid();
if (grid.isEmpty()) {
continue;
@@ -8661,7 +8682,7 @@ void MainWindow::processCommandActivity() {
}
// QUERIED STATION MESSAGE
- else if (d.cmd == "&" && !isAllCall) {
+ else if (d.cmd == " QTC?" && !isAllCall) {
reply = QString("%1 QTC %2").arg(d.from).arg(m_config.my_station());
}
diff --git a/mainwindow.h b/mainwindow.h
index a597496..419c2bc 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -267,6 +267,7 @@ private slots:
void on_clearAction_triggered(QObject * sender);
void on_cqMacroButton_clicked();
void on_replyMacroButton_clicked();
+ void on_snrMacroButton_clicked();
void on_qthMacroButton_clicked();
void on_qtcMacroButton_clicked();
void setShowColumn(QString tableKey, QString columnKey, bool value);
diff --git a/mainwindow.ui b/mainwindow.ui
index a6df663..3faaef8 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -1500,6 +1500,22 @@ QTextEdit[transmitting="true"] {
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 40
+ 20
+
+
+
+
-
@@ -1647,6 +1663,22 @@ color:#555;
+ -
+
+
+
+ 0
+ 30
+
+
+
+ <html><head/><body><p>Send an SNR message</p></body></html>
+
+
+ SNR
+
+
+
diff --git a/varicode.cpp b/varicode.cpp
index 71fbf52..9d89e7d 100644
--- a/varicode.cpp
+++ b/varicode.cpp
@@ -44,17 +44,18 @@ QString alphanumeric = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /@"}; // callsign
QMap directed_cmds = {
// any changes here need to be made also in the directed regular xpression for parsing
- {"?", 0 }, // query snr
- {"@", 1 }, // query qth
- {"&", 2 }, // query station message
- //{"$", 3 }, // query station(s) heard
- {"^", 4 }, // query grid
+ {" SNR?", 0 }, // query snr
+ {" QTH?", 1 }, // query qth
+ {" QTC?", 2 }, // query station message
+ {" GRID?", 4 }, // query grid
+ {" STATUS?", 6 }, // query idle message
+
{">", 5 }, // relay message
- {"*", 6 }, // query idle message
- //{"!", 7 }, // alert message
{"#", 8 }, // all or nothing message
- // {"=", 9 }, // unused
+ //{"!", 7 }, // alert message
+ //{"$", 3 }, // query station(s) heard
+ //{"=", 9 }, // unused
{" ACTIVE", 10 }, // i have been active in the past 10 minutes
{" IDLE", 11 }, // i have not been active in the past 10 minutes
@@ -100,7 +101,7 @@ QMap checksum_cmds = {
};
QString callsign_pattern = QString("(?[@]?[A-Z0-9/]+)");
-QString optional_cmd_pattern = QString("(?\\s?(?:HEARTBEAT (ACK|REQ)|AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|QRZ[?]|(?:(?:ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|QTC|GRID|ACTIVE|IDLE)(?=[ ]|$))|[?@&$%#^>* ]))?");
+QString optional_cmd_pattern = QString("(?\\s?(?:HEARTBEAT (ACK|REQ)|AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|QRZ[?]|SNR[?]|QTC[?]|QTH[?]|GRID[?]|STATUS[?]|(?:(?:ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|QTC|GRID|ACTIVE|IDLE)(?=[ ]|$))|[#> ]))?");
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]))?");