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_capture_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 {
DCameraSourceCaptureState(std::shared_ptr<DCameraSourceStateMachine> & stateMachine)25 DCameraSourceCaptureState::DCameraSourceCaptureState(std::shared_ptr<DCameraSourceStateMachine>& stateMachine)
26 : stateMachine_(stateMachine)
27 {
28 memberFuncMap_[DCAMERA_EVENT_REGIST] = &DCameraSourceCaptureState::DoRegisterTask;
29 memberFuncMap_[DCAMERA_EVENT_UNREGIST] = &DCameraSourceCaptureState::DoUnregisterTask;
30 memberFuncMap_[DCAMERA_EVENT_OPEN] = &DCameraSourceCaptureState::DoOpenTask;
31 memberFuncMap_[DCAMERA_EVENT_CLOSE] = &DCameraSourceCaptureState::DoCloseTask;
32 memberFuncMap_[DCAMERA_EVENT_START_CAPTURE] = &DCameraSourceCaptureState::DoStartCaptureTask;
33 memberFuncMap_[DCAMERA_EVENT_STOP_CAPTURE] = &DCameraSourceCaptureState::DoStopCaptureTask;
34 memberFuncMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = &DCameraSourceCaptureState::DoUpdateSettingsTask;
35 memberFuncMap_[DCAMERA_EVENT_NOFIFY] = &DCameraSourceCaptureState::DoEventNofityTask;
36 }
37
Execute(std::shared_ptr<DCameraSourceDev> & camDev,DCAMERA_EVENT eventType,DCameraSourceEvent & event)38 int32_t DCameraSourceCaptureState::Execute(std::shared_ptr<DCameraSourceDev>& camDev, DCAMERA_EVENT eventType,
39 DCameraSourceEvent& event)
40 {
41 auto itFunc = memberFuncMap_.find(eventType);
42 if (itFunc == memberFuncMap_.end()) {
43 DHLOGE("DCameraSourceCaptureState execute %d in wrong state", eventType);
44 return DCAMERA_WRONG_STATE;
45 }
46
47 auto memberFunc = itFunc->second;
48 int32_t ret = (this->*memberFunc)(camDev, event);
49 if (ret != DCAMERA_OK) {
50 DHLOGE("DCameraSourceCaptureState execute %d failed, ret: %d", eventType, ret);
51 }
52 return ret;
53 }
54
GetStateType()55 DCameraStateType DCameraSourceCaptureState::GetStateType()
56 {
57 return DCAMERA_STATE_CAPTURE;
58 }
59
DoRegisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)60 int32_t DCameraSourceCaptureState::DoRegisterTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
61 {
62 DHLOGI("DCameraSourceCaptureState DoRegisterTask Idempotent");
63 return DCAMERA_OK;
64 }
65
DoUnregisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)66 int32_t DCameraSourceCaptureState::DoUnregisterTask(std::shared_ptr<DCameraSourceDev>& camDev,
67 DCameraSourceEvent& event)
68 {
69 std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
70 camEvent->eventType_ = DCAMERA_MESSAGE;
71 camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_DISCONNECTED;
72 int32_t ret = camDev->CameraEventNotify(camEvent);
73 if (ret != DCAMERA_OK) {
74 DHLOGE("DCameraSourceCaptureState DoUnregisterTask CameraEventNotify failed: %d", ret);
75 return ret;
76 }
77
78 ret = camDev->StopAllCapture();
79 if (ret != DCAMERA_OK) {
80 DHLOGE("DCameraSourceCaptureState DoUnregisterTask StopAllCapture failed: %d", ret);
81 return ret;
82 }
83
84 ret = camDev->CloseCamera();
85 if (ret != DCAMERA_OK) {
86 DHLOGE("DCameraSourceCaptureState DoUnregisterTask CloseCamera failed, ret: %d", ret);
87 return ret;
88 }
89
90 ret = camDev->ReleaseAllStreams();
91 if (ret != DCAMERA_OK) {
92 DHLOGE("DCameraSourceCaptureState DoUnregisterTask ReleaseAllStreams failed, ret: %d", ret);
93 return ret;
94 }
95
96 std::shared_ptr<DCameraRegistParam> param;
97 ret = event.GetDCameraRegistParam(param);
98 if (ret != DCAMERA_OK) {
99 return ret;
100 }
101 ret = camDev->UnRegister(param);
102 if (ret != DCAMERA_OK) {
103 DHLOGE("DCameraSourceCaptureState DoUnregisterTask UnRegister failed: %d", ret);
104 return ret;
105 }
106 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
107 if (stateMachine == nullptr) {
108 DHLOGE("DCameraSourceCaptureState 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 DCameraSourceCaptureState::DoOpenTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
116 {
117 DHLOGI("DCameraSourceCaptureState DoOpenTask Idempotent");
118 return DCAMERA_OK;
119 }
120
DoCloseTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)121 int32_t DCameraSourceCaptureState::DoCloseTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
122 {
123 int32_t ret = camDev->StopAllCapture();
124 if (ret != DCAMERA_OK) {
125 DHLOGE("DCameraSourceCaptureState StopAllCapture failed, ret: %d", ret);
126 return ret;
127 }
128
129 ret = camDev->ReleaseAllStreams();
130 if (ret != DCAMERA_OK) {
131 DHLOGE("DCameraSourceCaptureState ReleaseAllStreams failed, ret: %d", ret);
132 return ret;
133 }
134
135 ret = camDev->CloseCamera();
136 if (ret != DCAMERA_OK) {
137 DHLOGE("DCameraSourceCaptureState CloseCamera failed, ret: %d", ret);
138 return ret;
139 }
140 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
141 if (stateMachine == nullptr) {
142 DHLOGE("DCameraSourceCaptureState DoOpenTask can not get stateMachine");
143 return DCAMERA_BAD_VALUE;
144 }
145 stateMachine->UpdateState(DCAMERA_STATE_REGIST);
146 return DCAMERA_OK;
147 }
148
DoStartCaptureTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)149 int32_t DCameraSourceCaptureState::DoStartCaptureTask(std::shared_ptr<DCameraSourceDev>& camDev,
150 DCameraSourceEvent& event)
151 {
152 std::vector<std::shared_ptr<DCCaptureInfo>> captureInfos;
153 int32_t ret = event.GetCaptureInfos(captureInfos);
154 if (ret != DCAMERA_OK) {
155 return ret;
156 }
157
158 ret = camDev->StartCapture(captureInfos);
159 if (ret != DCAMERA_OK) {
160 DHLOGE("DCameraSourceCaptureState DoStartCaptureTask failed, ret: %d", ret);
161 return ret;
162 }
163 return DCAMERA_OK;
164 }
165
DoStopCaptureTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)166 int32_t DCameraSourceCaptureState::DoStopCaptureTask(std::shared_ptr<DCameraSourceDev>& camDev,
167 DCameraSourceEvent& event)
168 {
169 std::vector<int> streamIds;
170 int32_t ret = event.GetStreamIds(streamIds);
171 if (ret != DCAMERA_OK) {
172 return ret;
173 }
174
175 bool isAllStop = false;
176 ret = camDev->StopCapture(streamIds, isAllStop);
177 if (ret != DCAMERA_OK) {
178 DHLOGE("DCameraSourceCaptureState StopCapture failed, ret: %d", ret);
179 return ret;
180 }
181
182 if (isAllStop) {
183 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
184 if (stateMachine == nullptr) {
185 DHLOGE("DCameraSourceCaptureState DoStopCaptureTask can not get stateMachine");
186 return DCAMERA_BAD_VALUE;
187 }
188 stateMachine->UpdateState(DCAMERA_STATE_CONFIG_STREAM);
189 }
190 return DCAMERA_OK;
191 }
192
DoUpdateSettingsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)193 int32_t DCameraSourceCaptureState::DoUpdateSettingsTask(std::shared_ptr<DCameraSourceDev>& camDev,
194 DCameraSourceEvent& event)
195 {
196 std::vector<std::shared_ptr<DCameraSettings>> settings;
197 int32_t ret = event.GetCameraSettings(settings);
198 if (ret != DCAMERA_OK) {
199 return ret;
200 }
201
202 ret = camDev->UpdateSettings(settings);
203 if (ret != DCAMERA_OK) {
204 DHLOGE("DCameraSourceCaptureState UpdateSettings failed, ret: %d", ret);
205 return ret;
206 }
207 return DCAMERA_OK;
208 }
209
DoEventNofityTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)210 int32_t DCameraSourceCaptureState::DoEventNofityTask(std::shared_ptr<DCameraSourceDev>& camDev,
211 DCameraSourceEvent& event)
212 {
213 std::shared_ptr<DCameraEvent> camEvent;
214 int32_t ret = event.GetCameraEvent(camEvent);
215 if (ret != DCAMERA_OK) {
216 return ret;
217 }
218
219 ret = camDev->CameraEventNotify(camEvent);
220 if (ret != DCAMERA_OK) {
221 DHLOGE("DCameraSourceCaptureState CameraEventNotify failed, ret: %d", ret);
222 return ret;
223 }
224 return DCAMERA_OK;
225 }
226 } // namespace DistributedHardware
227 } // namespace OHOS
228