From 7c31bafa10b583cb7cc84e4aaed0ac6b5104b987 Mon Sep 17 00:00:00 2001 From: "michal.szwaj" Date: Wed, 21 Mar 2018 23:51:31 +0100 Subject: [PATCH] Implement connecting to the device --- .../f1x/openauto/autoapp/UI/ConnectDialog.hpp | 17 +++++++- src/autoapp/UI/ConnectDialog.cpp | 42 ++++++++++++++++--- src/autoapp/autoapp.cpp | 11 +++-- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/include/f1x/openauto/autoapp/UI/ConnectDialog.hpp b/include/f1x/openauto/autoapp/UI/ConnectDialog.hpp index db90ca4..c0b0c42 100644 --- a/include/f1x/openauto/autoapp/UI/ConnectDialog.hpp +++ b/include/f1x/openauto/autoapp/UI/ConnectDialog.hpp @@ -1,6 +1,8 @@ #pragma once #include +#include +#include namespace Ui { class ConnectDialog; @@ -20,11 +22,22 @@ class ConnectDialog : public QDialog Q_OBJECT public: - explicit ConnectDialog(QWidget *parent = nullptr); + explicit ConnectDialog(boost::asio::io_service& ioService, aasdk::tcp::ITCPWrapper& tcpWrapper, QWidget *parent = nullptr); ~ConnectDialog() override; +signals: + void connectToDevice(const QString& ipAddress); + void connected(aasdk::tcp::ITCPEndpoint::SocketPointer socket); + void connectionFailed(); + +private slots: + void onConnectButtonClicked(); + void onConnectionFailed(); + private: - Ui::ConnectDialog *ui; + boost::asio::io_service& ioService_; + aasdk::tcp::ITCPWrapper& tcpWrapper_; + Ui::ConnectDialog *ui_; }; } diff --git a/src/autoapp/UI/ConnectDialog.cpp b/src/autoapp/UI/ConnectDialog.cpp index b663f51..54337b6 100644 --- a/src/autoapp/UI/ConnectDialog.cpp +++ b/src/autoapp/UI/ConnectDialog.cpp @@ -1,3 +1,4 @@ +#include #include #include "ui_connectdialog.h" @@ -10,16 +11,47 @@ namespace autoapp namespace ui { -ConnectDialog::ConnectDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ConnectDialog) +ConnectDialog::ConnectDialog(boost::asio::io_service& ioService, aasdk::tcp::ITCPWrapper& tcpWrapper, QWidget *parent) + : QDialog(parent) + , ioService_(ioService) + , tcpWrapper_(tcpWrapper) + , ui_(new Ui::ConnectDialog) { - ui->setupUi(this); + qRegisterMetaType("aasdk::tcp::ITCPEndpoint::SocketPointer"); + + ui_->setupUi(this); + connect(ui_->pushButtonCancel, &QPushButton::clicked, this, &ConnectDialog::close); + connect(ui_->pushButtonConnect, &QPushButton::clicked, this, &ConnectDialog::onConnectButtonClicked); + connect(this, &ConnectDialog::connectionFailed, this, &ConnectDialog::onConnectionFailed); } ConnectDialog::~ConnectDialog() { - delete ui; + delete ui_; +} + +void ConnectDialog::onConnectButtonClicked() +{ + const auto& ipAddress = ui_->lineEditIPAddress->text().toStdString(); + auto socket = std::make_shared(ioService_); + + // !ec means no error + if(!tcpWrapper_.connect(*socket, ipAddress, 5277)) + { + emit connected(socket); + this->close(); + } + else + { + emit connectionFailed(); + } +} + +void ConnectDialog::onConnectionFailed() +{ + QMessageBox errorMessage(QMessageBox::Critical, "Error", "Connection failed.", QMessageBox::Ok); + errorMessage.setWindowFlags(Qt::WindowStaysOnTopHint); + errorMessage.exec(); } } diff --git a/src/autoapp/autoapp.cpp b/src/autoapp/autoapp.cpp index f063a2d..0c238cf 100644 --- a/src/autoapp/autoapp.cpp +++ b/src/autoapp/autoapp.cpp @@ -90,8 +90,9 @@ int main(int argc, char* argv[]) autoapp::ui::SettingsWindow settingsWindow(configuration); settingsWindow.setWindowFlags(Qt::WindowStaysOnTopHint); - autoapp::ui::ConnectDialog connectDialog; - connectDialog.setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint); + aasdk::tcp::TCPWrapper tcpWrapper; + autoapp::ui::ConnectDialog connectDialog(ioService, tcpWrapper); + connectDialog.setWindowFlags(Qt::WindowStaysOnTopHint); QObject::connect(&mainWindow, &autoapp::ui::MainWindow::exit, []() { std::exit(0); }); QObject::connect(&mainWindow, &autoapp::ui::MainWindow::openSettings, &settingsWindow, &autoapp::ui::SettingsWindow::showFullScreen); @@ -105,7 +106,6 @@ int main(int argc, char* argv[]) mainWindow.showFullScreen(); - aasdk::tcp::TCPWrapper tcpWrapper; aasdk::usb::USBWrapper usbWrapper(usbContext); aasdk::usb::AccessoryModeQueryFactory queryFactory(usbWrapper, ioService); aasdk::usb::AccessoryModeQueryChainFactory queryChainFactory(usbWrapper, ioService, queryFactory); @@ -115,6 +115,11 @@ int main(int argc, char* argv[]) auto usbHub(std::make_shared(usbWrapper, ioService, queryChainFactory)); auto connectedAccessoriesEnumerator(std::make_shared(usbWrapper, ioService, queryChainFactory)); auto app = std::make_shared(ioService, usbWrapper, tcpWrapper, androidAutoEntityFactory, std::move(usbHub), std::move(connectedAccessoriesEnumerator)); + + QObject::connect(&connectDialog, &autoapp::ui::ConnectDialog::connected, [&app](auto socket) { + app->start(std::move(socket)); + }); + app->waitForUSBDevice(); auto result = qApplication.exec();