Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Revision as of 06:38, 13 September 2012 by hamishwillee (Talk | contribs)

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

How to turn the N97 into a Magnetic Compass

From Wiki
Jump to: navigation, search
Article Metadata
Code ExampleArticle
Created: mahbub_s60 (07 Dec 2009)
Last edited: hamishwillee (13 Sep 2012)

Contents

Introduction

This code snippet shows how we can convert N97 to a compass. This application can be used to find magnetic north direction by the built in magnetic north sensor. If you rotate the device the compass is rotated to indicate the north.

Compass.png

Magnetic north sensor

N97 and some other devices have built in magnetometer. That magnetometer is used to find the direction. The direction change is feed to rotate the bitmap.

	TInt i = 0;
CSensrvChannelFinder* finder = CSensrvChannelFinder::NewLC();
RSensrvChannelInfoList channelList;
CleanupClosePushL( channelList );
TSensrvChannelInfo Channelinfo;
finder->FindChannelsL( channelList, Channelinfo );
 
for (i = 0; i<channelList.Count(); i++)
{
Channelinfo = channelList[i];
switch(Channelinfo.iChannelType)
{
case KSensrvChannelTypeIdMagneticNorthData:
iBoolMagSupported = ETrue;
break;
default:
iBoolMagSupported = EFalse;
break;
}
if(iBoolMagSupported == (TInt)ETrue)
{
break;
}
}
 
if(iBoolMagSupported == (TInt)EFalse)
{
User::Leave(KErrNotSupported);
}
 
if ( channelList.Count() > 0 )
{
Channelinfo = channelList[i];
iMagneticNorthSensor = CSensrvChannel::NewL( channelList[ i ] );
iMagneticNorthSensor->OpenChannelL();
iMagneticNorthSensor->StartDataListeningL( this, 1, 1, 0 );
}
channelList.Close();
CleanupStack::Pop( &channelList );
CleanupStack::PopAndDestroy( finder );

Bitmap rotation

Following code shows how to rotate bitmap.
 
CFbsBitmap *CImageConverterEngine::Bitmap_Rotate(TInt Angle)
{
 
Angle = 360 -Angle;
TReal CosA = 0.0;
TReal SinA = 0.0;
 
if(!iOriginalBitmap)
{
return NULL;
}
 
TBitmapUtil BaseBmpUtil(iOriginalBitmap);
 
TBitmapUtil RotateBmpUtil(iRotatedBitmap);
 
BaseBmpUtil.Begin(TPoint(0,0));
 
RotateBmpUtil.Begin(TPoint(0,0), BaseBmpUtil);
RotateBmpUtil.Begin(TPoint(0,0));
 
TReal aAngle = (KPi/180.0)* (TReal)Angle;
 
TInt ret = Math::Cos(CosA, aAngle);
if(ret != KErrNone)
{
return NULL;
}
 
ret = Math::Sin(SinA, aAngle);
if(ret != KErrNone)
{
return NULL;
}
 
TInt xC = iSize.iWidth/2;
TInt yC = iSize.iHeight/2;
 
for(TInt new_y=0;new_y<iSize.iHeight;new_y++)
{
for(TInt new_x=0;new_x<iSize.iWidth;new_x++)
{
if( (new_x-xC)*(new_x-xC) + (new_y-yC)*(new_y-yC) <= (xC*yC))
{
TInt x = xC + (TInt)(((new_x - xC)*CosA) + ((new_y-yC)*SinA)); //new x pixel bitmap
TInt y = yC + (TInt)(-((new_x-xC)*SinA) + ((new_y-yC)*CosA)); // new y pixel bitmap
 
BaseBmpUtil.SetPos(TPoint(x,y));
RotateBmpUtil.SetPos(TPoint(new_x,new_y));
RotateBmpUtil.SetPixel(BaseBmpUtil);
}
}
}
BaseBmpUtil.End();
RotateBmpUtil.End();
 
return iRotatedBitmap;
}

Example Applications

The capability required for this app is ReadDeviceData. Example application was tested with N97. Can be found from following link: File:PhoneCompass.zip

This page was last modified on 13 September 2012, at 06:38.
81 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.

×