diff --git a/include/f1x/openauto/autoapp/App.hpp b/include/f1x/openauto/autoapp/App.hpp index 461743d..5bbdbe2 100644 --- a/include/f1x/openauto/autoapp/App.hpp +++ b/include/f1x/openauto/autoapp/App.hpp @@ -20,6 +20,9 @@ #include #include +#include +#include +#include #include #include @@ -35,10 +38,11 @@ class App: public projection::IAndroidAutoEntityEventHandler, public std::enable public: typedef std::shared_ptr Pointer; - App(boost::asio::io_service& ioService, projection::IAndroidAutoEntityFactory& androidAutoEntityFactory, + App(boost::asio::io_service& ioService, aasdk::usb::USBWrapper& usbWrapper, aasdk::tcp::ITCPWrapper& tcpWrapper, projection::IAndroidAutoEntityFactory& androidAutoEntityFactory, aasdk::usb::IUSBHub::Pointer usbHub, aasdk::usb::IConnectedAccessoriesEnumerator::Pointer connectedAccessoriesEnumerator); void waitForUSBDevice(); + void start(aasdk::tcp::ITCPEndpoint::SocketPointer socket); void stop(); void onAndroidAutoQuit() override; @@ -51,6 +55,8 @@ private: void onUSBHubError(const aasdk::error::Error& error); boost::asio::io_service& ioService_; + aasdk::usb::USBWrapper& usbWrapper_; + aasdk::tcp::ITCPWrapper& tcpWrapper_; boost::asio::io_service::strand strand_; projection::IAndroidAutoEntityFactory& androidAutoEntityFactory_; aasdk::usb::IUSBHub::Pointer usbHub_; diff --git a/include/f1x/openauto/autoapp/Projection/AndroidAutoEntityFactory.hpp b/include/f1x/openauto/autoapp/Projection/AndroidAutoEntityFactory.hpp index 1df64dc..73b8696 100644 --- a/include/f1x/openauto/autoapp/Projection/AndroidAutoEntityFactory.hpp +++ b/include/f1x/openauto/autoapp/Projection/AndroidAutoEntityFactory.hpp @@ -36,18 +36,16 @@ namespace projection class AndroidAutoEntityFactory: public IAndroidAutoEntityFactory { public: - AndroidAutoEntityFactory(aasdk::usb::IUSBWrapper& usbWrapper, - boost::asio::io_service& ioService, + AndroidAutoEntityFactory(boost::asio::io_service& ioService, configuration::IConfiguration::Pointer configuration, IServiceFactory& serviceFactory); - IAndroidAutoEntity::Pointer create(aasdk::usb::DeviceHandle deviceHandle) override; + IAndroidAutoEntity::Pointer create(aasdk::usb::IAOAPDevice::Pointer aoapDevice) override; IAndroidAutoEntity::Pointer create(aasdk::tcp::ITCPEndpoint::Pointer tcpEndpoint) override; private: IAndroidAutoEntity::Pointer create(aasdk::transport::ITransport::Pointer transport); - aasdk::usb::IUSBWrapper& usbWrapper_; boost::asio::io_service& ioService_; configuration::IConfiguration::Pointer configuration_; IServiceFactory& serviceFactory_; diff --git a/include/f1x/openauto/autoapp/Projection/IAndroidAutoEntityFactory.hpp b/include/f1x/openauto/autoapp/Projection/IAndroidAutoEntityFactory.hpp index 945c247..f9f37c3 100644 --- a/include/f1x/openauto/autoapp/Projection/IAndroidAutoEntityFactory.hpp +++ b/include/f1x/openauto/autoapp/Projection/IAndroidAutoEntityFactory.hpp @@ -19,7 +19,7 @@ #pragma once #include -#include +#include #include namespace f1x @@ -36,7 +36,7 @@ class IAndroidAutoEntityFactory public: virtual ~IAndroidAutoEntityFactory() = default; - virtual IAndroidAutoEntity::Pointer create(aasdk::usb::DeviceHandle deviceHandle) = 0; + virtual IAndroidAutoEntity::Pointer create(aasdk::usb::IAOAPDevice::Pointer aoapDevice) = 0; virtual IAndroidAutoEntity::Pointer create(aasdk::tcp::ITCPEndpoint::Pointer tcpEndpoint) = 0; }; diff --git a/src/autoapp/App.cpp b/src/autoapp/App.cpp index 7b00e07..441b4d6 100644 --- a/src/autoapp/App.cpp +++ b/src/autoapp/App.cpp @@ -17,6 +17,8 @@ */ #include +#include +#include #include #include @@ -27,9 +29,11 @@ namespace openauto namespace autoapp { -App::App(boost::asio::io_service& ioService, projection::IAndroidAutoEntityFactory& androidAutoEntityFactory, +App::App(boost::asio::io_service& ioService, aasdk::usb::USBWrapper& usbWrapper, aasdk::tcp::ITCPWrapper& tcpWrapper, projection::IAndroidAutoEntityFactory& androidAutoEntityFactory, aasdk::usb::IUSBHub::Pointer usbHub, aasdk::usb::IConnectedAccessoriesEnumerator::Pointer connectedAccessoriesEnumerator) : ioService_(ioService) + , usbWrapper_(usbWrapper) + , tcpWrapper_(tcpWrapper) , strand_(ioService_) , androidAutoEntityFactory_(androidAutoEntityFactory) , usbHub_(std::move(usbHub)) @@ -47,6 +51,35 @@ void App::waitForUSBDevice() }); } +void App::start(aasdk::tcp::ITCPEndpoint::SocketPointer socket) +{ + strand_.dispatch([this, self = this->shared_from_this(), socket = std::move(socket)]() mutable { + if(androidAutoEntity_ == nullptr) + { + try + { + usbHub_->cancel(); + connectedAccessoriesEnumerator_->cancel(); + + auto tcpEndpoint(std::make_shared(tcpWrapper_, std::move(socket))); + androidAutoEntity_ = androidAutoEntityFactory_.create(std::move(tcpEndpoint)); + androidAutoEntity_->start(*this); + } + catch(const aasdk::error::Error& error) + { + OPENAUTO_LOG(error) << "[App] TCP AndroidAutoEntity create error: " << error.what(); + + androidAutoEntity_.reset(); + this->waitForDevice(); + } + } + else + { + OPENAUTO_LOG(warning) << "[App] android auto entity is still running."; + } + }); +} + void App::stop() { strand_.dispatch([this, self = this->shared_from_this()]() { @@ -69,12 +102,15 @@ void App::aoapDeviceHandler(aasdk::usb::DeviceHandle deviceHandle) { try { - androidAutoEntity_ = androidAutoEntityFactory_.create(std::move(deviceHandle)); + connectedAccessoriesEnumerator_->cancel(); + + auto aoapDevice(aasdk::usb::AOAPDevice::create(usbWrapper_, ioService_, deviceHandle)); + androidAutoEntity_ = androidAutoEntityFactory_.create(std::move(aoapDevice)); androidAutoEntity_->start(*this); } catch(const aasdk::error::Error& error) { - OPENAUTO_LOG(error) << "[App] AndroidAutoEntity create error: " << error.what(); + OPENAUTO_LOG(error) << "[App] USB AndroidAutoEntity create error: " << error.what(); androidAutoEntity_.reset(); this->waitForDevice(); @@ -128,8 +164,8 @@ void App::onUSBHubError(const aasdk::error::Error& error) { OPENAUTO_LOG(error) << "[App] usb hub error: " << error.what(); - if(error.getCode() == aasdk::error::ErrorCode::OPERATION_ABORTED || - error.getCode() == aasdk::error::ErrorCode::OPERATION_IN_PROGRESS) + if(error.getCode() != aasdk::error::ErrorCode::OPERATION_ABORTED && + error.getCode() != aasdk::error::ErrorCode::OPERATION_IN_PROGRESS) { this->waitForDevice(); } diff --git a/src/autoapp/Projection/AndroidAutoEntityFactory.cpp b/src/autoapp/Projection/AndroidAutoEntityFactory.cpp index cc31fae..0eb6942 100644 --- a/src/autoapp/Projection/AndroidAutoEntityFactory.cpp +++ b/src/autoapp/Projection/AndroidAutoEntityFactory.cpp @@ -33,23 +33,19 @@ namespace autoapp namespace projection { -AndroidAutoEntityFactory::AndroidAutoEntityFactory(aasdk::usb::IUSBWrapper& usbWrapper, - boost::asio::io_service& ioService, +AndroidAutoEntityFactory::AndroidAutoEntityFactory(boost::asio::io_service& ioService, configuration::IConfiguration::Pointer configuration, IServiceFactory& serviceFactory) - : usbWrapper_(usbWrapper) - , ioService_(ioService) + : ioService_(ioService) , configuration_(std::move(configuration)) , serviceFactory_(serviceFactory) { } -IAndroidAutoEntity::Pointer AndroidAutoEntityFactory::create(aasdk::usb::DeviceHandle deviceHandle) +IAndroidAutoEntity::Pointer AndroidAutoEntityFactory::create(aasdk::usb::IAOAPDevice::Pointer aoapDevice) { - auto aoapDevice(aasdk::usb::AOAPDevice::create(usbWrapper_, ioService_, deviceHandle)); - auto transport(std::make_shared(ioService_, aoapDevice)); - + auto transport(std::make_shared(ioService_, std::move(aoapDevice))); return create(std::move(transport)); } diff --git a/src/autoapp/autoapp.cpp b/src/autoapp/autoapp.cpp index 6a2e3e9..d88863a 100644 --- a/src/autoapp/autoapp.cpp +++ b/src/autoapp/autoapp.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -99,15 +100,16 @@ 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); autoapp::projection::ServiceFactory serviceFactory(ioService, configuration); - autoapp::projection::AndroidAutoEntityFactory androidAutoEntityFactory(usbWrapper, ioService, configuration, serviceFactory); + autoapp::projection::AndroidAutoEntityFactory androidAutoEntityFactory(ioService, configuration, serviceFactory); auto usbHub(std::make_shared(usbWrapper, ioService, queryChainFactory)); auto ConnectedAccessoriesEnumerator(std::make_shared(usbWrapper, ioService, queryChainFactory)); - auto app = std::make_shared(ioService, androidAutoEntityFactory, std::move(usbHub), std::move(ConnectedAccessoriesEnumerator)); + auto app = std::make_shared(ioService, usbWrapper, tcpWrapper, androidAutoEntityFactory, std::move(usbHub), std::move(ConnectedAccessoriesEnumerator)); app->waitForUSBDevice(); auto result = qApplication.exec();