diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index 7da9ecc..a135c7a 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -24,8 +24,17 @@ using VirtualKeyEvent = unsigned char; constexpr int INVALID_PERIOD = -1; constexpr int PERIPHERAL_CHECK_PERIOD_MS = 100; constexpr int IMEI_LEN = 15; -constexpr long int KEY_DO_NOT_HOLD_PRESSING = -1; +// constexpr long int KEY_DO_NOT_HOLD_PRESSING = -1; void CreateHalCppModule(void); +class VKeyHalMonitor +{ +public: + VKeyHalMonitor() = default; + virtual ~VKeyHalMonitor() = default; + virtual void KeyEventHappened(const std::string &keyName, const VirtualKeyEvent &event, const unsigned int &timeMs) + { + } +}; class VKeyHal { public: @@ -34,6 +43,7 @@ public: virtual void CheckKeyStatus(void) {} virtual const std::string GetKeyName(void) { return "undefine"; } virtual void GetHoldPressingTimeMs(long int &holdTimeMs, VirtualKeyEvent &event) {} + virtual void SetKeyMonitor(std::shared_ptr &monitor) {} }; class VLedHal { diff --git a/hal/src/HalCpp.cpp b/hal/src/HalCpp.cpp index d6ee8d0..ba77430 100644 --- a/hal/src/HalCpp.cpp +++ b/hal/src/HalCpp.cpp @@ -24,8 +24,3 @@ StatusCode HalCpp::UnInit(void) LogInfo("HalCpp::UnInit\n"); return CreateStatusCode(STATUS_CODE_OK); } -StatusCode HalCpp::GetLedHals(std::vector> &ledHals) -{ - ledHals = mLedHals; - return CreateStatusCode(STATUS_CODE_OK); -} diff --git a/hal/src/HalCpp.h b/hal/src/HalCpp.h index 4185a94..fb28a87 100644 --- a/hal/src/HalCpp.h +++ b/hal/src/HalCpp.h @@ -22,7 +22,6 @@ public: virtual ~HalCpp() = default; StatusCode Init(void) override; StatusCode UnInit(void) override; - StatusCode GetLedHals(std::vector> &ledHals) override; private: std::vector> mLedHals; diff --git a/middleware/DeviceManager/src/KeyManager.cpp b/middleware/DeviceManager/src/KeyManager.cpp index dea0887..5ec0079 100644 --- a/middleware/DeviceManager/src/KeyManager.cpp +++ b/middleware/DeviceManager/src/KeyManager.cpp @@ -44,6 +44,7 @@ void KeyManager::StartTimer(void) LogError("StartTimer failed, no key to manager.\n"); return; } + SetAllKeysMonitor(); auto timerThread = [](std::shared_ptr timer) { LogInfo("Key timer started.\n"); timer->Timer(); @@ -62,11 +63,6 @@ void KeyManager::Timer(void) mTimerRuning = true; std::map>::iterator iter; while (mTimerRuning) { - // for (int i = 0; i < static_cast(SfKeyDefine::KEY_PIN_END); i++) - // { - // mKeyManagers[static_cast(i)]->TimerKeyEventHappened(static_cast(i), - // SfKeyEvent::KEY_EVENT_PRESSED, nullptr); - // } for (iter = mAllKeyHal.begin(); iter != mAllKeyHal.end(); ++iter) { std::shared_ptr keyHal = iter->second; keyHal->CheckKeyStatus(); @@ -85,4 +81,17 @@ void KeyManager::GetAllKeysState(std::map &status) KeyStatus result(holdPressingEvent, holdTimeMs); status.insert(std::make_pair(iter->first, result)); } +} +void KeyManager::SetAllKeysMonitor(void) +{ + std::map>::iterator iter; + for (iter = mAllKeyHal.begin(); iter != mAllKeyHal.end(); ++iter) { + std::shared_ptr keyHal = iter->second; + std::shared_ptr monitor = shared_from_this(); + keyHal->SetKeyMonitor(monitor); + } +} +void KeyManager::KeyEventHappened(const std::string &keyName, const VirtualKeyEvent &event, const unsigned int &timeMs) +{ + // } \ No newline at end of file diff --git a/middleware/DeviceManager/src/KeyManager.h b/middleware/DeviceManager/src/KeyManager.h index a8f614b..d394990 100644 --- a/middleware/DeviceManager/src/KeyManager.h +++ b/middleware/DeviceManager/src/KeyManager.h @@ -20,7 +20,7 @@ #include #include #include -class KeyManager : public std::enable_shared_from_this +class KeyManager : public VKeyHalMonitor, public std::enable_shared_from_this { public: KeyManager() = default; @@ -33,6 +33,13 @@ public: void Timer(void); void GetAllKeysState(std::map &status); +private: + void SetAllKeysMonitor(void); + +private: + void KeyEventHappened(const std::string &keyName, const VirtualKeyEvent &event, + const unsigned int &timeMs) override; + private: std::mutex mMutex; std::map> mAllKeyHal; diff --git a/test/hal/tool/CMakeLists.txt b/test/hal/tool/CMakeLists.txt index f29c7d0..5eb2636 100644 --- a/test/hal/tool/CMakeLists.txt +++ b/test/hal/tool/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories( ./include ${UTILS_SOURCE_PATH}/StatusCode/include ${UTILS_SOURCE_PATH}/Log/include + ${UTILS_SOURCE_PATH}/KeyControl/include # ${UTILS_SOURCE_PATH}/McuProtocol/include ${HAL_SOURCE_PATH}/src # /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/hal/src/HalCpp.h @@ -20,7 +21,7 @@ include_directories( aux_source_directory(./src TEST_TOOL_SRC_FILES) set(TEST_TOOL_TARGET HalTestTool) add_library(${TEST_TOOL_TARGET} STATIC ${TEST_TOOL_SRC_FILES}) -target_link_libraries(${TEST_TOOL_TARGET} Log) +target_link_libraries(${TEST_TOOL_TARGET} KeyControl Log) if ("${CLANG_TIDY_SUPPORT}" MATCHES "true") add_custom_target( diff --git a/test/hal/tool/include/HalTestTool.h b/test/hal/tool/include/HalTestTool.h index a258c66..562b6b3 100644 --- a/test/hal/tool/include/HalTestTool.h +++ b/test/hal/tool/include/HalTestTool.h @@ -15,6 +15,7 @@ #ifndef HAL_TEST_TOOL_H #define HAL_TEST_TOOL_H #include "HalCpp.h" +#include "KeyControl.h" #include #include using ::testing::_; @@ -42,6 +43,7 @@ using ::testing::ReturnRefOfCopy; using ::testing::ReturnRoundRobin; using ::testing::SaveArg; using ::testing::SetArgPointee; +using ::testing::SetArgReferee; using ::testing::SetArgumentPointee; using ::testing::Unused; using ::testing::WithArgs; @@ -52,9 +54,11 @@ public: HalCppTest() = default; virtual ~HalCppTest() = default; StatusCode GetLedHals(std::vector> &ledHals) override; + StatusCode GetAllKeys(std::map> &allKeys) override; protected: virtual StatusCode GetLedHalsTrace(std::vector> &ledHals); + virtual StatusCode GetAllKeysTrace(std::map> &allKeys); }; class HalCppMock : public HalCppTest { @@ -62,6 +66,27 @@ public: HalCppMock() = default; virtual ~HalCppMock() = default; MOCK_METHOD1(GetLedHalsTrace, StatusCode(std::vector> &)); + MOCK_METHOD1(GetAllKeysTrace, StatusCode(std::map> &)); +}; +class KeyControlTest : public KeyControl, public VKeyHal +{ +public: + KeyControlTest() = default; + virtual ~KeyControlTest() = default; + unsigned int GetStatusCheckPeriodMs(void) override { return PERIPHERAL_CHECK_PERIOD_MS; } + void SetKeyMonitor(std::shared_ptr &monitor) override; + void CheckKeyStatus(void) override; + void KeyEventTrigger(const std::string &keyName, const KeyEvent &event, const unsigned int &timeMs) override; + +private: + std::shared_ptr mMonitor; +}; +class KeyControlMock : public KeyControlTest +{ +public: + KeyControlMock() = default; + virtual ~KeyControlMock() = default; + void SetKeyEvent(const KeyHalEvent &event); }; class HalTestTool { @@ -70,8 +95,16 @@ public: virtual ~HalTestTool() = default; void Init(void); void UnInit(void); + void SetAllKeysResult(std::map> &allKeys); + void SetKeyEvent(const std::string keyName, const KeyHalEvent &event); + +private: + void HalMockInit(std::shared_ptr &mock); + void SetAllKeysResult(std::shared_ptr &mock, std::map> &allKeys); + std::shared_ptr SearchKey(const std::string &keyName); private: std::shared_ptr mHalMock; + std::map> mAllKeys; }; #endif \ No newline at end of file diff --git a/test/hal/tool/src/HalTestTool.cpp b/test/hal/tool/src/HalTestTool.cpp index f714025..4d66d77 100644 --- a/test/hal/tool/src/HalTestTool.cpp +++ b/test/hal/tool/src/HalTestTool.cpp @@ -24,17 +24,49 @@ StatusCode HalCppTest::GetLedHals(std::vector> &ledHals } return code; } +StatusCode HalCppTest::GetAllKeys(std::map> &allKeys) +{ + LogInfo("HalCppTest::GetAllKeys\n"); + StatusCode code = GetAllKeysTrace(allKeys); + if (StatusCodeEqual(code, "STATUS_CODE_VIRTUAL_FUNCTION")) { + return HalCpp::GetAllKeys(allKeys); + } + return code; +} StatusCode HalCppTest::GetLedHalsTrace(std::vector> &ledHals) { - // LogInfo("HalCppTest::GetLedHalsTrace\n"); return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } +StatusCode HalCppTest::GetAllKeysTrace(std::map> &allKeys) +{ + LogInfo("HalCppTest::GetAllKeysTrace\n"); + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +void KeyControlTest::SetKeyMonitor(std::shared_ptr &monitor) +{ + // + mMonitor = monitor; +} +void KeyControlTest::CheckKeyStatus(void) +{ + // + TimerKeyEventTrigger(KeyHalEvent::PRESSING); +} +void KeyControlTest::KeyEventTrigger(const std::string &keyName, const KeyEvent &event, const unsigned int &timeMs) +{ + LogInfo("KeyEventTrigger time = %u\n", timeMs); + mMonitor->KeyEventHappened(keyName, static_cast(event), timeMs); +} +void KeyControlMock::SetKeyEvent(const KeyHalEvent &event) +{ + // + KeyHalEventTrigger(event); +} void HalTestTool::Init(void) { mHalMock = std::make_shared(); - EXPECT_CALL(*mHalMock.get(), GetLedHalsTrace(_)) - .WillRepeatedly(DoAll(Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION)))); + HalMockInit(mHalMock); OverrideHalMakePtrObject(mHalMock); } void HalTestTool::UnInit(void) @@ -43,4 +75,44 @@ void HalTestTool::UnInit(void) // IHalCpp::GetInstance(&impl); mHalMock.reset(); CancelOverrideHalMakePtrObject(); +} +void HalTestTool::SetAllKeysResult(std::map> &allKeys) +{ + SetAllKeysResult(mHalMock, allKeys); + mAllKeys = allKeys; +} +void HalTestTool::SetKeyEvent(const std::string keyName, const KeyHalEvent &event) +{ + std::shared_ptr key = SearchKey(keyName); + if (!key) { + LogError("Can't set key event, key not found.\n"); + return; + } + key->SetKeyEvent(event); +} +void HalTestTool::SetAllKeysResult(std::shared_ptr &mock, + std::map> &allKeys) +{ + EXPECT_CALL(*mock.get(), GetAllKeysTrace(_)) + .WillRepeatedly(DoAll(SetArgReferee<0>(allKeys), Return(CreateStatusCode(STATUS_CODE_OK)))); +} +std::shared_ptr HalTestTool::SearchKey(const std::string &keyName) +{ + std::shared_ptr mock; + std::map>::iterator iter; + iter = mAllKeys.find(keyName); + if (iter != mAllKeys.end()) { + mock = std::dynamic_pointer_cast(mAllKeys[keyName]); + } + else { + LogWarning("Can't found the key control.\n"); + } + return mock; +} +void HalTestTool::HalMockInit(std::shared_ptr &mock) +{ + EXPECT_CALL(*mock.get(), GetLedHalsTrace(_)) + .WillRepeatedly(DoAll(Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION)))); + EXPECT_CALL(*mock.get(), GetAllKeysTrace(_)) + .WillRepeatedly(DoAll(Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION)))); } \ No newline at end of file diff --git a/test/middleware/DeviceManager/CMakeLists.txt b/test/middleware/DeviceManager/CMakeLists.txt index 05d254c..c55ef3d 100644 --- a/test/middleware/DeviceManager/CMakeLists.txt +++ b/test/middleware/DeviceManager/CMakeLists.txt @@ -10,6 +10,7 @@ include_directories( ${UTILS_SOURCE_PATH}/StatusCode/include ${UTILS_SOURCE_PATH}/UartDevice/include ${UTILS_SOURCE_PATH}/McuProtocol/include + ${UTILS_SOURCE_PATH}/KeyControl/include ${HAL_SOURCE_PATH}/include ${HAL_SOURCE_PATH}/src ${MIDDLEWARE_SOURCE_PATH}/DeviceManager/include diff --git a/test/middleware/DeviceManager/src/DeviceManager_Test.cpp b/test/middleware/DeviceManager/src/DeviceManager_Test.cpp index 2364e2c..fa33fcf 100644 --- a/test/middleware/DeviceManager/src/DeviceManager_Test.cpp +++ b/test/middleware/DeviceManager/src/DeviceManager_Test.cpp @@ -59,8 +59,14 @@ public: // ../output_files/test/bin/DeviceManagerTest --gtest_filter=DeviceManagerTest.INTEGRATION_DeviceManager_EXAMPLE_Demo TEST_F(DeviceManagerTest, INTEGRATION_DeviceManager_EXAMPLE_Demo) { + std::map> allKeys; + std::shared_ptr key = std::make_shared(); + allKeys["test"] = key; + SetAllKeysResult(allKeys); IDeviceManager::GetInstance()->Init(); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + SetKeyEvent("test", KeyHalEvent::PRESSING); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); IDeviceManager::GetInstance()->UnInit(); } } // namespace DeviceManagerTest \ No newline at end of file diff --git a/utils/KeyControl/include/KeyControl.h b/utils/KeyControl/include/KeyControl.h index 691346d..eef56b0 100644 --- a/utils/KeyControl/include/KeyControl.h +++ b/utils/KeyControl/include/KeyControl.h @@ -18,7 +18,6 @@ #include #include constexpr long int KEY_DO_NOT_HOLD_PRESSING = -1; -constexpr int PERIPHERAL_CHECK_PERIOD_MS = 100; constexpr int KEY_ACTION_LONG_CLICK = 1000 * 5; constexpr int KEY_ACTION_SHORT_CLICK = 200; constexpr int KEY_ACTION_HOLD_DWON = 500; @@ -36,32 +35,27 @@ enum class KeyEvent HOLD_UP, END }; -class VKeyHal -{ -public: - VKeyHal() = default; - virtual ~VKeyHal() = default; - virtual void KeyEventTrigger(const KeyHalEvent &event) {} - virtual void TimerKeyEventTrigger(const KeyHalEvent &event) {} - virtual long int GetHoldPressingTimeMs(void) { return KEY_DO_NOT_HOLD_PRESSING; } -}; class VKeyControl { public: VKeyControl() = default; virtual ~VKeyControl() = default; - // virtual void SetKeyHalOwner(std::shared_ptr owner) {} virtual const std::string GetKeyName(void) { return "undefine"; } + virtual unsigned int GetStatusCheckPeriodMs(void) { return 0; } + virtual void KeyHalEventTrigger(const KeyHalEvent &event) {} + virtual void KeyEventTrigger(const std::string &keyName, const KeyEvent &event, const unsigned int &timeMs) {} + virtual void TimerKeyEventTrigger(const KeyHalEvent &event) {} + virtual long int GetHoldPressingTimeMs(void) { return KEY_DO_NOT_HOLD_PRESSING; } }; -using KeyActionReport = std::function; -class KeyControl : public VKeyControl, public VKeyHal, public std::enable_shared_from_this +// using KeyActionReport = std::function; +class KeyControl : public VKeyControl, public std::enable_shared_from_this { public: KeyControl(); - KeyControl(std::shared_ptr &keyHal, const KeyActionReport &keyAction, - const long int &longClickTime = KEY_ACTION_LONG_CLICK); + // KeyControl(std::shared_ptr &keyHal, const KeyActionReport &keyAction, + // const long int &longClickTime = KEY_ACTION_LONG_CLICK); ~KeyControl(); - void KeyEventTrigger(const KeyHalEvent &event) override; + void KeyHalEventTrigger(const KeyHalEvent &event) override; void TimerKeyEventTrigger(const KeyHalEvent &event) override; long int GetHoldPressingTimeMs(void) override; void Init(void); @@ -75,8 +69,6 @@ private: private: std::mutex mMutex; - // std::shared_ptr mKeyHal; - KeyActionReport mKeyActionReport; long int mPressingTime; long int mLongClickTime; }; diff --git a/utils/KeyControl/src/KeyControl.cpp b/utils/KeyControl/src/KeyControl.cpp index 7d9848d..e2302dd 100644 --- a/utils/KeyControl/src/KeyControl.cpp +++ b/utils/KeyControl/src/KeyControl.cpp @@ -19,18 +19,18 @@ constexpr unsigned int NOT_A_HOLD_KEY_ACTION = 0; KeyControl::KeyControl() { // mKeyHal = nullptr; - mKeyActionReport = nullptr; + // mKeyActionReport = nullptr; mPressingTime = KEY_NOT_PRESSING; mLongClickTime = 0; } -KeyControl::KeyControl(std::shared_ptr &keyHal, const KeyActionReport &keyAction, - const long int &longClickTime) - : mKeyActionReport(keyAction), mLongClickTime(longClickTime) -{ - mPressingTime = KEY_NOT_PRESSING; -} +// KeyControl::KeyControl(std::shared_ptr &keyHal, const KeyActionReport &keyAction, +// const long int &longClickTime) +// : mKeyActionReport(keyAction), mLongClickTime(longClickTime) +// { +// mPressingTime = KEY_NOT_PRESSING; +// } KeyControl::~KeyControl() {} -void KeyControl::KeyEventTrigger(const KeyHalEvent &event) +void KeyControl::KeyHalEventTrigger(const KeyHalEvent &event) { std::lock_guard locker(mMutex); ActionReport(GetKeyName(), event); @@ -49,7 +49,7 @@ void KeyControl::UnInit(void) {} void KeyControl::ActionReport(const std::string &key, const KeyHalEvent &keyEvent) { if (KEY_PRESSING <= mPressingTime) { - mPressingTime += PERIPHERAL_CHECK_PERIOD_MS; + mPressingTime += GetStatusCheckPeriodMs(); } switch (keyEvent) { case KeyHalEvent::PRESSING: @@ -67,14 +67,9 @@ void KeyControl::KeyPressingTrigger(const std::string &key) { if (mLongClickTime <= mPressingTime) // Do not support long click, it should be count in application code. { - if (mKeyActionReport) { - // mKeyActionReport(key, KeyEvent::SF_KEY_ACTION_LONG_CLICK, NOT_A_HOLD_KEY_ACTION); - } } if (mPressingTime != KEY_NOT_PRESSING && mPressingTime % KEY_ACTION_HOLD_DWON == 0) { - if (mKeyActionReport) { - mKeyActionReport(key, KeyEvent::HOLD_DOWN, mPressingTime); - } + KeyEventTrigger(key, KeyEvent::HOLD_DOWN, mPressingTime); } if (KEY_NOT_PRESSING == mPressingTime) { mPressingTime = KEY_PRESSING; @@ -83,14 +78,10 @@ void KeyControl::KeyPressingTrigger(const std::string &key) void KeyControl::KeyNotPressingTrigger(const std::string &key) { if (KEY_ACTION_SHORT_CLICK <= mPressingTime && mPressingTime < KEY_ACTION_HOLD_DWON) { - if (mKeyActionReport) { - mKeyActionReport(key, KeyEvent::SHORT_CLICK, NOT_A_HOLD_KEY_ACTION); - } + KeyEventTrigger(key, KeyEvent::SHORT_CLICK, mPressingTime); } if (KEY_ACTION_HOLD_DWON <= mPressingTime) { - if (mKeyActionReport) { - mKeyActionReport(key, KeyEvent::HOLD_UP, mPressingTime); - } + KeyEventTrigger(key, KeyEvent::HOLD_UP, mPressingTime); } mPressingTime = KEY_NOT_PRESSING; } \ No newline at end of file