mirror of
				https://gitee.com/jiuyilian/embedded-framework.git
				synced 2025-10-24 18:20:15 -04:00 
			
		
		
		
	Improve:watch dog thread.
This commit is contained in:
		
							parent
							
								
									844ecd7e8b
								
							
						
					
					
						commit
						8f89a12e5e
					
				|  | @ -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<McuManagerImpl> 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<VMcuMonitor> &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<VMcuAsk> ask = std::make_shared<WatchDogAsk>(); | ||||
|     std::shared_ptr<VProtocolContext> context = std::make_shared<ProtocolContext<std::shared_ptr<VMcuAsk>>>(ask); | ||||
|     while (mWatchDogRuning) { | ||||
|         std::unique_lock<std::mutex> lock(mMutex); | ||||
|         McuProtocol::FeedWatchDog(context); | ||||
|         mCv.wait_for(lock, std::chrono::milliseconds(WATCH_DOG_CYCLE_MS), [&] { | ||||
|             return !mWatchDogRuning; | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| std::shared_ptr<VMcuMonitor> McuManagerImpl::GetMcuMonitor(void) | ||||
| { | ||||
|     auto monitor = mMonitor.lock(); | ||||
|  |  | |||
|  | @ -17,10 +17,12 @@ | |||
| #include "IMcuManager.h" | ||||
| #include "McuDevice.h" | ||||
| #include "McuProtocol.h" | ||||
| #include <condition_variable> | ||||
| #include <functional> | ||||
| #include <list> | ||||
| #include <map> | ||||
| #include <mutex> | ||||
| #include <thread> | ||||
| using std::placeholders::_1; | ||||
| using McuAskHandleFunc = std::function<void(std::shared_ptr<VMcuRecv> &)>; | ||||
| enum class OtherSideSendType | ||||
|  | @ -51,6 +53,7 @@ public: | |||
|     const StatusCode ContorlInfraredLight(std::shared_ptr<VMcuAsk> &ask, const ControlLight &control) override; | ||||
|     const StatusCode GetPhotosensitivityValue(std::shared_ptr<VMcuAsk> &ask) override; | ||||
|     const char *PrintIpcMissionString(const IpcMission &mission) override; | ||||
|     void WatchDogThread(void); | ||||
| 
 | ||||
| private: | ||||
|     std::shared_ptr<VMcuMonitor> GetMcuMonitor(void); | ||||
|  | @ -90,5 +93,8 @@ private: | |||
|      */ | ||||
|     std::list<std::shared_ptr<VMcuRecv>> mMcuAskList; | ||||
|     std::map<OtherSideSendType, McuAskHandleFunc> mMcuAskHandle; | ||||
|     bool mWatchDogRuning = false; | ||||
|     std::thread mWatchDogThread; | ||||
|     std::condition_variable mCv; | ||||
| }; | ||||
| #endif | ||||
|  | @ -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); | ||||
|         } | ||||
|  |  | |||
|  | @ -3,6 +3,8 @@ | |||
| 
 | ||||
|   负责对MCU协议进行封包/解包,负责协议的多态替换。协议数据统一使用网络字节序(大端字节序)。 | ||||
| 
 | ||||
| **注:协议数据统一使用网络字节序(大端字节序)** | ||||
| 
 | ||||
| | 版本 | 时间 | 说明 | | ||||
| | ---- | ---- | ---- | | ||||
| | V1.0 | 2024-5-14 | 首次评审。 | | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fancy code
						Fancy code