qtmobility/plugins/sensors/symbian/magnetometersensorsym.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- a/qtmobility/plugins/sensors/symbian/magnetometersensorsym.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/sensors/symbian/magnetometersensorsym.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -42,10 +42,12 @@
 // Internal Headers
 #include "magnetometersensorsym.h"
 
+#include <sensrvgeneralproperties.h>
+
 /**
  * set the id of the magnetometer sensor
  */
-const char *CMagnetometerSensorSym::id("sym.magnetometer");
+char const * const CMagnetometerSensorSym::id("sym.magnetometer");
 
 /**
  * Factory function, this is used to create the magnetometer sensor object
@@ -74,7 +76,8 @@
  * Default constructor
  */
 CMagnetometerSensorSym::CMagnetometerSensorSym(QSensor *sensor):CSensorBackendSym(sensor),
-        iCalibrationLevel(0.0)
+        iCalibrationLevel(0.0),
+        iScaleRange(0)
     {
     if(sensor)
         {
@@ -101,9 +104,10 @@
         QVariant v = sensor()->property("returnGeoValues");
         iReturnGeoValues = (v.isValid() && v.toBool()); // if the property isn't set it's false
         }
+    TInt err;
     // get current property value for calibration and set it to reading
     TSensrvProperty calibration;
-    TRAPD(err, iBackendData.iSensorChannel->GetPropertyL(KSensrvPropCalibrationLevel,ESensrvSingleProperty, calibration));
+    TRAP(err, iBackendData.iSensorChannel->GetPropertyL(KSensrvPropCalibrationLevel, ESensrvSingleProperty, calibration));
     // If error in getting the calibration level, continue to start the sensor
     // as it is not a fatal error
     if ( err == KErrNone )
@@ -114,6 +118,64 @@
         }
     // Call backend start
     CSensorBackendSym::start();
+    
+    
+    TSensrvProperty dataFormatProperty;
+    TRAP(err, iBackendData.iSensorChannel->GetPropertyL(KSensrvPropIdChannelDataFormat, ESensrvSingleProperty, dataFormatProperty));
+    if(err == KErrNone)
+        {
+        TInt dataFormat;
+        dataFormatProperty.GetValue(dataFormat);
+        if(dataFormat == ESensrvChannelDataFormatScaled)
+            {
+            TSensrvProperty scaleRangeProperty;
+            TRAP(err, iBackendData.iSensorChannel->GetPropertyL(KSensrvPropIdScaledRange, KSensrvItemIndexNone, scaleRangeProperty)); 
+            if(err == KErrNone)
+                {
+                if(scaleRangeProperty.GetArrayIndex() == ESensrvSingleProperty)
+                    {
+                    if(scaleRangeProperty.PropertyType() == ESensrvIntProperty)
+                        {
+                        scaleRangeProperty.GetMaxValue(iScaleRange);
+                        }
+                    else if(scaleRangeProperty.PropertyType() == ESensrvRealProperty)
+                        {
+                        TReal realScale;
+                        scaleRangeProperty.GetMaxValue(realScale);
+                        iScaleRange = realScale;
+                        }
+                    }
+                else if(scaleRangeProperty.GetArrayIndex() == ESensrvArrayPropertyInfo)
+                    {
+                    TInt index;
+                    if(scaleRangeProperty.PropertyType() == ESensrvIntProperty)
+                        {              
+                        scaleRangeProperty.GetValue(index);
+                        }
+                    else if(scaleRangeProperty.PropertyType() == ESensrvRealProperty)
+                        {
+                        TReal realIndex;              
+                        scaleRangeProperty.GetValue(realIndex);
+                        index = realIndex;
+                        }
+                    TRAP(err, iBackendData.iSensorChannel->GetPropertyL(KSensrvPropIdScaledRange, KSensrvItemIndexNone, index, scaleRangeProperty));
+                    if(err == KErrNone)
+                        {
+                        if(scaleRangeProperty.PropertyType() == ESensrvIntProperty)
+                            {
+                            scaleRangeProperty.GetMaxValue(iScaleRange);
+                            }
+                        else if(scaleRangeProperty.PropertyType() == ESensrvRealProperty)
+                            {
+                            TReal realScaleRange;
+                            scaleRangeProperty.GetMaxValue(realScaleRange);
+                            iScaleRange = realScaleRange;
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 
 /*
@@ -130,22 +192,36 @@
         // If there is no reading available, return without setting
         return;
         }
-    // Get a lock on the reading data
-    iBackendData.iReadingLock.Wait();
+    
+    TReal x, y, z;
     // If Geo values are requested set it
     if(iReturnGeoValues)
         {
-        iReading.setX(iData.iAxisXCalibrated);
-        iReading.setY(iData.iAxisYCalibrated);
-        iReading.setZ(iData.iAxisZCalibrated);
+        x = iData.iAxisXCalibrated;
+        y = iData.iAxisYCalibrated;
+        z = iData.iAxisZCalibrated;
         }
     // If Raw values are requested set it
     else
         {
-        iReading.setX(iData.iAxisXRaw);
-        iReading.setY(iData.iAxisYRaw);
-        iReading.setZ(iData.iAxisZRaw);
-        }
+        x = iData.iAxisXRaw;
+        y = iData.iAxisYRaw;
+        z = iData.iAxisZRaw;
+        }   
+    // Scale adjustments
+    if(iScaleRange)
+	{
+	qoutputrangelist rangeList = sensor()->outputRanges();
+	TReal maxValue = rangeList[sensor()->outputRange()].maximum;
+	x = (x/iScaleRange) * maxValue;
+	y = (y/iScaleRange) * maxValue;
+	z = (z/iScaleRange) * maxValue;
+	}
+	// Get a lock on the reading data
+    iBackendData.iReadingLock.Wait();
+    iReading.setX(x);
+    iReading.setY(y);
+    iReading.setZ(z);
     // Set the timestamp
     iReading.setTimestamp(iData.iTimeStamp.Int64());
     // Set the calibration level
@@ -189,5 +265,6 @@
 void CMagnetometerSensorSym::ConstructL()
     {
     InitializeL();
+    
     }