--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EngSrc/IESensorMonitor.cpp Fri Oct 15 10:18:29 2010 +0900
@@ -0,0 +1,334 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors: Juha Kauppinen, Mika Hokkanen
+*
+* Description: Photo Browser
+*
+*/
+
+#include "IESensorMonitor.h"
+#include "debug.h"
+
+#ifdef _ACCELEROMETER_SUPPORTED_
+
+#ifdef _S60_3x_ACCELEROMETER_
+const TInt KAccelerometerSensorUID = 0x10273024;
+#endif
+
+CIESensorMonitor* CIESensorMonitor::NewL(MIESensorMonitorObserver& aSensorObserver)
+{
+ DP0_IMAGIC(_L("CIESensorMonitor::NewL++"));
+ CIESensorMonitor* self=new (ELeave) CIESensorMonitor(aSensorObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ DP0_IMAGIC(_L("CIESensorMonitor::NewL--"));
+ return self;
+}
+
+
+void CIESensorMonitor::ConstructL()
+{
+ DP0_IMAGIC(_L("CIESensorMonitor::ConstructL++"));
+
+#ifdef _S60_3x_ACCELEROMETER_
+ // Noise filter for the accelerometer;
+ iAccSensorDataX = 0;
+ iAccSensorDataY = 0;
+ iAccSensorDataZ = 0;
+
+#ifdef SENSOR_API_LOAD_DYNAMICALLY
+ _LIT( KSensorApiDll, "RRSensorApi" );
+ TUidType dllUid( KDynamicLibraryUid );
+ TInt error = iSensorApi.Load( KSensorApiDll, dllUid );
+ User::LeaveIfError(error);
+#endif
+
+ iSensorDataFilterX = CIESensorDataFilter::NewL();
+ iSensorDataFilterY = CIESensorDataFilter::NewL();
+ iSensorDataFilterZ = CIESensorDataFilter::NewL();
+
+#ifdef SENSOR_API_LOAD_DYNAMICALLY
+ // If Sensor API library is dynamically linked
+ typedef void ( *TFindSensorsLFunction )( RArray<TRRSensorInfo>& );
+ TFindSensorsLFunction findSensorsLFunction = ( TFindSensorsLFunction )iSensorApi.Lookup( 1 );
+ findSensorsLFunction( iSensorList );
+#else
+ TRAPD( error , CRRSensorApi::FindSensorsL(iSensorList));
+ if (error)
+ {
+ // Error found in sensors
+ }
+#endif
+
+ TInt sensorCount = iSensorList.Count();
+
+ for (TInt i = 0; i < sensorCount; i++ )
+ {
+ if (iSensorList[i].iSensorId == KAccelerometerSensorUID)
+ {
+ iAccelerometerSensorIndex = i;
+ break;
+ }
+ }
+#endif _S60_3x_ACCELEROMETER_
+#ifdef _S60_5x_ACCELEROMETER_
+
+ DP0_IMAGIC(_L("CIESensorMonitor::ConstructL - create CSensrvChannelFinder"));
+ iSensrvChannelFinder = CSensrvChannelFinder::NewL();
+ DP1_IMAGIC(_L("CIESensorMonitor::ConstructL - CSensrvChannelFinder created: %d"),iSensrvChannelFinder);
+
+ iChannelInfoList.Reset();
+ TSensrvChannelInfo mySearchConditions; // none, so matches all.
+ DP0_IMAGIC(_L("CIESensorMonitor::ConstructL - iSensrvChannelFinder->FindChannelsL"));
+ TRAPD(err, iSensrvChannelFinder->FindChannelsL(iChannelInfoList, mySearchConditions));
+ if(err != KErrNone)
+ {
+ DP1_IMAGIC(_L("CIESensorMonitor::ConstructL - iSensrvChannelFinder->FindChannelsL ERROR: %d"), err);
+ User::Leave(err);
+ }
+ DP0_IMAGIC(_L("CIESensorMonitor::ConstructL - iSensrvChannelFinder->FindChannelsL - OK"));
+
+ TInt senIndex(0); // Sensor Selection
+
+ TBuf<256> text;
+ text.Append(_L(" ----------------------------FOUND SENSOR=" ));
+ text.AppendNum(iChannelInfoList.Count());
+ DP0_IMAGIC(text);
+
+ if(senIndex >= 0 && senIndex < iChannelInfoList.Count())
+ {
+ DP0_IMAGIC(_L("CIESensorMonitor::ConstructL++"));
+ iSensrvSensorChannel = CSensrvChannel::NewL( iChannelInfoList[senIndex] );
+ iSensrvSensorChannel->OpenChannelL();
+ }
+
+#endif //_S60_5x_ACCELEROMETER_
+
+ DP0_IMAGIC(_L("CIESensorMonitor::ConstructL++"));
+}
+
+
+CIESensorMonitor::CIESensorMonitor(MIESensorMonitorObserver& aSensorObserver)
+ :iSensorObserver(aSensorObserver)
+ {
+ }
+
+
+CIESensorMonitor::~CIESensorMonitor()
+{
+ DP0_IMAGIC(_L("CIESensorMonitor::~CIESensorMonitor"));
+
+ StopMonitoring();
+
+#ifdef _S60_3x_ACCELEROMETER_
+
+#ifdef SENSOR_API_LOAD_DYNAMICALLY
+ // Close dynamically loaded library
+ iSensorApi.Close();
+#endif //SENSOR_API_LOAD_DYNAMICALLY
+
+ delete iAccelerometerSensor;
+ iAccelerometerSensor = NULL;
+#endif
+#ifdef _S60_5x_ACCELEROMETER_
+
+ if(iSensrvSensorChannel)
+ iSensrvSensorChannel->CloseChannel();
+
+ delete iSensrvSensorChannel;
+
+ iChannelInfoList.Reset();
+ delete iSensrvChannelFinder;
+
+#endif
+}
+
+void CIESensorMonitor::StartMonitoring()
+{
+ DP0_IMAGIC(_L("CIESensorMonitor::StartMonitoring+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"));
+
+#ifdef _S60_3x_ACCELEROMETER_
+
+#ifdef SENSOR_API_LOAD_DYNAMICALLY
+ // If Sensor API library is dynamically linked
+ typedef CRRSensorApi* ( *TNewLFunction )( TRRSensorInfo );
+ TNewLFunction newLFunction = ( TNewLFunction )iSensorApi.Lookup( 2 );
+ iAccelerometerSensor = newLFunction( iSensorList[iAccelerometerSensorIndex] );
+#else
+ iAccelerometerSensor = CRRSensorApi::NewL(iSensorList[iAccelerometerSensorIndex]);
+#endif
+
+ if (iAccelerometerSensor)
+ iAccelerometerSensor->AddDataListener(this);
+#endif
+#ifdef _S60_5x_ACCELEROMETER_
+ if(iSensrvSensorChannel)
+ iSensrvSensorChannel->StartDataListeningL( this, 1,1,iUpdateInterval);
+#endif
+}
+
+void CIESensorMonitor::StopMonitoring()
+{
+ DP0_IMAGIC(_L("CSensorMonitor::StopMonitoring++"));
+
+#ifdef _S60_3x_ACCELEROMETER_
+ if(iAccelerometerSensor)
+ iAccelerometerSensor->RemoveDataListener();
+#endif
+#ifdef _S60_5x_ACCELEROMETER_
+ if(iSensrvSensorChannel)
+ iSensrvSensorChannel->StopDataListening();
+
+#endif
+}
+
+#ifdef _S60_3x_ACCELEROMETER_
+
+void CIESensorMonitor::HandleDataEventL(TRRSensorInfo aSensor, TRRSensorEvent aEvent)
+ {
+ TImagicDeviceOrientation deviceOrientation;
+ // Axis Data
+ switch (aSensor.iSensorId)
+ {
+ case KAccelerometerSensorUID:
+ {
+ iAccSensorDataX = iSensorDataFilterX->FilterSensorData(aEvent.iSensorData1); // X
+ iAccSensorDataY = iSensorDataFilterY->FilterSensorData(aEvent.iSensorData2); // Y
+ iAccSensorDataZ = iSensorDataFilterZ->FilterSensorData(aEvent.iSensorData3); // Z
+
+ TInt x = Abs(iAccSensorDataX);
+ TInt y = Abs(iAccSensorDataY);
+ TInt z = Abs(iAccSensorDataZ);
+
+ // Calculate the orientation of the screen
+ if (x>z && x>z) // Landscape
+ {
+ if (iAccSensorDataX > 0)
+ deviceOrientation = EOrientationDisplayRigthUp;
+ else
+ deviceOrientation = EOrientationDisplayLeftUp;
+ }
+ if (y>x && y>z) // Portrait Mode
+ {
+ if (iAccSensorDataY > 0)
+ deviceOrientation = EOrientationDisplayUp;
+ else
+ deviceOrientation = EOrientationDisplayDown;
+
+ }
+ //if (z>x && z>y)
+ // {
+ // if (iAccSensorDataZ)
+ //Not used deviceOrientation = EOrientationDisplayDownwards;
+ // else
+ //Not used deviceOrientation = EOrientationDisplayUpwards;
+ // }
+
+ iSensorObserver.SensorDataAvailable(deviceOrientation, EFalse);
+
+ }
+ break;
+ default:
+ break;
+ }
+ }
+#endif
+#ifdef _S60_5x_ACCELEROMETER_
+
+ _LIT( KTimeString, "%-B%:0%J%:1%T%:2%S%.%*C4%:3%+B" );
+
+void CIESensorMonitor::DataReceived( CSensrvChannel& aChannel, TInt aCount, TInt aDataLost )
+{
+ DP0_IMAGIC(_L("CSensorMonitor::DataReceived"));
+
+ TBuf<250> progressBuf;
+
+ TInt errErr(KErrNone);
+
+ //iDataLostCount = iDataLostCount + aDataLost;
+ //iDataCount = iDataCount + aCount;
+
+ if( aChannel.GetChannelInfo().iChannelType == KSensrvChannelTypeIdOrientationData )
+ {
+ TSensrvOrientationData data;
+
+ //TRAP(errErr,
+ for( TInt i = 0; i < aCount; i++ )
+ {
+ TPckgBuf<TSensrvOrientationData> dataBuf;
+ aChannel.GetData( dataBuf );
+ data = dataBuf();
+ data.iTimeStamp.FormatL(progressBuf, KTimeString );
+ }
+
+ if(errErr != KErrNone)
+ {
+ progressBuf.Zero();
+ }
+
+ switch ( data.iDeviceOrientation )
+ {
+ case EOrientationDisplayUp:
+ {
+ progressBuf.Append( _L( "Display up" ) );
+ DP1_IMAGIC( _L( "Display up: %d" ),data.iDeviceOrientation );
+ break;
+ }
+ case EOrientationDisplayDown:
+ {
+ progressBuf.Append( _L( "Display down" ) );
+ DP1_IMAGIC( _L( "Display down: %d" ),data.iDeviceOrientation );
+ break;
+ }
+ case EOrientationDisplayLeftUp:
+ {
+ progressBuf.Append( _L( "Display left up" ) );
+ DP1_IMAGIC( _L( "Display left up: %d" ),data.iDeviceOrientation );
+ break;
+ }
+ case EOrientationDisplayRigthUp:
+ {
+ progressBuf.Append( _L( "Display right up" ) );
+ DP1_IMAGIC( _L( "Display right up: %d" ),data.iDeviceOrientation );
+ break;
+ }
+ default:
+ {
+ progressBuf.Append( _L( "Unknown orientation" ) );
+ DP1_IMAGIC( _L( "Unknown orientation: %d" ),data.iDeviceOrientation );
+ break;
+ }
+ }
+ iSensorObserver.SensorDataAvailable(TImagicDeviceOrientation(data.iDeviceOrientation), EFalse);
+ }
+ else
+ {
+ progressBuf.Copy(_L("Channel = " ));
+ progressBuf.AppendNum(aChannel.GetChannelInfo().iChannelType,EHex);
+ }
+
+ DP0_IMAGIC(progressBuf);
+
+}
+
+void CIESensorMonitor::DataError( CSensrvChannel& /*aChannel*/, TSensrvErrorSeverity /*aError*/)
+{
+ DP0_IMAGIC(_L("CIESensorMonitor::DataReceived"));
+}
+
+#endif //_S60_5x_ACCELEROMETER_
+
+#endif //_ACCELEROMETER_SUPPORTED_
+// End of File
+