Restructuring message client for external api with a python example

This commit is contained in:
Jordan Sherer 2018-08-07 11:40:02 -04:00
parent edf85a1e5f
commit 80ed587514
5 changed files with 75 additions and 3 deletions

View File

@ -138,6 +138,10 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
{ {
try try
{ {
qDebug() << "incoming udp message" << msg;
#if 0
// //
// message format is described in NetworkMessage.hpp // message format is described in NetworkMessage.hpp
// //
@ -157,6 +161,7 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
{ {
case NetworkMessage::Reply: case NetworkMessage::Reply:
{ {
#if 0
// unpack message // unpack message
QTime time; QTime time;
qint32 snr; qint32 snr;
@ -174,30 +179,38 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
, QString::fromUtf8 (mode), QString::fromUtf8 (message) , QString::fromUtf8 (mode), QString::fromUtf8 (message)
, low_confidence, modifiers); , low_confidence, modifiers);
} }
#endif
} }
break; break;
case NetworkMessage::Replay: case NetworkMessage::Replay:
{
#if 0
if (check_status (in) != Fail) if (check_status (in) != Fail)
{ {
last_message_.clear (); last_message_.clear ();
Q_EMIT self_->replay (); Q_EMIT self_->replay ();
} }
#endif
}
break; break;
case NetworkMessage::HaltTx: case NetworkMessage::HaltTx:
{ {
#if 0
bool auto_only {false}; bool auto_only {false};
in >> auto_only; in >> auto_only;
if (check_status (in) != Fail) if (check_status (in) != Fail)
{ {
Q_EMIT self_->halt_tx (auto_only); Q_EMIT self_->halt_tx (auto_only);
} }
#endif
} }
break; break;
case NetworkMessage::FreeText: case NetworkMessage::FreeText:
{ {
#if 0
QByteArray message; QByteArray message;
bool send {true}; bool send {true};
in >> message >> send; in >> message >> send;
@ -205,22 +218,26 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
{ {
Q_EMIT self_->free_text (QString::fromUtf8 (message), send); Q_EMIT self_->free_text (QString::fromUtf8 (message), send);
} }
#endif
} }
break; break;
case NetworkMessage::Location: case NetworkMessage::Location:
{ {
#if 0
QByteArray location; QByteArray location;
in >> location; in >> location;
if (check_status (in) != Fail) if (check_status (in) != Fail)
{ {
Q_EMIT self_->location (QString::fromUtf8 (location)); Q_EMIT self_->location (QString::fromUtf8 (location));
} }
#endif
} }
break; break;
case NetworkMessage::HighlightCallsign: case NetworkMessage::HighlightCallsign:
{ {
#if 0
QByteArray call; QByteArray call;
QColor bg; // default invalid color QColor bg; // default invalid color
QColor fg; // default invalid color QColor fg; // default invalid color
@ -230,6 +247,7 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
{ {
Q_EMIT self_->highlight_callsign (QString::fromUtf8 (call), bg, fg, last_only); Q_EMIT self_->highlight_callsign (QString::fromUtf8 (call), bg, fg, last_only);
} }
#endif
} }
break; break;
@ -243,6 +261,7 @@ void MessageClient::impl::parse_message (QByteArray const& msg)
break; break;
} }
} }
#endif
} }
catch (std::exception const& e) catch (std::exception const& e)
{ {
@ -264,6 +283,7 @@ void MessageClient::impl::heartbeat ()
<< version_.toUtf8 () << revision_.toUtf8 (); << version_.toUtf8 () << revision_.toUtf8 ();
if (OK == check_status (hb)) if (OK == check_status (hb))
{ {
qDebug() << "outgoing udp heartbeat message" << message;
writeDatagram (message, server_, server_port_); writeDatagram (message, server_, server_port_);
} }
} }
@ -277,6 +297,7 @@ void MessageClient::impl::closedown ()
NetworkMessage::Builder out {&message, NetworkMessage::Close, id_, schema_}; NetworkMessage::Builder out {&message, NetworkMessage::Close, id_, schema_};
if (OK == check_status (out)) if (OK == check_status (out))
{ {
qDebug() << "outgoing udp closedown message" << message;
writeDatagram (message, server_, server_port_); writeDatagram (message, server_, server_port_);
} }
} }
@ -290,6 +311,7 @@ void MessageClient::impl::send_message (QByteArray const& message)
{ {
if (message != last_message_) // avoid duplicates if (message != last_message_) // avoid duplicates
{ {
qDebug() << "outgoing udp message" << message;
writeDatagram (message, server_, server_port_); writeDatagram (message, server_, server_port_);
last_message_ = message; last_message_ = message;
} }
@ -398,6 +420,7 @@ void MessageClient::add_blocked_destination (QHostAddress const& a)
} }
} }
#if 0
void MessageClient::status_update (Frequency f, QString const& mode, QString const& dx_call void MessageClient::status_update (Frequency f, QString const& mode, QString const& dx_call
, QString const& report, QString const& tx_mode , QString const& report, QString const& tx_mode
, bool tx_enabled, bool transmitting, bool decoding , bool tx_enabled, bool transmitting, bool decoding
@ -485,3 +508,4 @@ void MessageClient::logged_ADIF (QByteArray const& ADIF_record)
m_->send_message (out, message); m_->send_message (out, message);
} }
} }
#endif

