Add gyroscope and uncalibrated mag

bug: 36473942

Change-Id: Ia7582538e0f181cec4eba0f0ec49ebba4defe8aa
(cherry picked from commit fb390caace8d3710e14364373db7d02012d4d183)
(cherry picked from commit 7d85b5bbed6d56189a7e3140a185231e2472ceaf)
diff --git a/sensors/sensors_qemu.c b/sensors/sensors_qemu.c
index 9eee746..e9a11e4 100644
--- a/sensors/sensors_qemu.c
+++ b/sensors/sensors_qemu.c
@@ -50,40 +50,46 @@
 /** SENSOR IDS AND NAMES
  **/
 
-#define MAX_NUM_SENSORS 8
+#define MAX_NUM_SENSORS 10
 
 #define SUPPORTED_SENSORS  ((1<<MAX_NUM_SENSORS)-1)
 
-#define  ID_BASE           SENSORS_HANDLE_BASE
-#define  ID_ACCELERATION   (ID_BASE+0)
-#define  ID_MAGNETIC_FIELD (ID_BASE+1)
-#define  ID_ORIENTATION    (ID_BASE+2)
-#define  ID_TEMPERATURE    (ID_BASE+3)
-#define  ID_PROXIMITY      (ID_BASE+4)
-#define  ID_LIGHT          (ID_BASE+5)
-#define  ID_PRESSURE       (ID_BASE+6)
-#define  ID_HUMIDITY       (ID_BASE+7)
+#define  ID_BASE                        SENSORS_HANDLE_BASE
+#define  ID_ACCELERATION                (ID_BASE+0)
+#define  ID_GYROSCOPE                   (ID_BASE+1)
+#define  ID_MAGNETIC_FIELD              (ID_BASE+2)
+#define  ID_ORIENTATION                 (ID_BASE+3)
+#define  ID_TEMPERATURE                 (ID_BASE+4)
+#define  ID_PROXIMITY                   (ID_BASE+5)
+#define  ID_LIGHT                       (ID_BASE+6)
+#define  ID_PRESSURE                    (ID_BASE+7)
+#define  ID_HUMIDITY                    (ID_BASE+8)
+#define  ID_MAGNETIC_FIELD_UNCALIBRATED (ID_BASE+9)
 
-#define  SENSORS_ACCELERATION    (1 << ID_ACCELERATION)
-#define  SENSORS_MAGNETIC_FIELD  (1 << ID_MAGNETIC_FIELD)
-#define  SENSORS_ORIENTATION     (1 << ID_ORIENTATION)
-#define  SENSORS_TEMPERATURE     (1 << ID_TEMPERATURE)
-#define  SENSORS_PROXIMITY       (1 << ID_PROXIMITY)
-#define  SENSORS_LIGHT           (1 << ID_LIGHT)
-#define  SENSORS_PRESSURE        (1 << ID_PRESSURE)
-#define  SENSORS_HUMIDITY        (1 << ID_HUMIDITY)
+#define  SENSORS_ACCELERATION                 (1 << ID_ACCELERATION)
+#define  SENSORS_GYROSCOPE                    (1 << ID_GYROSCOPE)
+#define  SENSORS_MAGNETIC_FIELD               (1 << ID_MAGNETIC_FIELD)
+#define  SENSORS_ORIENTATION                  (1 << ID_ORIENTATION)
+#define  SENSORS_TEMPERATURE                  (1 << ID_TEMPERATURE)
+#define  SENSORS_PROXIMITY                    (1 << ID_PROXIMITY)
+#define  SENSORS_LIGHT                        (1 << ID_LIGHT)
+#define  SENSORS_PRESSURE                     (1 << ID_PRESSURE)
+#define  SENSORS_HUMIDITY                     (1 << ID_HUMIDITY)
+#define  SENSORS_MAGNETIC_FIELD_UNCALIBRATED  (1 << ID_MAGNETIC_FIELD)
 
 #define  ID_CHECK(x)  ((unsigned)((x) - ID_BASE) < MAX_NUM_SENSORS)
 
 #define  SENSORS_LIST  \
     SENSOR_(ACCELERATION,"acceleration") \
