From fb9e7acd8e31d090c17ed4347b890bec5fa422f3 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Jan 2014 15:27:29 +0100 Subject: [PATCH 1/6] Allows to change IP address and port in the sample. This issue was mentioned in the 1st premerge review of MS. Disclaimer: As this is an sample, there is no validation as for valid IP, port. --- samples/blackmiscdbus/main.cpp | 90 ++++++++++++++++++++++----- samples/blackmiscdbus/servicetool.cpp | 2 +- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/samples/blackmiscdbus/main.cpp b/samples/blackmiscdbus/main.cpp index 84edf08e4..f03499103 100644 --- a/samples/blackmiscdbus/main.cpp +++ b/samples/blackmiscdbus/main.cpp @@ -33,28 +33,81 @@ int main(int argc, char *argv[]) } // some runtime settings + QString ip = "192.168.0.133"; + QString port = "45000"; const QString executable = QString(cmdlineArgs.at(0)); // used as command to fork myself const bool clientFlag = cmdlineArgs.contains("client", Qt::CaseInsensitive); - const bool useSessionBusForServer = cmdlineArgs.contains("session", Qt::CaseInsensitive); // flag for session bus - QString address(useSessionBusForServer ? "session" : "tcp:host=192.168.0.133,port=45000"); // testing with real transfer - // loopback 127.0.0.1 + bool useSessionBusForServer; + if (cmdlineArgs.contains("session", Qt::CaseInsensitive)) + { + // session mode + useSessionBusForServer = true; + } + else + { + // TCP/IP mode + useSessionBusForServer = false; + if (cmdlineArgs.length() > 2) + { + ip = cmdlineArgs.at(1); + port = cmdlineArgs.at(2); + } + } + QString addressTcp = QString("tcp:host=%1,port=%2").arg(ip).arg(port); + QString address(useSessionBusForServer ? "session" : addressTcp); // testing with real transfer // Create a Testservice instance and register it with the session bus only if // the service isn't already available. if (!clientFlag) { // Configure tests - qDebug() << "1 .. Run testservice to test data transfer" << address; - qDebug() << "1sb. Run testservice via session bus"; - qDebug() << "2 .. Data context example (via TCP)" << address; - qDebug() << "2sb. Data context example (via session bus)"; - qDebug() << "3 .. Data context example, only server (via TCP)" << address; - qDebug() << "3sb. Data context example, only server (via session bus)"; + Menu: + qDebug() << "1 .. Run testservice to test data transfer" << addressTcp; + qDebug() << "1sb. Run testservice via session bus"; + qDebug() << "2 .. Data context example (via TCP)" << addressTcp; + qDebug() << "2sb. Data context example (via session bus)"; + qDebug() << "3 .. Data context example, only server (via TCP)" << addressTcp; + qDebug() << "3sb. Data context example, only server (via session bus)"; + qDebug() << "----- Change address / port (no validation, do before starting server)"; + qDebug() << "loop Address to loopback, 127.0.0.1"; + qDebug() << "ip some IP address, e.g 192.168.100.100"; + qDebug() << "port some port, e.g 12345"; + qDebug() << "-----"; qDebug() << "x .. Bye"; QTextStream qtin(stdin); - QString mode = qtin.readLine().toLower(); - bool startServer = !mode.startsWith('3'); + QString mode = qtin.readLine().toLower().trimmed(); + + if (mode.startsWith("l")) + { + ip = "127.0.0.1"; + addressTcp = QString("tcp:host=%1,port=%2").arg(ip).arg(port); + goto Menu; + } + if (mode.startsWith("i")) + { + QStringList p = mode.split(QRegExp("\\s")); + if (p.length() > 1) + { + ip = p.at(1); + addressTcp = QString("tcp:host=%1,port=%2").arg(ip).arg(port); + } + goto Menu; + } + if (mode.startsWith("p")) + { + QStringList p = mode.split(QRegExp("\\s")); + if (p.length() > 1) + { + port = p.at(1); + addressTcp = QString("tcp:host=%1,port=%2").arg(ip).arg(port); + } + goto Menu; + } + + // start DBus + address = QString(useSessionBusForServer ? "session" : addressTcp); // testing with real transfer + bool startClient = !mode.startsWith('3'); if (mode.contains("sb", Qt::CaseInsensitive)) address = "session"; if (mode.startsWith("1")) { @@ -71,6 +124,8 @@ int main(int argc, char *argv[]) // I know I am in the "server process here", so I can safely create a CDBusServer // this runs in the original process and can be directly debugged + qDebug(); + qDebug("--------------------------------------------------------"); BlackCore::CDBusServer *dBusServer = new BlackCore::CDBusServer(useSessionBusForServer ? "session" : address); qDebug() << "server" << dBusServer->address() << "connected:" << dBusServer->isConnected(); @@ -78,9 +133,16 @@ int main(int argc, char *argv[]) QStringList args; args << "client"; args << mode; - if (address == "session") args << address; - - if (startServer) BlackMiscTest::ServiceTool::startNewProcess(executable, args, &a); + if (address == "session") + { + args << address; // set session as cmd arg + } + else + { + args << ip; + args << port; + } + if (startClient) BlackMiscTest::ServiceTool::startNewProcess(executable, args, &a); // run tests if (mode == "testservice") diff --git a/samples/blackmiscdbus/servicetool.cpp b/samples/blackmiscdbus/servicetool.cpp index b12759976..4bd749808 100644 --- a/samples/blackmiscdbus/servicetool.cpp +++ b/samples/blackmiscdbus/servicetool.cpp @@ -679,7 +679,7 @@ namespace BlackMiscTest // next round? Client qDebug() << "Key x to exit"; qDebug() << "1 .. add new list via property on interface"; - qDebug() << "3 .. append 1 to controllers in context (no expected to change anything)"; // add to reference + qDebug() << "3 .. append 1 to controllers in context (not expected to change anything)"; // add to reference qDebug() << "5 .. foo signal directly on interface"; qDebug() << "7x . 7, update if, e.g. 7EDDM_TWR"; From b38d90a0f1c8ae4bd1bce317f4ebbac56c4e48d4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Jan 2014 17:11:52 +0100 Subject: [PATCH 2/6] New XML files for the sample. Fixed some errors found during testing. * applyIf no longer returns number of changed elements * cmd line arguments, wrong assignment in main.cpp --- .../BlackMiscTest.Datacontext.xml | 6 ++---- .../BlackMiscTest.Testservice.xml | 20 +++++++++---------- samples/blackmiscdbus/datacontext.h | 2 +- samples/blackmiscdbus/main.cpp | 4 ++-- samples/blackmiscdbus/servicetool.cpp | 3 +-- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/samples/blackmiscdbus/BlackMiscTest.Datacontext.xml b/samples/blackmiscdbus/BlackMiscTest.Datacontext.xml index 3eeae1bf7..1e8476a45 100644 --- a/samples/blackmiscdbus/BlackMiscTest.Datacontext.xml +++ b/samples/blackmiscdbus/BlackMiscTest.Datacontext.xml @@ -1,10 +1,10 @@ - + - + @@ -19,14 +19,12 @@ - - diff --git a/samples/blackmiscdbus/BlackMiscTest.Testservice.xml b/samples/blackmiscdbus/BlackMiscTest.Testservice.xml index 3ab70f5c0..4ba47fb73 100644 --- a/samples/blackmiscdbus/BlackMiscTest.Testservice.xml +++ b/samples/blackmiscdbus/BlackMiscTest.Testservice.xml @@ -22,7 +22,7 @@ - + @@ -66,21 +66,21 @@ - + - + - + - + - + @@ -89,7 +89,7 @@ - + @@ -97,9 +97,9 @@ - + - + @@ -107,7 +107,7 @@ - + diff --git a/samples/blackmiscdbus/datacontext.h b/samples/blackmiscdbus/datacontext.h index 4c8f97376..8ab546e6e 100644 --- a/samples/blackmiscdbus/datacontext.h +++ b/samples/blackmiscdbus/datacontext.h @@ -82,7 +82,7 @@ namespace BlackMiscTest /*! * \brief Default constructor */ - CDataContext(QObject *parent = 0) : QObject(parent) {} + CDataContext(QObject *parent = nullptr) : QObject(parent) {} /*! * \brief ctor for Qt meta system diff --git a/samples/blackmiscdbus/main.cpp b/samples/blackmiscdbus/main.cpp index f03499103..d2c519c61 100644 --- a/samples/blackmiscdbus/main.cpp +++ b/samples/blackmiscdbus/main.cpp @@ -49,8 +49,8 @@ int main(int argc, char *argv[]) useSessionBusForServer = false; if (cmdlineArgs.length() > 2) { - ip = cmdlineArgs.at(1); - port = cmdlineArgs.at(2); + ip = cmdlineArgs.at(cmdlineArgs.length() - 2); + port = cmdlineArgs.at(cmdlineArgs.length() - 1); } } QString addressTcp = QString("tcp:host=%1,port=%2").arg(ip).arg(port); diff --git a/samples/blackmiscdbus/servicetool.cpp b/samples/blackmiscdbus/servicetool.cpp index 4bd749808..28934868f 100644 --- a/samples/blackmiscdbus/servicetool.cpp +++ b/samples/blackmiscdbus/servicetool.cpp @@ -660,8 +660,7 @@ namespace BlackMiscTest value.addValue(CAtcStation::IndexBookedUntil, QDateTime::currentDateTimeUtc().addDays(2)); qDebug() << " condition" << condition; qDebug() << " values" << value; - qint32 c = dataContextInterface.updateOnlineControllers(condition, value); - qDebug() << c << "values changed in online controllers"; + dataContextInterface.updateOnlineControllers(condition, value); } // display current status From 97dda0b499c5ae5c09f658fec55420f31f8b5f2c Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Jan 2014 18:38:06 +0100 Subject: [PATCH 3/6] The meta type based status to string conversion did not work, as the metatype for the interface cannot be registered. Changed to a simple static method, as it will be replaced by I18N anyway sooner or later. --- src/blackcore/network.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/blackcore/network.h b/src/blackcore/network.h index bf360a765..342d1b2b5 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -64,11 +64,20 @@ namespace BlackCore Connected }; - QString connectionStatusToString(ConnectionStatus status) const + static const QString connectionStatusToString(ConnectionStatus status) { - int index = metaObject()->indexOfEnumerator("ConnectionStatus"); - QMetaEnum metaEnum = metaObject()->enumerator(index); - return metaEnum.valueToKey(status); + // the version with metaObject, metaObject()->indexOfEnumerator does not work anymore + // an interface cannot be used with Q_DECLAREMETATYPE + switch (status) + { + case Disconnected: return "disconnected"; + case DisconnectedError: return "disconnectedError"; + case Connecting: return "connecting"; + case Connected: return "connected"; + default: break; + } + qFatal("Missing value"); + return ""; // just for compiler warning } virtual bool isConnected() const = 0; @@ -101,7 +110,7 @@ namespace BlackCore virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0; virtual void setOwnAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0; virtual void setOwnAircraftAvionics(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, - const BlackMisc::Aviation::CTransponder &xpdr) = 0; + const BlackMisc::Aviation::CTransponder &transponder) = 0; // Weather / flight plan virtual void requestMetar(const QString &airportICAO) = 0; From 72b7a7ab958359d8fb7df27a70e3fd2a7b0a2353 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Jan 2014 18:42:34 +0100 Subject: [PATCH 4/6] Added statusMessages (plural) as signal. This makes it easier to send either single or multiple messages as required. Along with the changes fixed some places where not all status messages had been sent. MainWindow connected with both signals (statusMessage, statusMessages) Recreated DBus XML file --- samples/blackgui/mainwindow_init.cpp | 1 + src/blackcore/blackcore.contextnetwork.xml | 4 ++++ src/blackcore/context_network.cpp | 6 +++--- src/blackcore/context_network_interface.cpp | 2 ++ src/blackcore/context_network_interface.h | 10 +++++++--- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/samples/blackgui/mainwindow_init.cpp b/samples/blackgui/mainwindow_init.cpp index 0878f8ad8..015de7ac8 100644 --- a/samples/blackgui/mainwindow_init.cpp +++ b/samples/blackgui/mainwindow_init.cpp @@ -117,6 +117,7 @@ void MainWindow::init(GuiModes::CoreMode coreMode) // signal / slots bool connect; this->connect(this->m_contextNetwork, &IContextNetwork::statusMessage, this, &MainWindow::displayStatusMessage); + this->connect(this->m_contextNetwork, &IContextNetwork::statusMessages, this, &MainWindow::displayStatusMessages); this->connect(this->m_contextNetwork, &IContextNetwork::connectionTerminated, this, &MainWindow::connectionTerminated); this->connect(this->m_contextNetwork, &IContextNetwork::connectionStatusChanged, this, &MainWindow::connectionStatusChanged); this->connect(this->m_contextSettings, &IContextSettings::changedNetworkSettings, this, &MainWindow::changedNetworkSettings); diff --git a/src/blackcore/blackcore.contextnetwork.xml b/src/blackcore/blackcore.contextnetwork.xml index f3352421b..23b28f64f 100644 --- a/src/blackcore/blackcore.contextnetwork.xml +++ b/src/blackcore/blackcore.contextnetwork.xml @@ -5,6 +5,10 @@ + + + + diff --git a/src/blackcore/context_network.cpp b/src/blackcore/context_network.cpp index a7c246459..85ac3f4c5 100644 --- a/src/blackcore/context_network.cpp +++ b/src/blackcore/context_network.cpp @@ -246,11 +246,11 @@ namespace BlackCore } // send as message - QString m("connection status changed "); - m.append(this->m_network->connectionStatusToString(from)).append(" ").append(this->m_network->connectionStatusToString(to)); + QString m("connection status changed from %1 to %2"); + m = m.arg(INetwork::connectionStatusToString(from), INetwork::connectionStatusToString(to)); msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, to == INetwork::DisconnectedError ? CStatusMessage::SeverityError : CStatusMessage::SeverityInfo, m)); - emit this->statusMessage(msgs[0]); + emit this->statusMessages(msgs); // send as own signal emit this->connectionStatusChanged(from, to); diff --git a/src/blackcore/context_network_interface.cpp b/src/blackcore/context_network_interface.cpp index 0e0f5fddc..23fc2ae6e 100644 --- a/src/blackcore/context_network_interface.cpp +++ b/src/blackcore/context_network_interface.cpp @@ -38,6 +38,8 @@ namespace BlackCore "connectionTerminated", this, SIGNAL(connectionTerminated())); connection.connect(serviceName, IContextNetwork::ServicePath(), IContextNetwork::InterfaceName(), "statusMessage", this, SIGNAL(statusMessage(BlackMisc::CStatusMessage))); + connection.connect(serviceName, IContextNetwork::ServicePath(), IContextNetwork::InterfaceName(), + "statusMessages", this, SIGNAL(statusMessages(BlackMisc::CStatusMessageList))); connection.connect(serviceName, IContextNetwork::ServicePath(), IContextNetwork::InterfaceName(), "textMessagesReceived", this, SIGNAL(textMessagesReceived(BlackMisc::Network::CTextMessageList))); } diff --git a/src/blackcore/context_network_interface.h b/src/blackcore/context_network_interface.h index 73b70e57d..89c189f9c 100644 --- a/src/blackcore/context_network_interface.h +++ b/src/blackcore/context_network_interface.h @@ -106,11 +106,17 @@ namespace BlackCore signals: /*! - * \brief ATC station list has been changed + * \brief Send status messages * \param message */ void statusMessage(const BlackMisc::CStatusMessage &message); + /*! + * \brief Send status messages + * \param messages + */ + void statusMessages(const BlackMisc::CStatusMessageList &messages); + /*! * \brief List has been changed */ @@ -137,8 +143,6 @@ namespace BlackCore * \param to */ // If I use the enum, adaptor / interface are not created correctly - - void connectionStatusChanged(uint from, uint to); /*! From 222756e7ac2b1c3005149a4591a9247862f2b861 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Jan 2014 19:27:15 +0100 Subject: [PATCH 5/6] Fixed 2 bugs only obvious when running with Core/DBus * init of m_enabled in modulator missing, crashed DBus marshalling * Need to check boundaries of voice rooms in GUI for empty list --- samples/blackgui/mainwindow_aircraft.cpp | 15 +++++++++------ src/blackmisc/aviomodulator.h | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/samples/blackgui/mainwindow_aircraft.cpp b/samples/blackgui/mainwindow_aircraft.cpp index 68ada682e..c52d888b4 100644 --- a/samples/blackgui/mainwindow_aircraft.cpp +++ b/samples/blackgui/mainwindow_aircraft.cpp @@ -42,12 +42,15 @@ bool MainWindow::reloadOwnAircraft() if (this->m_contextVoiceAvailable) { CVoiceRoomList selectedRooms = this->m_contextNetwork->getSelectedVoiceRooms(); - this->m_voiceRoomCom1 = this->ui->cb_CockpitVoiceRoom1Override->isChecked() ? - this->ui->le_CockpitVoiceRoomCom1->text().trimmed() : - selectedRooms[0]; - this->m_voiceRoomCom2 = this->ui->cb_CockpitVoiceRoom2Override->isChecked() ? - this->ui->le_CockpitVoiceRoomCom2->text().trimmed() : - selectedRooms[1]; + if (selectedRooms.size() == 2) + { + this->m_voiceRoomCom1 = this->ui->cb_CockpitVoiceRoom1Override->isChecked() ? + this->ui->le_CockpitVoiceRoomCom1->text().trimmed() : + selectedRooms[0]; + this->m_voiceRoomCom2 = this->ui->cb_CockpitVoiceRoom2Override->isChecked() ? + this->ui->le_CockpitVoiceRoomCom2->text().trimmed() : + selectedRooms[1]; + } } // diff --git a/src/blackmisc/aviomodulator.h b/src/blackmisc/aviomodulator.h index f153a0f60..19a976ce4 100644 --- a/src/blackmisc/aviomodulator.h +++ b/src/blackmisc/aviomodulator.h @@ -37,7 +37,7 @@ namespace BlackMisc * \brief Default constructor */ CModulator() : - CAvionicsBase("default"), m_volumeInput(0), m_volumeOutput(0), m_digits(2) {} + CAvionicsBase("default"), m_volumeInput(0), m_volumeOutput(0), m_enabled(true), m_digits(2) {} /*! * \brief Constructor @@ -47,7 +47,7 @@ namespace BlackMisc * \param digits */ CModulator(const QString &name, const BlackMisc::PhysicalQuantities::CFrequency &activeFrequency, const BlackMisc::PhysicalQuantities::CFrequency &standbyFrequency, int digits) : - CAvionicsBase(name), m_frequencyActive(activeFrequency), m_frequencyStandby(standbyFrequency), m_volumeInput(0), m_volumeOutput(0), m_digits(digits), m_enabled(true) {} + CAvionicsBase(name), m_frequencyActive(activeFrequency), m_frequencyStandby(standbyFrequency), m_volumeInput(0), m_volumeOutput(0), m_enabled(true), m_digits(digits) {} /*! * \brief String for converter From 16dc9596624ad5b3e1d9d13375cb8ecddd4a8dec Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Jan 2014 20:05:00 +0100 Subject: [PATCH 6/6] Fixed 4 gcc warnings (2x order, 1x explicit constructor, 1x GUI / from related) --- samples/blackgui/mainwindow.cpp | 2 +- samples/blackgui/mainwindow.ui | 12 ++++++------ src/blackcore/network_vatlib.cpp | 2 +- src/blackmisc/pqphysicalquantity.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/samples/blackgui/mainwindow.cpp b/samples/blackgui/mainwindow.cpp index 2787ee2ac..2ffcf337e 100644 --- a/samples/blackgui/mainwindow.cpp +++ b/samples/blackgui/mainwindow.cpp @@ -22,7 +22,7 @@ MainWindow::MainWindow(GuiModes::WindowMode windowMode, QWidget *parent) : QMainWindow(parent, windowMode == GuiModes::WindowFrameless ? (Qt::Window | Qt::FramelessWindowHint) : Qt::Tool), ui(new Ui::MainWindow), m_infoWindow(nullptr), - m_windowMode(windowMode), m_init(false), m_coreMode(GuiModes::CoreExternal), + m_init(false), m_windowMode(windowMode), m_coreMode(GuiModes::CoreExternal), m_coreAvailable(false), m_contextNetworkAvailable(false), m_contextVoiceAvailable(false), m_dBusConnection("dummy"), m_coreRuntime(nullptr), m_atcListOnline(nullptr), m_atcListBooked(nullptr), diff --git a/samples/blackgui/mainwindow.ui b/samples/blackgui/mainwindow.ui index 70751a761..464694af9 100644 --- a/samples/blackgui/mainwindow.ui +++ b/samples/blackgui/mainwindow.ui @@ -1538,7 +1538,7 @@ QSizeGrip { - 0 + 1 @@ -1736,14 +1736,14 @@ QSizeGrip { - + ICAO type (e.g. A320) - + @@ -1756,14 +1756,14 @@ QSizeGrip { - + - Plane type + Aircraft type (e.g. L2J) - + diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index ad02f9bc8..9f9940934 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -31,8 +31,8 @@ namespace BlackCore CNetworkVatlib::CNetworkVatlib(CNetworkVatlib::LoginMode loginMode, QObject *parent) : INetwork(parent), m_net(Cvatlib_Network::Create()), - m_status(Cvatlib_Network::connStatus_Idle), m_loginMode(loginMode), + m_status(Cvatlib_Network::connStatus_Idle), m_fsdTextCodec(QTextCodec::codecForName("latin1")) { try diff --git a/src/blackmisc/pqphysicalquantity.cpp b/src/blackmisc/pqphysicalquantity.cpp index 27fcb2769..ee91eb860 100644 --- a/src/blackmisc/pqphysicalquantity.cpp +++ b/src/blackmisc/pqphysicalquantity.cpp @@ -25,7 +25,7 @@ namespace BlackMisc * (The implicitly generated copy constructor would suffice, but for what seems to be a bug in MSVC2010 template instantiation) */ template CPhysicalQuantity::CPhysicalQuantity(const CPhysicalQuantity &other) : - m_value(other.m_value), m_unit(other.m_unit) + CValueObject(), m_value(other.m_value), m_unit(other.m_unit) { // void }