dynamically construct the sensor list.

MPL integration is modified such that the list of sensors
returned at sensorservice init time is dynamic and is based
on whether or not the InvenSense 9axis binary is present.
Real values for the sensor properties (range, power, res) are
provided.

Change-Id: I594597e8c7a8368c15e9095d61a6ce6d3c55d8f2
diff --git a/libsensors/MPLSensor.cpp b/libsensors/MPLSensor.cpp
index 2103d82..9663bfc 100644
--- a/libsensors/MPLSensor.cpp
+++ b/libsensors/MPLSensor.cpp
@@ -54,6 +54,7 @@
 }
 
 #include "mlcontrol.h"
+#include "sensor_params.h"
 
 #define EXTRA_VERBOSE (0)
 #define FUNC_LOG LOGV("%s", __PRETTY_FUNCTION__)
@@ -63,6 +64,33 @@
 
 #define CALL_MEMBER_FN(pobject,ptrToMember)  ((pobject)->*(ptrToMember))
 
+/******************************************/
+
+/* Base values for the sensor list, these need to be in the order defined in MPLSensor.h */
+static struct sensor_t sSensorList[] =
+    { { "MPL Gyro", "Invensense", 1,
+         SENSORS_GYROSCOPE_HANDLE,
+         SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, { } },
+      { "MPL accel", "Invensense", 1,
+         SENSORS_ACCELERATION_HANDLE,
+         SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, { } },
+      { "MPL magnetic field", "Invensense", 1,
+         SENSORS_MAGNETIC_FIELD_HANDLE,
+         SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, { } },
+      { "MPL Orientation (android deprecated format)", "Invensense", 1,
+         SENSORS_ORIENTATION_HANDLE,
+         SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, { } },
+      { "MPL rotation vector", "Invensense", 1,
+         SENSORS_ROTATION_VECTOR_HANDLE,
+         SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, { } },
+      { "MPL linear accel", "Invensense", 1,
+         SENSORS_LINEAR_ACCEL_HANDLE,
+         SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, { } },
+      { "MPL gravity", "Invensense", 1,
+         SENSORS_GRAVITY_HANDLE,
+         SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, { } },
+};
+
 /* ***************************************************************************
  * MPL interface misc.
  */
@@ -127,6 +155,11 @@
 
     mForceSleep = false;
 
+    /* used for identifying whether 9axis is enabled or not             */
+    /* this variable will be changed in initMPL() when libmpl is loaded */
+    /* sensor list will be changed based on this variable               */
+    mNineAxisEnabled = false;
+
     for (i = 0; i < ARRAY_SIZE(mPollFds); i++) {
         mPollFds[i].fd = -1;
         mPollFds[i].events = 0;
@@ -436,10 +469,14 @@
         } else if ((*fp_inv_enable_9x_fusion)() != INV_SUCCESS) {
             LOGE( "Warning : 9 axis sensor fusion not available "
                   "- No compass detected.\n");
+        } else {
+            /*  9axis is loaded and enabled                            */
+            /*  this variable is used for coming up with sensor list   */
+            mNineAxisEnabled = true;
         }
     } else {
         const char* error = dlerror();
-        LOGE("libmpl.so not found, 9x sensor fusion disabled (%s)",error);
+        LOGE("libinvensense_mpl.so not found, 9x sensor fusion disabled (%s)",error);
     }
 
     mldl_cfg = inv_get_dl_config();
@@ -1072,3 +1109,245 @@
     mForceSleep = false;
     pthread_mutex_unlock(&mMplMutex);
 }
