Updated display of command and rx activity
This commit is contained in:
parent
a08858a3f1
commit
fed71cb75c
183
mainwindow.cpp
183
mainwindow.cpp
@ -3208,9 +3208,12 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
decodedtext.bits() == Varicode::FT8CallLast
|
decodedtext.bits() == Varicode::FT8CallLast
|
||||||
);
|
);
|
||||||
|
|
||||||
|
qDebug() << "frame valid?" << bValidFrame;
|
||||||
|
qDebug() << "decoded text" << decodedtext.message();
|
||||||
|
|
||||||
//Left (Band activity) window
|
//Left (Band activity) window
|
||||||
if(!bAvgMsg && bValidFrame) {
|
if(!bAvgMsg && bValidFrame) {
|
||||||
if(m_mode=="FT8" and m_config.bFox()) {
|
if(m_mode=="FT8"){
|
||||||
// Parse General Activity
|
// Parse General Activity
|
||||||
#if 1
|
#if 1
|
||||||
bool shouldParseGeneralActivity = true;
|
bool shouldParseGeneralActivity = true;
|
||||||
@ -3300,6 +3303,7 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
d.snr = decodedtext.snr();
|
d.snr = decodedtext.snr();
|
||||||
d.utcTimestamp = QDateTime::currentDateTimeUtc();
|
d.utcTimestamp = QDateTime::currentDateTimeUtc();
|
||||||
d.bits = decodedtext.bits();
|
d.bits = decodedtext.bits();
|
||||||
|
d.extra = parts.length() > 2 ? parts.mid(3).join(" ") : "";
|
||||||
|
|
||||||
// if the command is a buffered command OR we have from or to in a separate message (compound)
|
// if the command is a buffered command OR we have from or to in a separate message (compound)
|
||||||
if(Varicode::isCommandBuffered(d.cmd) || d.from == "<....>" || d.to == "<....>"){
|
if(Varicode::isCommandBuffered(d.cmd) || d.from == "<....>" || d.to == "<....>"){
|
||||||
@ -4302,25 +4306,25 @@ void MainWindow::guiUpdate()
|
|||||||
m_sec0=nsec;
|
m_sec0=nsec;
|
||||||
|
|
||||||
// once per period
|
// once per period
|
||||||
if(m_sec0 % m_TRperiod == 0 || (m_sec0 % (m_TRperiod/2)) == 0){
|
bool forceDirty = false;
|
||||||
// force rx dirty at least twice per period
|
if(m_sec0 % (m_TRperiod/3) == 0){
|
||||||
m_rxDirty = true;
|
// force rx dirty three times per period
|
||||||
m_rxDisplayDirty = true;
|
forceDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// once pre second...
|
// once per second...
|
||||||
|
|
||||||
// update the dial frequency once per second..
|
// update the dial frequency once per second..
|
||||||
displayDialFrequency();
|
displayDialFrequency();
|
||||||
|
|
||||||
// process all received activity...
|
// process all received activity...
|
||||||
processActivity();
|
processActivity(forceDirty);
|
||||||
|
|
||||||
// process outgoing tx queue...
|
// process outgoing tx queue...
|
||||||
processTxQueue();
|
processTxQueue();
|
||||||
|
|
||||||
// once processed, lets update the display...
|
// once processed, lets update the display...
|
||||||
displayActivity();
|
displayActivity(forceDirty);
|
||||||
}
|
}
|
||||||
|
|
||||||
// once per 100ms
|
// once per 100ms
|
||||||
@ -5530,24 +5534,27 @@ void MainWindow::clearActivity(){
|
|||||||
update_dynamic_property(ui->extFreeTextMsgEdit, "transmitting", false);
|
update_dynamic_property(ui->extFreeTextMsgEdit, "transmitting", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int MainWindow::logRxTxMessageText(QDateTime date, QString text, int freq, bool tx, int block){
|
void MainWindow::displayTextForFreq(QString text, int freq, QDateTime date, bool bold, bool newLine, bool clearLine){
|
||||||
|
int block = m_rxFrameBlockNumbers.contains(freq) ? m_rxFrameBlockNumbers[freq] : -1;
|
||||||
|
if(clearLine && block != -1){
|
||||||
|
auto c = ui->textEditRX->textCursor();
|
||||||
|
QTextBlock b = c.document()->findBlockByNumber(block);
|
||||||
|
c.setPosition(b.position());
|
||||||
|
c.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
|
||||||
|
c.deleteChar();
|
||||||
|
c.deleteChar();
|
||||||
|
block = -1;
|
||||||
|
}
|
||||||
|
if(newLine){
|
||||||
|
block = -1;
|
||||||
|
}
|
||||||
|
m_rxFrameBlockNumbers[freq] = writeMessageTextToUI(date, text, freq, bold, block);
|
||||||
|
}
|
||||||
|
|
||||||
|
int MainWindow::writeMessageTextToUI(QDateTime date, QString text, int freq, bool bold, int block){
|
||||||
auto c = ui->textEditRX->textCursor();
|
auto c = ui->textEditRX->textCursor();
|
||||||
|
|
||||||
#if ALIAS_COMPOUND_CALLS
|
// find an existing block (
|
||||||
// fixup compound callsigns cache / aliases...
|
|
||||||
// ensure our callsign is cached...
|
|
||||||
QString myCall = m_config.my_callsign();
|
|
||||||
QString baseCall = Radio::base_callsign(myCall);
|
|
||||||
if(myCall != baseCall && !m_compoundCallCache.contains(baseCall)){
|
|
||||||
m_compoundCallCache[baseCall] = myCall;
|
|
||||||
}
|
|
||||||
// then, replace the cached calls that we see...
|
|
||||||
foreach(auto call, m_compoundCallCache.keys()){
|
|
||||||
QRegularExpression re(QString(R"((?<![\/])\b%1\b(?![\/]))").arg(QRegularExpression::escape(call)));
|
|
||||||
text = text.replace(re, m_compoundCallCache[call]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
if(block != -1){
|
if(block != -1){
|
||||||
QTextBlock b = c.document()->findBlockByNumber(block);
|
QTextBlock b = c.document()->findBlockByNumber(block);
|
||||||
@ -5556,22 +5563,25 @@ int MainWindow::logRxTxMessageText(QDateTime date, QString text, int freq, bool
|
|||||||
found = true;
|
found = true;
|
||||||
} else {
|
} else {
|
||||||
c.movePosition(QTextCursor::End);
|
c.movePosition(QTextCursor::End);
|
||||||
|
if(c.block().length() > 1){
|
||||||
c.insertBlock();
|
c.insertBlock();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(found && !tx){
|
if(found && !bold){
|
||||||
c.clearSelection();
|
c.clearSelection();
|
||||||
c.insertText(text);
|
c.insertText(text);
|
||||||
} else {
|
} else {
|
||||||
text = text.toHtmlEscaped();
|
text = text.toHtmlEscaped();
|
||||||
if(tx){
|
if(bold){
|
||||||
text = QString("<strong>%1</strong>").arg(text);
|
text = QString("<strong>%1</strong>").arg(text);
|
||||||
m_rxFrameBlockNumbers.clear();
|
|
||||||
}
|
}
|
||||||
c.insertHtml(QString("<strong>%1 - (%2)</strong> - %3").arg(date.time().toString()).arg(freq).arg(text));
|
c.insertHtml(QString("<strong>%1 - (%2)</strong> - %3").arg(date.time().toString()).arg(freq).arg(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
c.movePosition(QTextCursor::End);
|
c.movePosition(QTextCursor::End);
|
||||||
|
|
||||||
|
|
||||||
ui->textEditRX->ensureCursorVisible();
|
ui->textEditRX->ensureCursorVisible();
|
||||||
ui->textEditRX->verticalScrollBar()->setValue(ui->textEditRX->verticalScrollBar()->maximum());
|
ui->textEditRX->verticalScrollBar()->setValue(ui->textEditRX->verticalScrollBar()->maximum());
|
||||||
|
|
||||||
@ -5648,7 +5658,8 @@ void MainWindow::createMessageTransmitQueue(QString const& text){
|
|||||||
lines.append(dt.message());
|
lines.append(dt.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
logRxTxMessageText(QDateTime::currentDateTimeUtc(), lines.join(""), freq, true);
|
//logMessageText(QDateTime::currentDateTimeUtc(), lines.join(""), freq, true);
|
||||||
|
displayTextForFreq(lines.join(""), freq, QDateTime::currentDateTimeUtc(), true, true, false);
|
||||||
|
|
||||||
// keep track of the last message text sent
|
// keep track of the last message text sent
|
||||||
m_lastTxMessage = text;
|
m_lastTxMessage = text;
|
||||||
@ -7203,9 +7214,12 @@ void MainWindow::on_tableWidgetRXAll_cellDoubleClicked(int row, int col){
|
|||||||
activityText.append(d.text);
|
activityText.append(d.text);
|
||||||
}
|
}
|
||||||
if(!activityText.isEmpty()){
|
if(!activityText.isEmpty()){
|
||||||
int block = logRxTxMessageText(firstActivity, activityText, offset, false);
|
//int block = logMessageText(firstActivity, activityText, offset, false);
|
||||||
m_rxFrameBlockNumbers[offset/10*10] = block;
|
|
||||||
m_rxRecentCache.insert(offset/10*10, new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
displayTextForFreq(activityText, offset, firstActivity, false, true, false);
|
||||||
|
|
||||||
|
// TODO: jsherer - evaluate recency cache...
|
||||||
|
// m_rxRecentCache.insert(offset/10*10, new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -8216,6 +8230,10 @@ bool MainWindow::isDirectedOffset(int offset){
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::markOffsetDirected(int offset){
|
||||||
|
m_rxDirectedCache.insert(offset/10*10, new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
||||||
|
}
|
||||||
|
|
||||||
bool MainWindow::isMyCallIncluded(const QString &text){
|
bool MainWindow::isMyCallIncluded(const QString &text){
|
||||||
QString myCall = Radio::base_callsign(m_config.my_callsign());
|
QString myCall = Radio::base_callsign(m_config.my_callsign());
|
||||||
|
|
||||||
@ -8271,6 +8289,12 @@ void MainWindow::processRxActivity() {
|
|||||||
|
|
||||||
bool shouldDisplay = abs(freq - currentFreq()) <= 10;
|
bool shouldDisplay = abs(freq - currentFreq()) <= 10;
|
||||||
|
|
||||||
|
// if this is a (recent) directed offset, bump the cache, and display...
|
||||||
|
// this will allow a directed free text command followed by non-buffered data frames.
|
||||||
|
if(isDirectedOffset(freq)){
|
||||||
|
markOffsetDirected(freq);
|
||||||
|
shouldDisplay = true;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: jsherer - develop a better way to determine if we can display this band activity...
|
// TODO: jsherer - develop a better way to determine if we can display this band activity...
|
||||||
#if 0
|
#if 0
|
||||||
@ -8285,6 +8309,8 @@ void MainWindow::processRxActivity() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(!shouldDisplay){
|
if(!shouldDisplay){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -8297,12 +8323,15 @@ void MainWindow::processRxActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// log it to the display!
|
// log it to the display!
|
||||||
int block = m_rxFrameBlockNumbers.contains(freq) ? m_rxFrameBlockNumbers[freq] : -1;
|
// int block = m_rxFrameBlockNumbers.contains(freq) ? m_rxFrameBlockNumbers[freq] : -1;
|
||||||
m_rxFrameBlockNumbers[freq] = logRxTxMessageText(d.utcTimestamp, d.text, d.freq, false, block);
|
// m_rxFrameBlockNumbers[freq] = logMessageText(d.utcTimestamp, d.text, d.freq, false, block);
|
||||||
if (isLast) {
|
// if (isLast) {
|
||||||
m_rxFrameBlockNumbers.remove(freq);
|
// m_rxFrameBlockNumbers.remove(freq);
|
||||||
}
|
// }
|
||||||
m_rxRecentCache.insert(freq, new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
// m_rxRecentCache.insert(freq, new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
||||||
|
|
||||||
|
displayTextForFreq(d.text, d.freq, d.utcTimestamp, false, false, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8401,7 +8430,7 @@ void MainWindow::processBufferedActivity() {
|
|||||||
|
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
|
|
||||||
bool shouldUseLargeChecksum = false;
|
bool shouldUseLargeChecksum = true;
|
||||||
if(shouldUseLargeChecksum && buffer.cmd.cmd == "#"){
|
if(shouldUseLargeChecksum && buffer.cmd.cmd == "#"){
|
||||||
checksum = message.right(6);
|
checksum = message.right(6);
|
||||||
message = message.left(message.length() - 7);
|
message = message.left(message.length() - 7);
|
||||||
@ -8413,6 +8442,7 @@ void MainWindow::processBufferedActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
|
buffer.cmd.bits = Varicode::FT8CallLast;
|
||||||
buffer.cmd.text = message;
|
buffer.cmd.text = message;
|
||||||
buffer.cmd.isBuffered = true;
|
buffer.cmd.isBuffered = true;
|
||||||
m_rxCommandQueue.append(buffer.cmd);
|
m_rxCommandQueue.append(buffer.cmd);
|
||||||
@ -8444,7 +8474,7 @@ void MainWindow::processCommandActivity() {
|
|||||||
int f = currentFreq();
|
int f = currentFreq();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO: jsherer - should we, if we have _any_ directed messages, pause the beacon??
|
// TODO: jsherer - should we, if we have _any_ directed messages, pause the beacon or maybe just bump it?
|
||||||
// pauseBacon();
|
// pauseBacon();
|
||||||
|
|
||||||
while (!m_rxCommandQueue.isEmpty()) {
|
while (!m_rxCommandQueue.isEmpty()) {
|
||||||
@ -8469,26 +8499,15 @@ void MainWindow::processCommandActivity() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
// if this is an allcall, check to make sure we haven't replied to their allcall recently (in the past beacon interval)
|
||||||
// TODO: jsherer - check to make sure we haven't replied to their allcall recently (in the past beacon interval)
|
// that way we never get spammed by allcalls at a high frequency than what we would beacon
|
||||||
if (isAllCall && m_txAllcallCommandCache.contains(Radio::base_callsign(d.from)) && m_txAllcallCommandCache[Radio::base_callsign(d.from)]->secsTo(QDateTime::currentDateTimeUtc()) / 60 < m_config.beacon()) {
|
if (isAllCall){
|
||||||
|
if(m_txAllcallCommandCache.contains(d.from) && m_txAllcallCommandCache[d.from]->secsTo(QDateTime::currentDateTimeUtc()) / 60 < m_config.beacon()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
m_txAllcallCommandCache.insert(d.from, new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
||||||
if(d.isCompound){
|
|
||||||
// this is a command with a compound call... we need to log it to the rx activity!
|
|
||||||
ActivityDetail ad;
|
|
||||||
ad.bits = d.bits;
|
|
||||||
ad.freq = d.freq;
|
|
||||||
ad.isDirected = true;
|
|
||||||
ad.snr = d.snr;
|
|
||||||
ad.text = QString("%1: %2%3 %4 %5 ").arg(d.from).arg(d.to).arg(d.cmd).arg(d.grid).arg(d.text);
|
|
||||||
ad.utcTimestamp = d.utcTimestamp;
|
|
||||||
m_bandActivity[d.freq].append(ad);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// log call activity...
|
// log call activity...
|
||||||
CallDetail cd;
|
CallDetail cd;
|
||||||
@ -8500,6 +8519,37 @@ void MainWindow::processCommandActivity() {
|
|||||||
cd.utcTimestamp = d.utcTimestamp;
|
cd.utcTimestamp = d.utcTimestamp;
|
||||||
logCallActivity(cd, true);
|
logCallActivity(cd, true);
|
||||||
|
|
||||||
|
// display the command activity
|
||||||
|
ActivityDetail ad;
|
||||||
|
ad.isLowConfidence = false;
|
||||||
|
ad.isFree = true;
|
||||||
|
ad.isDirected = true;
|
||||||
|
ad.bits = d.bits;
|
||||||
|
ad.freq = d.freq;
|
||||||
|
ad.snr = d.snr;
|
||||||
|
ad.text = QString("%1: %2%3 ").arg(d.from).arg(d.to).arg(d.cmd);
|
||||||
|
if(!d.grid.isEmpty()){
|
||||||
|
ad.text += d.grid;
|
||||||
|
}
|
||||||
|
if(!d.extra.isEmpty()){
|
||||||
|
ad.text += d.extra;
|
||||||
|
}
|
||||||
|
if(!d.text.isEmpty()){
|
||||||
|
ad.text += d.text;
|
||||||
|
}
|
||||||
|
bool isLast = ad.bits == Varicode::FT8CallLast;
|
||||||
|
if (isLast) {
|
||||||
|
// can also use \u0004 \u2666 \u2404
|
||||||
|
ad.text += QString(" \u2301 ");
|
||||||
|
}
|
||||||
|
ad.utcTimestamp = d.utcTimestamp;
|
||||||
|
|
||||||
|
// log it to the display!
|
||||||
|
displayTextForFreq(ad.text, ad.freq, ad.utcTimestamp, false, true, true);
|
||||||
|
|
||||||
|
// and mark the offset as a directed offset so future free text is displayed
|
||||||
|
markOffsetDirected(ad.freq);
|
||||||
|
|
||||||
// construct a reply, if needed
|
// construct a reply, if needed
|
||||||
QString reply;
|
QString reply;
|
||||||
|
|
||||||
@ -8588,7 +8638,7 @@ void MainWindow::processCommandActivity() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
enqueueMessage(PriorityNormal, QString("%1 ACK").arg(d.from), d.freq, nullptr);
|
enqueueMessage(PriorityHigh, QString("%1 ACK").arg(d.from), d.freq, nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
msgBox->show();
|
msgBox->show();
|
||||||
@ -8604,22 +8654,6 @@ void MainWindow::processCommandActivity() {
|
|||||||
|
|
||||||
// queue the reply here to be sent when a free interval is available
|
// queue the reply here to be sent when a free interval is available
|
||||||
enqueueMessage(PriorityNormal, reply, d.freq, nullptr);
|
enqueueMessage(PriorityNormal, reply, d.freq, nullptr);
|
||||||
|
|
||||||
#if 0
|
|
||||||
addMessageText(reply);
|
|
||||||
|
|
||||||
// use the last frequency
|
|
||||||
f = d.freq;
|
|
||||||
|
|
||||||
// if we're responding via allcall, pick a different frequency and mark it in the cache.
|
|
||||||
if (isAllCallIncluded(d.to)) {
|
|
||||||
f = findFreeFreqOffset(qMax(0, f - 100), qMin(f + 100, 2500), 50);
|
|
||||||
m_txAllcallCommandCache.insert(Radio::base_callsign(d.from), new QDateTime(QDateTime::currentDateTimeUtc()), 25);
|
|
||||||
}
|
|
||||||
|
|
||||||
processed = true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8694,7 +8728,10 @@ void MainWindow::processTxQueue(){
|
|||||||
addMessageText(message.message, true);
|
addMessageText(message.message, true);
|
||||||
|
|
||||||
// check to see if we have autoreply enabled...(or if this is a beacon and the beacon button is enabled)
|
// check to see if we have autoreply enabled...(or if this is a beacon and the beacon button is enabled)
|
||||||
if(ui->autoReplyButton->isChecked() || (ui->beaconButton->isChecked() && message.message.contains("BEACON"))){
|
if(message.priority >= PriorityHigh ||
|
||||||
|
(ui->autoReplyButton->isChecked()) ||
|
||||||
|
(ui->beaconButton->isChecked() && message.message.contains("BEACON"))
|
||||||
|
){
|
||||||
// then try to set the frequency...
|
// then try to set the frequency...
|
||||||
setFreqForRestore(f, true);
|
setFreqForRestore(f, true);
|
||||||
|
|
||||||
|
@ -131,7 +131,8 @@ public slots:
|
|||||||
void logCallActivity(CallDetail d, bool spot=true);
|
void logCallActivity(CallDetail d, bool spot=true);
|
||||||
QString lookupCallInCompoundCache(QString const &call);
|
QString lookupCallInCompoundCache(QString const &call);
|
||||||
void clearActivity();
|
void clearActivity();
|
||||||
int logRxTxMessageText(QDateTime date, QString text, int freq, bool tx, int block=-1);
|
void displayTextForFreq(QString text, int freq, QDateTime date, bool bold, bool newLine, bool clearLine);
|
||||||
|
int writeMessageTextToUI(QDateTime date, QString text, int freq, bool bold, int block=-1);
|
||||||
void addMessageText(QString text, bool clear=false);
|
void addMessageText(QString text, bool clear=false);
|
||||||
void enqueueMessage(int priority, QString message, int freq, Callback c);
|
void enqueueMessage(int priority, QString message, int freq, Callback c);
|
||||||
void resetMessage();
|
void resetMessage();
|
||||||
@ -661,6 +662,7 @@ private:
|
|||||||
int bits;
|
int bits;
|
||||||
QString grid;
|
QString grid;
|
||||||
QString text;
|
QString text;
|
||||||
|
QString extra;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ActivityDetail
|
struct ActivityDetail
|
||||||
@ -819,6 +821,7 @@ private:
|
|||||||
QString callsignSelected();
|
QString callsignSelected();
|
||||||
bool isRecentOffset(int offset);
|
bool isRecentOffset(int offset);
|
||||||
bool isDirectedOffset(int offset);
|
bool isDirectedOffset(int offset);
|
||||||
|
void markOffsetDirected(int offset);
|
||||||
void processActivity(bool force=false);
|
void processActivity(bool force=false);
|
||||||
void processRxActivity();
|
void processRxActivity();
|
||||||
void processCompoundActivity();
|
void processCompoundActivity();
|
||||||
|
Loading…
Reference in New Issue
Block a user