Restore functionality of sending .WAV playback decodes to UDP

Extended  the Decode  and WSPRDecode  UDP messages  with an  "off air"
boolean  field indicating  the  decode  was derived  from  a .WAV  fle
playback rather than an on air reception.

Extended reference applications to use  the new off air decode message
field.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8092 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2017-09-16 22:20:59 +00:00
parent bca21c0560
commit 78c257b4f0
15 changed files with 107 additions and 64 deletions

View File

@ -368,27 +368,29 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con
} }
void MessageClient::decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency void MessageClient::decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
, QString const& mode, QString const& message_text, bool low_confidence) , QString const& mode, QString const& message_text, bool low_confidence
, bool off_air)
{ {
if (m_->server_port_ && !m_->server_string_.isEmpty ()) if (m_->server_port_ && !m_->server_string_.isEmpty ())
{ {
QByteArray message; QByteArray message;
NetworkMessage::Builder out {&message, NetworkMessage::Decode, m_->id_, m_->schema_}; NetworkMessage::Builder out {&message, NetworkMessage::Decode, m_->id_, m_->schema_};
out << is_new << time << snr << delta_time << delta_frequency << mode.toUtf8 () out << is_new << time << snr << delta_time << delta_frequency << mode.toUtf8 ()
<< message_text.toUtf8 () << low_confidence; << message_text.toUtf8 () << low_confidence << off_air;
m_->send_message (out, message); m_->send_message (out, message);
} }
} }
void MessageClient::WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency frequency void MessageClient::WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency frequency
, qint32 drift, QString const& callsign, QString const& grid, qint32 power) , qint32 drift, QString const& callsign, QString const& grid, qint32 power
, bool off_air)
{ {
if (m_->server_port_ && !m_->server_string_.isEmpty ()) if (m_->server_port_ && !m_->server_string_.isEmpty ())
{ {
QByteArray message; QByteArray message;
NetworkMessage::Builder out {&message, NetworkMessage::WSPRDecode, m_->id_, m_->schema_}; NetworkMessage::Builder out {&message, NetworkMessage::WSPRDecode, m_->id_, m_->schema_};
out << is_new << time << snr << delta_time << frequency << drift << callsign.toUtf8 () out << is_new << time << snr << delta_time << frequency << drift << callsign.toUtf8 ()
<< grid.toUtf8 () << power; << grid.toUtf8 () << power << off_air;
m_->send_message (out, message); m_->send_message (out, message);
} }
} }
@ -403,17 +405,18 @@ void MessageClient::clear_decodes ()
} }
} }
void MessageClient::qso_logged (QDateTime timeOff, QString const& dx_call, QString const& dx_grid void MessageClient::qso_logged (QDateTime time_off, QString const& dx_call, QString const& dx_grid
, Frequency dial_frequency, QString const& mode, QString const& report_sent , Frequency dial_frequency, QString const& mode, QString const& report_sent
, QString const& report_received, QString const& tx_power , QString const& report_received, QString const& tx_power
, QString const& comments, QString const& name, QDateTime timeOn) , QString const& comments, QString const& name, QDateTime time_on)
{ {
if (m_->server_port_ && !m_->server_string_.isEmpty ()) if (m_->server_port_ && !m_->server_string_.isEmpty ())
{ {
QByteArray message; QByteArray message;
NetworkMessage::Builder out {&message, NetworkMessage::QSOLogged, m_->id_, m_->schema_}; NetworkMessage::Builder out {&message, NetworkMessage::QSOLogged, m_->id_, m_->schema_};
out << timeOff << dx_call.toUtf8 () << dx_grid.toUtf8 () << dial_frequency << mode.toUtf8 () out << time_off << dx_call.toUtf8 () << dx_grid.toUtf8 () << dial_frequency << mode.toUtf8 ()
<< report_sent.toUtf8 () << report_received.toUtf8 () << tx_power.toUtf8 () << comments.toUtf8 () << name.toUtf8 () << timeOn; << report_sent.toUtf8 () << report_received.toUtf8 () << tx_power.toUtf8 () << comments.toUtf8 ()
<< name.toUtf8 () << time_on;
m_->send_message (out, message); m_->send_message (out, message);
} }
} }