+
+/** fill in the sensor list based on which sensors are configured.
+ *  return the number of configured sensors.
+ *  parameter list must point to a memory region of at least 7*sizeof(sensor_t)
+ *  parameter len gives the length of the buffer pointed to by list
+ */
+
+int MPLSensor::populateSensorList(struct sensor_t *list, int len)
+{
+    int numsensors;
+
+    if(len < 7*sizeof(sensor_t)) {
+        LOGE("sensor list too small, not populating.");
+        return 0;
+    }
+
+    /* fill in the base values */
+    memcpy(list, sSensorList, sizeof (struct sensor_t) * 7);
+
+    /* get platform config  */
+    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
+    if( mldl_cfg == NULL )
+    {
+        LOGE("Can not get mldl_cfg handle\n");
+        return 0;
+    }
+
+    /* first add gyro, accel and compass to the list */
+
+    /* fill in accel values                          */
+    fillAccel(mldl_cfg->accel->id, list);
+
+    /* fill in compass values                        */
+    fillCompass(mldl_cfg->compass->id, list);
+
+    /* fill in gyro values                           */
+    fillGyro(MPU_NAME, list);
+
+    if(mNineAxisEnabled)
+    {
+        numsensors = 7;
+        /* all sensors will be added to the list     */
+        /* fill in orientation values	             */
+        fillOrientation(list);
+
+        /* fill in rotation vector values	     */
+        fillRV(list);
+
+        /* fill in gravity values			     */
+        fillGravity(list);
+
+        /* fill in Linear accel values            */
+        fillLinearAccel(list);
+    } else {
+        /* no 9-axis sensors, zero fill that part of the list */
+        numsensors = 3;
+        memset(list+3, 0, 4*sizeof(struct sensor_t));
+    }
+
+    return numsensors;
+}
+
+void MPLSensor::fillAccel(unsigned char accel, struct sensor_t *list)
+{
+    switch (accel) {
+    case ACCEL_ID_LIS331:
+        list[Accelerometer].maxRange = ACCEL_LIS331_RANGE;
+        list[Accelerometer].resolution = ACCEL_LIS331_RESOLUTION;
+        list[Accelerometer].power = ACCEL_LIS331_POWER;
+        break;
+
+    case ACCEL_ID_LIS3DH:
+        list[Accelerometer].maxRange = ACCEL_LIS3DH_RANGE;
+        list[Accelerometer].resolution = ACCEL_LIS3DH_RESOLUTION;
+        list[Accelerometer].power = ACCEL_LIS3DH_POWER;
+        break;
+
+    case ACCEL_ID_KXSD9:
+        list[Accelerometer].maxRange = ACCEL_KXSD9_RANGE;
+        list[Accelerometer].resolution = ACCEL_KXSD9_RESOLUTION;
+        list[Accelerometer].power = ACCEL_KXSD9_POWER;
+        break;
+
+    case ACCEL_ID_KXTF9:
+        list[Accelerometer].maxRange = ACCEL_KXTF9_RANGE;
+        list[Accelerometer].resolution = ACCEL_KXTF9_RESOLUTION;
+        list[Accelerometer].power = ACCEL_KXTF9_POWER;
+        break;
+
+    case ACCEL_ID_BMA150:
+        list[Accelerometer].maxRange = ACCEL_BMA150_RANGE;
+        list[Accelerometer].resolution = ACCEL_BMA150_RESOLUTION;
+        list[Accelerometer].power = ACCEL_BMA150_POWER;
+        break;
+
+    case ACCEL_ID_BMA222:
+        list[Accelerometer].maxRange = ACCEL_BMA222_RANGE;
+        list[Accelerometer].resolution = ACCEL_BMA222_RESOLUTION;
+        list[Accelerometer].power = ACCEL_BMA222_POWER;
+        break;
+
+    case ACCEL_ID_BMA250:
+        list[Accelerometer].maxRange = ACCEL_BMA250_RANGE;
+        list[Accelerometer].resolution = ACCEL_BMA250_RESOLUTION;
+        list[Accelerometer].power = ACCEL_BMA250_POWER;
+        break;
+
+    case ACCEL_ID_ADXL34X:
+        list[Accelerometer].maxRange = ACCEL_ADXL34X_RANGE;
+        list[Accelerometer].resolution = ACCEL_ADXL34X_RESOLUTION;
+        list[Accelerometer].power = ACCEL_ADXL34X_POWER;
+        break;
+
+    case ACCEL_ID_MMA8450:
+        list[Accelerometer].maxRange = ACCEL_MMA8450_RANGE;
+        list[Accelerometer].maxRange = ACCEL_MMA8450_RANGE;
+        list[Accelerometer].maxRange = ACCEL_MMA8450_RANGE;
+        break;
+
+    case ACCEL_ID_MMA845X:
+        list[Accelerometer].maxRange = ACCEL_MMA845X_RANGE;
+        list[Accelerometer].resolution = ACCEL_MMA845X_RESOLUTION;
+        list[Accelerometer].power = ACCEL_MMA845X_POWER;
+        break;
+
+    case ACCEL_ID_MPU6050:
+        list[Accelerometer].maxRange = ACCEL_MPU6050_RANGE;
+        list[Accelerometer].resolution = ACCEL_MPU6050_RESOLUTION;
+        list[Accelerometer].power = ACCEL_MPU6050_POWER;
+        break;
+    default:
+        LOGE("unknown accel id -- accel params will be wrong.");
+        break;
+    }
+}
+
+void MPLSensor::fillCompass(unsigned char compass, struct sensor_t *list)
+{
+    switch (compass) {
+    case COMPASS_ID_AK8975:
+        list[MagneticField].maxRange = COMPASS_AKM8975_RANGE;
+        list[MagneticField].resolution = COMPASS_AKM8975_RESOLUTION;
+        list[MagneticField].power = COMPASS_AKM8975_POWER;
+        break;
+    case COMPASS_ID_AMI30X:
+        list[MagneticField].maxRange = COMPASS_AMI30X_RANGE;
+        list[MagneticField].resolution = COMPASS_AMI30X_RESOLUTION;
+        list[MagneticField].power = COMPASS_AMI30X_POWER;
+        break;
+    case COMPASS_ID_AMI306:
+        list[MagneticField].maxRange = COMPASS_AMI306_RANGE;
+        list[MagneticField].resolution = COMPASS_AMI306_RESOLUTION;
+        list[MagneticField].power = COMPASS_AMI306_POWER;
+        break;
+    case COMPASS_ID_YAS529:
+        list[MagneticField].maxRange = COMPASS_YAS529_RANGE;
+        list[MagneticField].resolution = COMPASS_AMI306_RESOLUTION;
+        list[MagneticField].power = COMPASS_AMI306_POWER;
+        break;
+    case COMPASS_ID_YAS530:
+        list[MagneticField].maxRange = COMPASS_YAS530_RANGE;
+        list[MagneticField].resolution = COMPASS_YAS530_RESOLUTION;
+        list[MagneticField].power = COMPASS_YAS530_POWER;
+        break;
+    case COMPASS_ID_HMC5883:
+        list[MagneticField].maxRange = COMPASS_HMC5883_RANGE;
+        list[MagneticField].resolution = COMPASS_HMC5883_RESOLUTION;
+        list[MagneticField].power = COMPASS_HMC5883_POWER;
+        break;
+    case COMPASS_ID_MMC314X:
+        list[MagneticField].maxRange = COMPASS_MMC314X_RANGE;
+        list[MagneticField].resolution = COMPASS_MMC314X_RESOLUTION;
+        list[MagneticField].power = COMPASS_MMC314X_POWER;
+        break;
+    case COMPASS_ID_HSCDTD002B:
+        list[MagneticField].maxRange = COMPASS_HSCDTD002B_RANGE;
+        list[MagneticField].resolution = COMPASS_HSCDTD002B_RESOLUTION;
+        list[MagneticField].power = COMPASS_HSCDTD002B_POWER;
+        break;
+    case COMPASS_ID_HSCDTD004A:
+        list[MagneticField].maxRange = COMPASS_HSCDTD004A_RANGE;
+        list[MagneticField].resolution = COMPASS_HSCDTD004A_RESOLUTION;
+        list[MagneticField].power = COMPASS_HSCDTD004A_POWER;
+        break;
+    default:
+        LOGE("unknown compass id -- compass parameters will be wrong");
+    }
+}
+
+void MPLSensor::fillGyro(const char* gyro, struct sensor_t *list)
+{
+    if ((gyro != NULL) && (strcmp(gyro, "mpu3050") == 0)) {
+        list[Gyro].maxRange = GYRO_MPU3050_RANGE;
+        list[Gyro].resolution = GYRO_MPU3050_RESOLUTION;
+        list[Gyro].power = GYRO_MPU3050_POWER;
+    } else {
+        list[Gyro].maxRange = GYRO_MPU6050_RANGE;
+        list[Gyro].resolution = GYRO_MPU6050_RESOLUTION;
+        list[Gyro].power = GYRO_MPU6050_POWER;
+    }
+    return;
+}
+
+
+/* fillRV depends on values of accel and compass in the list	*/
+void MPLSensor::fillRV(struct sensor_t *list)
+{
+    /* compute power on the fly */
+    list[RotationVector].power = list[Gyro].power + list[Accelerometer].power
+            + list[MagneticField].power;
+    list[RotationVector].resolution = .00001;
+    list[RotationVector].maxRange = 1.0;
+    return;
+}
+
+void MPLSensor::fillOrientation(struct sensor_t *list)
+{
+    list[Orientation].power = list[Gyro].power + list[Accelerometer].power
+            + list[MagneticField].power;
+    list[Orientation].resolution = .00001;
+    list[Orientation].maxRange = 360.0;
+    return;
+}
+
+void MPLSensor::fillGravity( struct sensor_t *list)
+{
+    list[Gravity].power = list[Gyro].power + list[Accelerometer].power
+            + list[MagneticField].power;
+    list[Gravity].resolution = .00001;
+    list[Gravity].maxRange = 9.81;
+    return;
+}
+
+void MPLSensor::fillLinearAccel(struct sensor_t *list)
+{
+    list[Gravity].power = list[Gyro].power + list[Accelerometer].power
+            + list[MagneticField].power;
+    list[Gravity].resolution = list[Accelerometer].resolution;
+    list[Gravity].maxRange = list[Accelerometer].maxRange;
+    return;
+}
+
diff --git a/libsensors/MPLSensor.h b/libsensors/MPLSensor.h
index 8febac3..d3b85d7 100644
--- a/libsensors/MPLSensor.h
+++ b/libsensors/MPLSensor.h
@@ -44,13 +44,13 @@
 
     enum
     {
-        RotationVector = 0,
-        LinearAccel,
-        Gravity,
-        Gyro,
+        Gyro=0,
         Accelerometer,
         MagneticField,
         Orientation,
+        RotationVector,
+        LinearAccel,
+        Gravity,
         numSensors
     };
 
