summaryrefslogtreecommitdiff
path: root/gnss
diff options
context:
space:
mode:
authorMike Cailean <mcailean@codeaurora.org>2019-07-03 17:55:17 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-07-15 10:41:58 -0700
commit1608ffb38b3d156ae5db6483258fca3008ae5c0b (patch)
tree5f5938c8513c20d28eca05f0223f8fd3afa4cdd7 /gnss
parent8cb4f9cf02b7954d4f40cc5e2162ef680ef72255 (diff)
downloadgps-1608ffb38b3d156ae5db6483258fca3008ae5c0b.tar.gz
SUPL-2.0-con-034-1/2 test case fails
SUPL-2.0-con-034-1/2 Fail because Emergency-NI did not check inprogress session Change-Id: I377955c455830bf3bb7cb7fe05d45c4536dabfbc CRs-fixed: 2483780
Diffstat (limited to 'gnss')
-rw-r--r--gnss/GnssAdapter.cpp54
-rw-r--r--gnss/GnssAdapter.h6
2 files changed, 45 insertions, 15 deletions
diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp
index 9413def..2481dd5 100644
--- a/gnss/GnssAdapter.cpp
+++ b/gnss/GnssAdapter.cpp
@@ -3508,7 +3508,8 @@ GnssAdapter::reportData(GnssDataNotification& dataNotify)
}
bool
-GnssAdapter::requestNiNotifyEvent(const GnssNiNotification &notify, const void* data)
+GnssAdapter::requestNiNotifyEvent(const GnssNiNotification &notify, const void* data,
+ const LocInEmergency emergencyState)
{
LOC_LOGI("%s]: notif_type: %d, timeout: %d, default_resp: %d"
"requestor_id: %s (encoding: %d) text: %s text (encoding: %d) extras: %s",
@@ -3521,37 +3522,49 @@ GnssAdapter::requestNiNotifyEvent(const GnssNiNotification &notify, const void*
LocApiBase& mApi;
const GnssNiNotification mNotify;
const void* mData;
+ const LocInEmergency mEmergencyState;
inline MsgReportNiNotify(GnssAdapter& adapter,
LocApiBase& api,
const GnssNiNotification& notify,
- const void* data) :
+ const void* data,
+ const LocInEmergency emergencyState) :
LocMsg(),
mAdapter(adapter),
mApi(api),
mNotify(notify),
- mData(data) {}
+ mData(data),
+ mEmergencyState(emergencyState) {}
inline virtual void proc() const {
+ bool bIsInEmergency = false;
+ bool bInformNiAccept = false;
+
+ bIsInEmergency = ((LOC_IN_EMERGENCY_UNKNOWN == mEmergencyState) &&
+ mAdapter.getE911State()) || // older modems
+ (LOC_IN_EMERGENCY_SET == mEmergencyState); // newer modems
+
if (GNSS_NI_TYPE_EMERGENCY_SUPL == mNotify.type) {
- if (mAdapter.getE911State() ||
- (GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO == ContextBase::mGps_conf.SUPL_ES)) {
- mApi.informNiResponse(GNSS_NI_RESPONSE_ACCEPT, mData);
+ bInformNiAccept = bIsInEmergency ||
+ (GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO == ContextBase::mGps_conf.SUPL_ES);
+
+ if (bInformNiAccept) {
+ mAdapter.requestNiNotify(mNotify, mData, bInformNiAccept);
} else {
mApi.informNiResponse(GNSS_NI_RESPONSE_DENY, mData);
}
} else if (GNSS_NI_TYPE_CONTROL_PLANE == mNotify.type) {
- if (mAdapter.getE911State() &&
- (1 == ContextBase::mGps_conf.CP_MTLR_ES)) {
+ if (bIsInEmergency && (1 == ContextBase::mGps_conf.CP_MTLR_ES)) {
mApi.informNiResponse(GNSS_NI_RESPONSE_ACCEPT, mData);
- } else {
- mAdapter.requestNiNotify(mNotify, mData);
+ }
+ else {
+ mAdapter.requestNiNotify(mNotify, mData, false);
}
} else {
- mAdapter.requestNiNotify(mNotify, mData);
+ mAdapter.requestNiNotify(mNotify, mData, false);
}
}
};
- sendMsg(new MsgReportNiNotify(*this, *mLocApi, notify, data));
+ sendMsg(new MsgReportNiNotify(*this, *mLocApi, notify, data, emergencyState));
return true;
}
@@ -3674,7 +3687,8 @@ static void* niThreadProc(void *args)
}
bool
-GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data)
+GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data,
+ const bool bInformNiAccept)
{
NiSession* pSession = NULL;
gnssNiCallback gnssNiCb = nullptr;
@@ -3686,6 +3700,20 @@ GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data)
}
}
if (nullptr == gnssNiCb) {
+ if (GNSS_NI_TYPE_EMERGENCY_SUPL == notify.type) {
+ if (bInformNiAccept) {
+ mLocApi->informNiResponse(GNSS_NI_RESPONSE_ACCEPT, data);
+ NiData& niData = getNiData();
+ // ignore any SUPL NI non-Es session if a SUPL NI ES is accepted
+ if (NULL != niData.session.rawRequest) {
+ pthread_mutex_lock(&niData.session.tLock);
+ niData.session.resp = GNSS_NI_RESPONSE_IGNORE;
+ niData.session.respRecvd = true;
+ pthread_cond_signal(&niData.session.tCond);
+ pthread_mutex_unlock(&niData.session.tLock);
+ }
+ }
+ }
EXIT_LOG(%s, "no clients with gnssNiCb.");
return false;
}
diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h
index 9a727a2..a44e68c 100644
--- a/gnss/GnssAdapter.h
+++ b/gnss/GnssAdapter.h
@@ -359,7 +359,8 @@ public:
bool fromEngineHub=false);
virtual void reportNmeaEvent(const char* nmea, size_t length);
virtual void reportDataEvent(const GnssDataNotification& dataNotify, int msInWeek);
- virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data);
+ virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data,
+ const LocInEmergency emergencyState);
virtual void reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurements,
int msInWeek);
virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial);
@@ -389,7 +390,8 @@ public:
void reportSv(GnssSvNotification& svNotify);
void reportNmea(const char* nmea, size_t length);
void reportData(GnssDataNotification& dataNotify);
- bool requestNiNotify(const GnssNiNotification& notify, const void* data);
+ bool requestNiNotify(const GnssNiNotification& notify, const void* data,
+ const bool bInformNiAccept);
void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements);
void reportGnssSvIdConfig(const GnssSvIdConfig& config);
void reportGnssSvTypeConfig(const GnssSvTypeConfig& config);