View File

@ -53,14 +53,16 @@ public:
, QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode , QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode
, bool fast_mode); , bool fast_mode);
Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
, QString const& mode, QString const& message, bool low_confidence); , QString const& mode, QString const& message, bool low_confidence
, bool off_air);
Q_SLOT void WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency Q_SLOT void WSPR_decode (bool is_new, QTime time, qint32 snr, float delta_time, Frequency
, qint32 drift, QString const& callsign, QString const& grid, qint32 power); , qint32 drift, QString const& callsign, QString const& grid, qint32 power
, bool off_air);
Q_SLOT void clear_decodes (); Q_SLOT void clear_decodes ();
Q_SLOT void qso_logged (QDateTime timeOff, QString const& dx_call, QString const& dx_grid Q_SLOT void qso_logged (QDateTime time_off, QString const& dx_call, QString const& dx_grid
, Frequency dial_frequency, QString const& mode, QString const& report_sent , Frequency dial_frequency, QString const& mode, QString const& report_sent
, QString const& report_received, QString const& tx_power, QString const& comments , QString const& report_received, QString const& tx_power, QString const& comments
, QString const& name, QDateTime timeOn); , QString const& name, QDateTime time_on);
// this slot may be used to send arbitrary UDP datagrams to and // this slot may be used to send arbitrary UDP datagrams to and
// destination allowing the underlying socket to be used for general // destination allowing the underlying socket to be used for general

View File

@ -241,14 +241,15 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
quint32 delta_frequency; quint32 delta_frequency;
QByteArray mode; QByteArray mode;
QByteArray message; QByteArray message;
bool low_confidence; bool low_confidence {false};
bool off_air {false};
in >> is_new >> time >> snr >> delta_time >> delta_frequency >> mode in >> is_new >> time >> snr >> delta_time >> delta_frequency >> mode
>> message >> low_confidence; >> message >> low_confidence >> off_air;
if (check_status (in) != Fail) if (check_status (in) != Fail)
{ {
Q_EMIT self_->decode (is_new, id, time, snr, delta_time, delta_frequency Q_EMIT self_->decode (is_new, id, time, snr, delta_time, delta_frequency
, QString::fromUtf8 (mode), QString::fromUtf8 (message) , QString::fromUtf8 (mode), QString::fromUtf8 (message)
, low_confidence); , low_confidence, off_air);
} }
} }
break; break;
@ -265,18 +266,21 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
QByteArray callsign; QByteArray callsign;
QByteArray grid; QByteArray grid;
qint32 power; qint32 power;
in >> is_new >> time >> snr >> delta_time >> frequency >> drift >> callsign >> grid >> power; bool off_air {false};
in >> is_new >> time >> snr >> delta_time >> frequency >> drift >> callsign >> grid >> power
>> off_air;
if (check_status (in) != Fail) if (check_status (in) != Fail)
{ {
Q_EMIT self_->WSPR_decode (is_new, id, time, snr, delta_time, frequency, drift Q_EMIT self_->WSPR_decode (is_new, id, time, snr, delta_time, frequency, drift
, QString::fromUtf8 (callsign), QString::fromUtf8 (grid), power); , QString::fromUtf8 (callsign), QString::fromUtf8 (grid)
, power, off_air);
} }
} }
break; break;
case NetworkMessage::QSOLogged: case NetworkMessage::QSOLogged:
{ {
QDateTime timeOff; QDateTime time_off;
QByteArray dx_call; QByteArray dx_call;
QByteArray dx_grid; QByteArray dx_grid;
Frequency dial_frequency; Frequency dial_frequency;
@ -286,15 +290,15 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
QByteArray tx_power; QByteArray tx_power;
QByteArray comments; QByteArray comments;
QByteArray name; QByteArray name;
QDateTime timeOn; // Note: LOTW uses TIME_ON for their +/- 30-minute time window QDateTime time_on; // Note: LOTW uses TIME_ON for their +/- 30-minute time window
in >> timeOff >> dx_call >> dx_grid >> dial_frequency >> mode >> report_sent >> report_received in >> time_off >> dx_call >> dx_grid >> dial_frequency >> mode >> report_sent >> report_received
>> tx_power >> comments >> name >> timeOn; >> tx_power >> comments >> name >> time_on;
if (check_status (in) != Fail) if (check_status (in) != Fail)
{ {
Q_EMIT self_->qso_logged (id, timeOff, QString::fromUtf8 (dx_call), QString::fromUtf8 (dx_grid) Q_EMIT self_->qso_logged (id, time_off, QString::fromUtf8 (dx_call), QString::fromUtf8 (dx_grid)
, dial_frequency, QString::fromUtf8 (mode), QString::fromUtf8 (report_sent) , dial_frequency, QString::fromUtf8 (mode), QString::fromUtf8 (report_sent)
, QString::fromUtf8 (report_received), QString::fromUtf8 (tx_power) , QString::fromUtf8 (report_received), QString::fromUtf8 (tx_power)
, QString::fromUtf8 (comments), QString::fromUtf8 (name), timeOn); , QString::fromUtf8 (comments), QString::fromUtf8 (name), time_on);
} }
} }
break; break;

