diff options
author | Kevin Tang <zhikait@codeaurora.org> | 2021-01-02 16:43:10 -0800 |
---|---|---|
committer | Kevin Tang <zhikait@codeaurora.org> | 2021-01-02 16:51:30 -0800 |
commit | 5c0b4cdce579822ba1b9cee31eca8a14e0a0124d (patch) | |
tree | 957ce8d24f1effeef0e88fde0c03133dd4eb3915 | |
parent | 555935f14fe316db3cdbda4c0ba953a539cfad78 (diff) | |
parent | 2a11c779e14422583a0a233062d9ba57a5d305bb (diff) |
Merge remote-tracking branch 'quic/location.lnx.4.0' into HEAD
Change-Id: I26bfb7e728aa24ea4372d78c3b931dc82cb90f45
CRs-Fixed: 2847145
-rw-r--r-- | core/LocAdapterBase.h | 2 | ||||
-rw-r--r-- | gnss/GnssAdapter.cpp | 11 | ||||
-rw-r--r-- | gnss/GnssAdapter.h | 3 | ||||
-rw-r--r-- | location/LocationAPI.cpp | 67 | ||||
-rw-r--r-- | location/LocationAPI.h | 27 | ||||
-rw-r--r-- | location/LocationDataTypes.h | 17 | ||||
-rw-r--r-- | utils/gps_extended_c.h | 14 | ||||
-rw-r--r-- | utils/loc_nmea.cpp | 21 |
8 files changed, 143 insertions, 19 deletions
diff --git a/core/LocAdapterBase.h b/core/LocAdapterBase.h index 002dc96..51b2306 100644 --- a/core/LocAdapterBase.h +++ b/core/LocAdapterBase.h @@ -156,7 +156,7 @@ public: return ContextBase::isFeatureSupported(featureVal); } - uint32_t generateSessionId(); + static uint32_t generateSessionId(); inline bool isAdapterMaster() { return mIsMaster; diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index d3792b9..003acbe 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -356,7 +356,8 @@ uint16_t GnssAdapter::getNumSvUsed(uint64_t svUsedIdsMask, void GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out, - const GpsLocationExtended& locationExtended) + const GpsLocationExtended& locationExtended, + enum loc_sess_status status) { out.size = sizeof(GnssLocationInfoNotification); if (GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL & locationExtended.flags) { @@ -665,6 +666,9 @@ GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out, out.flags |= GNSS_LOCATION_INFO_ALTITUDE_ASSUMED_BIT; out.altitudeAssumed = locationExtended.altitudeAssumed; } + + out.flags |= GNSS_LOCATION_INFO_SESSION_STATUS_BIT; + out.sessionStatus = status; } inline uint32_t @@ -3954,7 +3958,7 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation, if (reportToGnssClient || reportToFlpClient) { GnssLocationInfoNotification locationInfo = {}; - convertLocationInfo(locationInfo, locationExtended); + convertLocationInfo(locationInfo, locationExtended, status); convertLocation(locationInfo.location, ulpLocation, locationExtended); logLatencyInfo(); for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { @@ -4084,7 +4088,8 @@ GnssAdapter::reportEnginePositions(unsigned int count, } if (needReportEnginePositions) { - convertLocationInfo(locationInfo[i], engLocation->locationExtended); + convertLocationInfo(locationInfo[i], engLocation->locationExtended, + engLocation->sessionStatus); convertLocation(locationInfo[i].location, engLocation->location, engLocation->locationExtended); diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h index 5e617f7..18b9779 100644 --- a/gnss/GnssAdapter.h +++ b/gnss/GnssAdapter.h @@ -290,7 +290,8 @@ class GnssAdapter : public LocAdapterBase { static void convertLocation(Location& out, const UlpLocation& ulpLocation, const GpsLocationExtended& locationExtended); static void convertLocationInfo(GnssLocationInfoNotification& out, - const GpsLocationExtended& locationExtended); + const GpsLocationExtended& locationExtended, + loc_sess_status status); static uint16_t getNumSvUsed(uint64_t svUsedIdsMask, int totalSvCntInThisConstellation); diff --git a/location/LocationAPI.cpp b/location/LocationAPI.cpp index 3659b1c..3a50c46 100644 --- a/location/LocationAPI.cpp +++ b/location/LocationAPI.cpp @@ -42,6 +42,13 @@ typedef const BatchingInterface* (getBatchingInterface)(); typedef void (createOSFramework)(); typedef void (destroyOSFramework)(); +// GTP services +typedef uint32_t (setOptInStatusGetter)(bool userConsent, responseCallback* callback); +typedef void (enableProviderGetter)(); +typedef void (disableProviderGetter)(); +typedef void (getSingleNetworkLocationGetter)(trackingCallback* callback); +typedef void (stopNetworkLocationGetter)(trackingCallback* callback); + typedef struct { // bit mask of the adpaters that we need to wait for the removeClientCompleteCallback // before we invoke the registered locationApiDestroyCompleteCallback @@ -188,6 +195,7 @@ LocationAPI::createInstance (LocationCallbacks& locationCallbacks) if (nullptr == locationCallbacks.capabilitiesCb || nullptr == locationCallbacks.responseCb || nullptr == locationCallbacks.collectiveResponseCb) { + LOC_LOGe("missing mandatory callback, return null"); return NULL; } @@ -641,6 +649,52 @@ LocationAPI::gnssNiResponse(uint32_t id, GnssNiResponse response) pthread_mutex_unlock(&gDataMutex); } +void LocationAPI::enableNetworkProvider() { + void* libHandle = nullptr; + enableProviderGetter* setter = (enableProviderGetter*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "enableNetworkProvider"); + if (setter != nullptr) { + (*setter)(); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + +void LocationAPI::disableNetworkProvider() { + void* libHandle = nullptr; + disableProviderGetter* setter = (disableProviderGetter*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "disableNetworkProvider"); + if (setter != nullptr) { + (*setter)(); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + +void LocationAPI::startNetworkLocation(trackingCallback* callback) { + void* libHandle = nullptr; + getSingleNetworkLocationGetter* setter = + (getSingleNetworkLocationGetter*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "startNetworkLocation"); + if (setter != nullptr) { + (*setter)(callback); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + +void LocationAPI::stopNetworkLocation(trackingCallback* callback) { + void* libHandle = nullptr; + stopNetworkLocationGetter* setter = (stopNetworkLocationGetter*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "stopNetworkLocation"); + if (setter != nullptr) { + LOC_LOGe("called"); + (*setter)(callback); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + LocationControlAPI* LocationControlAPI::createInstance(LocationControlCallbacks& locationControlCallbacks) { @@ -907,3 +961,16 @@ uint32_t LocationControlAPI::configEngineRunState( pthread_mutex_unlock(&gDataMutex); return id; } + +uint32_t LocationControlAPI::setOptInStatus(bool userConsent) { + void* libHandle = nullptr; + uint32_t sessionId = 0; + setOptInStatusGetter* setter = (setOptInStatusGetter*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "setOptInStatus"); + if (setter != nullptr) { + sessionId = (*setter)(userConsent, &gData.controlCallbacks.responseCb); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } + return sessionId; +} diff --git a/location/LocationAPI.h b/location/LocationAPI.h index 5ae5eda..7c70506 100644 --- a/location/LocationAPI.h +++ b/location/LocationAPI.h @@ -178,6 +178,20 @@ public: LOCATION_ERROR_INVALID_PARAMETER if any parameters in GnssNiResponse are invalid LOCATION_ERROR_ID_UNKNOWN if id does not match a gnssNiCallback */ virtual void gnssNiResponse(uint32_t id, GnssNiResponse response) override; + + /* ================================== NETWORK PROVIDER =========================== */ + + /* enableNetworkProvider enables Network Provider */ + virtual void enableNetworkProvider(); + + /* disableNetworkProvider disables Network Provider */ + virtual void disableNetworkProvider(); + + /* startNetworkLocation start a single shot network location request */ + virtual void startNetworkLocation(trackingCallback* callback); + + /* stopNetworkLocation stop any ongoing network location request */ + virtual void stopNetworkLocation(trackingCallback* callback); }; typedef struct { @@ -480,6 +494,19 @@ public: */ virtual uint32_t configEngineRunState(PositioningEngineMask engType, LocEngineRunState engState) override; + + /** @brief + Set the EULA opt-in status from system user. This is used as consent to + use network-based positioning. + + @param + userConsnt: user agrees to use GTP service or not. + + @return + A session id that will be returned in responseCallback to + match command with response. + */ + virtual uint32_t setOptInStatus(bool userConsent); }; #endif /* LOCATIONAPI_H */ diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h index ede1f81..eb85d3b 100644 --- a/location/LocationDataTypes.h +++ b/location/LocationDataTypes.h @@ -61,7 +61,8 @@ typedef enum { LOCATION_ERROR_ID_UNKNOWN, LOCATION_ERROR_ALREADY_STARTED, LOCATION_ERROR_GEOFENCES_AT_MAX, - LOCATION_ERROR_NOT_SUPPORTED + LOCATION_ERROR_NOT_SUPPORTED, + LOCATION_ERROR_TIMEOUT, } LocationError; // Flags to indicate which values are valid in a Location @@ -211,6 +212,7 @@ typedef enum { GNSS_LOCATION_INFO_ENU_VELOCITY_VRP_BASED_BIT = (1<<30), // VRP-based east/north/up vel GNSS_LOCATION_INFO_DR_SOLUTION_STATUS_MASK_BIT = (1ULL<<31), // Valid DR solution status GNSS_LOCATION_INFO_ALTITUDE_ASSUMED_BIT = (1ULL<<32), // Valid altitude assumed + GNSS_LOCATION_INFO_SESSION_STATUS_BIT = (1ULL<<33), // session status } GnssLocationInfoFlagBits; typedef enum { @@ -1184,6 +1186,12 @@ typedef struct { float altitude; // altitude wrt to ellipsoid } LLAInfo; +enum loc_sess_status { + LOC_SESS_SUCCESS, + LOC_SESS_INTERMEDIATE, + LOC_SESS_FAILURE +}; + typedef struct { uint32_t size; // set to sizeof(GnssLocationInfo) Location location; // basic locaiton info, latitude, longitude, and etc @@ -1243,6 +1251,8 @@ typedef struct { DrSolutionStatusMask drSolutionStatusMask; // true: altitude is assumed, false: altitude is calculated bool altitudeAssumed; + // location session status + loc_sess_status sessionStatus; } GnssLocationInfoNotification; typedef struct { @@ -1711,6 +1721,11 @@ struct LocationSystemInfo { LeapSecondSystemInfo leapSecondSysInfo; }; +// Specify the set of terrestrial technologies +enum TerrestrialTechMask { + TERRESTRIAL_TECH_GTP_WWAN = 1 << 0, +}; + // Specify parameters related to lever arm struct LeverArmParams { // Offset along the vehicle forward axis diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index 8619ef8..39f80f8 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -879,12 +879,6 @@ typedef struct { bool altitudeAssumed; } GpsLocationExtended; -enum loc_sess_status { - LOC_SESS_SUCCESS, - LOC_SESS_INTERMEDIATE, - LOC_SESS_FAILURE -}; - // struct that contains complete position info from engine typedef struct { UlpLocation location; @@ -1555,6 +1549,10 @@ typedef uint64_t GpsSvMeasHeaderFlags; #define GNSS_SV_MEAS_HEADER_HAS_DGNSS_CORRECTION_SOURCE_ID 0x020000000 #define GNSS_SV_MEAS_HEADER_HAS_DGNSS_REF_STATION_ID 0x040000000 #define GNSS_SV_MEAS_HEADER_HAS_REF_COUNT_TICKS 0x080000000 +#define GNSS_SV_MEAS_HEADER_HAS_GPSL1L2C_TIME_BIAS 0x100000000 +#define GNSS_SV_MEAS_HEADER_HAS_GLOG1G2_TIME_BIAS 0x200000000 +#define GNSS_SV_MEAS_HEADER_HAS_BDSB1IB1C_TIME_BIAS 0x400000000 +#define GNSS_SV_MEAS_HEADER_HAS_GALE1E5B_TIME_BIAS 0x800000000 typedef struct { @@ -1581,6 +1579,10 @@ typedef struct Gnss_InterSystemBiasStructType gpsL1L5TimeBias; Gnss_InterSystemBiasStructType galE1E5aTimeBias; Gnss_InterSystemBiasStructType bdsB1iB2aTimeBias; + Gnss_InterSystemBiasStructType gpsL1L2cTimeBias; + Gnss_InterSystemBiasStructType gloG1G2TimeBias; + Gnss_InterSystemBiasStructType bdsB1iB1cTimeBias; + Gnss_InterSystemBiasStructType galE1E5bTimeBias; GnssSystemTimeStructType gpsSystemTime; GnssSystemTimeStructType galSystemTime; diff --git a/utils/loc_nmea.cpp b/utils/loc_nmea.cpp index 307870e..1dcbedd 100644 --- a/utils/loc_nmea.cpp +++ b/utils/loc_nmea.cpp @@ -36,6 +36,7 @@ #include <loc_cfg.h> #define GLONASS_SV_ID_OFFSET 64 +#define SBAS_SV_ID_OFFSET (87) #define QZSS_SV_ID_OFFSET (192) #define BDS_SV_ID_OFFSET (200) #define GALILEO_SV_ID_OFFSET (300) @@ -114,7 +115,7 @@ typedef struct loc_nmea_sv_meta_s { char talker[3]; - LocGnssConstellationType svType; + uint32_t svTypeMask; uint64_t mask; uint32_t svCount; uint32_t totalSvUsedCount; @@ -293,6 +294,7 @@ static uint32_t convert_signalType_to_signalId(GnssSignalTypeMask signalType) switch (signalType) { case GNSS_SIGNAL_GPS_L1CA: + case GNSS_SIGNAL_SBAS_L1: signalId = SIGNAL_ID_GPS_L1CA; break; case GNSS_SIGNAL_GPS_L2: @@ -405,7 +407,7 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, bool needCombine) { memset(&sv_meta, 0, sizeof(sv_meta)); - sv_meta.svType = svType; + sv_meta.svTypeMask = (1 << svType); switch (svType) { @@ -414,6 +416,7 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, sv_meta.talker[1] = 'P'; sv_meta.mask = sv_cache_info.gps_used_mask; sv_meta.systemId = SYSTEM_ID_GPS; + sv_meta.svTypeMask |= (1 << GNSS_SV_TYPE_SBAS); switch (signalType) { case GNSS_SIGNAL_GPS_L1CA: sv_meta.svCount = sv_cache_info.gps_l1_count; @@ -643,7 +646,7 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende uint32_t svIdOffset = sv_meta_p->svIdOffset; uint64_t mask = sv_meta_p->mask; - if(sv_meta_p->svType != GNSS_SV_TYPE_GLONASS) { + if (!(sv_meta_p->svTypeMask & (1 << GNSS_SV_TYPE_GLONASS))) { svIdOffset = 0; } @@ -797,7 +800,7 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, return; } - if (GNSS_SV_TYPE_GLONASS == sv_meta_p->svType) { + if ((1 << GNSS_SV_TYPE_GLONASS) & sv_meta_p->svTypeMask) { svIdOffset = 0; } svNumber = 1; @@ -855,9 +858,12 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, } } - if (sv_meta_p->svType == svNotify.gnssSvs[svNumber - 1].type && + if ((sv_meta_p->svTypeMask & (1 << svNotify.gnssSvs[svNumber - 1].type)) && sv_meta_p->signalId == convert_signalType_to_signalId(signalType)) { + if (GNSS_SV_TYPE_SBAS == svNotify.gnssSvs[svNumber - 1].type) { + svIdOffset = SBAS_SV_ID_OFFSET; + } length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,", svNotify.gnssSvs[svNumber - 1].svId - svIdOffset, (int)(0.5 + svNotify.gnssSvs[svNumber - 1].elevation), //float to int @@ -2137,14 +2143,15 @@ void loc_nmea_generate_sv(const GnssSvNotification &svNotify, //Count GPS SVs for saparating GPS from GLONASS and throw others for (uint32_t svOffset = 0; svOffset < svNotify.count; svOffset++) { - if (GNSS_SV_TYPE_GPS == svNotify.gnssSvs[svOffset].type) + if ((GNSS_SV_TYPE_GPS == svNotify.gnssSvs[svOffset].type) || + (GNSS_SV_TYPE_SBAS == svNotify.gnssSvs[svOffset].type)) { if (GNSS_SIGNAL_GPS_L5 == svNotify.gnssSvs[svOffset].gnssSignalTypeMask) { sv_cache_info.gps_l5_count++; } else if (GNSS_SIGNAL_GPS_L2 == svNotify.gnssSvs[svOffset].gnssSignalTypeMask) { sv_cache_info.gps_l2_count++; } else { - // GNSS_SIGNAL_GPS_L1CA or default + // GNSS_SIGNAL_GPS_L1CA, GNSS_SIGNAL_SBAS_L1 or default // If no signal type in report, it means default L1 sv_cache_info.gps_l1_count++; } |