View File

@ -48,6 +48,7 @@ public:
Q_SLOT void set_server_port (port_type server_port = 0u); Q_SLOT void set_server_port (port_type server_port = 0u);
// outgoing messages // outgoing messages
#if 0
Q_SLOT void status_update (Frequency, QString const& mode, QString const& dx_call, QString const& report Q_SLOT void status_update (Frequency, QString const& mode, QString const& dx_call, QString const& report
, QString const& tx_mode, bool tx_enabled, bool transmitting, bool decoding , QString const& tx_mode, bool tx_enabled, bool transmitting, bool decoding
, qint32 rx_df, qint32 tx_df, QString const& de_call, QString const& de_grid , qint32 rx_df, qint32 tx_df, QString const& de_call, QString const& de_grid
@ -69,6 +70,7 @@ public:
// ADIF_record argument should be valid ADIF excluding any <EOR> end // ADIF_record argument should be valid ADIF excluding any <EOR> end
// of record marker // of record marker
Q_SLOT void logged_ADIF (QByteArray const& ADIF_record); Q_SLOT void logged_ADIF (QByteArray const& ADIF_record);
#endif
// 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
@ -79,6 +81,7 @@ public:
// with send_raw_datagram() above) // with send_raw_datagram() above)
Q_SLOT void add_blocked_destination (QHostAddress const&); Q_SLOT void add_blocked_destination (QHostAddress const&);
#if 0
// this signal is emitted if the server sends us a reply, the only // this signal is emitted if the server sends us a reply, the only
// reply supported is reply to a prior CQ or QRZ message // reply supported is reply to a prior CQ or QRZ message
Q_SIGNAL void reply (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode Q_SIGNAL void reply (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode
@ -99,15 +102,18 @@ public:
// this signal is emitted if the server has sent a highlight // this signal is emitted if the server has sent a highlight
// callsign request for the specified call // callsign request for the specified call
Q_SIGNAL void highlight_callsign (QString const& callsign, QColor const& bg, QColor const& fg, bool last_only); Q_SIGNAL void highlight_callsign (QString const& callsign, QColor const& bg, QColor const& fg, bool last_only);
#endif
// this signal is emitted when network errors occur or if a host // this signal is emitted when network errors occur or if a host
// lookup fails // lookup fails
Q_SIGNAL void error (QString const&) const; Q_SIGNAL void error (QString const&) const;
#if 0
// this signal is emitted if the message obtains a location from a // this signal is emitted if the message obtains a location from a
// server. (It doesn't have to be new, could be a periodic location // server. (It doesn't have to be new, could be a periodic location
// update) // update)
Q_SIGNAL void location (QString const&); Q_SIGNAL void location (QString const&);
#endif
private: private:
class impl; class impl;

View File

@ -544,7 +544,11 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect (m_logDlg.data (), &LogQSO::acceptQSO, this, &MainWindow::acceptQSO); connect (m_logDlg.data (), &LogQSO::acceptQSO, this, &MainWindow::acceptQSO);
connect (this, &MainWindow::finished, m_logDlg.data (), &LogQSO::close); connect (this, &MainWindow::finished, m_logDlg.data (), &LogQSO::close);
// Network message handlers // Network message handlers
connect (m_messageClient, &MessageClient::error, this, &MainWindow::networkError);
#if 0
connect (m_messageClient, &MessageClient::reply, this, &MainWindow::replyToCQ); connect (m_messageClient, &MessageClient::reply, this, &MainWindow::replyToCQ);
connect (m_messageClient, &MessageClient::replay, this, &MainWindow::replayDecodes); connect (m_messageClient, &MessageClient::replay, this, &MainWindow::replayDecodes);
connect (m_messageClient, &MessageClient::location, this, &MainWindow::locationChange); connect (m_messageClient, &MessageClient::location, this, &MainWindow::locationChange);
@ -559,7 +563,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
} }
} }
}); });
connect (m_messageClient, &MessageClient::error, this, &MainWindow::networkError);
connect (m_messageClient, &MessageClient::free_text, [this] (QString const& text, bool send) { connect (m_messageClient, &MessageClient::free_text, [this] (QString const& text, bool send) {
if (m_config.accept_udp_requests ()) { if (m_config.accept_udp_requests ()) {
tx_watchdog (false); tx_watchdog (false);
@ -598,6 +601,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
, &m_WSPR_band_hopping, &WSPRBandHopping::show_dialog); , &m_WSPR_band_hopping, &WSPRBandHopping::show_dialog);
connect (ui->sbTxPercent, static_cast<void (QSpinBox::*) (int)> (&QSpinBox::valueChanged) connect (ui->sbTxPercent, static_cast<void (QSpinBox::*) (int)> (&QSpinBox::valueChanged)
, &m_WSPR_band_hopping, &WSPRBandHopping::set_tx_percent); , &m_WSPR_band_hopping, &WSPRBandHopping::set_tx_percent);
#endif
on_EraseButton_clicked (); on_EraseButton_clicked ();
@ -3745,7 +3750,9 @@ void MainWindow::on_EraseButton_clicked ()
void MainWindow::band_activity_cleared () void MainWindow::band_activity_cleared ()
{ {
#if 0
m_messageClient->clear_decodes (); m_messageClient->clear_decodes ();
#endif
QFile f(m_config.temp_dir ().absoluteFilePath ("decoded.txt")); QFile f(m_config.temp_dir ().absoluteFilePath ("decoded.txt"));
if(f.exists()) f.remove(); if(f.exists()) f.remove();
} }
@ -6333,8 +6340,10 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call,
QString date = QSO_date_on.toString("yyyyMMdd"); QString date = QSO_date_on.toString("yyyyMMdd");
m_logBook.addAsWorked (m_hisCall, m_config.bands ()->find (m_freqNominal), m_modeTx, date); m_logBook.addAsWorked (m_hisCall, m_config.bands ()->find (m_freqNominal), m_modeTx, date);
#if 0
m_messageClient->qso_logged (QSO_date_off, call, grid, dial_freq, mode, rpt_sent, rpt_received, tx_power, comments, name, QSO_date_on, operator_call, my_call, my_grid); m_messageClient->qso_logged (QSO_date_off, call, grid, dial_freq, mode, rpt_sent, rpt_received, tx_power, comments, name, QSO_date_on, operator_call, my_call, my_grid);
m_messageClient->logged_ADIF (ADIF); m_messageClient->logged_ADIF (ADIF);
#endif
if (m_config.clear_DX () and !m_config.bHound()) clearDX (); if (m_config.clear_DX () and !m_config.bHound()) clearDX ();
m_dateTimeQSOOn = QDateTime {}; m_dateTimeQSOOn = QDateTime {};
} }
@ -8158,6 +8167,7 @@ void MainWindow::replayDecodes ()
void MainWindow::postDecode (bool is_new, QString const& message) void MainWindow::postDecode (bool is_new, QString const& message)
{ {
#if 0
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 (parts.size () >= 5) if (parts.size () >= 5)
@ -8171,6 +8181,7 @@ void MainWindow::postDecode (bool is_new, QString const& message)
, QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1) , QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1)
, m_diskData); , m_diskData);
} }
#endif
if(is_new){ if(is_new){
m_rxDirty = true; m_rxDirty = true;
@ -8963,10 +8974,12 @@ void MainWindow::postWSPRDecode (bool is_new, QStringList parts)
{ {
parts.insert (6, ""); parts.insert (6, "");
} }
#if 0
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); , m_diskData);
#endif
} }
void MainWindow::networkError (QString const& e) void MainWindow::networkError (QString const& e)
@ -9398,6 +9411,7 @@ void MainWindow::statusUpdate () const
{ {
if (!ui) return; if (!ui) return;
auto submode = current_submode (); auto submode = current_submode ();
#if 0
m_messageClient->status_update (m_freqNominal, m_mode, m_hisCall, m_messageClient->status_update (m_freqNominal, m_mode, m_hisCall,
QString::number (ui->rptSpinBox->value ()), QString::number (ui->rptSpinBox->value ()),
m_modeTx, ui->autoButton->isChecked (), m_modeTx, ui->autoButton->isChecked (),
@ -9406,6 +9420,7 @@ void MainWindow::statusUpdate () const
m_config.my_callsign (), m_config.my_grid (), m_config.my_callsign (), m_config.my_grid (),
m_hisGrid, m_tx_watchdog, m_hisGrid, m_tx_watchdog,
submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode); submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode);
#endif
} }
void MainWindow::childEvent (QChildEvent * e) void MainWindow::childEvent (QChildEvent * e)

