147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
2e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *
3e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * Redistribution and use in source and binary forms, with or without
4e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * modification, are permitted provided that the following conditions are
5e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * met:
6e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *     * Redistributions of source code must retain the above copyright
7e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *       notice, this list of conditions and the following disclaimer.
8e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *     * Redistributions in binary form must reproduce the above
9e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *       copyright notice, this list of conditions and the following
10e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *       disclaimer in the documentation and/or other materials provided
11e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *       with the distribution.
12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
13e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *       contributors may be used to endorse or promote products derived
14e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *       from this software without specific prior written permission.
15e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *
16e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *
28e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo */
29e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#define LOG_NDDEBUG 0
30e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#define LOG_TAG "LocSvc_EngAdapter"
31e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
32e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocEngAdapter.h>
33e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "loc_eng_msg.h"
34e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "loc_log.h"
35e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
36e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russousing namespace loc_core;
37e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
38e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocInternalAdapter::LocInternalAdapter(LocEngAdapter* adapter) :
39e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocAdapterBase(adapter->getMsgTask()),
40e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    mLocEngAdapter(adapter)
41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
42e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
43e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocInternalAdapter::setPositionModeInt(LocPosMode& posMode) {
44e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngPositionMode(mLocEngAdapter, posMode));
45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
46e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocInternalAdapter::startFixInt() {
47e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngStartFix(mLocEngAdapter));
48e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
49e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocInternalAdapter::stopFixInt() {
50e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngStopFix(mLocEngAdapter));
51e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
5247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid LocInternalAdapter::getZppInt() {
5347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    sendMsg(new LocEngGetZpp(mLocEngAdapter));
5447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
55e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
5647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid LocInternalAdapter::shutdown() {
5747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    sendMsg(new LocEngShutdown(mLocEngAdapter));
58e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
59e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
60e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
6147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                             void* owner, ContextBase* context,
62e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                             MsgTask::tCreate tCreator) :
63e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocAdapterBase(mask,
6447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                   //Get the AFW context if VzW context has not already been intialized in
6547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                   //loc_ext
6647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                   context == NULL?
6747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                   LocDualContext::getLocFgContext(tCreator,
6847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                                                   LocDualContext::mLocationHalName)
6947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                   :context),
70e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    mOwner(owner), mInternalAdapter(new LocInternalAdapter(this)),
71e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    mUlp(new UlpProxyBase()), mNavigating(false),
7247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    mSupportsAgpsRequests(false),
7347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    mSupportsPositionInjection(false), mPowerVote(0)
74e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
75e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    memset(&mFixCriteria, 0, sizeof(mFixCriteria));
7647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
77e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_LOGD("LocEngAdapter created");
78e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
79e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
80e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
81e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocEngAdapter::~LocEngAdapter()
82e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
83e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    delete mInternalAdapter;
84e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_LOGV("LocEngAdapter deleted");
85e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
86e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
8747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid LocInternalAdapter::setUlpProxy(UlpProxyBase* ulp) {
8847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    struct LocSetUlpProxy : public LocMsg {
8947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LocAdapterBase* mAdapter;
9047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        UlpProxyBase* mUlp;
9147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        inline LocSetUlpProxy(LocAdapterBase* adapter, UlpProxyBase* ulp) :
9247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo            LocMsg(), mAdapter(adapter), mUlp(ulp) {
9347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        }
9447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        virtual void proc() const {
9547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo            LOC_LOGV("%s] ulp %p adapter %p", __func__,
9647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                     mUlp, mAdapter);
9747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo            mAdapter->setUlpProxy(mUlp);
9847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        }
9947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    };
10047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
10147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    sendMsg(new LocSetUlpProxy(mLocEngAdapter, ulp));
10247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
10347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
104e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::setUlpProxy(UlpProxyBase* ulp)
105e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
10647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (ulp == mUlp) {
10747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        //This takes care of the case when double initalization happens
10847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        //and we get the same object back for UlpProxyBase . Do nothing
10947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        return;
11047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
11147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
112e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_LOGV("%s] %p", __func__, ulp);
113e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (NULL == ulp) {
11447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LOC_LOGE("%s:%d]: ulp pointer is NULL", __func__, __LINE__);
115e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        ulp = new UlpProxyBase();
116e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
11747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
11847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (LOC_POSITION_MODE_INVALID != mUlp->mPosMode.mode) {
11947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        // need to send this mode and start msg to ULP
12047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        ulp->sendFixMode(mUlp->mPosMode);
12147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
12247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
12347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if(mUlp->mFixSet) {
12447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        ulp->sendStartFix();
12547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
12647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
12747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    delete mUlp;
128e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    mUlp = ulp;
129e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
130e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1318aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tangint LocEngAdapter::setGpsLockMsg(LOC_GPS_LOCK_MASK lockMask)
13247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{
1338aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    struct LocEngAdapterGpsLock : public LocMsg {
13447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LocEngAdapter* mAdapter;
1358aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        LOC_GPS_LOCK_MASK mLockMask;
1368aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        inline LocEngAdapterGpsLock(LocEngAdapter* adapter, LOC_GPS_LOCK_MASK lockMask) :
1378aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang            LocMsg(), mAdapter(adapter), mLockMask(lockMask)
13847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        {
13947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo            locallog();
14047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        }
14147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        inline virtual void proc() const {
1428aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang            mAdapter->setGpsLock(mLockMask);
14347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        }
14447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        inline  void locallog() const {
1458aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang            LOC_LOGV("LocEngAdapterGpsLock - mLockMask: %x", mLockMask);
14647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        }
14747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        inline virtual void log() const {
14847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo            locallog();
14947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        }
15047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    };
1518aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    sendMsg(new LocEngAdapterGpsLock(this, lockMask));
1528aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    return 0;
1538aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang}
15447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
1558aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tangvoid LocEngAdapter::requestPowerVote()
1568aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang{
15747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (getPowerVoteRight()) {
1588aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        /* Power voting without engine lock:
1598aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang         * 101: vote down, 102-104 - vote up
1608aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang         * These codes are used not to confuse with actual engine lock
1618aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang         * functionality, that can't be used in SSR scenario, as it
1628aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang         * conflicts with initialization sequence.
1638aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang         */
1648aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        bool powerUp = getPowerVote();
1658aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        LOC_LOGV("LocEngAdapterVotePower - Vote Power: %d", (int)powerUp);
1668aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        setGpsLock(powerUp ? 103 : 101);
16747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
16847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
16947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
170e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocInternalAdapter::reportPosition(UlpLocation &location,
171e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        GpsLocationExtended &locationExtended,
172e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        void* locationExt,
173e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        enum loc_sess_status status,
174e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        LocPosTechMask loc_technology_mask)
175e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
176e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngReportPosition(mLocEngAdapter,
177e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     location,
178e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     locationExtended,
179e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     locationExt,
180e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     status,
181e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     loc_technology_mask));
182e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
183e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
184e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
185e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::reportPosition(UlpLocation &location,
186e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   GpsLocationExtended &locationExtended,
187e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   void* locationExt,
188e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   enum loc_sess_status status,
189e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   LocPosTechMask loc_technology_mask)
190e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
191e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (! mUlp->reportPosition(location,
192e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               locationExtended,
193e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               locationExt,
194e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               status,
195e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               loc_technology_mask )) {
196e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        mInternalAdapter->reportPosition(location,
197e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                         locationExtended,
198e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                         locationExt,
199e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                         status,
200e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                         loc_technology_mask);
201e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
202e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
203e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
204e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocInternalAdapter::reportSv(GpsSvStatus &svStatus,
205e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                  GpsLocationExtended &locationExtended,
206e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                  void* svExt){
207e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngReportSv(mLocEngAdapter, svStatus,
208e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               locationExtended, svExt));
209e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
210e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
211e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::reportSv(GpsSvStatus &svStatus,
212e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                             GpsLocationExtended &locationExtended,
213e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                             void* svExt)
214e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
215e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
216e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // We want to send SV info to ULP to help it in determining GNSS
217e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // signal strength ULP will forward the SV reports to HAL without
218e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // any modifications
219e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (! mUlp->reportSv(svStatus, locationExtended, svExt)) {
220e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        mInternalAdapter->reportSv(svStatus, locationExtended, svExt);
221e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
222e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
223e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
22447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid LocEngAdapter::setInSession(bool inSession)
22547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{
22647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    mNavigating = inSession;
22747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    mLocApi->setInSession(inSession);
22847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (!mNavigating) {
22947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
23047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
23147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
23247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
23347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid LocInternalAdapter::reportStatus(GpsStatusValue status)
23447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{
23547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    sendMsg(new LocEngReportStatus(mLocEngAdapter, status));
23647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
23747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
238e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::reportStatus(GpsStatusValue status)
239e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
24047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (!mUlp->reportStatus(status)) {
24147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        mInternalAdapter->reportStatus(status);
24247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
243e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
244e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
245e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
246e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::reportNmea(const char* nmea, int length)
247e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
248e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngReportNmea(mOwner, nmea, length));
249e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
250e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
251e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
252e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::reportXtraServer(const char* url1,
253e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        const char* url2,
254e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        const char* url3,
255e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                        const int maxlength)
256e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
25747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests) {
258e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        sendMsg(new LocEngReportXtraServer(mOwner, url1,
259e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                           url2, url3, maxlength));
260e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
26147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
262e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
263e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
264e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
265e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::requestATL(int connHandle, AGpsType agps_type)
266e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
26747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests) {
268e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        sendMsg(new LocEngRequestATL(mOwner,
269e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     connHandle, agps_type));
270e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
27147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
272e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
273e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
274e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
275e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::releaseATL(int connHandle)
276e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
27747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests) {
278e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        sendMsg(new LocEngReleaseATL(mOwner, connHandle));
279e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
28047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
281e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
282e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
283e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
284e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::requestXtraData()
285e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
28647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests) {
287e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        sendMsg(new LocEngRequestXtra(mOwner));
288e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
28947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
290e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
291e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
292e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
293e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::requestTime()
294e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
29547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests) {
2961fdba83aa599f3905ba7632c7008299a8d2747b5Kevin Tang        sendMsg(new LocEngRequestTime(mOwner));
297e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
29847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
299e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
300e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
301e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
302e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::requestNiNotify(GpsNiNotification &notif, const void* data)
303e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
30447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests) {
305e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        notif.size = sizeof(notif);
306e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        notif.timeout = LOC_NI_NO_RESPONSE_TIME;
307e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
308e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        sendMsg(new LocEngRequestNi(mOwner, notif, data));
309e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
31047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
311e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
312e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
313e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
314e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::requestSuplES(int connHandle)
315e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
31647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if (mSupportsAgpsRequests)
31747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        sendMsg(new LocEngRequestSuplEs(mOwner, connHandle));
31847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
319e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
320e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
321e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
322e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::reportDataCallOpened()
323e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
32447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if(mSupportsAgpsRequests)
32547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        sendMsg(new LocEngSuplEsOpened(mOwner));
32647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
327e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
328e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
329e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
330e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russobool LocEngAdapter::reportDataCallClosed()
331e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
33247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if(mSupportsAgpsRequests)
33347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        sendMsg(new LocEngSuplEsClosed(mOwner));
33447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return mSupportsAgpsRequests;
335e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
336e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
337e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
338e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::handleEngineDownEvent()
339e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
340e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngDown(mOwner));
341e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
342e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
343e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoinline
344e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocEngAdapter::handleEngineUpEvent()
345e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
346e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    sendMsg(new LocEngUp(mOwner));
347e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
3488aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
3498aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavavoid LocEngAdapter::reportGpsMeasurementData(GpsData &gpsMeasurementData)
3508aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava{
3518aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    sendMsg(new LocEngReportGpsMeasurement(mOwner,
3528aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava                                           gpsMeasurementData));
3538aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava}
3548aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
3558aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava/*
3568aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava  Update Registration Mask
3578aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava */
3588aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavavoid LocEngAdapter::updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
3598aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava                                           loc_registration_mask_status isEnabled)
3608aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava{
3618aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    LOC_LOGD("entering %s", __func__);
3628aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    int result = LOC_API_ADAPTER_ERR_FAILURE;
3638aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    result = mLocApi->updateRegistrationMask(event, isEnabled);
3648aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    if (result == LOC_API_ADAPTER_ERR_SUCCESS) {
3658aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava        LOC_LOGD("%s] update registration mask succeed.", __func__);
3668aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    } else {
3678aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava        LOC_LOGE("%s] update registration mask failed.", __func__);
3688aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    }
3698aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava}
3708aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
3718aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava/*
3728aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava  Set Gnss Constellation Config
3738aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava */
3748aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavabool LocEngAdapter::gnssConstellationConfig()
3758aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava{
3768aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    LOC_LOGD("entering %s", __func__);
3778aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    bool result = false;
3788aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    result = mLocApi->gnssConstellationConfig();
3798aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    return result;
3808aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava}
381