×
Namespaces

Variants
Actions
Revision as of 09:12, 21 June 2012 by hamishwillee (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Archived:RPositioner::NotifyPositionUpdate returns KErrInUse after few minutes (Known Issue)

From Nokia Developer Wiki
Jump to: navigation, search

Archived.pngArchived: This article is archived because it is not considered relevant for third-party developers creating commercial solutions today. If you think this article is still relevant, let us know by adding the template {{ReviewForRemovalFromArchive|user=~~~~|write your reason here}}.

Trying to use RPositioner::NotifyPositionUpdate() to receive GPS position fails after a certain number of updates have been made, if update options have been omitted. This known issue has been verified by Nokia Developer.

Article Metadata
Tested with
Devices(s): Nokia N95, Nokia E90 Communicator, Nokia 6110 Navigator
Compatibility
Platform(s): S60 3rd Edition, Feature Pack 1
S60 3rd Edition FP1
Article
Created: alammi (30 Nov 2007)
Last edited: hamishwillee (21 Jun 2012)

Description

Approximately after 4-5 minutes (255 update cycles), RPositioner::NotifyPositionUpdate() completes with error KErrInUse (-14). This happens when the client has not set valid update options with RPositioner::SetUpdateOptions().

This is not the defined return value for this API. After returning KErrInUse the RPositioner has "died" and always returns KErrInUse.

Note that the problem does not appear when using a Bluetooth GPS through the Location Acquisition API, or on the emulator.

How to reproduce

Header file:

  class CMyPositioner : public CActive 
{
...
 
RPositionServer iPositionServer;
RPositioner iPositioner;
TPositionSatelliteInfo iSatelliteInfo;
};

Implementation:

  _LIT(KRequestor, "MyPositioner");
 
void CMyPositioner::ConstructL()
{
...
User::LeaveIfError( iPositionServer.Connect() );
User::LeaveIfError( iPositioner.Open(iPositionServer) );
User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService,
CRequestor::EFormatApplication,
KRequestor) );
CActiveScheduler::Add( this );
}
 
 
void CMyPositioner::StartL()
{
...
iPositioner.NotifyPositionUpdate( iSatelliteInfo, iStatus );
SetActive();
}
 
 
void CMyPositioner::RunL()
{
if (iStatus == KErrNone)
{
// Got iSatelliteInfo successfully, handle it
HandleSatelliteInfo();
 
// Request next update
iPositioner.NotifyPositionUpdate(iSatelliteInfo, iStatus);
SetActive();
}
else
{
// Fails with KErrInUse (-14) after 255 cycles
_LIT( KDebugMessage, "NotifyPositionUpdate() failed: %d" );
RDebug::Print( KDebugMessage, iStatus.Int() );
}
}

Solution

Set valid update options with RPositioner::SetUpdateOptions() prior to calling RPositioner::NotifyPositionUpdate():

  iPositioner.SetUpdateOptions(
TPositionUpdateOptions( '''aInterval''',
TTimeIntervalMicroSeconds(0), /* timeout */
TTimeIntervalMicroSeconds(0), /* max age */
aAcceptPartialUpdates));
 
iPositioner.NotifyPositionUpdate( iSatelliteInfo, iStatus );
SetActive();
...

Note that the update interval (aInterval) value must be non-zero.

This page was last modified on 21 June 2012, at 09:12.
59 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×