+    SENSOR_(GYROSCOPE,"gyroscope") \
     SENSOR_(MAGNETIC_FIELD,"magnetic-field") \
     SENSOR_(ORIENTATION,"orientation") \
     SENSOR_(TEMPERATURE,"temperature") \
     SENSOR_(PROXIMITY,"proximity") \
     SENSOR_(LIGHT, "light") \
     SENSOR_(PRESSURE, "pressure") \
-    SENSOR_(HUMIDITY, "humidity")
+    SENSOR_(HUMIDITY, "humidity") \
+    SENSOR_(MAGNETIC_FIELD_UNCALIBRATED,"magnetic-field-uncalibrated") \
 
 static const struct {
     const char*  name;
@@ -317,6 +323,17 @@
             continue;
         }
 
+        /* "gyroscope:<x>:<y>:<z>" corresponds to an gyroscope event */
+        if (sscanf(buff, "gyroscope:%g:%g:%g", params+0, params+1, params+2)
+                == 3) {
+            new_sensors |= SENSORS_GYROSCOPE;
+            events[ID_GYROSCOPE].gyro.x = params[0];
+            events[ID_GYROSCOPE].gyro.y = params[1];
+            events[ID_GYROSCOPE].gyro.z = params[2];
+            events[ID_GYROSCOPE].type = SENSOR_TYPE_GYROSCOPE;
+            continue;
+        }
+
         /* "orientation:<azimuth>:<pitch>:<roll>" is sent when orientation
          * changes */
         if (sscanf(buff, "orientation:%g:%g:%g", params+0, params+1, params+2)
@@ -347,6 +364,18 @@
             continue;
         }
 
+        if (sscanf(buff, "magnetic-uncalibrated:%g:%g:%g", params+0, params+1, params+2)
+                == 3) {
+            new_sensors |= SENSORS_MAGNETIC_FIELD_UNCALIBRATED;
+            events[ID_MAGNETIC_FIELD_UNCALIBRATED].magnetic.x = params[0];
+            events[ID_MAGNETIC_FIELD_UNCALIBRATED].magnetic.y = params[1];
+            events[ID_MAGNETIC_FIELD_UNCALIBRATED].magnetic.z = params[2];
+            events[ID_MAGNETIC_FIELD_UNCALIBRATED].magnetic.status =
+                    SENSOR_STATUS_ACCURACY_HIGH;
+            events[ID_MAGNETIC_FIELD_UNCALIBRATED].type = SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
+            continue;
+        }
+
         /* "temperature:<celsius>" */
         if (sscanf(buff, "temperature:%g", params+0) == 1) {
             new_sensors |= SENSORS_TEMPERATURE;
@@ -656,6 +685,19 @@
           .reserved   = {}
         },
 
+        { .name       = "Goldfish 3-axis Gyroscope",
+          .vendor     = "The Android Open Source Project",
+          .version    = 1,
+          .handle     = ID_GYROSCOPE,
+          .type       = SENSOR_TYPE_GYROSCOPE,
+          .maxRange   = 11.1111111,
+          .resolution = 1.0f/1000.0f,
+          .power      = 3.0f,
+          .minDelay   = 10000,
+          .maxDelay   = 60 * 1000 * 1000,
+          .reserved   = {}
+        },
+
         { .name       = "Goldfish 3-axis Magnetic field sensor",
           .vendor     = "The Android Open Source Project",
           .version    = 1,
@@ -780,7 +822,20 @@
           .requiredPermission = 0,
           .flags = SENSOR_FLAG_CONTINUOUS_MODE,
           .reserved   = {}
-        }
+        },
+
+        { .name       = "Goldfish 3-axis Magnetic field sensor (uncalibrated)",
+          .vendor     = "The Android Open Source Project",
+          .version    = 1,
+          .handle     = ID_MAGNETIC_FIELD_UNCALIBRATED,
+          .type       = SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+          .maxRange   = 2000.0f,
+          .resolution = 1.0f,
+          .power      = 6.7f,
+          .minDelay   = 10000,
+          .maxDelay   = 60 * 1000 * 1000,
+          .reserved   = {}
+        },
 };
 
 static struct sensor_t  sSensorList[MAX_NUM_SENSORS];