diff --git a/android/1.0/AGnssRil.cpp b/android/1.0/AGnssRil.cpp index 0ab4fadd..0437cf15 100644 --- a/android/1.0/AGnssRil.cpp +++ b/android/1.0/AGnssRil.cpp @@ -102,7 +102,7 @@ Return AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } break; } - mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout); + mGnss->getGnssInterface()->updateConnectionStatus(connected, false, typeout, 0); } return true; } diff --git a/android/1.1/AGnssRil.cpp b/android/1.1/AGnssRil.cpp index 96e3597a..1e774f1a 100644 --- a/android/1.1/AGnssRil.cpp +++ b/android/1.1/AGnssRil.cpp @@ -102,7 +102,7 @@ Return AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } break; } - mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout); + mGnss->getGnssInterface()->updateConnectionStatus(connected, false, typeout, 0); } return true; } diff --git a/android/2.0/Gnss.cpp b/android/2.0/Gnss.cpp index 4fa5b63a..af76b727 100644 --- a/android/2.0/Gnss.cpp +++ b/android/2.0/Gnss.cpp @@ -170,6 +170,23 @@ const GnssInterface* Gnss::getGnssInterface() { Return Gnss::setCallback(const sp& callback) { ENTRY_LOG_CALLFLOW(); + + // In case where previous call to setCallback_1_1 or setCallback_2_0, then + // we need to cleanup these interfaces/callbacks here since we no longer + // do so in cleanup() function to keep callbacks around after cleanup() + if (mApi != nullptr) { + mApi->gnssUpdateCallbacks_2_0(nullptr); + } + if (mGnssCbIface_1_1 != nullptr) { + mGnssCbIface_1_1->unlinkToDeath(mGnssDeathRecipient); + mGnssCbIface_1_1 = nullptr; + } + if (mGnssCbIface_2_0 != nullptr) { + mGnssCbIface_2_0->unlinkToDeath(mGnssDeathRecipient); + mGnssCbIface_2_0 = nullptr; + } + + if (mGnssCbIface != nullptr) { mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); } @@ -291,21 +308,6 @@ Return Gnss::cleanup() { if (mApi != nullptr) { mApi->gnssStop(); mApi->gnssDisable(); - mApi->gnssUpdateCallbacks(nullptr, nullptr); - mApi->gnssUpdateCallbacks_2_0(nullptr); - } - mGnssNiCbIface = nullptr; - if (mGnssCbIface != nullptr) { - mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); - mGnssCbIface = nullptr; - } - if (mGnssCbIface_1_1 != nullptr) { - mGnssCbIface_1_1->unlinkToDeath(mGnssDeathRecipient); - mGnssCbIface_1_1 = nullptr; - } - if (mGnssCbIface_2_0 != nullptr) { - mGnssCbIface_2_0->unlinkToDeath(mGnssDeathRecipient); - mGnssCbIface_2_0 = nullptr; } return Void(); @@ -417,6 +419,23 @@ Return Gnss::setCallback_1_1(const sp& callback) { LOC_LOGE("%s] Error from gnssNameCb description=%s", __func__, r.description().c_str()); } + + // In case where previous call to setCallback or setCallback_2_1, then + // we need to cleanup these interfaces/callbacks here since we no longer + // do so in cleanup() function to keep callbacks around after cleanup() + if (mApi != nullptr) { + mApi->gnssUpdateCallbacks_2_0(nullptr); + } + if (mGnssCbIface != nullptr) { + mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); + mGnssCbIface = nullptr; + } + if (mGnssCbIface_2_0 != nullptr) { + mGnssCbIface_2_0->unlinkToDeath(mGnssDeathRecipient); + mGnssCbIface_2_0 = nullptr; + } + + if (mGnssCbIface_1_1 != nullptr) { mGnssCbIface_1_1->unlinkToDeath(mGnssDeathRecipient); } @@ -497,6 +516,7 @@ void Gnss::odcpiRequestCb(const OdcpiRequestInfo& request) { // For emergency mode, request DBH (Device based hybrid) location // Mark Independent from GNSS flag to false. if (ODCPI_REQUEST_TYPE_START == request.type) { + LOC_LOGd("gnssRequestLocationCb_2_0 isUserEmergency = %d", request.isEmergencyMode); auto r = mGnssCbIface_2_0->gnssRequestLocationCb_2_0(!request.isEmergencyMode, request.isEmergencyMode); if (!r.isOk()) { @@ -529,6 +549,23 @@ Return Gnss::setCallback_2_0(const sp& callback) { LOC_LOGE("%s] Error from gnssNameCb description=%s", __func__, r.description().c_str()); } + + // In case where previous call to setCallback or setCallback_1_1, then + // we need to cleanup these interfaces/callbacks here since we no longer + // do so in cleanup() function to keep callbacks around after cleanup() + if (mApi != nullptr) { + mApi->gnssUpdateCallbacks(nullptr, nullptr); + } + mGnssNiCbIface = nullptr; + if (mGnssCbIface != nullptr) { + mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); + mGnssCbIface = nullptr; + } + if (mGnssCbIface_1_1 != nullptr) { + mGnssCbIface_1_1->unlinkToDeath(mGnssDeathRecipient); + mGnssCbIface_1_1 = nullptr; + } + if (mGnssCbIface_2_0 != nullptr) { mGnssCbIface_2_0->unlinkToDeath(mGnssDeathRecipient); } diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 5eb7b91c..9413def6 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -97,8 +97,7 @@ GnssAdapter::GnssAdapter() : mPowerStateCb(nullptr), mIsE911Session(NULL), mGnssMbSvIdUsedInPosition{}, - mGnssMbSvIdUsedInPosAvail(false), - mGnssSignalType() + mGnssMbSvIdUsedInPosAvail(false) { LOC_LOGD("%s]: Constructor %p", __func__, this); mLocPositionMode.mode = LOC_POSITION_MODE_INVALID; @@ -1089,12 +1088,7 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config) if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT) { uint32_t newSuplVersion = mAdapter.convertSuplVersion(gnssConfigRequested.suplVersion); - if (newSuplVersion != ContextBase::mGps_conf.SUPL_VER && - ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - ContextBase::mGps_conf.SUPL_VER = newSuplVersion; - } else { - gnssConfigNeedEngineUpdate.flags &= ~(GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT); - } + ContextBase::mGps_conf.SUPL_VER = newSuplVersion; index++; } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { @@ -1113,47 +1107,26 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config) } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT) { uint32_t newLppProfile = mAdapter.convertLppProfile(gnssConfigRequested.lppProfile); - if (newLppProfile != ContextBase::mGps_conf.LPP_PROFILE && - ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - ContextBase::mGps_conf.LPP_PROFILE = newLppProfile; - } else { - gnssConfigNeedEngineUpdate.flags &= ~(GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT); - } + ContextBase::mGps_conf.LPP_PROFILE = newLppProfile; index++; } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT) { uint32_t newLppeControlPlaneMask = - mAdapter.convertLppeCp(gnssConfigRequested.lppeControlPlaneMask); - if (newLppeControlPlaneMask != ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY) { - ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY = newLppeControlPlaneMask; - } else { - gnssConfigNeedEngineUpdate.flags &= - ~(GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT); - } + mAdapter.convertLppeCp(gnssConfigRequested.lppeControlPlaneMask); + ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY = newLppeControlPlaneMask; index++; } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT) { uint32_t newLppeUserPlaneMask = - mAdapter.convertLppeUp(gnssConfigRequested.lppeUserPlaneMask); - if (newLppeUserPlaneMask != ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY) { - ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY = newLppeUserPlaneMask; - } else { - gnssConfigNeedEngineUpdate.flags &= - ~(GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT); - } + mAdapter.convertLppeUp(gnssConfigRequested.lppeUserPlaneMask); + ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY = newLppeUserPlaneMask; index++; } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT) { uint32_t newAGloProtMask = - mAdapter.convertAGloProt(gnssConfigRequested.aGlonassPositionProtocolMask); - if (newAGloProtMask != ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT && - ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT = newAGloProtMask; - } else { - gnssConfigNeedEngineUpdate.flags &= - ~(GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT); - } + mAdapter.convertAGloProt(gnssConfigRequested.aGlonassPositionProtocolMask); + ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT = newAGloProtMask; index++; } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT) { @@ -1174,10 +1147,8 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config) } if (gnssConfigRequested.flags & GNSS_CONFIG_FLAGS_SUPL_MODE_BIT) { uint32_t newSuplMode = mAdapter.convertSuplMode(gnssConfigRequested.suplModeMask); - if (newSuplMode != ContextBase::mGps_conf.SUPL_MODE) { - ContextBase::mGps_conf.SUPL_MODE = newSuplMode; - mAdapter.broadcastCapabilities(mAdapter.getCapabilities()); - } + ContextBase::mGps_conf.SUPL_MODE = newSuplMode; + mAdapter.broadcastCapabilities(mAdapter.getCapabilities()); index++; } @@ -3206,9 +3177,6 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation, if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MULTIBAND) { mGnssMbSvIdUsedInPosAvail = true; mGnssMbSvIdUsedInPosition = locationExtended.gnss_mb_sv_used_ids; - for (int i = 0; i < GNSS_SV_MAX; i++) { - mGnssSignalType[i] = locationExtended.measUsageInfo[i].gnssSignalType; - } } } @@ -3277,11 +3245,12 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) for (int i=0; i < numSv; i++) { svUsedIdMask = 0; gnssSvId = svNotify.gnssSvs[i].svId; + GnssSignalTypeMask signalTypeMask = svNotify.gnssSvs[i].gnssSignalTypeMask; switch (svNotify.gnssSvs[i].type) { case GNSS_SV_TYPE_GPS: if (mGnssSvIdUsedInPosAvail) { if (mGnssMbSvIdUsedInPosAvail) { - switch (mGnssSignalType[i]) { + switch (signalTypeMask) { case GNSS_SIGNAL_GPS_L1CA: svUsedIdMask = mGnssMbSvIdUsedInPosition.gps_l1ca_sv_used_ids_mask; break; @@ -3303,7 +3272,7 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) case GNSS_SV_TYPE_GLONASS: if (mGnssSvIdUsedInPosAvail) { if (mGnssMbSvIdUsedInPosAvail) { - switch (mGnssSignalType[i]) { + switch (signalTypeMask) { case GNSS_SIGNAL_GLONASS_G1: svUsedIdMask = mGnssMbSvIdUsedInPosition.glo_g1_sv_used_ids_mask; break; @@ -3319,7 +3288,7 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) case GNSS_SV_TYPE_BEIDOU: if (mGnssSvIdUsedInPosAvail) { if (mGnssMbSvIdUsedInPosAvail) { - switch (mGnssSignalType[i]) { + switch (signalTypeMask) { case GNSS_SIGNAL_BEIDOU_B1I: svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b1i_sv_used_ids_mask; break; @@ -3344,7 +3313,7 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) case GNSS_SV_TYPE_GALILEO: if (mGnssSvIdUsedInPosAvail) { if (mGnssMbSvIdUsedInPosAvail) { - switch (mGnssSignalType[i]) { + switch (signalTypeMask) { case GNSS_SIGNAL_GALILEO_E1: svUsedIdMask = mGnssMbSvIdUsedInPosition.gal_e1_sv_used_ids_mask; break; @@ -3363,7 +3332,7 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) case GNSS_SV_TYPE_QZSS: if (mGnssSvIdUsedInPosAvail) { if (mGnssMbSvIdUsedInPosAvail) { - switch (mGnssSignalType[i]) { + switch (signalTypeMask) { case GNSS_SIGNAL_QZSS_L1CA: svUsedIdMask = mGnssMbSvIdUsedInPosition.qzss_l1ca_sv_used_ids_mask; break; diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h index 1e6d1b8d..9a727a20 100644 --- a/gnss/GnssAdapter.h +++ b/gnss/GnssAdapter.h @@ -147,7 +147,6 @@ class GnssAdapter : public LocAdapterBase { bool mGnssSvIdUsedInPosAvail; GnssSvMbUsedInPosition mGnssMbSvIdUsedInPosition; bool mGnssMbSvIdUsedInPosAvail; - GnssSignalTypeMask mGnssSignalType[GNSS_SV_MAX]; /* ==== CONTROL ======================================================================== */ LocationControlCallbacks mControlCallbacks; diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h index 0d0753f8..49822fa5 100644 --- a/location/LocationDataTypes.h +++ b/location/LocationDataTypes.h @@ -596,7 +596,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_BEIDOU_B2AQ + GNSS_SIGNAL_NAVIC_L5 | GNSS_SIGNAL_BEIDOU_B2AQ) typedef enum { diff --git a/utils/LocIpc.cpp b/utils/LocIpc.cpp index e8578174..f4dd0b40 100644 --- a/utils/LocIpc.cpp +++ b/utils/LocIpc.cpp @@ -193,7 +193,8 @@ public: 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)}}) { + 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) { @@ -222,12 +223,14 @@ public: }; class LocIpcInetRecver : public LocIpcInetSender, public LocIpcRecver { + int32_t mPort; 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) { + LocIpcInetSender(name, port, sockType), LocIpcRecver(listener, *this), + mPort(port) { 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(); @@ -237,7 +240,9 @@ public: 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)); + sockaddr_in loopBackAddr = {.sin_family = AF_INET, .sin_port = htons(mPort), + .sin_addr = {htonl(INADDR_LOOPBACK)}}; + mSock->sendAbort(0, (struct sockaddr*)&loopBackAddr, sizeof(loopBackAddr)); } } diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index d1a2811f..3396b99c 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -449,17 +449,6 @@ typedef uint32_t GnssAdditionalSystemInfoMask; #define NAVIC_SV_PRN_MIN 401 #define NAVIC_SV_PRN_MAX 414 -typedef uint32_t LocPosTechMask; -#define LOC_POS_TECH_MASK_DEFAULT ((LocPosTechMask)0x00000000) -#define LOC_POS_TECH_MASK_SATELLITE ((LocPosTechMask)0x00000001) -#define LOC_POS_TECH_MASK_CELLID ((LocPosTechMask)0x00000002) -#define LOC_POS_TECH_MASK_WIFI ((LocPosTechMask)0x00000004) -#define LOC_POS_TECH_MASK_SENSORS ((LocPosTechMask)0x00000008) -#define LOC_POS_TECH_MASK_REFERENCE_LOCATION ((LocPosTechMask)0x00000010) -#define LOC_POS_TECH_MASK_INJECTED_COARSE_POSITION ((LocPosTechMask)0x00000020) -#define LOC_POS_TECH_MASK_AFLT ((LocPosTechMask)0x00000040) -#define LOC_POS_TECH_MASK_HYBRID ((LocPosTechMask)0x00000080) - typedef enum { LOC_RELIABILITY_NOT_SET = 0, LOC_RELIABILITY_VERY_LOW = 1, @@ -1393,16 +1382,15 @@ typedef uint64_t GpsSvMeasHeaderFlags; #define GNSS_SV_MEAS_HEADER_HAS_GAL_SYSTEM_TIME_EXT 0x00008000 #define GNSS_SV_MEAS_HEADER_HAS_BDS_SYSTEM_TIME_EXT 0x00010000 #define GNSS_SV_MEAS_HEADER_HAS_QZSS_SYSTEM_TIME_EXT 0x00020000 -#define GNSS_SV_MEAS_HEADER_HAS_GPSL1L5_TIME_BIAS 0x00040000 -#define GNSS_SV_MEAS_HEADER_HAS_GALE1E5A_TIME_BIAS 0x00080000 -#define GNSS_SV_MEAS_HEADER_HAS_GPS_NAVIC_INTER_SYSTEM_BIAS 0x00100000 -#define GNSS_SV_MEAS_HEADER_HAS_GAL_NAVIC_INTER_SYSTEM_BIAS 0x00200000 -#define GNSS_SV_MEAS_HEADER_HAS_GLO_NAVIC_INTER_SYSTEM_BIAS 0x00400000 -#define GNSS_SV_MEAS_HEADER_HAS_BDS_NAVIC_INTER_SYSTEM_BIAS 0x00800000 -#define GNSS_SV_MEAS_HEADER_HAS_NAVIC_SYSTEM_TIME 0x01000000 -#define GNSS_SV_MEAS_HEADER_HAS_NAVIC_SYSTEM_TIME_EXT 0x02000000 - - +#define GNSS_SV_MEAS_HEADER_HAS_GLO_SYSTEM_TIME_EXT 0x00040000 +#define GNSS_SV_MEAS_HEADER_HAS_GPSL1L5_TIME_BIAS 0x00080000 +#define GNSS_SV_MEAS_HEADER_HAS_GALE1E5A_TIME_BIAS 0x00100000 +#define GNSS_SV_MEAS_HEADER_HAS_GPS_NAVIC_INTER_SYSTEM_BIAS 0x00200000 +#define GNSS_SV_MEAS_HEADER_HAS_GAL_NAVIC_INTER_SYSTEM_BIAS 0x00400000 +#define GNSS_SV_MEAS_HEADER_HAS_GLO_NAVIC_INTER_SYSTEM_BIAS 0x00800000 +#define GNSS_SV_MEAS_HEADER_HAS_BDS_NAVIC_INTER_SYSTEM_BIAS 0x01000000 +#define GNSS_SV_MEAS_HEADER_HAS_NAVIC_SYSTEM_TIME 0x02000000 +#define GNSS_SV_MEAS_HEADER_HAS_NAVIC_SYSTEM_TIME_EXT 0x04000000 typedef struct { @@ -1444,9 +1432,10 @@ typedef struct Gnss_LocGnssTimeExtStructType bdsSystemTimeExt; /** QZSS system RTC time information. */ Gnss_LocGnssTimeExtStructType qzssSystemTimeExt; + /** GLONASS system RTC time information. */ + Gnss_LocGnssTimeExtStructType gloSystemTimeExt; /** NAVIC system RTC time information. */ Gnss_LocGnssTimeExtStructType navicSystemTimeExt; - } GnssSvMeasurementHeader; typedef struct {