1eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* 2eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Copyright (c) 2017, The Linux Foundation. All rights reserved. 3eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Not a Contribution 4eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 5eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* 6eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Copyright (C) 2016 The Android Open Source Project 7eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 8eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Licensed under the Apache License, Version 2.0 (the "License"); 9eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * you may not use this file except in compliance with the License. 10eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * You may obtain a copy of the License at 11eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 12eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * http://www.apache.org/licenses/LICENSE-2.0 13eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 14eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Unless required by applicable law or agreed to in writing, software 15eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * distributed under the License is distributed on an "AS IS" BASIS, 16eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * See the License for the specific language governing permissions and 18eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * limitations under the License. 19eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 20eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 21eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOG_TAG "LocSvc_AGnssInterface" 22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <log_util.h> 24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "Gnss.h" 25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "AGnss.h" 26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <gps_extended_c.h> 27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace android { 29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace hardware { 30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace gnss { 31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace V1_0 { 32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace implementation { 33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhsp<IAGnssCallback> AGnss::sAGnssCbIface = nullptr; 35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhAGnss::AGnss(Gnss* gnss) : mGnss(gnss) { 37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid AGnss::agnssStatusIpV4Cb(IAGnssCallback::AGnssStatusIpV4 status){ 40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sAGnssCbIface->agnssStatusIpV4Cb(status); 42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<void> AGnss::setCallback(const sp<IAGnssCallback>& callback) { 45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ 47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("Null GNSS interface"); 48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return Void(); 49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Save the interface 52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sAGnssCbIface = callback; 53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsCbInfo cbInfo = {}; 55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb; 56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cbInfo.cbPriority = AGPS_CB_PRIORITY_LOW; 57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnss->getGnssInterface()->agpsInit(cbInfo); 59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return Void(); 60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> AGnss::dataConnClosed() { 63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ 65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("Null GNSS interface"); 66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnss->getGnssInterface()->agpsDataConnClosed(LOC_AGPS_TYPE_SUPL); 70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> AGnss::dataConnFailed() { 74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ 76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("Null GNSS interface"); 77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnss->getGnssInterface()->agpsDataConnFailed(LOC_AGPS_TYPE_SUPL); 81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> AGnss::dataConnOpen(const hidl_string& apn, 85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh IAGnss::ApnIpType apnIpType) { 86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ 88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("Null GNSS interface"); 89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Validate */ 93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(apn.empty()){ 94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("Invalid APN"); 95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("dataConnOpen APN name = [%s]", apn.c_str()); 99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnss->getGnssInterface()->agpsDataConnOpen( 101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_AGPS_TYPE_SUPL, apn.c_str(), apn.size(), (int)apnIpType); 102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> AGnss::setServer(IAGnssCallback::AGnssType type, 106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const hidl_string& hostname, 107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int32_t port) { 108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mGnss == nullptr) { 109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); 110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssConfig config; 114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh memset(&config, 0, sizeof(GnssConfig)); 115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.size = sizeof(GnssConfig); 116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.flags = GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT; 117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.assistanceServer.size = sizeof(GnssConfigSetAssistanceServer); 118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (type == IAGnssCallback::AGnssType::TYPE_SUPL) { 119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_SUPL; 120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else if (type == IAGnssCallback::AGnssType::TYPE_C2K) { 121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_C2K; 122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: invalid AGnssType: %d", __FUNCTION__, static_cast<int>(type)); 124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.assistanceServer.hostName = strdup(hostname.c_str()); 127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh config.assistanceServer.port = port; 128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mGnss->updateConfiguration(config); 129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace implementation 132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace V1_0 133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace gnss 134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace hardware 135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace android 136