msmcobalt: Update to LA.UM.5.7_RB1.07.00.00.251.006
msmcobalt: from hardware/qcom/gps
539c17f Promotion of location.lnx.2.0-00040.
da6012a Merge "Reinitialize dataservice client post SSR"
1de8a18 Reinitialize dataservice client post SSR
90a730d Mark SV used_in_fix based on the most recent position report
Bug: 33405777
Change-Id: Ib4c45c0294ced926c4780841ff27ea4c64ed0176
Signed-off-by: Thierry Strudel <tstrudel@google.com>
diff --git a/msmcobalt/core/LocApiBase.cpp b/msmcobalt/core/LocApiBase.cpp
index 3af79b2..35041f6 100644
--- a/msmcobalt/core/LocApiBase.cpp
+++ b/msmcobalt/core/LocApiBase.cpp
@@ -237,13 +237,18 @@
LOC_LOGV("flags: %d\n source: %d\n latitude: %f\n longitude: %f\n "
"altitude: %f\n speed: %f\n bearing: %f\n accuracy: %f\n "
"timestamp: %lld\n rawDataSize: %d\n rawData: %p\n "
- "Session status: %d\n Technology mask: %u",
+ "Session status: %d\n Technology mask: %u\n "
+ "SV used in fix (gps/glo/bds/gal) : (%x/%x/%x/%x)",
location.gpsLocation.flags, location.position_source,
location.gpsLocation.latitude, location.gpsLocation.longitude,
location.gpsLocation.altitude, location.gpsLocation.speed,
location.gpsLocation.bearing, location.gpsLocation.accuracy,
location.gpsLocation.timestamp, location.rawDataSize,
- location.rawData, status, loc_technology_mask);
+ location.rawData, status, loc_technology_mask,
+ locationExtended.gnss_sv_used_ids.gps_sv_used_ids_mask,
+ locationExtended.gnss_sv_used_ids.glo_sv_used_ids_mask,
+ locationExtended.gnss_sv_used_ids.bds_sv_used_ids_mask,
+ locationExtended.gnss_sv_used_ids.gal_sv_used_ids_mask);
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(
mLocAdapters[i]->reportPosition(location,
@@ -549,7 +554,7 @@
}
int LocApiBase::
- initDataServiceClient()
+ initDataServiceClient(bool isDueToSsr)
DEFAULT_IMPL(-1)
int LocApiBase::
@@ -564,6 +569,10 @@
closeDataCall()
DEFAULT_IMPL()
+void LocApiBase::
+ releaseDataServiceClient()
+DEFAULT_IMPL()
+
int LocApiBase::
setGpsLock(LOC_GPS_LOCK_MASK lock)
DEFAULT_IMPL(-1)
diff --git a/msmcobalt/core/LocApiBase.h b/msmcobalt/core/LocApiBase.h
index 4655332..2d0cc8c 100644
--- a/msmcobalt/core/LocApiBase.h
+++ b/msmcobalt/core/LocApiBase.h
@@ -215,10 +215,11 @@
getBestAvailableZppFix(GpsLocation & zppLoc);
virtual enum loc_api_adapter_err
getBestAvailableZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask);
- virtual int initDataServiceClient();
+ virtual int initDataServiceClient(bool isDueToSsr);
virtual int openAndStartDataCall();
virtual void stopDataCall();
virtual void closeDataCall();
+ virtual void releaseDataServiceClient();
virtual void installAGpsCert(const DerEncodedCertificate* pData,
size_t length,
uint32_t slotBitMask);
diff --git a/msmcobalt/core/gps_extended_c.h b/msmcobalt/core/gps_extended_c.h
index 8759905..7da69a9 100644
--- a/msmcobalt/core/gps_extended_c.h
+++ b/msmcobalt/core/gps_extended_c.h
@@ -262,6 +262,18 @@
#define GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MINOR 0x0400
/** GpsLocationExtended has valid Elliptical Horizontal Uncertainty Azimuth */
#define GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_AZIMUTH 0x0800
+/** GpsLocationExtended has valid gnss sv used in position data */
+#define GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA 0x1000
+
+/** GPS PRN Range */
+#define GPS_SV_PRN_MIN 1
+#define GPS_SV_PRN_MAX 32
+#define GLO_SV_PRN_MIN 65
+#define GLO_SV_PRN_MAX 96
+#define BDS_SV_PRN_MIN 201
+#define BDS_SV_PRN_MAX 235
+#define GAL_SV_PRN_MIN 301
+#define GAL_SV_PRN_MAX 336
typedef enum {
LOC_RELIABILITY_NOT_SET = 0,
@@ -278,6 +290,13 @@
/* timestamp uncertainty in milli seconds */
}Gnss_ApTimeStampStructType;
+typedef struct {
+ uint64_t gps_sv_used_ids_mask;
+ uint64_t glo_sv_used_ids_mask;
+ uint64_t gal_sv_used_ids_mask;
+ uint64_t bds_sv_used_ids_mask;
+} GnssSvUsedInPosition;
+
/** Represents gps location extended. */
typedef struct {
/** set to sizeof(GpsLocationExtended) */
@@ -312,6 +331,8 @@
float horUncEllipseOrientAzimuth;
Gnss_ApTimeStampStructType timeStamp;
+ /** Gnss sv used in position data */
+ GnssSvUsedInPosition gnss_sv_used_ids;
} GpsLocationExtended;
enum loc_sess_status {
diff --git a/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.cpp b/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.cpp
index 73f5ed6..9db513c 100644
--- a/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.cpp
+++ b/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.cpp
@@ -81,6 +81,7 @@
{
memset(&mFixCriteria, 0, sizeof(mFixCriteria));
mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
+ clearGnssSvUsedListData();
LOC_LOGD("LocEngAdapter created");
}
diff --git a/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.h b/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.h
index 4afea49..7afdd00 100644
--- a/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.h
+++ b/msmcobalt/loc_api/libloc_api_50001/LocEngAdapter.h
@@ -80,7 +80,9 @@
unsigned int mPowerVote;
static const unsigned int POWER_VOTE_RIGHT = 0x20;
static const unsigned int POWER_VOTE_VALUE = 0x10;
-
+ /** Gnss sv used in position data */
+ GnssSvUsedInPosition mGnssSvIdUsedInPosition;
+ bool mGnssSvIdUsedInPosAvail;
public:
bool mSupportsAgpsRequests;
bool mSupportsPositionInjection;
@@ -111,6 +113,25 @@
}
inline const MsgTask* getMsgTask() { return mMsgTask; }
+ inline void clearGnssSvUsedListData() {
+ mGnssSvIdUsedInPosAvail = false;
+ memset(&mGnssSvIdUsedInPosition, 0, sizeof (GnssSvUsedInPosition));
+ }
+
+ inline void setGnssSvUsedListData(GnssSvUsedInPosition gnssSvUsedIds) {
+ mGnssSvIdUsedInPosAvail = true;
+ memcpy(&mGnssSvIdUsedInPosition, &gnssSvUsedIds,
+ sizeof(GnssSvUsedInPosition));
+ }
+
+ inline GnssSvUsedInPosition getGnssSvUsedListData() {
+ return mGnssSvIdUsedInPosition;
+ }
+
+ inline bool isGnssSvIdUsedInPosAvail() {
+ return mGnssSvIdUsedInPosAvail;
+ }
+
inline enum loc_api_adapter_err
startFix()
{
@@ -240,9 +261,9 @@
{
return mLocApi->setLPPeProtocol(lppeCP, lppeUP);
}
- inline virtual int initDataServiceClient()
+ inline virtual int initDataServiceClient(bool isDueToSsr)
{
- return mLocApi->initDataServiceClient();
+ return mLocApi->initDataServiceClient(isDueToSsr);
}
inline virtual int openAndStartDataCall()
{
@@ -256,6 +277,10 @@
{
mLocApi->closeDataCall();
}
+ inline virtual void releaseDataServiceClient()
+ {
+ mLocApi->releaseDataServiceClient();
+ }
inline enum loc_api_adapter_err
getZpp(GpsLocation &zppLoc, LocPosTechMask &tech_mask)
{
diff --git a/msmcobalt/loc_api/libloc_api_50001/loc_eng.cpp b/msmcobalt/loc_api/libloc_api_50001/loc_eng.cpp
index e2aa7e2..38159dd 100644
--- a/msmcobalt/loc_api/libloc_api_50001/loc_eng.cpp
+++ b/msmcobalt/loc_api/libloc_api_50001/loc_eng.cpp
@@ -186,6 +186,7 @@
// 2nd half of init(), singled out for
// modem restart to use.
static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data);
+static void loc_eng_dsclient_release(loc_eng_data_s_type &loc_eng_data);
static void loc_eng_agps_reinit(loc_eng_data_s_type &loc_eng_data);
static int loc_eng_set_server(loc_eng_data_s_type &loc_eng_data,
@@ -290,6 +291,7 @@
inline void LocEngStopFix::proc() const
{
loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner();
+ mAdapter->clearGnssSvUsedListData();
loc_eng_stop_handler(*locEng);
}
inline void LocEngStopFix::locallog() const
@@ -806,6 +808,10 @@
(gps_conf.ACCURACY_THRES != 0) &&
(mLocation.gpsLocation.accuracy >
gps_conf.ACCURACY_THRES)))) {
+ if (mLocationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA)
+ {
+ adapter->setGnssSvUsedListData(mLocationExtended.gnss_sv_used_ids);
+ }
locEng->location_cb((UlpLocation*)&(mLocation),
(void*)mLocationExt);
reported = true;
@@ -880,14 +886,61 @@
if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION)
{
+ GnssSvStatus gnssSvStatus;
+ memcpy(&gnssSvStatus,&mSvStatus,sizeof(GnssSvStatus));
+ if (adapter->isGnssSvIdUsedInPosAvail())
+ {
+ GnssSvUsedInPosition gnssSvIdUsedInPosition =
+ adapter->getGnssSvUsedListData();
+ int numSv = gnssSvStatus.num_svs;
+ int16_t gnssSvId = 0;
+ int prnMin = 0;
+ uint64_t svUsedIdMask = 0;
+ for (int i=0; i < numSv; i++)
+ {
+ gnssSvId = gnssSvStatus.gnss_sv_list[i].svid;
+ if (gnssSvId <= GPS_SV_PRN_MAX)
+ {
+ svUsedIdMask = gnssSvIdUsedInPosition.gps_sv_used_ids_mask;
+ prnMin = GPS_SV_PRN_MIN;
+ }
+ else if ((gnssSvId >= GLO_SV_PRN_MIN) && (gnssSvId <= GLO_SV_PRN_MAX))
+ {
+ svUsedIdMask = gnssSvIdUsedInPosition.glo_sv_used_ids_mask;
+ prnMin = GLO_SV_PRN_MIN;
+ }
+ else if ((gnssSvId >= BDS_SV_PRN_MIN) && (gnssSvId <= BDS_SV_PRN_MAX))
+ {
+ svUsedIdMask = gnssSvIdUsedInPosition.bds_sv_used_ids_mask;
+ prnMin = BDS_SV_PRN_MIN;
+ }
+ else if ((gnssSvId >= GAL_SV_PRN_MIN) && (gnssSvId <= GAL_SV_PRN_MAX))
+ {
+ svUsedIdMask = gnssSvIdUsedInPosition.gal_sv_used_ids_mask;
+ prnMin = GAL_SV_PRN_MIN;
+ }
+
+ // If SV ID was used in previous position fix, then set USED_IN_FIX
+ // flag, else clear the USED_IN_FIX flag.
+ if (svUsedIdMask & (1 << (gnssSvId - prnMin)))
+ {
+ gnssSvStatus.gnss_sv_list[i].flags |= GNSS_SV_FLAGS_USED_IN_FIX;
+ }
+ else
+ {
+ gnssSvStatus.gnss_sv_list[i].flags &= ~GNSS_SV_FLAGS_USED_IN_FIX;
+ }
+ }
+ }
+
if (locEng->gnss_sv_status_cb != NULL) {
LOC_LOGE("Calling gnss_sv_status_cb");
- locEng->gnss_sv_status_cb((GnssSvStatus*)&(mSvStatus));
+ locEng->gnss_sv_status_cb((GnssSvStatus*)&(gnssSvStatus));
}
if (locEng->generateNmea)
{
- loc_eng_nmea_generate_sv(locEng, mSvStatus, mLocationExtended);
+ loc_eng_nmea_generate_sv(locEng, gnssSvStatus, mLocationExtended);
}
}
}
@@ -2308,6 +2361,39 @@
}
EXIT_LOG(%s, VOID_RET);
}
+
+/*===========================================================================
+FUNCTION loc_eng_dsclient_release
+
+DESCRIPTION
+ Stop/Close/Release DS client when modem SSR happens.
+
+DEPENDENCIES
+ NONE
+
+RETURN VALUE
+ 0
+
+SIDE EFFECTS
+ N/A
+
+===========================================================================*/
+static void loc_eng_dsclient_release(loc_eng_data_s_type &loc_eng_data)
+{
+ ENTRY_LOG();
+ int result = 1;
+ LocEngAdapter* adapter = loc_eng_data.adapter;
+ if (NULL != adapter && gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL)
+ {
+ // stop and close the ds client
+ adapter->stopDataCall();
+ adapter->closeDataCall();
+ adapter->releaseDataServiceClient();
+ }
+ EXIT_LOG(%s, VOID_RET);
+}
+
+
/*===========================================================================
FUNCTION loc_eng_agps_init
@@ -2378,7 +2464,7 @@
}
if (NULL == locEng.ds_nif &&
gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL &&
- 0 == adapter->initDataServiceClient()) {
+ 0 == adapter->initDataServiceClient(false)) {
locEng.ds_nif = new DSStateMachine(servicerTypeExt,
(void *)dataCallCb,
locEng.adapter);
@@ -2912,6 +2998,12 @@
if (loc_eng_data.internet_nif)
loc_eng_data.internet_nif->dropAllSubscribers();
+ // reinitialize DS client in SSR mode
+ loc_eng_dsclient_release(loc_eng_data);
+ if (loc_eng_data.adapter->mSupportsAgpsRequests &&
+ gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) {
+ loc_eng_data.adapter->initDataServiceClient(true);
+ }
loc_eng_agps_reinit(loc_eng_data);
}