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