View File

@ -70,13 +70,14 @@ public:
Q_SIGNAL void client_closed (QString const& id); Q_SIGNAL void client_closed (QString const& id);
Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time
, quint32 delta_frequency, QString const& mode, QString const& message , quint32 delta_frequency, QString const& mode, QString const& message
, bool low_confidence); , bool low_confidence, bool off_air);
Q_SIGNAL void WSPR_decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time, Frequency Q_SIGNAL void WSPR_decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time, Frequency
, qint32 drift, QString const& callsign, QString const& grid, qint32 power); , qint32 drift, QString const& callsign, QString const& grid, qint32 power
Q_SIGNAL void qso_logged (QString const& id, QDateTime timeOff, QString const& dx_call, QString const& dx_grid , bool off_air);
Q_SIGNAL void qso_logged (QString const& id, QDateTime time_off, QString const& dx_call, QString const& dx_grid
, Frequency dial_frequency, QString const& mode, QString const& report_sent , Frequency dial_frequency, QString const& mode, QString const& report_sent
, QString const& report_received, QString const& tx_power, QString const& comments , QString const& report_received, QString const& tx_power, QString const& comments
, QString const& name, QDateTime timeOn); , QString const& name, QDateTime time_on);
Q_SIGNAL void clear_decodes (QString const& id); Q_SIGNAL void clear_decodes (QString const& id);
// this signal is emitted when a network error occurs // this signal is emitted when a network error occurs

View File

@ -157,6 +157,7 @@
* Mode utf8 * Mode utf8
* Message utf8 * Message utf8
* Low confidence bool * Low confidence bool
* Off air bool
* *
* The decode message is sent when a new decode is completed, in * The decode message is sent when a new decode is completed, in
* this case the 'New' field is true. It is also used in response * this case the 'New' field is true. It is also used in response
@ -168,7 +169,8 @@
* has knows that a decode has a higher than normal probability * has knows that a decode has a higher than normal probability
* of being false, they should not be reported on publicly * of being false, they should not be reported on publicly
* accessible services without some attached warning or further * accessible services without some attached warning or further
* validation. * validation. Off air decodes are those that result from playing
* back a .WAV file.
* *
* *
* Clear Out 3 quint32 * Clear Out 3 quint32
@ -299,13 +301,16 @@
* Callsign utf8 * Callsign utf8
* Grid utf8 * Grid utf8
* Power (dBm) qint32 * Power (dBm) qint32
* Off air bool
* *
* The decode message is sent when a new decode is completed, in * The decode message is sent when a new decode is completed, in
* this case the 'New' field is true. It is also used in response * this case the 'New' field is true. It is also used in response
* to a "Replay" message where each old decode in the "Band * to a "Replay" message where each old decode in the "Band
* activity" window, that has not been erased, is sent in order * activity" window, that has not been erased, is sent in order
* as a one of these messages with the 'New' field set to * as a one of these messages with the 'New' field set to
* false. See the "Replay" message below for details of usage. * false. See the "Replay" message below for details of
* usage. The off air field indicates that the decode was decoded
* from a played back recording.
* *
* *
*/ */

