/* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "agnss_event_callback.h" #include #include "cellular_data_client.h" #include "common_utils.h" #include "gnss_ability.h" #include "location_log.h" namespace OHOS { namespace Location { int32_t AGnssEventCallback::RequestSetUpAgnssDataLink(const AGnssDataLinkRequest& request) { LBSLOGI(GNSS, "AGnssEventCallback::RequestSetUpAgnssDataLink. agnsstype:%{public}d, setUpType:%{public}d", static_cast(request.agnssType), static_cast(request.setUpType)); return ERR_OK; } int32_t AGnssEventCallback::RequestSubscriberSetId(SubscriberSetIdType type) { LBSLOGI(GNSS, "AGnssEventCallback::RequestSubscriberSetId. type:%{public}d", static_cast(type)); int slotId = Telephony::CellularDataClient::GetInstance().GetDefaultCellularDataSlotId(); std::u16string tempImsi; DelayedRefSingleton::GetInstance().GetIMSI(slotId, tempImsi); std::string imsi = CommonUtils::Str16ToStr8(tempImsi); SubscriberSetId setId; setId.type = HDI::Location::Agnss::V1_0::SETID_TYPE_IMSI; setId.id = imsi; auto gnssAbility = DelayedSingleton::GetInstance(); if (gnssAbility == nullptr) { LBSLOGE(GNSS, "RequestSubscriberSetId: gnss ability is nullptr"); return ERR_OK; } gnssAbility.get()->SetSetId(setId); return ERR_OK; } int32_t AGnssEventCallback::RequestAgnssRefInfo() { int slotId = Telephony::CellularDataClient::GetInstance().GetDefaultCellularDataSlotId(); std::vector> cellInformations; DelayedRefSingleton::GetInstance().GetCellInfoList(slotId, cellInformations); LBSLOGI(GNSS, "RequestAgnssRefInfo,cellInformations."); for (sptr infoItem : cellInformations) { if (!infoItem->GetIsCamped()) { LBSLOGE(GNSS, "GetIsCamped return false"); continue; } AGnssRefInfo refInfo; CellInformation::CellType cellType = infoItem->GetNetworkType(); refInfo.type = HDI::Location::Agnss::V1_0::ANSS_REF_INFO_TYPE_CELLID; switch (cellType) { case CellInformation::CellType::CELL_TYPE_GSM: { JudgmentDataGsm(refInfo, infoItem); break; } case CellInformation::CellType::CELL_TYPE_LTE: { JudgmentDataLte(refInfo, infoItem); break; } case CellInformation::CellType::CELL_TYPE_CDMA: case CellInformation::CellType::CELL_TYPE_WCDMA: case CellInformation::CellType::CELL_TYPE_TDSCDMA: { JudgmentDataUmts(refInfo, infoItem); break; } case CellInformation::CellType::CELL_TYPE_NR: { JudgmentDataNr(refInfo, infoItem); break; } default: break; } auto gnssAbility = DelayedSingleton::GetInstance(); if (gnssAbility == nullptr) { LBSLOGE(GNSS, "RequestAgnssRefInfo: gnss ability is nullptr"); break; } gnssAbility.get()->SetRefInfo(refInfo); break; } return ERR_OK; } void AGnssEventCallback::JudgmentDataGsm(AGnssRefInfo& refInfo, sptr infoItem) { auto gsmCellInfo = static_cast(infoItem.GetRefPtr()); if (gsmCellInfo != nullptr) { refInfo.cellId.type = HDI::Location::Agnss::V1_0::CELLID_TYPE_GSM; refInfo.cellId.mcc = static_cast(std::stoi(gsmCellInfo->GetMcc())); refInfo.cellId.mnc = static_cast(std::stoi(gsmCellInfo->GetMnc())); refInfo.cellId.lac = static_cast(gsmCellInfo->GetLac()); refInfo.cellId.cid = static_cast(gsmCellInfo->GetCellId()); } } void AGnssEventCallback::JudgmentDataLte(AGnssRefInfo& refInfo, sptr infoItem) { auto lteCellInfo = static_cast(infoItem.GetRefPtr()); if (lteCellInfo != nullptr) { refInfo.cellId.type = HDI::Location::Agnss::V1_0::CELLID_TYPE_LTE; refInfo.cellId.mcc = static_cast(std::stoi(lteCellInfo->GetMcc())); refInfo.cellId.mnc = static_cast(std::stoi(lteCellInfo->GetMnc())); refInfo.cellId.tac = static_cast(lteCellInfo->GetTac()); refInfo.cellId.cid = static_cast(lteCellInfo->GetCellId()); refInfo.cellId.pcid = static_cast(lteCellInfo->GetPci()); } } void AGnssEventCallback::JudgmentDataNr(AGnssRefInfo& refInfo, sptr infoItem) { auto nrCellInfo = static_cast(infoItem.GetRefPtr()); if (nrCellInfo != nullptr) { refInfo.cellId.type = HDI::Location::Agnss::V1_0::CELLID_TYPE_NR; refInfo.cellId.mcc = static_cast(std::stoi(nrCellInfo->GetMcc())); refInfo.cellId.mnc = static_cast(std::stoi(nrCellInfo->GetMnc())); refInfo.cellId.tac = static_cast(nrCellInfo->GetTac()); refInfo.cellId.cid = static_cast(nrCellInfo->GetCellId()); refInfo.cellId.pcid = static_cast(nrCellInfo->GetPci()); refInfo.cellId.nci = static_cast(nrCellInfo->GetNci()); } } void AGnssEventCallback::JudgmentDataUmts(AGnssRefInfo& refInfo, sptr infoItem) { auto wcdmaCellInfo = static_cast(infoItem.GetRefPtr()); if (wcdmaCellInfo != nullptr) { refInfo.cellId.type = HDI::Location::Agnss::V1_0::CELLID_TYPE_UMTS; refInfo.cellId.mcc = static_cast(std::stoi(wcdmaCellInfo->GetMcc())); refInfo.cellId.mnc = static_cast(std::stoi(wcdmaCellInfo->GetMnc())); refInfo.cellId.lac = static_cast(wcdmaCellInfo->GetLac()); refInfo.cellId.cid = static_cast(wcdmaCellInfo->GetCellId()); } } } // namespace Location } // namespace OHOS