M module-bsp/board/linux/usb_cdc/usb_cdc.cpp => module-bsp/board/linux/usb_cdc/usb_cdc.cpp +5 -0
@@ 155,6 155,11 @@ namespace bsp
LOG_INFO("usbReinit");
}
+ void usbSuspend()
+ {
+ LOG_INFO("usbSuspend");
+ }
+
int usbInit(xQueueHandle receiveQueue, xQueueHandle irqQueue, USBDeviceListener *)
{
M module-bsp/board/rt1051/bsp/usb => module-bsp/board/rt1051/bsp/usb +1 -1
@@ 1,1 1,1 @@
-Subproject commit 07460ac1a8e2f6234d2492c842e22b28e4363d84
+Subproject commit f77faf3a05c0fc92df0c858a31c14c1e24bb4e7e
M module-bsp/bsp/usb/usb.hpp => module-bsp/bsp/usb/usb.hpp +1 -0
@@ 45,5 45,6 @@ namespace bsp
int usbCDCSendRaw(const char *dataPtr, size_t dataLen);
void usbDeinit();
void usbReinit(const char *mtpRoot);
+ void usbSuspend();
} // namespace bsp
M module-services/service-desktop/WorkerDesktop.cpp => module-services/service-desktop/WorkerDesktop.cpp +11 -0
@@ 8,6 8,7 @@
#include "parser/MessageHandler.hpp"
#include "parser/ParserFSM.hpp"
#include "endpoints/Context.hpp"
+#include "Timers/TimerFactory.hpp"
#include <bsp/usb/usb.hpp>
#include <log/log.hpp>
@@ 36,6 37,9 @@ bool WorkerDesktop::init(std::list<sys::WorkerQueueInfo> queues)
auto sentinelRegistrationMsg = std::make_shared<sys::SentinelRegistrationMessage>(cpuSentinel);
ownerService->bus.sendUnicast(sentinelRegistrationMsg, service::name::system_manager);
+ usbSuspendTimer = sys::TimerFactory::createSingleShotTimer(
+ ownerService, "usbSuspend", constants::usbSuspendTimeout, [this](sys::Timer &) { suspendUsb(); });
+
return (bsp::usbInit(receiveQueue, irqQueue, this) < 0) ? false : true;
}
@@ 124,6 128,7 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
LOG_DEBUG("USB status: %d", static_cast<int>(notification));
if (notification == bsp::USBDeviceStatus::Connected) {
+ usbSuspendTimer.stop();
ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBConnected>(),
service::name::service_desktop);
}
@@ 133,6 138,7 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
service::name::service_desktop);
}
else if (notification == bsp::USBDeviceStatus::Disconnected) {
+ usbSuspendTimer.start();
cpuSentinel->ReleaseMinimumFrequency();
ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBDisconnected>(),
service::name::service_desktop);
@@ 284,3 290,8 @@ void WorkerDesktop::uploadFileFailedResponse()
responseContext.setResponseBody(responseJson);
parserFSM::MessageHandler::putToSendQueue(responseContext.createSimpleResponse());
}
+
+void WorkerDesktop::suspendUsb()
+{
+ bsp::usbSuspend();
+}
M module-services/service-desktop/service-desktop/WorkerDesktop.hpp => module-services/service-desktop/service-desktop/WorkerDesktop.hpp +7 -0
@@ 14,6 14,11 @@
#include "bsp/usb/usb.hpp"
#include "USBSecurityModel.hpp"
+namespace constants
+{
+ constexpr auto usbSuspendTimeout = std::chrono::seconds{1};
+} // namespace constants
+
class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener
{
public:
@@ 56,6 61,7 @@ class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener
void startTransferTimer();
void stopTransferTimer();
void reloadTransferTimer();
+ void suspendUsb();
bool stateChangeWait();
@@ 69,6 75,7 @@ class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener
const sdesktop::USBSecurityModel &securityModel;
sys::Service *ownerService = nullptr;
parserFSM::StateMachine parser;
+ sys::TimerHandle usbSuspendTimer;
std::shared_ptr<sys::CpuSentinel> cpuSentinel;
};