@@ -66,6 +66,7 @@
     virtual void handlePowerEvent();
     virtual void sleepEvent();
     virtual void wakeEvent();
+    int populateSensorList(struct sensor_t *list, int len);
     void cbOnMotion(uint16_t);
     void cbProcData();
 
@@ -122,6 +123,15 @@
     long int mOldEnabledMask;
     android::KeyedVector<int, int> mIrqFds;
 
+    /* added for dynamic get sensor list              */
+    bool mNineAxisEnabled;
+    void fillAccel(unsigned char accel, struct sensor_t *list);
+    void fillCompass(unsigned char compass, struct sensor_t *list);
+    void fillGyro(const char* gyro, struct sensor_t *list);
+    void fillRV(struct sensor_t *list);
+    void fillOrientation(struct sensor_t *list);
+    void fillGravity(struct sensor_t *list);
+    void fillLinearAccel(struct sensor_t *list);
 };
 
 void setCallbackObject(MPLSensor*);
diff --git a/libsensors/sensor_params.h b/libsensors/sensor_params.h
new file mode 100644
index 0000000..35b64be
--- /dev/null
+++ b/libsensors/sensor_params.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2011 Invensense, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INV_SENSOR_PARAMS_H
+#define INV_SENSOR_PARAMS_H
+
+/* Physical parameters of the sensors supported by Invensense MPL */
+#define SENSORS_ROTATION_VECTOR_HANDLE  (ID_RV)
+#define SENSORS_LINEAR_ACCEL_HANDLE     (ID_LA)
+#define SENSORS_GRAVITY_HANDLE          (ID_GR)
+#define SENSORS_GYROSCOPE_HANDLE        (ID_GY)
+#define SENSORS_ACCELERATION_HANDLE     (ID_A)
+#define SENSORS_MAGNETIC_FIELD_HANDLE   (ID_M)
+#define SENSORS_ORIENTATION_HANDLE      (ID_O)
+/******************************************/
+//COMPASS_ID_AKM
+#define COMPASS_AKM8975_RANGE       (9830.0f)
+#define COMPASS_AKM8975_RESOLUTION  (0.285f)
+#define COMPASS_AKM8975_POWER       (10.0f)
+//COMPASS_ID_AMI30X
+#define COMPASS_AMI30X_RANGE        (5461.0f)
+#define COMPASS_AMI30X_RESOLUTION   (0.9f)
+#define COMPASS_AMI30X_POWER        (0.15f)
+//COMPASS_ID_AMI306
+#define COMPASS_AMI306_RANGE        (5461.0f)
+#define COMPASS_AMI306_RESOLUTION   (0.9f)
+#define COMPASS_AMI306_POWER        (0.15f)
+//COMPASS_ID_YAS529
+#define COMPASS_YAS529_RANGE        (19660.0f)
+#define COMPASS_YAS529_RESOLUTION   (0.012f)
+#define COMPASS_YAS529_POWER        (4.0f)
+//COMPASS_ID_YAS530
+#define COMPASS_YAS530_RANGE        (8001.0f)
+#define COMPASS_YAS530_RESOLUTION   (0.012f)
+#define COMPASS_YAS530_POWER        (4.0f)
+//COMPASS_ID_HMC5883
+#define COMPASS_HMC5883_RANGE       (10673.0f)
+#define COMPASS_HMC5883_RESOLUTION  (10.0f)
+#define COMPASS_HMC5883_POWER       (0.24f)
+//COMPASS_ID_LSM303DLH
+#define COMPASS_LSM303DLH_RANGE     (10240.0f)
+#define COMPASS_LSM303DLH_RESOLUTION    (1.0f)
+#define COMPASS_LSM303DLH_POWER     (1.0f)
+//COMPASS_ID_LSM303DLM
+#define COMPASS_LSM303DLM_RANGE     (10240.0f)
+#define COMPASS_LSM303DLM_RESOLUTION    (1.0f)
+#define COMPASS_LSM303DLM_POWER     (1.0f)
+//COMPASS_ID_MMC314X
+#define COMPASS_MMC314X_RANGE       (400.0f)
+#define COMPASS_MMC314X_RESOLUTION  (2.0f)
+#define COMPASS_MMC314X_POWER       (0.55f)
+//COMPASS_ID_HSCDTD002B
+#define COMPASS_HSCDTD002B_RANGE    (9830.0f)
+#define COMPASS_HSCDTD002B_RESOLUTION   (1.0f)
+#define COMPASS_HSCDTD002B_POWER    (1.0f)
+//COMPASS_ID_HSCDTD004A
+#define COMPASS_HSCDTD004A_RANGE    (9830.0f)
+#define COMPASS_HSCDTD004A_RESOLUTION   (1.0f)
+#define COMPASS_HSCDTD004A_POWER    (1.0f)
+/*******************************************/
+//ACCEL_ID_LIS331
+#define ACCEL_LIS331_RANGE      (2.480f*GRAVITY_EARTH)
+#define ACCEL_LIS331_RESOLUTION     (.001f*GRAVITY_EARTH)
+#define ACCEL_LIS331_POWER      (1.0f)
+//ACCEL_ID_LSM303DLX
+#define ACCEL_LSM303DLX_RANGE       (2.480f*GRAVITY_EARTH)
+#define ACCEL_LSM303DLX_RESOLUTION  (0.001f*GRAVITY_EARTH)
+#define ACCEL_LSM303DLX_POWER       (1.0f)
+//ACCEL_ID_LIS3DH
+#define ACCEL_LIS3DH_RANGE      (2.480f*GRAVITY_EARTH)
+#define ACCEL_LIS3DH_RESOLUTION     (0.001f*GRAVITY_EARTH)
+#define ACCEL_LIS3DH_POWER      (1.0f)
+//ACCEL_ID_KXSD9
+#define ACCEL_KXSD9_RANGE       (2.5006f*GRAVITY_EARTH)
+#define ACCEL_KXSD9_RESOLUTION      (0.001f*GRAVITY_EARTH)
+#define ACCEL_KXSD9_POWER       (1.0f)
+//ACCEL_ID_KXTF9
+#define ACCEL_KXTF9_RANGE       (1.0f*GRAVITY_EARTH)
+#define ACCEL_KXTF9_RESOLUTION      (0.033f*GRAVITY_EARTH)
+#define ACCEL_KXTF9_POWER       (0.35f)
+//ACCEL_ID_BMA150
+#define ACCEL_BMA150_RANGE      (2.0f*GRAVITY_EARTH)
+#define ACCEL_BMA150_RESOLUTION     (0.004f*GRAVITY_EARTH)
+#define ACCEL_BMA150_POWER      (0.2f)
+//ACCEL_ID_BMA222
+#define ACCEL_BMA222_RANGE      (2.0f*GRAVITY_EARTH)
+#define ACCEL_BMA222_RESOLUTION     (0.001f*GRAVITY_EARTH)
+#define ACCEL_BMA222_POWER      (0.1f)
+//ACCEL_ID_BMA250
+#define ACCEL_BMA250_RANGE      (2.0f*GRAVITY_EARTH)
+#define ACCEL_BMA250_RESOLUTION     (0.00391f*GRAVITY_EARTH)
+#define ACCEL_BMA250_POWER      (0.139f)
+//ACCEL_ID_ADXL34X
+#define ACCEL_ADXL34X_RANGE     (2.0f*GRAVITY_EARTH)
+#define ACCEL_ADXL34X_RESOLUTION    (0.001f*GRAVITY_EARTH)
+#define ACCEL_ADXL34X_POWER     (1.0f)
+//ACCEL_ID_MMA8450
+#define ACCEL_MMA8450_RANGE     (2.0f*GRAVITY_EARTH)
+#define ACCEL_MMA8450_RESOLUTION    (0.001f*GRAVITY_EARTH)
+#define ACCEL_MMA8450_POWER     (1.0f)
+//ACCEL_ID_MMA845X
+#define ACCEL_MMA845X_RANGE     (2.0f*GRAVITY_EARTH)
+#define ACCEL_MMA845X_RESOLUTION    (0.001f*GRAVITY_EARTH)
+#define ACCEL_MMA845X_POWER     (1.0f)
+//ACCEL_ID_MPU6050
+#define ACCEL_MPU6050_RANGE     (2.0f*GRAVITY_EARTH)
+#define ACCEL_MPU6050_RESOLUTION    (0.004f*GRAVITY_EARTH)
+#define ACCEL_MPU6050_POWER     (0.0f)
+/******************************************/
+//GYRO MPU3050
+#define RAD_P_DEG (3.14159f/180.0f)
+#define GYRO_MPU3050_RANGE      (2000.0f*RAD_P_DEG)
+#define GYRO_MPU3050_RESOLUTION     (16.4f*RAD_P_DEG)
+#define GYRO_MPU3050_POWER      (6.1f)
+//GYRO MPU6050
+#define GYRO_MPU6050_RANGE      (2000.0f*RAD_P_DEG)
+#define GYRO_MPU6050_RESOLUTION     (16.4f*RAD_P_DEG)
+#define GYRO_MPU6050_POWER      (5.5f)
+
+#endif
+
diff --git a/libsensors/sensors.h b/libsensors/sensors.h
index 283870b..5c56da0 100644
--- a/libsensors/sensors.h
+++ b/libsensors/sensors.h
@@ -34,13 +34,13 @@
 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
 
 #define ID_MPL_BASE (0)
