• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = static_cast<int>(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