View File

@ -15,13 +15,19 @@ namespace
QT_TRANSLATE_NOOP ("BeaconsModel", "Callsign"), QT_TRANSLATE_NOOP ("BeaconsModel", "Callsign"),
QT_TRANSLATE_NOOP ("BeaconsModel", "Grid"), QT_TRANSLATE_NOOP ("BeaconsModel", "Grid"),
QT_TRANSLATE_NOOP ("BeaconsModel", "Power"), QT_TRANSLATE_NOOP ("BeaconsModel", "Power"),
QT_TRANSLATE_NOOP ("BeaconsModel", "Live"),
}; };
QString live_string (bool off_air)
{
return off_air ? QT_TRANSLATE_NOOP ("BeaconsModel", "no") : QT_TRANSLATE_NOOP ("BeaconsModel", "yes");
}
QFont text_font {"Courier", 10}; QFont text_font {"Courier", 10};
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
, Frequency frequency, qint32 drift, QString const& callsign , Frequency frequency, qint32 drift, QString const& callsign
, QString const& grid, qint32 power) , QString const& grid, qint32 power, bool off_air)
{ {
auto time_item = new QStandardItem {time.toString ("hh:mm")}; auto time_item = new QStandardItem {time.toString ("hh:mm")};
time_item->setData (time); time_item->setData (time);
@ -50,8 +56,11 @@ namespace
pwr->setData (power); pwr->setData (power);
pwr->setTextAlignment (Qt::AlignRight); pwr->setTextAlignment (Qt::AlignRight);
auto live = new QStandardItem {live_string (off_air)};
live->setTextAlignment (Qt::AlignHCenter);
QList<QStandardItem *> row { QList<QStandardItem *> row {
new QStandardItem {client_id}, time_item, snr_item, dt, freq, dri, new QStandardItem {callsign}, gd, pwr}; new QStandardItem {client_id}, time_item, snr_item, dt, freq, dri, new QStandardItem {callsign}, gd, pwr, live};
Q_FOREACH (auto& item, row) Q_FOREACH (auto& item, row)
{ {
item->setEditable (false); item->setEditable (false);
@ -63,7 +72,7 @@ namespace
} }
BeaconsModel::BeaconsModel (QObject * parent) BeaconsModel::BeaconsModel (QObject * parent)
: QStandardItemModel {0, 9, parent} : QStandardItemModel {0, sizeof (headings) / sizeof (headings[0]), parent}
{ {
int column {0}; int column {0};
for (auto const& heading : headings) for (auto const& heading : headings)
@ -74,7 +83,7 @@ BeaconsModel::BeaconsModel (QObject * parent)
void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
, Frequency frequency, qint32 drift, QString const& callsign , Frequency frequency, qint32 drift, QString const& callsign
, QString const& grid, qint32 power) , QString const& grid, qint32 power, bool off_air)
{ {
if (!is_new) if (!is_new)
{ {
@ -91,7 +100,8 @@ void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime
&& data (index (row, 5)).toInt () == drift && data (index (row, 5)).toInt () == drift
&& data (index (row, 6)).toString () == callsign && data (index (row, 6)).toString () == callsign
&& data (index (row, 7)).toString () == grid && data (index (row, 7)).toString () == grid
&& data (index (row, 8)).toInt () == power) && data (index (row, 8)).toInt () == power
&& data (index (row, 9)).toString () == live_string (off_air))
{ {
return; return;
} }
@ -103,12 +113,12 @@ void BeaconsModel::add_beacon_spot (bool is_new, QString const& client_id, QTime
} }
if (target_row >= 0) if (target_row >= 0)
{ {
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power)); insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power, off_air));
return; return;
} }
} }
appendRow (make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power)); appendRow (make_row (client_id, time, snr, delta_time, frequency, drift, callsign, grid, power, off_air));
} }
void BeaconsModel::clear_decodes (QString const& client_id) void BeaconsModel::clear_decodes (QString const& client_id)

