94 // -------------------------------------------------------------------------- |
93 // -------------------------------------------------------------------------- |
95 // |
94 // |
96 void CPositionInfo::StartL( RLocationTrail::TTrailCaptureSetting aCaptureSetting, TInt aUpdateInterval ) |
95 void CPositionInfo::StartL( RLocationTrail::TTrailCaptureSetting aCaptureSetting, TInt aUpdateInterval ) |
97 { |
96 { |
98 LOG( "CPositionInfo::StartL(), begin" ); |
97 LOG( "CPositionInfo::StartL(), begin" ); |
99 |
98 if(IsActive()) |
|
99 { |
|
100 Cancel(); |
|
101 } |
100 iTrailCaptureSetting = aCaptureSetting; |
102 iTrailCaptureSetting = aCaptureSetting; |
101 iUpdateInterval = aUpdateInterval; |
103 iUpdateInterval = aUpdateInterval; |
102 iFirstInterval = ETrue; |
104 iState = EPositionOptStateNone; |
|
105 |
103 iPositionInfo = TPositionSatelliteInfo(); |
106 iPositionInfo = TPositionSatelliteInfo(); |
104 |
|
105 // Set update interval. |
|
106 iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds(KFirstInterval) ); |
|
107 // Set time out level. |
|
108 iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds( KFirstTimeOut) ); |
|
109 // Positions which have time stamp below KMaxAge can be reused |
|
110 iUpdateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxAge) ); |
|
111 // Disables location framework to send partial position data |
|
112 iUpdateOptions.SetAcceptPartialUpdates( EFalse ); |
|
113 |
107 |
114 if ( aCaptureSetting == RLocationTrail::ECaptureAll ) |
108 if ( aCaptureSetting == RLocationTrail::ECaptureAll ) |
115 { |
109 { |
116 User::LeaveIfError( iPosServer.Connect() ); |
110 if(!iConnectedPositionServer) |
117 User::LeaveIfError( iPositioner.Open( iPosServer ) ); |
111 { |
118 User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService, |
112 // Positions which have time stamp below KMaxAge can be reused |
119 CRequestor::EFormatApplication, KRequestor ) ); |
113 iUpdateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxAge) ); |
120 User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) ); |
114 // Disables location framework to send partial position data |
121 iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); |
115 iUpdateOptions.SetAcceptPartialUpdates( EFalse ); |
|
116 User::LeaveIfError( iPosServer.Connect() ); |
|
117 CleanupClosePushL(iPosServer); |
|
118 User::LeaveIfError( iPositioner.Open( iPosServer ) ); |
|
119 CleanupClosePushL(iPositioner); |
|
120 User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService, |
|
121 CRequestor::EFormatApplication, KRequestor ) ); |
|
122 iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds (iUpdateInterval) ); |
|
123 iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateTimeOut ) ); |
|
124 User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) ); |
|
125 CleanupStack::Pop(2); // iPositioner, iPosServer |
|
126 iConnectedPositionServer = ETrue; |
|
127 } |
|
128 iState = EPositionOptStateGetLastKnownPosition; |
|
129 iPositioner.GetLastKnownPosition( iPositionInfo, iStatus ); |
|
130 SetActive(); |
122 } |
131 } |
123 |
132 else if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) |
124 SetActive(); |
|
125 |
|
126 if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) |
|
127 { |
133 { |
128 TRequestStatus* status = &iStatus; |
134 TRequestStatus* status = &iStatus; |
129 User::RequestComplete( status, KErrNone ); |
135 User::RequestComplete( status, KErrNone ); |
130 } |
136 } |
131 |
137 |
136 // CPositionInfo::NextPosition |
142 // CPositionInfo::NextPosition |
137 // -------------------------------------------------------------------------- |
143 // -------------------------------------------------------------------------- |
138 // |
144 // |
139 void CPositionInfo::NextPosition() |
145 void CPositionInfo::NextPosition() |
140 { |
146 { |
141 iPositionInfo = TPositionSatelliteInfo(); // Clear position info. |
147 LOG( "CPositionInfo::NextPosition(), begin" ); |
142 if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll ) |
148 if(!IsActive() && iConnectedPositionServer) |
143 { |
149 { |
144 iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); |
150 LOG("Not active"); |
145 } |
151 iPositionInfo = TPositionSatelliteInfo(); // Clear position info. |
146 |
152 if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll ) |
147 SetActive(); |
153 { |
148 |
154 iState = EPositionOptStateNotifyUpdate; |
149 if ( iTrailCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) |
155 iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); |
150 { |
156 SetActive(); |
151 TRequestStatus* status = &iStatus; |
157 } |
152 User::RequestComplete( status, KErrNone ); |
158 else if ( iTrailCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) |
153 } |
159 { |
|
160 SetActive(); |
|
161 TRequestStatus* status = &iStatus; |
|
162 User::RequestComplete( status, KErrNone ); |
|
163 } |
|
164 } |
|
165 LOG( "CPositionInfo::NextPosition(), end" ); |
154 } |
166 } |
155 |
167 |
156 // -------------------------------------------------------------------------- |
168 // -------------------------------------------------------------------------- |
157 // CPositionInfo::Stop |
169 // CPositionInfo::Stop |
158 // -------------------------------------------------------------------------- |
170 // -------------------------------------------------------------------------- |
159 // |
171 // |
160 void CPositionInfo::Stop() |
172 void CPositionInfo::Stop() |
161 { |
173 { |
|
174 LOG( "CPositionInfo::Stop(), begin" ); |
162 Cancel(); |
175 Cancel(); |
163 |
176 if(iConnectedPositionServer) |
164 iPositioner.Close(); |
177 { |
165 iPosServer.Close(); |
178 iPositioner.Close(); |
|
179 iPosServer.Close(); |
|
180 iConnectedPositionServer = EFalse; |
|
181 } |
|
182 // reset the state |
|
183 iState = EPositionOptStateNone; |
|
184 LOG( "CPositionInfo::Stop(), end" ); |
166 } |
185 } |
167 |
186 |
168 // -------------------------------------------------------------------------- |
187 // -------------------------------------------------------------------------- |
169 // CPositionInfo::RunL |
188 // CPositionInfo::RunL |
170 // -------------------------------------------------------------------------- |
189 // -------------------------------------------------------------------------- |
171 // |
190 // |
172 void CPositionInfo::RunL() |
191 void CPositionInfo::RunL() |
173 { |
192 { |
174 iTrail->Position( iPositionInfo, iStatus.Int() ); |
193 LOG( "CPositionInfo::RunL(), begin" ); |
175 |
194 if(iState == EPositionOptStateGetLastKnownPosition) |
176 if ( iFirstInterval && IsActive() ) |
195 { |
|
196 // get last location.. check the time and if it's within the limit, pass to trail. |
|
197 const TTimeIntervalSeconds KMaxAllowedLastKnownPosition(60*5); // 5 mins |
|
198 TTimeIntervalSeconds interval; |
|
199 TTime now; |
|
200 TPosition lastPosition; |
|
201 iPositionInfo.GetPosition(lastPosition); |
|
202 now.UniversalTime(); |
|
203 now.SecondsFrom(lastPosition.Time(), interval); |
|
204 if(iStatus.Int() == KErrNone && interval < KMaxAllowedLastKnownPosition) |
|
205 { |
|
206 LOG("Last know position is recent one"); |
|
207 iTrail->Position( iPositionInfo, iStatus.Int() ); |
|
208 } |
|
209 else |
|
210 { |
|
211 LOG("Old last know position. Drop it.."); |
|
212 } |
|
213 } |
|
214 else |
|
215 { |
|
216 // notify response.. always pass to trail |
|
217 iTrail->Position( iPositionInfo, iStatus.Int() ); |
|
218 } |
|
219 |
|
220 if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll && |
|
221 iState != EPositionOptStateNone) |
177 { |
222 { |
178 Cancel(); |
223 NextPosition(); |
179 LOG("CPositionInfo::RunL() - First Time"); |
|
180 iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds (iUpdateInterval) ); |
|
181 iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateTimeOut ) ); |
|
182 if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll ) |
|
183 { |
|
184 User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) ); |
|
185 iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); |
|
186 } |
|
187 SetActive(); |
|
188 iFirstInterval = EFalse; |
|
189 } |
224 } |
|
225 LOG( "CPositionInfo::RunL(), end" ); |
190 } |
226 } |
191 |
227 |
192 // -------------------------------------------------------------------------- |
228 // -------------------------------------------------------------------------- |
193 // CPositionInfo::DoCancel |
229 // CPositionInfo::DoCancel |
194 // -------------------------------------------------------------------------- |
230 // -------------------------------------------------------------------------- |
195 // |
231 // |
196 void CPositionInfo::DoCancel() |
232 void CPositionInfo::DoCancel() |
197 { |
233 { |
198 LOG( "CPositionInfo::DoCancel()" ); |
234 LOG( "CPositionInfo::DoCancel(), begin" ); |
199 if ( IsActive() ) |
235 switch(iState) |
200 { |
236 { |
201 iPositioner.CancelRequest( EPositionerNotifyPositionUpdate ); |
237 case EPositionOptStateGetLastKnownPosition: |
202 } |
238 { |
|
239 iPositioner.CancelRequest( EPositionerGetLastKnownPosition ); |
|
240 break; |
|
241 } |
|
242 case EPositionOptStateNotifyUpdate: |
|
243 { |
|
244 iPositioner.CancelRequest( EPositionerNotifyPositionUpdate ); |
|
245 break; |
|
246 } |
|
247 default: |
|
248 break; |
|
249 } |
|
250 iState = EPositionOptStateNone; |
|
251 LOG( "CPositionInfo::DoCancel(), end" ); |
|
252 } |
|
253 |
|
254 |
|
255 // -------------------------------------------------------------------------- |
|
256 // CPositionInfo::HandleRemapComplete |
|
257 // -------------------------------------------------------------------------- |
|
258 // |
|
259 void CPositionInfo::HandleRemapComplete() |
|
260 { |
|
261 LOG( "CPositionInfo::HandleRemapComplete()" ); |
|
262 // Don't call notify update from RunL |
|
263 iState = EPositionOptStateNone; |
203 } |
264 } |
204 |
265 |
205 // End of file |
266 // End of file |
|
267 |