1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without
4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are
5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met:
6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions of source code must retain the above copyright
7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       notice, this list of conditions and the following disclaimer.
8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions in binary form must reproduce the above
9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       copyright notice, this list of conditions and the following
10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       disclaimer in the documentation and/or other materials provided
11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       with the distribution.
12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       contributors may be used to endorse or promote products derived
14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       from this software without specific prior written permission.
15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */
29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_NDDEBUG 0
30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_TAG "LocSvc_DualCtx"
31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <cutils/sched_policy.h>
33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <unistd.h>
34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <LocDualContext.h>
35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <msg_q.h>
36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <log_util.h>
37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <loc_log.h>
38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russonamespace loc_core {
40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// nothing exclude for foreground
42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst LOC_API_ADAPTER_EVENT_MASK_T
43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoLocDualContext::mFgExclMask = 0;
44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// excluded events for background clients
45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst LOC_API_ADAPTER_EVENT_MASK_T
46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoLocDualContext::mBgExclMask =
47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    (LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT |
51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_IOCTL_REPORT |
52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_STATUS_REPORT |
53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT |
54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT);
55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst MsgTask* LocDualContext::mMsgTask = NULL;
57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::mFgContext = NULL;
58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::mBgContext = NULL;
59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::mInjectContext = NULL;
60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// the name must be shorter than 15 chars
61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst char* LocDualContext::mLocationHalName = "Loc_hal_worker";
62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst char* LocDualContext::mLBSLibName = "liblbs_core.so";
63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst MsgTask* LocDualContext::getMsgTask(MsgTask::tCreate tCreator,
65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                          const char* name)
66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == mMsgTask) {
68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mMsgTask = new MsgTask(tCreator, name);
69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return mMsgTask;
71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst MsgTask* LocDualContext::getMsgTask(MsgTask::tAssociate tAssociate,
74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                          const char* name)
75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == mMsgTask) {
77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mMsgTask = new MsgTask(tAssociate, name);
78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    } else if (tAssociate) {
79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mMsgTask->associate(tAssociate);
80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return mMsgTask;
82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::getLocFgContext(MsgTask::tCreate tCreator,
85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                             const char* name)
86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == mFgContext) {
88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const MsgTask* msgTask = getMsgTask(tCreator, name);
89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mFgContext = new LocDualContext(msgTask,
90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        mFgExclMask);
91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(NULL == mInjectContext) {
93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mInjectContext = mFgContext;
94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        injectFeatureConfig(mInjectContext);
95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return mFgContext;
97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::getLocFgContext(MsgTask::tAssociate tAssociate,
100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        const char* name)
101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == mFgContext) {
103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const MsgTask* msgTask = getMsgTask(tAssociate, name);
104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mFgContext = new LocDualContext(msgTask,
105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        mFgExclMask);
106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(NULL == mInjectContext) {
108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("%s:%d]: mInjectContext is FgContext", __func__, __LINE__);
109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mInjectContext = mFgContext;
110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        injectFeatureConfig(mInjectContext);
111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return mFgContext;
113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::getLocBgContext(MsgTask::tCreate tCreator,
117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                             const char* name)
118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == mBgContext) {
120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const MsgTask* msgTask = getMsgTask(tCreator, name);
121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mBgContext = new LocDualContext(msgTask,
122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        mBgExclMask);
123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(NULL == mInjectContext) {
125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__);
126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mInjectContext = mBgContext;
127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        injectFeatureConfig(mInjectContext);
128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return mBgContext;
130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoContextBase* LocDualContext::getLocBgContext(MsgTask::tAssociate tAssociate,
133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                             const char* name)
134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == mBgContext) {
136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const MsgTask* msgTask = getMsgTask(tAssociate, name);
137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mBgContext = new LocDualContext(msgTask,
138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        mBgExclMask);
139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(NULL == mInjectContext) {
141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__);
142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mInjectContext = mBgContext;
143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        injectFeatureConfig(mInjectContext);
144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return mBgContext;
146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russovoid LocDualContext :: injectFeatureConfig(ContextBase *curContext)
149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGD("%s:%d]: Enter", __func__, __LINE__);
151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(curContext == mInjectContext) {
152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("%s:%d]: Calling LBSProxy (%p) to inject feature config",
153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                 __func__, __LINE__, ((LocDualContext *)mInjectContext)->mLBSProxy);
154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ((LocDualContext *)mInjectContext)->mLBSProxy->injectFeatureConfig(curContext);
155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGD("%s:%d]: Exit", __func__, __LINE__);
157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoLocDualContext::LocDualContext(const MsgTask* msgTask,
160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                               LOC_API_ADAPTER_EVENT_MASK_T exMask) :
161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ContextBase(msgTask, exMask, mLBSLibName)
162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
166