-#define ID_RV (ID_MPL_BASE)
-#define ID_LA (ID_RV + 1)
-#define ID_GR (ID_LA + 1)
-#define ID_GY (ID_GR + 1)
+#define ID_GY (ID_MPL_BASE)
 #define ID_A  (ID_GY + 1)
 #define ID_M  (ID_A + 1)
 #define ID_O  (ID_M + 1)
+#define ID_RV (ID_O + 1) 
+#define ID_LA (ID_RV + 1)
+#define ID_GR (ID_LA + 1)
 
 /*****************************************************************************/
 
diff --git a/libsensors/sensors_mpl.cpp b/libsensors/sensors_mpl.cpp
index 44697bf..847ad91 100644
--- a/libsensors/sensors_mpl.cpp
+++ b/libsensors/sensors_mpl.cpp
@@ -44,23 +44,6 @@
 
 #define LIGHT_SENSOR_POLLTIME    2000000000
 
-#define SENSORS_ROTATION_VECTOR  (1<<ID_RV)
-#define SENSORS_LINEAR_ACCEL     (1<<ID_LA)
-#define SENSORS_GRAVITY          (1<<ID_GR)
-#define SENSORS_GYROSCOPE        (1<<ID_GY)
-#define SENSORS_ACCELERATION     (1<<ID_A)
-#define SENSORS_MAGNETIC_FIELD   (1<<ID_M)
-#define SENSORS_ORIENTATION      (1<<ID_O)
-
-#define SENSORS_ROTATION_VECTOR_HANDLE  (ID_RV)
-#define SENSORS_LINEAR_ACCEL_HANDLE     (ID_LA)
-#define SENSORS_GRAVITY_HANDLE          (ID_GR)
-#define SENSORS_GYROSCOPE_HANDLE        (ID_GY)
-#define SENSORS_ACCELERATION_HANDLE     (ID_A)
-#define SENSORS_MAGNETIC_FIELD_HANDLE   (ID_M)
-#define SENSORS_ORIENTATION_HANDLE      (ID_O)
-
-
 #define AKM_FTRACE 0
 #define AKM_DEBUG 0
 #define AKM_DATA 0
