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 DHLOGI("DCameraSourceRegistState DoRegisterTask");
78 std::shared_ptr<DCameraRegistParam> param;
79 int32_t ret = event.GetDCameraRegistParam(param);
80 if (ret != DCAMERA_OK) {
81 DHLOGE("DCameraSourceRegistState GetDCameraRegistParam failed");
82 return ret;
83 }
84 ret = camDev->Register(param);
85 if (ret != DCAMERA_OK) {
86 DHLOGE("DCameraSourceRegistState Register failed");
87 return ret;
88 }
89 return DCAMERA_OK;
90 }
91
92
DoUnregisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)93 int32_t DCameraSourceRegistState::DoUnregisterTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
94 {
95 std::shared_ptr<DCameraRegistParam> param;
96 int32_t ret = event.GetDCameraRegistParam(param);
97 if (ret != DCAMERA_OK) {
98 return ret;
99 }
100 ret = camDev->UnRegister(param);
101 if (ret != DCAMERA_OK) {
102 return ret;
103 }
104 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
105 if (stateMachine == nullptr) {
106 DHLOGE("DCameraSourceRegistState DoUnregisterTask can not get stateMachine");
107 return DCAMERA_BAD_VALUE;
108 }
109 stateMachine->UpdateState(DCAMERA_STATE_INIT);
110 return DCAMERA_OK;
111 }
112
DoOpenTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)113 int32_t DCameraSourceRegistState::DoOpenTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
114 {
115 int32_t ret = camDev->OpenCamera();
116 if (ret != DCAMERA_OK) {
117 DHLOGE("DCameraSourceRegistState OpenCamera failed, ret: %{public}d", ret);
118 return ret;
119 }
120 return DCAMERA_OK;
121 }
122
DoCloseTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)123 int32_t DCameraSourceRegistState::DoCloseTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
124 {
125 DHLOGI("DCameraSourceRegistState DoCloseTask Idempotent");
126 return DCAMERA_OK;
127 }
128
DoEventNofityTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)129 int32_t DCameraSourceRegistState::DoEventNofityTask(std::shared_ptr<DCameraSourceDev>& camDev,
130 DCameraSourceEvent& event)
131 {
132 std::shared_ptr<DCameraEvent> camEvent;
133 int32_t ret = event.GetCameraEvent(camEvent);
134 if (ret != DCAMERA_OK) {
135 return ret;
136 }
137
138 ret = camDev->CameraEventNotify(camEvent);
139 if (ret != DCAMERA_OK) {
140 DHLOGE("DCameraSourceRegistState DoEventNofityTask CameraEventNotify failed, ret: %{public}d", ret);
141 return ret;
142 }
143 return DCAMERA_OK;
144 }
145
DoGetFullCaps(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)146 int32_t DCameraSourceRegistState::DoGetFullCaps(std::shared_ptr<DCameraSourceDev>& camDev,
147 DCameraSourceEvent& event)
148 {
149 DHLOGI("DCameraSourceRegistState DoGetFullCaps enter.");
150 if (camDev == nullptr) {
151 DHLOGE("DCameraSourceRegistState camDev is null.");
152 return DCAMERA_BAD_VALUE;
153 }
154 int32_t ret = camDev->GetFullCaps();
155 if (ret != DCAMERA_OK) {
156 DHLOGE("DCameraSourceRegistState DoGetFullCaps GetFullCaps failed, ret: %{public}d", ret);
157 return ret;
158 }
159 return DCAMERA_OK;
160 }
161 } // namespace DistributedHardware
162 } // namespace OHOS
163