From 14d4ce8220bc55e9b19a128b4b7d18f4d3645cba Mon Sep 17 00:00:00 2001 From: Wojtek Rzepecki Date: Thu, 29 Apr 2021 09:10:04 +0200 Subject: [PATCH] [EGD-6615] Fix tethering repeated notification Repair of repeated tethering notification after disconnection. --- .../service-desktop/DesktopMessages.cpp | 12 ++++++++++++ module-services/service-desktop/ServiceDesktop.cpp | 7 +++++-- module-services/service-desktop/WorkerDesktop.cpp | 13 +++++++++++-- .../service-desktop/DesktopMessages.hpp | 14 ++++++++++++-- .../service-desktop/WorkerDesktop.hpp | 1 + 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/module-services/service-desktop/DesktopMessages.cpp b/module-services/service-desktop/DesktopMessages.cpp index 92d4c5df53003daecfe5da889b522e954d7b1220..5470930eaca595270d9c965044792191a3a11333 100644 --- a/module-services/service-desktop/DesktopMessages.cpp +++ b/module-services/service-desktop/DesktopMessages.cpp @@ -40,4 +40,16 @@ namespace sdesktop } } // namespace developerMode + namespace usb + { + USBConfigured::USBConfigured(USBConfigurationType configurationType) + : sys::DataMessage(MessageType::USBConfigured), configurationType(configurationType) + {} + + USBConfigurationType USBConfigured::getConfigurationType() const noexcept + { + return configurationType; + } + } // namespace usb + } // namespace sdesktop diff --git a/module-services/service-desktop/ServiceDesktop.cpp b/module-services/service-desktop/ServiceDesktop.cpp index 09546e5628b1462e3a29b213337b24994a205fc6..2f187033f55a28bf43d498cece88285e07d99ae8 100644 --- a/module-services/service-desktop/ServiceDesktop.cpp +++ b/module-services/service-desktop/ServiceDesktop.cpp @@ -211,8 +211,11 @@ sys::ReturnCodes ServiceDesktop::InitHandler() }); connect(sdesktop::usb::USBConfigured(), [&](sys::Message *msg) { - bus.sendUnicast(std::make_shared(sys::phone_modes::Tethering::On), - service::name::system_manager); + auto message = static_cast(msg); + if (message->getConfigurationType() == sdesktop::usb::USBConfigurationType::firstConfiguration) { + bus.sendUnicast(std::make_shared(sys::phone_modes::Tethering::On), + service::name::system_manager); + } if (!usbSecurityModel->isSecurityEnabled()) { LOG_INFO("Endpoint security disabled."); diff --git a/module-services/service-desktop/WorkerDesktop.cpp b/module-services/service-desktop/WorkerDesktop.cpp index fea58f69a1986bbeccca4682c2321668423f8fea..345d942cc5814816ae9a8d5494cea805512eb305 100644 --- a/module-services/service-desktop/WorkerDesktop.cpp +++ b/module-services/service-desktop/WorkerDesktop.cpp @@ -134,8 +134,16 @@ bool WorkerDesktop::handleMessage(uint32_t queueID) } else if (notification == bsp::USBDeviceStatus::Configured) { cpuSentinel->HoldMinimumFrequency(bsp::CpuFrequencyHz::Level_4); - ownerService->bus.sendUnicast(std::make_shared(), - service::name::service_desktop); + if (usbStatus == bsp::USBDeviceStatus::Connected) { + ownerService->bus.sendUnicast(std::make_shared( + sdesktop::usb::USBConfigurationType::firstConfiguration), + service::name::service_desktop); + } + else { + ownerService->bus.sendUnicast(std::make_shared( + sdesktop::usb::USBConfigurationType::reconfiguration), + service::name::service_desktop); + } } else if (notification == bsp::USBDeviceStatus::Disconnected) { usbSuspendTimer.start(); @@ -143,6 +151,7 @@ bool WorkerDesktop::handleMessage(uint32_t queueID) ownerService->bus.sendUnicast(std::make_shared(), service::name::service_desktop); } + usbStatus = notification; } else { LOG_INFO("handeMessage got message on an unhandled queue"); diff --git a/module-services/service-desktop/service-desktop/DesktopMessages.hpp b/module-services/service-desktop/service-desktop/DesktopMessages.hpp index 075fba740948436a88133d7e427a7a68f3c68511..7cc2a7d81ea7aa1b922356fd4eacbead31f5a9d0 100644 --- a/module-services/service-desktop/service-desktop/DesktopMessages.hpp +++ b/module-services/service-desktop/service-desktop/DesktopMessages.hpp @@ -72,6 +72,12 @@ namespace sdesktop namespace usb { + enum class USBConfigurationType + { + firstConfiguration, + reconfiguration + }; + class USBConnected : public sys::DataMessage { public: @@ -83,9 +89,13 @@ namespace sdesktop class USBConfigured : public sys::DataMessage { public: - USBConfigured() : sys::DataMessage(MessageType::USBConfigured) - {} + explicit USBConfigured( + USBConfigurationType configurationType = sdesktop::usb::USBConfigurationType::firstConfiguration); ~USBConfigured() override = default; + USBConfigurationType getConfigurationType() const noexcept; + + private: + USBConfigurationType configurationType; }; class USBDisconnected : public sys::DataMessage diff --git a/module-services/service-desktop/service-desktop/WorkerDesktop.hpp b/module-services/service-desktop/service-desktop/WorkerDesktop.hpp index d8a7c0a5ab33e7dfa420a1296e308beed73c03e9..c4c63c1163086be057b5f47fbc0ee0120f0b2a41 100644 --- a/module-services/service-desktop/service-desktop/WorkerDesktop.hpp +++ b/module-services/service-desktop/service-desktop/WorkerDesktop.hpp @@ -76,6 +76,7 @@ class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener sys::Service *ownerService = nullptr; parserFSM::StateMachine parser; sys::TimerHandle usbSuspendTimer; + bsp::USBDeviceStatus usbStatus = bsp::USBDeviceStatus::Disconnected; std::shared_ptr cpuSentinel; };