• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 #ifndef LOC_API_ADAPTER_H
30 #define LOC_API_ADAPTER_H
31 
32 #include <ctype.h>
33 #include <hardware/gps.h>
34 #include <loc.h>
35 #include <log_util.h>
36 
37 #define MIN_POSSIBLE_FIX_INTERVAL 1000 /* msec */
38 
39 enum loc_api_adapter_err {
40     LOC_API_ADAPTER_ERR_SUCCESS             = 0,
41     LOC_API_ADAPTER_ERR_GENERAL_FAILURE     = 1,
42     LOC_API_ADAPTER_ERR_UNSUPPORTED         = 2,
43     LOC_API_ADAPTER_ERR_INVALID_HANDLE      = 4,
44     LOC_API_ADAPTER_ERR_INVALID_PARAMETER   = 5,
45     LOC_API_ADAPTER_ERR_ENGINE_BUSY         = 6,
46     LOC_API_ADAPTER_ERR_PHONE_OFFLINE       = 7,
47     LOC_API_ADAPTER_ERR_TIMEOUT             = 8,
48     LOC_API_ADAPTER_ERR_SERVICE_NOT_PRESENT = 9,
49 
50     LOC_API_ADAPTER_ERR_ENGINE_DOWN         = 100,
51     LOC_API_ADAPTER_ERR_FAILURE,
52     LOC_API_ADAPTER_ERR_UNKNOWN
53 };
54 
55 enum loc_api_adapter_event_index {
56     LOC_API_ADAPTER_REPORT_POSITION = 0,       // Position report comes in loc_parsed_position_s_type
57     LOC_API_ADAPTER_REPORT_SATELLITE,          // Satellite in view report
58     LOC_API_ADAPTER_REPORT_NMEA_1HZ,           // NMEA report at 1HZ rate
59     LOC_API_ADAPTER_REPORT_NMEA_POSITION,      // NMEA report at position report rate
60     LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY,  // NI notification/verification request
61     LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA,   // Assistance data, eg: time, predicted orbits request
62     LOC_API_ADAPTER_REQUEST_LOCATION_SERVER,   // Request for location server
63     LOC_API_ADAPTER_REPORT_IOCTL,              // Callback report for loc_ioctl
64     LOC_API_ADAPTER_REPORT_STATUS,             // Misc status report: eg, engine state
65 
66     LOC_API_ADAPTER_EVENT_MAX
67 };
68 
69 #define LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT   (1<<LOC_API_ADAPTER_REPORT_POSITION)
70 #define LOC_API_ADAPTER_BIT_SATELLITE_REPORT         (1<<LOC_API_ADAPTER_REPORT_SATELLITE)
71 #define LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT          (1<<LOC_API_ADAPTER_REPORT_NMEA_1HZ)
72 #define LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT     (1<<LOC_API_ADAPTER_REPORT_NMEA_POSITION)
73 #define LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST (1<<LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY)
74 #define LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST  (1<<LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA)
75 #define LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST  (1<<LOC_API_ADAPTER_REQUEST_LOCATION_SERVER)
76 #define LOC_API_ADAPTER_BIT_IOCTL_REPORT             (1<<LOC_API_ADAPTER_REPORT_IOCTL)
77 #define LOC_API_ADAPTER_BIT_STATUS_REPORT            (1<<LOC_API_ADAPTER_REPORT_STATUS)
78 
79 typedef unsigned int LOC_API_ADAPTER_EVENT_MASK_T;
80 typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp);
81 
82 struct LocEng {
83     void* owner;
84     LOC_API_ADAPTER_EVENT_MASK_T eventMask;
85     const gps_acquire_wakelock acquireWakelock;
86     const gps_release_wakelock releaseWakeLock;
87     const loc_msg_sender       sendMsge;
88     const loc_ext_parser       extPosInfo;
89     const loc_ext_parser       extSvInfo;
90 
91     LocEng(void* caller,
92            LOC_API_ADAPTER_EVENT_MASK_T emask,
93            gps_acquire_wakelock acqwl,
94            gps_release_wakelock relwl,
95            loc_msg_sender msgSender,
96            loc_ext_parser posParser,
97            loc_ext_parser svParser);
98 };
99 
100 class LocApiAdapter {
101 protected:
102     const LocEng locEngHandle;
103 
104     LocApiAdapter(LocEng &locEng);
105 
106 public:
107     //LocApiAdapter(int q, reportCb_t[LOC_API_ADAPTER_EVENT_MAX] callbackTable);
108     virtual ~LocApiAdapter();
109 
110     static LocApiAdapter* getLocApiAdapter(LocEng &locEng);
111 
112     static int hexcode(char *hexstring, int string_size,
113                        const char *data, int data_size);
114     static int decodeAddress(char *addr_string, int string_size,
115                              const char *data, int data_size);
116 
117     void reportPosition(GpsLocation &location,
118                         void* locationExt,
119                         enum loc_sess_status status);
120     void reportSv(GpsSvStatus &svStatus, void* svExt);
121     void reportStatus(GpsStatusValue status);
122     void reportNmea(const char* nmea, int length);
123     void reportAgpsStatus(AGpsStatus &agpsStatus);
124     void requestXtraData();
125     void requestTime();
126     void requestLocation();
127     void requestATL(int connHandle, AGpsType agps_type);
128     void releaseATL(int connHandle);
129     void requestNiNotify(GpsNiNotification &notify, const void* data);
130     void handleEngineDownEvent();
131     void handleEngineUpEvent();
132 
133     // All below functions are to be defined by adapter specific modules:
134     // RPC, QMI, etc.  The default implementation is empty.
135     inline virtual enum loc_api_adapter_err
reinit()136         reinit()
137     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
138     inline virtual enum loc_api_adapter_err
startFix()139         startFix()
140     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
141     inline virtual enum loc_api_adapter_err
stopFix()142         stopFix()
143     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
144     inline virtual enum loc_api_adapter_err
deleteAidingData(GpsAidingData f)145         deleteAidingData(GpsAidingData f)
146     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
147     inline virtual enum loc_api_adapter_err
enableData(int enable)148         enableData(int enable)
149     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
150     inline virtual enum loc_api_adapter_err
setAPN(char * apn,int len)151         setAPN(char* apn, int len)
152     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
153     inline virtual enum loc_api_adapter_err
injectPosition(double latitude,double longitude,float accuracy)154         injectPosition(double latitude, double longitude, float accuracy)
155     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
156     inline virtual enum loc_api_adapter_err
setTime(GpsUtcTime time,int64_t timeReference,int uncertainty)157         setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
158     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
159     inline virtual enum loc_api_adapter_err
setXtraData(char * data,int length)160         setXtraData(char* data, int length)
161     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
162 #ifdef QCOM_FEATURE_IPV6
163     inline virtual enum loc_api_adapter_err
atlOpenStatus(int handle,int is_succ,char * apn,AGpsBearerType bear,AGpsType agpsType)164         atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bear, AGpsType agpsType)
165     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
166 #else
167     inline virtual enum loc_api_adapter_err
atlOpenStatus(int handle,int is_succ,char * apn,AGpsType agpsType)168         atlOpenStatus(int handle, int is_succ, char* apn, AGpsType agpsType)
169     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
170 #endif
171     inline virtual enum loc_api_adapter_err
atlCloseStatus(int handle,int is_succ)172         atlCloseStatus(int handle, int is_succ)
173     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
174     inline virtual enum loc_api_adapter_err
setPositionMode(LocPositionMode mode,GpsPositionRecurrence recurrence,uint32_t min_interval,uint32_t preferred_accuracy,uint32_t preferred_time)175         setPositionMode(LocPositionMode mode, GpsPositionRecurrence recurrence,
176                         uint32_t min_interval, uint32_t preferred_accuracy,
177                         uint32_t preferred_time)
178     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
179     inline virtual enum loc_api_adapter_err
setServer(const char * url,int len)180         setServer(const char* url, int len)
181     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
182     inline virtual enum loc_api_adapter_err
setServer(unsigned int ip,int port,LocServerType type)183         setServer(unsigned int ip, int port,
184                   LocServerType type)
185     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
186     inline virtual enum loc_api_adapter_err
informNiResponse(GpsUserResponseType userResponse,const void * passThroughData)187         informNiResponse(GpsUserResponseType userResponse, const void* passThroughData)
188     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
189     inline virtual enum loc_api_adapter_err
setSUPLVersion(uint32_t version)190         setSUPLVersion(uint32_t version)
191     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
192     inline virtual enum loc_api_adapter_err
setSensorControlConfig(int sensorUsage)193         setSensorControlConfig(int sensorUsage)
194     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
195     inline virtual enum loc_api_adapter_err
setSensorProperties(float gyroBiasVarianceRandomWalk)196         setSensorProperties(float gyroBiasVarianceRandomWalk)
197     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
198     inline virtual enum loc_api_adapter_err
setSensorPerfControlConfig(int controlMode,int accelSamplesPerBatch,int accelBatchesPerSec,int gyroSamplesPerBatch,int gyroBatchesPerSec)199         setSensorPerfControlConfig(int controlMode, int accelSamplesPerBatch, int accelBatchesPerSec,
200                             int gyroSamplesPerBatch, int gyroBatchesPerSec)
201     {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
202 };
203 
204 extern "C" LocApiAdapter* getLocApiAdapter(LocEng &locEng);
205 
206 typedef LocApiAdapter* (getLocApiAdapter_t)(LocEng&);
207 
208 #endif //LOC_API_RPC_ADAPTER_H
209