loc_api: Send position technology mask to ulp

Sends the technology mask of the position report to ulp and blocks
the injected wifi fix from getting reported as final

Change-Id: I3a9b390d3d6d9be1a913731d6e8d8ee1d3ced686
This commit is contained in:
Neethu Joseph 2012-06-25 10:36:48 -07:00
parent f2738552cc
commit 7ce61c42e2
7 changed files with 51 additions and 8 deletions

6
loc_api/libloc_api_50001/LocApiAdapter.cpp Normal file → Executable file
View file

@ -114,12 +114,14 @@ int LocApiAdapter::decodeAddress(char *addr_string, int string_size,
void LocApiAdapter::reportPosition(GpsLocation &location, void LocApiAdapter::reportPosition(GpsLocation &location,
void* locationExt, void* locationExt,
enum loc_sess_status status) enum loc_sess_status status,
LocPosTechMask loc_technology_mask )
{ {
loc_eng_msg_report_position *msg(new loc_eng_msg_report_position(locEngHandle.owner, loc_eng_msg_report_position *msg(new loc_eng_msg_report_position(locEngHandle.owner,
location, location,
locationExt, locationExt,
status)); status,
loc_technology_mask));
if (locEngHandle.sendUlpMsg) { if (locEngHandle.sendUlpMsg) {
locEngHandle.sendUlpMsg(locEngHandle.owner, msg); locEngHandle.sendUlpMsg(locEngHandle.owner, msg);
} else { } else {

3
loc_api/libloc_api_50001/LocApiAdapter.h Normal file → Executable file
View file

@ -122,7 +122,8 @@ public:
void reportPosition(GpsLocation &location, void reportPosition(GpsLocation &location,
void* locationExt, void* locationExt,
enum loc_sess_status status); enum loc_sess_status status,
LocPosTechMask loc_technology_mask = LOC_POS_TECH_MASK_DEFAULT);
void reportSv(GpsSvStatus &svStatus, void* svExt); void reportSv(GpsSvStatus &svStatus, void* svExt);
void reportStatus(GpsStatusValue status); void reportStatus(GpsStatusValue status);
void reportNmea(const char* nmea, int length); void reportNmea(const char* nmea, int length);

9
loc_api/libloc_api_50001/loc.h Normal file → Executable file
View file

@ -80,6 +80,15 @@ enum loc_sess_status {
LOC_SESS_FAILURE LOC_SESS_FAILURE
}; };
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)
void loc_ulp_msg_sender(void* loc_eng_data_p, void* msg); void loc_ulp_msg_sender(void* loc_eng_data_p, void* msg);
#ifdef __cplusplus #ifdef __cplusplus

10
loc_api/libloc_api_50001/loc_eng.cpp Normal file → Executable file
View file

@ -1484,13 +1484,21 @@ static void loc_eng_deferred_action_thread(void* arg)
} }
// what's in the else if is... (line by line) // what's in the else if is... (line by line)
// 1. this is a good fix; or // 1. this is a good fix; or
// 1.1 there is source info; or
// 1.1.1 this is from hybrid provider;
// 1.2 it is a Satellite fix; or
// 1.2.1 it is a sensor fix
// 2. (must be intermediate fix... implicit) // 2. (must be intermediate fix... implicit)
// 2.1 we accepte intermediate; and // 2.1 we accepte intermediate; and
// 2.2 it is NOT the case that // 2.2 it is NOT the case that
// 2.2.1 there is inaccuracy; and // 2.2.1 there is inaccuracy; and
// 2.2.2 we care about inaccuracy; and // 2.2.2 we care about inaccuracy; and
// 2.2.3 the inaccuracy exceeds our tolerance // 2.2.3 the inaccuracy exceeds our tolerance
else if (LOC_SESS_SUCCESS == rpMsg->status || else if ((LOC_SESS_SUCCESS == rpMsg->status &&
((LOCATION_HAS_SOURCE_INFO == rpMsg->location.flags &&
ULP_LOCATION_IS_FROM_HYBRID == rpMsg->location.position_source) ||
((LOC_POS_TECH_MASK_SATELLITE & rpMsg->technology_mask) ||
(LOC_POS_TECH_MASK_SENSORS & rpMsg->technology_mask)))) ||
(LOC_SESS_INTERMEDIATE == loc_eng_data_p->intermediateFix && (LOC_SESS_INTERMEDIATE == loc_eng_data_p->intermediateFix &&
!((rpMsg->location.flags & GPS_LOCATION_HAS_ACCURACY) && !((rpMsg->location.flags & GPS_LOCATION_HAS_ACCURACY) &&
(gps_conf.ACCURACY_THRES != 0) && (gps_conf.ACCURACY_THRES != 0) &&

17
loc_api/libloc_api_50001/loc_eng_msg.h Normal file → Executable file
View file

@ -319,15 +319,26 @@ struct loc_eng_msg_report_position : public loc_eng_msg {
const GpsLocation location; const GpsLocation location;
const void* locationExt; const void* locationExt;
const enum loc_sess_status status; const enum loc_sess_status status;
const LocPosTechMask technology_mask;
inline loc_eng_msg_report_position(void* instance, GpsLocation &loc, void* locExt, inline loc_eng_msg_report_position(void* instance, GpsLocation &loc, void* locExt,
enum loc_sess_status st) : enum loc_sess_status st) :
loc_eng_msg(instance, LOC_ENG_MSG_REPORT_POSITION), loc_eng_msg(instance, LOC_ENG_MSG_REPORT_POSITION),
location(loc), locationExt(locExt), status(st) location(loc), locationExt(locExt), status(st), technology_mask(LOC_POS_TECH_MASK_DEFAULT)
{ {
LOC_LOGV("flags: %d\n source: %d\n latitude: %f\n longitude: %f\n altitude: %f\n speed: %f\n bearing: %f\n accuracy: %f\n timestamp: %lld\n rawDataSize: %d\n rawData: %p\n Session status: %d", LOC_LOGV("flags: %d\n source: %d\n latitude: %f\n longitude: %f\n altitude: %f\n speed: %f\n bearing: %f\n accuracy: %f\n timestamp: %lld\n rawDataSize: %d\n rawData: %p\n Session status: %d\n Technology mask: %u",
location.flags, location.position_source, location.latitude, location.longitude, location.flags, location.position_source, location.latitude, location.longitude,
location.altitude, location.speed, location.bearing, location.accuracy, location.altitude, location.speed, location.bearing, location.accuracy,
location.timestamp, location.rawDataSize, location.rawData,status); location.timestamp, location.rawDataSize, location.rawData,status,technology_mask);
}
inline loc_eng_msg_report_position(void* instance, GpsLocation &loc, void* locExt,
enum loc_sess_status st, LocPosTechMask technology) :
loc_eng_msg(instance, LOC_ENG_MSG_REPORT_POSITION),
location(loc), locationExt(locExt), status(st), technology_mask(technology)
{
LOC_LOGV("flags: %d\n source: %d\n latitude: %f\n longitude: %f\n altitude: %f\n speed: %f\n bearing: %f\n accuracy: %f\n timestamp: %lld\n rawDataSize: %d\n rawData: %p\n Session status: %d\n Technology mask: %u",
location.flags, location.position_source, location.latitude, location.longitude,
location.altitude, location.speed, location.bearing, location.accuracy,
location.timestamp, location.rawDataSize, location.rawData,status,technology_mask);
} }
}; };

6
loc_api/libloc_api_50001/loc_eng_msg_id.h Normal file → Executable file
View file

@ -115,6 +115,12 @@ enum loc_eng_msg_ids_t {
// Message is sent by QUIPC module in order to request some info from ULP // Message is sent by QUIPC module in order to request some info from ULP
ULP_MSG_REQUEST_COARSE_POSITION, ULP_MSG_REQUEST_COARSE_POSITION,
// Message is sent to ULP module to re-evaluate its subsystems
ULP_MSG_MONITOR,
// Last ULP MSG
ULP_MSG_LAST = 0x700,
/* Message is sent by HAL to LOC API to configure LTE Positioning /* Message is sent by HAL to LOC API to configure LTE Positioning
Profile in modem */ Profile in modem */
LOC_ENG_MSG_LPP_CONFIG, LOC_ENG_MSG_LPP_CONFIG,

8
loc_api/loc_api_v02/LocApiV02Adapter.cpp Normal file → Executable file
View file

@ -1550,6 +1550,7 @@ void LocApiV02Adapter :: reportPosition (
const qmiLocEventPositionReportIndMsgT_v02 *location_report_ptr) const qmiLocEventPositionReportIndMsgT_v02 *location_report_ptr)
{ {
GpsLocation location; GpsLocation location;
LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT;
LOC_LOGD("Reporting postion from V2 Adapter\n"); LOC_LOGD("Reporting postion from V2 Adapter\n");
memset(&location, 0, sizeof (GpsLocation)); memset(&location, 0, sizeof (GpsLocation));
location.size = sizeof(location); location.size = sizeof(location);
@ -1607,6 +1608,10 @@ void LocApiV02Adapter :: reportPosition (
location.flags |= GPS_LOCATION_HAS_ACCURACY; location.flags |= GPS_LOCATION_HAS_ACCURACY;
location.accuracy = location_report_ptr->horUncCircular; location.accuracy = location_report_ptr->horUncCircular;
} }
// Technology Mask
tech_Mask |= location_report_ptr->technologyMask;
//Mark the location source as from GNSS //Mark the location source as from GNSS
location.flags |= LOCATION_HAS_SOURCE_INFO; location.flags |= LOCATION_HAS_SOURCE_INFO;
location.position_source = ULP_LOCATION_IS_FROM_GNSS; location.position_source = ULP_LOCATION_IS_FROM_GNSS;
@ -1614,7 +1619,8 @@ void LocApiV02Adapter :: reportPosition (
locEngHandle.extPosInfo((void*)location_report_ptr), locEngHandle.extPosInfo((void*)location_report_ptr),
(location_report_ptr->sessionStatus (location_report_ptr->sessionStatus
== eQMI_LOC_SESS_STATUS_IN_PROGRESS_V02 ? == eQMI_LOC_SESS_STATUS_IN_PROGRESS_V02 ?
LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS)); LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS),
tech_Mask);
} }
} }
else else