1 /*
2 * Copyright (c) 2022 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 "agnss_interface_impl.h"
17
18 #include <hdf_base.h>
19 #include <hdf_log.h>
20 #include <iproxy_broker.h>
21 #include <mutex>
22 #include <unordered_map>
23
24 #include "location_vendor_interface.h"
25 #include "location_vendor_lib.h"
26
27 namespace OHOS {
28 namespace HDI {
29 namespace Location {
30 namespace Agnss {
31 namespace V1_0 {
32 namespace {
33 using AgnssCallBackMap = std::unordered_map<IRemoteObject *, sptr<IAGnssCallback>>;
34 AgnssCallBackMap g_agnssCallBackMap;
35 std::mutex g_mutex;
36 } // namespace
37
AGnssInterfaceImplGetInstance(void)38 extern "C" IAGnssInterface *AGnssInterfaceImplGetInstance(void)
39 {
40 return new (std::nothrow) AGnssInterfaceImpl();
41 }
42
OnStatusChangedCb(const AGnssStatusInfo * status)43 static void OnStatusChangedCb(const AGnssStatusInfo *status)
44 {
45 if (status == nullptr) {
46 HDF_LOGE("%{public}s:status is nullptr.", __func__);
47 return;
48 }
49 HDF_LOGI("%{public}s.", __func__);
50 AGnssDataLinkRequest agnssStatus;
51 agnssStatus.agnssType = static_cast<AGnssUserPlaneProtocol>(status->agnssType);
52 agnssStatus.setUpType = static_cast<DataLinkSetUpType>(status->connStatus);
53
54 for (const auto &iter : g_agnssCallBackMap) {
55 auto &callback = iter.second;
56 if (callback != nullptr) {
57 callback->RequestSetUpAgnssDataLink(agnssStatus);
58 }
59 }
60 }
61
GetSetidCb(uint16_t type)62 static void GetSetidCb(uint16_t type)
63 {
64 HDF_LOGI("%{public}s.", __func__);
65 for (const auto &iter : g_agnssCallBackMap) {
66 auto &callback = iter.second;
67 if (callback != nullptr) {
68 callback->RequestSubscriberSetId(static_cast<SubscriberSetIdType>(type));
69 }
70 }
71 }
GetRefLocationidCb(uint32_t type)72 static void GetRefLocationidCb(uint32_t type)
73 {
74 HDF_LOGI("%{public}s.", __func__);
75 for (const auto &iter : g_agnssCallBackMap) {
76 auto &callback = iter.second;
77 if (callback != nullptr) {
78 callback->RequestAgnssRefInfo();
79 }
80 }
81 }
82
GetAGnssCallbackMethods(AGnssCallbackIfaces * device)83 static void GetAGnssCallbackMethods(AGnssCallbackIfaces *device)
84 {
85 if (device == nullptr) {
86 return;
87 }
88 device->size = sizeof(AGnssCallbackIfaces);
89 device->agnssStatusChange = OnStatusChangedCb;
90 device->getSetid = GetSetidCb;
91 device->getRefLoc = GetRefLocationidCb;
92 }
93
AGnssInterfaceImpl()94 AGnssInterfaceImpl::AGnssInterfaceImpl()
95 {
96 }
97
~AGnssInterfaceImpl()98 AGnssInterfaceImpl::~AGnssInterfaceImpl()
99 {
100 g_agnssCallBackMap.clear();
101 }
102
SetAgnssCallback(const sptr<IAGnssCallback> & callbackObj)103 int32_t AGnssInterfaceImpl::SetAgnssCallback(const sptr<IAGnssCallback>& callbackObj)
104 {
105 HDF_LOGI("%{public}s.", __func__);
106 if (callbackObj == nullptr) {
107 HDF_LOGE("%{public}s:invalid callbackObj", __func__);
108 return HDF_ERR_INVALID_PARAM;
109 }
110 std::lock_guard<std::mutex> lock(g_mutex);
111 const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<IAGnssCallback>(callbackObj);
112 if (remote == nullptr) {
113 HDF_LOGE("%{public}s:invalid remote", __func__);
114 return HDF_ERR_INVALID_PARAM;
115 }
116 auto callBackIter = g_agnssCallBackMap.find(remote.GetRefPtr());
117 if (callBackIter != g_agnssCallBackMap.end()) {
118 const sptr<IRemoteObject> &lhs = OHOS::HDI::hdi_objcast<IAGnssCallback>(callbackObj);
119 const sptr<IRemoteObject> &rhs = OHOS::HDI::hdi_objcast<IAGnssCallback>(callBackIter->second);
120 return lhs == rhs ? HDF_SUCCESS : HDF_FAILURE;
121 }
122
123 static AGnssCallbackIfaces agnsscallback;
124 GetAGnssCallbackMethods(&agnsscallback);
125
126 int moduleType = static_cast<int>(GnssModuleIfaceClass::AGPS_INTERFACE);
127 LocationVendorInterface* interface = LocationVendorInterface::GetInstance();
128 auto agnssInterface =
129 static_cast<const AGnssModuleInterface *>(interface->GetModuleInterface(moduleType));
130 if (agnssInterface == nullptr) {
131 HDF_LOGE("%{public}s:can not get agnssInterface.", __func__);
132 return HDF_ERR_INVALID_PARAM;
133 }
134 bool ret = agnssInterface->set_agnss_callback(&agnsscallback);
135 if (!ret) {
136 HDF_LOGE("set_agnss_callback failed.");
137 return HDF_FAILURE;
138 }
139 g_agnssCallBackMap[remote.GetRefPtr()] = callbackObj;
140 return HDF_SUCCESS;
141 }
142
SetAgnssServer(const AGnssServerInfo & server)143 int32_t AGnssInterfaceImpl::SetAgnssServer(const AGnssServerInfo& server)
144 {
145 HDF_LOGI("%{public}s.", __func__);
146 int moduleType = static_cast<int>(GnssModuleIfaceClass::AGPS_INTERFACE);
147 LocationVendorInterface* interface = LocationVendorInterface::GetInstance();
148 auto agnssInterface =
149 static_cast<const AGnssModuleInterface *>(interface->GetModuleInterface(moduleType));
150 if (agnssInterface == nullptr) {
151 HDF_LOGE("%{public}s:can not get agnssInterface.", __func__);
152 return HDF_ERR_INVALID_PARAM;
153 }
154 uint16_t type = static_cast<uint16_t>(server.type);
155 bool ret = agnssInterface->set_agnss_server(type, server.server.c_str(), server.server.length(), server.port);
156 if (!ret) {
157 HDF_LOGE("set_agnss_server failed.");
158 return HDF_FAILURE;
159 }
160 return HDF_SUCCESS;
161 }
162
SetAgnssRefInfo(const AGnssRefInfo & refInfo)163 int32_t AGnssInterfaceImpl::SetAgnssRefInfo(const AGnssRefInfo& refInfo)
164 {
165 int moduleType = static_cast<int>(GnssModuleIfaceClass::AGPS_INTERFACE);
166 LocationVendorInterface* interface = LocationVendorInterface::GetInstance();
167 auto agnssInterface =
168 static_cast<const AGnssModuleInterface *>(interface->GetModuleInterface(moduleType));
169 if (agnssInterface == nullptr) {
170 HDF_LOGE("%{public}s:can not get agnssInterface.", __func__);
171 return HDF_ERR_INVALID_PARAM;
172 }
173 AGnssRefLocInfo loc;
174 loc.type = refInfo.type;
175 switch (refInfo.cellId.type) {
176 case CELLID_TYPE_GSM:
177 loc.u.cellId.type = static_cast<uint16_t>(CellIdClass::GSM_CELLID);
178 break;
179 case CELLID_TYPE_UMTS:
180 loc.u.cellId.type = static_cast<uint16_t>(CellIdClass::UMTS_CELLID);
181 break;
182 case CELLID_TYPE_LTE:
183 loc.u.cellId.type = static_cast<uint16_t>(CellIdClass::LTE_CELLID);
184 break;
185 case CELLID_TYPE_NR:
186 loc.u.cellId.type = static_cast<uint16_t>(CellIdClass::NR_CELLID);
187 break;
188 default:
189 HDF_LOGE("%{public}s wrong cellType.", __func__);
190 return HDF_ERR_INVALID_PARAM;
191 }
192 loc.u.cellId.mcc = refInfo.cellId.mcc;
193 loc.u.cellId.mnc = refInfo.cellId.mnc;
194 loc.u.cellId.lac = refInfo.cellId.lac;
195 loc.u.cellId.cid = refInfo.cellId.cid;
196 loc.u.cellId.tac = refInfo.cellId.tac;
197 loc.u.cellId.pcid = refInfo.cellId.pcid;
198 bool ret = agnssInterface->set_ref_location(&loc);
199 if (!ret) {
200 HDF_LOGE("set_ref_location failed.");
201 return HDF_FAILURE;
202 }
203 return HDF_SUCCESS;
204 }
205
SetSubscriberSetId(const SubscriberSetId & id)206 int32_t AGnssInterfaceImpl::SetSubscriberSetId(const SubscriberSetId& id)
207 {
208 HDF_LOGI("%{public}s.", __func__);
209 int moduleType = static_cast<int>(GnssModuleIfaceClass::AGPS_INTERFACE);
210 LocationVendorInterface* interface = LocationVendorInterface::GetInstance();
211 auto agnssInterface =
212 static_cast<const AGnssModuleInterface *>(interface->GetModuleInterface(moduleType));
213 if (agnssInterface == nullptr) {
214 HDF_LOGE("%{public}s:can not get agnssInterface.", __func__);
215 return HDF_ERR_INVALID_PARAM;
216 }
217 uint16_t type = static_cast<uint16_t>(id.type);
218 int ret = agnssInterface->set_setid(type, id.id.c_str(), id.id.length());
219 if (!ret) {
220 HDF_LOGE("set_setid failed.");
221 return HDF_FAILURE;
222 }
223 return HDF_SUCCESS;
224 }
225 } // V1_0
226 } // Agnss
227 } // Location
228 } // HDI
229 } // OHOS
230