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_GnssConfigurationInterface"
22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <log_util.h>
24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "Gnss.h"
25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "GnssConfiguration.h"
26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace android {
28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace hardware {
29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace gnss {
30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace V1_0 {
31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace implementation {
32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssConfiguration::GnssConfiguration(Gnss* gnss) : mGnss(gnss) {
34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// Methods from ::android::hardware::gps::V1_0::IGnssConfiguration follow.
37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setSuplEs(bool enabled)  {
38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT;
47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.suplEmergencyServices = (enabled ?
48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_YES :
49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO);
50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setSuplVersion(uint32_t version)  {
55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT;
64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    switch (version) {
65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 0x00020002:
66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplVersion = GNSS_CONFIG_SUPL_VERSION_2_0_2;
67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 0x00020000:
69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplVersion = GNSS_CONFIG_SUPL_VERSION_2_0_0;
70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 0x00010000:
72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplVersion = GNSS_CONFIG_SUPL_VERSION_1_0_0;
73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        default:
75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            LOC_LOGE("%s]: invalid version: 0x%x.", __FUNCTION__, version);
76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            return false;
77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setSuplMode(uint8_t mode)  {
84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_SUPL_MODE_BIT;
93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    switch (mode) {
94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 0:
95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplModeMask = 0; // STANDALONE ONLY
96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 1:
98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplModeMask = GNSS_CONFIG_SUPL_MODE_MSB_BIT;
99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 2:
101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplModeMask = GNSS_CONFIG_SUPL_MODE_MSA_BIT;
102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 3:
104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.suplModeMask = GNSS_CONFIG_SUPL_MODE_MSB_BIT | GNSS_CONFIG_SUPL_MODE_MSA_BIT;
105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        default:
107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            LOC_LOGE("%s]: invalid mode: %d.", __FUNCTION__, mode);
108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            return false;
109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setLppProfile(uint8_t lppProfile) {
116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT;
125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    switch (lppProfile) {
126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 0:
127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.lppProfile = GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE;
128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 1:
130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.lppProfile = GNSS_CONFIG_LPP_PROFILE_USER_PLANE;
131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 2:
133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.lppProfile = GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE;
134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 3:
136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.lppProfile = GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE;
137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        default:
139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            LOC_LOGE("%s]: invalid lppProfile: %d.", __FUNCTION__, lppProfile);
140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            return false;
141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setGlonassPositioningProtocol(uint8_t protocol) {
148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT;
158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (protocol & (1<<0)) {
159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        config.aGlonassPositionProtocolMask |= GNSS_CONFIG_RRC_CONTROL_PLANE_BIT;
160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (protocol & (1<<1)) {
162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        config.aGlonassPositionProtocolMask |= GNSS_CONFIG_RRLP_USER_PLANE_BIT;
163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (protocol & (1<<2)) {
165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        config.aGlonassPositionProtocolMask |= GNSS_CONFIG_LLP_USER_PLANE_BIT;
166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (protocol & (1<<3)) {
168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        config.aGlonassPositionProtocolMask |= GNSS_CONFIG_LLP_CONTROL_PLANE_BIT;
169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setGpsLock(uint8_t lock) {
175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT;
184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    switch (lock) {
185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 0:
186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.gpsLock = GNSS_CONFIG_GPS_LOCK_NONE;
187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 1:
189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.gpsLock = GNSS_CONFIG_GPS_LOCK_MO;
190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 2:
192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.gpsLock = GNSS_CONFIG_GPS_LOCK_NI;
193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        case 3:
195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            config.gpsLock = GNSS_CONFIG_GPS_LOCK_MO_AND_NI;
196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        default:
198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            LOC_LOGE("%s]: invalid lock: %d.", __FUNCTION__, lock);
199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            return false;
200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            break;
201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
203eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
204eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
205eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
206eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<bool> GnssConfiguration::setEmergencySuplPdn(bool enabled) {
207eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnss == nullptr) {
208eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
209eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        return false;
210eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
211eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
212eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssConfig config;
213eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&config, 0, sizeof(GnssConfig));
214eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.size = sizeof(GnssConfig);
215eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.flags = GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT;
216eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    config.emergencyPdnForEmergencySupl = (enabled ?
217eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_YES :
218eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_NO);
219eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
220eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    return mGnss->updateConfiguration(config);
221eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
222eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
223eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace implementation
224eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace V1_0
225eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace gnss
226eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace hardware
227eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace android
228