1 /*
2  * Copyright (c) 2023 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 "camera_host_config.h"
17 #include "hcs_deal.h"
18 
19 namespace {
20 #ifdef CAMERA_BUILT_ON_OHOS_LITE
21     const std::string CONFIG_PATH_NAME = HDF_ETC_DIR"/camera/camera_host_config.hcb";
22 #else
23     const std::string CONFIG_PATH_NAME = HDF_CONFIG_DIR"/camera_host_config.hcb";
24 #endif
25 }
26 
27 namespace OHOS::Camera {
28 std::map<std::string, CameraId> CameraHostConfig::enumCameraIdMap_ = {
29     { "CAMERA_FIRST", CAMERA_FIRST },
30     { "CAMERA_SECOND", CAMERA_SECOND },
31     { "CAMERA_THIRD", CAMERA_THIRD },
32     { "CAMERA_FOURTH", CAMERA_FOURTH },
33     { "CAMERA_FIFTH", CAMERA_FIFTH },
34     { "CAMERA_SIXTH", CAMERA_SIXTH },
35 };
36 CameraHostConfig *CameraHostConfig::instance_ = nullptr;
37 CameraHostConfig::AutoRelease CameraHostConfig::autoRelease_;
38 
GetInstance()39 CameraHostConfig *CameraHostConfig::GetInstance()
40 {
41     if (instance_ == nullptr) {
42         instance_ = new (std::nothrow) CameraHostConfig();
43         if (instance_ != nullptr) {
44             instance_->ReadConfigFile();
45         }
46     }
47     return instance_;
48 }
49 
CameraHostConfig()50 CameraHostConfig::CameraHostConfig()
51 {
52 }
53 
~CameraHostConfig()54 CameraHostConfig::~CameraHostConfig()
55 {
56 }
57 
ReadConfigFile()58 RetCode CameraHostConfig::ReadConfigFile()
59 {
60     std::unique_ptr<HcsDeal> hcsDeal = std::make_unique<HcsDeal>(CONFIG_PATH_NAME);
61     if (hcsDeal == nullptr) {
62         CAMERA_LOGE("make HcsDeal failed. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
63         return RC_ERROR;
64     }
65 
66     RetCode rc = hcsDeal->Init();
67     if (rc != RC_OK) {
68         CAMERA_LOGE("hcs deal init failed. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
69         return rc;
70     }
71 
72     rc = hcsDeal->GetCameraId(cameraIdMap_);
73     if (rc != RC_OK || cameraIdMap_.empty()) {
74         CAMERA_LOGE("config camera id not found. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
75         return rc;
76     }
77 
78     rc = hcsDeal->GetMetadata(cameraAbilityMap_);
79     if (rc != RC_OK || cameraAbilityMap_.empty()) {
80         CAMERA_LOGE("config camera ability not found. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
81         return rc;
82     }
83 
84     return RC_OK;
85 }
86 
GetCameraIds(std::vector<std::string> & cameraIds)87 RetCode CameraHostConfig::GetCameraIds(std::vector<std::string> &cameraIds)
88 {
89     auto itr = cameraAbilityMap_.begin();
90     for (; itr != cameraAbilityMap_.end(); itr++) {
91         cameraIds.push_back(itr->first);
92     }
93 
94     return RC_OK;
95 }
96 
GetPhysicCameraIds(const std::string & lCameraId,std::vector<std::string> & pCameraIds)97 RetCode CameraHostConfig::GetPhysicCameraIds(const std::string &lCameraId, std::vector<std::string> &pCameraIds)
98 {
99     auto itr = cameraIdMap_.find(lCameraId);
100     if (itr != cameraIdMap_.end()) {
101         pCameraIds = itr->second;
102         return RC_OK;
103     }
104     return RC_ERROR;
105 }
106 
GetCameraAbility(const std::string & cameraId,std::shared_ptr<CameraAbility> & ability)107 RetCode CameraHostConfig::GetCameraAbility(
108     const std::string &cameraId, std::shared_ptr<CameraAbility> &ability)
109 {
110     auto itr = cameraAbilityMap_.find(cameraId);
111     if (itr != cameraAbilityMap_.end()) {
112         ability = itr->second;
113         return RC_OK;
114     }
115 
116     return RC_ERROR;
117 }
118 
AddCameraId(const std::string & logicalCameraId,const std::vector<std::string> & physicalCameraIds,const std::shared_ptr<CameraAbility> ability)119 RetCode CameraHostConfig::AddCameraId(const std::string &logicalCameraId,
120     const std::vector<std::string> &physicalCameraIds, const std::shared_ptr<CameraAbility> ability)
121 {
122     auto itrCameraId = cameraIdMap_.find(logicalCameraId);
123     auto itrCameraAbility = cameraAbilityMap_.find(logicalCameraId);
124     if (itrCameraId != cameraIdMap_.end() || itrCameraAbility != cameraAbilityMap_.end()) {
125         CAMERA_LOGE("logicalCameraId %{public}s Add Error", logicalCameraId.c_str());
126         return RC_ERROR;
127     } else {
128         cameraIdMap_.insert(std::make_pair(logicalCameraId, physicalCameraIds));
129         cameraAbilityMap_.insert(std::make_pair(logicalCameraId, ability));
130         return RC_OK;
131     }
132 }
133 
SubtractCameraId(const std::vector<std::string> & physicalCameraIds)134 std::string CameraHostConfig::SubtractCameraId(const std::vector<std::string> &physicalCameraIds)
135 {
136     if (physicalCameraIds.size() > 1) {
137         CAMERA_LOGE("physicalCameraIds %{public}d >1 Error", physicalCameraIds.size());
138     }
139     std::string logicalCameraId = ReturnLogicalCameraIdToString(physicalCameraIds[0]);
140     if (logicalCameraId.size() == 0) {
141         return std::string("");
142     }
143     auto itrCameraId = cameraIdMap_.find(logicalCameraId);
144     auto itrCameraAbility = cameraAbilityMap_.find(logicalCameraId);
145     if (itrCameraId == cameraIdMap_.end() || itrCameraAbility == cameraAbilityMap_.end()) {
146         CAMERA_LOGE("physicalCameraIds %{public}s Subtract Error", physicalCameraIds[0].c_str());
147         return std::string("");
148     } else {
149         cameraIdMap_.erase(itrCameraId);
150         cameraAbilityMap_.erase(itrCameraAbility);
151         return logicalCameraId;
152     }
153 }
154 
ReturnEnableLogicalCameraId()155 std::string CameraHostConfig::ReturnEnableLogicalCameraId()
156 {
157     std::string logicalCameraId;
158     bool logicalCameraIdStatus = false;
159     for (int32_t id = 1; id < CAMERA_MAX+1; id++) {
160         logicalCameraId = "lcam00";
161         logicalCameraId = logicalCameraId + std::to_string(id);
162         auto itr = cameraIdMap_.find(logicalCameraId);
163         if (itr != cameraIdMap_.end()) {
164             logicalCameraIdStatus = true;
165             break;
166         }
167     }
168     if (logicalCameraIdStatus) {
169         return logicalCameraId;
170     } else {
171         return std::string("");
172     }
173 }
174 
GenerateNewLogicalCameraId()175 std::string CameraHostConfig::GenerateNewLogicalCameraId()
176 {
177     for (int32_t id = 1; id < CAMERA_MAX + 1; id++) {
178         std::string logicalCameraId = "lcam00" + std::to_string(id);
179         auto itr = cameraIdMap_.find(logicalCameraId);
180         if (itr == cameraIdMap_.end()) {
181             return logicalCameraId;
182         }
183     }
184     return std::string("");
185 }
186 
ReturnPhysicalCameraIdToString(const CameraId & physicalCameraId)187 std::string CameraHostConfig::ReturnPhysicalCameraIdToString(const CameraId &physicalCameraId)
188 {
189     for (auto iter = enumCameraIdMap_.begin(); iter != enumCameraIdMap_.end(); iter++) {
190         if (iter->second == physicalCameraId) {
191             return iter->first;
192         }
193     }
194     return std::string("");
195 }
196 
ReturnLogicalCameraIdToString(const std::string & physicalCameraId)197 std::string CameraHostConfig::ReturnLogicalCameraIdToString(const std::string &physicalCameraId)
198 {
199     for (auto iter = cameraIdMap_.begin(); iter != cameraIdMap_.end(); iter++) {
200         if (iter->second[0] == physicalCameraId) {
201             return iter->first;
202         }
203     }
204     return std::string("");
205 }
206 
AddUsbCameraId(std::string cameraId)207 void CameraHostConfig::AddUsbCameraId(std::string cameraId)
208 {
209     usbCameraIdVector_.push_back(cameraId);
210 }
211 
SearchUsbCameraId(std::string cameraId)212 bool CameraHostConfig::SearchUsbCameraId(std::string cameraId)
213 {
214     auto iter = std::find(usbCameraIdVector_.begin(), usbCameraIdVector_.end(), cameraId);
215     if (iter != usbCameraIdVector_.end()) {
216         return true;
217     }
218     return false;
219 }
220 } // end namespace OHOS::Camera
221