1 /* Copyright (c) 2011-2014, The Linux Foundation. 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 The Linux Foundation, 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_V_0_2_H
30 #define LOC_API_V_0_2_H
31 
32 #include <stdint.h>
33 #include <stdbool.h>
34 #include "ds_client.h"
35 #include <LocApiBase.h>
36 #include <loc_api_v02_client.h>
37 
38 using namespace loc_core;
39 
40 /* This class derives from the LocApiBase class.
41    The members of this class are responsible for converting
42    the Loc API V02 data structures into Loc Adapter data structures.
43    This class also implements some of the virtual functions that
44    handle the requests from loc engine. */
45 class LocApiV02 : public LocApiBase {
46   enum supported_status {
47       sup_unknown,
48       sup_yes,
49       sup_no
50   };
51 protected:
52   /* loc api v02 handle*/
53   locClientHandleType clientHandle;
54 
55 private:
56   /*ds client handle*/
57   dsClientHandleType dsClientHandle;
58   enum supported_status mGnssMeasurementSupported;
59   locClientEventMaskType mQmiMask;
60   bool mInSession;
61   bool mEngineOn;
62 
63   /* Convert event mask from loc eng to loc_api_v02 format */
64   static locClientEventMaskType convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask);
65 
66   /* Convert GPS LOCK mask from gps.conf definition */
67   static qmiLocLockEnumT_v02 convertGpsLockMask(LOC_GPS_LOCK_MASK lockMask);
68 
69   /* Convert error from loc_api_v02 to loc eng format*/
70   static enum loc_api_adapter_err convertErr(locClientStatusEnumType status);
71 
72   /* convert Ni Encoding type from QMI_LOC to loc eng format */
73   static GpsNiEncodingType convertNiEncoding(
74     qmiLocNiDataCodingSchemeEnumT_v02 loc_encoding);
75 
76   /*convert NI notify verify type from QMI LOC to loc eng format*/
77   static bool convertNiNotifyVerifyType (GpsNiNotification *notif,
78       qmiLocNiNotifyVerifyEnumT_v02 notif_priv);
79 
80   /*convert GpsMeasurement type from QMI LOC to loc eng format*/
81   static void convertGpsMeasurements (GpsMeasurement& gpsMeasurement,
82       const qmiLocSVMeasurementStructT_v02& gnss_measurement_info);
83 
84   /*convert GpsClock type from QMI LOC to loc eng format*/
85   static void convertGpsClock (GpsClock& gpsClock,
86       const qmiLocEventGnssSvMeasInfoIndMsgT_v02& gnss_measurement_info);
87 
88   /* convert position report to loc eng format and send the converted
89      position to loc eng */
90   void reportPosition
91     (const qmiLocEventPositionReportIndMsgT_v02 *location_report_ptr);
92 
93   /* convert satellite report to loc eng format and  send the converted
94      report to loc eng */
95   void reportSv (const qmiLocEventGnssSvInfoIndMsgT_v02 *gnss_report_ptr);
96 
97   /* convert engine state report to loc eng format and send the converted
98      report to loc eng */
99   void reportEngineState (
100     const qmiLocEventEngineStateIndMsgT_v02 *engine_state_ptr);
101 
102   /* convert fix session report to loc eng format and send the converted
103      report to loc eng */
104   void reportFixSessionState (
105     const qmiLocEventFixSessionStateIndMsgT_v02 *fix_session_state_ptr);
106 
107   /* convert NMEA report to loc eng format and send the converted
108      report to loc eng */
109   void reportNmea (const qmiLocEventNmeaIndMsgT_v02 *nmea_report_ptr);
110 
111   /* convert and report an ATL request to loc engine */
112   void reportAtlRequest(
113     const qmiLocEventLocationServerConnectionReqIndMsgT_v02
114     *server_request_ptr);
115 
116   /* convert and report NI request to loc eng */
117   void reportNiRequest(
118     const qmiLocEventNiNotifyVerifyReqIndMsgT_v02 *ni_req_ptr);
119 
120   /* report the xtra server info */
121   void reportXtraServerUrl(
122     const qmiLocEventInjectPredictedOrbitsReqIndMsgT_v02* server_request_ptr);
123 
124   /* convert and report GNSS measurement data to loc eng */
125   void reportGnssMeasurementData(
126     const qmiLocEventGnssSvMeasInfoIndMsgT_v02& gnss_measurement_report_ptr);
127 
128   bool registerEventMask(locClientEventMaskType qmiMask);
129   locClientEventMaskType adjustMaskForNoSession(locClientEventMaskType qmiMask);
130   void cacheGnssMeasurementSupport();
131 
132 protected:
133   virtual enum loc_api_adapter_err
134     open(LOC_API_ADAPTER_EVENT_MASK_T mask);
135   virtual enum loc_api_adapter_err
136     close();
137 
138 public:
139   LocApiV02(const MsgTask* msgTask,
140             LOC_API_ADAPTER_EVENT_MASK_T exMask,
141             ContextBase *context = NULL);
142   ~LocApiV02();
143 
144   /* event callback registered with the loc_api v02 interface */
145   virtual void eventCb(locClientHandleType client_handle,
146                uint32_t loc_event_id,
147                locClientEventIndUnionType loc_event_payload);
148 
149   /* error callback, this function handles the  service unavailable
150      error */
151   void errorCb(locClientHandleType handle,
152                locClientErrorEnumType errorId);
153 
154   void ds_client_event_cb(ds_client_status_enum_type result);
155 
156   virtual enum loc_api_adapter_err startFix(const LocPosMode& posMode);
157 
158   virtual enum loc_api_adapter_err stopFix();
159 
160   virtual enum loc_api_adapter_err
161     setPositionMode(const LocPosMode& mode);
162 
163   virtual enum loc_api_adapter_err
164     setTime(GpsUtcTime time, int64_t timeReference, int uncertainty);
165 
166   virtual enum loc_api_adapter_err
167     injectPosition(double latitude, double longitude, float accuracy);
168 
169   virtual enum loc_api_adapter_err
170     deleteAidingData(GpsAidingData f);
171 
172   virtual enum loc_api_adapter_err
173     informNiResponse(GpsUserResponseType userResponse,
174                      const void* passThroughData);
175 
176   virtual enum loc_api_adapter_err
177     setServer(const char* url, int len);
178   virtual enum loc_api_adapter_err
179     setServer(unsigned int ip, int port, LocServerType type);
180   virtual enum loc_api_adapter_err
181     setXtraData(char* data, int length);
182   virtual enum loc_api_adapter_err
183     requestXtraServer();
184   virtual enum loc_api_adapter_err
185     atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bear,
186                    AGpsType agpsType);
187   virtual enum loc_api_adapter_err atlCloseStatus(int handle, int is_succ);
188   virtual enum loc_api_adapter_err setSUPLVersion(uint32_t version);
189   virtual enum loc_api_adapter_err setLPPConfig(uint32_t profile);
190 
191   virtual enum loc_api_adapter_err
192     setSensorControlConfig(int sensorUsage, int sensorProvider);
193 
194   virtual enum loc_api_adapter_err
195     setSensorProperties(bool gyroBiasVarianceRandomWalk_valid, float gyroBiasVarianceRandomWalk,
196                             bool accelBiasVarianceRandomWalk_valid, float accelBiasVarianceRandomWalk,
197                             bool angleBiasVarianceRandomWalk_valid, float angleBiasVarianceRandomWalk,
198                             bool rateBiasVarianceRandomWalk_valid, float rateBiasVarianceRandomWalk,
199                             bool velocityBiasVarianceRandomWalk_valid, float velocityBiasVarianceRandomWalk);
200 
201   virtual enum loc_api_adapter_err
202     setSensorPerfControlConfig(int controlMode, int accelSamplesPerBatch, int accelBatchesPerSec,
203                                int gyroSamplesPerBatch, int gyroBatchesPerSec,
204                                int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh,
205                                int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh, int algorithmConfig);
206   virtual enum loc_api_adapter_err setExtPowerConfig(int isBatteryCharging);
207   virtual enum loc_api_adapter_err setAGLONASSProtocol(unsigned long aGlonassProtocol);
208   virtual enum loc_api_adapter_err
209       getWwanZppFix(GpsLocation & zppLoc);
210   virtual enum loc_api_adapter_err
211       getBestAvailableZppFix(GpsLocation & zppLoc);
212   virtual enum loc_api_adapter_err
213       getBestAvailableZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask);
214   virtual int initDataServiceClient();
215   virtual int openAndStartDataCall();
216   virtual void stopDataCall();
217   virtual void closeDataCall();
218   virtual int setGpsLock(LOC_GPS_LOCK_MASK lock);
219 
220   /*
221     Returns
222     Current value of GPS Lock on success
223     -1 on failure
224   */
225   virtual int getGpsLock(void);
226   virtual enum loc_api_adapter_err setXtraVersionCheck(enum xtra_version_check check);
227   virtual void installAGpsCert(const DerEncodedCertificate* pData,
228                                size_t length,
229                                uint32_t slotBitMask);
230   /*
231     Update Registration Mask
232   */
233   virtual int updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
234                                      loc_registration_mask_status isEnabled);
235   /*
236     Set Gnss Constellation Config
237   */
238   virtual bool gnssConstellationConfig();
239 };
240 
241 extern "C" LocApiBase* getLocApi(const MsgTask* msgTask,
242                                  LOC_API_ADAPTER_EVENT_MASK_T exMask,
243                                  ContextBase *context);
244 #endif //LOC_API_V_0_2_H
245