Support GnssMeasurement

Support the new GnssMeasurement and GnssClock
data structures for the new gps.h

Change-Id: I40e00711501432760c82d27fb82702b1bf57ebb6
This commit is contained in:
Mike Cailean 2016-04-06 15:40:25 -07:00 committed by Dante Russo
parent d30694acf6
commit c3a4fba9b8
15 changed files with 154 additions and 144 deletions

View file

@ -80,7 +80,7 @@ void LocAdapterBase::
} }
void LocAdapterBase:: void LocAdapterBase::
reportSv(QtiGnssSvStatus &svStatus, reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt) void* svExt)
DEFAULT_IMPL() DEFAULT_IMPL()
@ -137,6 +137,6 @@ bool LocAdapterBase::
DEFAULT_IMPL(false) DEFAULT_IMPL(false)
void LocAdapterBase:: void LocAdapterBase::
reportGpsMeasurementData(GpsData &gpsMeasurementData) reportGnssMeasurementData(GnssData &gnssMeasurementData)
DEFAULT_IMPL() DEFAULT_IMPL()
} // namespace loc_core } // namespace loc_core

View file

@ -98,7 +98,7 @@ public:
void* locationExt, void* locationExt,
enum loc_sess_status status, enum loc_sess_status status,
LocPosTechMask loc_technology_mask); LocPosTechMask loc_technology_mask);
virtual void reportSv(QtiGnssSvStatus &svStatus, virtual void reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt); void* svExt);
virtual void reportStatus(GpsStatusValue status); virtual void reportStatus(GpsStatusValue status);
@ -117,7 +117,7 @@ public:
const void* data); const void* data);
inline virtual bool isInSession() { return false; } inline virtual bool isInSession() { return false; }
ContextBase* getContext() const { return mContext; } ContextBase* getContext() const { return mContext; }
virtual void reportGpsMeasurementData(GpsData &gpsMeasurementData); virtual void reportGnssMeasurementData(GnssData &gnssMeasurementData);
}; };
} // namespace loc_core } // namespace loc_core

View file

