diff --git a/loc_api/libloc_api_50001/LocApiAdapter.h b/loc_api/libloc_api_50001/LocApiAdapter.h index ec53805e..a876b0aa 100755 --- a/loc_api/libloc_api_50001/LocApiAdapter.h +++ b/loc_api/libloc_api_50001/LocApiAdapter.h @@ -216,6 +216,9 @@ public: inline virtual enum loc_api_adapter_err setExtPowerConfig(int isBatteryCharging) {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} + inline virtual enum loc_api_adapter_err + setAGLONASSProtocol(unsigned long aGlonassProtocol) + {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} inline const LocPosMode& getPositionMode() const {return fixCriteria;} diff --git a/loc_api/libloc_api_50001/loc_eng.cpp b/loc_api/libloc_api_50001/loc_eng.cpp index 1b55f288..da464af0 100755 --- a/loc_api/libloc_api_50001/loc_eng.cpp +++ b/loc_api/libloc_api_50001/loc_eng.cpp @@ -105,6 +105,7 @@ static loc_param_s_type loc_parameter_table[] = {"SENSOR_ALGORITHM_CONFIG_MASK", &gps_conf.SENSOR_ALGORITHM_CONFIG_MASK, NULL, 'n'}, {"QUIPC_ENABLED", &gps_conf.QUIPC_ENABLED, NULL, 'n'}, {"LPP_PROFILE", &gps_conf.LPP_PROFILE, NULL, 'n'}, + {"A_GLONASS_POS_PROTOCOL_SELECT", &gps_conf.A_GLONASS_POS_PROTOCOL_SELECT, NULL, 'n'}, }; static void loc_default_parameters(void) @@ -145,6 +146,9 @@ static void loc_default_parameters(void) /* LTE Positioning Profile configuration is disable by default*/ gps_conf.LPP_PROFILE = 0; + + /*By default no positioning protocol is selected on A-GLONASS system*/ + gps_conf.A_GLONASS_POS_PROTOCOL_SELECT = 0; } LocEngContext::LocEngContext(gps_create_thread threadCreator) : @@ -367,6 +371,11 @@ static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data) msg_q_snd((void*)((LocEngContext*)(loc_eng_data.context))->deferred_q, sensor_control_config_msg, loc_eng_free_msg); + loc_eng_msg_a_glonass_protocol *a_glonass_protocol_msg(new loc_eng_msg_a_glonass_protocol(&loc_eng_data, + gps_conf.A_GLONASS_POS_PROTOCOL_SELECT)); + msg_q_snd((void*)((LocEngContext*)(loc_eng_data.context))->deferred_q, + a_glonass_protocol_msg, loc_eng_free_msg); + /* Make sure at least one of the sensor property is specified by the user in the gps.conf file. */ if( gps_conf.GYRO_BIAS_RANDOM_WALK_VALID || gps_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID || @@ -1430,6 +1439,13 @@ static void loc_eng_deferred_action_thread(void* arg) } break; + case LOC_ENG_MSG_A_GLONASS_PROTOCOL: + { + loc_eng_msg_a_glonass_protocol *svMsg = (loc_eng_msg_a_glonass_protocol*)msg; + loc_eng_data_p->client_handle->setAGLONASSProtocol(svMsg->a_glonass_protocol); + } + break; + case LOC_ENG_MSG_SUPL_VERSION: { loc_eng_msg_suple_version *svMsg = (loc_eng_msg_suple_version*)msg; diff --git a/loc_api/libloc_api_50001/loc_eng.h b/loc_api/libloc_api_50001/loc_eng.h old mode 100644 new mode 100755 index 646d1716..16ab1d7e --- a/loc_api/libloc_api_50001/loc_eng.h +++ b/loc_api/libloc_api_50001/loc_eng.h @@ -180,6 +180,7 @@ typedef struct loc_gps_cfg_s unsigned long QUIPC_ENABLED; unsigned long LPP_PROFILE; unsigned long SENSOR_ALGORITHM_CONFIG_MASK; + unsigned long A_GLONASS_POS_PROTOCOL_SELECT; uint8_t ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID; double ACCEL_RANDOM_WALK_SPECTRAL_DENSITY; uint8_t ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID; diff --git a/loc_api/libloc_api_50001/loc_eng_log.cpp b/loc_api/libloc_api_50001/loc_eng_log.cpp old mode 100644 new mode 100755 index 843f558f..e324ca72 --- a/loc_api/libloc_api_50001/loc_eng_log.cpp +++ b/loc_api/libloc_api_50001/loc_eng_log.cpp @@ -104,7 +104,8 @@ static loc_name_val_s_type loc_eng_msgs[] = NAME_VAL( ULP_MSG_INJECT_NETWORK_POSITION ), NAME_VAL( ULP_MSG_REPORT_QUIPC_POSITION ), NAME_VAL( ULP_MSG_REQUEST_COARSE_POSITION ), - NAME_VAL( LOC_ENG_MSG_LPP_CONFIG ) + NAME_VAL( LOC_ENG_MSG_LPP_CONFIG ), + NAME_VAL( LOC_ENG_MSG_A_GLONASS_PROTOCOL ) }; static int loc_eng_msgs_num = sizeof(loc_eng_msgs) / sizeof(loc_name_val_s_type); diff --git a/loc_api/libloc_api_50001/loc_eng_msg.h b/loc_api/libloc_api_50001/loc_eng_msg.h index 9c5c03bd..62bc3543 100755 --- a/loc_api/libloc_api_50001/loc_eng_msg.h +++ b/loc_api/libloc_api_50001/loc_eng_msg.h @@ -158,6 +158,16 @@ struct loc_eng_msg { } }; +struct loc_eng_msg_a_glonass_protocol : public loc_eng_msg { + const unsigned long a_glonass_protocol; + inline loc_eng_msg_a_glonass_protocol(void* instance, unsigned long protocol) : + loc_eng_msg(instance, LOC_ENG_MSG_A_GLONASS_PROTOCOL), + a_glonass_protocol(protocol) + { + LOC_LOGV("A-GLONASS protocol: 0x%lx", protocol); + } +}; + struct loc_eng_msg_suple_version : public loc_eng_msg { const int supl_version; inline loc_eng_msg_suple_version(void* instance, int version) : diff --git a/loc_api/libloc_api_50001/loc_eng_msg_id.h b/loc_api/libloc_api_50001/loc_eng_msg_id.h index 0761b89d..17064699 100755 --- a/loc_api/libloc_api_50001/loc_eng_msg_id.h +++ b/loc_api/libloc_api_50001/loc_eng_msg_id.h @@ -128,6 +128,9 @@ enum loc_eng_msg_ids_t { // Message is sent by Android framework (GpsLocationProvider) // to inject the raw command ULP_MSG_INJECT_RAW_COMMAND, + + /* Message is sent by HAL to LOC API to select A-GLONASS protocol */ + LOC_ENG_MSG_A_GLONASS_PROTOCOL, }; #ifdef __cplusplus diff --git a/loc_api/loc_api_v02/LocApiV02Adapter.cpp b/loc_api/loc_api_v02/LocApiV02Adapter.cpp index 4c7b7124..4203ffb8 100755 --- a/loc_api/loc_api_v02/LocApiV02Adapter.cpp +++ b/loc_api/loc_api_v02/LocApiV02Adapter.cpp @@ -1441,6 +1441,45 @@ enum loc_api_adapter_err LocApiV02Adapter :: setExtPowerConfig(int isBatteryChar return LOC_API_ADAPTER_ERR_SUCCESS; } +/* set the Positioning Protocol on A-GLONASS system */ +enum loc_api_adapter_err LocApiV02Adapter :: setAGLONASSProtocol(unsigned long aGlonassProtocol) +{ + locClientStatusEnumType result = eLOC_CLIENT_SUCCESS; + locClientReqUnionType req_union; + qmiLocSetProtocolConfigParametersReqMsgT_v02 aGlonassProtocol_req; + qmiLocSetProtocolConfigParametersIndMsgT_v02 aGlonassProtocol_ind; + + memset(&aGlonassProtocol_req, 0, sizeof(aGlonassProtocol_req)); + memset(&aGlonassProtocol_ind, 0, sizeof(aGlonassProtocol_ind)); + + aGlonassProtocol_req.assistedGlonassProtocolMask_valid = 1; + aGlonassProtocol_req.assistedGlonassProtocolMask = aGlonassProtocol; + + req_union.pSetProtocolConfigParametersReq = &aGlonassProtocol_req; + + LOC_LOGD("%s:%d]: aGlonassProtocolMask = 0x%lx\n", __func__, __LINE__, + aGlonassProtocol_req.assistedGlonassProtocolMask); + + result = loc_sync_send_req(clientHandle, + QMI_LOC_SET_PROTOCOL_CONFIG_PARAMETERS_REQ_V02, + req_union, LOC_ENGINE_SYNC_REQUEST_TIMEOUT, + QMI_LOC_SET_PROTOCOL_CONFIG_PARAMETERS_IND_V02, + &aGlonassProtocol_ind); + + if(result != eLOC_CLIENT_SUCCESS || + eQMI_LOC_SUCCESS_V02 != aGlonassProtocol_ind.status) + { + LOC_LOGE ("%s:%d]: Error status = %s, ind..status = %s ", + __func__, __LINE__, + loc_get_v02_client_status_name(result), + loc_get_v02_qmi_status_name(aGlonassProtocol_ind.status)); + + return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; + } + return LOC_API_ADAPTER_ERR_SUCCESS; +} + + /* Convert event mask from loc eng to loc_api_v02 format */ locClientEventMaskType LocApiV02Adapter :: convertMask( LOC_API_ADAPTER_EVENT_MASK_T mask) diff --git a/loc_api/loc_api_v02/LocApiV02Adapter.h b/loc_api/loc_api_v02/LocApiV02Adapter.h old mode 100644 new mode 100755 index 60c2a5ce..e6441db9 --- a/loc_api/loc_api_v02/LocApiV02Adapter.h +++ b/loc_api/loc_api_v02/LocApiV02Adapter.h @@ -161,6 +161,7 @@ public: int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh, int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh, int algorithmConfig); virtual enum loc_api_adapter_err setExtPowerConfig(int isBatteryCharging); + virtual enum loc_api_adapter_err setAGLONASSProtocol(unsigned long aGlonassProtocol); }; #endif //LOC_API_V_0_2_ADAPTER_H