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