qtmobility/plugins/sensors/symbian/rotationsensorsym.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- a/qtmobility/plugins/sensors/symbian/rotationsensorsym.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/sensors/symbian/rotationsensorsym.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -42,10 +42,15 @@
 // Internal Headers
 #include "rotationsensorsym.h"
 
+#include <sensrvgeneralproperties.h>
+
 /**
  * set the id of the proximity sensor
  */
-const char *CRotationSensorSym::id("sym.rotation");
+char const * const CRotationSensorSym::id("sym.rotation");
+
+const TInt KMinimumRange = -180;
+const TInt KMaximumRange = 180;
 
 /**
  * Factory function, this is used to create the rotation sensor object
@@ -96,8 +101,33 @@
     // Get a lock on the reading data
     iBackendData.iReadingLock.Wait();
     // To Do verify with ds and ramsay
-    iReading.setX(iData.iDeviceRotationAboutXAxis);
-    iReading.setY(iData.iDeviceRotationAboutYAxis-180);
+    
+    // For x axis symbian provides reading from 0 to 359 range
+    // This logic maps value to Qt range -90 to 90
+    if(iData.iDeviceRotationAboutXAxis >= 0 && iData.iDeviceRotationAboutXAxis <= 180)
+        {
+        iReading.setX(90 - iData.iDeviceRotationAboutXAxis);
+        }
+    else if(iData.iDeviceRotationAboutXAxis > 180 && iData.iDeviceRotationAboutXAxis <= 270)
+        {
+        iReading.setX(iData.iDeviceRotationAboutXAxis - 270);
+        }
+    else if(iData.iDeviceRotationAboutXAxis > 270 && iData.iDeviceRotationAboutXAxis < 360)
+        {
+        iReading.setX(iData.iDeviceRotationAboutXAxis - 270);
+        }
+    
+    // For y axis symbian provides reading from 0 to 359 range
+    // This logic maps value to Qt range -180 to 180
+    if(iData.iDeviceRotationAboutYAxis >= 0 && iData.iDeviceRotationAboutYAxis <= 180)
+        {
+        iReading.setY(iData.iDeviceRotationAboutYAxis);
+        }
+    else if(iData.iDeviceRotationAboutYAxis > 180 && iData.iDeviceRotationAboutYAxis < 360)
+        {
+        iReading.setY(iData.iDeviceRotationAboutYAxis - 360);
+        }
+    
     if(iData.iDeviceRotationAboutZAxis == TSensrvRotationData::KSensrvRotationUndefined)
         {
         sensor()->setProperty("hasZ", QVariant(FALSE));
@@ -105,7 +135,16 @@
     else
         {
         sensor()->setProperty("hasZ", QVariant(TRUE));
-        iReading.setZ(iData.iDeviceRotationAboutZAxis-180);
+        // For z axis symbian provides reading from 0 to 359 range
+        // This logic maps value to Qt range -180 to 180
+        if(iData.iDeviceRotationAboutZAxis >= 0 && iData.iDeviceRotationAboutZAxis <= 180)
+            {
+            iReading.setZ(iData.iDeviceRotationAboutZAxis);
+            }
+        else if(iData.iDeviceRotationAboutZAxis > 180 && iData.iDeviceRotationAboutZAxis < 360)
+            {
+            iReading.setZ(iData.iDeviceRotationAboutZAxis - 360);
+            }
         }
     // Set the timestamp
     iReading.setTimestamp(iData.iTimeStamp.Int64());
@@ -113,6 +152,25 @@
     iBackendData.iReadingLock.Signal();
     }
 
+/**
+ * Overriding this method in rotation sensor to hard code value of 
+ * mesurement range from -180 to 180 as Qt wants
+ * Symbian provides measurement range from 0 to 359
+ */
+void CRotationSensorSym::GetMeasurementrangeAndAccuracy()
+    {
+    TReal accuracy = 0;
+    TSensrvProperty accuracyProperty;
+    TRAPD(err, iBackendData.iSensorChannel->GetPropertyL(KSensrvPropIdChannelAccuracy, ESensrvSingleProperty, accuracyProperty));
+    if(err == KErrNone)
+        {
+        accuracyProperty.GetValue(accuracy);
+        }
+    // Hard coding values -180 and 180 as Qt expects y and z axis
+    // values range from -180 to 180.
+    addOutputRange(KMinimumRange, KMaximumRange, accuracy);
+    }
+
 
 /**
  * Second phase constructor