@ -253,23 +253,21 @@ void LocApiBase::reportPosition(UlpLocation &location,
); );
} }
void LocApiBase::reportSv(QtiGnssSvStatus &svStatus, void LocApiBase::reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt) void* svExt)
{ {
// print the SV info before delivering // print the SV info before delivering
LOC_LOGV("num sv: %d\n ephemeris mask: %dxn almanac mask: %x\n gps/glo/bds in use" LOC_LOGV("num sv: %d", svStatus.num_svs);
" mask: %x/%x/%x\n sv: prn snr elevation azimuth", for (int i = 0; i < svStatus.num_svs && i < GNSS_MAX_SVS; i++) {
svStatus.num_svs, svStatus.ephemeris_mask, LOC_LOGV(" %03d: %02d %d %f %f %f 0x%02X",
svStatus.almanac_mask, svStatus.gps_used_in_fix_mask,
svStatus.glo_used_in_fix_mask, svStatus.bds_used_in_fix_mask);
for (int i = 0; i < svStatus.num_svs && i < GPS_MAX_SVS; i++) {
LOC_LOGV(" %d: %d %f %f %f",
i, i,
svStatus.sv_list[i].prn, svStatus.gnss_sv_list[i].svid,
svStatus.sv_list[i].snr, svStatus.gnss_sv_list[i].constellation,
svStatus.sv_list[i].elevation, svStatus.gnss_sv_list[i].c_n0_dbhz,
svStatus.sv_list[i].azimuth); svStatus.gnss_sv_list[i].elevation,
svStatus.gnss_sv_list[i].azimuth,
svStatus.gnss_sv_list[i].flags);
} }
// loop through adapters, and deliver to all adapters. // loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS( TO_ALL_LOCADAPTERS(
@ -364,10 +362,10 @@ void* LocApiBase :: getSibling()
LocApiProxyBase* LocApiBase :: getLocApiProxy() LocApiProxyBase* LocApiBase :: getLocApiProxy()
DEFAULT_IMPL(NULL) DEFAULT_IMPL(NULL)
void LocApiBase::reportGpsMeasurementData(GpsData &gpsMeasurementData) void LocApiBase::reportGnssMeasurementData(GnssData &gnssMeasurementData)
{ {
// loop through adapters, and deliver to all adapters. // loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportGpsMeasurementData(gpsMeasurementData)); TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportGnssMeasurementData(gnssMeasurementData));
} }
enum loc_api_adapter_err LocApiBase:: enum loc_api_adapter_err LocApiBase::

View file

@ -113,7 +113,7 @@ public:
enum loc_sess_status status, enum loc_sess_status status,
LocPosTechMask loc_technology_mask = LocPosTechMask loc_technology_mask =
LOC_POS_TECH_MASK_DEFAULT); LOC_POS_TECH_MASK_DEFAULT);
void reportSv(QtiGnssSvStatus &svStatus, void reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt); void* svExt);
void reportStatus(GpsStatusValue status); void reportStatus(GpsStatusValue status);
@ -130,7 +130,7 @@ public:
void reportDataCallClosed(); void reportDataCallClosed();
void requestNiNotify(GpsNiNotification &notify, const void* data); void requestNiNotify(GpsNiNotification &notify, const void* data);
void saveSupportedMsgList(uint64_t supportedMsgList); void saveSupportedMsgList(uint64_t supportedMsgList);
void reportGpsMeasurementData(GpsData &gpsMeasurementData); void reportGnssMeasurementData(GnssData &gnssMeasurementData);
// downward calls // downward calls
// All below functions are to be defined by adapter specific modules: // All below functions are to be defined by adapter specific modules:

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -64,7 +64,7 @@ public:
(void)loc_technology_mask; (void)loc_technology_mask;
return false; return false;
} }
inline virtual bool reportSv(QtiGnssSvStatus &svStatus, inline virtual bool reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt) { void* svExt) {
(void)svStatus; (void)svStatus;

View file

@ -266,47 +266,6 @@ typedef struct {
float horUncEllipseOrientAzimuth; float horUncEllipseOrientAzimuth;
} GpsLocationExtended; } GpsLocationExtended;
/** Represents SV status. */
typedef struct {
/** set to sizeof(QtiGnssSvStatus) */
size_t size;
/** Number of SVs currently visible. */
int num_svs;
/** Contains an array of SV information. */
GpsSvInfo sv_list[GPS_MAX_SVS];
/** Represents a bit mask indicating which SVs
* have ephemeris data.
*/
uint32_t ephemeris_mask;
/** Represents a bit mask indicating which SVs
* have almanac data.
*/
uint32_t almanac_mask;
/**
* Represents a bit mask indicating which GPS SVs
* were used for computing the most recent position fix.
*/
uint32_t gps_used_in_fix_mask;
/**
* Represents a bit mask indicating which GLONASS SVs
* were used for computing the most recent position fix.
*/
uint32_t glo_used_in_fix_mask;
/**
* Represents a bit mask indicating which BDS SVs
* were used for computing the most recent position fix.
*/
uint64_t bds_used_in_fix_mask;
} QtiGnssSvStatus;
enum loc_sess_status { enum loc_sess_status {
LOC_SESS_SUCCESS, LOC_SESS_SUCCESS,
LOC_SESS_INTERMEDIATE, LOC_SESS_INTERMEDIATE,

View file

@ -375,14 +375,14 @@ void LocEngAdapter::reportPosition(UlpLocation &location,
} }
} }
void LocInternalAdapter::reportSv(QtiGnssSvStatus &svStatus, void LocInternalAdapter::reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt){ void* svExt){
sendMsg(new LocEngReportSv(mLocEngAdapter, svStatus, sendMsg(new LocEngReportSv(mLocEngAdapter, svStatus,
locationExtended, svExt)); locationExtended, svExt));
} }
void LocEngAdapter::reportSv(QtiGnssSvStatus &svStatus, void LocEngAdapter::reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt) void* svExt)
{ {
@ -564,10 +564,10 @@ enum loc_api_adapter_err LocEngAdapter::setXtraVersionCheck(int check)
return ret; return ret;
} }
void LocEngAdapter::reportGpsMeasurementData(GpsData &gpsMeasurementData) void LocEngAdapter::reportGnssMeasurementData(GnssData &gnssMeasurementData)
{ {
sendMsg(new LocEngReportGpsMeasurement(mOwner, sendMsg(new LocEngReportGnssMeasurement(mOwner,
gpsMeasurementData)); gnssMeasurementData));
} }
/* /*

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -55,7 +55,7 @@ public:
void* locationExt, void* locationExt,
enum loc_sess_status status, enum loc_sess_status status,
LocPosTechMask loc_technology_mask); LocPosTechMask loc_technology_mask);
virtual void reportSv(QtiGnssSvStatus &svStatus, virtual void reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt); void* svExt);
virtual void reportStatus(GpsStatusValue status); virtual void reportStatus(GpsStatusValue status);
@ -85,6 +85,7 @@ public:
bool mSupportsAgpsRequests; bool mSupportsAgpsRequests;
bool mSupportsPositionInjection; bool mSupportsPositionInjection;
bool mSupportsTimeInjection; bool mSupportsTimeInjection;
GnssSystemInfo mGnssInfo;
LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask, LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
void* owner, ContextBase* context, void* owner, ContextBase* context,
@ -269,7 +270,7 @@ public:
void* locationExt, void* locationExt,
enum loc_sess_status status, enum loc_sess_status status,
LocPosTechMask loc_technology_mask); LocPosTechMask loc_technology_mask);
virtual void reportSv(QtiGnssSvStatus &svStatus, virtual void reportSv(GnssSvStatus &svStatus,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* svExt); void* svExt);
virtual void reportStatus(GpsStatusValue status); virtual void reportStatus(GpsStatusValue status);
@ -284,7 +285,7 @@ public:
virtual bool requestSuplES(int connHandle); virtual bool requestSuplES(int connHandle);
virtual bool reportDataCallOpened(); virtual bool reportDataCallOpened();
virtual bool reportDataCallClosed(); virtual bool reportDataCallClosed();
virtual void reportGpsMeasurementData(GpsData &gpsMeasurementData); virtual void reportGnssMeasurementData(GnssData &gnssMeasurementData);
inline const LocPosMode& getPositionMode() const inline const LocPosMode& getPositionMode() const
{return mFixCriteria;} {return mFixCriteria;}

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -285,6 +285,7 @@ static int loc_init(GpsCallbacks* callbacks)
} }
event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT | event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT |
LOC_API_ADAPTER_BIT_SATELLITE_REPORT | LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST | LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST | LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
@ -304,6 +305,8 @@ static int loc_init(GpsCallbacks* callbacks)
NULL, /* location_ext_parser */ NULL, /* location_ext_parser */
NULL, /* sv_ext_parser */ NULL, /* sv_ext_parser */
callbacks->request_utc_time_cb, /* request_utc_time_cb */ callbacks->request_utc_time_cb, /* request_utc_time_cb */
callbacks->set_system_info_cb, /* set_system_info_cb */
callbacks->gnss_sv_status_cb, /* gnss_sv_status_cb */
}; };
gps_loc_cb = callbacks->location_cb; gps_loc_cb = callbacks->location_cb;

