mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-08-27 08:36:36 -04:00
Build now creates and installs a UDP library that contains the server side of the UDP messaging facility. This library is used by the udp_daemon and message_aggregator reference examples. The new library is currently a static archive but can also be built as a shared library. The library allows third party Qt applications to easily access UDP messages from WSJT-X. Refactored the message_aggregator reference example to split out classes into separate translation units. Added new functionality to exercise the new UDP status fields, highlight own call, CQ/QRZ messages and decodes near Rx DF. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6691 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
91 lines
3.4 KiB
C++
91 lines
3.4 KiB
C++
//
|
|
// MessageAggregator - an example application that utilizes the WSJT-X
|
|
// messaging facility
|
|
//
|
|
// This application is only provided as a simple GUI application
|
|
// example to demonstrate the WSJT-X messaging facility. It allows the
|
|
// user to set the server details either as a unicast UDP server or,
|
|
// if a multicast group address is provided, as a multicast server.
|
|
// The benefit of the multicast server is that multiple servers can be
|
|
// active at once each receiving all WSJT-X broadcast messages and
|
|
// each able to respond to individual WSJT_X clients. To utilize the
|
|
// multicast group features each WSJT-X client must set the same
|
|
// multicast group address as the UDP server address for example
|
|
// 239.255.0.0 for a site local multicast group.
|
|
//
|
|
// The UI is a small panel to input the service port number and
|
|
// optionally the multicast group address. Below that a table
|
|
// representing the log entries where any QSO logged messages
|
|
// broadcast from WSJT-X clients are displayed. The bottom of the
|
|
// application main window is a dock area where a dock window will
|
|
// appear for each WSJT-X client, this window contains a table of the
|
|
// current decode messages broadcast from that WSJT-X client and a
|
|
// status line showing the status update messages broadcast from the
|
|
// WSJT-X client. The dock windows may be arranged in a tab bar, side
|
|
// by side, below each other or, completely detached from the dock
|
|
// area as floating windows. Double clicking the dock window title bar
|
|
// or dragging and dropping with the mouse allows these different
|
|
// arrangements.
|
|
//
|
|
// The application also provides a simple menu bar including a view
|
|
// menu that allows each dock window to be hidden or revealed.
|
|
//
|
|
|
|
#include <clocale>
|
|
#include <iostream>
|
|
#include <exception>
|
|
|
|
#include <QFile>
|
|
#include <QApplication>
|
|
#include <QMessageBox>
|
|
#include <QObject>
|
|
|
|
#include "MessageAggregatorMainWindow.hpp"
|
|
|
|
// deduce the size of an array
|
|
template<class T, size_t N>
|
|
inline
|
|
size_t size (T (&)[N]) {return N;}
|
|
|
|
int main (int argc, char * argv[])
|
|
{
|
|
QApplication app {argc, argv};
|
|
try
|
|
{
|
|
setlocale (LC_NUMERIC, "C"); // ensure number forms are in
|
|
// consistent format, do this after
|
|
// instantiating QApplication so
|
|
// that GUI has correct l18n
|
|
|
|
app.setApplicationName ("WSJT-X Reference UDP Message Aggregator Server");
|
|
app.setApplicationVersion ("1.0");
|
|
|
|
QObject::connect (&app, SIGNAL (lastWindowClosed ()), &app, SLOT (quit ()));
|
|
|
|
{
|
|
QFile file {":/qss/default.qss"};
|
|
if (!file.open (QFile::ReadOnly))
|
|
{
|
|
throw std::runtime_error {
|
|
QString {"failed to open \"" + file.fileName () + "\": " + file.errorString ()}
|
|
.toLocal8Bit ().constData ()};
|
|
}
|
|
app.setStyleSheet (file.readAll());
|
|
}
|
|
|
|
MessageAggregatorMainWindow window;
|
|
return app.exec ();
|
|
}
|
|
catch (std::exception const & e)
|
|
{
|
|
QMessageBox::critical (nullptr, app.applicationName (), e.what ());
|
|
std::cerr << "Error: " << e.what () << '\n';
|
|
}
|
|
catch (...)
|
|
{
|
|
QMessageBox::critical (nullptr, app.applicationName (), QObject::tr ("Unexpected error"));
|
|
std::cerr << "Unexpected error\n";
|
|
}
|
|
return -1;
|
|
}
|