@@ -68,39 +51,8 @@
 /*****************************************************************************/
 
 /* The SENSORS Module */
-static const struct sensor_t sSensorList[] = {
-      { "MPL rotation vector",
-        "Invensense",
-        1, SENSORS_ROTATION_VECTOR_HANDLE,
-        SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 20000,{ } },
-      { "MPL linear accel",
-        "Invensense",
-        1, SENSORS_LINEAR_ACCEL_HANDLE,
-        SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 20000,{ } },
-      { "MPL gravity",
-        "Invensense",
-        1, SENSORS_GRAVITY_HANDLE,
-        SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 20000,{ } },
-      { "MPL Gyro",
-        "Invensense",
-        1, SENSORS_GYROSCOPE_HANDLE,
-        SENSOR_TYPE_GYROSCOPE, 10240.0f, 1.0f, 0.5f, 20000,{ } },
-      { "MPL accel",
-        "Invensense",
-        1, SENSORS_ACCELERATION_HANDLE,
-        SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 20000,{ } },
-      { "MPL magnetic field",
-        "Invensense",
-        1, SENSORS_MAGNETIC_FIELD_HANDLE,
-        SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 20000,{ } },
-      { "MPL Orientation (android deprecated format)",
-          "Invensense",
-          1, SENSORS_ORIENTATION_HANDLE,
-          SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 20000,{ } },
-
-
-};
-
+static struct sensor_t sSensorList[7];
+static int numSensors=7;
 
 static int open_sensors(const struct hw_module_t* module, const char* id,
                         struct hw_device_t** device);
@@ -110,7 +62,7 @@
                                      struct sensor_t const** list)
 {
     *list = sSensorList;
-    return ARRAY_SIZE(sSensorList);
+    return numSensors;
 }
 
 static struct hw_module_methods_t sensors_module_methods = {
@@ -177,6 +129,7 @@
     FUNC_LOG;
     MPLSensor* p_mplsen = new MPLSensor();
     setCallbackObject(p_mplsen); //setup the callback object for handing mpl callbacks
+    numSensors = p_mplsen->populateSensorList(sSensorList, sizeof(sSensorList));
 
     mSensors[mpl] = p_mplsen;
     mPollFds[mpl].fd = mSensors[mpl]->getFd();