View file

@ -57,6 +57,8 @@ typedef struct {
loc_ext_parser location_ext_parser; loc_ext_parser location_ext_parser;
loc_ext_parser sv_ext_parser; loc_ext_parser sv_ext_parser;
gps_request_utc_time request_utc_time_cb; gps_request_utc_time request_utc_time_cb;
gnss_set_system_info set_system_info_cb;
gnss_sv_status_callback gnss_sv_status_cb;
} LocCallbacks; } LocCallbacks;
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2009-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2009-2016, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -828,7 +828,7 @@ void LocEngReportPosition::send() const {
// case LOC_ENG_MSG_REPORT_SV: // case LOC_ENG_MSG_REPORT_SV:
LocEngReportSv::LocEngReportSv(LocAdapterBase* adapter, LocEngReportSv::LocEngReportSv(LocAdapterBase* adapter,
QtiGnssSvStatus &sv, GnssSvStatus &sv,
GpsLocationExtended &locExtended, GpsLocationExtended &locExtended,
void* svExt) : void* svExt) :
LocMsg(), mAdapter(adapter), mSvStatus(sv), LocMsg(), mAdapter(adapter), mSvStatus(sv),
@ -845,9 +845,9 @@ void LocEngReportSv::proc() const {
if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION)
{ {
if (locEng->sv_status_cb != NULL) { if (locEng->gnss_sv_status_cb != NULL) {
locEng->sv_status_cb((GpsSvStatus*)&(mSvStatus), LOC_LOGE("Calling gnss_sv_status_cb");
(void*)mSvExt); locEng->gnss_sv_status_cb((GnssSvStatus*)&(mSvStatus));
} }
if (locEng->generateNmea) if (locEng->generateNmea)
@ -1376,6 +1376,32 @@ struct LocEngSetCapabilities : public LocMsg {
} }
}; };
struct LocEngSetSystemInfo : public LocMsg {
loc_eng_data_s_type* mLocEng;
inline LocEngSetSystemInfo(loc_eng_data_s_type* locEng) :
LocMsg(), mLocEng(locEng)
{
locallog();
}
inline virtual void proc() const {
if (NULL != mLocEng->set_capabilities_cb) {
LOC_LOGV("calling set_system_info_cb 0x%x",
mLocEng->adapter->mGnssInfo.year_of_hw);
mLocEng->set_system_info_cb(&(mLocEng->adapter->mGnssInfo));
}
else {
LOC_LOGV("set_system_info_cb is NULL.\n");
}
}
inline void locallog() const
{
LOC_LOGV("LocEngSetSystemInfo");
}
inline virtual void log() const
{
locallog();
}
};
// case LOC_ENG_MSG_LOC_INIT: // case LOC_ENG_MSG_LOC_INIT:
struct LocEngInit : public LocMsg { struct LocEngInit : public LocMsg {
loc_eng_data_s_type* mLocEng; loc_eng_data_s_type* mLocEng;
@ -1388,6 +1414,7 @@ struct LocEngInit : public LocMsg {
loc_eng_reinit(*mLocEng); loc_eng_reinit(*mLocEng);
// set the capabilities // set the capabilities
mLocEng->adapter->sendMsg(new LocEngSetCapabilities(mLocEng)); mLocEng->adapter->sendMsg(new LocEngSetCapabilities(mLocEng));
mLocEng->adapter->sendMsg(new LocEngSetSystemInfo(mLocEng));
} }
inline void locallog() const inline void locallog() const
{ {
@ -1607,10 +1634,13 @@ struct LocEngGnssConstellationConfig : public LocMsg {
locallog(); locallog();
} }
inline virtual void proc() const { inline virtual void proc() const {
mAdapter->mGnssInfo.size = sizeof(GnssSystemInfo);
if (mAdapter->gnssConstellationConfig()) { if (mAdapter->gnssConstellationConfig()) {
LOC_LOGV("Modem supports GNSS measurements\n"); LOC_LOGV("Modem supports GNSS measurements\n");
gps_conf.CAPABILITIES |= GPS_CAPABILITY_MEASUREMENTS; gps_conf.CAPABILITIES |= GPS_CAPABILITY_MEASUREMENTS;
mAdapter->mGnssInfo.year_of_hw = 2016;
} else { } else {
mAdapter->mGnssInfo.year_of_hw = 2015;
LOC_LOGV("Modem does not support GNSS measurements\n"); LOC_LOGV("Modem does not support GNSS measurements\n");
} }
} }
@ -1623,50 +1653,59 @@ struct LocEngGnssConstellationConfig : public LocMsg {
}; };
// case LOC_ENG_MSG_REPORT_GNSS_MEASUREMENT: // case LOC_ENG_MSG_REPORT_GNSS_MEASUREMENT:
LocEngReportGpsMeasurement::LocEngReportGpsMeasurement(void* locEng, LocEngReportGnssMeasurement::LocEngReportGnssMeasurement(void* locEng,
GpsData &gpsData) : GnssData &gnssData) :
LocMsg(), mLocEng(locEng), mGpsData(gpsData) LocMsg(), mLocEng(locEng), mGnssData(gnssData)
{ {
locallog(); locallog();
} }
void LocEngReportGpsMeasurement::proc() const { void LocEngReportGnssMeasurement::proc() const {
loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng; loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng;
if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION)
{ {
if (locEng->gps_measurement_cb != NULL) { if (locEng->gnss_measurement_cb != NULL) {
locEng->gps_measurement_cb((GpsData*)&(mGpsData)); LOC_LOGV("Calling gnss_measurement_cb");
locEng->gnss_measurement_cb((GnssData*)&(mGnssData));
} }
} }
} }
void LocEngReportGpsMeasurement::locallog() const { void LocEngReportGnssMeasurement::locallog() const {
IF_LOC_LOGV { IF_LOC_LOGV {
LOC_LOGV("%s:%d]: Received in GPS HAL." LOC_LOGV("%s:%d]: Received in GPS HAL."
"GNSS Measurements count: %d \n", "GNSS Measurements count: %d \n",
__func__, __LINE__, mGpsData.measurement_count); __func__, __LINE__, mGnssData.measurement_count);
for (int i =0; i< mGpsData.measurement_count && i < GPS_MAX_SVS; i++) { for (int i =0; i< mGnssData.measurement_count && i < GNSS_MAX_SVS; i++) {
LOC_LOGV(" GNSS measurement data in GPS HAL: \n" LOC_LOGV(" GNSS measurement data in GPS HAL: \n"
" GPS_HAL => Measurement ID | prn | time_offset_ns | state |" " GPS_HAL => Measurement ID | svid | time_offset_ns | state |"
" received_gps_tow_ns| c_n0_dbhz | pseudorange_rate_mps |" " c_n0_dbhz | pseudorange_rate_mps |"
" pseudorange_rate_uncertainty_mps |" " pseudorange_rate_uncertainty_mps |"
" accumulated_delta_range_state | flags \n" " accumulated_delta_range_state | flags \n"
" GPS_HAL => %d | %d | %f | %d | %lld | %f | %f | %f | %d | %d \n", " GPS_HAL => %d | %d | %f | %d | %f | %f | %f | %d | %d \n",
i, i,
mGpsData.measurements[i].prn, mGnssData.measurements[i].svid,
mGpsData.measurements[i].time_offset_ns, mGnssData.measurements[i].time_offset_ns,
mGpsData.measurements[i].state, mGnssData.measurements[i].state,
mGpsData.measurements[i].received_gps_tow_ns, mGnssData.measurements[i].c_n0_dbhz,
mGpsData.measurements[i].c_n0_dbhz, mGnssData.measurements[i].pseudorange_rate_mps,
mGpsData.measurements[i].pseudorange_rate_mps, mGnssData.measurements[i].pseudorange_rate_uncertainty_mps,
mGpsData.measurements[i].pseudorange_rate_uncertainty_mps, mGnssData.measurements[i].accumulated_delta_range_state,
mGpsData.measurements[i].accumulated_delta_range_state, mGnssData.measurements[i].flags);
mGpsData.measurements[i].flags);
} }
LOC_LOGV(" GPS_HAL => Clocks Info: type | time_ns \n" LOC_LOGV(" GPS_HAL => Clocks Info: \n"
" GPS_HAL => Clocks Info: %d | %lld", mGpsData.clock.type, " time_ns | full_bias_ns | bias_ns | bias_uncertainty_ns | "
mGpsData.clock.time_ns); " drift_nsps | drift_uncertainty_nsps | hw_clock_discontinuity_count | flags"
" GPS_HAL => Clocks Info: %lld | %lld | %g | %g | %g | %g | %d | 0x%04x\n",
mGnssData.clock.time_ns,
mGnssData.clock.full_bias_ns,
mGnssData.clock.bias_ns,
mGnssData.clock.bias_uncertainty_ns,
mGnssData.clock.drift_nsps,
mGnssData.clock.drift_uncertainty_nsps,
mGnssData.clock.hw_clock_discontinuity_count,
mGnssData.clock.flags);
} }
} }
inline void LocEngReportGpsMeasurement::log() const { inline void LocEngReportGnssMeasurement::log() const {
locallog(); locallog();
} }
@ -1746,6 +1785,8 @@ int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks,
loc_eng_data.acquire_wakelock_cb = callbacks->acquire_wakelock_cb; loc_eng_data.acquire_wakelock_cb = callbacks->acquire_wakelock_cb;
loc_eng_data.release_wakelock_cb = callbacks->release_wakelock_cb; loc_eng_data.release_wakelock_cb = callbacks->release_wakelock_cb;
loc_eng_data.request_utc_time_cb = callbacks->request_utc_time_cb; loc_eng_data.request_utc_time_cb = callbacks->request_utc_time_cb;
loc_eng_data.set_system_info_cb = callbacks->set_system_info_cb;
loc_eng_data.gnss_sv_status_cb = callbacks->gnss_sv_status_cb;
loc_eng_data.location_ext_parser = callbacks->location_ext_parser ? loc_eng_data.location_ext_parser = callbacks->location_ext_parser ?
callbacks->location_ext_parser : noProc; callbacks->location_ext_parser : noProc;
loc_eng_data.sv_ext_parser = callbacks->sv_ext_parser ? loc_eng_data.sv_ext_parser = callbacks->sv_ext_parser ?
@ -1770,6 +1811,8 @@ int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks,
new LocEngAdapter(event, &loc_eng_data, context, new LocEngAdapter(event, &loc_eng_data, context,
(LocThread::tCreate)callbacks->create_thread_cb); (LocThread::tCreate)callbacks->create_thread_cb);
loc_eng_data.adapter->mGnssInfo.size = sizeof(GnssSystemInfo);
loc_eng_data.adapter->mGnssInfo.year_of_hw = 2015;
LOC_LOGD("loc_eng_init created client, id = %p\n", LOC_LOGD("loc_eng_init created client, id = %p\n",
loc_eng_data.adapter); loc_eng_data.adapter);
loc_eng_data.adapter->sendMsg(new LocEngInit(&loc_eng_data)); loc_eng_data.adapter->sendMsg(new LocEngInit(&loc_eng_data));
@ -2942,8 +2985,8 @@ int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data,
{ {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
STATE_CHECK((NULL == loc_eng_data.gps_measurement_cb), STATE_CHECK((NULL == loc_eng_data.gnss_measurement_cb),
"gps measurement already initialized", "gnss measurement already initialized",
return GPS_MEASUREMENT_ERROR_ALREADY_INIT); return GPS_MEASUREMENT_ERROR_ALREADY_INIT);
STATE_CHECK((callbacks != NULL), STATE_CHECK((callbacks != NULL),
"callbacks can not be NULL", "callbacks can not be NULL",
@ -2959,7 +3002,7 @@ int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data,
event, event,
LOC_REGISTRATION_MASK_ENABLED)); LOC_REGISTRATION_MASK_ENABLED));
// set up the callback // set up the callback
loc_eng_data.gps_measurement_cb = callbacks->measurement_callback; loc_eng_data.gnss_measurement_cb = callbacks->gnss_measurement_callback;
LOC_LOGD ("%s, event masks updated successfully", __func__); LOC_LOGD ("%s, event masks updated successfully", __func__);
return GPS_MEASUREMENT_OPERATION_SUCCESS; return GPS_MEASUREMENT_OPERATION_SUCCESS;
@ -2994,6 +3037,6 @@ void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data)
event, event,
LOC_REGISTRATION_MASK_DISABLED)); LOC_REGISTRATION_MASK_DISABLED));
// set up the callback // set up the callback
loc_eng_data.gps_measurement_cb = NULL; loc_eng_data.gnss_measurement_cb = NULL;
EXIT_LOG(%d, 0); EXIT_LOG(%d, 0);
} }

