Home | History | Annotate | Download | only in default
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "GnssHAL_AGnssRilInterface"
     18 
     19 #include "AGnssRil.h"
     20 
     21 namespace android {
     22 namespace hardware {
     23 namespace gnss {
     24 namespace V1_0 {
     25 namespace implementation {
     26 
     27 std::vector<std::unique_ptr<ThreadFuncArgs>> AGnssRil::sThreadFuncArgsList;
     28 sp<IAGnssRilCallback> AGnssRil::sAGnssRilCbIface = nullptr;
     29 bool AGnssRil::sInterfaceExists = false;
     30 
     31 AGpsRilCallbacks AGnssRil::sAGnssRilCb = {
     32     .request_setid = AGnssRil::requestSetId,
     33     .request_refloc = AGnssRil::requestRefLoc,
     34     .create_thread_cb = AGnssRil::createThreadCb
     35 };
     36 
     37 AGnssRil::AGnssRil(const AGpsRilInterface* aGpsRilIface) : mAGnssRilIface(aGpsRilIface) {
     38     /* Error out if an instance of the interface already exists. */
     39     LOG_ALWAYS_FATAL_IF(sInterfaceExists);
     40     sInterfaceExists = true;
     41 }
     42 
     43 AGnssRil::~AGnssRil() {
     44     sThreadFuncArgsList.clear();
     45     sInterfaceExists = false;
     46 }
     47 
     48 void AGnssRil::requestSetId(uint32_t flags) {
     49     if (sAGnssRilCbIface == nullptr) {
     50         ALOGE("%s: AGNSSRil Callback Interface configured incorrectly", __func__);
     51         return;
     52     }
     53 
     54     auto ret = sAGnssRilCbIface->requestSetIdCb(flags);
     55     if (!ret.isOk()) {
     56         ALOGE("%s: Unable to invoke callback", __func__);
     57     }
     58 }
     59 
     60 void AGnssRil::requestRefLoc(uint32_t /*flags*/) {
     61     if (sAGnssRilCbIface == nullptr) {
     62         ALOGE("%s: AGNSSRil Callback Interface configured incorrectly", __func__);
     63         return;
     64     }
     65 
     66     auto ret = sAGnssRilCbIface->requestRefLocCb();
     67     if (!ret.isOk()) {
     68         ALOGE("%s: Unable to invoke callback", __func__);
     69     }
     70 }
     71 
     72 pthread_t AGnssRil::createThreadCb(const char* name, void (*start)(void*), void* arg) {
     73     return createPthread(name, start, arg, &sThreadFuncArgsList);
     74 }
     75 
     76 // Methods from ::android::hardware::gnss::V1_0::IAGnssRil follow.
     77 Return<void> AGnssRil::setCallback(const sp<IAGnssRilCallback>& callback)  {
     78     if (mAGnssRilIface == nullptr) {
     79         ALOGE("%s: AGnssRil interface is unavailable", __func__);
     80         return Void();
     81     }
     82 
     83     sAGnssRilCbIface = callback;
     84 
     85     mAGnssRilIface->init(&sAGnssRilCb);
     86     return Void();
     87 }
     88 
     89 Return<void> AGnssRil::setRefLocation(const IAGnssRil::AGnssRefLocation& aGnssRefLocation)  {
     90     if (mAGnssRilIface == nullptr) {
     91         ALOGE("%s: AGnssRil interface is unavailable", __func__);
     92         return Void();
     93     }
     94 
     95     AGpsRefLocation aGnssRefloc;
     96     aGnssRefloc.type = static_cast<uint16_t>(aGnssRefLocation.type);
     97 
     98     auto& cellID = aGnssRefLocation.cellID;
     99     aGnssRefloc.u.cellID = {
    100         .type = static_cast<uint16_t>(cellID.type),
    101         .mcc = cellID.mcc,
    102         .mnc = cellID.mnc,
    103         .lac = cellID.lac,
    104         .cid = cellID.cid,
    105         .tac = cellID.tac,
    106         .pcid = cellID.pcid
    107     };
    108 
    109     mAGnssRilIface->set_ref_location(&aGnssRefloc, sizeof(aGnssRefloc));
    110     return Void();
    111 }
    112 
    113 Return<bool> AGnssRil::setSetId(IAGnssRil::SetIDType type, const hidl_string& setid)  {
    114     if (mAGnssRilIface == nullptr) {
    115         ALOGE("%s: AGnssRil interface is unavailable", __func__);
    116         return false;
    117     }
    118 
    119     mAGnssRilIface->set_set_id(static_cast<uint16_t>(type), setid.c_str());
    120     return true;
    121 }
    122 
    123 Return<bool> AGnssRil::updateNetworkState(bool connected,
    124                                           IAGnssRil::NetworkType type,
    125                                           bool roaming) {
    126     if (mAGnssRilIface == nullptr) {
    127         ALOGE("%s: AGnssRil interface is unavailable", __func__);
    128         return false;
    129     }
    130 
    131     mAGnssRilIface->update_network_state(connected,
    132                                          static_cast<int>(type),
    133                                          roaming,
    134                                          nullptr /* extra_info */);
    135     return true;
    136 }
    137 
    138 Return<bool> AGnssRil::updateNetworkAvailability(bool available, const hidl_string& apn)  {
    139     if (mAGnssRilIface == nullptr) {
    140         ALOGE("%s: AGnssRil interface is unavailable", __func__);
    141         return false;
    142     }
    143 
    144     mAGnssRilIface->update_network_availability(available, apn.c_str());
    145     return true;
    146 }
    147 
    148 }  // namespace implementation
    149 }  // namespace V1_0
    150 }  // namespace gnss
    151 }  // namespace hardware
    152 }  // namespace android
    153