From a54ff807c5fe946bb8aad1c10cb95b3de42e91f5 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Fri, 13 Sep 2024 12:53:03 +0330 Subject: [PATCH] Nanosecond utc + Connect address and port from ui. Can we merge deviceChoosers ? TCP, UDP, Egeniouss? --- src/core/positioning/egenioussreceiver.cpp | 15 +++-- src/core/positioning/egenioussreceiver.h | 4 +- src/core/positioning/positioning.cpp | 12 ++-- .../positioning/positioningdevicemodel.cpp | 2 +- src/qml/EgenioussDeviceChooser.qml | 65 +++++++++++++++++++ src/qml/qml.qrc | 1 + 6 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 src/qml/EgenioussDeviceChooser.qml diff --git a/src/core/positioning/egenioussreceiver.cpp b/src/core/positioning/egenioussreceiver.cpp index 81c732954f..7b8b721bdc 100644 --- a/src/core/positioning/egenioussreceiver.cpp +++ b/src/core/positioning/egenioussreceiver.cpp @@ -5,8 +5,8 @@ #include #include -EgenioussReceiver::EgenioussReceiver( QObject *parent ) - : AbstractGnssReceiver( parent ), mTcpSocket( new QTcpSocket( this ) ) +EgenioussReceiver::EgenioussReceiver( const QString &address, const int port, QObject *parent ) + : AbstractGnssReceiver( parent ), mAddress( address ), mPort( port ), mTcpSocket( new QTcpSocket( this ) ) { } @@ -15,7 +15,7 @@ void EgenioussReceiver::handleConnectDevice() connect( mTcpSocket, &QTcpSocket::readyRead, this, &EgenioussReceiver::onReadyRead ); connect( mTcpSocket, &QTcpSocket::errorOccurred, this, &EgenioussReceiver::onErrorOccurred ); - mTcpSocket->connectToHost( QHostAddress::LocalHost, 1235 ); + mTcpSocket->connectToHost( mAddress, mPort ); if ( !mTcpSocket->waitForConnected( 3000 ) ) { @@ -50,9 +50,12 @@ QList> EgenioussReceiver::details() QJsonDocument jsonDoc = QJsonDocument::fromJson( payload ); QJsonObject jsonObject = jsonDoc.object(); + if ( jsonDoc.isNull() || !jsonDoc.isObject() ) + { + return dataList; // Failed to parse JSON + } + dataList.append( qMakePair( "q", jsonObject.value( "q" ).toString() ) ); - dataList.append( qMakePair( "utc", jsonObject.value( "utc" ).toDouble() ) ); - dataList.append( qMakePair( "utc convert", QDateTime( QDateTime::fromMSecsSinceEpoch( jsonObject.value( "utc" ).toDouble(), Qt::UTC ) ).toString() ) ); return dataList; } @@ -105,7 +108,7 @@ void EgenioussReceiver::onReadyRead() 0, std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN(), - QDateTime::fromMSecsSinceEpoch( jsonObject.value( "utc" ).toDouble(), Qt::UTC ), + QDateTime::fromMSecsSinceEpoch( jsonObject.value( "utc" ).toDouble() / 1e6, Qt::UTC ), QChar(), 0, 1 ); diff --git a/src/core/positioning/egenioussreceiver.h b/src/core/positioning/egenioussreceiver.h index 8cc1e40a4d..73f5f83b35 100644 --- a/src/core/positioning/egenioussreceiver.h +++ b/src/core/positioning/egenioussreceiver.h @@ -9,7 +9,7 @@ class EgenioussReceiver : public AbstractGnssReceiver Q_OBJECT public: - explicit EgenioussReceiver( QObject *parent = nullptr ); + explicit EgenioussReceiver( const QString &address = QString(), const int port = 0, QObject *parent = nullptr ); private: void handleConnectDevice() override; @@ -25,6 +25,8 @@ class EgenioussReceiver : public AbstractGnssReceiver private: QTcpSocket *mTcpSocket = nullptr; + QString mAddress; + int mPort = 0; GnssPositionInformation mLastGnssPositionInformation; QByteArray mReceivedData; QByteArray payload; diff --git a/src/core/positioning/positioning.cpp b/src/core/positioning/positioning.cpp index 49d010ad6e..4f427ea11d 100644 --- a/src/core/positioning/positioning.cpp +++ b/src/core/positioning/positioning.cpp @@ -192,23 +192,21 @@ void Positioning::setupDevice() } else { + const qsizetype portSeparator = mDeviceId.lastIndexOf( ':' ); + const QString address = mDeviceId.mid( 4, portSeparator - 4 ); + const int port = mDeviceId.mid( portSeparator + 1 ).toInt(); + if ( mDeviceId.startsWith( QStringLiteral( "tcp:" ) ) ) { - const qsizetype portSeparator = mDeviceId.lastIndexOf( ':' ); - const QString address = mDeviceId.mid( 4, portSeparator - 4 ); - const int port = mDeviceId.mid( portSeparator + 1 ).toInt(); mReceiver = new TcpReceiver( address, port, this ); } else if ( mDeviceId.startsWith( QStringLiteral( "udp:" ) ) ) { - const qsizetype portSeparator = mDeviceId.lastIndexOf( ':' ); - const QString address = mDeviceId.mid( 4, portSeparator - 4 ); - const int port = mDeviceId.mid( portSeparator + 1 ).toInt(); mReceiver = new UdpReceiver( address, port, this ); } else if ( mDeviceId.startsWith( QStringLiteral( "egeniouss:" ) ) ) { - mReceiver = new EgenioussReceiver( this ); + mReceiver = new EgenioussReceiver( address, port, this ); } #ifdef WITH_SERIALPORT else if ( mDeviceId.startsWith( QStringLiteral( "serial:" ) ) ) diff --git a/src/core/positioning/positioningdevicemodel.cpp b/src/core/positioning/positioningdevicemodel.cpp index f4577cdf6f..17eb82a612 100644 --- a/src/core/positioning/positioningdevicemodel.cpp +++ b/src/core/positioning/positioningdevicemodel.cpp @@ -173,7 +173,7 @@ const QString PositioningDeviceModel::deviceId( const Device &device ) const return QStringLiteral( "serial:%1" ).arg( device.settings.value( QStringLiteral( "address" ) ).toString() ); case EgenioussDevice: - return QStringLiteral( "egeniouss:%1" ).arg( device.settings.value( QStringLiteral( "address" ) ).toString() ); + return QStringLiteral( "egeniouss:%1:%2" ).arg( device.settings.value( QStringLiteral( "address" ) ).toString(), QString::number( device.settings.value( QStringLiteral( "port" ) ).toInt() ) ); } return QString(); diff --git a/src/qml/EgenioussDeviceChooser.qml b/src/qml/EgenioussDeviceChooser.qml new file mode 100644 index 0000000000..1f02442abb --- /dev/null +++ b/src/qml/EgenioussDeviceChooser.qml @@ -0,0 +1,65 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import org.qfield +import Theme + +Item { + width: parent.width + + property alias deviceAddress: egenioussDeviceAddress.text + property alias devicePort: egenioussDevicePort.text + + function generateName() { + return deviceAddress + ' (' + devicePort + ')'; + } + + function setSettings(settings) { + deviceAddress = settings['address']; + devicePort = settings['port']; + } + + function getSettings() { + return { + "address": deviceAddress.trim(), + "port": parseInt(devicePort) + }; + } + + GridLayout { + width: parent.width + columns: 1 + columnSpacing: 0 + rowSpacing: 5 + + Label { + Layout.fillWidth: true + text: qsTr("Address:") + font: Theme.defaultFont + wrapMode: Text.WordWrap + } + + QfTextField { + id: egenioussDeviceAddress + Layout.fillWidth: true + font: Theme.defaultFont + text: '127.0.0.1' + inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase + } + + Label { + Layout.fillWidth: true + text: qsTr("Port:") + font: Theme.defaultFont + wrapMode: Text.WordWrap + } + + QfTextField { + id: egenioussDevicePort + Layout.fillWidth: true + font: Theme.defaultFont + text: '1235' + inputMethodHints: Qt.ImhFormattedNumbersOnly + } + } +} diff --git a/src/qml/qml.qrc b/src/qml/qml.qrc index 63836d9ba2..ddcafd53dc 100644 --- a/src/qml/qml.qrc +++ b/src/qml/qml.qrc @@ -43,6 +43,7 @@ ScaleBar.qml SensorInformationView.qml Toast.qml + EgenioussDeviceChooser.qml TcpDeviceChooser.qml UdpDeviceChooser.qml VariableEditor.qml