View File

@ -31,7 +31,7 @@ public:
Q_SLOT void add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time Q_SLOT void add_beacon_spot (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
, Frequency frequency, qint32 drift, QString const& callsign, QString const& grid , Frequency frequency, qint32 drift, QString const& callsign, QString const& grid
, qint32 power); , qint32 power, bool off_air);
Q_SLOT void clear_decodes (QString const& client_id); Q_SLOT void clear_decodes (QString const& client_id);
}; };

View File

@ -244,7 +244,7 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const&
void ClientWidget::decode_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/ void ClientWidget::decode_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/
, float /*delta_time*/, quint32 /*delta_frequency*/, QString const& /*mode*/ , float /*delta_time*/, quint32 /*delta_frequency*/, QString const& /*mode*/
, QString const& /*message*/, bool /*low_confidence*/) , QString const& /*message*/, bool /*low_confidence*/, bool /*off_air*/)
{ {
if (client_id == id_) if (client_id == id_)
{ {
@ -256,7 +256,8 @@ void ClientWidget::decode_added (bool /*is_new*/, QString const& client_id, QTim
void ClientWidget::beacon_spot_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/ void ClientWidget::beacon_spot_added (bool /*is_new*/, QString const& client_id, QTime /*time*/, qint32 /*snr*/
, float /*delta_time*/, Frequency /*delta_frequency*/, qint32 /*drift*/ , float /*delta_time*/, Frequency /*delta_frequency*/, qint32 /*drift*/
, QString const& /*callsign*/, QString const& /*grid*/, qint32 /*power*/) , QString const& /*callsign*/, QString const& /*grid*/, qint32 /*power*/
, bool /*off_air*/)
{ {
if (client_id == id_) if (client_id == id_)
{ {

View File

@ -33,10 +33,11 @@ public:
, bool watchdog_timeout, QString const& sub_mode, bool fast_mode); , bool watchdog_timeout, QString const& sub_mode, bool fast_mode);
Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr
, float delta_time, quint32 delta_frequency, QString const& mode , float delta_time, quint32 delta_frequency, QString const& mode
, QString const& message, bool low_confidence); , QString const& message, bool low_confidence, bool off_air);
Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime, qint32 snr Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime, qint32 snr
, float delta_time, Frequency delta_frequency, qint32 drift , float delta_time, Frequency delta_frequency, qint32 drift
, QString const& callsign, QString const& grid, qint32 power); , QString const& callsign, QString const& grid, qint32 power
, bool off_air);
Q_SIGNAL void do_reply (QModelIndex const&); Q_SIGNAL void do_reply (QModelIndex const&);
Q_SIGNAL void do_halt_tx (QString const& id, bool auto_only); Q_SIGNAL void do_halt_tx (QString const& id, bool auto_only);

View File

@ -18,6 +18,7 @@ namespace
QT_TRANSLATE_NOOP ("DecodesModel", "Md"), QT_TRANSLATE_NOOP ("DecodesModel", "Md"),
QT_TRANSLATE_NOOP ("DecodesModel", "Message"), QT_TRANSLATE_NOOP ("DecodesModel", "Message"),
QT_TRANSLATE_NOOP ("DecodesModel", "Confidence"), QT_TRANSLATE_NOOP ("DecodesModel", "Confidence"),
QT_TRANSLATE_NOOP ("DecodesModel", "Live"),
}; };
QString confidence_string (bool low_confidence) QString confidence_string (bool low_confidence)
@ -25,11 +26,16 @@ namespace
return low_confidence ? QT_TRANSLATE_NOOP ("DecodesModel", "low") : QT_TRANSLATE_NOOP ("DecodesModel", "high"); return low_confidence ? QT_TRANSLATE_NOOP ("DecodesModel", "low") : QT_TRANSLATE_NOOP ("DecodesModel", "high");
} }
QString live_string (bool off_air)
{
return off_air ? QT_TRANSLATE_NOOP ("DecodesModel", "no") : QT_TRANSLATE_NOOP ("DecodesModel", "yes");
}
QFont text_font {"Courier", 10}; QFont text_font {"Courier", 10};
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
, quint32 delta_frequency, QString const& mode, QString const& message , quint32 delta_frequency, QString const& mode, QString const& message
, bool low_confidence, bool is_fast) , bool low_confidence, bool off_air, bool is_fast)
{ {
auto time_item = new QStandardItem {time.toString (is_fast || "~" == mode ? "hh:mm:ss" : "hh:mm")}; auto time_item = new QStandardItem {time.toString (is_fast || "~" == mode ? "hh:mm:ss" : "hh:mm")};
time_item->setData (time); time_item->setData (time);
@ -53,8 +59,11 @@ namespace
auto confidence = new QStandardItem {confidence_string (low_confidence)}; auto confidence = new QStandardItem {confidence_string (low_confidence)};
confidence->setTextAlignment (Qt::AlignHCenter); confidence->setTextAlignment (Qt::AlignHCenter);
auto live = new QStandardItem {live_string (off_air)};
live->setTextAlignment (Qt::AlignHCenter);
QList<QStandardItem *> row { QList<QStandardItem *> row {
new QStandardItem {client_id}, time_item, snr_item, dt, df, md, new QStandardItem {message}, confidence}; new QStandardItem {client_id}, time_item, snr_item, dt, df, md, new QStandardItem {message}, confidence, live};
Q_FOREACH (auto& item, row) Q_FOREACH (auto& item, row)
{ {
item->setEditable (false); item->setEditable (false);
@ -77,7 +86,7 @@ DecodesModel::DecodesModel (QObject * parent)
void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
, quint32 delta_frequency, QString const& mode, QString const& message , quint32 delta_frequency, QString const& mode, QString const& message
, bool low_confidence, bool is_fast) , bool low_confidence, bool off_air, bool is_fast)
{ {
if (!is_new) if (!is_new)
{ {
@ -93,7 +102,8 @@ void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time
&& item (row, 4)->data ().toUInt () == delta_frequency && item (row, 4)->data ().toUInt () == delta_frequency
&& data (index (row, 5)).toString () == mode && data (index (row, 5)).toString () == mode
&& data (index (row, 6)).toString () == message && data (index (row, 6)).toString () == message
&& data (index (row, 7)).toString () == confidence_string (low_confidence)) && data (index (row, 7)).toString () == confidence_string (low_confidence)
&& data (index (row, 8)).toString () == live_string (off_air))
{ {
return; return;
} }
@ -106,12 +116,13 @@ void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time
if (target_row >= 0) if (target_row >= 0)
{ {
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, delta_frequency, mode insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, delta_frequency, mode
, message, low_confidence, is_fast)); , message, low_confidence, off_air, is_fast));
return; return;
} }
} }
appendRow (make_row (client_id, time, snr, delta_time, delta_frequency, mode, message, low_confidence, is_fast)); appendRow (make_row (client_id, time, snr, delta_time, delta_frequency, mode, message, low_confidence
, off_air, is_fast));
} }
void DecodesModel::clear_decodes (QString const& client_id) void DecodesModel::clear_decodes (QString const& client_id)

