From 071fd823dd949cdbdf81a39a469bee279bac1437 Mon Sep 17 00:00:00 2001 From: Mike Cailean Date: Mon, 3 Jun 2019 15:26:29 -0700 Subject: [PATCH 01/12] GPS getting locked after killing LocHIDL Change-Id: Ib6a9ed37f9198b9024042f8ba7ac9e9bf5f05190 CRs-fixed: 2463756 --- gnss/GnssAdapter.cpp | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 8e1bf5f8..b9a31106 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -720,10 +720,7 @@ GnssAdapter::setConfigCommand() GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT | GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT | GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT; - gnssConfigRequested.gpsLock = GNSS_CONFIG_GPS_LOCK_NONE; - if (0 == adapter.getAfwControlId() || NULL != adapter.mNfwCb) { - gnssConfigRequested.gpsLock = gpsConf.GPS_LOCK; - } + gnssConfigRequested.gpsLock = gpsConf.GPS_LOCK; if (gpsConf.AGPS_CONFIG_INJECT) { gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT | @@ -1075,10 +1072,7 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config) if (GNSS_CONFIG_GPS_LOCK_NONE == newGpsLock) { newGpsLock = GNSS_CONFIG_GPS_LOCK_MO; } - if (newGpsLock == ContextBase::mGps_conf.GPS_LOCK || - 0 != mAdapter.getAfwControlId() || NULL != adapter.mNfwCb) { - gnssConfigNeedEngineUpdate.flags &= ~(GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT); - } + gnssConfigNeedEngineUpdate.flags &= ~(GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT); ContextBase::mGps_conf.GPS_LOCK = newGpsLock; index++; } @@ -2976,10 +2970,8 @@ GnssAdapter::enableCommand(LocationTechnologyType techType) mAdapter.setAfwControlId(mSessionId); GnssConfigGpsLock gpsLock = GNSS_CONFIG_GPS_LOCK_NONE; - if (NULL != mAdapter.mNfwCb) { - ContextBase::mGps_conf.GPS_LOCK &= GNSS_CONFIG_GPS_LOCK_NI; - gpsLock = ContextBase::mGps_conf.GPS_LOCK; - } + ContextBase::mGps_conf.GPS_LOCK &= GNSS_CONFIG_GPS_LOCK_NI; + gpsLock = ContextBase::mGps_conf.GPS_LOCK; mApi.sendMsg(new LocApiMsg([&mApi = mApi, gpsLock]() { mApi.setGpsLockSync(gpsLock); })); @@ -3026,10 +3018,8 @@ GnssAdapter::disableCommand(uint32_t id) mContext.modemPowerVote(false); mAdapter.setAfwControlId(0); - if (NULL != mAdapter.mNfwCb) { - /* We need to disable MO (AFW) */ - ContextBase::mGps_conf.GPS_LOCK |= GNSS_CONFIG_GPS_LOCK_MO; - } + /* We need to disable MO (AFW) */ + ContextBase::mGps_conf.GPS_LOCK |= GNSS_CONFIG_GPS_LOCK_MO; GnssConfigGpsLock gpsLock = ContextBase::mGps_conf.GPS_LOCK; mApi.sendMsg(new LocApiMsg([&mApi = mApi,gpsLock] () { mApi.setGpsLockSync(gpsLock); From 980dbf59b6b864d90eee122936a4c8ec484f948d Mon Sep 17 00:00:00 2001 From: Bhavna Sharma Date: Tue, 2 Apr 2019 14:20:36 -0700 Subject: [PATCH 02/12] Fix to use explicit sized structures Cross processor communication needs explicit sized structures. Avoid using platform defined values like size_t which may vary from 32-bit to 64-bit. Also use explicitly defined timespec32_t structure that will only use uint32_t fields. CRs-Fixed: 2428163 Change-Id: Ida72f53ac672d9c9b86879bb9861cecefe6f8c6d --- gnss/GnssAdapter.cpp | 2 +- utils/gps_extended_c.h | 43 +++++++++++++++++++++++------------------- utils/loc_gps.h | 2 +- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 8e1bf5f8..0775c2a7 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -1636,7 +1636,7 @@ GnssAdapter::gnssSvTypeConfigUpdate(const GnssSvTypeConfig& config) void GnssAdapter::gnssSvTypeConfigUpdate(bool sendReset) { - LOC_LOGd("size %zu constellations blacklisted 0x%" PRIx64 ", enabled 0x%" PRIx64 + LOC_LOGd("size %" PRIu32" constellations blacklisted 0x%" PRIx64 ", enabled 0x%" PRIx64 ", sendReset %d", mGnssSvTypeConfig.size, mGnssSvTypeConfig.blacklistedSvTypesMask, mGnssSvTypeConfig.enabledSvTypesMask, sendReset); diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index 9f4c13c3..9c63166a 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -35,7 +35,12 @@ #include #include #include -#include + +struct timespec32_t { + uint32_t tv_sec; /* seconds */ + uint32_t tv_nsec; /* and nanoseconds */ +}; + /** * @file @@ -132,7 +137,7 @@ typedef enum { typedef struct { /** set to sizeof(UlpLocation) */ - size_t size; + uint32_t size; LocGpsLocation gpsLocation; /* Provider indicator for HYBRID or GPS */ uint16_t position_source; @@ -142,7 +147,7 @@ typedef struct { typedef struct { /** set to sizeof(UlpNmea) */ - size_t size; + uint32_t size; char nmea_str[ULP_MAX_NMEA_STRING_SIZE]; unsigned int len; } UlpNmea; @@ -208,7 +213,7 @@ typedef struct { /** GPS extended callback structure. */ typedef struct { /** set to sizeof(LocGpsCallbacks) */ - size_t size; + uint32_t size; loc_gps_set_capabilities set_capabilities_cb; loc_gps_acquire_wakelock acquire_wakelock_cb; loc_gps_release_wakelock release_wakelock_cb; @@ -232,7 +237,7 @@ typedef struct { /** Represents the status of AGPS. */ typedef struct { /** set to sizeof(AGpsExtStatus) */ - size_t size; + uint32_t size; AGpsExtType type; LocAGpsStatusValue status; @@ -458,7 +463,7 @@ typedef enum { }LocReliability; typedef struct { - struct timespec apTimeStamp; + struct timespec32_t apTimeStamp; /*boottime received from pps-ktimer*/ float apTimeStampUncertaintyMs; /* timestamp uncertainty in milli seconds */ @@ -685,7 +690,7 @@ typedef struct { /** Represents gps location extended. */ typedef struct { /** set to sizeof(GpsLocationExtended) */ - size_t size; + uint32_t size; /** Contains GpsLocationExtendedFlags bits. */ uint64_t flags; /** Contains the Altitude wrt mean sea level */ @@ -1058,7 +1063,7 @@ typedef enum typedef struct { - size_t size; + uint32_t size; float clockDrift; /**< Receiver clock Drift \n - Units: meter per sec \n @@ -1072,7 +1077,7 @@ typedef struct typedef struct { - size_t size; + uint32_t size; uint8_t leapSec; /**< GPS time leap second delta to UTC time \n - Units: sec \n @@ -1093,7 +1098,7 @@ typedef enum typedef struct { - size_t size; + uint32_t size; uint32_t validMask; /* Validity mask as per Gnss_LocInterSystemBiasValidMaskType */ @@ -1110,7 +1115,7 @@ typedef struct typedef struct { - size_t size; + uint32_t size; uint8_t systemRtc_valid; /**< Validity indicator for System RTC */ @@ -1156,7 +1161,7 @@ typedef enum typedef struct { - size_t size; + uint32_t size; uint32_t svMs; /**< Satellite time milisecond.\n For GPS, BDS, GAL range of 0 thru (604800000-1) \n @@ -1216,7 +1221,7 @@ typedef enum typedef struct { - size_t size; + uint32_t size; Gnss_LocSvSystemEnumType gnssSystem; // 0 signal type mask indicates invalid value GnssSignalTypeMask gnssSignalTypeMask; @@ -1389,7 +1394,7 @@ typedef uint64_t GpsSvMeasHeaderFlags; typedef struct { - size_t size; + uint32_t size; // see defines in GNSS_SV_MEAS_HEADER_HAS_XXX_XXX uint64_t flags; @@ -1433,7 +1438,7 @@ typedef struct } GnssSvMeasurementHeader; typedef struct { - size_t size; + uint32_t size; bool isNhz; GnssSvMeasurementHeader svMeasSetHeader; uint32_t svMeasCount; @@ -1473,7 +1478,7 @@ typedef enum typedef struct { - size_t size; + uint32_t size; uint16_t gnssSvId; /* GPS: 1-32, GLO: 65-96, 0: Invalid, SBAS: 120-151, BDS:201-237,GAL:301 to 336 @@ -2034,7 +2039,7 @@ typedef enum { typedef struct { - size_t size; + uint32_t size; Gnss_SrnTech srnTechType; /* SRN Technology type in request */ bool srnRequest; /* scan - start(true) or stop(false) */ bool e911Mode; /* If in E911 emergency */ @@ -2054,7 +2059,7 @@ typedef enum { /* This SV Type config is injected directly to GNSS Adapter * bypassing Location API */ typedef struct { - size_t size; // set to sizeof(GnssSvTypeConfig) + uint32_t size; // set to sizeof(GnssSvTypeConfig) // Enabled Constellations GnssSvTypesMask enabledSvTypesMask; // Disabled Constellations @@ -2141,7 +2146,7 @@ enum OdcpiRequestType { ODCPI_REQUEST_TYPE_STOP }; struct OdcpiRequestInfo { - size_t size; + uint32_t size; OdcpiRequestType type; uint32_t tbfMillis; bool isEmergencyMode; diff --git a/utils/loc_gps.h b/utils/loc_gps.h index b58f20b0..eae7383e 100644 --- a/utils/loc_gps.h +++ b/utils/loc_gps.h @@ -548,7 +548,7 @@ typedef uint8_t LocGnssConstellationType; /** Represents a location. */ typedef struct { /** set to sizeof(LocGpsLocation) */ - size_t size; + uint32_t size; /** Contains LocGpsLocationFlags bits. */ uint16_t flags; /** The spoof mask */ From 64514a57344208890eea76e10c460e9457fb2730 Mon Sep 17 00:00:00 2001 From: Mike Cailean Date: Mon, 10 Jun 2019 13:48:15 -0700 Subject: [PATCH 03/12] SV used in fix satellites are not updated for B2A-Q Change-Id: If9d6f4ff694572f22b95b3ccb6015ebcb6310ffa CRs-fixed: 2468528 --- gnss/GnssAdapter.cpp | 3 +++ location/LocationDataTypes.h | 9 ++++++--- utils/gps_extended_c.h | 3 +++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 8e1bf5f8..4d329d87 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -3332,6 +3332,9 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) case GNSS_SIGNAL_BEIDOU_B2AI: svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b2ai_sv_used_ids_mask; break; + case GNSS_SIGNAL_BEIDOU_B2AQ: + svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b2aq_sv_used_ids_mask; + break; } } else { svUsedIdMask = mGnssSvIdUsedInPosition.bds_sv_used_ids_mask; diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h index d6abda2e..4571a88b 100644 --- a/location/LocationDataTypes.h +++ b/location/LocationDataTypes.h @@ -583,7 +583,9 @@ typedef enum { /** SBAS L1 RF Band */ GNSS_SIGNAL_SBAS_L1 = (1<<17), /** NAVIC L5 RF Band */ - GNSS_SIGNAL_NAVIC_L5 = (1<<18) + GNSS_SIGNAL_NAVIC_L5 = (1<<18), + /** BEIDOU B2A_Q RF Band */ + GNSS_SIGNAL_BEIDOU_B2AQ = (1<<19) } GnssSignalTypeBits; #define GNSS_SIGNAL_TYPE_MASK_ALL\ @@ -593,7 +595,7 @@ typedef enum { GNSS_SIGNAL_BEIDOU_B1I | GNSS_SIGNAL_BEIDOU_B1C | GNSS_SIGNAL_BEIDOU_B2I|\ GNSS_SIGNAL_BEIDOU_B2AI | GNSS_SIGNAL_QZSS_L1CA | GNSS_SIGNAL_QZSS_L1S |\ GNSS_SIGNAL_QZSS_L2| GNSS_SIGNAL_QZSS_L5 | GNSS_SIGNAL_SBAS_L1 |\ - GNSS_SIGNAL_NAVIC_L5) + GNSS_SIGNAL_NAVIC_L5) | GNSS_SIGNAL_BEIDOU_B2AQ typedef enum { @@ -635,7 +637,8 @@ typedef enum { GNSS_LOC_SIGNAL_TYPE_QZSS_L5_Q = 16, /**< QZSS L5_Q RF Band */ GNSS_LOC_SIGNAL_TYPE_SBAS_L1_CA = 17, /**< SBAS L1_CA RF Band */ GNSS_LOC_SIGNAL_TYPE_NAVIC_L5 = 18, /**< NAVIC L5 RF Band */ - GNSS_LOC_MAX_NUMBER_OF_SIGNAL_TYPES = 19 /**< Maximum number of signal types */ + GNSS_LOC_SIGNAL_TYPE_BEIDOU_B2A_Q = 19, /**< BEIDOU B2A_Q RF Band */ + GNSS_LOC_MAX_NUMBER_OF_SIGNAL_TYPES = 20 /**< Maximum number of signal types */ } Gnss_LocSignalEnumType; typedef uint64_t GnssDataMask; diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index 9f4c13c3..7fce3d7c 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -492,6 +492,7 @@ typedef struct { uint64_t qzss_l2_sv_used_ids_mask; // QZSS L2 uint64_t qzss_l5_sv_used_ids_mask; // QZSS L5 uint64_t sbas_l1_sv_used_ids_mask; // SBAS L1 + uint64_t bds_b2aq_sv_used_ids_mask; // BDS B2AQ } GnssSvMbUsedInPosition; /* Body Frame parameters */ @@ -600,6 +601,8 @@ typedef uint32_t GnssSignalTypeMask; #define GNSS_SIGNAL_SBAS_L1 ((GnssSignalTypeMask)0x00020000ul) /** NAVIC L5 RF Band */ #define GNSS_SIGNAL_NAVIC_L5 ((GnssSignalTypeMask)0x00040000ul) +/** BEIDOU B2A_Q RF Band */ +#define GNSS_SIGNAL_BEIDOU_B2AQ ((GnssSignalTypeMask)0x00080000ul) typedef uint16_t GnssMeasUsageStatusBitMask; /** Used in fix */ From de13fc3868bbaa8b136ba0760145aef639bf5bd5 Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Wed, 12 Jun 2019 12:09:18 -0700 Subject: [PATCH 04/12] Gnss adapter: do not send out empty sv measurement to Android Do not send out empty sv measurement to Android Change-Id: I4ab807d647be8b44f3f48a3ad5e5ca7f33ac2485 CRs-fixed: 2439716 --- gnss/GnssAdapter.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 16d5f9db..c50eeb9d 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -3769,26 +3769,28 @@ GnssAdapter::reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurement { LOC_LOGD("%s]: msInWeek=%d", __func__, msInWeek); - struct MsgReportGnssMeasurementData : public LocMsg { - GnssAdapter& mAdapter; - GnssMeasurements mGnssMeasurements; - GnssMeasurementsNotification mMeasurementsNotify; - inline MsgReportGnssMeasurementData(GnssAdapter& adapter, - const GnssMeasurements& gnssMeasurements, - int msInWeek) : - LocMsg(), - mAdapter(adapter), - mMeasurementsNotify(gnssMeasurements.gnssMeasNotification) { - if (-1 != msInWeek) { - mAdapter.getAgcInformation(mMeasurementsNotify, msInWeek); + if (0 != gnssMeasurements.gnssMeasNotification.count) { + struct MsgReportGnssMeasurementData : public LocMsg { + GnssAdapter& mAdapter; + GnssMeasurements mGnssMeasurements; + GnssMeasurementsNotification mMeasurementsNotify; + inline MsgReportGnssMeasurementData(GnssAdapter& adapter, + const GnssMeasurements& gnssMeasurements, + int msInWeek) : + LocMsg(), + mAdapter(adapter), + mMeasurementsNotify(gnssMeasurements.gnssMeasNotification) { + if (-1 != msInWeek) { + mAdapter.getAgcInformation(mMeasurementsNotify, msInWeek); + } } - } - inline virtual void proc() const { - mAdapter.reportGnssMeasurementData(mMeasurementsNotify); - } - }; + inline virtual void proc() const { + mAdapter.reportGnssMeasurementData(mMeasurementsNotify); + } + }; - sendMsg(new MsgReportGnssMeasurementData(*this, gnssMeasurements, msInWeek)); + sendMsg(new MsgReportGnssMeasurementData(*this, gnssMeasurements, msInWeek)); + } mEngHubProxy->gnssReportSvMeasurement(gnssMeasurements.gnssSvMeasurementSet); } From 061857b0799db463d6f0e038d4cb8c59a4124bb5 Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Mon, 10 Jun 2019 10:10:53 -0700 Subject: [PATCH 05/12] GnssLocationInfoNotification: move basic location info to top Move basic location info to top so if a new field is added to GnssLocationInfoNotification, it will not impact the basic location info. Change-Id: I362ee0f6f09c10e3df64ed6993b73a256690c38d CRs-fixed: 2468348 --- location/LocationDataTypes.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h index d6abda2e..fa0b714b 100644 --- a/location/LocationDataTypes.h +++ b/location/LocationDataTypes.h @@ -938,7 +938,8 @@ typedef struct { } GnssSystemTime; typedef struct { - uint32_t size; // set to sizeof(GnssLocationInfo) + uint32_t size; // set to sizeof(GnssLocationInfo) + Location location; // basic locaiton info, latitude, longitude, and etc GnssLocationInfoFlagMask flags; // bitwise OR of GnssLocationInfoBits for param validity float altitudeMeanSeaLevel; // altitude wrt mean sea level float pdop; // position dilusion of precision @@ -971,7 +972,6 @@ typedef struct { GnssMeasUsageInfo measUsageInfo[GNSS_SV_MAX]; // GNSS Measurement Usage info uint8_t leapSeconds; // leap second float timeUncMs; // Time uncertainty in milliseconds - Location location; } GnssLocationInfoNotification; typedef struct { From 61fd929fb6f9466b02706f9af0c4b36f3e16a2d6 Mon Sep 17 00:00:00 2001 From: Bhavna Sharma Date: Wed, 3 Apr 2019 18:12:52 -0700 Subject: [PATCH 06/12] Redesign Inet sender and receiver Redesign the inet sender and receiver to be able to accomodate udp and tcp types into one base class. CRs-Fixed: 2429102 Change-Id: Ie138839a5c8842813c99053816e06e4ed7f6b314 --- utils/LocIpc.cpp | 103 ++++++++++++++++++++++++++++++++++------------- utils/LocIpc.h | 5 +++ 2 files changed, 81 insertions(+), 27 deletions(-) diff --git a/utils/LocIpc.cpp b/utils/LocIpc.cpp index 646d2d4f..e8578174 100644 --- a/utils/LocIpc.cpp +++ b/utils/LocIpc.cpp @@ -164,7 +164,8 @@ public: umask(0157); if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) { - LOC_LOGe("bind socket error. sock fd: %d, reason: %s", mSock->mSid, strerror(errno)); + LOC_LOGe("bind socket error. sock fd: %d: %s, reason: %s", mSock->mSid, + mAddr.sun_path, strerror(errno)); mSock->close(); } } @@ -177,26 +178,22 @@ public: } }; -class LocIpcInetTcpSender : public LocIpcSender { +class LocIpcInetSender : public LocIpcSender { protected: + int mSockType; shared_ptr mSock; const string mName; sockaddr_in mAddr; - mutable bool mFirstTime; inline virtual bool isOperable() const override { return mSock != nullptr && mSock->isValid(); } - inline virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t /* msgId */) const { - if (mFirstTime) { - mFirstTime = false; - ::connect(mSock->mSid, (const struct sockaddr*)&mAddr, sizeof(mAddr)); - } + virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t /* msgId */) const { return mSock->send(data, length, 0, (struct sockaddr*)&mAddr, sizeof(mAddr)); } public: - inline LocIpcInetTcpSender(const char* name, int32_t port) : LocIpcSender(), - mSock(make_shared((nullptr == name) ? -1 : (::socket(AF_INET, SOCK_STREAM, 0)))), + inline LocIpcInetSender(const char* name, int32_t port, int sockType) : LocIpcSender(), + mSockType(sockType), + mSock(make_shared((nullptr == name) ? -1 : (::socket(AF_INET, mSockType, 0)))), mName((nullptr == name) ? "" : name), - mAddr({.sin_family=AF_INET, .sin_port=htons(port), .sin_addr={htonl(INADDR_ANY)}}), - mFirstTime(true) { + mAddr({.sin_family=AF_INET, .sin_port=htons(port), .sin_addr={htonl(INADDR_ANY)}}) { if (mSock != nullptr && mSock->isValid() && nullptr != name) { struct hostent* hp = gethostbyname(name); if (nullptr != hp) { @@ -206,7 +203,47 @@ public: } }; -class LocIpcInetTcpRecver : public LocIpcInetTcpSender, public LocIpcRecver { +class LocIpcInetTcpSender : public LocIpcInetSender { +protected: + mutable bool mFirstTime; + + virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t /* msgId */) const { + if (mFirstTime) { + mFirstTime = false; + ::connect(mSock->mSid, (const struct sockaddr*)&mAddr, sizeof(mAddr)); + } + return mSock->send(data, length, 0, (struct sockaddr*)&mAddr, sizeof(mAddr)); + } + +public: + inline LocIpcInetTcpSender(const char* name, int32_t port) : + LocIpcInetSender(name, port, SOCK_STREAM), + mFirstTime(true) {} +}; + +class LocIpcInetRecver : public LocIpcInetSender, public LocIpcRecver { +protected: + virtual ssize_t recv() const = 0; +public: + inline LocIpcInetRecver(const shared_ptr& listener, const char* name, + int32_t port, int sockType) : + LocIpcInetSender(name, port, sockType), LocIpcRecver(listener, *this) { + if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) { + LOC_LOGe("bind socket error. sock fd: %d, reason: %s", mSock->mSid, strerror(errno)); + mSock->close(); + } + } + inline virtual ~LocIpcInetRecver() {} + inline virtual const char* getName() const override { return mName.data(); }; + inline virtual void abort() const override { + if (isSendable()) { + mSock->sendAbort(0, (struct sockaddr*)&mAddr, sizeof(mAddr)); + } + } + +}; + +class LocIpcInetTcpRecver : public LocIpcInetRecver { mutable int32_t mConnFd; protected: inline virtual ssize_t recv() const override { @@ -223,21 +260,26 @@ protected: public: inline LocIpcInetTcpRecver(const shared_ptr& listener, const char* name, int32_t port) : - LocIpcInetTcpSender(name, port), LocIpcRecver(listener, *this), mConnFd(-1) { - if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) { - LOC_LOGe("bind socket error. sock fd: %d, reason: %s", mSock->mSid, strerror(errno)); - mSock->close(); - } - } - inline virtual ~LocIpcInetTcpRecver() { if (-1 != mConnFd) ::close(mConnFd); } - inline virtual const char* getName() const override { return mName.data(); }; - inline virtual void abort() const override { - if (isSendable()) { - mSock->sendAbort(0, (struct sockaddr*)&mAddr, sizeof(mAddr)); - } - } + LocIpcInetRecver(listener, name, port, SOCK_STREAM), mConnFd(-1) {} + inline virtual ~LocIpcInetTcpRecver() { if (-1 != mConnFd) ::close(mConnFd);} }; +class LocIpcInetUdpRecver : public LocIpcInetRecver { +protected: + inline virtual ssize_t recv() const override { + socklen_t size = sizeof(mAddr); + return mSock->recv(mDataCb, 0, (struct sockaddr*)&mAddr, &size); + } +public: + inline LocIpcInetUdpRecver(const shared_ptr& listener, const char* name, + int32_t port) : + LocIpcInetRecver(listener, name, port, SOCK_DGRAM) {} + + inline virtual ~LocIpcInetUdpRecver() {} +}; + + + #ifdef NOT_DEFINED class LocIpcQcsiSender : public LocIpcSender { protected: @@ -365,9 +407,16 @@ shared_ptr LocIpc::getLocIpcInetTcpSender(const char* serverName, return make_shared(serverName, port); } unique_ptr LocIpc::getLocIpcInetTcpRecver(const shared_ptr& listener, - const char* serverName, int32_t port) { + const char* serverName, int32_t port) { return make_unique(listener, serverName, port); } +shared_ptr LocIpc::getLocIpcInetUdpSender(const char* serverName, int32_t port) { + return make_shared(serverName, port, SOCK_DGRAM); +} +unique_ptr LocIpc::getLocIpcInetUdpRecver(const shared_ptr& listener, + const char* serverName, int32_t port) { + return make_unique(listener, serverName, port); +} pair, unique_ptr> LocIpc::getLocIpcQmiLocServiceSenderRecverPair(const shared_ptr& listener, int instance) { typedef pair, unique_ptr> (*creator_t)(const shared_ptr&, int); diff --git a/utils/LocIpc.h b/utils/LocIpc.h index b91966cb..42fbff31 100644 --- a/utils/LocIpc.h +++ b/utils/LocIpc.h @@ -66,6 +66,8 @@ public: static shared_ptr getLocIpcLocalSender(const char* localSockName); + static shared_ptr + getLocIpcInetUdpSender(const char* serverName, int32_t port); static shared_ptr getLocIpcInetTcpSender(const char* serverName, int32_t port); static shared_ptr @@ -74,6 +76,9 @@ public: static unique_ptr getLocIpcLocalRecver(const shared_ptr& listener, const char* localSockName); + static unique_ptr + getLocIpcInetUdpRecver(const shared_ptr& listener, + const char* serverName, int32_t port); static unique_ptr getLocIpcInetTcpRecver(const shared_ptr& listener, const char* serverName, int32_t port); From ff98fecec453ceac6d7f665c5a746352a41aaecd Mon Sep 17 00:00:00 2001 From: Nilesh Gharde Date: Tue, 4 Jun 2019 12:09:01 +0530 Subject: [PATCH 07/12] AP Default Setting CRM Builds SM8250 and Beyond loc_service_mask should not be populated with any SAP(Basic or Premium) value if the SAP value is MODEM_DEFAULT. Change-Id: I665bb90e4a814dc31bed566cc0b2ecffcfae52ac CRs-Fixed: 2457874 --- utils/loc_cfg.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/loc_cfg.cpp b/utils/loc_cfg.cpp index de887eec..55e4804e 100644 --- a/utils/loc_cfg.cpp +++ b/utils/loc_cfg.cpp @@ -622,6 +622,9 @@ int loc_read_process_conf(const char* conf_file_name, uint32_t * process_count_p LOC_LOGD("%s:%d]: Setting SAP to mode: BASIC", __func__, __LINE__); loc_service_mask |= LOC_FEATURE_MASK_SAP_BASIC; } + else if(strcmp(conf.feature_sap, "MODEM_DEFAULT") == 0) { + LOC_LOGD("%s:%d]: Setting SAP to mode: MODEM_DEFAULT", __func__, __LINE__); + } else if(strcmp(conf.feature_sap, "DISABLED") == 0) { LOC_LOGD("%s:%d]: Setting SAP to mode: DISABLED", __func__, __LINE__); } From c3d1f8fb94442219916afd648df478d4579bdfe6 Mon Sep 17 00:00:00 2001 From: Hoss Zhou Date: Wed, 29 May 2019 15:45:08 +0800 Subject: [PATCH 08/12] fix nmea GSV/GNS/GSA issues 1. remove blank GSV sentences 2. modify GNS mode indicator field 3. modify GSA mode field, remove blank sentence Change-Id: Ibe196328938e2674f0100224209cef0b229328e1 CRs-Fixed: 2460129 --- utils/loc_nmea.cpp | 170 ++++++++++++++++++++++++++++++++------------- 1 file changed, 123 insertions(+), 47 deletions(-) diff --git a/utils/loc_nmea.cpp b/utils/loc_nmea.cpp index abcf5b73..92ff8eab 100644 --- a/utils/loc_nmea.cpp +++ b/utils/loc_nmea.cpp @@ -36,6 +36,7 @@ #include #define GLONASS_SV_ID_OFFSET 64 +#define MAX_SV_COUNT_SUPPORTED_IN_ONE_CONSTELLATION 64 #define MAX_SATELLITES_IN_USE 12 #define MSEC_IN_ONE_WEEK 604800000ULL #define UTC_GPS_OFFSET_MSECS 315964800000ULL @@ -109,8 +110,9 @@ typedef struct loc_nmea_sv_meta_s { char talker[3]; LocGnssConstellationType svType; - uint32_t mask; + uint64_t mask; uint32_t svCount; + uint32_t totalSvUsedCount; uint32_t svIdOffset; uint32_t signalId; uint32_t systemId; @@ -118,12 +120,12 @@ typedef struct loc_nmea_sv_meta_s typedef struct loc_sv_cache_info_s { - uint32_t gps_used_mask; - uint32_t glo_used_mask; - uint32_t gal_used_mask; - uint32_t qzss_used_mask; - uint32_t bds_used_mask; - uint32_t navic_used_mask; + uint64_t gps_used_mask; + uint64_t glo_used_mask; + uint64_t gal_used_mask; + uint64_t qzss_used_mask; + uint64_t bds_used_mask; + uint64_t navic_used_mask; uint32_t gps_l1_count; uint32_t gps_l5_count; uint32_t glo_g1_count; @@ -337,6 +339,39 @@ static uint32_t convert_signalType_to_signalId(GnssSignalTypeMask signalType) } +/*=========================================================================== +FUNCTION get_sv_count_from_mask + +DESCRIPTION + get the sv count from bit mask + +DEPENDENCIES + NONE + +RETURN VALUE + value of sv count + +SIDE EFFECTS + N/A + +===========================================================================*/ +static uint32_t get_sv_count_from_mask(uint64_t svMask, int totalSvCount) +{ + int index = 0; + uint32_t svCount = 0; + + if(totalSvCount > MAX_SV_COUNT_SUPPORTED_IN_ONE_CONSTELLATION) { + LOC_LOGE("total SV count in this constellation %d exceeded limit %d", + totalSvCount, MAX_SV_COUNT_SUPPORTED_IN_ONE_CONSTELLATION); + } + for(index = 0; index < totalSvCount; index++) { + if(svMask & 0x1) + svCount += 1; + svMask >>= 1; + } + return svCount; +} + /*=========================================================================== FUNCTION loc_nmea_sv_meta_init @@ -438,6 +473,19 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, return NULL; } sv_meta.signalId = convert_signalType_to_signalId(signalType); + sv_meta.totalSvUsedCount = + get_sv_count_from_mask(sv_cache_info.gps_used_mask, + GPS_SV_PRN_MAX - GPS_SV_PRN_MIN + 1) + + get_sv_count_from_mask(sv_cache_info.glo_used_mask, + GLO_SV_PRN_MAX - GLO_SV_PRN_MIN + 1) + + get_sv_count_from_mask(sv_cache_info.gal_used_mask, + GAL_SV_PRN_MAX - GAL_SV_PRN_MIN + 1) + + get_sv_count_from_mask(sv_cache_info.qzss_used_mask, + QZSS_SV_PRN_MAX - QZSS_SV_PRN_MIN + 1) + + get_sv_count_from_mask(sv_cache_info.bds_used_mask, + BDS_SV_PRN_MAX - BDS_SV_PRN_MIN + 1) + + get_sv_count_from_mask(sv_cache_info.navic_used_mask, + NAVIC_SV_PRN_MAX - NAVIC_SV_PRN_MIN + 1); if (needCombine && (sv_cache_info.gps_used_mask ? 1 : 0) + (sv_cache_info.glo_used_mask ? 1 : 0) + @@ -532,27 +580,27 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende int length = 0; uint32_t svUsedCount = 0; - uint32_t svUsedList[32] = {0}; + uint32_t svUsedList[64] = {0}; char fixType = '\0'; const char* talker = sv_meta_p->talker; uint32_t svIdOffset = sv_meta_p->svIdOffset; - uint32_t mask = sv_meta_p->mask; + uint64_t mask = sv_meta_p->mask; - for (uint8_t i = 1; mask > 0 && svUsedCount < 32; i++) + for (uint8_t i = 1; mask > 0 && svUsedCount < 64; i++) { if (mask & 1) svUsedList[svUsedCount++] = i + svIdOffset; mask = mask >> 1; } - if (svUsedCount == 0 && GNSS_SV_TYPE_GPS != sv_meta_p->svType) + if (svUsedCount == 0) return 0; - if (svUsedCount == 0) + if (sv_meta_p->totalSvUsedCount == 0) fixType = '1'; // no fix - else if (svUsedCount <= 3) + else if (sv_meta_p->totalSvUsedCount <= 3) fixType = '2'; // 2D fix else fixType = '3'; // 3D fix @@ -665,10 +713,7 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, int svCount = sv_meta_p->svCount; if (svCount <= 0) { - // no svs in view, so just send a blank $--GSV sentence - snprintf(sentence, lengthRemaining, "$%sGSV,1,1,0,%X", talker, sv_meta_p->signalId); - length = loc_nmea_put_checksum(sentence, bufSize); - nmeaArraystr.push_back(sentence); + LOC_LOGV("No SV in view for talker ID:%s, signal ID:%X", talker, sv_meta_p->signalId); return; } @@ -1035,19 +1080,22 @@ void loc_nmea_generate_pos(const UlpLocation &location, if (GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA & locationExtended.flags) { sv_cache_info.gps_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.gps_sv_used_ids_mask; + locationExtended.gnss_sv_used_ids.gps_sv_used_ids_mask; sv_cache_info.glo_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.glo_sv_used_ids_mask; + locationExtended.gnss_sv_used_ids.glo_sv_used_ids_mask; sv_cache_info.gal_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.gal_sv_used_ids_mask; - sv_cache_info.qzss_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.bds_sv_used_ids_mask; + locationExtended.gnss_sv_used_ids.gal_sv_used_ids_mask; sv_cache_info.bds_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.qzss_sv_used_ids_mask; + locationExtended.gnss_sv_used_ids.bds_sv_used_ids_mask; + sv_cache_info.qzss_used_mask = + locationExtended.gnss_sv_used_ids.qzss_sv_used_ids_mask; + sv_cache_info.navic_used_mask = + locationExtended.gnss_sv_used_ids.navic_sv_used_ids_mask; } if (generate_nmea) { char talker[3] = {'G', 'P', '\0'}; + char modeIndicator[7] = {0}; uint32_t svUsedCount = 0; uint32_t count = 0; loc_nmea_sv_meta sv_meta; @@ -1093,13 +1141,12 @@ void loc_nmea_generate_pos(const UlpLocation &location, talker[1] = sv_meta.talker[1]; } - // -------------------------- - // ---$PQGSA/$GNGSA (QZSS)--- - // -------------------------- - + // ---------------------------- + // ---$GBGSA/$GNGSA (BEIDOU)--- + // ---------------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, - GNSS_SIGNAL_QZSS_L1CA, true), nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, + GNSS_SIGNAL_BEIDOU_B1I, true), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -1107,12 +1154,13 @@ void loc_nmea_generate_pos(const UlpLocation &location, talker[1] = sv_meta.talker[1]; } - // ---------------------------- - // ---$PQGSA/$GNGSA (BEIDOU)--- - // ---------------------------- + // -------------------------- + // ---$GQGSA/$GNGSA (QZSS)--- + // -------------------------- + count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, - GNSS_SIGNAL_BEIDOU_B1I, true), nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, + GNSS_SIGNAL_QZSS_L1CA, true), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -1461,17 +1509,49 @@ void loc_nmea_generate_pos(const UlpLocation &location, pMarker += length; lengthRemaining -= length; - if (!(location.gpsLocation.flags & LOC_GPS_LOCATION_HAS_LAT_LONG)) - // N means no fix - length = snprintf(pMarker, lengthRemaining, "%c,", 'N'); + if(!(sv_cache_info.gps_used_mask ? 1 : 0)) + modeIndicator[0] = 'N'; else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - // D means differential - length = snprintf(pMarker, lengthRemaining, "%c,", 'D'); + modeIndicator[0] = 'D'; else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - // E means estimated (dead reckoning) - length = snprintf(pMarker, lengthRemaining, "%c,", 'E'); - else // A means autonomous - length = snprintf(pMarker, lengthRemaining, "%c,", 'A'); + modeIndicator[0] = 'E'; + else + modeIndicator[0] = 'A'; + if(!(sv_cache_info.glo_used_mask ? 1 : 0)) + modeIndicator[1] = 'N'; + else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) + modeIndicator[1] = 'E'; + else + modeIndicator[1] = 'A'; + if(!(sv_cache_info.gal_used_mask ? 1 : 0)) + modeIndicator[2] = 'N'; + else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) + modeIndicator[2] = 'E'; + else + modeIndicator[2] = 'A'; + if(!(sv_cache_info.bds_used_mask ? 1 : 0)) + modeIndicator[3] = 'N'; + else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) + modeIndicator[3] = 'E'; + else + modeIndicator[3] = 'A'; + if(!(sv_cache_info.qzss_used_mask ? 1 : 0)) + modeIndicator[4] = 'N'; + else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) + modeIndicator[4] = 'E'; + else + modeIndicator[4] = 'A'; + if(!(sv_cache_info.navic_used_mask ? 1 : 0)) + modeIndicator[5] = 'N'; + else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) + modeIndicator[5] = 'E'; + else + modeIndicator[5] = 'A'; + modeIndicator[6] = '\0'; + for(int index = 5; index > 0 && 'N' == modeIndicator[index]; index--) { + modeIndicator[index] = '\0'; + } + length = snprintf(pMarker, lengthRemaining,"%s,", modeIndicator); pMarker += length; lengthRemaining -= length; @@ -1687,10 +1767,6 @@ void loc_nmea_generate_pos(const UlpLocation &location, length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); - strlcpy(sentence, "$GNGSA,A,1,,,,,,,,,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence)); length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); From 90a01875dae528c7753133da485854e28814977c Mon Sep 17 00:00:00 2001 From: Mike Cailean Date: Tue, 18 Jun 2019 16:42:58 -0700 Subject: [PATCH 09/12] Add B2A-Q support in NMEA messages Change-Id: Ia58935df454e7bfffa91416159e5c9ba4fe1ac75 CRs-fixed: 2474222 --- utils/loc_nmea.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/loc_nmea.cpp b/utils/loc_nmea.cpp index abcf5b73..2363e95b 100644 --- a/utils/loc_nmea.cpp +++ b/utils/loc_nmea.cpp @@ -324,6 +324,7 @@ static uint32_t convert_signalType_to_signalId(GnssSignalTypeMask signalType) signalId = SIGNAL_ID_BDS_B2I; break; case GNSS_SIGNAL_BEIDOU_B2AI: + case GNSS_SIGNAL_BEIDOU_B2AQ: signalId = SIGNAL_ID_BDS_B2A; break; case GNSS_SIGNAL_NAVIC_L5: From 49f7e15a816f9c4139ac3406374a608c2168f50b Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Fri, 19 Apr 2019 15:21:27 -0700 Subject: [PATCH 10/12] GnssAdapter: add support for ppe fix type and calibration info (1) Add support to report out calibration confidence in position report (2) Update gps quality of GGA, mode indicator for GMC and VTG NMEA sentences Change-Id: Ia1aa5283deffed6638172b90a41b481c2d199229 CRs-fixed: 2438838 --- gnss/GnssAdapter.cpp | 10 +++ location/LocationDataTypes.h | 28 ++++++- utils/gps_extended_c.h | 19 +++-- utils/loc_nmea.cpp | 147 +++++++++++++++++++++++++---------- 4 files changed, 155 insertions(+), 49 deletions(-) diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 7ef46e67..0f74e979 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -475,6 +475,16 @@ GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out, out.flags |= GNSS_LOCATION_INFO_TIME_UNC_BIT; out.timeUncMs = locationExtended.timeUncMs; } + + if (GPS_LOCATION_EXTENDED_HAS_CALIBRATION_CONFIDENCE & locationExtended.flags) { + out.flags |= GNSS_LOCATION_INFO_CALIBRATION_CONFIDENCE_BIT; + out.calibrationConfidence = locationExtended.calibrationConfidence; + } + + if (GPS_LOCATION_EXTENDED_HAS_CALIBRATION_STATUS & locationExtended.flags) { + out.flags |= GNSS_LOCATION_INFO_CALIBRATION_STATUS_BIT; + out.calibrationStatus = locationExtended.calibrationStatus; + } } diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h index 406a75cc..0d0753f8 100644 --- a/location/LocationDataTypes.h +++ b/location/LocationDataTypes.h @@ -172,8 +172,9 @@ typedef enum { GNSS_LOCATION_INFO_UP_VEL_UNC_BIT = (1<<21),// valid Up Velocity Uncertainty GNSS_LOCATION_INFO_LEAP_SECONDS_BIT = (1<<22),// valid leap seconds GNSS_LOCATION_INFO_TIME_UNC_BIT = (1<<23),// valid time uncertainty - GNSS_LOCATION_INFO_NUM_SV_USED_IN_POSITION_BIT = (1<<24) // number of SV used in position - + GNSS_LOCATION_INFO_NUM_SV_USED_IN_POSITION_BIT = (1<<24), // number of SV used in position + GNSS_LOCATION_INFO_CALIBRATION_CONFIDENCE_BIT = (1<<25), // valid sensor cal confidence + GNSS_LOCATION_INFO_CALIBRATION_STATUS_BIT = (1<<26), // valid sensor cal status } GnssLocationInfoFlagBits; typedef enum { @@ -601,6 +602,8 @@ typedef enum { GNSS_LOC_SV_SYSTEM_UNKNOWN = 0, /** unknown sv system. */ + GNSS_LOC_SV_SYSTEM_MIN = 1, + /**< Min enum of valid SV system. */ GNSS_LOC_SV_SYSTEM_GPS = 1, /**< GPS satellite. */ GNSS_LOC_SV_SYSTEM_GALILEO = 2, @@ -613,8 +616,10 @@ typedef enum /**< BDS satellite. */ GNSS_LOC_SV_SYSTEM_QZSS = 6, /**< QZSS satellite. */ - GNSS_LOC_SV_SYSTEM_NAVIC = 7 + GNSS_LOC_SV_SYSTEM_NAVIC = 7, /**< QZSS satellite. */ + GNSS_LOC_SV_SYSTEM_MAX = 7, + /**< Max enum of valid SV system. */ } Gnss_LocSvSystemEnumType; typedef enum { @@ -695,6 +700,20 @@ typedef struct { GnssAidingDataCommon common; // common aiding data } GnssAidingData; +typedef uint16_t DrCalibrationStatusMask; +typedef enum { + // Indicate that roll calibration is needed. Need to take more turns on level ground + DR_ROLL_CALIBRATION_NEEDED = (1<<0), + // Indicate that pitch calibration is needed. Need to take more turns on level ground + DR_PITCH_CALIBRATION_NEEDED = (1<<1), + // Indicate that yaw calibration is needed. Need to accelerate in a straight line + DR_YAW_CALIBRATION_NEEDED = (1<<2), + // Indicate that odo calibration is needed. Need to accelerate in a straight line + DR_ODO_CALIBRATION_NEEDED = (1<<3), + // Indicate that gyro calibration is needed. Need to take more turns on level ground + DR_GYRO_CALIBRATION_NEEDED = (1<<4) +} DrCalibrationStatusBits; + typedef struct { uint32_t size; // set to sizeof(Location) LocationFlagsMask flags; // bitwise OR of LocationFlagsBits to mark which params are valid @@ -975,6 +994,9 @@ typedef struct { GnssMeasUsageInfo measUsageInfo[GNSS_SV_MAX]; // GNSS Measurement Usage info uint8_t leapSeconds; // leap second float timeUncMs; // Time uncertainty in milliseconds + uint8_t calibrationConfidence; // Sensor calibration confidence percent, + // in range of [0, 100] + DrCalibrationStatusMask calibrationStatus; // Sensor calibration status } GnssLocationInfoNotification; typedef struct { diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index 1ccfc46f..d1a2811f 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -372,15 +372,19 @@ typedef uint64_t GpsLocationExtendedFlags; /** GpsLocationExtended has Clock drift*/ #define GPS_LOCATION_EXTENDED_HAS_CLOCK_DRIFT 0x20000000 /** GpsLocationExtended has Clock drift std deviation**/ -#define GPS_LOCATION_EXTENDED_HAS_CLOCK_DRIFT_STD_DEV 0x40000000 +#define GPS_LOCATION_EXTENDED_HAS_CLOCK_DRIFT_STD_DEV 0x40000000 /** GpsLocationExtended has leap seconds **/ -#define GPS_LOCATION_EXTENDED_HAS_LEAP_SECONDS 0x80000000 +#define GPS_LOCATION_EXTENDED_HAS_LEAP_SECONDS 0x80000000 /** GpsLocationExtended has time uncertainty **/ -#define GPS_LOCATION_EXTENDED_HAS_TIME_UNC 0x100000000 +#define GPS_LOCATION_EXTENDED_HAS_TIME_UNC 0x100000000 /** GpsLocationExtended has heading rate **/ -#define GPS_LOCATION_EXTENDED_HAS_HEADING_RATE 0x200000000 +#define GPS_LOCATION_EXTENDED_HAS_HEADING_RATE 0x200000000 /** GpsLocationExtended has multiband signals **/ -#define GPS_LOCATION_EXTENDED_HAS_MULTIBAND 0x400000000 +#define GPS_LOCATION_EXTENDED_HAS_MULTIBAND 0x400000000 +/** GpsLocationExtended has sensor calibration confidence */ +#define GPS_LOCATION_EXTENDED_HAS_CALIBRATION_CONFIDENCE 0x800000000 +/** GpsLocationExtended has sensor calibration status */ +#define GPS_LOCATION_EXTENDED_HAS_CALIBRATION_STATUS 0x1000000000 typedef uint32_t LocNavSolutionMask; /* Bitmask to specify whether SBAS ionospheric correction is used */ @@ -397,6 +401,8 @@ typedef uint32_t LocNavSolutionMask; #define LOC_NAV_MASK_RTK_CORRECTION ((LocNavSolutionMask)0x0020) /**< Bitmask to specify whether Position Report is PPP corrected */ #define LOC_NAV_MASK_PPP_CORRECTION ((LocNavSolutionMask)0x0040) +/**< Bitmask to specify whether Position Report is RTK fixed corrected */ +#define LOC_NAV_MASK_RTK_FIXED_CORRECTION ((LocNavSolutionMask)0x0080) typedef uint32_t LocPosDataMask; /* Bitmask to specify whether Navigation data has Forward Acceleration */ @@ -792,6 +798,9 @@ typedef struct { Range: 0 to 359.999. 946 Unit: Degrees per Seconds */ float headingRateDeg; + /** Sensor calibration confidence percent. Range: 0 - 100 */ + uint8_t calibrationConfidence; + DrCalibrationStatusMask calibrationStatus; } GpsLocationExtended; enum loc_sess_status { diff --git a/utils/loc_nmea.cpp b/utils/loc_nmea.cpp index abcf5b73..12f6ca68 100644 --- a/utils/loc_nmea.cpp +++ b/utils/loc_nmea.cpp @@ -880,7 +880,7 @@ static void loc_nmea_generate_DTM(const LocLla &ref_lla, } /*=========================================================================== -FUNCTION getUtcTimeWithLeapSecondTransition +FUNCTION get_utctime_with_leapsecond_transition DESCRIPTION This function returns true if the position report is generated during @@ -900,10 +900,12 @@ SIDE EFFECTS N/A ===========================================================================*/ -bool getUtcTimeWithLeapSecondTransition(const UlpLocation &location, - const GpsLocationExtended &locationExtended, - const LocationSystemInfo &systemInfo, - LocGpsUtcTime &utcPosTimestamp) { +static bool get_utctime_with_leapsecond_transition( + const UlpLocation &location, + const GpsLocationExtended &locationExtended, + const LocationSystemInfo &systemInfo, + LocGpsUtcTime &utcPosTimestamp) +{ bool inTransition = false; // position report is not generated during leap second transition, @@ -952,6 +954,94 @@ bool getUtcTimeWithLeapSecondTransition(const UlpLocation &location, return inTransition; } +/*=========================================================================== +FUNCTION loc_nmea_get_fix_quality + +DESCRIPTION + This function obtains the fix quality for GGA sentence, mode indicator + for RMC and VTG sentence based on nav solution mask and tech mask in + the postion report. + +DEPENDENCIES + NONE + +Output parameter + ggaGpsQuality: gps quality field in GGA sentence + rmcModeIndicator: mode indicator field in RMC sentence + vtgModeIndicator: mode indicator field in VTG sentence + +SIDE EFFECTS + N/A + +===========================================================================*/ +static void loc_nmea_get_fix_quality(const UlpLocation & location, + const GpsLocationExtended & locationExtended, + char & ggaGpsQuality, + char & rmcModeIndicator, + char & vtgModeIndicator) { + + ggaGpsQuality = '0'; + rmcModeIndicator = 'N'; + vtgModeIndicator = 'N'; + + do { + if (!(location.gpsLocation.flags & LOC_GPS_LOCATION_HAS_LAT_LONG)){ + ggaGpsQuality = '0'; // 0 means no fix + rmcModeIndicator = 'N'; + vtgModeIndicator = 'N'; + break; + } + // NOTE: Order of the check is important + if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_NAV_SOLUTION_MASK) { + if (LOC_NAV_MASK_PPP_CORRECTION & locationExtended.navSolutionMask) { + ggaGpsQuality = '2'; // 2 means DGPS fix + rmcModeIndicator = 'P'; // P means precise + vtgModeIndicator = 'P'; // P means precise + break; + } else if (LOC_NAV_MASK_RTK_FIXED_CORRECTION & locationExtended.navSolutionMask){ + ggaGpsQuality = '4'; // 4 means RTK Fixed fix + rmcModeIndicator = 'R'; // use R (RTK fixed) + vtgModeIndicator = 'D'; // use D (differential) as + // no RTK fixed defined for VTG in NMEA 183 spec + break; + } else if (LOC_NAV_MASK_RTK_CORRECTION & locationExtended.navSolutionMask){ + ggaGpsQuality = '5'; // 5 means RTK float fix + rmcModeIndicator = 'F'; // F means RTK float fix + vtgModeIndicator = 'D'; // use D (differential) as + // no RTK float defined for VTG in NMEA 183 spec + break; + } else if (LOC_NAV_MASK_DGNSS_CORRECTION & locationExtended.navSolutionMask){ + ggaGpsQuality = '2'; // 2 means DGPS fix + rmcModeIndicator = 'D'; // D means differential + vtgModeIndicator = 'D'; // D means differential + break; + } else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask){ + ggaGpsQuality = '2'; // 2 means DGPS fix + rmcModeIndicator = 'D'; // D means differential + vtgModeIndicator = 'D'; // D means differential + break; + } + } + // NOTE: Order of the check is important + if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_POS_TECH_MASK) { + if (LOC_POS_TECH_MASK_SATELLITE & locationExtended.tech_mask){ + ggaGpsQuality = '1'; // 1 means GPS + rmcModeIndicator = 'A'; // A means autonomous + vtgModeIndicator = 'A'; // A means autonomous + break; + } else if (LOC_POS_TECH_MASK_SENSORS & locationExtended.tech_mask){ + ggaGpsQuality = '6'; // 6 means estimated (dead reckoning) + rmcModeIndicator = 'E'; // E means estimated (dead reckoning) + vtgModeIndicator = 'E'; // E means estimated (dead reckoning) + break; + } + } + } while (0); + + LOC_LOGv("gps quality: %c, rmc mode indicator: %c, vtg mode indicator: %c", + ggaGpsQuality, rmcModeIndicator, vtgModeIndicator); +} + /*=========================================================================== FUNCTION loc_nmea_generate_pos @@ -987,7 +1077,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, LocGpsUtcTime utcPosTimestamp = 0; bool inLsTransition = false; - inLsTransition = getUtcTimeWithLeapSecondTransition + inLsTransition = get_utctime_with_leapsecond_transition (location, locationExtended, systemInfo, utcPosTimestamp); time_t utcTime(utcPosTimestamp/1000); @@ -1120,6 +1210,12 @@ void loc_nmea_generate_pos(const UlpLocation &location, talker[1] = sv_meta.talker[1]; } + char ggaGpsQuality = '0'; + char rmcModeIndicator = 'N'; + char vtgModeIndicator = 'N'; + loc_nmea_get_fix_quality(location, locationExtended, + ggaGpsQuality, rmcModeIndicator, vtgModeIndicator); + // ------------------- // ------$--VTG------- // ------------------- @@ -1174,17 +1270,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, pMarker += length; lengthRemaining -= length; - if (!(location.gpsLocation.flags & LOC_GPS_LOCATION_HAS_LAT_LONG)) - // N means no fix - length = snprintf(pMarker, lengthRemaining, "%c", 'N'); - else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - // D means differential - length = snprintf(pMarker, lengthRemaining, "%c", 'D'); - else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - // E means estimated (dead reckoning) - length = snprintf(pMarker, lengthRemaining, "%c", 'E'); - else // A means autonomous - length = snprintf(pMarker, lengthRemaining, "%c", 'A'); + length = snprintf(pMarker, lengthRemaining, "%c", vtgModeIndicator); length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); @@ -1372,18 +1458,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, pMarker += length; lengthRemaining -= length; - if (!(location.gpsLocation.flags & LOC_GPS_LOCATION_HAS_LAT_LONG)) - // N means no fix - length = snprintf(pMarker, lengthRemaining, "%c", 'N'); - else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - // D means differential - length = snprintf(pMarker, lengthRemaining, "%c", 'D'); - else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - // E means estimated (dead reckoning) - length = snprintf(pMarker, lengthRemaining, "%c", 'E'); - else // A means autonomous - length = snprintf(pMarker, lengthRemaining, "%c", 'A'); - + length = snprintf(pMarker, lengthRemaining, "%c", rmcModeIndicator); pMarker += length; lengthRemaining -= length; @@ -1600,28 +1675,18 @@ void loc_nmea_generate_pos(const UlpLocation &location, pMarker += length; lengthRemaining -= length; - char gpsQuality; - if (!(location.gpsLocation.flags & LOC_GPS_LOCATION_HAS_LAT_LONG)) - gpsQuality = '0'; // 0 means no fix - else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - gpsQuality = '2'; // 2 means DGPS fix - else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - gpsQuality = '6'; // 6 means estimated (dead reckoning) - else - gpsQuality = '1'; // 1 means GPS fix - // Number of satellites in use, 00-12 if (svUsedCount > MAX_SATELLITES_IN_USE) svUsedCount = MAX_SATELLITES_IN_USE; if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP) { length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,", - gpsQuality, svUsedCount, locationExtended.hdop); + ggaGpsQuality, svUsedCount, locationExtended.hdop); } else { // no hdop length = snprintf(pMarker, lengthRemaining, "%c,%02d,,", - gpsQuality, svUsedCount); + ggaGpsQuality, svUsedCount); } if (length < 0 || length >= lengthRemaining) From acf2aeaec83e44e0310b3927e6dec2820b390c3c Mon Sep 17 00:00:00 2001 From: Mike Cailean Date: Wed, 19 Jun 2019 10:43:16 -0700 Subject: [PATCH 11/12] NV is not set to blank when SUPL_HOST is set to NONE Change-Id: Ib53e30dde614a9bee348a41083e177a5999dcfc1 CRs-fixed: 2473365 --- gnss/GnssAdapter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 7ef46e67..5d5a0d51 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -659,7 +659,7 @@ GnssAdapter::setSuplHostServer(const char* server, int port, LocServerType type) LOC_LOGe("Invalid type=%d", type); } else { string& url = (LOC_AGPS_SUPL_SERVER == type) ? getServerUrl() : getMoServerUrl(); - if (length > 0 && strncasecmp(url.c_str(), serverUrl, sizeof(serverUrl)) != 0) { + if (length >= 0 && strncasecmp(url.c_str(), serverUrl, sizeof(serverUrl)) != 0) { url.assign(serverUrl); if (LOC_AGPS_SUPL_SERVER == type) { @@ -837,7 +837,7 @@ std::vector GnssAdapter::gnssUpdateConfig(const std::string& oldS GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { if (gnssConfigNeedEngineUpdate.assistanceServer.type == GNSS_ASSISTANCE_TYPE_SUPL) { - if ((serverUrlLen != 0) && (oldServerUrl.compare(serverUrl) !=0)) { + if (0 != oldServerUrl.compare(serverUrl)) { err = mLocApi->setServerSync( serverUrl.c_str(), serverUrlLen, LOC_AGPS_SUPL_SERVER); @@ -845,7 +845,7 @@ std::vector GnssAdapter::gnssUpdateConfig(const std::string& oldS errsList[index] = err; } } - if ((moServerUrlLen != 0) && (oldMoServerUrl.compare(moServerUrl) != 0)) { + if (0 != oldMoServerUrl.compare(moServerUrl)) { LocationError locErr = mLocApi->setServerSync(moServerUrl.c_str(), moServerUrlLen, From 333e69585b2f89705fd68b1c2bfeb7981a383def Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Wed, 5 Jun 2019 15:29:31 -0700 Subject: [PATCH 12/12] Loc Ipc: add routine to notify sender that receiver has restarted When qrtr socket receiver has restarted, need a way to inform sender so sender can restart the service discovery process Change-Id: Id665da649e0962691277124b42f1ee9cc6160fa8 CRs-fixed: 2445555 --- utils/LocIpc.h | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/LocIpc.h b/utils/LocIpc.h index 42fbff31..af4c2c3a 100644 --- a/utils/LocIpc.h +++ b/utils/LocIpc.h @@ -127,6 +127,7 @@ protected: virtual bool isOperable() const = 0; virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t msgId) const = 0; public: + virtual void informRecverRestarted() {} inline bool isSendable() const { return isOperable(); } inline bool sendData(const uint8_t data[], uint32_t length, int32_t msgId) const { return isSendable() && (send(data, length, msgId) > 0);