Updated frequency dial to be propagated on RX
This commit is contained in:
parent
39aafa6f5e
commit
fec7e07d7d
@ -69,7 +69,7 @@ void SpotClient::enqueueLocalSpot(QString callsign, QString grid, QString info,
|
|||||||
m_queue.enqueue(m.toJson());
|
m_queue.enqueue(m.toJson());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpotClient::enqueueSpot(QString callsign, QString grid, int submode, int frequency, int snr){
|
void SpotClient::enqueueSpot(QString callsign, QString grid, int submode, int dial, int offset, int snr){
|
||||||
auto m = Message("RX.SPOT", "", {
|
auto m = Message("RX.SPOT", "", {
|
||||||
{"BY", QVariant(QMap<QString, QVariant>{
|
{"BY", QVariant(QMap<QString, QVariant>{
|
||||||
{"CALLSIGN", QVariant(m_call)},
|
{"CALLSIGN", QVariant(m_call)},
|
||||||
@ -77,7 +77,9 @@ void SpotClient::enqueueSpot(QString callsign, QString grid, int submode, int fr
|
|||||||
})},
|
})},
|
||||||
{"CALLSIGN", QVariant(callsign)},
|
{"CALLSIGN", QVariant(callsign)},
|
||||||
{"GRID", QVariant(grid)},
|
{"GRID", QVariant(grid)},
|
||||||
{"FREQ", QVariant(frequency)},
|
{"FREQ", QVariant(dial+offset)},
|
||||||
|
{"DIAL", QVariant(dial)},
|
||||||
|
{"OFFSET", QVariant(offset)},
|
||||||
{"SNR", QVariant(snr)},
|
{"SNR", QVariant(snr)},
|
||||||
{"SPEED", QVariant(submode)},
|
{"SPEED", QVariant(submode)},
|
||||||
});
|
});
|
||||||
@ -85,7 +87,7 @@ void SpotClient::enqueueSpot(QString callsign, QString grid, int submode, int fr
|
|||||||
m_queue.enqueue(m.toJson());
|
m_queue.enqueue(m.toJson());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpotClient::enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int submode, int frequency, int snr){
|
void SpotClient::enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int submode, int dial, int offset, int snr){
|
||||||
auto m = Message("RX.DIRECTED", "", {
|
auto m = Message("RX.DIRECTED", "", {
|
||||||
{"BY", QVariant(QMap<QString, QVariant>{
|
{"BY", QVariant(QMap<QString, QVariant>{
|
||||||
{"CALLSIGN", QVariant(m_call)},
|
{"CALLSIGN", QVariant(m_call)},
|
||||||
@ -98,7 +100,9 @@ void SpotClient::enqueueCmd(QString cmd, QString from, QString to, QString relay
|
|||||||
{"TEXT", QVariant(text)},
|
{"TEXT", QVariant(text)},
|
||||||
{"GRID", QVariant(grid)},
|
{"GRID", QVariant(grid)},
|
||||||
{"EXTRA", QVariant(extra)},
|
{"EXTRA", QVariant(extra)},
|
||||||
{"FREQ", QVariant(frequency)},
|
{"FREQ", QVariant(dial+offset)},
|
||||||
|
{"DIAL", QVariant(dial)},
|
||||||
|
{"OFFSET", QVariant(offset)},
|
||||||
{"SNR", QVariant(snr)},
|
{"SNR", QVariant(snr)},
|
||||||
{"SPEED", QVariant(submode)},
|
{"SPEED", QVariant(submode)},
|
||||||
});
|
});
|
||||||
|
@ -17,8 +17,8 @@ public:
|
|||||||
void prepare();
|
void prepare();
|
||||||
void setLocalStation(QString callsign, QString grid, QString info, QString version);
|
void setLocalStation(QString callsign, QString grid, QString info, QString version);
|
||||||
void enqueueLocalSpot(QString callsign, QString grid, QString info, QString version);
|
void enqueueLocalSpot(QString callsign, QString grid, QString info, QString version);
|
||||||
void enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int submode, int frequency, int snr);
|
void enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int submode, int dial, int offset, int snr);
|
||||||
void enqueueSpot(QString callsign, QString grid, int submode, int frequency, int snr);
|
void enqueueSpot(QString callsign, QString grid, int submode, int dial, int offset, int snr);
|
||||||
void sendRawSpot(QByteArray payload);
|
void sendRawSpot(QByteArray payload);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
193
mainwindow.cpp
193
mainwindow.cpp
@ -1452,7 +1452,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
bool missingCallsign = selectedCall.isEmpty();
|
bool missingCallsign = selectedCall.isEmpty();
|
||||||
|
|
||||||
if(!missingCallsign && !isAllCall){
|
if(!missingCallsign && !isAllCall){
|
||||||
int selectedOffset = m_callActivity[selectedCall].freq;
|
int selectedOffset = m_callActivity[selectedCall].offset;
|
||||||
if(selectedOffset != -1){
|
if(selectedOffset != -1){
|
||||||
auto qsyAction = menu->addAction(QString("Jump to %1Hz").arg(selectedOffset));
|
auto qsyAction = menu->addAction(QString("Jump to %1Hz").arg(selectedOffset));
|
||||||
connect(qsyAction, &QAction::triggered, this, [this, selectedOffset](){
|
connect(qsyAction, &QAction::triggered, this, [this, selectedOffset](){
|
||||||
@ -1975,7 +1975,8 @@ void MainWindow::initializeDummyData(){
|
|||||||
CallDetail cd = {};
|
CallDetail cd = {};
|
||||||
cd.call = call;
|
cd.call = call;
|
||||||
cd.through = i == 2 ? "KN4CRD" : "";
|
cd.through = i == 2 ? "KN4CRD" : "";
|
||||||
cd.freq = 500 + 100*i;
|
cd.dial = 7078000;
|
||||||
|
cd.offset = 500 + 100*i;
|
||||||
cd.snr = i == 3 ? -100 : i;
|
cd.snr = i == 3 ? -100 : i;
|
||||||
cd.ackTimestamp = i == 1 ? dt.addSecs(-900) : QDateTime{};
|
cd.ackTimestamp = i == 1 ? dt.addSecs(-900) : QDateTime{};
|
||||||
cd.utcTimestamp = dt;
|
cd.utcTimestamp = dt;
|
||||||
@ -1987,7 +1988,8 @@ void MainWindow::initializeDummyData(){
|
|||||||
ActivityDetail ad = {};
|
ActivityDetail ad = {};
|
||||||
ad.bits = Varicode::JS8CallFirst | Varicode::JS8CallLast;
|
ad.bits = Varicode::JS8CallFirst | Varicode::JS8CallLast;
|
||||||
ad.snr = i == 3 ? -100 : i;
|
ad.snr = i == 3 ? -100 : i;
|
||||||
ad.freq = 500 + 100*i;
|
ad.dial = 7078000;
|
||||||
|
ad.offset = 500 + 100*i;
|
||||||
ad.text = QString("%1: %2 TEST MESSAGE").arg(call).arg(m_config.my_callsign());
|
ad.text = QString("%1: %2 TEST MESSAGE").arg(call).arg(m_config.my_callsign());
|
||||||
ad.utcTimestamp = dt;
|
ad.utcTimestamp = dt;
|
||||||
ad.submode = cd.submode;
|
ad.submode = cd.submode;
|
||||||
@ -2001,7 +2003,8 @@ void MainWindow::initializeDummyData(){
|
|||||||
ActivityDetail adHB1 = {};
|
ActivityDetail adHB1 = {};
|
||||||
adHB1.bits = Varicode::JS8CallFirst;
|
adHB1.bits = Varicode::JS8CallFirst;
|
||||||
adHB1.snr = 0;
|
adHB1.snr = 0;
|
||||||
adHB1.freq = 750;
|
adHB1.dial = 7078000;
|
||||||
|
adHB1.offset = 750;
|
||||||
adHB1.text = QString("KN4CRD: HB AUTO EM73");
|
adHB1.text = QString("KN4CRD: HB AUTO EM73");
|
||||||
adHB1.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
adHB1.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
||||||
adHB1.submode = Varicode::JS8CallNormal;
|
adHB1.submode = Varicode::JS8CallNormal;
|
||||||
@ -2010,7 +2013,8 @@ void MainWindow::initializeDummyData(){
|
|||||||
ActivityDetail adHB2 = {};
|
ActivityDetail adHB2 = {};
|
||||||
adHB2.bits = Varicode::JS8CallLast;
|
adHB2.bits = Varicode::JS8CallLast;
|
||||||
adHB2.snr = 0;
|
adHB2.snr = 0;
|
||||||
adHB2.freq = 750;
|
adHB2.dial = 7078000;
|
||||||
|
adHB2.offset = 750;
|
||||||
adHB2.text = QString(" MSG ID 1");
|
adHB2.text = QString(" MSG ID 1");
|
||||||
adHB2.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
adHB2.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
||||||
adHB2.submode = Varicode::JS8CallNormal;
|
adHB2.submode = Varicode::JS8CallNormal;
|
||||||
@ -2320,7 +2324,8 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue(cd.call.trimmed(), QVariantMap{
|
m_settings->setValue(cd.call.trimmed(), QVariantMap{
|
||||||
{"snr", QVariant(cd.snr)},
|
{"snr", QVariant(cd.snr)},
|
||||||
{"grid", QVariant(cd.grid)},
|
{"grid", QVariant(cd.grid)},
|
||||||
{"freq", QVariant(cd.freq)},
|
{"dial", QVariant(cd.dial)},
|
||||||
|
{"freq", QVariant(cd.offset)},
|
||||||
{"tdrift", QVariant(cd.tdrift)},
|
{"tdrift", QVariant(cd.tdrift)},
|
||||||
#if CACHE_CALL_DATETIME_AS_STRINGS
|
#if CACHE_CALL_DATETIME_AS_STRINGS
|
||||||
{"ackTimestamp", QVariant(cd.ackTimestamp.toString("yyyy-MM-dd hh:mm:ss"))},
|
{"ackTimestamp", QVariant(cd.ackTimestamp.toString("yyyy-MM-dd hh:mm:ss"))},
|
||||||
@ -2495,6 +2500,7 @@ void MainWindow::readSettings()
|
|||||||
|
|
||||||
auto snr = values.value("snr", -64).toInt();
|
auto snr = values.value("snr", -64).toInt();
|
||||||
auto grid = values.value("grid", "").toString();
|
auto grid = values.value("grid", "").toString();
|
||||||
|
auto dial = values.value("dial", 0).toInt();
|
||||||
auto freq = values.value("freq", 0).toInt();
|
auto freq = values.value("freq", 0).toInt();
|
||||||
auto tdrift = values.value("tdrift", 0).toFloat();
|
auto tdrift = values.value("tdrift", 0).toFloat();
|
||||||
|
|
||||||
@ -2517,7 +2523,8 @@ void MainWindow::readSettings()
|
|||||||
cd.call = call;
|
cd.call = call;
|
||||||
cd.snr = snr;
|
cd.snr = snr;
|
||||||
cd.grid = grid;
|
cd.grid = grid;
|
||||||
cd.freq = freq;
|
cd.dial = dial;
|
||||||
|
cd.offset = freq;
|
||||||
cd.tdrift = tdrift;
|
cd.tdrift = tdrift;
|
||||||
cd.ackTimestamp = ackTimestamp;
|
cd.ackTimestamp = ackTimestamp;
|
||||||
cd.utcTimestamp = utcTimestamp;
|
cd.utcTimestamp = utcTimestamp;
|
||||||
@ -3432,6 +3439,7 @@ void MainWindow::updateCurrentBand(){
|
|||||||
sendNetworkMessage("RIG.FREQ", "", {
|
sendNetworkMessage("RIG.FREQ", "", {
|
||||||
{"_ID", QVariant(-1)},
|
{"_ID", QVariant(-1)},
|
||||||
{"BAND", QVariant(band_name)},
|
{"BAND", QVariant(band_name)},
|
||||||
|
{"FREQ", QVariant((quint64)dialFrequency() + currentFreqOffset())},
|
||||||
{"DIAL", QVariant((quint64)dialFrequency())},
|
{"DIAL", QVariant((quint64)dialFrequency())},
|
||||||
{"OFFSET", QVariant((quint64)currentFreqOffset())}
|
{"OFFSET", QVariant((quint64)currentFreqOffset())}
|
||||||
});
|
});
|
||||||
@ -4889,7 +4897,8 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
d.isCompound = decodedtext.isCompound();
|
d.isCompound = decodedtext.isCompound();
|
||||||
d.isDirected = decodedtext.isDirectedMessage();
|
d.isDirected = decodedtext.isDirectedMessage();
|
||||||
d.bits = decodedtext.bits();
|
d.bits = decodedtext.bits();
|
||||||
d.freq = offset;
|
d.dial = dialFrequency();
|
||||||
|
d.offset = offset;
|
||||||
d.text = decodedtext.message();
|
d.text = decodedtext.message();
|
||||||
d.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
d.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
||||||
d.snr = decodedtext.snr();
|
d.snr = decodedtext.snr();
|
||||||
@ -4899,16 +4908,16 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
|
|
||||||
// if we have any "first" frame, and a buffer is already established, clear it...
|
// if we have any "first" frame, and a buffer is already established, clear it...
|
||||||
int prevBufferOffset = -1;
|
int prevBufferOffset = -1;
|
||||||
if(((d.bits & Varicode::JS8CallFirst) == Varicode::JS8CallFirst) && hasExistingMessageBuffer(decodedtext.submode(), d.freq, true, &prevBufferOffset)){
|
if(((d.bits & Varicode::JS8CallFirst) == Varicode::JS8CallFirst) && hasExistingMessageBuffer(decodedtext.submode(), d.offset, true, &prevBufferOffset)){
|
||||||
qDebug() << "first message encountered, clearing existing buffer" << prevBufferOffset;
|
qDebug() << "first message encountered, clearing existing buffer" << prevBufferOffset;
|
||||||
m_messageBuffer.remove(d.freq);
|
m_messageBuffer.remove(d.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we have a data frame, and a message buffer has been established, buffer it...
|
// if we have a data frame, and a message buffer has been established, buffer it...
|
||||||
if(hasExistingMessageBuffer(decodedtext.submode(), d.freq, true, &prevBufferOffset) && !decodedtext.isCompound() && !decodedtext.isDirectedMessage()){
|
if(hasExistingMessageBuffer(decodedtext.submode(), d.offset, true, &prevBufferOffset) && !decodedtext.isCompound() && !decodedtext.isDirectedMessage()){
|
||||||
qDebug() << "buffering data" << d.freq << d.text;
|
qDebug() << "buffering data" << d.dial << d.offset << d.text;
|
||||||
d.isBuffered = true;
|
d.isBuffered = true;
|
||||||
m_messageBuffer[d.freq].msgs.append(d);
|
m_messageBuffer[d.offset].msgs.append(d);
|
||||||
// TODO: incremental display if it's "to" me.
|
// TODO: incremental display if it's "to" me.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4928,7 +4937,8 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
cd.call = decodedtext.compoundCall();
|
cd.call = decodedtext.compoundCall();
|
||||||
cd.grid = decodedtext.extra(); // compound calls via pings may contain grid...
|
cd.grid = decodedtext.extra(); // compound calls via pings may contain grid...
|
||||||
cd.snr = decodedtext.snr();
|
cd.snr = decodedtext.snr();
|
||||||
cd.freq = decodedtext.frequencyOffset();
|
cd.dial = dialFrequency();
|
||||||
|
cd.offset = decodedtext.frequencyOffset();
|
||||||
cd.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
cd.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
||||||
cd.bits = decodedtext.bits();
|
cd.bits = decodedtext.bits();
|
||||||
cd.tdrift = decodedtext.dt();
|
cd.tdrift = decodedtext.dt();
|
||||||
@ -4954,7 +4964,8 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
cmd.snr = cd.snr;
|
cmd.snr = cd.snr;
|
||||||
cmd.bits = cd.bits;
|
cmd.bits = cd.bits;
|
||||||
cmd.grid = cd.grid;
|
cmd.grid = cd.grid;
|
||||||
cmd.freq = cd.freq;
|
cmd.dial = cd.dial;
|
||||||
|
cmd.offset = cd.offset;
|
||||||
cmd.utcTimestamp = cd.utcTimestamp;
|
cmd.utcTimestamp = cd.utcTimestamp;
|
||||||
cmd.tdrift = cd.tdrift;
|
cmd.tdrift = cd.tdrift;
|
||||||
cmd.submode = cd.submode;
|
cmd.submode = cd.submode;
|
||||||
@ -4967,10 +4978,10 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "buffering compound call" << cd.freq << cd.call << cd.bits;
|
qDebug() << "buffering compound call" << cd.offset << cd.call << cd.bits;
|
||||||
|
|
||||||
hasExistingMessageBuffer(cd.submode, cd.freq, true, nullptr);
|
hasExistingMessageBuffer(cd.submode, cd.offset, true, nullptr);
|
||||||
m_messageBuffer[cd.freq].compound.append(cd);
|
m_messageBuffer[cd.offset].compound.append(cd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -4985,7 +4996,8 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
cmd.from = parts.at(0);
|
cmd.from = parts.at(0);
|
||||||
cmd.to = parts.at(1);
|
cmd.to = parts.at(1);
|
||||||
cmd.cmd = parts.at(2);
|
cmd.cmd = parts.at(2);
|
||||||
cmd.freq = decodedtext.frequencyOffset();
|
cmd.dial = dialFrequency();
|
||||||
|
cmd.offset = decodedtext.frequencyOffset();
|
||||||
cmd.snr = decodedtext.snr();
|
cmd.snr = decodedtext.snr();
|
||||||
cmd.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
cmd.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
||||||
cmd.bits = decodedtext.bits();
|
cmd.bits = decodedtext.bits();
|
||||||
@ -4995,7 +5007,7 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
|
|
||||||
// if the command is a buffered command and its not the last frame OR we have from or to in a separate message (compound call)
|
// if the command is a buffered command and its not the last frame OR we have from or to in a separate message (compound call)
|
||||||
if((Varicode::isCommandBuffered(cmd.cmd) && (cmd.bits & Varicode::JS8CallLast) != Varicode::JS8CallLast) || cmd.from == "<....>" || cmd.to == "<....>"){
|
if((Varicode::isCommandBuffered(cmd.cmd) && (cmd.bits & Varicode::JS8CallLast) != Varicode::JS8CallLast) || cmd.from == "<....>" || cmd.to == "<....>"){
|
||||||
qDebug() << "buffering cmd" << cmd.freq << cmd.cmd << cmd.from << cmd.to;
|
qDebug() << "buffering cmd" << cmd.dial << cmd.offset << cmd.cmd << cmd.from << cmd.to;
|
||||||
|
|
||||||
// log complete buffered callsigns immediately
|
// log complete buffered callsigns immediately
|
||||||
if(cmd.from != "<....>" && cmd.to != "<....>"){
|
if(cmd.from != "<....>" && cmd.to != "<....>"){
|
||||||
@ -5003,7 +5015,8 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
cmdcd.call = cmd.from;
|
cmdcd.call = cmd.from;
|
||||||
cmdcd.bits = cmd.bits;
|
cmdcd.bits = cmd.bits;
|
||||||
cmdcd.snr = cmd.snr;
|
cmdcd.snr = cmd.snr;
|
||||||
cmdcd.freq = cmd.freq;
|
cmdcd.dial = cmd.dial;
|
||||||
|
cmdcd.offset = cmd.offset;
|
||||||
cmdcd.utcTimestamp = cmd.utcTimestamp;
|
cmdcd.utcTimestamp = cmd.utcTimestamp;
|
||||||
cmdcd.ackTimestamp = cmd.to == m_config.my_callsign() ? cmd.utcTimestamp : QDateTime{};
|
cmdcd.ackTimestamp = cmd.to == m_config.my_callsign() ? cmd.utcTimestamp : QDateTime{};
|
||||||
cmdcd.tdrift = cmd.tdrift;
|
cmdcd.tdrift = cmd.tdrift;
|
||||||
@ -5013,14 +5026,14 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// merge any existing buffer to this frequency
|
// merge any existing buffer to this frequency
|
||||||
hasExistingMessageBuffer(cmd.submode, cmd.freq, true, nullptr);
|
hasExistingMessageBuffer(cmd.submode, cmd.offset, true, nullptr);
|
||||||
|
|
||||||
if(cmd.to == m_config.my_callsign()){
|
if(cmd.to == m_config.my_callsign()){
|
||||||
d.shouldDisplay = true;
|
d.shouldDisplay = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_messageBuffer[cmd.freq].cmd = cmd;
|
m_messageBuffer[cmd.offset].cmd = cmd;
|
||||||
m_messageBuffer[cmd.freq].msgs.clear();
|
m_messageBuffer[cmd.offset].msgs.clear();
|
||||||
} else {
|
} else {
|
||||||
m_rxCommandQueue.append(cmd);
|
m_rxCommandQueue.append(cmd);
|
||||||
}
|
}
|
||||||
@ -5039,7 +5052,8 @@ void MainWindow::processDecodedLine(QByteArray t){
|
|||||||
td.call = cmd.to;
|
td.call = cmd.to;
|
||||||
td.grid = "";
|
td.grid = "";
|
||||||
td.snr = snr;
|
td.snr = snr;
|
||||||
td.freq = cmd.freq;
|
td.dial = cmd.dial;
|
||||||
|
td.offset = cmd.offset;
|
||||||
td.utcTimestamp = cmd.utcTimestamp;
|
td.utcTimestamp = cmd.utcTimestamp;
|
||||||
td.tdrift = cmd.tdrift;
|
td.tdrift = cmd.tdrift;
|
||||||
td.submode = cmd.submode;
|
td.submode = cmd.submode;
|
||||||
@ -5261,12 +5275,10 @@ QString MainWindow::lookupCallInCompoundCache(QString const &call){
|
|||||||
return m_compoundCallCache.value(call, call);
|
return m_compoundCallCache.value(call, call);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::spotReport(int submode, int offset, int snr, QString callsign, QString grid){
|
void MainWindow::spotReport(int submode, int dial, int offset, int snr, QString callsign, QString grid){
|
||||||
if(!m_config.spot_to_reporting_networks()) return;
|
if(!m_config.spot_to_reporting_networks()) return;
|
||||||
|
|
||||||
Frequency frequency = m_freqNominal + offset;
|
m_spotClient->enqueueSpot(callsign, grid, submode, dial, offset, snr);
|
||||||
|
|
||||||
m_spotClient->enqueueSpot(callsign, grid, submode, frequency, snr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::spotCmd(CommandDetail cmd){
|
void MainWindow::spotCmd(CommandDetail cmd){
|
||||||
@ -5277,7 +5289,7 @@ void MainWindow::spotCmd(CommandDetail cmd){
|
|||||||
cmdStr = Varicode::lstrip(cmd.cmd);
|
cmdStr = Varicode::lstrip(cmd.cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_spotClient->enqueueCmd(cmdStr, cmd.from, cmd.to, cmd.relayPath, cmd.text, cmd.grid, cmd.extra, cmd.submode, m_freqNominal + cmd.freq, cmd.snr);
|
m_spotClient->enqueueCmd(cmdStr, cmd.from, cmd.to, cmd.relayPath, cmd.text, cmd.grid, cmd.extra, cmd.submode, cmd.dial, cmd.offset, cmd.snr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// KN4CRD: @APRSIS CMD :EMAIL-2 :email@domain.com booya{1
|
// KN4CRD: @APRSIS CMD :EMAIL-2 :email@domain.com booya{1
|
||||||
@ -5298,12 +5310,12 @@ void MainWindow::spotAprsCmd(CommandDetail cmd){
|
|||||||
emit aprsClientEnqueueThirdParty(by_call, from_call, cmd.text);
|
emit aprsClientEnqueueThirdParty(by_call, from_call, cmd.text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::spotAprsGrid(int offset, int snr, QString callsign, QString grid){
|
void MainWindow::spotAprsGrid(int dial, int offset, int snr, QString callsign, QString grid){
|
||||||
if(!m_config.spot_to_reporting_networks()) return;
|
if(!m_config.spot_to_reporting_networks()) return;
|
||||||
if(!m_config.spot_to_aprs()) return;
|
if(!m_config.spot_to_aprs()) return;
|
||||||
if(grid.length() < 4) return;
|
if(grid.length() < 4) return;
|
||||||
|
|
||||||
Frequency frequency = m_freqNominal + offset;
|
Frequency frequency = dial + offset;
|
||||||
|
|
||||||
auto comment = QString("%1MHz %2dB").arg(Radio::frequency_MHz_string(frequency)).arg(Varicode::formatSNR(snr));
|
auto comment = QString("%1MHz %2dB").arg(Radio::frequency_MHz_string(frequency)).arg(Varicode::formatSNR(snr));
|
||||||
if(callsign.contains("/")){
|
if(callsign.contains("/")){
|
||||||
@ -5318,10 +5330,10 @@ void MainWindow::spotAprsGrid(int offset, int snr, QString callsign, QString gri
|
|||||||
emit aprsClientEnqueueSpot(by_call, from_call, grid, comment);
|
emit aprsClientEnqueueSpot(by_call, from_call, grid, comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid){
|
void MainWindow::pskLogReport(QString mode, int dial, int offset, int snr, QString callsign, QString grid){
|
||||||
if(!m_config.spot_to_reporting_networks()) return;
|
if(!m_config.spot_to_reporting_networks()) return;
|
||||||
|
|
||||||
Frequency frequency = m_freqNominal + offset;
|
Frequency frequency = dial + offset;
|
||||||
|
|
||||||
psk_Reporter->addRemoteStation(
|
psk_Reporter->addRemoteStation(
|
||||||
callsign,
|
callsign,
|
||||||
@ -6699,7 +6711,7 @@ void MainWindow::addMessageText(QString text, bool clear, bool selectFirstPlaceh
|
|||||||
ui->extFreeTextMsgEdit->setFocus();
|
ui->extFreeTextMsgEdit->setFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::confirmThenEnqueueMessage(int timeout, int priority, QString message, int freq, Callback c){
|
void MainWindow::confirmThenEnqueueMessage(int timeout, int priority, QString message, int offset, Callback c){
|
||||||
SelfDestructMessageBox * m = new SelfDestructMessageBox(timeout,
|
SelfDestructMessageBox * m = new SelfDestructMessageBox(timeout,
|
||||||
"Autoreply Confirmation Required",
|
"Autoreply Confirmation Required",
|
||||||
QString("A transmission is queued for autoreply:\n\n%1\n\nWould you like to send this transmission?").arg(message),
|
QString("A transmission is queued for autoreply:\n\n%1\n\nWould you like to send this transmission?").arg(message),
|
||||||
@ -6709,12 +6721,12 @@ void MainWindow::confirmThenEnqueueMessage(int timeout, int priority, QString me
|
|||||||
false,
|
false,
|
||||||
this);
|
this);
|
||||||
|
|
||||||
connect(m, &SelfDestructMessageBox::finished, this, [this, m, priority, message, freq, c](int result){
|
connect(m, &SelfDestructMessageBox::finished, this, [this, m, priority, message, offset, c](int result){
|
||||||
// make sure we delete the message box later...
|
// make sure we delete the message box later...
|
||||||
m->deleteLater();
|
m->deleteLater();
|
||||||
|
|
||||||
if(m->result() == QMessageBox::Yes){
|
if(m->result() == QMessageBox::Yes){
|
||||||
enqueueMessage(priority, message, freq, c);
|
enqueueMessage(priority, message, offset, c);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -6722,10 +6734,10 @@ void MainWindow::confirmThenEnqueueMessage(int timeout, int priority, QString me
|
|||||||
m->show();
|
m->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::enqueueMessage(int priority, QString message, int freq, Callback c){
|
void MainWindow::enqueueMessage(int priority, QString message, int offset, Callback c){
|
||||||
m_txMessageQueue.enqueue(
|
m_txMessageQueue.enqueue(
|
||||||
PrioritizedMessage{
|
PrioritizedMessage{
|
||||||
DriftingDateTime::currentDateTimeUtc(), priority, message, freq, c
|
DriftingDateTime::currentDateTimeUtc(), priority, message, offset, c
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -7363,7 +7375,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call,
|
|||||||
m_logBook.addAsWorked (m_hisCall, m_config.bands ()->find (m_freqNominal), mode, submode, grid, date, name, comments);
|
m_logBook.addAsWorked (m_hisCall, m_config.bands ()->find (m_freqNominal), mode, submode, grid, date, name, comments);
|
||||||
|
|
||||||
// Log to JS8Call API
|
// Log to JS8Call API
|
||||||
if(m_config.udpEnabled()){
|
if(canSendNetworkMessage()){
|
||||||
sendNetworkMessage("LOG.QSO", QString(ADIF), {
|
sendNetworkMessage("LOG.QSO", QString(ADIF), {
|
||||||
{"_ID", QVariant(-1)},
|
{"_ID", QVariant(-1)},
|
||||||
{"UTC.ON", QVariant(QSO_date_on.toMSecsSinceEpoch())},
|
{"UTC.ON", QVariant(QSO_date_on.toMSecsSinceEpoch())},
|
||||||
@ -9516,14 +9528,14 @@ void MainWindow::qsy(int hzDelta){
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
newActivity[offset - hzDelta] = m_bandActivity[offset];
|
newActivity[offset - hzDelta] = m_bandActivity[offset];
|
||||||
newActivity[offset - hzDelta].last().freq -= hzDelta;
|
newActivity[offset - hzDelta].last().offset -= hzDelta;
|
||||||
}
|
}
|
||||||
m_bandActivity.clear();
|
m_bandActivity.clear();
|
||||||
m_bandActivity.unite(newActivity);
|
m_bandActivity.unite(newActivity);
|
||||||
|
|
||||||
// adjust call activity frequencies
|
// adjust call activity frequencies
|
||||||
foreach(auto call, m_callActivity.keys()){
|
foreach(auto call, m_callActivity.keys()){
|
||||||
m_callActivity[call].freq -= hzDelta;
|
m_callActivity[call].offset -= hzDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
displayActivity(true);
|
displayActivity(true);
|
||||||
@ -10300,7 +10312,7 @@ QString MainWindow::callsignSelected(bool useInputText){
|
|||||||
auto d = m_callActivity[call];
|
auto d = m_callActivity[call];
|
||||||
|
|
||||||
// if this callsign is at a frequency within the threshold limit of the selected offset
|
// if this callsign is at a frequency within the threshold limit of the selected offset
|
||||||
if(selectedOffset - threshold <= d.freq && d.freq <= selectedOffset + threshold){
|
if(selectedOffset - threshold <= d.offset && d.offset <= selectedOffset + threshold){
|
||||||
return d.call;
|
return d.call;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10528,7 +10540,8 @@ void MainWindow::processIdleActivity() {
|
|||||||
d.utcTimestamp = last.utcTimestamp;
|
d.utcTimestamp = last.utcTimestamp;
|
||||||
d.snr = last.snr;
|
d.snr = last.snr;
|
||||||
d.tdrift = last.tdrift;
|
d.tdrift = last.tdrift;
|
||||||
d.freq = last.freq;
|
d.dial = last.dial;
|
||||||
|
d.offset = last.offset;
|
||||||
d.submode = last.submode;
|
d.submode = last.submode;
|
||||||
|
|
||||||
if(hasExistingMessageBuffer(d.submode, offset, false, nullptr)){
|
if(hasExistingMessageBuffer(d.submode, offset, false, nullptr)){
|
||||||
@ -10555,7 +10568,9 @@ void MainWindow::processRxActivity() {
|
|||||||
if(canSendNetworkMessage()){
|
if(canSendNetworkMessage()){
|
||||||
sendNetworkMessage("RX.ACTIVITY", d.text, {
|
sendNetworkMessage("RX.ACTIVITY", d.text, {
|
||||||
{"_ID", QVariant(-1)},
|
{"_ID", QVariant(-1)},
|
||||||
{"FREQ", QVariant(d.freq)},
|
{"FREQ", QVariant(d.dial + d.offset)},
|
||||||
|
{"DIAL", QVariant(d.dial)},
|
||||||
|
{"OFFSET", QVariant(d.offset)},
|
||||||
{"SNR", QVariant(d.snr)},
|
{"SNR", QVariant(d.snr)},
|
||||||
{"SPEED", QVariant(d.submode)},
|
{"SPEED", QVariant(d.submode)},
|
||||||
{"TDRIFT", QVariant(d.tdrift)},
|
{"TDRIFT", QVariant(d.tdrift)},
|
||||||
@ -10567,10 +10582,10 @@ void MainWindow::processRxActivity() {
|
|||||||
|
|
||||||
// use the actual frequency and check its delta from our current frequency
|
// use the actual frequency and check its delta from our current frequency
|
||||||
// meaning, if our current offset is 1502 and the d.freq is 1492, the delta is <= 10;
|
// meaning, if our current offset is 1502 and the d.freq is 1492, the delta is <= 10;
|
||||||
bool shouldDisplay = abs(d.freq - freqOffset) <= rxThreshold(d.submode);
|
bool shouldDisplay = abs(d.offset - freqOffset) <= rxThreshold(d.submode);
|
||||||
|
|
||||||
int prevOffset = d.freq;
|
int prevOffset = d.offset;
|
||||||
if(hasExistingMessageBuffer(d.submode, d.freq, false, &prevOffset) && (
|
if(hasExistingMessageBuffer(d.submode, d.offset, false, &prevOffset) && (
|
||||||
(m_messageBuffer[prevOffset].cmd.to == m_config.my_callsign()) ||
|
(m_messageBuffer[prevOffset].cmd.to == m_config.my_callsign()) ||
|
||||||
// (isAllCallIncluded(m_messageBuffer[prevOffset].cmd.to)) || // uncomment this if we want to incrementally print allcalls
|
// (isAllCallIncluded(m_messageBuffer[prevOffset].cmd.to)) || // uncomment this if we want to incrementally print allcalls
|
||||||
(isGroupCallIncluded(m_messageBuffer[prevOffset].cmd.to))
|
(isGroupCallIncluded(m_messageBuffer[prevOffset].cmd.to))
|
||||||
@ -10589,7 +10604,7 @@ void MainWindow::processRxActivity() {
|
|||||||
d.utcTimestamp = qMin(d.utcTimestamp, lastCompound.utcTimestamp);
|
d.utcTimestamp = qMin(d.utcTimestamp, lastCompound.utcTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if(hasClosedExistingMessageBuffer(d.freq)){
|
} else if(hasClosedExistingMessageBuffer(d.offset)){
|
||||||
// incremental typeahead should just be displayed...
|
// incremental typeahead should just be displayed...
|
||||||
// TODO: should the buffer be reopened?
|
// TODO: should the buffer be reopened?
|
||||||
shouldDisplay = true;
|
shouldDisplay = true;
|
||||||
@ -10611,7 +10626,8 @@ void MainWindow::processRxActivity() {
|
|||||||
if(d.text.startsWith(theirCall) && d.text.mid(theirCall.length(), 1) == ":"){
|
if(d.text.startsWith(theirCall) && d.text.mid(theirCall.length(), 1) == ":"){
|
||||||
CallDetail cd = {};
|
CallDetail cd = {};
|
||||||
cd.call = theirCall;
|
cd.call = theirCall;
|
||||||
cd.freq = d.freq;
|
cd.dial = d.dial;
|
||||||
|
cd.offset = d.offset;
|
||||||
cd.snr = d.snr;
|
cd.snr = d.snr;
|
||||||
cd.bits = d.bits;
|
cd.bits = d.bits;
|
||||||
cd.tdrift = d.tdrift;
|
cd.tdrift = d.tdrift;
|
||||||
@ -10641,19 +10657,19 @@ void MainWindow::processRxActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// log it to the display!
|
// log it to the display!
|
||||||
displayTextForFreq(d.text, d.freq, d.utcTimestamp, false, isFirst, isLast);
|
displayTextForFreq(d.text, d.offset, d.utcTimestamp, false, isFirst, isLast);
|
||||||
|
|
||||||
// if we've received a message to be displayed, we should bump the repeat buttons...
|
// if we've received a message to be displayed, we should bump the repeat buttons...
|
||||||
resetAutomaticIntervalTransmissions(true, false);
|
resetAutomaticIntervalTransmissions(true, false);
|
||||||
|
|
||||||
if(isLast){
|
if(isLast){
|
||||||
clearOffsetDirected(d.freq);
|
clearOffsetDirected(d.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isLast && !d.isBuffered){
|
if(isLast && !d.isBuffered){
|
||||||
// buffered commands need the rxFrameBlockNumbers cache so it can fixup its display
|
// buffered commands need the rxFrameBlockNumbers cache so it can fixup its display
|
||||||
// all other "last" data frames can clear the rxFrameBlockNumbers cache so the next message will be on a new line.
|
// all other "last" data frames can clear the rxFrameBlockNumbers cache so the next message will be on a new line.
|
||||||
m_rxFrameBlockNumbers.remove(d.freq);
|
m_rxFrameBlockNumbers.remove(d.offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10898,7 +10914,7 @@ void MainWindow::processCommandActivity() {
|
|||||||
bool isAllCall = isAllCallIncluded(d.to);
|
bool isAllCall = isAllCallIncluded(d.to);
|
||||||
bool isGroupCall = isGroupCallIncluded(d.to);
|
bool isGroupCall = isGroupCallIncluded(d.to);
|
||||||
|
|
||||||
qDebug() << "try processing command" << d.from << d.to << d.cmd << d.freq << d.grid << d.extra << isAllCall << isGroupCall;
|
qDebug() << "try processing command" << d.from << d.to << d.cmd << d.dial << d.offset << d.grid << d.extra << isAllCall << isGroupCall;
|
||||||
|
|
||||||
// if we need a compound callsign but never got one...skip
|
// if we need a compound callsign but never got one...skip
|
||||||
if (d.from == "<....>" || d.to == "<....>") {
|
if (d.from == "<....>" || d.to == "<....>") {
|
||||||
@ -10918,7 +10934,8 @@ void MainWindow::processCommandActivity() {
|
|||||||
cd.call = d.from;
|
cd.call = d.from;
|
||||||
cd.grid = d.grid;
|
cd.grid = d.grid;
|
||||||
cd.snr = d.snr;
|
cd.snr = d.snr;
|
||||||
cd.freq = d.freq;
|
cd.dial = d.dial;
|
||||||
|
cd.offset = d.offset;
|
||||||
cd.bits = d.bits;
|
cd.bits = d.bits;
|
||||||
cd.ackTimestamp = d.text.contains(": ACK") || toMe ? d.utcTimestamp : QDateTime{};
|
cd.ackTimestamp = d.text.contains(": ACK") || toMe ? d.utcTimestamp : QDateTime{};
|
||||||
cd.utcTimestamp = d.utcTimestamp;
|
cd.utcTimestamp = d.utcTimestamp;
|
||||||
@ -10946,7 +10963,8 @@ void MainWindow::processCommandActivity() {
|
|||||||
CallDetail cd = {};
|
CallDetail cd = {};
|
||||||
cd.bits = d.bits;
|
cd.bits = d.bits;
|
||||||
cd.call = d.from;
|
cd.call = d.from;
|
||||||
cd.freq = d.freq;
|
cd.dial = d.dial;
|
||||||
|
cd.offset = d.offset;
|
||||||
cd.grid = grid;
|
cd.grid = grid;
|
||||||
cd.snr = d.snr;
|
cd.snr = d.snr;
|
||||||
cd.utcTimestamp = d.utcTimestamp;
|
cd.utcTimestamp = d.utcTimestamp;
|
||||||
@ -10955,7 +10973,7 @@ void MainWindow::processCommandActivity() {
|
|||||||
|
|
||||||
// PROCESS GRID SPOTS TO APRSIS FOR EVERYONE
|
// PROCESS GRID SPOTS TO APRSIS FOR EVERYONE
|
||||||
if(d.to == "@APRSIS"){
|
if(d.to == "@APRSIS"){
|
||||||
spotAprsGrid(cd.freq, cd.snr, cd.call, cd.grid);
|
spotAprsGrid(cd.dial, cd.offset, cd.snr, cd.call, cd.grid);
|
||||||
}
|
}
|
||||||
|
|
||||||
logCallActivity(cd, true);
|
logCallActivity(cd, true);
|
||||||
@ -11011,7 +11029,8 @@ void MainWindow::processCommandActivity() {
|
|||||||
ad.isFree = true;
|
ad.isFree = true;
|
||||||
ad.isDirected = true;
|
ad.isDirected = true;
|
||||||
ad.bits = d.bits;
|
ad.bits = d.bits;
|
||||||
ad.freq = d.freq;
|
ad.dial = d.dial;
|
||||||
|
ad.offset = d.offset;
|
||||||
ad.snr = d.snr;
|
ad.snr = d.snr;
|
||||||
ad.text = text;
|
ad.text = text;
|
||||||
ad.utcTimestamp = d.utcTimestamp;
|
ad.utcTimestamp = d.utcTimestamp;
|
||||||
@ -11049,7 +11068,7 @@ void MainWindow::processCommandActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// log it to the display!
|
// log it to the display!
|
||||||
displayTextForFreq(ad.text, ad.freq, ad.utcTimestamp, false, true, false);
|
displayTextForFreq(ad.text, ad.offset, ad.utcTimestamp, false, true, false);
|
||||||
|
|
||||||
// and send it to the network in case we want to interact with it from an external app...
|
// and send it to the network in case we want to interact with it from an external app...
|
||||||
if(canSendNetworkMessage()){
|
if(canSendNetworkMessage()){
|
||||||
@ -11061,7 +11080,9 @@ void MainWindow::processCommandActivity() {
|
|||||||
{"GRID", QVariant(d.grid)},
|
{"GRID", QVariant(d.grid)},
|
||||||
{"EXTRA", QVariant(d.extra)},
|
{"EXTRA", QVariant(d.extra)},
|
||||||
{"TEXT", QVariant(d.text)},
|
{"TEXT", QVariant(d.text)},
|
||||||
{"FREQ", QVariant(ad.freq)},
|
{"FREQ", QVariant(ad.dial+ad.offset)},
|
||||||
|
{"DIAL", QVariant(ad.dial)},
|
||||||
|
{"OFFSET", QVariant(ad.offset)},
|
||||||
{"SNR", QVariant(ad.snr)},
|
{"SNR", QVariant(ad.snr)},
|
||||||
{"SPEED", QVariant(ad.submode)},
|
{"SPEED", QVariant(ad.submode)},
|
||||||
{"TDRIFT", QVariant(ad.tdrift)},
|
{"TDRIFT", QVariant(ad.tdrift)},
|
||||||
@ -11222,7 +11243,8 @@ void MainWindow::processCommandActivity() {
|
|||||||
CallDetail cd = {};
|
CallDetail cd = {};
|
||||||
cd.call = call;
|
cd.call = call;
|
||||||
cd.snr = -64;
|
cd.snr = -64;
|
||||||
cd.freq = d.freq;
|
cd.dial = d.dial;
|
||||||
|
cd.offset = d.offset;
|
||||||
cd.through = d.from;
|
cd.through = d.from;
|
||||||
cd.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
cd.utcTimestamp = DriftingDateTime::currentDateTimeUtc();
|
||||||
cd.tdrift = d.tdrift;
|
cd.tdrift = d.tdrift;
|
||||||
@ -11276,7 +11298,8 @@ void MainWindow::processCommandActivity() {
|
|||||||
CommandDetail rd = {};
|
CommandDetail rd = {};
|
||||||
rd.bits = d.bits;
|
rd.bits = d.bits;
|
||||||
rd.cmd = first;
|
rd.cmd = first;
|
||||||
rd.freq = d.freq;
|
rd.dial = d.dial;
|
||||||
|
rd.offset = d.offset;
|
||||||
rd.from = d.from; // note, MSG and QUERY commands are not set with from as the relay path.
|
rd.from = d.from; // note, MSG and QUERY commands are not set with from as the relay path.
|
||||||
rd.relayPath = d.relayPath;
|
rd.relayPath = d.relayPath;
|
||||||
rd.text = relayedCmds.join(" "); //d.text;
|
rd.text = relayedCmds.join(" "); //d.text;
|
||||||
@ -11316,7 +11339,8 @@ void MainWindow::processCommandActivity() {
|
|||||||
cd.bits = d.bits;
|
cd.bits = d.bits;
|
||||||
cd.cmd = d.cmd;
|
cd.cmd = d.cmd;
|
||||||
cd.extra = d.extra;
|
cd.extra = d.extra;
|
||||||
cd.freq = d.freq;
|
cd.dial = d.dial;
|
||||||
|
cd.offset = d.offset;
|
||||||
cd.from = d.from;
|
cd.from = d.from;
|
||||||
cd.grid = d.grid;
|
cd.grid = d.grid;
|
||||||
cd.relayPath = d.relayPath;
|
cd.relayPath = d.relayPath;
|
||||||
@ -11649,14 +11673,16 @@ void MainWindow::refreshInboxCounts(){
|
|||||||
if(!m_callActivity.contains(from)){
|
if(!m_callActivity.contains(from)){
|
||||||
auto utc = params.value("UTC").toString();
|
auto utc = params.value("UTC").toString();
|
||||||
auto snr = params.value("SNR").toInt();
|
auto snr = params.value("SNR").toInt();
|
||||||
auto freq = params.value("OFFSET").toInt();
|
auto dial = params.value("DIAL").toInt();
|
||||||
|
auto offset = params.value("OFFSET").toInt();
|
||||||
auto tdrift = params.value("TDRIFT").toInt();
|
auto tdrift = params.value("TDRIFT").toInt();
|
||||||
auto submode = params.value("SUBMODE").toInt();
|
auto submode = params.value("SUBMODE").toInt();
|
||||||
|
|
||||||
CallDetail cd;
|
CallDetail cd;
|
||||||
cd.call = from;
|
cd.call = from;
|
||||||
cd.snr = snr;
|
cd.snr = snr;
|
||||||
cd.freq = freq;
|
cd.dial = dial;
|
||||||
|
cd.offset = offset;
|
||||||
cd.tdrift = tdrift;
|
cd.tdrift = tdrift;
|
||||||
cd.utcTimestamp = QDateTime::fromString(utc, "yyyy-MM-dd hh:mm:ss");
|
cd.utcTimestamp = QDateTime::fromString(utc, "yyyy-MM-dd hh:mm:ss");
|
||||||
cd.utcTimestamp.setUtcOffset(0);
|
cd.utcTimestamp.setUtcOffset(0);
|
||||||
@ -11695,16 +11721,15 @@ int MainWindow::addCommandToStorage(QString type, CommandDetail d){
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto df = dialFrequency();
|
|
||||||
|
|
||||||
QMap<QString, QVariant> v = {
|
QMap<QString, QVariant> v = {
|
||||||
{"UTC", QVariant(d.utcTimestamp.toString("yyyy-MM-dd hh:mm:ss"))},
|
{"UTC", QVariant(d.utcTimestamp.toString("yyyy-MM-dd hh:mm:ss"))},
|
||||||
{"TO", QVariant(d.to)},
|
{"TO", QVariant(d.to)},
|
||||||
{"FROM", QVariant(d.from)},
|
{"FROM", QVariant(d.from)},
|
||||||
{"PATH", QVariant(d.relayPath)},
|
{"PATH", QVariant(d.relayPath)},
|
||||||
{"DIAL", QVariant((quint64)df)},
|
|
||||||
{"TDRIFT", QVariant(d.tdrift)},
|
{"TDRIFT", QVariant(d.tdrift)},
|
||||||
{"OFFSET", QVariant(d.freq)},
|
{"FREQ", QVariant(d.dial+d.offset)},
|
||||||
|
{"DIAL", QVariant(d.dial)},
|
||||||
|
{"OFFSET", QVariant(d.offset)},
|
||||||
{"CMD", QVariant(d.cmd)},
|
{"CMD", QVariant(d.cmd)},
|
||||||
{"SNR", QVariant(d.snr)},
|
{"SNR", QVariant(d.snr)},
|
||||||
{"SUBMODE", QVariant(d.submode)},
|
{"SUBMODE", QVariant(d.submode)},
|
||||||
@ -11785,25 +11810,23 @@ void MainWindow::processSpots() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the dial frequency to report
|
|
||||||
auto dial = dialFrequency();
|
|
||||||
|
|
||||||
while(!m_rxCallQueue.isEmpty()){
|
while(!m_rxCallQueue.isEmpty()){
|
||||||
CallDetail d = m_rxCallQueue.dequeue();
|
CallDetail d = m_rxCallQueue.dequeue();
|
||||||
if(d.call.isEmpty()){
|
if(d.call.isEmpty()){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "spotting call to reporting networks" << d.call << d.snr << d.freq;
|
qDebug() << "spotting call to reporting networks" << d.call << d.snr << d.dial << d.offset;
|
||||||
|
|
||||||
spotReport(d.submode, d.freq, d.snr, d.call, d.grid);
|
spotReport(d.submode, d.dial, d.offset, d.snr, d.call, d.grid);
|
||||||
pskLogReport("JS8", d.freq, d.snr, d.call, d.grid);
|
pskLogReport("JS8", d.dial, d.offset, d.snr, d.call, d.grid);
|
||||||
|
|
||||||
if(canSendNetworkMessage()){
|
if(canSendNetworkMessage()){
|
||||||
sendNetworkMessage("RX.SPOT", "", {
|
sendNetworkMessage("RX.SPOT", "", {
|
||||||
{"_ID", QVariant(-1)},
|
{"_ID", QVariant(-1)},
|
||||||
{"DIAL", QVariant(dial)},
|
{"FREQ", QVariant(d.dial+d.offset)},
|
||||||
{"OFFSET", QVariant(d.freq)},
|
{"DIAL", QVariant(d.dial)},
|
||||||
|
{"OFFSET", QVariant(d.offset)},
|
||||||
{"CALL", QVariant(d.call)},
|
{"CALL", QVariant(d.call)},
|
||||||
{"SNR", QVariant(d.snr)},
|
{"SNR", QVariant(d.snr)},
|
||||||
{"GRID", QVariant(d.grid)},
|
{"GRID", QVariant(d.grid)},
|
||||||
@ -11827,7 +11850,7 @@ void MainWindow::processTxQueue(){
|
|||||||
auto head = m_txMessageQueue.head();
|
auto head = m_txMessageQueue.head();
|
||||||
|
|
||||||
// decide if it's ok to transmit...
|
// decide if it's ok to transmit...
|
||||||
int f = head.freq;
|
int f = head.offset;
|
||||||
if(f == -1){
|
if(f == -1){
|
||||||
f = currentFreqOffset();
|
f = currentFreqOffset();
|
||||||
}
|
}
|
||||||
@ -12257,7 +12280,7 @@ void MainWindow::displayCallActivity() {
|
|||||||
auto leftActivity = m_callActivity[left];
|
auto leftActivity = m_callActivity[left];
|
||||||
auto rightActivity = m_callActivity[right];
|
auto rightActivity = m_callActivity[right];
|
||||||
|
|
||||||
return leftActivity.freq < rightActivity.freq;
|
return leftActivity.offset < rightActivity.offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto compareDistance = [this, reverse](const QString left, QString right) {
|
auto compareDistance = [this, reverse](const QString left, QString right) {
|
||||||
@ -12413,8 +12436,8 @@ void MainWindow::displayCallActivity() {
|
|||||||
auto snrText = Varicode::formatSNR(d.snr);
|
auto snrText = Varicode::formatSNR(d.snr);
|
||||||
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(snrText.isEmpty() ? "" : QString("%1 dB").arg(snrText)));
|
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(snrText.isEmpty() ? "" : QString("%1 dB").arg(snrText)));
|
||||||
|
|
||||||
auto offsetItem = new QTableWidgetItem(QString("%1 Hz").arg(d.freq));
|
auto offsetItem = new QTableWidgetItem(QString("%1 Hz").arg(d.offset));
|
||||||
offsetItem->setData(Qt::UserRole, QVariant(d.freq));
|
offsetItem->setData(Qt::UserRole, QVariant(d.offset));
|
||||||
ui->tableWidgetCalls->setItem(row, col++, offsetItem);
|
ui->tableWidgetCalls->setItem(row, col++, offsetItem);
|
||||||
|
|
||||||
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1 ms").arg((int)(1000*d.tdrift))));
|
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1 ms").arg((int)(1000*d.tdrift))));
|
||||||
@ -12598,7 +12621,7 @@ void MainWindow::emitPTT(bool on){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::emitTones(){
|
void MainWindow::emitTones(){
|
||||||
if(!m_config.udpEnabled()){
|
if(!canSendNetworkMessage()){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12668,6 +12691,7 @@ void MainWindow::networkMessage(Message const &message)
|
|||||||
if(type == "RIG.GET_FREQ"){
|
if(type == "RIG.GET_FREQ"){
|
||||||
sendNetworkMessage("RIG.FREQ", "", {
|
sendNetworkMessage("RIG.FREQ", "", {
|
||||||
{"_ID", id},
|
{"_ID", id},
|
||||||
|
{"FREQ", QVariant((quint64)dialFrequency() + currentFreqOffset())},
|
||||||
{"DIAL", QVariant((quint64)dialFrequency())},
|
{"DIAL", QVariant((quint64)dialFrequency())},
|
||||||
{"OFFSET", QVariant((quint64)currentFreqOffset())}
|
{"OFFSET", QVariant((quint64)currentFreqOffset())}
|
||||||
});
|
});
|
||||||
@ -12797,7 +12821,9 @@ void MainWindow::networkMessage(Message const &message)
|
|||||||
auto d = activity.last();
|
auto d = activity.last();
|
||||||
|
|
||||||
QMap<QString, QVariant> detail;
|
QMap<QString, QVariant> detail;
|
||||||
detail["FREQ"] = QVariant(d.freq);
|
detail["FREQ"] = QVariant(d.dial + d.offset);
|
||||||
|
detail["DIAL"] = QVariant(d.dial);
|
||||||
|
detail["OFFSET"] = QVariant(d.offset);
|
||||||
detail["TEXT"] = QVariant(d.text);
|
detail["TEXT"] = QVariant(d.text);
|
||||||
detail["SNR"] = QVariant(d.snr);
|
detail["SNR"] = QVariant(d.snr);
|
||||||
detail["UTC"] = QVariant(d.utcTimestamp.toMSecsSinceEpoch());
|
detail["UTC"] = QVariant(d.utcTimestamp.toMSecsSinceEpoch());
|
||||||
@ -13206,6 +13232,7 @@ void MainWindow::statusUpdate ()
|
|||||||
{
|
{
|
||||||
if(canSendNetworkMessage()){
|
if(canSendNetworkMessage()){
|
||||||
sendNetworkMessage("STATION.STATUS", "", {
|
sendNetworkMessage("STATION.STATUS", "", {
|
||||||
|
{"FREQ", QVariant(dialFrequency() + currentFreqOffset())},
|
||||||
{"DIAL", QVariant(dialFrequency())},
|
{"DIAL", QVariant(dialFrequency())},
|
||||||
{"OFFSET", QVariant(currentFreqOffset())},
|
{"OFFSET", QVariant(currentFreqOffset())},
|
||||||
{"SPEED", QVariant(m_nSubMode)},
|
{"SPEED", QVariant(m_nSubMode)},
|
||||||
|
21
mainwindow.h
21
mainwindow.h
@ -153,8 +153,8 @@ public slots:
|
|||||||
bool isInDecodeDelayThreshold(int seconds);
|
bool isInDecodeDelayThreshold(int seconds);
|
||||||
void prependMessageText(QString text);
|
void prependMessageText(QString text);
|
||||||
void addMessageText(QString text, bool clear=false, bool selectFirstPlaceholder=false);
|
void addMessageText(QString text, bool clear=false, bool selectFirstPlaceholder=false);
|
||||||
void confirmThenEnqueueMessage(int timeout, int priority, QString message, int freq, Callback c);
|
void confirmThenEnqueueMessage(int timeout, int priority, QString message, int offset, Callback c);
|
||||||
void enqueueMessage(int priority, QString message, int freq, Callback c);
|
void enqueueMessage(int priority, QString message, int offset, Callback c);
|
||||||
void resetMessage();
|
void resetMessage();
|
||||||
void resetMessageUI();
|
void resetMessageUI();
|
||||||
void restoreMessage();
|
void restoreMessage();
|
||||||
@ -741,7 +741,8 @@ private:
|
|||||||
QString call;
|
QString call;
|
||||||
QString through;
|
QString through;
|
||||||
QString grid;
|
QString grid;
|
||||||
int freq;
|
int dial;
|
||||||
|
int offset;
|
||||||
QDateTime cqTimestamp;
|
QDateTime cqTimestamp;
|
||||||
QDateTime ackTimestamp;
|
QDateTime ackTimestamp;
|
||||||
QDateTime utcTimestamp;
|
QDateTime utcTimestamp;
|
||||||
@ -758,7 +759,8 @@ private:
|
|||||||
QString from;
|
QString from;
|
||||||
QString to;
|
QString to;
|
||||||
QString cmd;
|
QString cmd;
|
||||||
int freq;
|
int dial;
|
||||||
|
int offset;
|
||||||
QDateTime utcTimestamp;
|
QDateTime utcTimestamp;
|
||||||
int snr;
|
int snr;
|
||||||
int bits;
|
int bits;
|
||||||
@ -778,7 +780,8 @@ private:
|
|||||||
bool isDirected;
|
bool isDirected;
|
||||||
bool isBuffered;
|
bool isBuffered;
|
||||||
int bits;
|
int bits;
|
||||||
int freq;
|
int dial;
|
||||||
|
int offset;
|
||||||
QString text;
|
QString text;
|
||||||
QDateTime utcTimestamp;
|
QDateTime utcTimestamp;
|
||||||
int snr;
|
int snr;
|
||||||
@ -825,7 +828,7 @@ private:
|
|||||||
QDateTime date;
|
QDateTime date;
|
||||||
int priority;
|
int priority;
|
||||||
QString message;
|
QString message;
|
||||||
int freq;
|
int offset;
|
||||||
Callback callback;
|
Callback callback;
|
||||||
|
|
||||||
friend bool operator <(PrioritizedMessage const &a, PrioritizedMessage const &b){
|
friend bool operator <(PrioritizedMessage const &a, PrioritizedMessage const &b){
|
||||||
@ -981,11 +984,11 @@ private:
|
|||||||
void spotSetLocal();
|
void spotSetLocal();
|
||||||
void pskSetLocal ();
|
void pskSetLocal ();
|
||||||
void aprsSetLocal ();
|
void aprsSetLocal ();
|
||||||
void spotReport(int submode, int offset, int snr, QString callsign, QString grid);
|
void spotReport(int submode, int dial, int offset, int snr, QString callsign, QString grid);
|
||||||
void spotCmd(CommandDetail cmd);
|
void spotCmd(CommandDetail cmd);
|
||||||
void spotAprsCmd(CommandDetail cmd);
|
void spotAprsCmd(CommandDetail cmd);
|
||||||
void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid);
|
void pskLogReport(QString mode, int dial, int offset, int snr, QString callsign, QString grid);
|
||||||
void spotAprsGrid(int offset, int snr, QString callsign, QString grid);
|
void spotAprsGrid(int dial, int offset, int snr, QString callsign, QString grid);
|
||||||
Radio::Frequency dialFrequency();
|
Radio::Frequency dialFrequency();
|
||||||
void setSubmode(int submode);
|
void setSubmode(int submode);
|
||||||
int submodeNameToSubmode(QString speed);
|
int submodeNameToSubmode(QString speed);
|
||||||
|
Loading…
Reference in New Issue
Block a user