View File

@ -33,7 +33,7 @@ public:
Q_SLOT void add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time Q_SLOT void add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
, quint32 delta_frequency, QString const& mode, QString const& message , quint32 delta_frequency, QString const& mode, QString const& message
, bool low_confidence, bool is_fast); , bool low_confidence, bool off_air, bool is_fast);
Q_SLOT void clear_decodes (QString const& client_id); Q_SLOT void clear_decodes (QString const& client_id);
Q_SLOT void do_reply (QModelIndex const& source); Q_SLOT void do_reply (QModelIndex const& source);

View File

@ -91,9 +91,10 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
connect (server_, &MessageServer::decode, [this] (bool is_new, QString const& id, QTime time connect (server_, &MessageServer::decode, [this] (bool is_new, QString const& id, QTime time
, qint32 snr, float delta_time , qint32 snr, float delta_time
, quint32 delta_frequency, QString const& mode , quint32 delta_frequency, QString const& mode
, QString const& message, bool low_confidence) { , QString const& message, bool low_confidence
, bool off_air) {
decodes_model_->add_decode (is_new, id, time, snr, delta_time, delta_frequency, mode, message decodes_model_->add_decode (is_new, id, time, snr, delta_time, delta_frequency, mode, message
, low_confidence, dock_widgets_[id]->fast_mode ());}); , low_confidence, off_air, dock_widgets_[id]->fast_mode ());});
connect (server_, &MessageServer::WSPR_decode, beacons_model_, &BeaconsModel::add_beacon_spot); connect (server_, &MessageServer::WSPR_decode, beacons_model_, &BeaconsModel::add_beacon_spot);
connect (server_, &MessageServer::clear_decodes, decodes_model_, &DecodesModel::clear_decodes); connect (server_, &MessageServer::clear_decodes, decodes_model_, &DecodesModel::clear_decodes);
connect (server_, &MessageServer::clear_decodes, beacons_model_, &BeaconsModel::clear_decodes); connect (server_, &MessageServer::clear_decodes, beacons_model_, &BeaconsModel::clear_decodes);
@ -110,14 +111,14 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
show (); show ();
} }
void MessageAggregatorMainWindow::log_qso (QString const& /*id*/, QDateTime timeOff, QString const& dx_call, QString const& dx_grid void MessageAggregatorMainWindow::log_qso (QString const& /*id*/, QDateTime time_off, QString const& dx_call, QString const& dx_grid
, Frequency dial_frequency, QString const& mode, QString const& report_sent , Frequency dial_frequency, QString const& mode, QString const& report_sent
, QString const& report_received, QString const& tx_power, QString const& comments , QString const& report_received, QString const& tx_power, QString const& comments
, QString const& name, QDateTime timeOn) , QString const& name, QDateTime time_on)
{ {
QList<QStandardItem *> row; QList<QStandardItem *> row;
row << new QStandardItem {timeOn.toString ("dd-MMM-yyyy hh:mm:ss")} row << new QStandardItem {time_on.toString ("dd-MMM-yyyy hh:mm:ss")}
<< new QStandardItem {timeOff.toString ("dd-MMM-yyyy hh:mm:ss")} << new QStandardItem {time_off.toString ("dd-MMM-yyyy hh:mm:ss")}
<< new QStandardItem {dx_call} << new QStandardItem {dx_call}
<< new QStandardItem {dx_grid} << new QStandardItem {dx_grid}
<< new QStandardItem {name} << new QStandardItem {name}

View File

@ -26,10 +26,10 @@ class MessageAggregatorMainWindow
public: public:
MessageAggregatorMainWindow (); MessageAggregatorMainWindow ();
Q_SLOT void log_qso (QString const& /*id*/, QDateTime timeOff, QString const& dx_call, QString const& dx_grid Q_SLOT void log_qso (QString const& /*id*/, QDateTime time_off, QString const& dx_call, QString const& dx_grid
, Frequency dial_frequency, QString const& mode, QString const& report_sent , Frequency dial_frequency, QString const& mode, QString const& report_sent
, QString const& report_received, QString const& tx_power, QString const& comments , QString const& report_received, QString const& tx_power, QString const& comments
, QString const& name, QDateTime timeOn); , QString const& name, QDateTime time_on);
private: private:
void add_client (QString const& id, QString const& version, QString const& revision); void add_client (QString const& id, QString const& version, QString const& revision);

View File

@ -68,28 +68,30 @@ public:
} }
Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime time, qint32 snr Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime time, qint32 snr
, float delta_time, quint32 delta_frequency, QString const& mode , float delta_time, quint32 delta_frequency, QString const& mode
, QString const& message, bool low_confidence) , QString const& message, bool low_confidence, bool off_air)
{ {
if (client_id == id_) if (client_id == id_)
{ {
qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr
<< "Dt:" << delta_time << "Df:" << delta_frequency << "Dt:" << delta_time << "Df:" << delta_frequency
<< "mode:" << mode << "Confidence:" << (low_confidence ? "low" : "high"); << "mode:" << mode << "Confidence:" << (low_confidence ? "low" : "high")
<< "On air:" << !off_air;
std::cout << tr ("%1: Decoded %2").arg (id_).arg (message).toStdString () << std::endl; std::cout << tr ("%1: Decoded %2").arg (id_).arg (message).toStdString () << std::endl;
} }
} }
Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime time, qint32 snr Q_SLOT void beacon_spot_added (bool is_new, QString const& client_id, QTime time, qint32 snr
, float delta_time, Frequency delta_frequency, qint32 drift, QString const& callsign , float delta_time, Frequency delta_frequency, qint32 drift, QString const& callsign
, QString const& grid, qint32 power) , QString const& grid, qint32 power, bool off_air)
{ {
if (client_id == id_) if (client_id == id_)
{ {
qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr
<< "Dt:" << delta_time << "Df:" << delta_frequency << "Dt:" << delta_time << "Df:" << delta_frequency
<< "drift:" << drift; << "drift:" << drift;
std::cout << tr ("%1: WSPR decode %2 grid %3 power: %4").arg (id_).arg (callsign).arg (grid).arg (power).toStdString () << std::endl; std::cout << tr ("%1: WSPR decode %2 grid %3 power: %4").arg (id_).arg (callsign).arg (grid).arg (power).toStdString ()
<< "On air:" << !off_air << std::endl;
} }
} }

