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 21namespace android { 22namespace hardware { 23namespace gnss { 24namespace V1_0 { 25namespace implementation { 26 27std::vector<std::unique_ptr<ThreadFuncArgs>> AGnssRil::sThreadFuncArgsList; 28sp<IAGnssRilCallback> AGnssRil::sAGnssRilCbIface = nullptr; 29bool AGnssRil::sInterfaceExists = false; 30 31AGpsRilCallbacks AGnssRil::sAGnssRilCb = { 32 .request_setid = AGnssRil::requestSetId, 33 .request_refloc = AGnssRil::requestRefLoc, 34 .create_thread_cb = AGnssRil::createThreadCb 35}; 36 37AGnssRil::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 43AGnssRil::~AGnssRil() { 44 sThreadFuncArgsList.clear(); 45 sInterfaceExists = false; 46} 47 48void 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 60void 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 72pthread_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. 77Return<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 89Return<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 113Return<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 123Return<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 138Return<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