1 /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation, nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 #define LOG_NDDEBUG 0 30 #define LOG_TAG "LocSvc_EngAdapter" 31 32 #include <LocEngAdapter.h> 33 #include "loc_eng_msg.h" 34 #include "loc_log.h" 35 36 using namespace loc_core; 37 38 LocInternalAdapter::LocInternalAdapter(LocEngAdapter* adapter) : 39 LocAdapterBase(adapter->getMsgTask()), 40 mLocEngAdapter(adapter) 41 { 42 } 43 void LocInternalAdapter::setPositionModeInt(LocPosMode& posMode) { 44 sendMsg(new LocEngPositionMode(mLocEngAdapter, posMode)); 45 } 46 void LocInternalAdapter::startFixInt() { 47 sendMsg(new LocEngStartFix(mLocEngAdapter)); 48 } 49 void LocInternalAdapter::stopFixInt() { 50 sendMsg(new LocEngStopFix(mLocEngAdapter)); 51 } 52 void LocInternalAdapter::setUlpProxy(UlpProxyBase* ulp) { 53 struct LocSetUlpProxy : public LocMsg { 54 LocAdapterBase* mAdapter; 55 UlpProxyBase* mUlp; 56 inline LocSetUlpProxy(LocAdapterBase* adapter, UlpProxyBase* ulp) : 57 LocMsg(), mAdapter(adapter), mUlp(ulp) { 58 } 59 virtual void proc() const { 60 LOC_LOGV("%s] ulp %p adapter %p", __func__, 61 mUlp, mAdapter); 62 mAdapter->setUlpProxy(mUlp); 63 } 64 }; 65 66 sendMsg(new LocSetUlpProxy(mLocEngAdapter, ulp)); 67 } 68 69 LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask, 70 void* owner, 71 MsgTask::tCreate tCreator) : 72 LocAdapterBase(mask, 73 LocDualContext::getLocFgContext( 74 tCreator, 75 LocDualContext::mLocationHalName)), 76 mOwner(owner), mInternalAdapter(new LocInternalAdapter(this)), 77 mUlp(new UlpProxyBase()), mNavigating(false), 78 mAgpsEnabled(false) 79 { 80 memset(&mFixCriteria, 0, sizeof(mFixCriteria)); 81 LOC_LOGD("LocEngAdapter created"); 82 } 83 84 inline 85 LocEngAdapter::~LocEngAdapter() 86 { 87 delete mInternalAdapter; 88 LOC_LOGV("LocEngAdapter deleted"); 89 } 90 91 void LocEngAdapter::setUlpProxy(UlpProxyBase* ulp) 92 { 93 delete mUlp; 94 LOC_LOGV("%s] %p", __func__, ulp); 95 if (NULL == ulp) { 96 ulp = new UlpProxyBase(); 97 } 98 mUlp = ulp; 99 } 100 101 void LocInternalAdapter::reportPosition(UlpLocation &location, 102 GpsLocationExtended &locationExtended, 103 void* locationExt, 104 enum loc_sess_status status, 105 LocPosTechMask loc_technology_mask) 106 { 107 sendMsg(new LocEngReportPosition(mLocEngAdapter, 108 location, 109 locationExtended, 110 locationExt, 111 status, 112 loc_technology_mask)); 113 } 114 115 116 void LocEngAdapter::reportPosition(UlpLocation &location, 117 GpsLocationExtended &locationExtended, 118 void* locationExt, 119 enum loc_sess_status status, 120 LocPosTechMask loc_technology_mask) 121 { 122 if (! mUlp->reportPosition(location, 123 locationExtended, 124 locationExt, 125 status, 126 loc_technology_mask )) { 127 mInternalAdapter->reportPosition(location, 128 locationExtended, 129 locationExt, 130 status, 131 loc_technology_mask); 132 } 133 } 134 135 void LocInternalAdapter::reportSv(GpsSvStatus &svStatus, 136 GpsLocationExtended &locationExtended, 137 void* svExt){ 138 sendMsg(new LocEngReportSv(mLocEngAdapter, svStatus, 139 locationExtended, svExt)); 140 } 141 142 void LocEngAdapter::reportSv(GpsSvStatus &svStatus, 143 GpsLocationExtended &locationExtended, 144 void* svExt) 145 { 146 147 // We want to send SV info to ULP to help it in determining GNSS 148 // signal strength ULP will forward the SV reports to HAL without 149 // any modifications 150 if (! mUlp->reportSv(svStatus, locationExtended, svExt)) { 151 mInternalAdapter->reportSv(svStatus, locationExtended, svExt); 152 } 153 } 154 155 inline 156 void LocEngAdapter::reportStatus(GpsStatusValue status) 157 { 158 sendMsg(new LocEngReportStatus(mOwner, status)); 159 } 160 161 inline 162 void LocEngAdapter::reportNmea(const char* nmea, int length) 163 { 164 sendMsg(new LocEngReportNmea(mOwner, nmea, length)); 165 } 166 167 inline 168 bool LocEngAdapter::reportXtraServer(const char* url1, 169 const char* url2, 170 const char* url3, 171 const int maxlength) 172 { 173 if (mAgpsEnabled) { 174 sendMsg(new LocEngReportXtraServer(mOwner, url1, 175 url2, url3, maxlength)); 176 } 177 return mAgpsEnabled; 178 } 179 180 inline 181 bool LocEngAdapter::requestATL(int connHandle, AGpsType agps_type) 182 { 183 if (mAgpsEnabled) { 184 sendMsg(new LocEngRequestATL(mOwner, 185 connHandle, agps_type)); 186 } 187 return mAgpsEnabled; 188 } 189 190 inline 191 bool LocEngAdapter::releaseATL(int connHandle) 192 { 193 if (mAgpsEnabled) { 194 sendMsg(new LocEngReleaseATL(mOwner, connHandle)); 195 } 196 return mAgpsEnabled; 197 } 198 199 inline 200 bool LocEngAdapter::requestXtraData() 201 { 202 if (mAgpsEnabled) { 203 sendMsg(new LocEngRequestXtra(mOwner)); 204 } 205 return mAgpsEnabled; 206 } 207 208 inline 209 bool LocEngAdapter::requestTime() 210 { 211 if (mAgpsEnabled) { 212 sendMsg(new LocEngRequestTime(mOwner)); 213 } 214 return mAgpsEnabled; 215 } 216 217 inline 218 bool LocEngAdapter::requestNiNotify(GpsNiNotification ¬if, const void* data) 219 { 220 if (mAgpsEnabled) { 221 notif.size = sizeof(notif); 222 notif.timeout = LOC_NI_NO_RESPONSE_TIME; 223 224 sendMsg(new LocEngRequestNi(mOwner, notif, data)); 225 } 226 return mAgpsEnabled; 227 } 228 229 inline 230 bool LocEngAdapter::requestSuplES(int connHandle) 231 { 232 sendMsg(new LocEngRequestSuplEs(mOwner, connHandle)); 233 return true; 234 } 235 236 inline 237 bool LocEngAdapter::reportDataCallOpened() 238 { 239 sendMsg(new LocEngSuplEsOpened(mOwner)); 240 return true; 241 } 242 243 inline 244 bool LocEngAdapter::reportDataCallClosed() 245 { 246 sendMsg(new LocEngSuplEsClosed(mOwner)); 247 return true; 248 } 249 250 inline 251 void LocEngAdapter::handleEngineDownEvent() 252 { 253 sendMsg(new LocEngDown(mOwner)); 254 } 255 256 inline 257 void LocEngAdapter::handleEngineUpEvent() 258 { 259 sendMsg(new LocEngUp(mOwner)); 260 } 261