summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-06-21 00:41:22 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-06-21 00:41:22 -0700
commit023ea00a29c7e7d5fdc9fa5b315adcb911e01aa0 (patch)
treeb38adf4890ba8b48a6ff40f9b17161473dddb679
parent0aa6e3aee910a84f8a410403d8b4276d141cac5b (diff)
parent5ceb69dc42710ee9644edb4607723872cd3cbff8 (diff)
downloadgps-023ea00a29c7e7d5fdc9fa5b315adcb911e01aa0.tar.gz
Merge "Enable/disable PDN for emergency SUPL at runtime"
-rw-r--r--core/ContextBase.h7
-rw-r--r--core/gps_extended_c.h4
-rw-r--r--loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/rpc_inc/LocApiRpc.h4
-rw-r--r--loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/LocApiRpc.cpp11
-rw-r--r--loc_api/libloc_api_50001/loc.cpp16
-rw-r--r--loc_api/libloc_api_50001/loc_eng.cpp140
-rw-r--r--loc_api/libloc_api_50001/loc_eng.h2
-rw-r--r--loc_api/libloc_api_50001/loc_eng_ni.cpp2
8 files changed, 122 insertions, 64 deletions
diff --git a/core/ContextBase.h b/core/ContextBase.h
index 4f8723e..be6b7bb 100644
--- a/core/ContextBase.h
+++ b/core/ContextBase.h
@@ -47,12 +47,13 @@ typedef struct loc_gps_cfg_s
uint32_t ACCURACY_THRES;
uint32_t SUPL_VER;
uint32_t SUPL_MODE;
+ uint32_t SUPL_ES;
uint32_t CAPABILITIES;
uint32_t LPP_PROFILE;
uint32_t XTRA_VERSION_CHECK;
- char XTRA_SERVER_1[MAX_XTRA_SERVER_URL_LENGTH];
- char XTRA_SERVER_2[MAX_XTRA_SERVER_URL_LENGTH];
- char XTRA_SERVER_3[MAX_XTRA_SERVER_URL_LENGTH];
+ char XTRA_SERVER_1[MAX_XTRA_SERVER_URL_LENGTH];
+ char XTRA_SERVER_2[MAX_XTRA_SERVER_URL_LENGTH];
+ char XTRA_SERVER_3[MAX_XTRA_SERVER_URL_LENGTH];
uint32_t USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL;
uint32_t NMEA_PROVIDER;
uint32_t GPS_LOCK;
diff --git a/core/gps_extended_c.h b/core/gps_extended_c.h
index 9b677b8..2780ebc 100644
--- a/core/gps_extended_c.h
+++ b/core/gps_extended_c.h
@@ -170,14 +170,14 @@ typedef struct {
} AGpsExtCallbacks;
+typedef void (*loc_ni_notify_callback)(GpsNiNotification *notification, bool esEnalbed);
/** GPS NI callback structure. */
typedef struct
{
/**
* Sends the notification request from HAL to GPSLocationProvider.
*/
- gps_ni_notify_callback notify_cb;
- gps_create_thread create_thread_cb;
+ loc_ni_notify_callback notify_cb;
} GpsNiExtCallbacks;
typedef enum loc_server_type {
diff --git a/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/rpc_inc/LocApiRpc.h b/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/rpc_inc/LocApiRpc.h
index 01d67f4..13557c9 100644
--- a/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/rpc_inc/LocApiRpc.h
+++ b/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/rpc_inc/LocApiRpc.h
@@ -67,9 +67,11 @@ protected:
open(LOC_API_ADAPTER_EVENT_MASK_T mask);
virtual enum loc_api_adapter_err
close();
+ LocApiRpc(const MsgTask* msgTask,
+ LOC_API_ADAPTER_EVENT_MASK_T exMask);
public:
- LocApiRpc(const MsgTask* msgTask,
+ static LocApiRpc* createLocApiRpc(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask);
~LocApiRpc();
diff --git a/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/LocApiRpc.cpp b/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/LocApiRpc.cpp
index f2be072..f4b0ebf 100644
--- a/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/LocApiRpc.cpp
+++ b/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/LocApiRpc.cpp
@@ -131,6 +131,17 @@ const rpc_loc_event_mask_type LocApiRpc::locBits[] =
RPC_LOC_EVENT_WPS_NEEDED_REQUEST
};
+LocApiRpc*
+LocApiRpc::createLocApiRpc(const MsgTask* msgTask,
+ LOC_API_ADAPTER_EVENT_MASK_T exMask,
+ ContextBase* context)
+{
+ if (NULL == msgTask) {
+ return NULL;
+ }
+ return new LocApiRpc(msgTask, exMask, context);
+}
+
// constructor
LocApiRpc::LocApiRpc(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask,
diff --git a/loc_api/libloc_api_50001/loc.cpp b/loc_api/libloc_api_50001/loc.cpp
index 4453f14..ca9760d 100644
--- a/loc_api/libloc_api_50001/loc.cpp
+++ b/loc_api/libloc_api_50001/loc.cpp
@@ -52,9 +52,15 @@ using namespace loc_core;
//Globals defns
static gps_location_callback gps_loc_cb = NULL;
static gps_sv_status_callback gps_sv_cb = NULL;
+static gps_ni_notify_callback gps_ni_cb = NULL;
static void local_loc_cb(UlpLocation* location, void* locExt);
static void local_sv_cb(GpsSvStatus* sv_status, void* svExt);
+static void local_ni_cb(GpsNiNotification *notification, bool esEnalbed);
+
+GpsNiExtCallbacks sGpsNiExtCallbacks = {
+ local_ni_cb
+};
static const GpsGeofencingInterface* get_geofence_interface(void);
@@ -967,7 +973,8 @@ SIDE EFFECTS
void loc_ni_init(GpsNiCallbacks *callbacks)
{
ENTRY_LOG();
- loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
+ gps_ni_cb = callbacks->notify_cb;
+ loc_eng_ni_init(loc_afw_data, &sGpsNiExtCallbacks);
EXIT_LOG(%s, VOID_RET);
}
@@ -1082,3 +1089,10 @@ static void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
EXIT_LOG(%s, VOID_RET);
}
+static void local_ni_cb(GpsNiNotification *notification, bool esEnalbed)
+{
+ if (NULL != gps_ni_cb) {
+ gps_ni_cb(notification);
+ }
+}
+
diff --git a/loc_api/libloc_api_50001/loc_eng.cpp b/loc_api/libloc_api_50001/loc_eng.cpp
index f150bc3..2bae27a 100644
--- a/loc_api/libloc_api_50001/loc_eng.cpp
+++ b/loc_api/libloc_api_50001/loc_eng.cpp
@@ -88,6 +88,7 @@ static const loc_param_s_type gps_conf_table[] =
{"A_GLONASS_POS_PROTOCOL_SELECT", &gps_conf.A_GLONASS_POS_PROTOCOL_SELECT, NULL, 'n'},
{"AGPS_CERT_WRITABLE_MASK", &gps_conf.AGPS_CERT_WRITABLE_MASK, NULL, 'n'},
{"SUPL_MODE", &gps_conf.SUPL_MODE, NULL, 'n'},
+ {"SUPL_ES", &gps_conf.SUPL_ES, NULL, 'n'},
{"INTERMEDIATE_POS", &gps_conf.INTERMEDIATE_POS, NULL, 'n'},
{"ACCURACY_THRES", &gps_conf.ACCURACY_THRES, NULL, 'n'},
{"NMEA_PROVIDER", &gps_conf.NMEA_PROVIDER, NULL, 'n'},
@@ -129,6 +130,7 @@ static void loc_default_parameters(void)
gps_conf.GPS_LOCK = 0;
gps_conf.SUPL_VER = 0x10000;
gps_conf.SUPL_MODE = 0x3;
+ gps_conf.SUPL_ES = 0;
gps_conf.CAPABILITIES = 0x7;
/* LTE Positioning Profile configuration is disable by default*/
gps_conf.LPP_PROFILE = 0;
@@ -194,6 +196,7 @@ static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data);
static void deleteAidingData(loc_eng_data_s_type &logEng);
static AgpsStateMachine*
getAgpsStateMachine(loc_eng_data_s_type& logEng, AGpsExtType agpsType);
+static void createAgnssNifs(loc_eng_data_s_type& locEng);
static int dataCallCb(void *cb_data);
static void update_aiding_data_for_deletion(loc_eng_data_s_type& loc_eng_data) {
if (loc_eng_data.engine_status != GPS_STATUS_ENGINE_ON &&
@@ -1100,7 +1103,7 @@ LocEngRequestSuplEs::LocEngRequestSuplEs(void* locEng, int id) :
}
void LocEngRequestSuplEs::proc() const {
loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
- if (locEng->ds_nif) {
+ if (locEng->ds_nif && gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) {
AgpsStateMachine* sm = locEng->ds_nif;
DSSubscriber s(sm, mID);
sm->subscribeRsrc((Subscriber*)&s);
@@ -1442,16 +1445,18 @@ struct LocEngInit : public LocMsg {
// case LOC_ENG_MSG_ATL_OPEN_SUCCESS:
struct LocEngAtlOpenSuccess : public LocMsg {
- AgpsStateMachine* mStateMachine;
+ loc_eng_data_s_type* mLocEng;
+ const AGpsExtType mAgpsType;
const int mLen;
char* mAPN;
const AGpsBearerType mBearerType;
- inline LocEngAtlOpenSuccess(AgpsStateMachine* statemachine,
+ inline LocEngAtlOpenSuccess(loc_eng_data_s_type* locEng,
+ const AGpsExtType agpsType,
const char* name,
int len,
AGpsBearerType btype) :
LocMsg(),
- mStateMachine(statemachine), mLen(len),
+ mLocEng(locEng), mAgpsType(agpsType), mLen(len),
mAPN(new char[len+1]), mBearerType(btype)
{
memcpy((void*)mAPN, (void*)name, len);
@@ -1463,14 +1468,15 @@ struct LocEngAtlOpenSuccess : public LocMsg {
delete[] mAPN;
}
inline virtual void proc() const {
- mStateMachine->setBearer(mBearerType);
- mStateMachine->setAPN(mAPN, mLen);
- mStateMachine->onRsrcEvent(RSRC_GRANTED);
+ AgpsStateMachine* sm = getAgpsStateMachine(*mLocEng, mAgpsType);
+ sm->setBearer(mBearerType);
+ sm->setAPN(mAPN, mLen);
+ sm->onRsrcEvent(RSRC_GRANTED);
}
inline void locallog() const {
LOC_LOGV("LocEngAtlOpenSuccess agps type: %s\n apn: %s\n"
" bearer type: %s",
- loc_get_agps_type_name(mStateMachine->getType()),
+ loc_get_agps_type_name(mAgpsType),
mAPN,
loc_get_agps_bear_name(mBearerType));
}
@@ -1481,13 +1487,16 @@ struct LocEngAtlOpenSuccess : public LocMsg {
// case LOC_ENG_MSG_ATL_CLOSED:
struct LocEngAtlClosed : public LocMsg {
- AgpsStateMachine* mStateMachine;
- inline LocEngAtlClosed(AgpsStateMachine* statemachine) :
- LocMsg(), mStateMachine(statemachine) {
+ loc_eng_data_s_type* mLocEng;
+ const AGpsExtType mAgpsType;
+ inline LocEngAtlClosed(loc_eng_data_s_type* locEng,
+ const AGpsExtType agpsType) :
+ LocMsg(), mLocEng(locEng), mAgpsType(agpsType) {
locallog();
}
inline virtual void proc() const {
- mStateMachine->onRsrcEvent(RSRC_RELEASED);
+ AgpsStateMachine* sm = getAgpsStateMachine(*mLocEng, mAgpsType);
+ sm->onRsrcEvent(RSRC_RELEASED);
}
inline void locallog() const {
LOC_LOGV("LocEngAtlClosed");
@@ -1499,13 +1508,16 @@ struct LocEngAtlClosed : public LocMsg {
// case LOC_ENG_MSG_ATL_OPEN_FAILED:
struct LocEngAtlOpenFailed : public LocMsg {
- AgpsStateMachine* mStateMachine;
- inline LocEngAtlOpenFailed(AgpsStateMachine* statemachine) :
- LocMsg(), mStateMachine(statemachine) {
+ loc_eng_data_s_type* mLocEng;
+ const AGpsExtType mAgpsType;
+ inline LocEngAtlOpenFailed(loc_eng_data_s_type* locEng,
+ const AGpsExtType agpsType) :
+ LocMsg(), mLocEng(locEng), mAgpsType(agpsType) {
locallog();
}
inline virtual void proc() const {
- mStateMachine->onRsrcEvent(RSRC_DENIED);
+ AgpsStateMachine* sm = getAgpsStateMachine(*mLocEng, mAgpsType);
+ sm->onRsrcEvent(RSRC_DENIED);
}
inline void locallog() const {
LOC_LOGV("LocEngAtlOpenFailed");
@@ -1547,22 +1559,17 @@ inline void LocEngUp::log() const {
locallog();
}
-struct LocEngDataClientInit : public LocMsg {
+struct LocEngAgnssNifInit : public LocMsg {
loc_eng_data_s_type* mLocEng;
- inline LocEngDataClientInit(loc_eng_data_s_type* locEng) :
+ inline LocEngAgnssNifInit(loc_eng_data_s_type* locEng) :
LocMsg(), mLocEng(locEng) {
locallog();
}
virtual void proc() const {
- loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng;
- if(!locEng->adapter->initDataServiceClient()) {
- locEng->ds_nif = new DSStateMachine(servicerTypeExt,
- (void *)dataCallCb,
- locEng->adapter);
- }
+ createAgnssNifs(*mLocEng);
}
void locallog() const {
- LOC_LOGV("LocEngDataClientInit\n");
+ LOC_LOGV("LocEngAgnssNifInit\n");
}
virtual void log() const {
locallog();
@@ -2336,31 +2343,14 @@ void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data, AGpsExtCallbacks* call
EXIT_LOG(%s, VOID_RET);
return;
}
+ bool agpsCapable = ((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) ||
+ (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB));
LocEngAdapter* adapter = loc_eng_data.adapter;
loc_eng_data.agps_status_cb = callbacks->status_cb;
- loc_eng_data.internet_nif = new AgpsStateMachine(servicerTypeAgps,
- (void *)loc_eng_data.agps_status_cb,
- AGPS_TYPE_WWAN_ANY,
- false);
- loc_eng_data.wifi_nif = new AgpsStateMachine(servicerTypeAgps,
- (void *)loc_eng_data.agps_status_cb,
- AGPS_TYPE_WIFI,
- true);
-
- if ((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) ||
- (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB)) {
- loc_eng_data.agnss_nif = new AgpsStateMachine(servicerTypeAgps,
- (void *)loc_eng_data.agps_status_cb,
- AGPS_TYPE_SUPL,
- false);
-
+ if (agpsCapable && NULL != adapter) {
if (adapter->mSupportsAgpsRequests) {
- if(gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) {
- loc_eng_data.adapter->sendMsg(new LocEngDataClientInit(&loc_eng_data));
- }
- loc_eng_dmn_conn_loc_api_server_launch(callbacks->create_thread_cb,
- NULL, NULL, &loc_eng_data);
+ adapter->sendMsg(new LocEngAgnssNifInit(&loc_eng_data));
}
loc_eng_agps_reinit(loc_eng_data);
}
@@ -2376,6 +2366,35 @@ static void deleteAidingData(loc_eng_data_s_type &logEng) {
}
}
+// must be called under msg handler context
+static void createAgnssNifs(loc_eng_data_s_type& locEng) {
+ bool agpsCapable = ((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) ||
+ (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB));
+ LocEngAdapter* adapter = locEng.adapter;
+ if (agpsCapable && NULL != adapter && adapter->mSupportsAgpsRequests) {
+ if (NULL == locEng.internet_nif) {
+ locEng.internet_nif= new AgpsStateMachine(servicerTypeAgps,
+ (void *)locEng.agps_status_cb,
+ AGPS_TYPE_WWAN_ANY,
+ false);
+ }
+ if (NULL == locEng.agnss_nif) {
+ locEng.agnss_nif = new AgpsStateMachine(servicerTypeAgps,
+ (void *)locEng.agps_status_cb,
+ AGPS_TYPE_SUPL,
+ false);
+ }
+ if (NULL == locEng.ds_nif &&
+ gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL &&
+ 0 == adapter->initDataServiceClient()) {
+ locEng.ds_nif = new DSStateMachine(servicerTypeExt,
+ (void *)dataCallCb,
+ locEng.adapter);
+ }
+ }
+}
+
+// must be called under msg handler context
static AgpsStateMachine*
getAgpsStateMachine(loc_eng_data_s_type &locEng, AGpsExtType agpsType) {
AgpsStateMachine* stateMachine;
@@ -2390,9 +2409,14 @@ getAgpsStateMachine(loc_eng_data_s_type &locEng, AGpsExtType agpsType) {
break;
}
case AGPS_TYPE_SUPL_ES: {
- locEng.ds_nif ?
- stateMachine = locEng.ds_nif:
+ if (gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) {
+ if (NULL == locEng.ds_nif) {
+ createAgnssNifs(locEng);
+ }
+ stateMachine = locEng.ds_nif;
+ } else {
stateMachine = locEng.agnss_nif;
+ }
break;
}
default:
@@ -2434,10 +2458,9 @@ int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType,
LOC_LOGD("loc_eng_agps_open APN name = [%s]", apn);
int apn_len = smaller_of(strlen (apn), MAX_APN_LEN);
- AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType);
-
loc_eng_data.adapter->sendMsg(
- new LocEngAtlOpenSuccess(sm, apn, apn_len, bearerType));
+ new LocEngAtlOpenSuccess(&loc_eng_data, agpsType,
+ apn, apn_len, bearerType));
EXIT_LOG(%d, 0);
return 0;
@@ -2466,8 +2489,8 @@ int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType)
INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb,
return -1);
- AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType);
- loc_eng_data.adapter->sendMsg(new LocEngAtlClosed(sm));
+ loc_eng_data.adapter->sendMsg(new LocEngAtlClosed(&loc_eng_data,
+ agpsType));
EXIT_LOG(%d, 0);
return 0;
@@ -2496,8 +2519,8 @@ int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agps
INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb,
return -1);
- AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType);
- loc_eng_data.adapter->sendMsg(new LocEngAtlOpenFailed(sm));
+ loc_eng_data.adapter->sendMsg(new LocEngAtlOpenFailed(&loc_eng_data,
+ agpsType));
EXIT_LOG(%d, 0);
return 0;
@@ -2773,13 +2796,20 @@ void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data,
if (gps_conf_tmp.SUPL_MODE != gps_conf.SUPL_MODE) {
adapter->sendMsg(new LocEngSuplMode(adapter->getUlpProxy()));
}
+ // we always update lock mask, this is because if this is dsds device, we would not
+ // know if modem has switched dds, if so, lock mask may also need to be updated.
+ // if we have power vote, HAL is on, lock mask 0; else gps_conf.GPS_LOCK.
+ adapter->setGpsLockMsg(adapter->getPowerVote() ? 0 : gps_conf.GPS_LOCK);
}
gps_conf_tmp.SUPL_VER = gps_conf.SUPL_VER;
gps_conf_tmp.LPP_PROFILE = gps_conf.LPP_PROFILE;
gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT = gps_conf.A_GLONASS_POS_PROTOCOL_SELECT;
gps_conf_tmp.SUPL_MODE = gps_conf.SUPL_MODE;
+ gps_conf_tmp.SUPL_ES = gps_conf.SUPL_ES;
gps_conf_tmp.GPS_LOCK = gps_conf.GPS_LOCK;
+ gps_conf_tmp.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL =
+ gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL;
gps_conf = gps_conf_tmp;
}
diff --git a/loc_api/libloc_api_50001/loc_eng.h b/loc_api/libloc_api_50001/loc_eng.h
index b1cfe72..1fe1375 100644
--- a/loc_api/libloc_api_50001/loc_eng.h
+++ b/loc_api/libloc_api_50001/loc_eng.h
@@ -89,7 +89,7 @@ typedef struct loc_eng_data_s
loc_sv_status_cb_ext sv_status_cb;
agps_status_extended agps_status_cb;
gps_nmea_callback nmea_cb;
- gps_ni_notify_callback ni_notify_cb;
+ loc_ni_notify_callback ni_notify_cb;
gps_set_capabilities set_capabilities_cb;
gps_acquire_wakelock acquire_wakelock_cb;
gps_release_wakelock release_wakelock_cb;
diff --git a/loc_api/libloc_api_50001/loc_eng_ni.cpp b/loc_api/libloc_api_50001/loc_eng_ni.cpp
index a29784f..9b454c6 100644
--- a/loc_api/libloc_api_50001/loc_eng_ni.cpp
+++ b/loc_api/libloc_api_50001/loc_eng_ni.cpp
@@ -188,7 +188,7 @@ void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
}
CALLBACK_LOG_CALLFLOW("ni_notify_cb - id", %d, notif->notification_id);
- loc_eng_data.ni_notify_cb((GpsNiNotification*)notif);
+ loc_eng_data.ni_notify_cb((GpsNiNotification*)notif, gps_conf.SUPL_ES != 0);
}
EXIT_LOG(%s, VOID_RET);
}