diff --git a/core/EngineHubProxyBase.h b/core/EngineHubProxyBase.h index b159bd89..455c52ea 100644 --- a/core/EngineHubProxyBase.h +++ b/core/EngineHubProxyBase.h @@ -80,6 +80,11 @@ public: (void) svPolynomial; return false; } + + inline virtual bool gnssReportSvEphemeris(const GnssSvEphemerisReport& svEphemeris) { + (void) svEphemeris; + return false; + } }; typedef std::function GnssAdapterReportSvEventCb; +typedef std::function + GnssAdapterReqAidingDataCb; + // potential parameters: message queue: MsgTask * msgTask; // callback function to report back dr and ppe position and sv report typedef EngineHubProxyBase* (getEngHubProxyFn)(const MsgTask * msgTask, IOsObserver* osObserver, GnssAdapterReportPositionEventCb positionEventCb, - GnssAdapterReportSvEventCb svEventCb); + GnssAdapterReportSvEventCb svEventCb, + GnssAdapterReqAidingDataCb reqAidingDataCb); } // namespace loc_core diff --git a/core/LocAdapterBase.cpp b/core/LocAdapterBase.cpp index 5a16b172..42cf7aa8 100644 --- a/core/LocAdapterBase.cpp +++ b/core/LocAdapterBase.cpp @@ -107,6 +107,11 @@ void LocAdapterBase:: reportSvPolynomialEvent(GnssSvPolynomial &/*svPolynomial*/) DEFAULT_IMPL() +void LocAdapterBase:: + reportSvEphemerisEvent(GnssSvEphemerisReport &/*svEphemeris*/) +DEFAULT_IMPL() + + void LocAdapterBase:: reportStatus(LocGpsStatusValue /*status*/) DEFAULT_IMPL() @@ -179,4 +184,7 @@ bool LocAdapterBase:: reportGnssEngEnergyConsumedEvent(uint64_t /*energyConsumedSinceFirstBoot*/) DEFAULT_IMPL(false) +bool LocAdapterBase:: + reportDeleteAidingDataEvent(GnssAidingData & /*aidingData*/) +DEFAULT_IMPL(false) } // namespace loc_core diff --git a/core/LocAdapterBase.h b/core/LocAdapterBase.h index abbf3d6e..a934817d 100644 --- a/core/LocAdapterBase.h +++ b/core/LocAdapterBase.h @@ -147,6 +147,7 @@ public: virtual void reportNmeaEvent(const char* nmea, size_t length); virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet); virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); + virtual void reportSvEphemerisEvent(GnssSvEphemerisReport &svEphemeris); virtual void reportStatus(LocGpsStatusValue status); virtual bool reportXtraServer(const char* url1, const char* url2, const char* url3, const int maxlength); @@ -168,6 +169,7 @@ public: virtual void reportGnssSvTypeConfigEvent(const GnssSvTypeConfig& config); virtual bool requestOdcpiEvent(OdcpiRequestInfo& request); virtual bool reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFirstBoot); + virtual bool reportDeleteAidingDataEvent(GnssAidingData &aidingData); }; } // namespace loc_core diff --git a/core/LocApiBase.cpp b/core/LocApiBase.cpp index 99a089e2..b2642cac 100644 --- a/core/LocApiBase.cpp +++ b/core/LocApiBase.cpp @@ -369,6 +369,12 @@ void LocApiBase::reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFi energyConsumedSinceFirstBoot)); } +void LocApiBase::reportDeleteAidingDataEvent(GnssAidingData& aidingData) { + // loop through adapters, and deliver to the first handling adapter. + TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDeleteAidingDataEvent(aidingData)); +} + + void LocApiBase::reportSv(GnssSvNotification& svNotify) { const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS", @@ -421,6 +427,14 @@ void LocApiBase::reportSvPolynomial(GnssSvPolynomial &svPolynomial) ); } +void LocApiBase::reportSvEphemeris(GnssSvEphemerisReport & svEphemeris) +{ + // loop through adapters, and deliver to all adapters. + TO_ALL_LOCADAPTERS( + mLocAdapters[i]->reportSvEphemerisEvent(svEphemeris) + ); +} + void LocApiBase::reportStatus(LocGpsStatusValue status) { // loop through adapters, and deliver to all adapters. @@ -659,6 +673,10 @@ LocationError LocApiBase:: setGpsLockSync(GnssConfigGpsLock /*lock*/) DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) +void LocApiBase:: + requestForAidingData(GnssAidingDataSvMask /*svDataMask*/) +DEFAULT_IMPL() + void LocApiBase:: installAGpsCert(const LocDerEncodedCertificate* /*pData*/, size_t /*length*/, diff --git a/core/LocApiBase.h b/core/LocApiBase.h index d4d337ad..77c57d98 100644 --- a/core/LocApiBase.h +++ b/core/LocApiBase.h @@ -165,6 +165,7 @@ public: void reportSv(GnssSvNotification& svNotify); void reportSvMeasurement(GnssSvMeasurementSet &svMeasurementSet); void reportSvPolynomial(GnssSvPolynomial &svPolynomial); + void reportSvEphemeris(GnssSvEphemerisReport &svEphemeris); void reportStatus(LocGpsStatusValue status); void reportNmea(const char* nmea, int length); void reportData(GnssDataNotification& dataNotify, int msInWeek); @@ -184,6 +185,7 @@ public: void reportGnssSvTypeConfig(const GnssSvTypeConfig& config); void requestOdcpi(OdcpiRequestInfo& request); void reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFirstBoot); + void reportDeleteAidingDataEvent(GnssAidingData& aidingData); // downward calls // All below functions are to be defined by adapter specific modules: @@ -276,6 +278,7 @@ public: void updateNmeaMask(uint32_t mask); virtual LocationError setGpsLockSync(GnssConfigGpsLock lock); + virtual void requestForAidingData(GnssAidingDataSvMask svDataMask); virtual LocationError setXtraVersionCheckSync(uint32_t check); diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 04ac1871..bf8dedc8 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -1919,7 +1919,7 @@ GnssAdapter::updateClientsEventMask() } /* - ** For Automotive use cases we need to enable MEASUREMENT and POLY + ** For Automotive use cases we need to enable MEASUREMENT, POLY and EPHEMERIS ** when QDR is enabled (e.g.: either enabled via conf file or ** engine hub is loaded successfully). ** Note: this need to be called from msg queue thread. @@ -1929,8 +1929,10 @@ GnssAdapter::updateClientsEventMask() mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; mask |= LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT; mask |= LOC_API_ADAPTER_BIT_PARSED_UNPROPAGATED_POSITION_REPORT; + mask |= LOC_API_ADAPTER_BIT_GNSS_SV_EPHEMERIS_REPORT; - LOC_LOGD("%s]: Auto usecase, Enable MEAS/POLY - mask 0x%" PRIx64 "", __func__, mask); + LOC_LOGd("Auto usecase, Enable MEAS/POLY/EPHEMERIS - mask 0x%" PRIx64 "", + mask); } if (mAgpsCbInfo.statusV4Cb != NULL) { @@ -3402,6 +3404,14 @@ GnssAdapter::reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial) mEngHubProxy->gnssReportSvPolynomial(svPolynomial); } +void +GnssAdapter::reportSvEphemerisEvent(GnssSvEphemerisReport & svEphemeris) +{ + LOC_LOGD("%s]:", __func__); + mEngHubProxy->gnssReportSvEphemeris(svEphemeris); +} + + bool GnssAdapter::requestOdcpiEvent(OdcpiRequestInfo& request) { @@ -3466,6 +3476,28 @@ void GnssAdapter::requestOdcpi(const OdcpiRequestInfo& request) } } +bool GnssAdapter::reportDeleteAidingDataEvent(GnssAidingData& aidingData) +{ + LOC_LOGD("%s]:", __func__); + + struct MsgHandleDeleteAidingDataEvent : public LocMsg { + GnssAdapter& mAdapter; + GnssAidingData mData; + inline MsgHandleDeleteAidingDataEvent(GnssAdapter& adapter, + GnssAidingData& data) : + LocMsg(), + mAdapter(adapter), + mData(data) {} + inline virtual void proc() const { + mAdapter.mEngHubProxy->gnssDeleteAidingData(mData); + } + }; + + sendMsg(new MsgHandleDeleteAidingDataEvent(*this, aidingData)); + return true; +} + + void GnssAdapter::initOdcpiCommand(const OdcpiRequestCallback& callback) { struct MsgInitOdcpi : public LocMsg { @@ -4346,11 +4378,17 @@ GnssAdapter::initEngHubProxy() { reportSvEvent(svNotify, fromEngineHub); }; + // callback function for engine hub to request for complete aiding data + GnssAdapterReqAidingDataCb reqAidingDataCb = + [this] (const GnssAidingDataSvMask& svDataMask) { + mLocApi->requestForAidingData(svDataMask); + }; + getEngHubProxyFn* getter = (getEngHubProxyFn*) dlsym(handle, "getEngHubProxy"); if(getter != nullptr) { EngineHubProxyBase* hubProxy = (*getter) (mMsgTask, mSystemStatus->getOsObserver(), reportPositionEventCb, - reportSvEventCb); + reportSvEventCb, reqAidingDataCb); if (hubProxy != nullptr) { mEngHubProxy = hubProxy; engHubLoadSuccessful = true; diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h index b3288848..21ce787d 100644 --- a/gnss/GnssAdapter.h +++ b/gnss/GnssAdapter.h @@ -340,6 +340,7 @@ public: int msInWeek); virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet); virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); + virtual void reportSvEphemerisEvent(GnssSvEphemerisReport & svEphemeris); virtual void reportGnssSvIdConfigEvent(const GnssSvIdConfig& config); virtual void reportGnssSvTypeConfigEvent(const GnssSvTypeConfig& config); virtual bool reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFirstBoot); @@ -347,6 +348,7 @@ public: virtual bool requestATL(int connHandle, LocAGpsType agps_type, LocApnTypeMask apn_type_mask); virtual bool releaseATL(int connHandle); virtual bool requestOdcpiEvent(OdcpiRequestInfo& request); + virtual bool reportDeleteAidingDataEvent(GnssAidingData& aidingData); /* ======== UTILITIES ================================================================= */ bool needReport(const UlpLocation& ulpLocation, diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h index 9688b4ad..aae6dcf9 100644 --- a/location/LocationDataTypes.h +++ b/location/LocationDataTypes.h @@ -475,7 +475,8 @@ typedef enum { GNSS_AIDING_DATA_SV_NO_EXIST_BIT = (1<<8), // SV does not exist GNSS_AIDING_DATA_SV_IONOSPHERE_BIT = (1<<9), // ionosphere correction GNSS_AIDING_DATA_SV_TIME_BIT = (1<<10),// reset satellite time - GNSS_AIDING_DATA_SV_MB_DATA = (1 << 11),// delete multiband data + GNSS_AIDING_DATA_SV_MB_DATA = (1<<11),// delete multiband data + GNSS_AIDING_DATA_SV_POLY_BIT = (1<<12),// poly } GnssAidingDataSvBits; typedef uint32_t GnssAidingDataSvTypeMask; diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index 10605f78..146b2f4e 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -96,6 +96,9 @@ typedef uint32_t LocSvInfoSource; /* TBM Threshold for tracking in background power mode : in millis */ #define TRACKING_TBM_THRESHOLD_MILLIS 480000 +/** Maximum number of satellites in an ephemeris report. */ +#define GNSS_EPHEMERIS_LIST_MAX_SIZE_V02 32 + typedef uint32_t LocPosTechMask; #define LOC_POS_TECH_MASK_DEFAULT ((LocPosTechMask)0x00000000) #define LOC_POS_TECH_MASK_SATELLITE ((LocPosTechMask)0x00000001) @@ -584,6 +587,16 @@ typedef uint16_t GnssMeasUsageInfoValidityMask; #define GNSS_CARRIER_PHASE_RESIDUAL_VALID ((GnssMeasUsageInfoValidityMask)0x00000004ul) #define GNSS_CARRIER_PHASE_AMBIGUITY_TYPE_VALID ((GnssMeasUsageInfoValidityMask)0x00000008ul) +typedef uint16_t GnssSvPolyStatusMask; +#define GNSS_SV_POLY_SRC_ALM_CORR_V02 ((GnssSvPolyStatusMask)0x01) +#define GNSS_SV_POLY_GLO_STR4_V02 ((GnssSvPolyStatusMask)0x02) +#define GNSS_SV_POLY_DELETE_V02 ((GnssSvPolyStatusMask)0x04) +typedef uint16_t GnssSvPolyStatusMaskValidity; +#define GNSS_SV_POLY_SRC_ALM_CORR_VALID_V02 ((GnssSvPolyStatusMaskValidity)0x01) +#define GNSS_SV_POLY_GLO_STR4_VALID_V02 ((GnssSvPolyStatusMaskValidity)0x02) +#define GNSS_SV_POLY_DELETE_VALID_V02 ((GnssSvPolyStatusMaskValidity)0x04) + + typedef struct { /** Specifies GNSS signal type Mandatory Field*/ @@ -838,6 +851,7 @@ enum loc_api_adapter_event_index { LOC_API_ADAPTER_FDCL_SERVICE_REQ, // FDCL service request LOC_API_ADAPTER_REPORT_UNPROPAGATED_POSITION, // Unpropagated Position report LOC_API_ADAPTER_BS_OBS_DATA_SERVICE_REQ, // BS observation data request + LOC_API_ADAPTER_GNSS_SV_EPHEMERIS_REPORT, // GNSS SV Ephemeris Report LOC_API_ADAPTER_EVENT_MAX }; @@ -876,6 +890,7 @@ enum loc_api_adapter_event_index { #define LOC_API_ADAPTER_BIT_FDCL_SERVICE_REQ (1ULL<