• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_opened_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 {
DCameraSourceOpenedState(std::shared_ptr<DCameraSourceStateMachine> & stateMachine)25 DCameraSourceOpenedState::DCameraSourceOpenedState(std::shared_ptr<DCameraSourceStateMachine>& stateMachine)
26     : stateMachine_(stateMachine)
27 {
28     memberFuncMap_[DCAMERA_EVENT_REGIST] = &DCameraSourceOpenedState::DoRegisterTask;
29     memberFuncMap_[DCAMERA_EVENT_UNREGIST] = &DCameraSourceOpenedState::DoUnregisterTask;
30     memberFuncMap_[DCAMERA_EVENT_OPEN] = &DCameraSourceOpenedState::DoOpenTask;
31     memberFuncMap_[DCAMERA_EVENT_CLOSE] = &DCameraSourceOpenedState::DoCloseTask;
32     memberFuncMap_[DCAMERA_EVENT_CONFIG_STREAMS] = &DCameraSourceOpenedState::DoConfigStreamsTask;
33     memberFuncMap_[DCAMERA_EVENT_RELEASE_STREAMS] = &DCameraSourceOpenedState::DoReleaseStreamsTask;
34     memberFuncMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = &DCameraSourceOpenedState::DoUpdateSettingsTask;
35     memberFuncMap_[DCAMERA_EVENT_NOFIFY] = &DCameraSourceOpenedState::DoEventNofityTask;
36 }
37 
Execute(std::shared_ptr<DCameraSourceDev> & camDev,DCAMERA_EVENT eventType,DCameraSourceEvent & event)38 int32_t DCameraSourceOpenedState::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("DCameraSourceOpenedState 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("DCameraSourceOpenedState execute %d failed, ret: %d", eventType, ret);
51     }
52     return ret;
53 }
54 
GetStateType()55 DCameraStateType DCameraSourceOpenedState::GetStateType()
56 {
57     return DCAMERA_STATE_OPENED;
58 }
59 
DoRegisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)60 int32_t DCameraSourceOpenedState::DoRegisterTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
61 {
62     DHLOGI("DCameraSourceOpenedState DoRegisterTask Idempotent");
63     return DCAMERA_OK;
64 }
65 
DoUnregisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)66 int32_t DCameraSourceOpenedState::DoUnregisterTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
67 {
68     std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
69     camEvent->eventType_ = DCAMERA_MESSAGE;
70     camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_DISCONNECTED;
71     int32_t ret = camDev->CameraEventNotify(camEvent);
72     if (ret != DCAMERA_OK) {
73         DHLOGE("DCameraSourceOpenedState DoUnregisterTask CameraEventNotify failed: %d", ret);
74         return ret;
75     }
76 
77     ret = camDev->CloseCamera();
78     if (ret != DCAMERA_OK) {
79         DHLOGE("DCameraSourceOpenedState DoUnregisterTask CloseCamera failed: %d", ret);
80         return ret;
81     }
82 
83     std::shared_ptr<DCameraRegistParam> param;
84     ret = event.GetDCameraRegistParam(param);
85     if (ret != DCAMERA_OK) {
86         return ret;
87     }
88     ret = camDev->UnRegister(param);
89     if (ret != DCAMERA_OK) {
90         DHLOGE("DCameraSourceOpenedState DoUnregisterTask UnRegister failed: %d", ret);
91         return ret;
92     }
93     std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
94     if (stateMachine == nullptr) {
95         DHLOGE("DCameraSourceOpenedState DoUnregisterTask can not get stateMachine");
96         return DCAMERA_BAD_VALUE;
97     }
98     stateMachine->UpdateState(DCAMERA_STATE_INIT);
99     return DCAMERA_OK;
100 }
101 
DoConfigStreamsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)102 int32_t DCameraSourceOpenedState::DoConfigStreamsTask(std::shared_ptr<DCameraSourceDev>& camDev,
103     DCameraSourceEvent& event)
104 {
105     std::vector<std::shared_ptr<DCStreamInfo>> streamInfos;
106     int32_t ret = event.GetStreamInfos(streamInfos);
107     if (ret != DCAMERA_OK) {
108         return ret;
109     }
110 
111     ret = camDev->ConfigStreams(streamInfos);
112     if (ret != DCAMERA_OK) {
113         DHLOGE("DCameraSourceOpenedState ConfigStreams failed, ret: %d", ret);
114         return ret;
115     }
116     std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
117     if (stateMachine == nullptr) {
118         DHLOGE("DCameraSourceOpenedState DoConfigStreamsTask can not get stateMachine");
119         return DCAMERA_BAD_VALUE;
120     }
121     stateMachine->UpdateState(DCAMERA_STATE_CONFIG_STREAM);
122     return DCAMERA_OK;
123 }
124 
DoReleaseStreamsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)125 int32_t DCameraSourceOpenedState::DoReleaseStreamsTask(std::shared_ptr<DCameraSourceDev>& camDev,
126     DCameraSourceEvent& event)
127 {
128     DHLOGI("DCameraSourceOpenedState DoReleaseStreamsTask Idempotent");
129     return DCAMERA_OK;
130 }
131 
DoUpdateSettingsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)132 int32_t DCameraSourceOpenedState::DoUpdateSettingsTask(std::shared_ptr<DCameraSourceDev>& camDev,
133     DCameraSourceEvent& event)
134 {
135     std::vector<std::shared_ptr<DCameraSettings>> settings;
136     int32_t ret = event.GetCameraSettings(settings);
137     if (ret != DCAMERA_OK) {
138         return ret;
139     }
140 
141     ret = camDev->UpdateSettings(settings);
142     if (ret != DCAMERA_OK) {
143         DHLOGE("DCameraSourceOpenedState UpdateSettings failed, ret: %d", ret);
144         return ret;
145     }
146     return DCAMERA_OK;
147 }
148 
DoOpenTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)149 int32_t DCameraSourceOpenedState::DoOpenTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
150 {
151     DHLOGI("DCameraSourceOpenedState DoOpenTask Idempotent");
152     return DCAMERA_OK;
153 }
154 
DoCloseTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)155 int32_t DCameraSourceOpenedState::DoCloseTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
156 {
157     int32_t ret = camDev->CloseCamera();
158     if (ret != DCAMERA_OK) {
159         DHLOGE("DCameraSourceOpenedState DoOpenTask CloseCamera failed, ret: %d", ret);
160         return ret;
161     }
162     std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
163     if (stateMachine == nullptr) {
164         DHLOGE("DCameraSourceOpenedState DoOpenTask can not get stateMachine");
165         return DCAMERA_BAD_VALUE;
166     }
167     stateMachine->UpdateState(DCAMERA_STATE_REGIST);
168     return DCAMERA_OK;
169 }
170 
DoEventNofityTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)171 int32_t DCameraSourceOpenedState::DoEventNofityTask(std::shared_ptr<DCameraSourceDev>& camDev,
172     DCameraSourceEvent& event)
173 {
174     std::shared_ptr<DCameraEvent> camEvent;
175     int32_t ret = event.GetCameraEvent(camEvent);
176     if (ret != DCAMERA_OK) {
177         return ret;
178     }
179 
180     ret = camDev->CameraEventNotify(camEvent);
181     if (ret != DCAMERA_OK) {
182         DHLOGE("DCameraSourceOpenedState DoEventNofityTask CameraEventNotify failed, ret: %d", ret);
183         return ret;
184     }
185     return DCAMERA_OK;
186 }
187 } // namespace DistributedHardware
188 } // namespace OHOS
189