14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without 44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are 54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met: 64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Redistributions of source code must retain the above copyright 74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * notice, this list of conditions and the following disclaimer. 84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Redistributions in binary form must reproduce the above 94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * copyright notice, this list of conditions and the following 104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * disclaimer in the documentation and/or other materials provided 114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * with the distribution. 124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Neither the name of The Linux Foundation, nor the names of its 134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * contributors may be used to endorse or promote products derived 144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * from this software without specific prior written permission. 154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */ 294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_NDDEBUG 0 304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_TAG "LocSvc_api_rpc" 314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <unistd.h> 334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <math.h> 344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#ifndef USE_GLIB 354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <utils/SystemClock.h> 364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* USE_GLIB */ 374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <LocApiRpc.h> 384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <LocAdapterBase.h> 394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_api_fixup.h> 404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_api_rpc_glue.h> 414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <log_util.h> 424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_log.h> 434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_api_log.h> 444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#ifdef USE_GLIB 454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <glib.h> 464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif 474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <librpc.h> 484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <platform_lib_includes.h> 494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinusing namespace loc_core; 514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOC_XTRA_INJECT_DEFAULT_TIMEOUT (3100) 534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define XTRA_BLOCK_SIZE (3072) 544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOC_IOCTL_DEFAULT_TIMEOUT 1000 // 1000 milli-seconds 554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOC_NI_NOTIF_KEY_ADDRESS "Address" 564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 584035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_event_cb 594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 604035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This is the callback function registered by loc_open. 624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 634035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 664035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_API_SUCCESS 684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 694035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int32 loc_event_cb 744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin( 754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin void* user, 764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_client_handle_type client_handle, 774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_event_mask_type loc_event, 784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const rpc_loc_event_payload_u_type* loc_event_payload 794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin) 804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin MODEM_LOG_CALLFLOW(%s, loc_get_event_name(loc_event)); 824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_callback_log(loc_event, loc_event_payload); 834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int32 ret_val = ((LocApiRpc*)user)->locEventCB(client_handle, loc_event, loc_event_payload); 844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin EXIT_LOG(%d, ret_val); 854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return ret_val; 864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 894035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_rpc_global_cb 904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 914035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This is the callback function registered by loc_open for RPC global events 934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 944035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 974035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_API_SUCCESS 994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1004035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic void loc_rpc_global_cb(void* user, CLIENT* clnt, enum rpc_reset_event event) 1054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin MODEM_LOG_CALLFLOW(%s, loc_get_rpc_reset_event_name(event)); 1074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ((LocApiRpc*)user)->locRpcGlobalCB(clnt, event); 1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin EXIT_LOG(%p, VOID_RET); 1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinconst LOC_API_ADAPTER_EVENT_MASK_T LocApiRpc::maskAll = 1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT | 1134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_SATELLITE_REPORT | 1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST | 1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST | 1164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_IOCTL_REPORT | 1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_STATUS_REPORT | 1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT | 1194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; 1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinconst rpc_loc_event_mask_type LocApiRpc::locBits[] = 1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_PARSED_POSITION_REPORT, 1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_SATELLITE_REPORT, 1254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_NMEA_1HZ_REPORT, 1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_NMEA_POSITION_REPORT, 1274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST, 1284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST, 1294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_LOCATION_SERVER_REQUEST, 1304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_IOCTL_REPORT, 1314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_STATUS_REPORT, 1324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_EVENT_WPS_NEEDED_REQUEST 1334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}; 1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin// constructor 1364035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::LocApiRpc(const MsgTask* msgTask, 1374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_EVENT_MASK_T exMask, 1384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ContextBase* context) : 1394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase(msgTask, exMask, context), 1404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin client_handle(RPC_LOC_CLIENT_HANDLE_INVALID), 1414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin dataEnableLastSet(-1) 1424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin memset(apnLastSet, 0, sizeof(apnLastSet)); 1444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_api_glue_init(); 1454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1474035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::~LocApiRpc() 1484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin close(); 1504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinrpc_loc_event_mask_type 1534035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask) 1544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_event_mask_type newMask = 0; 1564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin for (unsigned int i = 0, bit=1; 0 != mask; i++, bit<<=1) { 1584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (mask & bit) { 1594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin newMask |= locBits[i]; 1604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mask ^= bit; 1614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return newMask; 1654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinrpc_loc_lock_e_type 1684035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::convertGpsLockMask(LOC_GPS_LOCK_MASK lockMask) 1694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (isGpsLockAll(lockMask)) 1714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return RPC_LOC_LOCK_ALL; 1724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (isGpsLockMO(lockMask)) 1734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return RPC_LOC_LOCK_MI; 1744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (isGpsLockMT(lockMask)) 1754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return RPC_LOC_LOCK_MT; 1764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (isGpsLockNone(lockMask)) 1774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return RPC_LOC_LOCK_NONE; 1784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return (rpc_loc_lock_e_type)lockMask; 1794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 1824035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::convertErr(int rpcErr) 1834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch(rpcErr) 1854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 1864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_SUCCESS: 1874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_SUCCESS; 1884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_GENERAL_FAILURE: 1894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 1904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_UNSUPPORTED: 1914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_UNSUPPORTED; 1924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_INVALID_HANDLE: 1934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_INVALID_HANDLE; 1944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_INVALID_PARAMETER: 1954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_INVALID_PARAMETER; 1964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_ENGINE_BUSY: 1974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_ENGINE_BUSY; 1984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_PHONE_OFFLINE: 1994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_PHONE_OFFLINE; 2004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_TIMEOUT: 2014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_TIMEOUT; 2024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_RPC_MODEM_RESTART: 2034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_ENGINE_DOWN; 2044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_API_RPC_FAILURE: 2054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_FAILURE; 2064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 2074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_UNKNOWN; 2084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 2104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event) 2124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 2134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin static rpc_loc_engine_state_e_type last_state = RPC_LOC_ENGINE_STATE_MAX; 2144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (event) { 2164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_SUBSYSTEM_RESTART_BEGIN: 2174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (RPC_LOC_ENGINE_STATE_OFF != last_state) { 2184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin last_state = RPC_LOC_ENGINE_STATE_OFF; 2194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin handleEngineDownEvent(); 2204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 2224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_SUBSYSTEM_RESTART_END: 2234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (RPC_LOC_ENGINE_STATE_ON != last_state) { 2244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin last_state = RPC_LOC_ENGINE_STATE_ON; 2254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin handleEngineUpEvent(); 2264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 2284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 2304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint32 LocApiRpc::locEventCB(rpc_loc_client_handle_type client_handle, 2324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_event_mask_type loc_event, 2334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const rpc_loc_event_payload_u_type* loc_event_payload) 2344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 2354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Parsed report 2364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT) 2374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin reportPosition(&loc_event_payload->rpc_loc_event_payload_u_type_u. 2394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin parsed_location_report); 2404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Satellite report 2434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_SATELLITE_REPORT) 2444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin reportSv(&loc_event_payload->rpc_loc_event_payload_u_type_u.gnss_report); 2464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Status report 2494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_STATUS_REPORT) 2504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin reportStatus(&loc_event_payload->rpc_loc_event_payload_u_type_u.status_report); 2524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // NMEA 2554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_NMEA_1HZ_REPORT) 2564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin reportNmea(&(loc_event_payload->rpc_loc_event_payload_u_type_u.nmea_report)); 2584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // XTRA support: supports only XTRA download 2604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST) 2614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 2634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_DATA_PREDICTED_ORBITS_REQ) 2644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin requestXtraData(); 2664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 2674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_DATA_TIME_REQ) 2684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin requestTime(); 2704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 2714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_DATA_POSITION_INJECTION_REQ) 2724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin requestLocation(); 2744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // AGPS data request 2784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_LOCATION_SERVER_REQUEST) 2794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ATLEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u. 2814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_server_request); 2824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // NI notify request 2854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (loc_event & RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST) 2864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 2874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NIEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.ni_request); 2884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return RPC_LOC_API_SUCCESS;//We simply want to return sucess here as we do not want to 2914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // cause any issues in RPC thread context 2924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 2934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 2954035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::open(LOC_API_ADAPTER_EVENT_MASK_T mask) 2964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 2974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin enum loc_api_adapter_err ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 2984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // RPC does not dynamically update the event mask. And in the 3004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // case of RPC, all we support are positioning (gps + agps) 3014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // masks anyways, so we simply mask all of them on always. 3024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // After doing so the first time in a power cycle, we know there 3034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // will the following if condition will never be true any more. 3044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mask = maskAll; 3054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (mask != mMask) { 3074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) { 3084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin close(); 3094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mMask = mask; 3124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // it is important to cap the mask here, because not all LocApi's 3134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // can enable the same bits, e.g. foreground and bckground. 3144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin client_handle = loc_open(convertMask(mask), 3154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_event_cb, 3164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_rpc_global_cb, this); 3174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (client_handle < 0) { 3194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mMask = 0; 3204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin client_handle = RPC_LOC_CLIENT_HANDLE_INVALID; 3214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = LOC_API_ADAPTER_ERR_INVALID_HANDLE; 3224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return ret_val; 3264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 3294035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::close() 3304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 3314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) { 3324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_clear(client_handle); 3334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_close(client_handle); 3364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mMask = 0; 3374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin client_handle = RPC_LOC_CLIENT_HANDLE_INVALID; 3384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_SUCCESS; 3404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 3434035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::startFix(const LocPosMode& posMode) { 3444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("LocApiRpc::startFix() called"); 3454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 3464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_start_fix(client_handle) 3474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 3484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 3514035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::stopFix() { 3524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("LocApiRpc::stopFix() called"); 3534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 3544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_stop_fix(client_handle) 3554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 3564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 3594035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setPositionMode(const LocPosMode& posMode) 3604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 3614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 3624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_fix_criteria_s_type *fix_criteria_ptr = 3634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria; 3644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_SET_FIX_CRITERIA; 3654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_operation_mode_e_type op_mode; 3664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int ret_val; 3674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const LocPosMode* fixCriteria = &posMode; 3684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ALOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n", 3704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (int32) client_handle, fixCriteria->min_interval, fixCriteria->mode); 3714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (fixCriteria->mode) 3734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 3744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_MS_BASED: 3754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_MSB; 3764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 3774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_MS_ASSISTED: 3784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_MSA; 3794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 3804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_RESERVED_1: 3814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_SPEED_OPTIMAL; 3824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 3834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_RESERVED_2: 3844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_ACCURACY_OPTIMAL; 3854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 3864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_RESERVED_3: 3874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_DATA_OPTIMAL; 3884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 3894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_RESERVED_4: 3904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_POSITION_MODE_RESERVED_5: 3914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_MSA; 3924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->preferred_response_time = 0; 3934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 3944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 3954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin op_mode = RPC_LOC_OPER_MODE_STANDALONE; 3964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE | 3994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE; 4004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->min_interval = fixCriteria->min_interval; 4014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->preferred_operation_mode = op_mode; 4024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->min_interval = fixCriteria->min_interval; 4044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL; 4054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (fixCriteria->preferred_accuracy > 0) { 4074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->preferred_accuracy = fixCriteria->preferred_accuracy; 4084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY; 4094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 4104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (fixCriteria->preferred_time > 0) { 4114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->preferred_response_time = fixCriteria->preferred_time; 4124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME; 4134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 4144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (fixCriteria->recurrence) { 4164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case GPS_POSITION_RECURRENCE_SINGLE: 4174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX; 4184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 4194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case GPS_POSITION_RECURRENCE_PERIODIC: 4204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 4214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX; 4224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 4234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 4244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = ioctl_type; 4254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = loc_eng_ioctl (client_handle, 4274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_type, 4284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 4294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 4304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL /* No output information is expected*/); 4314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr(ret_val); 4334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 4344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 4364035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setTime(GpsUtcTime time, int64_t timeReference, int uncertainty) 4374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 4384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 4394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_assist_data_time_s_type *time_info_ptr; 4404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_INJECT_UTC_TIME; 4414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int ret_val; 4424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD ("loc_eng_inject_time, uncertainty = %d\n", uncertainty); 4444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin time_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_time; 4464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin time_info_ptr->time_utc = time; 4474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin time_info_ptr->time_utc += (int64_t)(ELAPSED_MILLIS_SINCE_BOOT_PLATFORM_LIB_ABSTRACTION - timeReference); 4484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin time_info_ptr->uncertainty = uncertainty; // Uncertainty in ms 4494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = ioctl_type; 4514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = loc_eng_ioctl (client_handle, 4534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_type, 4544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 4554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 4564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL /* No output information is expected*/); 4574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr(ret_val); 4594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 4604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 4624035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::injectPosition(double latitude, double longitude, float accuracy) 4634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 4644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin /* IOCTL data */ 4654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 4664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_assist_data_pos_s_type *assistance_data_position = 4674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_position; 4684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int ret_val; 4694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin /************************************************ 4714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Fill in latitude, longitude & accuracy 4724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ************************************************/ 4734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin /* This combo is required */ 4754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin assistance_data_position->valid_mask = 4764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_POS_VALID_LATITUDE | 4774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_POS_VALID_LONGITUDE | 4784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_POS_VALID_HOR_UNC_CIRCULAR | 4794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_ASSIST_POS_VALID_CONFIDENCE_HORIZONTAL; 4804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin assistance_data_position->latitude = latitude; 4824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin assistance_data_position->longitude = longitude; 4834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin assistance_data_position->hor_unc_circular = accuracy; /* Meters assumed */ 4844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin assistance_data_position->confidence_horizontal = 63; /* 63% (1 std dev) assumed */ 4854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin /* Log */ 4874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("Inject coarse position Lat=%lf, Lon=%lf, Acc=%.2lf\n", 4884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (double) assistance_data_position->latitude, 4894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (double) assistance_data_position->longitude, 4904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (double) assistance_data_position->hor_unc_circular); 4914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = loc_eng_ioctl( client_handle, 4934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_INJECT_POSITION, 4944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 4954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 4964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL /* No output information is expected*/); 4974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr(ret_val); 4984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 4994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 5014035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::informNiResponse(GpsUserResponseType userResponse, 5024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const void* passThroughData) 5034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 5044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type data; 5054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_callback_s_type callback_payload; 5064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin memcpy(&data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.ni_event_pass_back, 5084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin passThroughData, sizeof (rpc_loc_ni_event_s_type)); 5094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ni_user_resp_e_type resp; 5114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (userResponse) 5124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 5134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case GPS_NI_RESPONSE_ACCEPT: 5144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = 5154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_NI_LCS_NOTIFY_VERIFY_ACCEPT; 5164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 5174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case GPS_NI_RESPONSE_DENY: 5184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = 5194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_NI_LCS_NOTIFY_VERIFY_DENY; 5204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 5214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case GPS_NI_RESPONSE_NORESP: 5224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 5234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = 5244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_NI_LCS_NOTIFY_VERIFY_NORESP; 5254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 5264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 5274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 5294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl(client_handle, 5304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE, 5314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &data, 5324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 5334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &callback_payload) 5344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 5354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 5364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 5384035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setAPN(char* apn, int len, boolean force) 5394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 5404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS; 5414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int size = sizeof(apnLastSet); 5424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (force || memcmp(apnLastSet, apn, size)) { 5434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (len < size) { 5444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // size will be not larger than its original value 5454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin size = len + 1; 5464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 5474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin memcpy(apnLastSet, apn, size); 5484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (!isInSession()) { 5504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, {0}}; 5514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].srv_system_type = LOC_APN_PROFILE_SRV_SYS_MAX; 5524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].pdp_type = LOC_APN_PROFILE_PDN_TYPE_IPV4; 5534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin memcpy(&(ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].apn_name), apn, size); 5544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rtv = convertErr( 5564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl (client_handle, 5574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, 5584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 5594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 5604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL) 5614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 5624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 5634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 5644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return rtv; 5654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 5664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::setInSession(bool inSession) 5684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 5694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (!inSession) { 5704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin enableData(dataEnableLastSet, true); 5714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin setAPN(apnLastSet, sizeof(apnLastSet)-1, true); 5724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 5734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 5744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 5764035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setServer(const char* url, int len) 5774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 5784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 5794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_server_info_s_type *server_info_ptr; 5804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_e_type ioctl_cmd; 5814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_cmd = RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR; 5834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = ioctl_cmd; 5844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr; 5854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_URL; 5864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.disc = server_info_ptr->addr_type; 5874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.length = len; 5884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 5894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_val = (char*) url; 5904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_len= len; 5914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 5924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin strlcpy(server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr, url, 5934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin sizeof server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr); 5944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */ 5954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD ("loc_eng_set_server, addr = %s\n", url); 5964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 5974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 5984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl (client_handle, 5994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_cmd, 6004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 6014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 6024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL /* No output information is expected*/) 6034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 6044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 6054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 6074035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setServer(unsigned int ip, int port, LocServerType type) 6084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 6094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 6104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_server_info_s_type *server_info_ptr; 6114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_e_type ioctl_cmd; 6124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (type) { 6144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_AGPS_MPC_SERVER: 6154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR; 6164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 6174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case LOC_AGPS_CUSTOM_PDE_SERVER: 6184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_cmd = RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR; 6194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 6204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 6214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR; 6224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 6234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 6244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = ioctl_cmd; 6254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr; 6264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_IPV4; 6274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.disc = server_info_ptr->addr_type; 6284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.addr = ip; 6294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.port = port; 6304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD ("setServer, addr = %X:%d\n", (unsigned int) ip, (unsigned int) port); 6314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 6334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl (client_handle, 6344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_cmd, 6354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 6364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 6374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL /* No output information is expected*/) 6384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 6394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 6404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 6424035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::enableData(int enable, boolean force) 6434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 6444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS; 6454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (force || dataEnableLastSet != enable) { 6464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin dataEnableLastSet = enable; 6474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (!isInSession()) { 6494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_DATA_ENABLE, {0}}; 6504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.rpc_loc_ioctl_data_u_type_u.data_enable = enable; 6524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rtv = convertErr( 6534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl (client_handle, 6544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_SET_DATA_ENABLE, 6554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 6564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 6574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL) 6584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 6594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 6604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 6614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return rtv; 6624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 6634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 6654035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::deleteAidingData(GpsAidingData bits) 6664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 6674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_DELETE_ASSIST_DATA, {0}}; 6684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete.type = bits; 6694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 6714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl (client_handle, 6724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_DELETE_ASSIST_DATA, 6734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 6744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 6754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL) 6764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 6774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 6784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr) 6804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 6814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT; 6824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin UlpLocation location = {0}; 6844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin GpsLocationExtended locationExtended = {0}; 6854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 6864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.size = sizeof(location); 6874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.size = sizeof(locationExtended); 6884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SESSION_STATUS) 6894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 6904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Process the position from final and intermediate reports 6914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->session_status == RPC_LOC_SESS_STATUS_SUCCESS || 6924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location_report_ptr->session_status == RPC_LOC_SESS_STATUS_IN_PROGESS) 6934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 6944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Latitude & Longitude 6954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LATITUDE) && 6964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LONGITUDE) && 6974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (location_report_ptr->latitude != 0 || 6984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location_report_ptr->longitude != 0)) 6994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.flags |= GPS_LOCATION_HAS_LAT_LONG; 7014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.latitude = location_report_ptr->latitude; 7024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.longitude = location_report_ptr->longitude; 7034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Time stamp (UTC) 7054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_TIMESTAMP_UTC) 7064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.timestamp = location_report_ptr->timestamp_utc; 7084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Altitude 7114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_ELLIPSOID ) 7124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.flags |= GPS_LOCATION_HAS_ALTITUDE; 7144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.altitude = location_report_ptr->altitude_wrt_ellipsoid; 7154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Speed 7184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_HORIZONTAL) 7194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.flags |= GPS_LOCATION_HAS_SPEED; 7214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.speed = location_report_ptr->speed_horizontal; 7224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Heading 7254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HEADING) 7264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.flags |= GPS_LOCATION_HAS_BEARING; 7284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.bearing = location_report_ptr->heading; 7294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Uncertainty (circular) 7324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ( (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HOR_UNC_CIRCULAR) ) 7334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.flags |= GPS_LOCATION_HAS_ACCURACY; 7354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.accuracy = location_report_ptr->hor_unc_circular; 7364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Technology Mask 7394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin tech_Mask |= location_report_ptr->technology_mask; 7414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin //Mark the location source as from GNSS 7424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO; 7434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location.position_source = ULP_LOCATION_IS_FROM_GNSS; 7444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_MEAN_SEA_LEVEL) 7454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL; 7474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.altitudeMeanSeaLevel = location_report_ptr->altitude_wrt_mean_sea_level; 7484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_MAGNETIC_VARIATION ) 7514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_MAG_DEV; 7534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.magneticDeviation = location_report_ptr->magnetic_deviation; 7544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_VERTICAL_UNC) 7574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_VERT_UNC; 7594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.vert_unc = location_report_ptr->vert_unc; 7604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_UNC) 7634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_SPEED_UNC; 7654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.speed_unc = location_report_ptr->speed_unc; 7664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("reportPosition: fire callback\n"); 7694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin enum loc_sess_status fixStatus = 7704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (location_report_ptr->session_status 7714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin == RPC_LOC_SESS_STATUS_IN_PROGESS ? 7724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS); 7734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportPosition(location, 7744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended, 7754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (void*)location_report_ptr, 7764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin fixStatus, 7774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin tech_Mask); 7784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else 7814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportPosition(location, 7834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended, 7844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL, 7854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_SESS_FAILURE); 7864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("loc_eng_report_position: ignore position report " 7874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin "when session status = %d\n", 7884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin location_report_ptr->session_status); 7894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else 7924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 7934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("loc_eng_report_position: ignore position report " 7944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin "when session status is not set\n"); 7954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 7964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 7974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 7984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr) 7994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 8002e0c5f2f0d31e06a817de185fda694ba79f82ce0Dante Russo QtiGnssSvStatus SvStatus = {0}; 8014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin GpsLocationExtended locationExtended = {0}; 8024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.size = sizeof(locationExtended); 8034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int num_svs_max = 0; 8044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const rpc_loc_sv_info_s_type *sv_info_ptr; 8054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_COUNT) 8074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin num_svs_max = gnss_report_ptr->sv_count; 8094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (num_svs_max > GPS_MAX_SVS) 8104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin num_svs_max = GPS_MAX_SVS; 8124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_LIST) 8164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.num_svs = 0; 8184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin for (int i = 0; i < num_svs_max; i++) 8204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin sv_info_ptr = &(gnss_report_ptr->sv_list.sv_list_val[i]); 8224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SYSTEM) 8234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GPS) 8254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].size = sizeof(GpsSvInfo); 8274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn; 8284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // We only have the data field to report gps eph and alm mask 8304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_EPH) && 8314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (sv_info_ptr->has_eph == 1)) 8324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.ephemeris_mask |= (1 << (sv_info_ptr->prn-1)); 8344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_ALM) && 8374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (sv_info_ptr->has_alm == 1)) 8384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.almanac_mask |= (1 << (sv_info_ptr->prn-1)); 8404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) && 8434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK)) 8444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.gps_used_in_fix_mask |= (1 << (sv_info_ptr->prn-1)); 8464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // SBAS: GPS RPN: 120-151, 8494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // In exteneded measurement report, we follow nmea standard, which is from 33-64. 8504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_SBAS) 8514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + 33 - 120; 8534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Gloness: Slot id: 1-32 8554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // In extended measurement report, we follow nmea standard, which is 65-96 8564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GLONASS) 8574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) && 8594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK)) 8604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.glo_used_in_fix_mask |= (1 << (sv_info_ptr->prn-1)); 8624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + (65-1); 8654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Unsupported SV system 8674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else 8684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin continue; 8704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SNR) 8744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].snr = sv_info_ptr->snr; 8764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_ELEVATION) 8794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].elevation = sv_info_ptr->elevation; 8814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_AZIMUTH) 8844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.sv_list[SvStatus.num_svs].azimuth = sv_info_ptr->azimuth; 8864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin SvStatus.num_svs++; 8894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 8914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 8924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if ((gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_POS_DOP) && 8934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_HOR_DOP) && 8944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_VERT_DOP)) 8954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 8964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_DOP; 8974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.pdop = gnss_report_ptr->position_dop; 8984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.hdop = gnss_report_ptr->horizontal_dop; 8994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended.vdop = gnss_report_ptr->vertical_dop; 9004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (SvStatus.num_svs >= 0) 9034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportSv(SvStatus, 9054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locationExtended, 9064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin (void*)gnss_report_ptr); 9074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 9094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportStatus(const rpc_loc_status_event_s_type *status_report_ptr) 9114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 9124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) { 9144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON) 9154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportStatus(GPS_STATUS_ENGINE_ON); 9174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportStatus(GPS_STATUS_SESSION_BEGIN); 9184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF) 9204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportStatus(GPS_STATUS_SESSION_END); 9224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportStatus(GPS_STATUS_ENGINE_OFF); 9234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else 9254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportStatus(GPS_STATUS_NONE); 9274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 9314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr) 9334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 9344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 9364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences.nmea_sentences_val, 9374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin nmea_report_ptr->nmea_sentences.nmea_sentences_len); 9384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 9394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences, 9404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin nmea_report_ptr->length); 9414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("loc_eng_report_nmea: $%c%c%c\n", 9424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin nmea_report_ptr->nmea_sentences[3], 9434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin nmea_report_ptr->nmea_sentences[4], 9444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin nmea_report_ptr->nmea_sentences[5]); 9454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */ 9464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 9474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 9494035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setXtraData(char* data, int length) 9504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 9514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; 9524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int total_parts; 9534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin uint8 part; 9544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin uint16 part_len; 9554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin uint16 len_injected; 9564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 9574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA; 9584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_predicted_orbits_data_s_type *predicted_orbits_data_ptr; 9594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("qct_loc_eng_inject_xtra_data, xtra size = %d, data ptr = 0x%lx\n", length, (long) data); 9614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.predicted_orbits_data; 9634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->format_type = RPC_LOC_PREDICTED_ORBITS_XTRA; 9644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->total_size = length; 9654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin total_parts = (length - 1) / XTRA_BLOCK_SIZE + 1; 9664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->total_parts = total_parts; 9674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin len_injected = 0; // O bytes injected 9694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = ioctl_type; 9704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // XTRA injection starts with part 1 9724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin for (part = 1; part <= total_parts; part++) 9734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->part = part; 9754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->part_len = XTRA_BLOCK_SIZE; 9764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (XTRA_BLOCK_SIZE > (length - len_injected)) 9774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->part_len = length - len_injected; 9794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 9804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->data_ptr.data_ptr_len = predicted_orbits_data_ptr->part_len; 9814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->data_ptr.data_ptr_val = data + len_injected; 9824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("qct_loc_eng_inject_xtra_data, part %d/%d, len = %d, total = %d\n", 9844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->part, 9854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin total_parts, 9864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_ptr->part_len, 9874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin len_injected); 9884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (part < total_parts) 9904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // No callback in this case 9924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_ret_val = loc_ioctl (client_handle, 9934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_type, 9944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data); 9954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 9964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (rpc_ret_val != RPC_LOC_API_SUCCESS) 9974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 9984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("loc_ioctl for xtra error: %s\n", loc_get_ioctl_status_name(rpc_ret_val)); 9994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 10004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin //Add a delay of 10 ms so that repeated RPC calls dont starve the modem processor 10024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin usleep(10 * 1000); 10034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else // part == total_parts 10054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 10064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Last part injection, will need to wait for callback 10074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (!loc_eng_ioctl(client_handle, 10084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_type, 10094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 10104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_XTRA_INJECT_DEFAULT_TIMEOUT, 10114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL)) 10124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 10134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; 10144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; // done with injection 10164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin len_injected += predicted_orbits_data_ptr->part_len; 10194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("loc_ioctl XTRA injected length: %d\n", len_injected); 10204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr(rpc_ret_val); 10234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 10244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Request the Xtra Server Url from the modem */ 10264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 10274035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::requestXtraServer() 10284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 10294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_api_adapter_err err; 10304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type data; 10314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_callback_s_type callback_data; 10324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin err = convertErr(loc_eng_ioctl(client_handle, 10344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE, 10354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &data, 10364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 10374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &callback_data)); 10384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (LOC_API_ADAPTER_ERR_SUCCESS != err) 10404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 10414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: err=%d\n", err); 10424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return err; 10434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else if (RPC_LOC_SESS_STATUS_SUCCESS != callback_data.status) 10454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 10464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: status=%ld\n", callback_data.status); 10474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 10484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.type) 10504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 10514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the type expected! type=%d\n", callback_data.type); 10524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 10534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.data.disc) 10554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 10564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the disc expected! disc=%d\n", callback_data.data.disc); 10574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; 10584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin reportXtraServer(callback_data.data.rpc_loc_ioctl_callback_data_u_type_u. 10614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_source.servers[0], 10624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin callback_data.data.rpc_loc_ioctl_callback_data_u_type_u. 10634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_source.servers[1], 10644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin callback_data.data.rpc_loc_ioctl_callback_data_u_type_u. 10654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin predicted_orbits_data_source.servers[2], 10664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 255); 10674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return LOC_API_ADAPTER_ERR_SUCCESS; 10694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 10704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 10724035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType) 10734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 10744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_server_open_status_e_type open_status = is_succ ? RPC_LOC_SERVER_OPEN_SUCCESS : RPC_LOC_SERVER_OPEN_FAIL; 10754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 10764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (AGPS_TYPE_INVALID == agpsType) { 10784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_server_open_status_s_type *conn_open_status_ptr = 10794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_open_status; 10804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Fill in data 10824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS; 10834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_open_status_ptr->conn_handle = handle; 10844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_open_status_ptr->open_status = open_status; 10854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 10864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_open_status_ptr->apn_name = apn; /* requires APN */ 10874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 10884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (is_succ) { 10894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin strlcpy(conn_open_status_ptr->apn_name, apn, 10904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin sizeof conn_open_status_ptr->apn_name); 10914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else { 10924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_open_status_ptr->apn_name[0] = 0; 10934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 10944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */ 10954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 10964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS open %s, APN name = [%s]\n", 10974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin log_succ_fail_string(is_succ), 10984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin apn); 10994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else { 11004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_server_multi_open_status_s_type *conn_multi_open_status_ptr = 11014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data.rpc_loc_ioctl_data_u_type_u.multi_conn_open_status; 11024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Fill in data 11044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS; 11054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->conn_handle = handle; 11064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->open_status = open_status; 11074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (is_succ) { 11084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin strlcpy(conn_multi_open_status_ptr->apn_name, apn, 11094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin sizeof conn_multi_open_status_ptr->apn_name); 11104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else { 11114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->apn_name[0] = 0; 11124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 11134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch(bearer) 11154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 11164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case AGPS_APN_BEARER_IPV4: 11174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IP; 11184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 11194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case AGPS_APN_BEARER_IPV6: 11204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV6; 11214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 11224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case AGPS_APN_BEARER_IPV4V6: 11234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV4V6; 11244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 11254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 11264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_PPP; 11274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 11284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS open %s, APN name = [%s], pdp_type = %d\n", 11304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin log_succ_fail_string(is_succ), 11314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin apn, 11324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_multi_open_status_ptr->pdp_type); 11334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 11344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Make the IOCTL call 11364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 11374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl(client_handle, 11384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc, 11394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 11404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 11414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL) 11424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 11434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 11444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 11464035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::atlCloseStatus(int handle, int is_succ) 11474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 11484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 11494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS; 11504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_server_close_status_s_type *conn_close_status_ptr = 11524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_close_status; 11534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_close_status_ptr->conn_handle = handle; 11544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin conn_close_status_ptr->close_status = is_succ ? RPC_LOC_SERVER_CLOSE_SUCCESS : RPC_LOC_SERVER_CLOSE_FAIL; 11554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Make the IOCTL call 11574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 11584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl(client_handle, 11594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc, 11604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 11614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 11624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL) 11634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 11644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 11654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr) 11674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 11684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int connHandle; 11694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin AGpsType agps_type; 11704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 11714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST event %s)", 11724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_get_event_atl_open_name(server_request_ptr->event)); 11734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (server_request_ptr->event) 11744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 11754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_SERVER_REQUEST_MULTI_OPEN: 11764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.conn_handle; 11774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.connection_type 11784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin == RPC_LOC_SERVER_CONNECTION_LBS) { 11794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin agps_type = AGPS_TYPE_SUPL; 11804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n type - AGPS_TYPE_SUPL\n handle - %d", connHandle); 11814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else { 11824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin agps_type = AGPS_TYPE_WWAN_ANY; 11834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n type - AGPS_TYPE_WWAN_ANY\n handle - %d", connHandle); 11844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 11854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin requestATL(connHandle, agps_type); 11864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 11874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_SERVER_REQUEST_OPEN: 11884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.open_req.conn_handle; 11894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_OPEN\n handle - %d", connHandle); 11904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin requestATL(connHandle, AGPS_TYPE_INVALID); 11914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 11924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_SERVER_REQUEST_CLOSE: 11934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.close_req.conn_handle; 11944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_CLOSE\n handle - %d", connHandle); 11954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin releaseATL(connHandle); 11964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 11974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 11984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("ATLEvent: event type %d invalid", server_request_ptr->event); 11994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 12004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 12014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::NIEvent(const rpc_loc_ni_event_s_type *ni_req) 12034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 12044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin GpsNiNotification notif = {0}; 12054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (ni_req->event) 12074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_EVENT_VX_NOTIFY_VERIFY_REQ: 12094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const rpc_loc_ni_vx_notify_verify_req_s_type *vx_req = 12114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.vx_req; 12124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGI("VX Notification"); 12134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.ni_type = GPS_NI_TYPE_VOICE; 12144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Requestor ID 12154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.requestor_id, sizeof notif.requestor_id, 12164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin vx_req->requester_id.requester_id, 12174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin vx_req->requester_id.requester_id_length); 12184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.text_encoding = 0; // No text and no encoding 12194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.requestor_id_encoding = convertNiEncodingType(vx_req->encoding_scheme); 12204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NIEventFillVerfiyType(notif, vx_req->notification_priv_type); 12214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 12224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 12234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_EVENT_UMTS_CP_NOTIFY_VERIFY_REQ: 12254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const rpc_loc_ni_umts_cp_notify_verify_req_s_type *umts_cp_req = 12274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.umts_cp_req; 12284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGI("UMTS CP Notification\n"); 12294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.ni_type= GPS_NI_TYPE_UMTS_CTRL_PLANE; // Stores notification text 12304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 12314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.text, sizeof notif.text, 12324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->notification_text.notification_text_val, 12334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->notification_length); 12344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.requestor_id, sizeof notif.requestor_id, 12354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->requestor_id.requestor_id_string.requestor_id_string_val, 12364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->requestor_id.string_len); 12374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 12384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.text, sizeof notif.text, 12394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->notification_text, 12404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->notification_length); 12414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.requestor_id, sizeof notif.requestor_id, 12424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->requestor_id.requestor_id_string, 12434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->requestor_id.string_len); 12444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif 12454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.text_encoding = convertNiEncodingType(umts_cp_req->datacoding_scheme); 12464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.requestor_id_encoding = notif.text_encoding; 12474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NIEventFillVerfiyType(notif, umts_cp_req->notification_priv_type); 12484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // LCS address (using extras field) 12504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (umts_cp_req->ext_client_address_data.ext_client_address_len != 0) 12514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Copy LCS Address into notif.extras in the format: Address = 012345 12534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin strlcat(notif.extras, LOC_NI_NOTIF_KEY_ADDRESS, sizeof notif.extras); 12544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin strlcat(notif.extras, " = ", sizeof notif.extras); 12554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int addr_len = 0; 12564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const char *address_source = NULL; 12574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 12594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin address_source = umts_cp_req->ext_client_address_data.ext_client_address.ext_client_address_val; 12604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 12614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin address_source = umts_cp_req->ext_client_address_data.ext_client_address; 12624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */ 12634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin char lcs_addr[32]; // Decoded LCS address for UMTS CP NI 12654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin addr_len = decodeAddress(lcs_addr, sizeof lcs_addr, address_source, 12664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin umts_cp_req->ext_client_address_data.ext_client_address_len); 12674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // The address is ASCII string 12694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (addr_len) 12704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin strlcat(notif.extras, lcs_addr, sizeof notif.extras); 12724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 12734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 12744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 12754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 12764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_EVENT_SUPL_NOTIFY_VERIFY_REQ: 12784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const rpc_loc_ni_supl_notify_verify_req_s_type *supl_req = 12804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req; 12814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGI("SUPL Notification\n"); 12824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.ni_type = GPS_NI_TYPE_UMTS_SUPL; 12834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 12844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (supl_req->flags & RPC_LOC_NI_CLIENT_NAME_PRESENT) 12854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 12864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 12874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.text, sizeof notif.text, 12884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->client_name.client_name_string.client_name_string_val, /* buffer */ 12894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->client_name.string_len /* length */ 12904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 12914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 12924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.text, sizeof notif.text, 12934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->client_name.client_name_string, /* buffer */ 12944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->client_name.string_len /* length */ 12954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 12964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */ 12974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("SUPL NI: client_name: %s len=%d", notif.text, supl_req->client_name.string_len); 12984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 12994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else { 13004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("SUPL NI: client_name not present."); 13014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Requestor ID 13044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (supl_req->flags & RPC_LOC_NI_REQUESTOR_ID_PRESENT) 13054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 13064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200) 13074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.requestor_id, sizeof notif.requestor_id, 13084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->requestor_id.requestor_id_string.requestor_id_string_val, /* buffer */ 13094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->requestor_id.string_len /* length */ 13104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 13114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else 13124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin hexcode(notif.requestor_id, sizeof notif.requestor_id, 13134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->requestor_id.requestor_id_string, /* buffer */ 13144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin supl_req->requestor_id.string_len /* length */ 13154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 13164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */ 13174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("SUPL NI: requestor_id: %s len=%d", notif.requestor_id, supl_req->requestor_id.string_len); 13184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else { 13204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("SUPL NI: requestor_id not present."); 13214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // Encoding type 13244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (supl_req->flags & RPC_LOC_NI_ENCODING_TYPE_PRESENT) 13254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 13264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.text_encoding = convertNiEncodingType(supl_req->datacoding_scheme); 13274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.requestor_id_encoding = notif.text_encoding; 13284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else { 13304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.text_encoding = notif.requestor_id_encoding = GPS_ENC_UNKNOWN; 13314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NIEventFillVerfiyType(notif, ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req.notification_priv_type); 13344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin break; 13364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 13384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("Unknown NI event: %x\n", (int) ni_req->event); 13394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return; 13404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin // this copy will get freed in loc_eng_ni when loc_ni_respond() is called 13434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ni_event_s_type *copy = (rpc_loc_ni_event_s_type *)malloc(sizeof(*copy)); 13444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin memcpy(copy, ni_req, sizeof(*copy)); 13454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin requestNiNotify(notif, (const void*)copy); 13464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 13474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint LocApiRpc::NIEventFillVerfiyType(GpsNiNotification ¬if, 13494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ni_notify_verify_e_type notif_priv) 13504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 13514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (notif_priv) 13524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 13534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_USER_NO_NOTIFY_NO_VERIFY: 13544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.notify_flags = 0; 13554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.default_response = GPS_NI_RESPONSE_NORESP; 13564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 1; 13574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_USER_NOTIFY_ONLY: 13584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.notify_flags = GPS_NI_NEED_NOTIFY; 13594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.default_response = GPS_NI_RESPONSE_NORESP; 13604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 1; 13614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_USER_NOTIFY_VERIFY_ALLOW_NO_RESP: 13624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY; 13634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.default_response = GPS_NI_RESPONSE_ACCEPT; 13644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 1; 13654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_USER_NOTIFY_VERIFY_NOT_ALLOW_NO_RESP: 13664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY; 13674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.default_response = GPS_NI_RESPONSE_DENY; 13684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 1; 13694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_USER_PRIVACY_OVERRIDE: 13704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.notify_flags = GPS_NI_PRIVACY_OVERRIDE; 13714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin notif.default_response = GPS_NI_RESPONSE_NORESP; 13724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 1; 13734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 13744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 0; 13754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 13764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 13774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err 13794035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setSUPLVersion(uint32_t version) 13804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 13814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_SUPL_VERSION, {0}}; 13824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.rpc_loc_ioctl_data_u_type_u.supl_version = (int)version; 13834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return convertErr( 13844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_ioctl (client_handle, 13854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_SET_SUPL_VERSION, 13864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 13874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 13884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL) 13894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ); 13904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 13914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 13924035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinGpsNiEncodingType LocApiRpc::convertNiEncodingType(int loc_encoding) 13934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 13944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin switch (loc_encoding) 13954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 13964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_SUPL_UTF8: 13974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return GPS_ENC_SUPL_UTF8; 13984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_SUPL_UCS2: 13994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return GPS_ENC_SUPL_UCS2; 14004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_SUPL_GSM_DEFAULT: 14014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return GPS_ENC_SUPL_GSM_DEFAULT; 14024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin case RPC_LOC_NI_SS_LANGUAGE_UNSPEC: 14034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return GPS_ENC_SUPL_GSM_DEFAULT; // SS_LANGUAGE_UNSPEC = GSM 14044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin default: 14054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return GPS_ENC_UNKNOWN; 14064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 14074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 14084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 14094035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiBase* getLocApi(const MsgTask* msgTask, 14104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_API_ADAPTER_EVENT_MASK_T exMask, 14114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ContextBase *context) { 14124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return new LocApiRpc(msgTask, exMask, context); 14134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 14144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 14154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*Values for lock 14164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1 = Do not lock any position sessions 14174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2 = Lock MI position sessions 14184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3 = Lock MT position sessions 14194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 4 = Lock all position sessions 14204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin*/ 14214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint LocApiRpc::setGpsLock(LOC_GPS_LOCK_MASK lockMask) 14224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 14234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 14244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin boolean ret_val; 14254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d]: lock: %x\n", __func__, __LINE__, lockMask); 14264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.rpc_loc_ioctl_data_u_type_u.engine_lock = convertGpsLockMask(lockMask); 14274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ioctl_data.disc = RPC_LOC_IOCTL_SET_ENGINE_LOCK; 14284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 14294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_SET_ENGINE_LOCK, 14304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 14314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 14324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL /* No output information is expected*/); 14334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 14344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d]: ret_val: %d\n", __func__, __LINE__, (int)ret_val); 14354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return (ret_val == TRUE ? 0 : -1); 14364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 14374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 14384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* 14394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin Returns 14404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin Current value of GPS lock on success 14414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin -1 on failure 14424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin*/ 14434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint LocApiRpc :: getGpsLock() 14444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 14454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_data_u_type ioctl_data; 14464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin rpc_loc_ioctl_callback_s_type callback_payload; 14474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin boolean ret_val; 14484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int ret=0; 14494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d]: Enter\n", __func__, __LINE__); 14504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 14514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin RPC_LOC_IOCTL_GET_ENGINE_LOCK, 14524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &ioctl_data, 14534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_IOCTL_DEFAULT_TIMEOUT, 14544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin &callback_payload); 14554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if(ret_val == TRUE) { 14564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret = (int)callback_payload.data.engine_lock; 14574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d]: Lock type: %d\n", __func__, __LINE__, ret); 14584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 14594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin else { 14604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d]: Ioctl failed", __func__, __LINE__); 14614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret = -1; 14624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 14634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__); 14644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return ret; 14654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1466