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