diff --git a/common/include/constants/distributed_camera_constants.h b/common/include/constants/distributed_camera_constants.h index 26a748d99cec874868006159d8d8197ef20db224..e105f0e7a7487de840bdbc3b5fbabf7c57cf8b1b 100644 --- a/common/include/constants/distributed_camera_constants.h +++ b/common/include/constants/distributed_camera_constants.h @@ -44,6 +44,7 @@ typedef enum { DCAMERA_MESSAGE = 0, DCAMERA_OPERATION = 1, DCAMERA_SINK_STOP = 2, + DCAMERE_GETFULLCAP = 3, } DCameraEventType; typedef enum { diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_dev.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_dev.h index 4932d54989aabcc672ae38392d0b86ef8224b2f5..3e214d1d0997b5e53da0441609368b8291f1714f 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_dev.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_dev.h @@ -32,8 +32,15 @@ namespace OHOS { namespace DistributedHardware { +enum DcameraBusinessState : int32_t { + UNKNOWN, + IDLE, + RUNNING, + PAUSING +}; const uint32_t EVENT_SOURCE_DEV_PROCESS = 0; const uint32_t EVENT_HICOLLIE = 1; +const uint32_t EVENT_PROCESS_HDF_NOTIFY = 2; class DCameraSourceDev : public std::enable_shared_from_this { public: explicit DCameraSourceDev(std::string devId, std::string dhId, std::shared_ptr& stateLisener); @@ -52,6 +59,7 @@ public: int32_t StartCameraCapture(const std::vector>& captureInfos); int32_t StopCameraCapture(const std::vector& streamIds); int32_t UpdateCameraSettings(const std::vector>& settings); + int32_t ProcessHDFEvent(const DCameraHDFEvent& event); int32_t GetStateInfo(); std::string GetVersion(); @@ -60,6 +68,7 @@ public: int32_t PostHicollieEvent(); void SetHicollieFlag(bool flag); bool GetHicollieFlag(); + int32_t GetFullCaps(); class DCameraSourceDevEventHandler : public AppExecFwk::EventHandler { public: @@ -95,6 +104,7 @@ private: void HitraceAndHisyseventImpl(std::vector>& captureInfos); int32_t ParseEnableParam(std::shared_ptr& param, std::string& ability); void DoProcessData(const AppExecFwk::InnerEvent::Pointer &event); + void DoProcesHDFEvent(const AppExecFwk::InnerEvent::Pointer &event); void DoHicollieProcess(); private: diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_event.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_event.h index a820fc8f1df4d107587cb8dacd5fe827dca33edb..6a81a1d68422e331e2fbf1a5b55ab3b4f9b31b5e 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_event.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamera_source_event.h @@ -38,6 +38,7 @@ typedef enum { DCAMERA_EVENT_UPDATE_SETTINGS = 8, DCAMERA_EVENT_NOFIFY = 9, DCAMERA_EVENT_HICOLLIE = 10, + DCAMERA_EVENT_GET_FULLCAPS = 11, } DCAMERA_EVENT; class DCameraRegistParam { diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerastate/dcamera_source_regist_state.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerastate/dcamera_source_regist_state.h index 7b5b85689093336d60b39976461a4dcca656b3f1..4a3fc79f7dd374f8670cfc42455ecb88d3177c62 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerastate/dcamera_source_regist_state.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerastate/dcamera_source_regist_state.h @@ -36,6 +36,7 @@ private: int32_t DoOpenTask(std::shared_ptr& camDev, DCameraSourceEvent& event); int32_t DoCloseTask(std::shared_ptr& camDev, DCameraSourceEvent& event); int32_t DoEventNofityTask(std::shared_ptr& camDev, DCameraSourceEvent& event); + int32_t DoGetFullCaps(std::shared_ptr& camDev, DCameraSourceEvent& event); using DCameraFunc = int32_t (DCameraSourceRegistState::*)(std::shared_ptr& camDev, DCameraSourceEvent& event); diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp index 4131d83e2ecdfc5147108faf9d0b8f60f993f4c2..1d7d422928cd9b157d1009bd8099c69e47a7ffe4 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp @@ -254,6 +254,29 @@ int32_t DCameraSourceDev::UpdateCameraSettings(const std::vector eventParam = std::make_shared(DCAMERA_EVENT_GET_FULLCAPS); + CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr."); + AppExecFwk::InnerEvent::Pointer msgEvent = + AppExecFwk::InnerEvent::Get(EVENT_PROCESS_HDF_NOTIFY, eventParam, 0); + srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE); + return DCAMERA_OK; +} + +int32_t DCameraSourceDev::GetFullCaps() +{ + DHLOGI("DCameraSourceDev GetFullCaps enter."); + if (stateListener_ == nullptr) { + DHLOGE("DCameraSourceDev DoSyncTrigger, stateListener_ is nullptr."); + return DCAMERA_BAD_VALUE; + } + stateListener_->OnDataSyncTrigger(devId_); + return DCAMERA_OK; +} + void DCameraSourceDev::DoHicollieProcess() { SetHicollieFlag(true); @@ -271,6 +294,18 @@ void DCameraSourceDev::DoProcessData(const AppExecFwk::InnerEvent::Pointer &even NotifyResult((*eventParam).GetEventType(), (*eventParam), ret); } +void DCameraSourceDev::DoProcesHDFEvent(const AppExecFwk::InnerEvent::Pointer &event) +{ + std::shared_ptr eventParam = event->GetSharedObject(); + CHECK_AND_RETURN_LOG(eventParam == nullptr, "eventParam is nullptr."); + CHECK_AND_RETURN_LOG(stateMachine_ == nullptr, "stateMachine_ is nullptr."); + int32_t ret = stateMachine_->Execute((*eventParam).GetEventType(), (*eventParam)); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceDev Execute failed, ret: %{public}d, devId: %{public}s dhId: %{public}s", ret, + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); + } +} + DCameraSourceDev::DCameraSourceDevEventHandler::DCameraSourceDevEventHandler( const std::shared_ptr &runner, std::shared_ptr srcDevPtr) : AppExecFwk::EventHandler(runner), srcDevPtrWPtr_(srcDevPtr) @@ -294,6 +329,9 @@ void DCameraSourceDev::DCameraSourceDevEventHandler::ProcessEvent(const AppExecF case EVENT_SOURCE_DEV_PROCESS: srcDevPtr->DoProcessData(event); break; + case EVENT_PROCESS_HDF_NOTIFY: + srcDevPtr->DoProcesHDFEvent(event); + break; default: DHLOGE("event is undefined, id is %d", eventId); break; @@ -444,6 +482,8 @@ int32_t DCameraSourceDev::OpenCamera() DcameraFinishAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID); return DCAMERA_OPEN_CONFLICT; } + CHECK_AND_RETURN_RET_LOG(stateListener_ == nullptr, DCAMERA_BAD_VALUE, "stateListener_ is nullptr."); + stateListener_->OnHardwareStateChanged(devId_, dhId_, DcameraBusinessState::RUNNING); return DCAMERA_OK; } @@ -462,6 +502,8 @@ int32_t DCameraSourceDev::CloseCamera() DHLOGE("DCameraSourceDev Execute CloseCamera controller CloseChannel failed, ret: %{public}d, devId: " "%{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); } + CHECK_AND_RETURN_RET_LOG(stateListener_ == nullptr, DCAMERA_BAD_VALUE, "stateListener_ is nullptr."); + stateListener_->OnHardwareStateChanged(devId_, dhId_, DcameraBusinessState::IDLE); return DCAMERA_OK; } diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_provider_callback_impl.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_provider_callback_impl.cpp index 1bdc3bb41cd91d8c89f1908e3ff68e951692567c..c0204f2d730a407d9e876126f90d95b393d00a45 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_provider_callback_impl.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_provider_callback_impl.cpp @@ -301,6 +301,20 @@ int32_t DCameraProviderCallbackImpl::UpdateSettings(const DHBase& dhBase, const int32_t DCameraProviderCallbackImpl::NotifyEvent(const DHBase& dhBase, const DCameraHDFEvent& event) { + DHLOGI("DCameraProviderCallbackImpl NotifyEvent enter."); + std::shared_ptr sourceDev = sourceDev_.lock(); + if (sourceDev == nullptr) { + DHLOGE("Process Event failed, can not get device, devId: %{public}s, dhId: %{public}s", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); + return FAILED; + } + int32_t ret = sourceDev->ProcessHDFEvent(event); + if (ret != DCAMERA_OK) { + DHLOGE("Process Event failed, ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); + return FAILED; + } + DHLOGI("DCameraProviderCallbackImpl NotifyEvent end."); return SUCCESS; } } // namespace DistributedHardware diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerastate/dcamera_source_regist_state.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerastate/dcamera_source_regist_state.cpp index a4162ff9637c699e3c5aa1576e737704c1902661..45329404d98ee450f907179dee5af91684c3540e 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerastate/dcamera_source_regist_state.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerastate/dcamera_source_regist_state.cpp @@ -30,6 +30,7 @@ DCameraSourceRegistState::DCameraSourceRegistState(std::shared_ptr& camDev, DCAMERA_EVENT eventType, @@ -56,9 +57,18 @@ DCameraStateType DCameraSourceRegistState::GetStateType() int32_t DCameraSourceRegistState::DoRegisterTask(std::shared_ptr& camDev, DCameraSourceEvent& event) { - DHLOGI("DCameraSourceRegistState DoRegisterTask Idempotent"); - (void)camDev; - (void)event; + DHLOGI("DCameraSourceRegistState DoRegisterTask"); + std::shared_ptr param; + int32_t ret = event.GetDCameraRegistParam(param); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceRegistState GetDCameraRegistParam failed"); + return ret; + } + ret = camDev->Register(param); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceRegistState Register failed"); + return ret; + } return DCAMERA_OK; } @@ -115,5 +125,21 @@ int32_t DCameraSourceRegistState::DoEventNofityTask(std::shared_ptr& camDev, + DCameraSourceEvent& event) +{ + DHLOGI("DCameraSourceRegistState DoGetFullCaps enter."); + if (camDev == nullptr) { + DHLOGE("DCameraSourceRegistState camDev is null."); + return DCAMERA_BAD_VALUE; + } + int32_t ret = camDev->GetFullCaps(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceRegistState DoGetFullCaps GetFullCaps failed, ret: %{public}d", ret); + return ret; + } + return DCAMERA_OK; +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_provider_callback_impl_test.cpp b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_provider_callback_impl_test.cpp index 9262477b4943accdf0029e3551d515d355984b6f..e5b44d9ce2c23d593474511948c39b72956c28e4 100644 --- a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_provider_callback_impl_test.cpp +++ b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_provider_callback_impl_test.cpp @@ -445,5 +445,23 @@ HWTEST_F(DCameraProviderCallbackImplTest, dcamera_provider_callback_impl_test_01 ret = testProviderCallback->StopCapture(dhBase, streamIds); EXPECT_EQ(FAILED, ret); } + +/** + * @tc.name: dcamera_provider_callback_impl_test_014 + * @tc.desc: Verify NotifyEvent func. + * @tc.type: FUNC + * @tc.require: issue + */ +HWTEST_F(DCameraProviderCallbackImplTest, dcamera_provider_callback_impl_test_014, TestSize.Level1) +{ + DHBase dhBase{TEST_DEVICE_ID, TEST_CAMERA_DH_ID_0}; + DCameraHDFEvent event; + event.type_ = DCameraEventType::DCAMERE_GETFULLCAP; + int32_t ret = testProviderCallback_->NotifyEvent(dhBase, event); + EXPECT_EQ(SUCCESS, ret); + event.type_ = DCameraEventType::DCAMERA_MESSAGE; + ret = testProviderCallback_->NotifyEvent(dhBase, event); + EXPECT_EQ(SUCCESS, ret); +} } // namespace DistributedHardware } // namespace OHOS