1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "dcamera_source_regist_state.h"
17
18 #include "dcamera_source_dev.h"
19 #include "dcamera_source_state_machine.h"
20 #include "distributed_camera_errno.h"
21 #include "distributed_hardware_log.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
DCameraSourceRegistState(std::shared_ptr<DCameraSourceStateMachine> & stateMachine)25 DCameraSourceRegistState::DCameraSourceRegistState(std::shared_ptr<DCameraSourceStateMachine>& stateMachine)
26 : stateMachine_(stateMachine)
27 {
28 memberFuncMap_[DCAMERA_EVENT_REGIST] = &DCameraSourceRegistState::DoRegisterTask;
29 memberFuncMap_[DCAMERA_EVENT_UNREGIST] = &DCameraSourceRegistState::DoUnregisterTask;
30 memberFuncMap_[DCAMERA_EVENT_OPEN] = &DCameraSourceRegistState::DoOpenTask;
31 memberFuncMap_[DCAMERA_EVENT_CLOSE] = &DCameraSourceRegistState::DoCloseTask;
32 memberFuncMap_[DCAMERA_EVENT_NOFIFY] = &DCameraSourceRegistState::DoEventNofityTask;
33 memberFuncMap_[DCAMERA_EVENT_GET_FULLCAPS] = &DCameraSourceRegistState::DoGetFullCaps;
34 }
35
Execute(std::shared_ptr<DCameraSourceDev> & camDev,DCAMERA_EVENT eventType,DCameraSourceEvent & event)36 int32_t DCameraSourceRegistState::Execute(std::shared_ptr<DCameraSourceDev>& camDev, DCAMERA_EVENT eventType,
37 DCameraSourceEvent& event)
38 {
39 DHLOGI("DCameraSourceRegistState execute %{public}d", eventType);
40 int32_t ret = DCAMERA_NOT_FOUND;
41 switch (eventType) {
42 case DCAMERA_EVENT_REGIST:
43 ret = DoRegisterTask(camDev, event);
44 break;
45 case DCAMERA_EVENT_UNREGIST:
46 ret = DoUnregisterTask(camDev, event);
47 break;
48 case DCAMERA_EVENT_OPEN:
49 ret = DoOpenTask(camDev, event);
50 break;
51 case DCAMERA_EVENT_CLOSE:
52 ret = DoCloseTask(camDev, event);
53 break;
54 case DCAMERA_EVENT_NOFIFY:
55 ret = DoEventNofityTask(camDev, event);
56 break;
57 case DCAMERA_EVENT_GET_FULLCAPS:
58 ret = DoGetFullCaps(camDev, event);
59 break;
60 default:
61 DHLOGE("DCameraSourceRegistState execute %{public}d in wrong state", eventType);
62 return DCAMERA_WRONG_STATE;
63 }
64 if (ret != DCAMERA_OK) {
65 DHLOGE("DCameraSourceRegistState execute %{public}d failed, ret: %{public}d", eventType, ret);
66 }
67 return ret;
68 }
69
GetStateType()70 DCameraStateType DCameraSourceRegistState::GetStateType()
71 {
72 return DCAMERA_STATE_REGIST;
73 }
74
DoRegisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)75 int32_t DCameraSourceRegistState::DoRegisterTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
76 {
77 CHECK_AND_RETURN_RET_LOG(camDev == nullptr, DCAMERA_BAD_VALUE, "camDev is nullptr");
78 DHLOGI("DCameraSourceRegistState DoRegisterTask");
79 std::shared_ptr<DCameraRegistParam> param;
80 int32_t ret = event.GetDCameraRegistParam(param);
81 if (ret != DCAMERA_OK) {
82 DHLOGE("DCameraSourceRegistState GetDCameraRegistParam failed");
83 return ret;
84 }
85 ret = camDev->Register(param);
86 if (ret != DCAMERA_OK) {
87 DHLOGE("DCameraSourceRegistState Register failed");
88 return ret;
89 }
90 return DCAMERA_OK;
91 }
92
93
DoUnregisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)94 int32_t DCameraSourceRegistState::DoUnregisterTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
95 {
96 CHECK_AND_RETURN_RET_LOG(camDev == nullptr, DCAMERA_BAD_VALUE, "camDev is nullptr");
97 std::shared_ptr<DCameraRegistParam> param;
98 int32_t ret = event.GetDCameraRegistParam(param);
99 if (ret != DCAMERA_OK) {
100 return ret;
101 }
102 ret = camDev->UnRegister(param);
103 if (ret != DCAMERA_OK) {
104 return ret;
105 }
106 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
107 if (stateMachine == nullptr) {
108 DHLOGE("DCameraSourceRegistState DoUnregisterTask can not get stateMachine");
109 return DCAMERA_BAD_VALUE;
110 }
111 stateMachine->UpdateState(DCAMERA_STATE_INIT);
112 return DCAMERA_OK;
113 }
114
DoOpenTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)115 int32_t DCameraSourceRegistState::DoOpenTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
116 {
117 CHECK_AND_RETURN_RET_LOG(camDev == nullptr, DCAMERA_BAD_VALUE, "camDev is nullptr");
118 int32_t ret = camDev->OpenCamera();
119 if (ret != DCAMERA_OK) {
120 DHLOGE("DCameraSourceRegistState OpenCamera failed, ret: %{public}d", ret);
121 return ret;
122 }
123 return DCAMERA_OK;
124 }
125
DoCloseTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)126 int32_t DCameraSourceRegistState::DoCloseTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
127 {
128 DHLOGI("DCameraSourceRegistState DoCloseTask Idempotent");
129 return DCAMERA_OK;
130 }
131
DoEventNofityTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)132 int32_t DCameraSourceRegistState::DoEventNofityTask(std::shared_ptr<DCameraSourceDev>& camDev,
133 DCameraSourceEvent& event)
134 {
135 CHECK_AND_RETURN_RET_LOG(camDev == nullptr, DCAMERA_BAD_VALUE, "camDev is nullptr");
136 std::shared_ptr<DCameraEvent> camEvent;
137 int32_t ret = event.GetCameraEvent(camEvent);
138 if (ret != DCAMERA_OK) {
139 return ret;
140 }
141
142 ret = camDev->CameraEventNotify(camEvent);
143 if (ret != DCAMERA_OK) {
144 DHLOGE("DCameraSourceRegistState DoEventNofityTask CameraEventNotify failed, ret: %{public}d", ret);
145 return ret;
146 }
147 return DCAMERA_OK;
148 }
149
DoGetFullCaps(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)150 int32_t DCameraSourceRegistState::DoGetFullCaps(std::shared_ptr<DCameraSourceDev>& camDev,
151 DCameraSourceEvent& event)
152 {
153 DHLOGI("DCameraSourceRegistState DoGetFullCaps enter.");
154 if (camDev == nullptr) {
155 DHLOGE("DCameraSourceRegistState camDev is null.");
156 return DCAMERA_BAD_VALUE;
157 }
158 int32_t ret = camDev->GetFullCaps();
159 if (ret != DCAMERA_OK) {
160 DHLOGE("DCameraSourceRegistState DoGetFullCaps GetFullCaps failed, ret: %{public}d", ret);
161 return ret;
162 }
163 return DCAMERA_OK;
164 }
165 } // namespace DistributedHardware
166 } // namespace OHOS
167