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