View File

@ -6197,7 +6197,7 @@ void MainWindow::postDecode (bool is_new, QString const& message)
{ {
auto const& decode = message.trimmed (); auto const& decode = message.trimmed ();
auto const& parts = decode.left (22).split (' ', QString::SkipEmptyParts); auto const& parts = decode.left (22).split (' ', QString::SkipEmptyParts);
if (!m_diskData && parts.size () >= 5) if (parts.size () >= 5)
{ {
auto has_seconds = parts[0].size () > 4; auto has_seconds = parts[0].size () > 4;
m_messageClient->decode (is_new m_messageClient->decode (is_new
@ -6205,7 +6205,8 @@ void MainWindow::postDecode (bool is_new, QString const& message)
, parts[1].toInt () , parts[1].toInt ()
, parts[2].toFloat (), parts[3].toUInt (), parts[4][0] , parts[2].toFloat (), parts[3].toUInt (), parts[4][0]
, decode.mid (has_seconds ? 24 : 22, 21) , decode.mid (has_seconds ? 24 : 22, 21)
, QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1)); , QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1)
, m_diskData);
} }
} }
@ -6217,7 +6218,8 @@ void MainWindow::postWSPRDecode (bool is_new, QStringList parts)
} }
m_messageClient->WSPR_decode (is_new, QTime::fromString (parts[0], "hhmm"), parts[1].toInt () m_messageClient->WSPR_decode (is_new, QTime::fromString (parts[0], "hhmm"), parts[1].toInt ()
, parts[2].toFloat (), Radio::frequency (parts[3].toFloat (), 6) , parts[2].toFloat (), Radio::frequency (parts[3].toFloat (), 6)
, parts[4].toInt (), parts[5], parts[6], parts[7].toInt ()); , parts[4].toInt (), parts[5], parts[6], parts[7].toInt ()
, m_diskData);
} }
void MainWindow::networkError (QString const& e) void MainWindow::networkError (QString const& e)