From 8f89a12e5e2ed219e5f60ad44a4ebcb9578f6b76 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Mon, 20 May 2024 15:26:30 +0800 Subject: [PATCH] Improve:watch dog thread. --- middleware/McuManager/src/McuManagerImpl.cpp | 37 ++++++++++++++++++- middleware/McuManager/src/McuManagerImpl.h | 6 +++ .../src_mock/McuManager_Mock_Test.cpp | 14 +++++++ utils/McuProtocol/README.md | 2 + 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/middleware/McuManager/src/McuManagerImpl.cpp b/middleware/McuManager/src/McuManagerImpl.cpp index 4f661514..25c27668 100644 --- a/middleware/McuManager/src/McuManagerImpl.cpp +++ b/middleware/McuManager/src/McuManagerImpl.cpp @@ -14,6 +14,7 @@ */ #include "McuManagerImpl.h" #include "ILog.h" +#include "McuAskBase.h" class McuRecvImpl { public: @@ -30,7 +31,7 @@ protected: public: const OtherSideSendType mSendType; }; -McuManagerImpl::McuManagerImpl() +McuManagerImpl::McuManagerImpl() : mWatchDogRuning(false) { mMcuAskHandle[OtherSideSendType::SEND_IPC_MISSION] = std::bind(&McuManagerImpl::McuAskSendIpcMissionHandle, this, _1); @@ -49,6 +50,11 @@ const StatusCode McuManagerImpl::Init(void) { McuDevice::Init(); McuProtocol::Init(); + auto watchThread = [](std::shared_ptr mcuManager) { + LogInfo("mWatchDogThread started.\n"); + mcuManager->WatchDogThread(); + }; + mWatchDogThread = std::thread(watchThread, shared_from_this()); return CreateStatusCode(STATUS_CODE_OK); } const StatusCode McuManagerImpl::UnInit(void) @@ -57,6 +63,13 @@ const StatusCode McuManagerImpl::UnInit(void) McuProtocol::UnInit(); mMcuAskList.clear(); mMonitor.reset(); + mMutex.lock(); + mWatchDogRuning = false; + mCv.notify_one(); + mMutex.unlock(); + if (mWatchDogThread.joinable()) { + mWatchDogThread.join(); + } return CreateStatusCode(STATUS_CODE_OK); } const StatusCode McuManagerImpl::SetMcuMonitor(std::shared_ptr &monitor) @@ -139,6 +152,28 @@ const char *McuManagerImpl::PrintIpcMissionString(const IpcMission &mission) } } } +void McuManagerImpl::WatchDogThread(void) +{ + class WatchDogAsk : public McuAskBase + { + public: + WatchDogAsk() : McuAskBase(McuAskBlock::UNRELATED, McuAskReply::NEED_NOT_REPLY) + { + } + virtual ~WatchDogAsk() = default; + }; + mWatchDogRuning = true; + constexpr int WATCH_DOG_CYCLE_MS = 1000 * 4; + std::shared_ptr ask = std::make_shared(); + std::shared_ptr context = std::make_shared>>(ask); + while (mWatchDogRuning) { + std::unique_lock lock(mMutex); + McuProtocol::FeedWatchDog(context); + mCv.wait_for(lock, std::chrono::milliseconds(WATCH_DOG_CYCLE_MS), [&] { + return !mWatchDogRuning; + }); + } +} std::shared_ptr McuManagerImpl::GetMcuMonitor(void) { auto monitor = mMonitor.lock(); diff --git a/middleware/McuManager/src/McuManagerImpl.h b/middleware/McuManager/src/McuManagerImpl.h index 47d72b37..0e012f73 100644 --- a/middleware/McuManager/src/McuManagerImpl.h +++ b/middleware/McuManager/src/McuManagerImpl.h @@ -17,10 +17,12 @@ #include "IMcuManager.h" #include "McuDevice.h" #include "McuProtocol.h" +#include #include #include #include #include +#include using std::placeholders::_1; using McuAskHandleFunc = std::function &)>; enum class OtherSideSendType @@ -51,6 +53,7 @@ public: const StatusCode ContorlInfraredLight(std::shared_ptr &ask, const ControlLight &control) override; const StatusCode GetPhotosensitivityValue(std::shared_ptr &ask) override; const char *PrintIpcMissionString(const IpcMission &mission) override; + void WatchDogThread(void); private: std::shared_ptr GetMcuMonitor(void); @@ -90,5 +93,8 @@ private: */ std::list> mMcuAskList; std::map mMcuAskHandle; + bool mWatchDogRuning = false; + std::thread mWatchDogThread; + std::condition_variable mCv; }; #endif \ No newline at end of file diff --git a/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp b/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp index 8461bd3c..9fe310df 100644 --- a/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp +++ b/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp @@ -562,6 +562,14 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_FeedWatchDog) IMcuManager::GetInstance()->UnInit(); } // ../output_files/test/bin/McuManagerTest +// --gtest_filter=McuManagerMockTest.HS_INTEGRATION_McuManager_AUTO_FeedWatchDogThread +TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_FeedWatchDogThread) +{ + IMcuManager::GetInstance()->Init(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + IMcuManager::GetInstance()->UnInit(); +} +// ../output_files/test/bin/McuManagerTest // --gtest_filter=McuManagerMockTest.HS_INTEGRATION_McuManager_AUTO_SetFeedingCycleForWatchDog TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_SetFeedingCycleForWatchDog) { @@ -946,6 +954,7 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_OtherSideGetIntervalSt recvData->mDataRecvReply.mMin = 10; recvData->mDataRecvReply.mSecond = 10; recv->ReplyFinished(true); + return; } recv->ReplyFinished(false); } @@ -984,6 +993,7 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_OtherSideGetIntervalSt recvData->mDataRecvReply.mMin = 10; recvData->mDataRecvReply.mSecond = 10; recv->ReplyFinished(true); + return; } recv->ReplyFinished(false); } @@ -1020,6 +1030,7 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_OtherSideGetDateTime) recvData->mDataRecvReply.mMin = 10; recvData->mDataRecvReply.mSecond = 10; recv->ReplyFinished(true); + return; } recv->ReplyFinished(false); } @@ -1061,6 +1072,7 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_OtherSideGetDateTime2) recvData->mDataRecvReply.mMin = 10; recvData->mDataRecvReply.mSecond = 10; recv->ReplyFinished(true); + return; } recv->ReplyFinished(false); } @@ -1092,6 +1104,7 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_OtherSideGetPirSensiti if (recvData) { recvData->mDataRecvReply.mSensitivity = 9; recv->ReplyFinished(true); + return; } recv->ReplyFinished(false); } @@ -1128,6 +1141,7 @@ TEST_F(McuManagerMockTest, HS_INTEGRATION_McuManager_AUTO_OtherSideGetPirSensiti if (recvData) { recvData->mDataRecvReply.mSensitivity = 9; recv->ReplyFinished(true); + return; } recv->ReplyFinished(false); } diff --git a/utils/McuProtocol/README.md b/utils/McuProtocol/README.md index fbeea00e..91971471 100644 --- a/utils/McuProtocol/README.md +++ b/utils/McuProtocol/README.md @@ -3,6 +3,8 @@   负责对MCU协议进行封包/解包,负责协议的多态替换。协议数据统一使用网络字节序(大端字节序)。 +**注:协议数据统一使用网络字节序(大端字节序)** + | 版本 | 时间 | 说明 | | ---- | ---- | ---- | | V1.0 | 2024-5-14 | 首次评审。 |