147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 234ee09551764b045fdc02df754157473125edf60Kevin Tang * 334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without 434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are 534ee09551764b045fdc02df754157473125edf60Kevin Tang * met: 634ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions of source code must retain the above copyright 734ee09551764b045fdc02df754157473125edf60Kevin Tang * notice, this list of conditions and the following disclaimer. 834ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions in binary form must reproduce the above 934ee09551764b045fdc02df754157473125edf60Kevin Tang * copyright notice, this list of conditions and the following 1034ee09551764b045fdc02df754157473125edf60Kevin Tang * disclaimer in the documentation and/or other materials provided 1134ee09551764b045fdc02df754157473125edf60Kevin Tang * with the distribution. 12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Neither the name of The Linux Foundation, nor the names of its 1334ee09551764b045fdc02df754157473125edf60Kevin Tang * contributors may be used to endorse or promote products derived 1434ee09551764b045fdc02df754157473125edf60Kevin Tang * from this software without specific prior written permission. 1534ee09551764b045fdc02df754157473125edf60Kevin Tang * 1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2734ee09551764b045fdc02df754157473125edf60Kevin Tang * 2834ee09551764b045fdc02df754157473125edf60Kevin Tang */ 2934ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOG_NDDEBUG 0 30e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#define LOG_TAG "LocSvc_api_rpc" 3134ee09551764b045fdc02df754157473125edf60Kevin Tang 3234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <unistd.h> 3334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <math.h> 34e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#ifndef USE_GLIB 3534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <utils/SystemClock.h> 36e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#endif /* USE_GLIB */ 37e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocApiRpc.h> 38e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocAdapterBase.h> 39e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_api_fixup.h> 40e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_api_rpc_glue.h> 41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <log_util.h> 42e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_log.h> 43e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_api_log.h> 44e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#ifdef USE_GLIB 45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <glib.h> 46e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#endif 47e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <librpc.h> 48e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <platform_lib_includes.h> 49e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 50e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russousing namespace loc_core; 5134ee09551764b045fdc02df754157473125edf60Kevin Tang 5234ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_XTRA_INJECT_DEFAULT_TIMEOUT (3100) 5334ee09551764b045fdc02df754157473125edf60Kevin Tang#define XTRA_BLOCK_SIZE (3072) 5434ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_IOCTL_DEFAULT_TIMEOUT 1000 // 1000 milli-seconds 5534ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_NI_NOTIF_KEY_ADDRESS "Address" 5634ee09551764b045fdc02df754157473125edf60Kevin Tang 5734ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 5834ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_event_cb 5934ee09551764b045fdc02df754157473125edf60Kevin Tang 6034ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 6134ee09551764b045fdc02df754157473125edf60Kevin Tang This is the callback function registered by loc_open. 6234ee09551764b045fdc02df754157473125edf60Kevin Tang 6334ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 6434ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 6534ee09551764b045fdc02df754157473125edf60Kevin Tang 6634ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 6734ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_API_SUCCESS 6834ee09551764b045fdc02df754157473125edf60Kevin Tang 6934ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 7034ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 7134ee09551764b045fdc02df754157473125edf60Kevin Tang 7234ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 7334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int32 loc_event_cb 7434ee09551764b045fdc02df754157473125edf60Kevin Tang( 7534ee09551764b045fdc02df754157473125edf60Kevin Tang void* user, 7634ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_client_handle_type client_handle, 7734ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_mask_type loc_event, 7834ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_event_payload_u_type* loc_event_payload 7934ee09551764b045fdc02df754157473125edf60Kevin Tang) 8034ee09551764b045fdc02df754157473125edf60Kevin Tang{ 8134ee09551764b045fdc02df754157473125edf60Kevin Tang MODEM_LOG_CALLFLOW(%s, loc_get_event_name(loc_event)); 8234ee09551764b045fdc02df754157473125edf60Kevin Tang loc_callback_log(loc_event, loc_event_payload); 83e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo int32 ret_val = ((LocApiRpc*)user)->locEventCB(client_handle, loc_event, loc_event_payload); 8434ee09551764b045fdc02df754157473125edf60Kevin Tang EXIT_LOG(%d, ret_val); 8534ee09551764b045fdc02df754157473125edf60Kevin Tang return ret_val; 8634ee09551764b045fdc02df754157473125edf60Kevin Tang} 8734ee09551764b045fdc02df754157473125edf60Kevin Tang 8834ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 8934ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_rpc_global_cb 9034ee09551764b045fdc02df754157473125edf60Kevin Tang 9134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 9234ee09551764b045fdc02df754157473125edf60Kevin Tang This is the callback function registered by loc_open for RPC global events 9334ee09551764b045fdc02df754157473125edf60Kevin Tang 9434ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 9534ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 9634ee09551764b045fdc02df754157473125edf60Kevin Tang 9734ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 9834ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_API_SUCCESS 9934ee09551764b045fdc02df754157473125edf60Kevin Tang 10034ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 10134ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 10234ee09551764b045fdc02df754157473125edf60Kevin Tang 10334ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 10434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_rpc_global_cb(void* user, CLIENT* clnt, enum rpc_reset_event event) 10534ee09551764b045fdc02df754157473125edf60Kevin Tang{ 10634ee09551764b045fdc02df754157473125edf60Kevin Tang MODEM_LOG_CALLFLOW(%s, loc_get_rpc_reset_event_name(event)); 107e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ((LocApiRpc*)user)->locRpcGlobalCB(clnt, event); 10834ee09551764b045fdc02df754157473125edf60Kevin Tang EXIT_LOG(%p, VOID_RET); 10934ee09551764b045fdc02df754157473125edf60Kevin Tang} 11034ee09551764b045fdc02df754157473125edf60Kevin Tang 111e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst LOC_API_ADAPTER_EVENT_MASK_T LocApiRpc::maskAll = 112e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT | 113e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_SATELLITE_REPORT | 114e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST | 115e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST | 116e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_IOCTL_REPORT | 117e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_STATUS_REPORT | 118e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT | 119e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; 120e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 121e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst rpc_loc_event_mask_type LocApiRpc::locBits[] = 12234ee09551764b045fdc02df754157473125edf60Kevin Tang{ 12334ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_PARSED_POSITION_REPORT, 12434ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_SATELLITE_REPORT, 12534ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_NMEA_1HZ_REPORT, 12634ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_NMEA_POSITION_REPORT, 12734ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST, 12834ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST, 12934ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_LOCATION_SERVER_REQUEST, 13034ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_EVENT_IOCTL_REPORT, 131e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo RPC_LOC_EVENT_STATUS_REPORT, 132e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo RPC_LOC_EVENT_WPS_NEEDED_REQUEST 13334ee09551764b045fdc02df754157473125edf60Kevin Tang}; 13434ee09551764b045fdc02df754157473125edf60Kevin Tang 135e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo// constructor 136e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::LocApiRpc(const MsgTask* msgTask, 13747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_API_ADAPTER_EVENT_MASK_T exMask, 13847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ContextBase* context) : 13947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LocApiBase(msgTask, exMask, context), 14034ee09551764b045fdc02df754157473125edf60Kevin Tang client_handle(RPC_LOC_CLIENT_HANDLE_INVALID), 141e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo dataEnableLastSet(-1) 14234ee09551764b045fdc02df754157473125edf60Kevin Tang{ 143e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo memset(apnLastSet, 0, sizeof(apnLastSet)); 14434ee09551764b045fdc02df754157473125edf60Kevin Tang loc_api_glue_init(); 14534ee09551764b045fdc02df754157473125edf60Kevin Tang} 14634ee09551764b045fdc02df754157473125edf60Kevin Tang 147e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::~LocApiRpc() 14834ee09551764b045fdc02df754157473125edf60Kevin Tang{ 149e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo close(); 15034ee09551764b045fdc02df754157473125edf60Kevin Tang} 15134ee09551764b045fdc02df754157473125edf60Kevin Tang 15234ee09551764b045fdc02df754157473125edf60Kevin Tangrpc_loc_event_mask_type 153e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask) 15434ee09551764b045fdc02df754157473125edf60Kevin Tang{ 15534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_mask_type newMask = 0; 15634ee09551764b045fdc02df754157473125edf60Kevin Tang 15734ee09551764b045fdc02df754157473125edf60Kevin Tang for (unsigned int i = 0, bit=1; 0 != mask; i++, bit<<=1) { 15834ee09551764b045fdc02df754157473125edf60Kevin Tang if (mask & bit) { 15934ee09551764b045fdc02df754157473125edf60Kevin Tang newMask |= locBits[i]; 16034ee09551764b045fdc02df754157473125edf60Kevin Tang mask ^= bit; 16134ee09551764b045fdc02df754157473125edf60Kevin Tang } 16234ee09551764b045fdc02df754157473125edf60Kevin Tang } 16334ee09551764b045fdc02df754157473125edf60Kevin Tang 16434ee09551764b045fdc02df754157473125edf60Kevin Tang return newMask; 16534ee09551764b045fdc02df754157473125edf60Kevin Tang} 16634ee09551764b045fdc02df754157473125edf60Kevin Tang 1678aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tangrpc_loc_lock_e_type 1688aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin TangLocApiRpc::convertGpsLockMask(LOC_GPS_LOCK_MASK lockMask) 1698aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang{ 1708aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang if (isGpsLockAll(lockMask)) 1718aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang return RPC_LOC_LOCK_ALL; 1728aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang if (isGpsLockMO(lockMask)) 1738aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang return RPC_LOC_LOCK_MI; 1748aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang if (isGpsLockMT(lockMask)) 1758aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang return RPC_LOC_LOCK_MT; 1768aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang if (isGpsLockNone(lockMask)) 1778aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang return RPC_LOC_LOCK_NONE; 1788aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang return (rpc_loc_lock_e_type)lockMask; 1798aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang} 1808aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang 18134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 182e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::convertErr(int rpcErr) 18334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 18434ee09551764b045fdc02df754157473125edf60Kevin Tang switch(rpcErr) 18534ee09551764b045fdc02df754157473125edf60Kevin Tang { 18634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_SUCCESS: 18734ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_SUCCESS; 18834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_GENERAL_FAILURE: 18934ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 19034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_UNSUPPORTED: 19134ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_UNSUPPORTED; 19234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_INVALID_HANDLE: 19334ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_INVALID_HANDLE; 19434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_INVALID_PARAMETER: 19534ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_INVALID_PARAMETER; 19634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_ENGINE_BUSY: 19734ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_ENGINE_BUSY; 19834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_PHONE_OFFLINE: 19934ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_PHONE_OFFLINE; 20034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_TIMEOUT: 20134ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_TIMEOUT; 20234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_RPC_MODEM_RESTART: 20334ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_ENGINE_DOWN; 20434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_API_RPC_FAILURE: 20534ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_FAILURE; 20634ee09551764b045fdc02df754157473125edf60Kevin Tang default: 20734ee09551764b045fdc02df754157473125edf60Kevin Tang return LOC_API_ADAPTER_ERR_UNKNOWN; 20834ee09551764b045fdc02df754157473125edf60Kevin Tang } 20934ee09551764b045fdc02df754157473125edf60Kevin Tang} 21034ee09551764b045fdc02df754157473125edf60Kevin Tang 211e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event) 21234ee09551764b045fdc02df754157473125edf60Kevin Tang{ 21334ee09551764b045fdc02df754157473125edf60Kevin Tang static rpc_loc_engine_state_e_type last_state = RPC_LOC_ENGINE_STATE_MAX; 21434ee09551764b045fdc02df754157473125edf60Kevin Tang 21534ee09551764b045fdc02df754157473125edf60Kevin Tang switch (event) { 21634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_SUBSYSTEM_RESTART_BEGIN: 21734ee09551764b045fdc02df754157473125edf60Kevin Tang if (RPC_LOC_ENGINE_STATE_OFF != last_state) { 21834ee09551764b045fdc02df754157473125edf60Kevin Tang last_state = RPC_LOC_ENGINE_STATE_OFF; 21934ee09551764b045fdc02df754157473125edf60Kevin Tang handleEngineDownEvent(); 22034ee09551764b045fdc02df754157473125edf60Kevin Tang } 22134ee09551764b045fdc02df754157473125edf60Kevin Tang break; 22234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_SUBSYSTEM_RESTART_END: 22334ee09551764b045fdc02df754157473125edf60Kevin Tang if (RPC_LOC_ENGINE_STATE_ON != last_state) { 22434ee09551764b045fdc02df754157473125edf60Kevin Tang last_state = RPC_LOC_ENGINE_STATE_ON; 22534ee09551764b045fdc02df754157473125edf60Kevin Tang handleEngineUpEvent(); 22634ee09551764b045fdc02df754157473125edf60Kevin Tang } 22734ee09551764b045fdc02df754157473125edf60Kevin Tang break; 22834ee09551764b045fdc02df754157473125edf60Kevin Tang } 22934ee09551764b045fdc02df754157473125edf60Kevin Tang} 23034ee09551764b045fdc02df754157473125edf60Kevin Tang 231e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoint32 LocApiRpc::locEventCB(rpc_loc_client_handle_type client_handle, 23234ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_mask_type loc_event, 23334ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_event_payload_u_type* loc_event_payload) 23434ee09551764b045fdc02df754157473125edf60Kevin Tang{ 23534ee09551764b045fdc02df754157473125edf60Kevin Tang // Parsed report 23634ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT) 23734ee09551764b045fdc02df754157473125edf60Kevin Tang { 23834ee09551764b045fdc02df754157473125edf60Kevin Tang reportPosition(&loc_event_payload->rpc_loc_event_payload_u_type_u. 23934ee09551764b045fdc02df754157473125edf60Kevin Tang parsed_location_report); 24034ee09551764b045fdc02df754157473125edf60Kevin Tang } 24134ee09551764b045fdc02df754157473125edf60Kevin Tang 24234ee09551764b045fdc02df754157473125edf60Kevin Tang // Satellite report 24334ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_SATELLITE_REPORT) 24434ee09551764b045fdc02df754157473125edf60Kevin Tang { 24534ee09551764b045fdc02df754157473125edf60Kevin Tang reportSv(&loc_event_payload->rpc_loc_event_payload_u_type_u.gnss_report); 24634ee09551764b045fdc02df754157473125edf60Kevin Tang } 24734ee09551764b045fdc02df754157473125edf60Kevin Tang 24834ee09551764b045fdc02df754157473125edf60Kevin Tang // Status report 24934ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_STATUS_REPORT) 25034ee09551764b045fdc02df754157473125edf60Kevin Tang { 25134ee09551764b045fdc02df754157473125edf60Kevin Tang reportStatus(&loc_event_payload->rpc_loc_event_payload_u_type_u.status_report); 25234ee09551764b045fdc02df754157473125edf60Kevin Tang } 25334ee09551764b045fdc02df754157473125edf60Kevin Tang 25434ee09551764b045fdc02df754157473125edf60Kevin Tang // NMEA 25534ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_NMEA_1HZ_REPORT) 25634ee09551764b045fdc02df754157473125edf60Kevin Tang { 25734ee09551764b045fdc02df754157473125edf60Kevin Tang reportNmea(&(loc_event_payload->rpc_loc_event_payload_u_type_u.nmea_report)); 25834ee09551764b045fdc02df754157473125edf60Kevin Tang } 25934ee09551764b045fdc02df754157473125edf60Kevin Tang // XTRA support: supports only XTRA download 26034ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST) 26134ee09551764b045fdc02df754157473125edf60Kevin Tang { 26234ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 26334ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_DATA_PREDICTED_ORBITS_REQ) 26434ee09551764b045fdc02df754157473125edf60Kevin Tang { 26534ee09551764b045fdc02df754157473125edf60Kevin Tang requestXtraData(); 26634ee09551764b045fdc02df754157473125edf60Kevin Tang } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 26734ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_DATA_TIME_REQ) 26834ee09551764b045fdc02df754157473125edf60Kevin Tang { 26934ee09551764b045fdc02df754157473125edf60Kevin Tang requestTime(); 27034ee09551764b045fdc02df754157473125edf60Kevin Tang } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 27134ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_DATA_POSITION_INJECTION_REQ) 27234ee09551764b045fdc02df754157473125edf60Kevin Tang { 27334ee09551764b045fdc02df754157473125edf60Kevin Tang requestLocation(); 27434ee09551764b045fdc02df754157473125edf60Kevin Tang } 27534ee09551764b045fdc02df754157473125edf60Kevin Tang } 27634ee09551764b045fdc02df754157473125edf60Kevin Tang 27734ee09551764b045fdc02df754157473125edf60Kevin Tang // AGPS data request 27834ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_LOCATION_SERVER_REQUEST) 27934ee09551764b045fdc02df754157473125edf60Kevin Tang { 28034ee09551764b045fdc02df754157473125edf60Kevin Tang ATLEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u. 28134ee09551764b045fdc02df754157473125edf60Kevin Tang loc_server_request); 28234ee09551764b045fdc02df754157473125edf60Kevin Tang } 28334ee09551764b045fdc02df754157473125edf60Kevin Tang 28434ee09551764b045fdc02df754157473125edf60Kevin Tang // NI notify request 28534ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_event & RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST) 28634ee09551764b045fdc02df754157473125edf60Kevin Tang { 28734ee09551764b045fdc02df754157473125edf60Kevin Tang NIEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.ni_request); 28834ee09551764b045fdc02df754157473125edf60Kevin Tang } 28934ee09551764b045fdc02df754157473125edf60Kevin Tang 29034ee09551764b045fdc02df754157473125edf60Kevin Tang return RPC_LOC_API_SUCCESS;//We simply want to return sucess here as we do not want to 29134ee09551764b045fdc02df754157473125edf60Kevin Tang // cause any issues in RPC thread context 29234ee09551764b045fdc02df754157473125edf60Kevin Tang} 29334ee09551764b045fdc02df754157473125edf60Kevin Tang 29434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 295e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::open(LOC_API_ADAPTER_EVENT_MASK_T mask) 29634ee09551764b045fdc02df754157473125edf60Kevin Tang{ 29734ee09551764b045fdc02df754157473125edf60Kevin Tang enum loc_api_adapter_err ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 29834ee09551764b045fdc02df754157473125edf60Kevin Tang 299e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // RPC does not dynamically update the event mask. And in the 300e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // case of RPC, all we support are positioning (gps + agps) 301e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // masks anyways, so we simply mask all of them on always. 302e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // After doing so the first time in a power cycle, we know there 303e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // will the following if condition will never be true any more. 304e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mask = maskAll; 30534ee09551764b045fdc02df754157473125edf60Kevin Tang 306e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (mask != mMask) { 307e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) { 308e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo close(); 309e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 310e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 311e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mMask = mask; 312e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // it is important to cap the mask here, because not all LocApi's 313e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // can enable the same bits, e.g. foreground and bckground. 314e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo client_handle = loc_open(convertMask(mask), 315e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_event_cb, 316e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_rpc_global_cb, this); 317e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 318e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (client_handle < 0) { 319e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mMask = 0; 320e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo client_handle = RPC_LOC_CLIENT_HANDLE_INVALID; 321e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ret_val = LOC_API_ADAPTER_ERR_INVALID_HANDLE; 322e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 32334ee09551764b045fdc02df754157473125edf60Kevin Tang } 32434ee09551764b045fdc02df754157473125edf60Kevin Tang 32534ee09551764b045fdc02df754157473125edf60Kevin Tang return ret_val; 32634ee09551764b045fdc02df754157473125edf60Kevin Tang} 32734ee09551764b045fdc02df754157473125edf60Kevin Tang 32834ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 329e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::close() 330e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 331e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) { 332e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_clear(client_handle); 333e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 334e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 335e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_close(client_handle); 336e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mMask = 0; 337e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo client_handle = RPC_LOC_CLIENT_HANDLE_INVALID; 338e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 339e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return LOC_API_ADAPTER_ERR_SUCCESS; 340e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 341e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 342e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoenum loc_api_adapter_err 343e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::startFix(const LocPosMode& posMode) { 344e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGD("LocApiRpc::startFix() called"); 34534ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 34634ee09551764b045fdc02df754157473125edf60Kevin Tang loc_start_fix(client_handle) 34734ee09551764b045fdc02df754157473125edf60Kevin Tang ); 34834ee09551764b045fdc02df754157473125edf60Kevin Tang} 34934ee09551764b045fdc02df754157473125edf60Kevin Tang 35034ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 351e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::stopFix() { 352e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGD("LocApiRpc::stopFix() called"); 35334ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 35434ee09551764b045fdc02df754157473125edf60Kevin Tang loc_stop_fix(client_handle) 35534ee09551764b045fdc02df754157473125edf60Kevin Tang ); 35634ee09551764b045fdc02df754157473125edf60Kevin Tang} 35734ee09551764b045fdc02df754157473125edf60Kevin Tang 35834ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 359e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setPositionMode(const LocPosMode& posMode) 36034ee09551764b045fdc02df754157473125edf60Kevin Tang{ 36134ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 362e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rpc_loc_fix_criteria_s_type *fix_criteria_ptr = 363e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo &ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria; 36434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_SET_FIX_CRITERIA; 36534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_operation_mode_e_type op_mode; 36634ee09551764b045fdc02df754157473125edf60Kevin Tang int ret_val; 367e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const LocPosMode* fixCriteria = &posMode; 36834ee09551764b045fdc02df754157473125edf60Kevin Tang 369e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ALOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n", 370e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo (int32) client_handle, fixCriteria->min_interval, fixCriteria->mode); 37134ee09551764b045fdc02df754157473125edf60Kevin Tang 372e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo switch (fixCriteria->mode) 37334ee09551764b045fdc02df754157473125edf60Kevin Tang { 37434ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_POSITION_MODE_MS_BASED: 37534ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_MSB; 37634ee09551764b045fdc02df754157473125edf60Kevin Tang break; 37734ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_POSITION_MODE_MS_ASSISTED: 37834ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_MSA; 37934ee09551764b045fdc02df754157473125edf60Kevin Tang break; 38034ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_POSITION_MODE_RESERVED_1: 38134ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_SPEED_OPTIMAL; 38234ee09551764b045fdc02df754157473125edf60Kevin Tang break; 38334ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_POSITION_MODE_RESERVED_2: 38434ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_ACCURACY_OPTIMAL; 38534ee09551764b045fdc02df754157473125edf60Kevin Tang break; 38634ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_POSITION_MODE_RESERVED_3: 38734ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_DATA_OPTIMAL; 38834ee09551764b045fdc02df754157473125edf60Kevin Tang break; 38934ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_POSITION_MODE_RESERVED_4: 390e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo case LOC_POSITION_MODE_RESERVED_5: 39134ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_MSA; 39234ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->preferred_response_time = 0; 39334ee09551764b045fdc02df754157473125edf60Kevin Tang break; 39434ee09551764b045fdc02df754157473125edf60Kevin Tang default: 39534ee09551764b045fdc02df754157473125edf60Kevin Tang op_mode = RPC_LOC_OPER_MODE_STANDALONE; 39634ee09551764b045fdc02df754157473125edf60Kevin Tang } 39734ee09551764b045fdc02df754157473125edf60Kevin Tang 39834ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE | 39934ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE; 400e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo fix_criteria_ptr->min_interval = fixCriteria->min_interval; 40134ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->preferred_operation_mode = op_mode; 40234ee09551764b045fdc02df754157473125edf60Kevin Tang 403e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo fix_criteria_ptr->min_interval = fixCriteria->min_interval; 404e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL; 405e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 406e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (fixCriteria->preferred_accuracy > 0) { 407e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo fix_criteria_ptr->preferred_accuracy = fixCriteria->preferred_accuracy; 40834ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY; 40934ee09551764b045fdc02df754157473125edf60Kevin Tang } 410e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (fixCriteria->preferred_time > 0) { 411e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo fix_criteria_ptr->preferred_response_time = fixCriteria->preferred_time; 41234ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME; 41334ee09551764b045fdc02df754157473125edf60Kevin Tang } 41434ee09551764b045fdc02df754157473125edf60Kevin Tang 415e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo switch (fixCriteria->recurrence) { 41634ee09551764b045fdc02df754157473125edf60Kevin Tang case GPS_POSITION_RECURRENCE_SINGLE: 41734ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX; 41834ee09551764b045fdc02df754157473125edf60Kevin Tang break; 41934ee09551764b045fdc02df754157473125edf60Kevin Tang case GPS_POSITION_RECURRENCE_PERIODIC: 42034ee09551764b045fdc02df754157473125edf60Kevin Tang default: 42134ee09551764b045fdc02df754157473125edf60Kevin Tang fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX; 42234ee09551764b045fdc02df754157473125edf60Kevin Tang break; 42334ee09551764b045fdc02df754157473125edf60Kevin Tang } 42434ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = ioctl_type; 42534ee09551764b045fdc02df754157473125edf60Kevin Tang 42634ee09551764b045fdc02df754157473125edf60Kevin Tang ret_val = loc_eng_ioctl (client_handle, 42734ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_type, 42834ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 42934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 43034ee09551764b045fdc02df754157473125edf60Kevin Tang NULL /* No output information is expected*/); 43134ee09551764b045fdc02df754157473125edf60Kevin Tang 43234ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr(ret_val); 43334ee09551764b045fdc02df754157473125edf60Kevin Tang} 43434ee09551764b045fdc02df754157473125edf60Kevin Tang 43534ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 436e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setTime(GpsUtcTime time, int64_t timeReference, int uncertainty) 43734ee09551764b045fdc02df754157473125edf60Kevin Tang{ 43834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 43934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_assist_data_time_s_type *time_info_ptr; 44034ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_INJECT_UTC_TIME; 44134ee09551764b045fdc02df754157473125edf60Kevin Tang int ret_val; 44234ee09551764b045fdc02df754157473125edf60Kevin Tang 44334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD ("loc_eng_inject_time, uncertainty = %d\n", uncertainty); 44434ee09551764b045fdc02df754157473125edf60Kevin Tang 44534ee09551764b045fdc02df754157473125edf60Kevin Tang time_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_time; 44634ee09551764b045fdc02df754157473125edf60Kevin Tang time_info_ptr->time_utc = time; 447e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo time_info_ptr->time_utc += (int64_t)(ELAPSED_MILLIS_SINCE_BOOT_PLATFORM_LIB_ABSTRACTION - timeReference); 44834ee09551764b045fdc02df754157473125edf60Kevin Tang time_info_ptr->uncertainty = uncertainty; // Uncertainty in ms 44934ee09551764b045fdc02df754157473125edf60Kevin Tang 45034ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = ioctl_type; 45134ee09551764b045fdc02df754157473125edf60Kevin Tang 45234ee09551764b045fdc02df754157473125edf60Kevin Tang ret_val = loc_eng_ioctl (client_handle, 45334ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_type, 45434ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 45534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 45634ee09551764b045fdc02df754157473125edf60Kevin Tang NULL /* No output information is expected*/); 45734ee09551764b045fdc02df754157473125edf60Kevin Tang 45834ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr(ret_val); 45934ee09551764b045fdc02df754157473125edf60Kevin Tang} 46034ee09551764b045fdc02df754157473125edf60Kevin Tang 46134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 462e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::injectPosition(double latitude, double longitude, float accuracy) 46334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 46434ee09551764b045fdc02df754157473125edf60Kevin Tang /* IOCTL data */ 46534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 46634ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_assist_data_pos_s_type *assistance_data_position = 46734ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_position; 46834ee09551764b045fdc02df754157473125edf60Kevin Tang int ret_val; 46934ee09551764b045fdc02df754157473125edf60Kevin Tang 47034ee09551764b045fdc02df754157473125edf60Kevin Tang /************************************************ 47134ee09551764b045fdc02df754157473125edf60Kevin Tang * Fill in latitude, longitude & accuracy 47234ee09551764b045fdc02df754157473125edf60Kevin Tang ************************************************/ 47334ee09551764b045fdc02df754157473125edf60Kevin Tang 47434ee09551764b045fdc02df754157473125edf60Kevin Tang /* This combo is required */ 47534ee09551764b045fdc02df754157473125edf60Kevin Tang assistance_data_position->valid_mask = 47634ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_POS_VALID_LATITUDE | 47734ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_POS_VALID_LONGITUDE | 47834ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_POS_VALID_HOR_UNC_CIRCULAR | 47934ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_ASSIST_POS_VALID_CONFIDENCE_HORIZONTAL; 48034ee09551764b045fdc02df754157473125edf60Kevin Tang 48134ee09551764b045fdc02df754157473125edf60Kevin Tang assistance_data_position->latitude = latitude; 48234ee09551764b045fdc02df754157473125edf60Kevin Tang assistance_data_position->longitude = longitude; 48334ee09551764b045fdc02df754157473125edf60Kevin Tang assistance_data_position->hor_unc_circular = accuracy; /* Meters assumed */ 48434ee09551764b045fdc02df754157473125edf60Kevin Tang assistance_data_position->confidence_horizontal = 63; /* 63% (1 std dev) assumed */ 48534ee09551764b045fdc02df754157473125edf60Kevin Tang 48634ee09551764b045fdc02df754157473125edf60Kevin Tang /* Log */ 48734ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("Inject coarse position Lat=%lf, Lon=%lf, Acc=%.2lf\n", 48834ee09551764b045fdc02df754157473125edf60Kevin Tang (double) assistance_data_position->latitude, 48934ee09551764b045fdc02df754157473125edf60Kevin Tang (double) assistance_data_position->longitude, 49034ee09551764b045fdc02df754157473125edf60Kevin Tang (double) assistance_data_position->hor_unc_circular); 49134ee09551764b045fdc02df754157473125edf60Kevin Tang 49234ee09551764b045fdc02df754157473125edf60Kevin Tang ret_val = loc_eng_ioctl( client_handle, 49334ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_IOCTL_INJECT_POSITION, 49434ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 49534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 49634ee09551764b045fdc02df754157473125edf60Kevin Tang NULL /* No output information is expected*/); 49734ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr(ret_val); 49834ee09551764b045fdc02df754157473125edf60Kevin Tang} 49934ee09551764b045fdc02df754157473125edf60Kevin Tang 50034ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 501e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::informNiResponse(GpsUserResponseType userResponse, 50234ee09551764b045fdc02df754157473125edf60Kevin Tang const void* passThroughData) 50334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 50434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type data; 50534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_callback_s_type callback_payload; 50634ee09551764b045fdc02df754157473125edf60Kevin Tang 50734ee09551764b045fdc02df754157473125edf60Kevin Tang memcpy(&data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.ni_event_pass_back, 50834ee09551764b045fdc02df754157473125edf60Kevin Tang passThroughData, sizeof (rpc_loc_ni_event_s_type)); 50934ee09551764b045fdc02df754157473125edf60Kevin Tang 51034ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ni_user_resp_e_type resp; 51134ee09551764b045fdc02df754157473125edf60Kevin Tang switch (userResponse) 51234ee09551764b045fdc02df754157473125edf60Kevin Tang { 51334ee09551764b045fdc02df754157473125edf60Kevin Tang case GPS_NI_RESPONSE_ACCEPT: 51434ee09551764b045fdc02df754157473125edf60Kevin Tang data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = 51534ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_NI_LCS_NOTIFY_VERIFY_ACCEPT; 51634ee09551764b045fdc02df754157473125edf60Kevin Tang break; 51734ee09551764b045fdc02df754157473125edf60Kevin Tang case GPS_NI_RESPONSE_DENY: 51834ee09551764b045fdc02df754157473125edf60Kevin Tang data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = 51934ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_NI_LCS_NOTIFY_VERIFY_DENY; 52034ee09551764b045fdc02df754157473125edf60Kevin Tang break; 52134ee09551764b045fdc02df754157473125edf60Kevin Tang case GPS_NI_RESPONSE_NORESP: 52234ee09551764b045fdc02df754157473125edf60Kevin Tang default: 52334ee09551764b045fdc02df754157473125edf60Kevin Tang data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = 52434ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_NI_LCS_NOTIFY_VERIFY_NORESP; 52534ee09551764b045fdc02df754157473125edf60Kevin Tang break; 52634ee09551764b045fdc02df754157473125edf60Kevin Tang } 52734ee09551764b045fdc02df754157473125edf60Kevin Tang 52834ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 52934ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl(client_handle, 53034ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE, 53134ee09551764b045fdc02df754157473125edf60Kevin Tang &data, 53234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 53334ee09551764b045fdc02df754157473125edf60Kevin Tang &callback_payload) 53434ee09551764b045fdc02df754157473125edf60Kevin Tang ); 53534ee09551764b045fdc02df754157473125edf60Kevin Tang} 53634ee09551764b045fdc02df754157473125edf60Kevin Tang 53734ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 538e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setAPN(char* apn, int len, boolean force) 53934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 540e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS; 541e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo int size = sizeof(apnLastSet); 542e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (force || memcmp(apnLastSet, apn, size)) { 543e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (len < size) { 544e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // size will be not larger than its original value 545e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo size = len + 1; 546e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 547e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo memcpy(apnLastSet, apn, size); 548e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 549e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (!isInSession()) { 550e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, {0}}; 551e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].srv_system_type = LOC_APN_PROFILE_SRV_SYS_MAX; 552e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].pdp_type = LOC_APN_PROFILE_PDN_TYPE_IPV4; 553e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo memcpy(&(ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].apn_name), apn, size); 554e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 555e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rtv = convertErr( 556e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_eng_ioctl (client_handle, 557e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, 558e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo &ioctl_data, 559e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_IOCTL_DEFAULT_TIMEOUT, 560e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo NULL) 561e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ); 562e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 563e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 564e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return rtv; 565e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 566e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 567e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::setInSession(bool inSession) 568e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 569e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (!inSession) { 570e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo enableData(dataEnableLastSet, true); 571e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo setAPN(apnLastSet, sizeof(apnLastSet)-1, true); 572e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 57334ee09551764b045fdc02df754157473125edf60Kevin Tang} 57434ee09551764b045fdc02df754157473125edf60Kevin Tang 57534ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 576e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setServer(const char* url, int len) 57734ee09551764b045fdc02df754157473125edf60Kevin Tang{ 57834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 57934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_server_info_s_type *server_info_ptr; 58034ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_e_type ioctl_cmd; 58134ee09551764b045fdc02df754157473125edf60Kevin Tang 58234ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_cmd = RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR; 58334ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = ioctl_cmd; 58434ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr; 58534ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_URL; 58634ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.disc = server_info_ptr->addr_type; 58734ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.length = len; 58834ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 58934ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_val = (char*) url; 59034ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_len= len; 59134ee09551764b045fdc02df754157473125edf60Kevin Tang#else 59234ee09551764b045fdc02df754157473125edf60Kevin Tang strlcpy(server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr, url, 59334ee09551764b045fdc02df754157473125edf60Kevin Tang sizeof server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr); 59434ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */ 59534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD ("loc_eng_set_server, addr = %s\n", url); 59634ee09551764b045fdc02df754157473125edf60Kevin Tang 59734ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 59834ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl (client_handle, 59934ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_cmd, 60034ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 60134ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 60234ee09551764b045fdc02df754157473125edf60Kevin Tang NULL /* No output information is expected*/) 60334ee09551764b045fdc02df754157473125edf60Kevin Tang ); 60434ee09551764b045fdc02df754157473125edf60Kevin Tang} 60534ee09551764b045fdc02df754157473125edf60Kevin Tang 60634ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 607e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setServer(unsigned int ip, int port, LocServerType type) 60834ee09551764b045fdc02df754157473125edf60Kevin Tang{ 60934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 61034ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_server_info_s_type *server_info_ptr; 61134ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_e_type ioctl_cmd; 61234ee09551764b045fdc02df754157473125edf60Kevin Tang 61334ee09551764b045fdc02df754157473125edf60Kevin Tang switch (type) { 61434ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_AGPS_MPC_SERVER: 61534ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR; 61634ee09551764b045fdc02df754157473125edf60Kevin Tang break; 61734ee09551764b045fdc02df754157473125edf60Kevin Tang case LOC_AGPS_CUSTOM_PDE_SERVER: 61834ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_cmd = RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR; 61934ee09551764b045fdc02df754157473125edf60Kevin Tang break; 62034ee09551764b045fdc02df754157473125edf60Kevin Tang default: 62134ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR; 62234ee09551764b045fdc02df754157473125edf60Kevin Tang break; 62334ee09551764b045fdc02df754157473125edf60Kevin Tang } 62434ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = ioctl_cmd; 62534ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr; 62634ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_IPV4; 62734ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.disc = server_info_ptr->addr_type; 62834ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.addr = ip; 62934ee09551764b045fdc02df754157473125edf60Kevin Tang server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.port = port; 63034ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD ("setServer, addr = %X:%d\n", (unsigned int) ip, (unsigned int) port); 63134ee09551764b045fdc02df754157473125edf60Kevin Tang 63234ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 63334ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl (client_handle, 63434ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_cmd, 63534ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 63634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 63734ee09551764b045fdc02df754157473125edf60Kevin Tang NULL /* No output information is expected*/) 63834ee09551764b045fdc02df754157473125edf60Kevin Tang ); 63934ee09551764b045fdc02df754157473125edf60Kevin Tang} 64034ee09551764b045fdc02df754157473125edf60Kevin Tang 64134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 642e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::enableData(int enable, boolean force) 64334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 644e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS; 645e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (force || dataEnableLastSet != enable) { 646e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo dataEnableLastSet = enable; 64734ee09551764b045fdc02df754157473125edf60Kevin Tang 648e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (!isInSession()) { 649e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_DATA_ENABLE, {0}}; 650e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 651e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ioctl_data.rpc_loc_ioctl_data_u_type_u.data_enable = enable; 652e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rtv = convertErr( 653e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_eng_ioctl (client_handle, 654e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo RPC_LOC_IOCTL_SET_DATA_ENABLE, 655e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo &ioctl_data, 656e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_IOCTL_DEFAULT_TIMEOUT, 657e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo NULL) 658e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo ); 659e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 660e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 661e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return rtv; 66234ee09551764b045fdc02df754157473125edf60Kevin Tang} 66334ee09551764b045fdc02df754157473125edf60Kevin Tang 66434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 665e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::deleteAidingData(GpsAidingData bits) 66634ee09551764b045fdc02df754157473125edf60Kevin Tang{ 66734ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_DELETE_ASSIST_DATA, {0}}; 66834ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete.type = bits; 66934ee09551764b045fdc02df754157473125edf60Kevin Tang 67034ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 67134ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl (client_handle, 67234ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_IOCTL_DELETE_ASSIST_DATA, 67334ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 67434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 67534ee09551764b045fdc02df754157473125edf60Kevin Tang NULL) 67634ee09551764b045fdc02df754157473125edf60Kevin Tang ); 67734ee09551764b045fdc02df754157473125edf60Kevin Tang} 67834ee09551764b045fdc02df754157473125edf60Kevin Tang 679e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr) 68034ee09551764b045fdc02df754157473125edf60Kevin Tang{ 681e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT; 682e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 683e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo UlpLocation location = {0}; 684e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo GpsLocationExtended locationExtended = {0}; 68534ee09551764b045fdc02df754157473125edf60Kevin Tang 68634ee09551764b045fdc02df754157473125edf60Kevin Tang location.size = sizeof(location); 687e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.size = sizeof(locationExtended); 68834ee09551764b045fdc02df754157473125edf60Kevin Tang if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SESSION_STATUS) 68934ee09551764b045fdc02df754157473125edf60Kevin Tang { 69034ee09551764b045fdc02df754157473125edf60Kevin Tang // Process the position from final and intermediate reports 69134ee09551764b045fdc02df754157473125edf60Kevin Tang if (location_report_ptr->session_status == RPC_LOC_SESS_STATUS_SUCCESS || 69234ee09551764b045fdc02df754157473125edf60Kevin Tang location_report_ptr->session_status == RPC_LOC_SESS_STATUS_IN_PROGESS) 69334ee09551764b045fdc02df754157473125edf60Kevin Tang { 69434ee09551764b045fdc02df754157473125edf60Kevin Tang // Latitude & Longitude 69534ee09551764b045fdc02df754157473125edf60Kevin Tang if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LATITUDE) && 69634ee09551764b045fdc02df754157473125edf60Kevin Tang (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LONGITUDE) && 69734ee09551764b045fdc02df754157473125edf60Kevin Tang (location_report_ptr->latitude != 0 || 69834ee09551764b045fdc02df754157473125edf60Kevin Tang location_report_ptr->longitude != 0)) 69934ee09551764b045fdc02df754157473125edf60Kevin Tang { 700e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.flags |= GPS_LOCATION_HAS_LAT_LONG; 701e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.latitude = location_report_ptr->latitude; 702e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.longitude = location_report_ptr->longitude; 70334ee09551764b045fdc02df754157473125edf60Kevin Tang 70434ee09551764b045fdc02df754157473125edf60Kevin Tang // Time stamp (UTC) 70534ee09551764b045fdc02df754157473125edf60Kevin Tang if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_TIMESTAMP_UTC) 70634ee09551764b045fdc02df754157473125edf60Kevin Tang { 707e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.timestamp = location_report_ptr->timestamp_utc; 70834ee09551764b045fdc02df754157473125edf60Kevin Tang } 70934ee09551764b045fdc02df754157473125edf60Kevin Tang 71034ee09551764b045fdc02df754157473125edf60Kevin Tang // Altitude 71134ee09551764b045fdc02df754157473125edf60Kevin Tang if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_ELLIPSOID ) 71234ee09551764b045fdc02df754157473125edf60Kevin Tang { 713e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.flags |= GPS_LOCATION_HAS_ALTITUDE; 714e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.altitude = location_report_ptr->altitude_wrt_ellipsoid; 71534ee09551764b045fdc02df754157473125edf60Kevin Tang } 71634ee09551764b045fdc02df754157473125edf60Kevin Tang 71734ee09551764b045fdc02df754157473125edf60Kevin Tang // Speed 71834ee09551764b045fdc02df754157473125edf60Kevin Tang if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_HORIZONTAL) && 71934ee09551764b045fdc02df754157473125edf60Kevin Tang (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_VERTICAL)) 72034ee09551764b045fdc02df754157473125edf60Kevin Tang { 721e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.flags |= GPS_LOCATION_HAS_SPEED; 722e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.speed = sqrt(location_report_ptr->speed_horizontal * location_report_ptr->speed_horizontal + 72334ee09551764b045fdc02df754157473125edf60Kevin Tang location_report_ptr->speed_vertical * location_report_ptr->speed_vertical); 72434ee09551764b045fdc02df754157473125edf60Kevin Tang } 72534ee09551764b045fdc02df754157473125edf60Kevin Tang 72634ee09551764b045fdc02df754157473125edf60Kevin Tang // Heading 72734ee09551764b045fdc02df754157473125edf60Kevin Tang if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HEADING) 72834ee09551764b045fdc02df754157473125edf60Kevin Tang { 729e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.flags |= GPS_LOCATION_HAS_BEARING; 730e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.bearing = location_report_ptr->heading; 73134ee09551764b045fdc02df754157473125edf60Kevin Tang } 73234ee09551764b045fdc02df754157473125edf60Kevin Tang 73334ee09551764b045fdc02df754157473125edf60Kevin Tang // Uncertainty (circular) 73434ee09551764b045fdc02df754157473125edf60Kevin Tang if ( (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HOR_UNC_CIRCULAR) ) 73534ee09551764b045fdc02df754157473125edf60Kevin Tang { 736e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.flags |= GPS_LOCATION_HAS_ACCURACY; 737e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.accuracy = location_report_ptr->hor_unc_circular; 738e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 739e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 740e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo // Technology Mask 741e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 742e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo tech_Mask |= location_report_ptr->technology_mask; 743e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo //Mark the location source as from GNSS 744e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO; 745e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location.position_source = ULP_LOCATION_IS_FROM_GNSS; 746e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_MEAN_SEA_LEVEL) 747e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 748e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL; 749e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.altitudeMeanSeaLevel = location_report_ptr->altitude_wrt_mean_sea_level; 750e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 751e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 752e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_MAGNETIC_VARIATION ) 753e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 754e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_MAG_DEV; 755e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.magneticDeviation = location_report_ptr->magnetic_deviation; 756e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 757e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 758e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_VERTICAL_UNC) 759e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 760e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_VERT_UNC; 761e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.vert_unc = location_report_ptr->vert_unc; 762e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 763e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 764e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_UNC) 765e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 766e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_SPEED_UNC; 767e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.speed_unc = location_report_ptr->speed_unc; 76834ee09551764b045fdc02df754157473125edf60Kevin Tang } 76934ee09551764b045fdc02df754157473125edf60Kevin Tang 77034ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("reportPosition: fire callback\n"); 771e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo enum loc_sess_status fixStatus = 772e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo (location_report_ptr->session_status 773e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo == RPC_LOC_SESS_STATUS_IN_PROGESS ? 774e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS); 775e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportPosition(location, 776e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended, 777e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo (void*)location_report_ptr, 778e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo fixStatus, 779e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo tech_Mask); 78034ee09551764b045fdc02df754157473125edf60Kevin Tang } 78134ee09551764b045fdc02df754157473125edf60Kevin Tang } 78234ee09551764b045fdc02df754157473125edf60Kevin Tang else 78334ee09551764b045fdc02df754157473125edf60Kevin Tang { 784e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportPosition(location, 785e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended, 786e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo NULL, 787e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_SESS_FAILURE); 788e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGV("loc_eng_report_position: ignore position report " 789e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo "when session status = %d\n", 790e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo location_report_ptr->session_status); 79134ee09551764b045fdc02df754157473125edf60Kevin Tang } 79234ee09551764b045fdc02df754157473125edf60Kevin Tang } 79334ee09551764b045fdc02df754157473125edf60Kevin Tang else 79434ee09551764b045fdc02df754157473125edf60Kevin Tang { 795e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGV("loc_eng_report_position: ignore position report " 796e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo "when session status is not set\n"); 79734ee09551764b045fdc02df754157473125edf60Kevin Tang } 79834ee09551764b045fdc02df754157473125edf60Kevin Tang} 79934ee09551764b045fdc02df754157473125edf60Kevin Tang 800e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr) 80134ee09551764b045fdc02df754157473125edf60Kevin Tang{ 80234ee09551764b045fdc02df754157473125edf60Kevin Tang GpsSvStatus SvStatus = {0}; 803e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo GpsLocationExtended locationExtended = {0}; 804e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.size = sizeof(locationExtended); 80534ee09551764b045fdc02df754157473125edf60Kevin Tang int num_svs_max = 0; 80634ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_sv_info_s_type *sv_info_ptr; 80734ee09551764b045fdc02df754157473125edf60Kevin Tang 80834ee09551764b045fdc02df754157473125edf60Kevin Tang if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_COUNT) 80934ee09551764b045fdc02df754157473125edf60Kevin Tang { 81034ee09551764b045fdc02df754157473125edf60Kevin Tang num_svs_max = gnss_report_ptr->sv_count; 81134ee09551764b045fdc02df754157473125edf60Kevin Tang if (num_svs_max > GPS_MAX_SVS) 81234ee09551764b045fdc02df754157473125edf60Kevin Tang { 81334ee09551764b045fdc02df754157473125edf60Kevin Tang num_svs_max = GPS_MAX_SVS; 81434ee09551764b045fdc02df754157473125edf60Kevin Tang } 81534ee09551764b045fdc02df754157473125edf60Kevin Tang } 81634ee09551764b045fdc02df754157473125edf60Kevin Tang 81734ee09551764b045fdc02df754157473125edf60Kevin Tang if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_LIST) 81834ee09551764b045fdc02df754157473125edf60Kevin Tang { 81934ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.num_svs = 0; 82034ee09551764b045fdc02df754157473125edf60Kevin Tang 82134ee09551764b045fdc02df754157473125edf60Kevin Tang for (int i = 0; i < num_svs_max; i++) 82234ee09551764b045fdc02df754157473125edf60Kevin Tang { 82334ee09551764b045fdc02df754157473125edf60Kevin Tang sv_info_ptr = &(gnss_report_ptr->sv_list.sv_list_val[i]); 82434ee09551764b045fdc02df754157473125edf60Kevin Tang if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SYSTEM) 82534ee09551764b045fdc02df754157473125edf60Kevin Tang { 82634ee09551764b045fdc02df754157473125edf60Kevin Tang if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GPS) 82734ee09551764b045fdc02df754157473125edf60Kevin Tang { 82834ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].size = sizeof(GpsSvStatus); 82934ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn; 83034ee09551764b045fdc02df754157473125edf60Kevin Tang 83134ee09551764b045fdc02df754157473125edf60Kevin Tang // We only have the data field to report gps eph and alm mask 83234ee09551764b045fdc02df754157473125edf60Kevin Tang if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_EPH) && 83334ee09551764b045fdc02df754157473125edf60Kevin Tang (sv_info_ptr->has_eph == 1)) 83434ee09551764b045fdc02df754157473125edf60Kevin Tang { 83534ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.ephemeris_mask |= (1 << (sv_info_ptr->prn-1)); 83634ee09551764b045fdc02df754157473125edf60Kevin Tang } 83734ee09551764b045fdc02df754157473125edf60Kevin Tang 83834ee09551764b045fdc02df754157473125edf60Kevin Tang if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_ALM) && 83934ee09551764b045fdc02df754157473125edf60Kevin Tang (sv_info_ptr->has_alm == 1)) 84034ee09551764b045fdc02df754157473125edf60Kevin Tang { 84134ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.almanac_mask |= (1 << (sv_info_ptr->prn-1)); 84234ee09551764b045fdc02df754157473125edf60Kevin Tang } 84334ee09551764b045fdc02df754157473125edf60Kevin Tang 84434ee09551764b045fdc02df754157473125edf60Kevin Tang if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) && 84534ee09551764b045fdc02df754157473125edf60Kevin Tang (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK)) 84634ee09551764b045fdc02df754157473125edf60Kevin Tang { 84734ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.used_in_fix_mask |= (1 << (sv_info_ptr->prn-1)); 84834ee09551764b045fdc02df754157473125edf60Kevin Tang } 84934ee09551764b045fdc02df754157473125edf60Kevin Tang } 85034ee09551764b045fdc02df754157473125edf60Kevin Tang // SBAS: GPS RPN: 120-151, 85134ee09551764b045fdc02df754157473125edf60Kevin Tang // In exteneded measurement report, we follow nmea standard, which is from 33-64. 85234ee09551764b045fdc02df754157473125edf60Kevin Tang else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_SBAS) 85334ee09551764b045fdc02df754157473125edf60Kevin Tang { 85434ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + 33 - 120; 85534ee09551764b045fdc02df754157473125edf60Kevin Tang } 85634ee09551764b045fdc02df754157473125edf60Kevin Tang // Gloness: Slot id: 1-32 85734ee09551764b045fdc02df754157473125edf60Kevin Tang // In extended measurement report, we follow nmea standard, which is 65-96 85834ee09551764b045fdc02df754157473125edf60Kevin Tang else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GLONASS) 85934ee09551764b045fdc02df754157473125edf60Kevin Tang { 86034ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + (65-1); 86134ee09551764b045fdc02df754157473125edf60Kevin Tang } 86234ee09551764b045fdc02df754157473125edf60Kevin Tang // Unsupported SV system 86334ee09551764b045fdc02df754157473125edf60Kevin Tang else 86434ee09551764b045fdc02df754157473125edf60Kevin Tang { 86534ee09551764b045fdc02df754157473125edf60Kevin Tang continue; 86634ee09551764b045fdc02df754157473125edf60Kevin Tang } 86734ee09551764b045fdc02df754157473125edf60Kevin Tang } 86834ee09551764b045fdc02df754157473125edf60Kevin Tang 86934ee09551764b045fdc02df754157473125edf60Kevin Tang if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SNR) 87034ee09551764b045fdc02df754157473125edf60Kevin Tang { 87134ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].snr = sv_info_ptr->snr; 87234ee09551764b045fdc02df754157473125edf60Kevin Tang } 87334ee09551764b045fdc02df754157473125edf60Kevin Tang 87434ee09551764b045fdc02df754157473125edf60Kevin Tang if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_ELEVATION) 87534ee09551764b045fdc02df754157473125edf60Kevin Tang { 87634ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].elevation = sv_info_ptr->elevation; 87734ee09551764b045fdc02df754157473125edf60Kevin Tang } 87834ee09551764b045fdc02df754157473125edf60Kevin Tang 87934ee09551764b045fdc02df754157473125edf60Kevin Tang if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_AZIMUTH) 88034ee09551764b045fdc02df754157473125edf60Kevin Tang { 88134ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.sv_list[SvStatus.num_svs].azimuth = sv_info_ptr->azimuth; 88234ee09551764b045fdc02df754157473125edf60Kevin Tang } 88334ee09551764b045fdc02df754157473125edf60Kevin Tang 88434ee09551764b045fdc02df754157473125edf60Kevin Tang SvStatus.num_svs++; 88534ee09551764b045fdc02df754157473125edf60Kevin Tang } 88634ee09551764b045fdc02df754157473125edf60Kevin Tang } 88734ee09551764b045fdc02df754157473125edf60Kevin Tang 888e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if ((gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_POS_DOP) && 889e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_HOR_DOP) && 890e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_VERT_DOP)) 891e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 892e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_DOP; 893e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.pdop = gnss_report_ptr->position_dop; 894e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.hdop = gnss_report_ptr->horizontal_dop; 895e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended.vdop = gnss_report_ptr->vertical_dop; 896e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 897e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 89834ee09551764b045fdc02df754157473125edf60Kevin Tang if (SvStatus.num_svs >= 0) 89934ee09551764b045fdc02df754157473125edf60Kevin Tang { 900e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportSv(SvStatus, 901e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo locationExtended, 902e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo (void*)gnss_report_ptr); 90334ee09551764b045fdc02df754157473125edf60Kevin Tang } 90434ee09551764b045fdc02df754157473125edf60Kevin Tang} 90534ee09551764b045fdc02df754157473125edf60Kevin Tang 906e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportStatus(const rpc_loc_status_event_s_type *status_report_ptr) 90734ee09551764b045fdc02df754157473125edf60Kevin Tang{ 90834ee09551764b045fdc02df754157473125edf60Kevin Tang 90934ee09551764b045fdc02df754157473125edf60Kevin Tang if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) { 91034ee09551764b045fdc02df754157473125edf60Kevin Tang if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON) 91134ee09551764b045fdc02df754157473125edf60Kevin Tang { 912e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportStatus(GPS_STATUS_ENGINE_ON); 913e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportStatus(GPS_STATUS_SESSION_BEGIN); 91434ee09551764b045fdc02df754157473125edf60Kevin Tang } 91534ee09551764b045fdc02df754157473125edf60Kevin Tang else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF) 91634ee09551764b045fdc02df754157473125edf60Kevin Tang { 917e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportStatus(GPS_STATUS_SESSION_END); 918e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportStatus(GPS_STATUS_ENGINE_OFF); 91934ee09551764b045fdc02df754157473125edf60Kevin Tang } 92034ee09551764b045fdc02df754157473125edf60Kevin Tang else 92134ee09551764b045fdc02df754157473125edf60Kevin Tang { 922e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportStatus(GPS_STATUS_NONE); 92334ee09551764b045fdc02df754157473125edf60Kevin Tang } 92434ee09551764b045fdc02df754157473125edf60Kevin Tang } 92534ee09551764b045fdc02df754157473125edf60Kevin Tang 92634ee09551764b045fdc02df754157473125edf60Kevin Tang} 92734ee09551764b045fdc02df754157473125edf60Kevin Tang 928e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr) 92934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 93034ee09551764b045fdc02df754157473125edf60Kevin Tang 93134ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 932e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences.nmea_sentences_val, 933e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo nmea_report_ptr->nmea_sentences.nmea_sentences_len); 93434ee09551764b045fdc02df754157473125edf60Kevin Tang#else 935e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences, 936e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo nmea_report_ptr->length); 93734ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("loc_eng_report_nmea: $%c%c%c\n", 938e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo nmea_report_ptr->nmea_sentences[3], 939e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo nmea_report_ptr->nmea_sentences[4], 94034ee09551764b045fdc02df754157473125edf60Kevin Tang nmea_report_ptr->nmea_sentences[5]); 94134ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */ 94234ee09551764b045fdc02df754157473125edf60Kevin Tang} 94334ee09551764b045fdc02df754157473125edf60Kevin Tang 94434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 945e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setXtraData(char* data, int length) 94634ee09551764b045fdc02df754157473125edf60Kevin Tang{ 94734ee09551764b045fdc02df754157473125edf60Kevin Tang int rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; 94834ee09551764b045fdc02df754157473125edf60Kevin Tang int total_parts; 94934ee09551764b045fdc02df754157473125edf60Kevin Tang uint8 part; 95034ee09551764b045fdc02df754157473125edf60Kevin Tang uint16 part_len; 95134ee09551764b045fdc02df754157473125edf60Kevin Tang uint16 len_injected; 95234ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 95334ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA; 95434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_predicted_orbits_data_s_type *predicted_orbits_data_ptr; 95534ee09551764b045fdc02df754157473125edf60Kevin Tang 95634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("qct_loc_eng_inject_xtra_data, xtra size = %d, data ptr = 0x%lx\n", length, (long) data); 95734ee09551764b045fdc02df754157473125edf60Kevin Tang 95834ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.predicted_orbits_data; 95934ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->format_type = RPC_LOC_PREDICTED_ORBITS_XTRA; 96034ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->total_size = length; 96134ee09551764b045fdc02df754157473125edf60Kevin Tang total_parts = (length - 1) / XTRA_BLOCK_SIZE + 1; 96234ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->total_parts = total_parts; 96334ee09551764b045fdc02df754157473125edf60Kevin Tang 96434ee09551764b045fdc02df754157473125edf60Kevin Tang len_injected = 0; // O bytes injected 96534ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = ioctl_type; 96634ee09551764b045fdc02df754157473125edf60Kevin Tang 96734ee09551764b045fdc02df754157473125edf60Kevin Tang // XTRA injection starts with part 1 96834ee09551764b045fdc02df754157473125edf60Kevin Tang for (part = 1; part <= total_parts; part++) 96934ee09551764b045fdc02df754157473125edf60Kevin Tang { 97034ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->part = part; 97134ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->part_len = XTRA_BLOCK_SIZE; 97234ee09551764b045fdc02df754157473125edf60Kevin Tang if (XTRA_BLOCK_SIZE > (length - len_injected)) 97334ee09551764b045fdc02df754157473125edf60Kevin Tang { 97434ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->part_len = length - len_injected; 97534ee09551764b045fdc02df754157473125edf60Kevin Tang } 97634ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->data_ptr.data_ptr_len = predicted_orbits_data_ptr->part_len; 97734ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->data_ptr.data_ptr_val = data + len_injected; 97834ee09551764b045fdc02df754157473125edf60Kevin Tang 97934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("qct_loc_eng_inject_xtra_data, part %d/%d, len = %d, total = %d\n", 98034ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->part, 98134ee09551764b045fdc02df754157473125edf60Kevin Tang total_parts, 98234ee09551764b045fdc02df754157473125edf60Kevin Tang predicted_orbits_data_ptr->part_len, 98334ee09551764b045fdc02df754157473125edf60Kevin Tang len_injected); 98434ee09551764b045fdc02df754157473125edf60Kevin Tang 98534ee09551764b045fdc02df754157473125edf60Kevin Tang if (part < total_parts) 98634ee09551764b045fdc02df754157473125edf60Kevin Tang { 98734ee09551764b045fdc02df754157473125edf60Kevin Tang // No callback in this case 98834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_ret_val = loc_ioctl (client_handle, 98934ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_type, 99034ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data); 99134ee09551764b045fdc02df754157473125edf60Kevin Tang 99234ee09551764b045fdc02df754157473125edf60Kevin Tang if (rpc_ret_val != RPC_LOC_API_SUCCESS) 99334ee09551764b045fdc02df754157473125edf60Kevin Tang { 99434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("loc_ioctl for xtra error: %s\n", loc_get_ioctl_status_name(rpc_ret_val)); 99534ee09551764b045fdc02df754157473125edf60Kevin Tang break; 99634ee09551764b045fdc02df754157473125edf60Kevin Tang } 99734ee09551764b045fdc02df754157473125edf60Kevin Tang //Add a delay of 10 ms so that repeated RPC calls dont starve the modem processor 99834ee09551764b045fdc02df754157473125edf60Kevin Tang usleep(10 * 1000); 99934ee09551764b045fdc02df754157473125edf60Kevin Tang } 100034ee09551764b045fdc02df754157473125edf60Kevin Tang else // part == total_parts 100134ee09551764b045fdc02df754157473125edf60Kevin Tang { 100234ee09551764b045fdc02df754157473125edf60Kevin Tang // Last part injection, will need to wait for callback 100334ee09551764b045fdc02df754157473125edf60Kevin Tang if (!loc_eng_ioctl(client_handle, 100434ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_type, 100534ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 100634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_XTRA_INJECT_DEFAULT_TIMEOUT, 100734ee09551764b045fdc02df754157473125edf60Kevin Tang NULL)) 100834ee09551764b045fdc02df754157473125edf60Kevin Tang { 100934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; 101034ee09551764b045fdc02df754157473125edf60Kevin Tang } 101134ee09551764b045fdc02df754157473125edf60Kevin Tang break; // done with injection 101234ee09551764b045fdc02df754157473125edf60Kevin Tang } 101334ee09551764b045fdc02df754157473125edf60Kevin Tang 101434ee09551764b045fdc02df754157473125edf60Kevin Tang len_injected += predicted_orbits_data_ptr->part_len; 101534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("loc_ioctl XTRA injected length: %d\n", len_injected); 101634ee09551764b045fdc02df754157473125edf60Kevin Tang } 101734ee09551764b045fdc02df754157473125edf60Kevin Tang 101834ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr(rpc_ret_val); 101934ee09551764b045fdc02df754157473125edf60Kevin Tang} 102034ee09551764b045fdc02df754157473125edf60Kevin Tang 1021e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/* Request the Xtra Server Url from the modem */ 1022e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoenum loc_api_adapter_err 1023e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::requestXtraServer() 1024e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 1025e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo loc_api_adapter_err err; 1026e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rpc_loc_ioctl_data_u_type data; 1027e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo rpc_loc_ioctl_callback_s_type callback_data; 1028e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 1029e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo err = convertErr(loc_eng_ioctl(client_handle, 1030e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE, 1031e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo &data, 1032e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_IOCTL_DEFAULT_TIMEOUT, 1033e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo &callback_data)); 1034e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 1035e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (LOC_API_ADAPTER_ERR_SUCCESS != err) 1036e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 1037e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: err=%d\n", err); 1038e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return err; 1039e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 1040e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo else if (RPC_LOC_SESS_STATUS_SUCCESS != callback_data.status) 1041e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 1042e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: status=%ld\n", callback_data.status); 1043e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 1044e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 1045e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.type) 1046e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 1047e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the type expected! type=%d\n", callback_data.type); 1048e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 1049e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 1050e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.data.disc) 1051e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo { 1052e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the disc expected! disc=%d\n", callback_data.data.disc); 1053e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 1054e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 1055e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 1056e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo reportXtraServer(callback_data.data.rpc_loc_ioctl_callback_data_u_type_u. 1057e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo predicted_orbits_data_source.servers[0], 1058e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo callback_data.data.rpc_loc_ioctl_callback_data_u_type_u. 1059e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo predicted_orbits_data_source.servers[1], 1060e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo callback_data.data.rpc_loc_ioctl_callback_data_u_type_u. 1061e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo predicted_orbits_data_source.servers[2], 1062e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 255); 1063e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 1064e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return LOC_API_ADAPTER_ERR_SUCCESS; 1065e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 1066e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 106734ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 1068e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType) 106934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 107034ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_server_open_status_e_type open_status = is_succ ? RPC_LOC_SERVER_OPEN_SUCCESS : RPC_LOC_SERVER_OPEN_FAIL; 107134ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 107234ee09551764b045fdc02df754157473125edf60Kevin Tang 107334ee09551764b045fdc02df754157473125edf60Kevin Tang if (AGPS_TYPE_INVALID == agpsType) { 107434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_server_open_status_s_type *conn_open_status_ptr = 107534ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_open_status; 107634ee09551764b045fdc02df754157473125edf60Kevin Tang 107734ee09551764b045fdc02df754157473125edf60Kevin Tang // Fill in data 107834ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS; 107934ee09551764b045fdc02df754157473125edf60Kevin Tang conn_open_status_ptr->conn_handle = handle; 108034ee09551764b045fdc02df754157473125edf60Kevin Tang conn_open_status_ptr->open_status = open_status; 108134ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 108234ee09551764b045fdc02df754157473125edf60Kevin Tang conn_open_status_ptr->apn_name = apn; /* requires APN */ 108334ee09551764b045fdc02df754157473125edf60Kevin Tang#else 108434ee09551764b045fdc02df754157473125edf60Kevin Tang if (is_succ) { 108534ee09551764b045fdc02df754157473125edf60Kevin Tang strlcpy(conn_open_status_ptr->apn_name, apn, 108634ee09551764b045fdc02df754157473125edf60Kevin Tang sizeof conn_open_status_ptr->apn_name); 108734ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 108834ee09551764b045fdc02df754157473125edf60Kevin Tang conn_open_status_ptr->apn_name[0] = 0; 108934ee09551764b045fdc02df754157473125edf60Kevin Tang } 109034ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */ 109134ee09551764b045fdc02df754157473125edf60Kevin Tang 109234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS open %s, APN name = [%s]\n", 109334ee09551764b045fdc02df754157473125edf60Kevin Tang log_succ_fail_string(is_succ), 109434ee09551764b045fdc02df754157473125edf60Kevin Tang apn); 109534ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 109634ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_server_multi_open_status_s_type *conn_multi_open_status_ptr = 109734ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data.rpc_loc_ioctl_data_u_type_u.multi_conn_open_status; 109834ee09551764b045fdc02df754157473125edf60Kevin Tang 109934ee09551764b045fdc02df754157473125edf60Kevin Tang // Fill in data 110034ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS; 110134ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->conn_handle = handle; 110234ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->open_status = open_status; 110334ee09551764b045fdc02df754157473125edf60Kevin Tang if (is_succ) { 110434ee09551764b045fdc02df754157473125edf60Kevin Tang strlcpy(conn_multi_open_status_ptr->apn_name, apn, 110534ee09551764b045fdc02df754157473125edf60Kevin Tang sizeof conn_multi_open_status_ptr->apn_name); 110634ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 110734ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->apn_name[0] = 0; 110834ee09551764b045fdc02df754157473125edf60Kevin Tang } 110934ee09551764b045fdc02df754157473125edf60Kevin Tang 111034ee09551764b045fdc02df754157473125edf60Kevin Tang switch(bearer) 111134ee09551764b045fdc02df754157473125edf60Kevin Tang { 111234ee09551764b045fdc02df754157473125edf60Kevin Tang case AGPS_APN_BEARER_IPV4: 111334ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IP; 111434ee09551764b045fdc02df754157473125edf60Kevin Tang break; 111534ee09551764b045fdc02df754157473125edf60Kevin Tang case AGPS_APN_BEARER_IPV6: 111634ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV6; 111734ee09551764b045fdc02df754157473125edf60Kevin Tang break; 111834ee09551764b045fdc02df754157473125edf60Kevin Tang case AGPS_APN_BEARER_IPV4V6: 111934ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV4V6; 112034ee09551764b045fdc02df754157473125edf60Kevin Tang break; 112134ee09551764b045fdc02df754157473125edf60Kevin Tang default: 112234ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_PPP; 112334ee09551764b045fdc02df754157473125edf60Kevin Tang } 112434ee09551764b045fdc02df754157473125edf60Kevin Tang 112534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS open %s, APN name = [%s], pdp_type = %d\n", 112634ee09551764b045fdc02df754157473125edf60Kevin Tang log_succ_fail_string(is_succ), 112734ee09551764b045fdc02df754157473125edf60Kevin Tang apn, 112834ee09551764b045fdc02df754157473125edf60Kevin Tang conn_multi_open_status_ptr->pdp_type); 112934ee09551764b045fdc02df754157473125edf60Kevin Tang } 113034ee09551764b045fdc02df754157473125edf60Kevin Tang 113134ee09551764b045fdc02df754157473125edf60Kevin Tang // Make the IOCTL call 113234ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 113334ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl(client_handle, 113434ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc, 113534ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 113634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 113734ee09551764b045fdc02df754157473125edf60Kevin Tang NULL) 113834ee09551764b045fdc02df754157473125edf60Kevin Tang ); 113934ee09551764b045fdc02df754157473125edf60Kevin Tang} 114034ee09551764b045fdc02df754157473125edf60Kevin Tang 114134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 1142e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::atlCloseStatus(int handle, int is_succ) 114334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 114434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data; 114534ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS; 114634ee09551764b045fdc02df754157473125edf60Kevin Tang 114734ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_server_close_status_s_type *conn_close_status_ptr = 114834ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_close_status; 114934ee09551764b045fdc02df754157473125edf60Kevin Tang conn_close_status_ptr->conn_handle = handle; 115034ee09551764b045fdc02df754157473125edf60Kevin Tang conn_close_status_ptr->close_status = is_succ ? RPC_LOC_SERVER_CLOSE_SUCCESS : RPC_LOC_SERVER_CLOSE_FAIL; 115134ee09551764b045fdc02df754157473125edf60Kevin Tang 115234ee09551764b045fdc02df754157473125edf60Kevin Tang // Make the IOCTL call 115334ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 115434ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl(client_handle, 115534ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.disc, 115634ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 115734ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 115834ee09551764b045fdc02df754157473125edf60Kevin Tang NULL) 115934ee09551764b045fdc02df754157473125edf60Kevin Tang ); 116034ee09551764b045fdc02df754157473125edf60Kevin Tang} 116134ee09551764b045fdc02df754157473125edf60Kevin Tang 1162e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr) 116334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 116434ee09551764b045fdc02df754157473125edf60Kevin Tang int connHandle; 116534ee09551764b045fdc02df754157473125edf60Kevin Tang AGpsType agps_type; 116634ee09551764b045fdc02df754157473125edf60Kevin Tang 116734ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST event %s)", 116834ee09551764b045fdc02df754157473125edf60Kevin Tang loc_get_event_atl_open_name(server_request_ptr->event)); 116934ee09551764b045fdc02df754157473125edf60Kevin Tang switch (server_request_ptr->event) 117034ee09551764b045fdc02df754157473125edf60Kevin Tang { 117134ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_SERVER_REQUEST_MULTI_OPEN: 117234ee09551764b045fdc02df754157473125edf60Kevin Tang connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.conn_handle; 117334ee09551764b045fdc02df754157473125edf60Kevin Tang if (server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.connection_type 117434ee09551764b045fdc02df754157473125edf60Kevin Tang == RPC_LOC_SERVER_CONNECTION_LBS) { 117534ee09551764b045fdc02df754157473125edf60Kevin Tang agps_type = AGPS_TYPE_SUPL; 117634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n type - AGPS_TYPE_SUPL\n handle - %d", connHandle); 117734ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 117834ee09551764b045fdc02df754157473125edf60Kevin Tang agps_type = AGPS_TYPE_WWAN_ANY; 117934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n type - AGPS_TYPE_WWAN_ANY\n handle - %d", connHandle); 118034ee09551764b045fdc02df754157473125edf60Kevin Tang } 118134ee09551764b045fdc02df754157473125edf60Kevin Tang requestATL(connHandle, agps_type); 118234ee09551764b045fdc02df754157473125edf60Kevin Tang break; 118334ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_SERVER_REQUEST_OPEN: 118434ee09551764b045fdc02df754157473125edf60Kevin Tang connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.open_req.conn_handle; 118534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_OPEN\n handle - %d", connHandle); 118634ee09551764b045fdc02df754157473125edf60Kevin Tang requestATL(connHandle, AGPS_TYPE_INVALID); 118734ee09551764b045fdc02df754157473125edf60Kevin Tang break; 118834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_SERVER_REQUEST_CLOSE: 118934ee09551764b045fdc02df754157473125edf60Kevin Tang connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.close_req.conn_handle; 119034ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_CLOSE\n handle - %d", connHandle); 119134ee09551764b045fdc02df754157473125edf60Kevin Tang releaseATL(connHandle); 119234ee09551764b045fdc02df754157473125edf60Kevin Tang break; 119334ee09551764b045fdc02df754157473125edf60Kevin Tang default: 119434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("ATLEvent: event type %d invalid", server_request_ptr->event); 119534ee09551764b045fdc02df754157473125edf60Kevin Tang } 119634ee09551764b045fdc02df754157473125edf60Kevin Tang} 119734ee09551764b045fdc02df754157473125edf60Kevin Tang 1198e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::NIEvent(const rpc_loc_ni_event_s_type *ni_req) 119934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 120034ee09551764b045fdc02df754157473125edf60Kevin Tang GpsNiNotification notif = {0}; 120134ee09551764b045fdc02df754157473125edf60Kevin Tang 120234ee09551764b045fdc02df754157473125edf60Kevin Tang switch (ni_req->event) 120334ee09551764b045fdc02df754157473125edf60Kevin Tang { 120434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_EVENT_VX_NOTIFY_VERIFY_REQ: 120534ee09551764b045fdc02df754157473125edf60Kevin Tang { 120634ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_ni_vx_notify_verify_req_s_type *vx_req = 120734ee09551764b045fdc02df754157473125edf60Kevin Tang &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.vx_req; 120834ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGI("VX Notification"); 120934ee09551764b045fdc02df754157473125edf60Kevin Tang notif.ni_type = GPS_NI_TYPE_VOICE; 121034ee09551764b045fdc02df754157473125edf60Kevin Tang // Requestor ID 121134ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.requestor_id, sizeof notif.requestor_id, 121234ee09551764b045fdc02df754157473125edf60Kevin Tang vx_req->requester_id.requester_id, 121334ee09551764b045fdc02df754157473125edf60Kevin Tang vx_req->requester_id.requester_id_length); 121434ee09551764b045fdc02df754157473125edf60Kevin Tang notif.text_encoding = 0; // No text and no encoding 121534ee09551764b045fdc02df754157473125edf60Kevin Tang notif.requestor_id_encoding = convertNiEncodingType(vx_req->encoding_scheme); 121634ee09551764b045fdc02df754157473125edf60Kevin Tang NIEventFillVerfiyType(notif, vx_req->notification_priv_type); 121734ee09551764b045fdc02df754157473125edf60Kevin Tang } 121834ee09551764b045fdc02df754157473125edf60Kevin Tang break; 121934ee09551764b045fdc02df754157473125edf60Kevin Tang 122034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_EVENT_UMTS_CP_NOTIFY_VERIFY_REQ: 122134ee09551764b045fdc02df754157473125edf60Kevin Tang { 122234ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_ni_umts_cp_notify_verify_req_s_type *umts_cp_req = 122334ee09551764b045fdc02df754157473125edf60Kevin Tang &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.umts_cp_req; 122434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGI("UMTS CP Notification\n"); 122534ee09551764b045fdc02df754157473125edf60Kevin Tang notif.ni_type= GPS_NI_TYPE_UMTS_CTRL_PLANE; // Stores notification text 122634ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 122734ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.text, sizeof notif.text, 122834ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->notification_text.notification_text_val, 122934ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->notification_length); 123034ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.requestor_id, sizeof notif.requestor_id, 123134ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->requestor_id.requestor_id_string.requestor_id_string_val, 123234ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->requestor_id.string_len); 123334ee09551764b045fdc02df754157473125edf60Kevin Tang#else 123434ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.text, sizeof notif.text, 123534ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->notification_text, 123634ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->notification_length); 123734ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.requestor_id, sizeof notif.requestor_id, 123834ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->requestor_id.requestor_id_string, 123934ee09551764b045fdc02df754157473125edf60Kevin Tang umts_cp_req->requestor_id.string_len); 124034ee09551764b045fdc02df754157473125edf60Kevin Tang#endif 124134ee09551764b045fdc02df754157473125edf60Kevin Tang notif.text_encoding = convertNiEncodingType(umts_cp_req->datacoding_scheme); 124234ee09551764b045fdc02df754157473125edf60Kevin Tang notif.requestor_id_encoding = notif.text_encoding; 124334ee09551764b045fdc02df754157473125edf60Kevin Tang NIEventFillVerfiyType(notif, umts_cp_req->notification_priv_type); 124434ee09551764b045fdc02df754157473125edf60Kevin Tang 124534ee09551764b045fdc02df754157473125edf60Kevin Tang // LCS address (using extras field) 124634ee09551764b045fdc02df754157473125edf60Kevin Tang if (umts_cp_req->ext_client_address_data.ext_client_address_len != 0) 124734ee09551764b045fdc02df754157473125edf60Kevin Tang { 124834ee09551764b045fdc02df754157473125edf60Kevin Tang // Copy LCS Address into notif.extras in the format: Address = 012345 124934ee09551764b045fdc02df754157473125edf60Kevin Tang strlcat(notif.extras, LOC_NI_NOTIF_KEY_ADDRESS, sizeof notif.extras); 125034ee09551764b045fdc02df754157473125edf60Kevin Tang strlcat(notif.extras, " = ", sizeof notif.extras); 125134ee09551764b045fdc02df754157473125edf60Kevin Tang int addr_len = 0; 125234ee09551764b045fdc02df754157473125edf60Kevin Tang const char *address_source = NULL; 125334ee09551764b045fdc02df754157473125edf60Kevin Tang 125434ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 125534ee09551764b045fdc02df754157473125edf60Kevin Tang address_source = umts_cp_req->ext_client_address_data.ext_client_address.ext_client_address_val; 125634ee09551764b045fdc02df754157473125edf60Kevin Tang#else 125734ee09551764b045fdc02df754157473125edf60Kevin Tang address_source = umts_cp_req->ext_client_address_data.ext_client_address; 125834ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */ 125934ee09551764b045fdc02df754157473125edf60Kevin Tang 126034ee09551764b045fdc02df754157473125edf60Kevin Tang char lcs_addr[32]; // Decoded LCS address for UMTS CP NI 1261e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo addr_len = decodeAddress(lcs_addr, sizeof lcs_addr, address_source, 1262e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo umts_cp_req->ext_client_address_data.ext_client_address_len); 126334ee09551764b045fdc02df754157473125edf60Kevin Tang 126434ee09551764b045fdc02df754157473125edf60Kevin Tang // The address is ASCII string 126534ee09551764b045fdc02df754157473125edf60Kevin Tang if (addr_len) 126634ee09551764b045fdc02df754157473125edf60Kevin Tang { 126734ee09551764b045fdc02df754157473125edf60Kevin Tang strlcat(notif.extras, lcs_addr, sizeof notif.extras); 126834ee09551764b045fdc02df754157473125edf60Kevin Tang } 126934ee09551764b045fdc02df754157473125edf60Kevin Tang } 127034ee09551764b045fdc02df754157473125edf60Kevin Tang } 127134ee09551764b045fdc02df754157473125edf60Kevin Tang break; 127234ee09551764b045fdc02df754157473125edf60Kevin Tang 127334ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_EVENT_SUPL_NOTIFY_VERIFY_REQ: 127434ee09551764b045fdc02df754157473125edf60Kevin Tang { 127534ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_ni_supl_notify_verify_req_s_type *supl_req = 127634ee09551764b045fdc02df754157473125edf60Kevin Tang &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req; 127734ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGI("SUPL Notification\n"); 127834ee09551764b045fdc02df754157473125edf60Kevin Tang notif.ni_type = GPS_NI_TYPE_UMTS_SUPL; 127934ee09551764b045fdc02df754157473125edf60Kevin Tang 128034ee09551764b045fdc02df754157473125edf60Kevin Tang if (supl_req->flags & RPC_LOC_NI_CLIENT_NAME_PRESENT) 128134ee09551764b045fdc02df754157473125edf60Kevin Tang { 128234ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 128334ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.text, sizeof notif.text, 128434ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->client_name.client_name_string.client_name_string_val, /* buffer */ 128534ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->client_name.string_len /* length */ 128634ee09551764b045fdc02df754157473125edf60Kevin Tang ); 128734ee09551764b045fdc02df754157473125edf60Kevin Tang#else 128834ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.text, sizeof notif.text, 128934ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->client_name.client_name_string, /* buffer */ 129034ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->client_name.string_len /* length */ 129134ee09551764b045fdc02df754157473125edf60Kevin Tang ); 129234ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */ 129334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("SUPL NI: client_name: %s len=%d", notif.text, supl_req->client_name.string_len); 129434ee09551764b045fdc02df754157473125edf60Kevin Tang } 129534ee09551764b045fdc02df754157473125edf60Kevin Tang else { 129634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("SUPL NI: client_name not present."); 129734ee09551764b045fdc02df754157473125edf60Kevin Tang } 129834ee09551764b045fdc02df754157473125edf60Kevin Tang 129934ee09551764b045fdc02df754157473125edf60Kevin Tang // Requestor ID 130034ee09551764b045fdc02df754157473125edf60Kevin Tang if (supl_req->flags & RPC_LOC_NI_REQUESTOR_ID_PRESENT) 130134ee09551764b045fdc02df754157473125edf60Kevin Tang { 130234ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200) 130334ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.requestor_id, sizeof notif.requestor_id, 130434ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->requestor_id.requestor_id_string.requestor_id_string_val, /* buffer */ 130534ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->requestor_id.string_len /* length */ 130634ee09551764b045fdc02df754157473125edf60Kevin Tang ); 130734ee09551764b045fdc02df754157473125edf60Kevin Tang#else 130834ee09551764b045fdc02df754157473125edf60Kevin Tang hexcode(notif.requestor_id, sizeof notif.requestor_id, 130934ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->requestor_id.requestor_id_string, /* buffer */ 131034ee09551764b045fdc02df754157473125edf60Kevin Tang supl_req->requestor_id.string_len /* length */ 131134ee09551764b045fdc02df754157473125edf60Kevin Tang ); 131234ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */ 131334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("SUPL NI: requestor_id: %s len=%d", notif.requestor_id, supl_req->requestor_id.string_len); 131434ee09551764b045fdc02df754157473125edf60Kevin Tang } 131534ee09551764b045fdc02df754157473125edf60Kevin Tang else { 131634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGV("SUPL NI: requestor_id not present."); 131734ee09551764b045fdc02df754157473125edf60Kevin Tang } 131834ee09551764b045fdc02df754157473125edf60Kevin Tang 131934ee09551764b045fdc02df754157473125edf60Kevin Tang // Encoding type 132034ee09551764b045fdc02df754157473125edf60Kevin Tang if (supl_req->flags & RPC_LOC_NI_ENCODING_TYPE_PRESENT) 132134ee09551764b045fdc02df754157473125edf60Kevin Tang { 132234ee09551764b045fdc02df754157473125edf60Kevin Tang notif.text_encoding = convertNiEncodingType(supl_req->datacoding_scheme); 132334ee09551764b045fdc02df754157473125edf60Kevin Tang notif.requestor_id_encoding = notif.text_encoding; 132434ee09551764b045fdc02df754157473125edf60Kevin Tang } 132534ee09551764b045fdc02df754157473125edf60Kevin Tang else { 132634ee09551764b045fdc02df754157473125edf60Kevin Tang notif.text_encoding = notif.requestor_id_encoding = GPS_ENC_UNKNOWN; 132734ee09551764b045fdc02df754157473125edf60Kevin Tang } 132834ee09551764b045fdc02df754157473125edf60Kevin Tang 132934ee09551764b045fdc02df754157473125edf60Kevin Tang NIEventFillVerfiyType(notif, ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req.notification_priv_type); 133034ee09551764b045fdc02df754157473125edf60Kevin Tang } 133134ee09551764b045fdc02df754157473125edf60Kevin Tang break; 133234ee09551764b045fdc02df754157473125edf60Kevin Tang 133334ee09551764b045fdc02df754157473125edf60Kevin Tang default: 133434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("Unknown NI event: %x\n", (int) ni_req->event); 133534ee09551764b045fdc02df754157473125edf60Kevin Tang return; 133634ee09551764b045fdc02df754157473125edf60Kevin Tang } 133734ee09551764b045fdc02df754157473125edf60Kevin Tang 133834ee09551764b045fdc02df754157473125edf60Kevin Tang // this copy will get freed in loc_eng_ni when loc_ni_respond() is called 133934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ni_event_s_type *copy = (rpc_loc_ni_event_s_type *)malloc(sizeof(*copy)); 134034ee09551764b045fdc02df754157473125edf60Kevin Tang memcpy(copy, ni_req, sizeof(*copy)); 1341e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo requestNiNotify(notif, (const void*)copy); 134234ee09551764b045fdc02df754157473125edf60Kevin Tang} 134334ee09551764b045fdc02df754157473125edf60Kevin Tang 1344e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoint LocApiRpc::NIEventFillVerfiyType(GpsNiNotification ¬if, 134534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ni_notify_verify_e_type notif_priv) 134634ee09551764b045fdc02df754157473125edf60Kevin Tang{ 134734ee09551764b045fdc02df754157473125edf60Kevin Tang switch (notif_priv) 134834ee09551764b045fdc02df754157473125edf60Kevin Tang { 134934ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_USER_NO_NOTIFY_NO_VERIFY: 135034ee09551764b045fdc02df754157473125edf60Kevin Tang notif.notify_flags = 0; 135134ee09551764b045fdc02df754157473125edf60Kevin Tang notif.default_response = GPS_NI_RESPONSE_NORESP; 135234ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 135334ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_USER_NOTIFY_ONLY: 135434ee09551764b045fdc02df754157473125edf60Kevin Tang notif.notify_flags = GPS_NI_NEED_NOTIFY; 135534ee09551764b045fdc02df754157473125edf60Kevin Tang notif.default_response = GPS_NI_RESPONSE_NORESP; 135634ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 135734ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_USER_NOTIFY_VERIFY_ALLOW_NO_RESP: 135834ee09551764b045fdc02df754157473125edf60Kevin Tang notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY; 135934ee09551764b045fdc02df754157473125edf60Kevin Tang notif.default_response = GPS_NI_RESPONSE_ACCEPT; 136034ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 136134ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_USER_NOTIFY_VERIFY_NOT_ALLOW_NO_RESP: 136234ee09551764b045fdc02df754157473125edf60Kevin Tang notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY; 136334ee09551764b045fdc02df754157473125edf60Kevin Tang notif.default_response = GPS_NI_RESPONSE_DENY; 136434ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 136534ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_USER_PRIVACY_OVERRIDE: 136634ee09551764b045fdc02df754157473125edf60Kevin Tang notif.notify_flags = GPS_NI_PRIVACY_OVERRIDE; 136734ee09551764b045fdc02df754157473125edf60Kevin Tang notif.default_response = GPS_NI_RESPONSE_NORESP; 136834ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 136934ee09551764b045fdc02df754157473125edf60Kevin Tang default: 137034ee09551764b045fdc02df754157473125edf60Kevin Tang return 0; 137134ee09551764b045fdc02df754157473125edf60Kevin Tang } 137234ee09551764b045fdc02df754157473125edf60Kevin Tang} 137334ee09551764b045fdc02df754157473125edf60Kevin Tang 137434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err 1375e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setSUPLVersion(uint32_t version) 137634ee09551764b045fdc02df754157473125edf60Kevin Tang{ 137734ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_SUPL_VERSION, {0}}; 137834ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data.rpc_loc_ioctl_data_u_type_u.supl_version = (int)version; 137934ee09551764b045fdc02df754157473125edf60Kevin Tang return convertErr( 138034ee09551764b045fdc02df754157473125edf60Kevin Tang loc_eng_ioctl (client_handle, 138134ee09551764b045fdc02df754157473125edf60Kevin Tang RPC_LOC_IOCTL_SET_SUPL_VERSION, 138234ee09551764b045fdc02df754157473125edf60Kevin Tang &ioctl_data, 138334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_IOCTL_DEFAULT_TIMEOUT, 138434ee09551764b045fdc02df754157473125edf60Kevin Tang NULL) 138534ee09551764b045fdc02df754157473125edf60Kevin Tang ); 138634ee09551764b045fdc02df754157473125edf60Kevin Tang} 138734ee09551764b045fdc02df754157473125edf60Kevin Tang 1388e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoGpsNiEncodingType LocApiRpc::convertNiEncodingType(int loc_encoding) 138934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 139034ee09551764b045fdc02df754157473125edf60Kevin Tang switch (loc_encoding) 139134ee09551764b045fdc02df754157473125edf60Kevin Tang { 139234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_SUPL_UTF8: 139334ee09551764b045fdc02df754157473125edf60Kevin Tang return GPS_ENC_SUPL_UTF8; 139434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_SUPL_UCS2: 139534ee09551764b045fdc02df754157473125edf60Kevin Tang return GPS_ENC_SUPL_UCS2; 139634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_SUPL_GSM_DEFAULT: 139734ee09551764b045fdc02df754157473125edf60Kevin Tang return GPS_ENC_SUPL_GSM_DEFAULT; 139834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_NI_SS_LANGUAGE_UNSPEC: 139934ee09551764b045fdc02df754157473125edf60Kevin Tang return GPS_ENC_SUPL_GSM_DEFAULT; // SS_LANGUAGE_UNSPEC = GSM 140034ee09551764b045fdc02df754157473125edf60Kevin Tang default: 140134ee09551764b045fdc02df754157473125edf60Kevin Tang return GPS_ENC_UNKNOWN; 140234ee09551764b045fdc02df754157473125edf60Kevin Tang } 140334ee09551764b045fdc02df754157473125edf60Kevin Tang} 1404e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 1405e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiBase* getLocApi(const MsgTask* msgTask, 140647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_API_ADAPTER_EVENT_MASK_T exMask, 140747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ContextBase *context) { 140847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo return new LocApiRpc(msgTask, exMask, context); 140947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo} 141047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 141147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/*Values for lock 141247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 1 = Do not lock any position sessions 141347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 2 = Lock MI position sessions 141447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 3 = Lock MT position sessions 141547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 4 = Lock all position sessions 141647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo*/ 14178aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tangint LocApiRpc::setGpsLock(LOC_GPS_LOCK_MASK lockMask) 141847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{ 141947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo rpc_loc_ioctl_data_u_type ioctl_data; 142047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo boolean ret_val; 14218aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang LOC_LOGD("%s:%d]: lock: %x\n", __func__, __LINE__, lockMask); 14228aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang ioctl_data.rpc_loc_ioctl_data_u_type_u.engine_lock = convertGpsLockMask(lockMask); 142347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ioctl_data.disc = RPC_LOC_IOCTL_SET_ENGINE_LOCK; 142447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 142547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo RPC_LOC_IOCTL_SET_ENGINE_LOCK, 142647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo &ioctl_data, 142747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_IOCTL_DEFAULT_TIMEOUT, 142847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo NULL /* No output information is expected*/); 142947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 143047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: ret_val: %d\n", __func__, __LINE__, (int)ret_val); 143147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo return (ret_val == TRUE ? 0 : -1); 143247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo} 143347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 143447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* 143547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo Returns 143647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo Current value of GPS lock on success 143747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo -1 on failure 143847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo*/ 143947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russoint LocApiRpc :: getGpsLock() 144047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{ 144147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo rpc_loc_ioctl_data_u_type ioctl_data; 144247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo rpc_loc_ioctl_callback_s_type callback_payload; 144347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo boolean ret_val; 144447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo int ret=0; 144547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: Enter\n", __func__, __LINE__); 144647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 144747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo RPC_LOC_IOCTL_GET_ENGINE_LOCK, 144847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo &ioctl_data, 144947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_IOCTL_DEFAULT_TIMEOUT, 145047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo &callback_payload); 145147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(ret_val == TRUE) { 145247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret = (int)callback_payload.data.engine_lock; 145347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: Lock type: %d\n", __func__, __LINE__, ret); 145447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 145547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo else { 145647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGE("%s:%d]: Ioctl failed", __func__, __LINE__); 145747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ret = -1; 145847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 145947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__); 146047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo return ret; 1461e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 1462