AGnss.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright (c) 2017-2019, 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. #define LOG_TAG "LocSvc_AGnssInterface"
  21. #include <log_util.h>
  22. #include "Gnss.h"
  23. #include "AGnss.h"
  24. namespace android {
  25. namespace hardware {
  26. namespace gnss {
  27. namespace V2_0 {
  28. namespace implementation {
  29. static AGnss* spAGnss = nullptr;
  30. AGnss::AGnss(Gnss* gnss) : mGnss(gnss) {
  31. spAGnss = this;
  32. }
  33. AGnss::~AGnss() {
  34. spAGnss = nullptr;
  35. }
  36. void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status) {
  37. if (nullptr != spAGnss) {
  38. spAGnss->statusCb(status.type, status.status);
  39. }
  40. }
  41. void AGnss::statusCb(AGpsExtType type, LocAGpsStatusValue status) {
  42. V2_0::IAGnssCallback::AGnssType aType;
  43. IAGnssCallback::AGnssStatusValue aStatus;
  44. switch (type) {
  45. case LOC_AGPS_TYPE_SUPL:
  46. aType = IAGnssCallback::AGnssType::SUPL;
  47. break;
  48. case LOC_AGPS_TYPE_SUPL_ES:
  49. aType = IAGnssCallback::AGnssType::SUPL_EIMS;
  50. break;
  51. default:
  52. LOC_LOGE("invalid type: %d", type);
  53. return;
  54. }
  55. switch (status) {
  56. case LOC_GPS_REQUEST_AGPS_DATA_CONN:
  57. aStatus = IAGnssCallback::AGnssStatusValue::REQUEST_AGNSS_DATA_CONN;
  58. break;
  59. case LOC_GPS_RELEASE_AGPS_DATA_CONN:
  60. aStatus = IAGnssCallback::AGnssStatusValue::RELEASE_AGNSS_DATA_CONN;
  61. break;
  62. case LOC_GPS_AGPS_DATA_CONNECTED:
  63. aStatus = IAGnssCallback::AGnssStatusValue::AGNSS_DATA_CONNECTED;
  64. break;
  65. case LOC_GPS_AGPS_DATA_CONN_DONE:
  66. aStatus = IAGnssCallback::AGnssStatusValue::AGNSS_DATA_CONN_DONE;
  67. break;
  68. case LOC_GPS_AGPS_DATA_CONN_FAILED:
  69. aStatus = IAGnssCallback::AGnssStatusValue::AGNSS_DATA_CONN_FAILED;
  70. break;
  71. default:
  72. LOC_LOGE("invalid status: %d", status);
  73. return;
  74. }
  75. mMutex.lock();
  76. auto aGnssCbIface = mAGnssCbIface;
  77. mMutex.unlock();
  78. if (aGnssCbIface != nullptr) {
  79. auto r = aGnssCbIface->agnssStatusCb(aType, aStatus);
  80. if (!r.isOk()) {
  81. LOC_LOGw("Error invoking AGNSS status cb %s", r.description().c_str());
  82. }
  83. }
  84. else {
  85. LOC_LOGw("setCallback has not been called yet");
  86. }
  87. }
  88. Return<void> AGnss::setCallback(const sp<V2_0::IAGnssCallback>& callback) {
  89. if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){
  90. LOC_LOGE("Null GNSS interface");
  91. return Void();
  92. }
  93. // Save the interface
  94. mMutex.lock();
  95. mAGnssCbIface = callback;
  96. mMutex.unlock();
  97. AgpsCbInfo cbInfo = {};
  98. cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
  99. cbInfo.atlType = AGPS_ATL_TYPE_SUPL | AGPS_ATL_TYPE_SUPL_ES;
  100. mGnss->getGnssInterface()->agpsInit(cbInfo);
  101. return Void();
  102. }
  103. Return<bool> AGnss::dataConnClosed() {
  104. if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){
  105. LOC_LOGE("Null GNSS interface");
  106. return false;
  107. }
  108. mGnss->getGnssInterface()->agpsDataConnClosed(LOC_AGPS_TYPE_SUPL);
  109. return true;
  110. }
  111. Return<bool> AGnss::dataConnFailed() {
  112. if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){
  113. LOC_LOGE("Null GNSS interface");
  114. return false;
  115. }
  116. mGnss->getGnssInterface()->agpsDataConnFailed(LOC_AGPS_TYPE_SUPL);
  117. return true;
  118. }
  119. Return<bool> AGnss::dataConnOpen(uint64_t /*networkHandle*/, const hidl_string& apn,
  120. V2_0::IAGnss::ApnIpType apnIpType) {
  121. if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){
  122. LOC_LOGE("Null GNSS interface");
  123. return false;
  124. }
  125. /* Validate */
  126. if(apn.empty()){
  127. LOC_LOGE("Invalid APN");
  128. return false;
  129. }
  130. LOC_LOGD("dataConnOpen APN name = [%s]", apn.c_str());
  131. AGpsBearerType bearerType;
  132. switch (apnIpType) {
  133. case IAGnss::ApnIpType::IPV4:
  134. bearerType = AGPS_APN_BEARER_IPV4;
  135. break;
  136. case IAGnss::ApnIpType::IPV6:
  137. bearerType = AGPS_APN_BEARER_IPV6;
  138. break;
  139. case IAGnss::ApnIpType::IPV4V6:
  140. bearerType = AGPS_APN_BEARER_IPV4V6;
  141. break;
  142. default:
  143. bearerType = AGPS_APN_BEARER_IPV4;
  144. break;
  145. }
  146. mGnss->getGnssInterface()->agpsDataConnOpen(
  147. LOC_AGPS_TYPE_SUPL, apn.c_str(), apn.size(), (int)bearerType);
  148. return true;
  149. }
  150. Return<bool> AGnss::setServer(V2_0::IAGnssCallback::AGnssType type,
  151. const hidl_string& hostname,
  152. int32_t port) {
  153. if (mGnss == nullptr) {
  154. LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
  155. return false;
  156. }
  157. GnssConfig config;
  158. memset(&config, 0, sizeof(GnssConfig));
  159. config.size = sizeof(GnssConfig);
  160. config.flags = GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT;
  161. config.assistanceServer.size = sizeof(GnssConfigSetAssistanceServer);
  162. if (type == IAGnssCallback::AGnssType::SUPL) {
  163. config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_SUPL;
  164. } else if (type == IAGnssCallback::AGnssType::C2K) {
  165. config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_C2K;
  166. } else if (type == IAGnssCallback::AGnssType::SUPL_EIMS) {
  167. config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_SUPL_EIMS;
  168. } else if (type == IAGnssCallback::AGnssType::SUPL_IMS) {
  169. config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_SUPL_IMS;
  170. } else {
  171. LOC_LOGE("%s]: invalid AGnssType: %d", __FUNCTION__, static_cast<uint8_t>(type));
  172. return false;
  173. }
  174. config.assistanceServer.hostName = strdup(hostname.c_str());
  175. config.assistanceServer.port = port;
  176. return mGnss->updateConfiguration(config);
  177. }
  178. } // namespace implementation
  179. } // namespace V2_0
  180. } // namespace gnss
  181. } // namespace hardware
  182. } // namespace android