23
udp.py Normal file
View File

@ -0,0 +1,23 @@
from __future__ import print_function
from socket import socket, AF_INET, SOCK_DGRAM
listen = ('127.0.0.1', 2237)
def main():
sock = socket(AF_INET, SOCK_DGRAM)
print("listening on", ':'.join(map(str, listen)))
sock.bind(listen)
try:
while True:
content, addr = sock.recvfrom(1024)
print("from:", ":".join(map(str, addr)))
print("->", repr(content))
print("sending test reply...", end="")
sock.sendto("test", addr)
print("done")
finally:
sock.close()
if __name__ == '__main__':
main()

View File

@ -68,7 +68,9 @@ SOURCES += \
WSPRBandHopping.cpp MessageAggregator.cpp SampleDownloader.cpp qt_helpers.cpp\ WSPRBandHopping.cpp MessageAggregator.cpp SampleDownloader.cpp qt_helpers.cpp\
MultiSettings.cpp PhaseEqualizationDialog.cpp IARURegions.cpp MessageBox.cpp \ MultiSettings.cpp PhaseEqualizationDialog.cpp IARURegions.cpp MessageBox.cpp \
EqualizationToolsDialog.cpp \ EqualizationToolsDialog.cpp \
varicode.cpp varicode.cpp \
NetworkMessage.cpp \
MessageClient.cpp
HEADERS += qt_helpers.hpp \ HEADERS += qt_helpers.hpp \
pimpl_h.hpp pimpl_impl.hpp \ pimpl_h.hpp pimpl_impl.hpp \
@ -88,7 +90,9 @@ HEADERS += qt_helpers.hpp \
qorderedmap.h \ qorderedmap.h \
varicode.h \ varicode.h \
qpriorityqueue.h \ qpriorityqueue.h \
crc.h crc.h \
NetworkMessage.hpp \
MessageClient.hpp
INCLUDEPATH += qmake_only INCLUDEPATH += qmake_only