View file

@ -94,7 +94,9 @@ typedef struct loc_eng_data_s
gps_acquire_wakelock acquire_wakelock_cb; gps_acquire_wakelock acquire_wakelock_cb;
gps_release_wakelock release_wakelock_cb; gps_release_wakelock release_wakelock_cb;
gps_request_utc_time request_utc_time_cb; gps_request_utc_time request_utc_time_cb;
gps_measurement_callback gps_measurement_cb; gnss_set_system_info set_system_info_cb;
gnss_sv_status_callback gnss_sv_status_cb;
gnss_measurement_callback gnss_measurement_cb;
boolean intermediateFix; boolean intermediateFix;
AGpsStatusValue agps_status; AGpsStatusValue agps_status;
loc_eng_xtra_data_s_type xtra_module_data; loc_eng_xtra_data_s_type xtra_module_data;

View file

@ -105,11 +105,11 @@ struct LocEngReportPosition : public LocMsg {
struct LocEngReportSv : public LocMsg { struct LocEngReportSv : public LocMsg {
LocAdapterBase* mAdapter; LocAdapterBase* mAdapter;
const QtiGnssSvStatus mSvStatus; const GnssSvStatus mSvStatus;
const GpsLocationExtended mLocationExtended; const GpsLocationExtended mLocationExtended;
const void* mSvExt; const void* mSvExt;
LocEngReportSv(LocAdapterBase* adapter, LocEngReportSv(LocAdapterBase* adapter,
QtiGnssSvStatus &sv, GnssSvStatus &sv,
GpsLocationExtended &locExtended, GpsLocationExtended &locExtended,
void* svExtended); void* svExtended);
virtual void proc() const; virtual void proc() const;
@ -289,11 +289,11 @@ struct LocEngGetZpp : public LocMsg {
void send() const; void send() const;
}; };
struct LocEngReportGpsMeasurement : public LocMsg { struct LocEngReportGnssMeasurement : public LocMsg {
void* mLocEng; void* mLocEng;
const GpsData mGpsData; const GnssData mGnssData;
LocEngReportGpsMeasurement(void* locEng, LocEngReportGnssMeasurement(void* locEng,
GpsData &gpsData); GnssData &gnssData);
virtual void proc() const; virtual void proc() const;
void locallog() const; void locallog() const;
virtual void log() const; virtual void log() const;

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2012, The Linux Foundation. All rights reserved. /* Copyright (c) 2012, 2016, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -29,10 +29,6 @@
#define LOG_NDDEBUG 0 #define LOG_NDDEBUG 0
#define LOG_TAG "LocSvc_eng_nmea" #define LOG_TAG "LocSvc_eng_nmea"
#define GPS_PRN_START 1
#define GPS_PRN_END 32
#define GLONASS_PRN_START 65
#define GLONASS_PRN_END 96
#include <loc_eng.h> #include <loc_eng.h>
#include <loc_eng_nmea.h> #include <loc_eng_nmea.h>
#include <math.h> #include <math.h>
@ -707,7 +703,7 @@ SIDE EFFECTS
===========================================================================*/ ===========================================================================*/
void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p, void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
const QtiGnssSvStatus &svStatus, const GpsLocationExtended &locationExtended) const GnssSvStatus &svStatus, const GpsLocationExtended &locationExtended)
{ {
ENTRY_LOG(); ENTRY_LOG();
@ -724,15 +720,27 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
//Count GPS SVs for saparating GPS from GLONASS and throw others //Count GPS SVs for saparating GPS from GLONASS and throw others
loc_eng_data_p->gps_used_mask = 0;
loc_eng_data_p->glo_used_mask = 0;
for(svNumber=1; svNumber <= svCount; svNumber++) { for(svNumber=1; svNumber <= svCount; svNumber++) {
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START)&& if (GNSS_CONSTELLATION_GPS == svStatus.gnss_sv_list[svNumber - 1].constellation)
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
{ {
// cache the used in fix mask, as it will be needed to send $GPGSA
// during the position report
if (GNSS_SV_FLAGS_USED_IN_FIX == (svStatus.gnss_sv_list[svNumber - 1].flags & GNSS_SV_FLAGS_USED_IN_FIX))
{
loc_eng_data_p->gps_used_mask |= (1 << (svStatus.gnss_sv_list[svNumber - 1].svid - 1));
}
gpsCount++; gpsCount++;
} }
else if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) && else if (GNSS_CONSTELLATION_GLONASS == svStatus.gnss_sv_list[svNumber - 1].constellation)
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) )
{ {
// cache the used in fix mask, as it will be needed to send $GNGSA
// during the position report
if (GNSS_SV_FLAGS_USED_IN_FIX == (svStatus.gnss_sv_list[svNumber - 1].flags & GNSS_SV_FLAGS_USED_IN_FIX))
{
loc_eng_data_p->glo_used_mask |= (1 << (svStatus.gnss_sv_list[svNumber - 1].svid - 1));
}
glnCount++; glnCount++;
} }
} }
@ -772,13 +780,12 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++) for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
{ {
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START) && if (GNSS_CONSTELLATION_GPS == svStatus.gnss_sv_list[svNumber - 1].constellation)
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
{ {
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,", length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
svStatus.sv_list[svNumber-1].prn, svStatus.gnss_sv_list[svNumber-1].svid,
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int (int)(0.5 + svStatus.gnss_sv_list[svNumber-1].elevation), //float to int
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int (int)(0.5 + svStatus.gnss_sv_list[svNumber-1].azimuth)); //float to int
if (length < 0 || length >= lengthRemaining) if (length < 0 || length >= lengthRemaining)
{ {
@ -788,10 +795,10 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
pMarker += length; pMarker += length;
lengthRemaining -= length; lengthRemaining -= length;
if (svStatus.sv_list[svNumber-1].snr > 0) if (svStatus.gnss_sv_list[svNumber-1].c_n0_dbhz > 0)
{ {
length = snprintf(pMarker, lengthRemaining,"%02d", length = snprintf(pMarker, lengthRemaining,"%02d",
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int (int)(0.5 + svStatus.gnss_sv_list[svNumber-1].c_n0_dbhz)); //float to int
if (length < 0 || length >= lengthRemaining) if (length < 0 || length >= lengthRemaining)
{ {
@ -850,13 +857,13 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++) for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
{ {
if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) && if (GNSS_CONSTELLATION_GLONASS == svStatus.gnss_sv_list[svNumber - 1].constellation)
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) ) { {
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,", length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
svStatus.sv_list[svNumber-1].prn, svStatus.gnss_sv_list[svNumber - 1].svid,
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int (int)(0.5 + svStatus.gnss_sv_list[svNumber - 1].elevation), //float to int
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int (int)(0.5 + svStatus.gnss_sv_list[svNumber - 1].azimuth)); //float to int
if (length < 0 || length >= lengthRemaining) if (length < 0 || length >= lengthRemaining)
{ {
@ -866,10 +873,10 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
pMarker += length; pMarker += length;
lengthRemaining -= length; lengthRemaining -= length;
if (svStatus.sv_list[svNumber-1].snr > 0) if (svStatus.gnss_sv_list[svNumber - 1].c_n0_dbhz > 0)
{ {
length = snprintf(pMarker, lengthRemaining,"%02d", length = snprintf(pMarker, lengthRemaining,"%02d",
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int (int)(0.5 + svStatus.gnss_sv_list[svNumber - 1].c_n0_dbhz)); //float to int
if (length < 0 || length >= lengthRemaining) if (length < 0 || length >= lengthRemaining)
{ {
@ -893,11 +900,6 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
}//if }//if
// cache the used in fix mask, as it will be needed to send $GPGSA/$GNGSA
// during the position report
loc_eng_data_p->gps_used_mask = svStatus.gps_used_in_fix_mask;
loc_eng_data_p->glo_used_mask = svStatus.glo_used_in_fix_mask;
// For RPC, the DOP are sent during sv report, so cache them // For RPC, the DOP are sent during sv report, so cache them
// now to be sent during position report. // now to be sent during position report.
// For QMI, the DOP will be in position report. // For QMI, the DOP will be in position report.

View file

@ -37,7 +37,7 @@
void loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p); void loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p);
int loc_eng_nmea_put_checksum(char *pNmea, int maxSize); int loc_eng_nmea_put_checksum(char *pNmea, int maxSize);
void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p, const QtiGnssSvStatus &svStatus, const GpsLocationExtended &locationExtended); void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p, const GnssSvStatus &svStatus, const GpsLocationExtended &locationExtended);
void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p, const UlpLocation &location, const GpsLocationExtended &locationExtended, unsigned char generate_nmea); void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p, const UlpLocation &location, const GpsLocationExtended &locationExtended, unsigned char generate_nmea);
#endif // LOC_ENG_NMEA_H #endif // LOC_ENG_NMEA_H