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);
     }