sensor_hub: Support Non-wake up FIFO

Bug: 16524956
Bug: 16822270
Change-Id: Ica4695cc6be346c3243e922f98befdd7d72b8bee
diff --git a/sensor_hub/libsensors/CwMcuSensor.cpp b/sensor_hub/libsensors/CwMcuSensor.cpp
index 109dbeb..71953a8 100644
--- a/sensor_hub/libsensors/CwMcuSensor.cpp
+++ b/sensor_hub/libsensors/CwMcuSensor.cpp
@@ -29,7 +29,6 @@
 #define LOG_TAG "CwMcuSensor"
 #include <cutils/log.h>
 #include <cutils/properties.h>
-#include <utils/BitSet.h>
 
 #include "CwMcuSensor.h"
 
@@ -254,7 +253,6 @@
     : SensorBase(NULL, "CwMcuSensor")
     , mEnabled(0)
     , mInputReader(IIO_MAX_BUFF_SIZE)
-    , mFlushSensorEnabled(-1)
     , offset_changed(true)
     , cpu_divided_by_mcu(0)
     , cpu_to_mcu_time_offset(0)
@@ -292,52 +290,103 @@
     mPendingEvents[CW_ROTATIONVECTOR].version = sizeof(sensors_event_t);
     mPendingEvents[CW_ROTATIONVECTOR].sensor = ID_RV;
     mPendingEvents[CW_ROTATIONVECTOR].type = SENSOR_TYPE_ROTATION_VECTOR;
-    mPendingEvents[CW_ROTATIONVECTOR].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_LINEARACCELERATION].version = sizeof(sensors_event_t);
     mPendingEvents[CW_LINEARACCELERATION].sensor = ID_LA;
     mPendingEvents[CW_LINEARACCELERATION].type = SENSOR_TYPE_LINEAR_ACCELERATION;
-    mPendingEvents[CW_LINEARACCELERATION].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_GRAVITY].version = sizeof(sensors_event_t);
     mPendingEvents[CW_GRAVITY].sensor = ID_G;
     mPendingEvents[CW_GRAVITY].type = SENSOR_TYPE_GRAVITY;
-    mPendingEvents[CW_GRAVITY].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_MAGNETIC_UNCALIBRATED].version = sizeof(sensors_event_t);
     mPendingEvents[CW_MAGNETIC_UNCALIBRATED].sensor = ID_CW_MAGNETIC_UNCALIBRATED;
     mPendingEvents[CW_MAGNETIC_UNCALIBRATED].type = SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
-    mPendingEvents[CW_MAGNETIC_UNCALIBRATED].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_GYROSCOPE_UNCALIBRATED].version = sizeof(sensors_event_t);
     mPendingEvents[CW_GYROSCOPE_UNCALIBRATED].sensor = ID_CW_GYROSCOPE_UNCALIBRATED;
     mPendingEvents[CW_GYROSCOPE_UNCALIBRATED].type = SENSOR_TYPE_GYROSCOPE_UNCALIBRATED;
-    mPendingEvents[CW_GYROSCOPE_UNCALIBRATED].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_GAME_ROTATION_VECTOR].version = sizeof(sensors_event_t);
     mPendingEvents[CW_GAME_ROTATION_VECTOR].sensor = ID_CW_GAME_ROTATION_VECTOR;
     mPendingEvents[CW_GAME_ROTATION_VECTOR].type = SENSOR_TYPE_GAME_ROTATION_VECTOR;
-    mPendingEvents[CW_GAME_ROTATION_VECTOR].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR].version = sizeof(sensors_event_t);
     mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR].sensor = ID_CW_GEOMAGNETIC_ROTATION_VECTOR;
     mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR].type = SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
-    mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_SIGNIFICANT_MOTION].version = sizeof(sensors_event_t);
     mPendingEvents[CW_SIGNIFICANT_MOTION].sensor = ID_CW_SIGNIFICANT_MOTION;
     mPendingEvents[CW_SIGNIFICANT_MOTION].type = SENSOR_TYPE_SIGNIFICANT_MOTION;
-    mPendingEvents[CW_SIGNIFICANT_MOTION].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_STEP_DETECTOR].version = sizeof(sensors_event_t);
     mPendingEvents[CW_STEP_DETECTOR].sensor = ID_CW_STEP_DETECTOR;
     mPendingEvents[CW_STEP_DETECTOR].type = SENSOR_TYPE_STEP_DETECTOR;
-    mPendingEvents[CW_STEP_DETECTOR].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
 
     mPendingEvents[CW_STEP_COUNTER].version = sizeof(sensors_event_t);
     mPendingEvents[CW_STEP_COUNTER].sensor = ID_CW_STEP_COUNTER;
     mPendingEvents[CW_STEP_COUNTER].type = SENSOR_TYPE_STEP_COUNTER;
 
+
+    mPendingEvents[CW_ACCELERATION_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_ACCELERATION_W].sensor = ID_A_W;
+    mPendingEvents[CW_ACCELERATION_W].type = SENSOR_TYPE_ACCELEROMETER;
+
+    mPendingEvents[CW_MAGNETIC_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_MAGNETIC_W].sensor = ID_M_W;
+    mPendingEvents[CW_MAGNETIC_W].type = SENSOR_TYPE_MAGNETIC_FIELD;
+
+    mPendingEvents[CW_GYRO_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_GYRO_W].sensor = ID_GY_W;
+    mPendingEvents[CW_GYRO_W].type = SENSOR_TYPE_GYROSCOPE;
+
+    mPendingEvents[CW_PRESSURE_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_PRESSURE_W].sensor = ID_PS_W;
+    mPendingEvents[CW_PRESSURE_W].type = SENSOR_TYPE_PRESSURE;
+    memset(mPendingEvents[CW_PRESSURE_W].data, 0, sizeof(mPendingEvents[CW_PRESSURE_W].data));
+
+    mPendingEvents[CW_ORIENTATION_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_ORIENTATION_W].sensor = ID_O_W;
+    mPendingEvents[CW_ORIENTATION_W].type = SENSOR_TYPE_ORIENTATION;
+    mPendingEvents[CW_ORIENTATION_W].orientation.status = SENSOR_STATUS_ACCURACY_HIGH;
+
+    mPendingEvents[CW_ROTATIONVECTOR_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_ROTATIONVECTOR_W].sensor = ID_RV_W;
+    mPendingEvents[CW_ROTATIONVECTOR_W].type = SENSOR_TYPE_ROTATION_VECTOR;
+
+    mPendingEvents[CW_LINEARACCELERATION_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_LINEARACCELERATION_W].sensor = ID_LA_W;
+    mPendingEvents[CW_LINEARACCELERATION_W].type = SENSOR_TYPE_LINEAR_ACCELERATION;
+
+    mPendingEvents[CW_GRAVITY_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_GRAVITY_W].sensor = ID_G_W;
+    mPendingEvents[CW_GRAVITY_W].type = SENSOR_TYPE_GRAVITY;
+
+    mPendingEvents[CW_MAGNETIC_UNCALIBRATED_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_MAGNETIC_UNCALIBRATED_W].sensor = ID_CW_MAGNETIC_UNCALIBRATED_W;
+    mPendingEvents[CW_MAGNETIC_UNCALIBRATED_W].type = SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
+
+    mPendingEvents[CW_GYROSCOPE_UNCALIBRATED_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_GYROSCOPE_UNCALIBRATED_W].sensor = ID_CW_GYROSCOPE_UNCALIBRATED_W;
+    mPendingEvents[CW_GYROSCOPE_UNCALIBRATED_W].type = SENSOR_TYPE_GYROSCOPE_UNCALIBRATED;
+
+    mPendingEvents[CW_GAME_ROTATION_VECTOR_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_GAME_ROTATION_VECTOR_W].sensor = ID_CW_GAME_ROTATION_VECTOR_W;
+    mPendingEvents[CW_GAME_ROTATION_VECTOR_W].type = SENSOR_TYPE_GAME_ROTATION_VECTOR;
+
+    mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR_W].sensor = ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W;
+    mPendingEvents[CW_GEOMAGNETIC_ROTATION_VECTOR_W].type = SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
+
+    mPendingEvents[CW_STEP_DETECTOR_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_STEP_DETECTOR_W].sensor = ID_CW_STEP_DETECTOR_W;
+    mPendingEvents[CW_STEP_DETECTOR_W].type = SENSOR_TYPE_STEP_DETECTOR;
+
+    mPendingEvents[CW_STEP_COUNTER_W].version = sizeof(sensors_event_t);
+    mPendingEvents[CW_STEP_COUNTER_W].sensor = ID_CW_STEP_COUNTER_W;
+    mPendingEvents[CW_STEP_COUNTER_W].type = SENSOR_TYPE_STEP_COUNTER;
+
+
     mPendingEventsFlush.version = META_DATA_VERSION;
     mPendingEventsFlush.sensor = 0;
     mPendingEventsFlush.type = SENSOR_TYPE_META_DATA;
@@ -453,7 +502,7 @@
 }
 
 CwMcuSensor::~CwMcuSensor() {
-    if (mEnabled) {
+    if (!mEnabled.isEmpty()) {
         setEnable(0, 0);
     }
 }
@@ -506,63 +555,157 @@
         return ID_CW_STEP_DETECTOR;
     case CW_STEP_COUNTER:
         return ID_CW_STEP_COUNTER;
+    case CW_ACCELERATION_W:
+        return ID_A_W;
+    case CW_MAGNETIC_W:
+        return ID_M_W;
+    case CW_GYRO_W:
+        return ID_GY_W;
+    case CW_PRESSURE_W:
+        return ID_PS_W;
+    case CW_ORIENTATION_W:
+        return ID_O_W;
+    case CW_ROTATIONVECTOR_W:
+        return ID_RV_W;
+    case CW_LINEARACCELERATION_W:
+        return ID_LA_W;
+    case CW_GRAVITY_W:
+        return ID_G_W;
+    case CW_MAGNETIC_UNCALIBRATED_W:
+        return ID_CW_MAGNETIC_UNCALIBRATED_W;
+    case CW_GYROSCOPE_UNCALIBRATED_W:
+        return ID_CW_GYROSCOPE_UNCALIBRATED_W;
+    case CW_GAME_ROTATION_VECTOR_W:
+        return ID_CW_GAME_ROTATION_VECTOR_W;
+    case CW_GEOMAGNETIC_ROTATION_VECTOR_W:
+        return ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W;
+    case CW_STEP_DETECTOR_W:
+        return ID_CW_STEP_DETECTOR_W;
+    case CW_STEP_COUNTER_W:
+        return ID_CW_STEP_COUNTER_W;
     default:
         return 0xFF;
     }
 }
 
+bool CwMcuSensor::is_batch_wake_sensor(int32_t handle) {
+    switch (handle) {
+    case ID_A_W:
+    case ID_M_W:
+    case ID_GY_W:
+    case ID_PS_W:
+    case ID_O_W:
+    case ID_RV_W:
+    case ID_LA_W:
+    case ID_G_W:
+    case ID_CW_MAGNETIC_UNCALIBRATED_W:
+    case ID_CW_GYROSCOPE_UNCALIBRATED_W:
+    case ID_CW_GAME_ROTATION_VECTOR_W:
+    case ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W:
+    case ID_CW_STEP_DETECTOR_W:
+    case ID_CW_STEP_COUNTER_W:
+        return true;
+    default:
+        return false;
+    }
+}
+
 int CwMcuSensor::find_sensor(int32_t handle) {
     int what = -1;
+
     switch (handle) {
     case ID_A:
         what = CW_ACCELERATION;
         break;
+    case ID_A_W:
+        what = CW_ACCELERATION_W;
+        break;
     case ID_M:
         what = CW_MAGNETIC;
         break;
+    case ID_M_W:
+        what = CW_MAGNETIC_W;
+        break;
     case ID_GY:
         what = CW_GYRO;
         break;
+    case ID_GY_W:
+        what = CW_GYRO_W;
+        break;
     case ID_PS:
         what = CW_PRESSURE;
         break;
+    case ID_PS_W:
+        what = CW_PRESSURE_W;
+        break;
     case ID_O:
         what = CW_ORIENTATION;
         break;
+    case ID_O_W:
+        what = CW_ORIENTATION_W;
+        break;
     case ID_RV:
         what = CW_ROTATIONVECTOR;
         break;
+    case ID_RV_W:
+        what = CW_ROTATIONVECTOR_W;
+        break;
     case ID_LA:
         what = CW_LINEARACCELERATION;
         break;
+    case ID_LA_W:
+        what = CW_LINEARACCELERATION_W;
+        break;
     case ID_G:
         what = CW_GRAVITY;
         break;
+    case ID_G_W:
+        what = CW_GRAVITY_W;
+        break;
     case ID_CW_MAGNETIC_UNCALIBRATED:
         what = CW_MAGNETIC_UNCALIBRATED;
         break;
+    case ID_CW_MAGNETIC_UNCALIBRATED_W:
+        what = CW_MAGNETIC_UNCALIBRATED_W;
+        break;
     case ID_CW_GYROSCOPE_UNCALIBRATED:
         what = CW_GYROSCOPE_UNCALIBRATED;
         break;
+    case ID_CW_GYROSCOPE_UNCALIBRATED_W:
+        what = CW_GYROSCOPE_UNCALIBRATED_W;
+        break;
     case ID_CW_GAME_ROTATION_VECTOR:
         what = CW_GAME_ROTATION_VECTOR;
         break;
+    case ID_CW_GAME_ROTATION_VECTOR_W:
+        what = CW_GAME_ROTATION_VECTOR_W;
+        break;
     case ID_CW_GEOMAGNETIC_ROTATION_VECTOR:
         what = CW_GEOMAGNETIC_ROTATION_VECTOR;
         break;
+    case ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W:
+        what = CW_GEOMAGNETIC_ROTATION_VECTOR_W;
+        break;
     case ID_CW_SIGNIFICANT_MOTION:
         what = CW_SIGNIFICANT_MOTION;
         break;
     case ID_CW_STEP_DETECTOR:
         what = CW_STEP_DETECTOR;
         break;
+    case ID_CW_STEP_DETECTOR_W:
+        what = CW_STEP_DETECTOR_W;
+        break;
     case ID_CW_STEP_COUNTER:
         what = CW_STEP_COUNTER;
         break;
+    case ID_CW_STEP_COUNTER_W:
+        what = CW_STEP_COUNTER_W;
+        break;
     case ID_L:
         what = CW_LIGHT;
         break;
     }
+
     return what;
 }
 
@@ -592,23 +735,20 @@
 
     property_get("debug.sensorhal.fill.block", value, "0");
     ALOGV("CwMcuSensor::setEnable: debug.sensorhal.fill.block= %s", value);
-    if (atoi(value) == 1) {
-        fill_block_debug = 1;
-    } else {
-        fill_block_debug = 0;
-    }
+    fill_block_debug = atoi(value) == 1;
 
     what = find_sensor(handle);
 
-    ALOGD("setEnable: "
-          "[v06-Correct Range, rate, resolution parameters, and Batched Step counter/detector]"
-          " handle = %d, en = %d, what = %d\n",
+    ALOGD("CwMcuSensor::setEnable: "
+          "[v07-Support Non-wake up FIFO] handle = %d, en = %d, what = %d\n",
           handle, en, what);
 
     if (uint32_t(what) >= numSensors) {
         pthread_mutex_unlock(&sys_fs_mutex);
         return -EINVAL;
     }
+
+
     strcpy(&fixed_sysfs_path[fixed_sysfs_path_len], "enable");
     fd = open(fixed_sysfs_path, O_RDWR);
     if (fd >= 0) {
@@ -620,10 +760,13 @@
 
         close(fd);
 
-        mEnabled &= ~(1<<what);
-        mEnabled |= (uint32_t(flags)<<what);
+        if (flags) {
+            mEnabled.markBit(what);
+        } else {
+            mEnabled.clearBit(what);
+        }
 
-        if (!mEnabled) {
+        if (mEnabled.isEmpty()) {
             if (sysfs_set_input_attr_by_int("buffer/enable", 0) < 0) {
                 ALOGE("CwMcuSensor::setEnable: set buffer disable failed: %s\n", strerror(errno));
             } else {
@@ -634,11 +777,12 @@
         ALOGE("%s open failed: %s", __func__, strerror(errno));
     }
 
+
     // Sensor Calibration init. Waiting for firmware ready
-    if (((what == CW_MAGNETIC) && (flags == 0)) ||
-            ((what == CW_ORIENTATION) && (flags == 0)) ||
-            ((what == CW_ROTATIONVECTOR) && (flags == 0))
-       ) {
+    if (!flags &&
+            ((what == CW_MAGNETIC) ||
+             (what == CW_ORIENTATION) ||
+             (what == CW_ROTATIONVECTOR))) {
         ALOGV("Save Compass calibration data");
         strcpy(&fixed_sysfs_path[fixed_sysfs_path_len], "calibrator_data_mag");
         rc = cw_read_calibrator_file(CW_MAGNETIC, fixed_sysfs_path, temp_data);
@@ -678,9 +822,11 @@
         return -EINVAL;
     }
 
-    if (flags == SENSORS_BATCH_WAKE_UPON_FIFO_FULL) {
-        ALOGV("CwMcuSensor::batch: SENSORS_BATCH_WAKE_UPON_FIFO_FULL~!!\n");
-    }
+    if(is_batch_wake_sensor(handle)) {
+        flags |= SENSORS_BATCH_WAKE_UPON_FIFO_FULL;
+        ALOGD("CwMcuSensor::batch: SENSORS_BATCH_WAKE_UPON_FIFO_FULL~!!\n");
+    } else
+        flags &= ~SENSORS_BATCH_WAKE_UPON_FIFO_FULL;
 
     switch (what) {
     case CW_LIGHT:
@@ -703,7 +849,7 @@
     pthread_mutex_lock(&sys_fs_mutex);
     ALOGV("%s: Acquired pthread_mutex_lock()\n", __func__);
 
-    if (!mEnabled) {
+    if (mEnabled.isEmpty()) {
         if (sysfs_set_input_attr_by_int("buffer/length", IIO_MAX_BUFF_SIZE) < 0) {
             ALOGE("CwMcuSensor::batch: set IIO buffer length failed: %s\n", strerror(errno));
         } else {
@@ -761,7 +907,6 @@
     int err;
 
     what = find_sensor(handle);
-    mFlushSensorEnabled = handle;
 
     if (uint32_t(what) >= CW_SENSORS_ID_END) {
         return -EINVAL;
@@ -789,14 +934,14 @@
     }
 
     pthread_mutex_unlock(&sys_fs_mutex);
-    ALOGV("CwMcuSensor::flush: fd = %d, sensors_id = %d, path = %s, err = %d\n",
+    ALOGI("CwMcuSensor::flush: fd = %d, sensors_id = %d, path = %s, err = %d\n",
           fd, what, fixed_sysfs_path, err);
     return err;
 }
 
 
 bool CwMcuSensor::hasPendingEvents() const {
-    return mPendingMask;
+    return !mPendingMask.isEmpty();
 }
 
 int CwMcuSensor::setDelay(int32_t handle, int64_t delay_ns) {
@@ -835,6 +980,9 @@
     case CW_ROTATIONVECTOR:
     case CW_GAME_ROTATION_VECTOR:
     case CW_GEOMAGNETIC_ROTATION_VECTOR:
+    case CW_ROTATIONVECTOR_W:
+    case CW_GAME_ROTATION_VECTOR_W:
+    case CW_GEOMAGNETIC_ROTATION_VECTOR_W:
         float q0, q1, q2, q3;
 
         q1 = mPendingEvents[sensors_id].data[0];
@@ -941,7 +1089,7 @@
 
             mPendingEvents[id].timestamp = event_cpu_time;
 
-            if (mEnabled & (1<<id)) {
+            if (mEnabled.hasBit(id)) {
                 if (id == CW_SIGNIFICANT_MOTION) {
                     setEnable(ID_CW_SIGNIFICANT_MOTION, 0);
                 }
@@ -973,8 +1121,9 @@
 
     switch (sensorsid) {
     case CW_ORIENTATION:
-        mPendingMask |= 1<<sensorsid;
-        if (sensorsid == CW_ORIENTATION) {
+    case CW_ORIENTATION_W:
+        mPendingMask.markBit(sensorsid);
+        if ((sensorsid == CW_ORIENTATION) || (sensorsid == CW_ORIENTATION_W)) {
             mPendingEvents[sensorsid].orientation.status = bias[0];
         }
         mPendingEvents[sensorsid].data[0] = (float)data[0] * CONVERT_10;
@@ -986,17 +1135,24 @@
     case CW_GYRO:
     case CW_LINEARACCELERATION:
     case CW_GRAVITY:
-        mPendingMask |= 1<<sensorsid;
-        if (sensorsid == CW_MAGNETIC) {
+    case CW_ACCELERATION_W:
+    case CW_MAGNETIC_W:
+    case CW_GYRO_W:
+    case CW_LINEARACCELERATION_W:
+    case CW_GRAVITY_W:
+        mPendingMask.markBit(sensorsid);
+        if ((sensorsid == CW_MAGNETIC) || (sensorsid == CW_MAGNETIC_W)) {
             mPendingEvents[sensorsid].magnetic.status = bias[0];
-            ALOGV("CwMcuSensor::processEvent: magnetic accuracy = %d\n", mPendingEvents[sensorsid].magnetic.status);
+            ALOGV("CwMcuSensor::processEvent: magnetic accuracy = %d\n",
+                  mPendingEvents[sensorsid].magnetic.status);
         }
         mPendingEvents[sensorsid].data[0] = (float)data[0] * CONVERT_100;
         mPendingEvents[sensorsid].data[1] = (float)data[1] * CONVERT_100;
         mPendingEvents[sensorsid].data[2] = (float)data[2] * CONVERT_100;
         break;
     case CW_PRESSURE:
-        mPendingMask |= 1<<sensorsid;
+    case CW_PRESSURE_W:
+        mPendingMask.markBit(sensorsid);
         // .pressure is data[0] and the unit is hectopascal (hPa)
         mPendingEvents[sensorsid].pressure = ((float)*(int32_t *)(&data[0])) * CONVERT_100;
         // data[1] is not used, and data[2] is the temperature
@@ -1005,14 +1161,19 @@
     case CW_ROTATIONVECTOR:
     case CW_GAME_ROTATION_VECTOR:
     case CW_GEOMAGNETIC_ROTATION_VECTOR:
-        mPendingMask |= 1<<sensorsid;
+    case CW_ROTATIONVECTOR_W:
+    case CW_GAME_ROTATION_VECTOR_W:
+    case CW_GEOMAGNETIC_ROTATION_VECTOR_W:
+        mPendingMask.markBit(sensorsid);
         mPendingEvents[sensorsid].data[0] = (float)data[0] * CONVERT_10000;
         mPendingEvents[sensorsid].data[1] = (float)data[1] * CONVERT_10000;
         mPendingEvents[sensorsid].data[2] = (float)data[2] * CONVERT_10000;
         break;
     case CW_MAGNETIC_UNCALIBRATED:
     case CW_GYROSCOPE_UNCALIBRATED:
-        mPendingMask |= 1<<sensorsid;
+    case CW_MAGNETIC_UNCALIBRATED_W:
+    case CW_GYROSCOPE_UNCALIBRATED_W:
+        mPendingMask.markBit(sensorsid);
         mPendingEvents[sensorsid].data[0] = (float)data[0] * CONVERT_100;
         mPendingEvents[sensorsid].data[1] = (float)data[1] * CONVERT_100;
         mPendingEvents[sensorsid].data[2] = (float)data[2] * CONVERT_100;
@@ -1021,29 +1182,34 @@
         mPendingEvents[sensorsid].data[5] = (float)bias[2] * CONVERT_100;
         break;
     case CW_SIGNIFICANT_MOTION:
-        mPendingMask |= 1<<(sensorsid);
+        mPendingMask.markBit(sensorsid);
         mPendingEvents[sensorsid].data[0] = 1.0;
         mPendingEvents[sensorsid].timestamp = getTimestamp();
         ALOGV("sensors_id = %d, data = %p", sensorsid, data);
         break;
     case CW_LIGHT:
-        mPendingMask |= 1<<(sensorsid);
+        mPendingMask.markBit(sensorsid);
         mPendingEvents[sensorsid].light = indexToValue(data[0]);
         break;
     case CW_STEP_DETECTOR:
-        mPendingMask |= 1<<(sensorsid);
+    case CW_STEP_DETECTOR_W:
+        mPendingMask.markBit(sensorsid);
         mPendingEvents[sensorsid].data[0] = data[0];
         mPendingEvents[sensorsid].timestamp = getTimestamp();
         break;
     case CW_STEP_COUNTER:
-        mPendingMask |= 1<<(sensorsid);
-        mPendingEvents[sensorsid].u64.step_counter = *(uint32_t *)&data[0]; // We use 4 bytes in SensorHUB
-        ALOGV("processEvent: step counter = %" PRId64 "\n", mPendingEvents[sensorsid].u64.step_counter);
+    case CW_STEP_COUNTER_W:
+        mPendingMask.markBit(sensorsid);
+        // We use 4 bytes in SensorHUB
+        mPendingEvents[sensorsid].u64.step_counter = *(uint32_t *)&data[0];
+        ALOGV("processEvent: step counter = %" PRId64 "\n",
+              mPendingEvents[sensorsid].u64.step_counter);
         break;
     case CW_META_DATA:
         mPendingEventsFlush.meta_data.what = META_DATA_FLUSH_COMPLETE;
         mPendingEventsFlush.meta_data.sensor = find_handle(data[0]);
-        ALOGV("CW_META_DATA: meta_data.sensor = %d\n", mPendingEventsFlush.meta_data.sensor);
+        ALOGV("CW_META_DATA: meta_data.sensor = %d, data[0] = %d\n",
+              mPendingEventsFlush.meta_data.sensor, data[0]);
         break;
     default:
         ALOGW("%s: Unknown sensorsid = %d\n", __func__, sensorsid);
diff --git a/sensor_hub/libsensors/CwMcuSensor.h b/sensor_hub/libsensors/CwMcuSensor.h
index 2521864..8deb8b4 100644
--- a/sensor_hub/libsensors/CwMcuSensor.h
+++ b/sensor_hub/libsensors/CwMcuSensor.h
@@ -21,6 +21,7 @@
 #include <stdint.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
+#include <utils/BitSet.h>
 
 #include "InputEventReader.h"
 #include "sensors.h"
@@ -47,12 +48,28 @@
     CW_STEP_DETECTOR               = 21,
     CW_STEP_COUNTER                = 22,
     HTC_ANY_MOTION                 = 28,
-    CW_SENSORS_ID_END, // Be careful, do not exceed 31
-    TIME_DIFF_EXHAUSTED            = 97,
-    CW_TIME_BASE                   = 98,
-    CW_META_DATA                   = 99,
-    CW_MAGNETIC_UNCALIBRATED_BIAS  = 100,
-    CW_GYROSCOPE_UNCALIBRATED_BIAS = 101
+    //Above are Firmware supported sensors,
+    CW_ACCELERATION_W                = 32,
+    CW_MAGNETIC_W                    = 33,
+    CW_GYRO_W                        = 34,
+    CW_PRESSURE_W                    = 37,
+    CW_ORIENTATION_W                 = 38,
+    CW_ROTATIONVECTOR_W              = 39,
+    CW_LINEARACCELERATION_W          = 40,
+    CW_GRAVITY_W                     = 41,
+    HTC_WAKE_UP_GESTURE_W            = 42,
+    CW_MAGNETIC_UNCALIBRATED_W       = 48,
+    CW_GYROSCOPE_UNCALIBRATED_W      = 49,
+    CW_GAME_ROTATION_VECTOR_W        = 50,
+    CW_GEOMAGNETIC_ROTATION_VECTOR_W = 51,
+    CW_STEP_DETECTOR_W               = 53,
+    CW_STEP_COUNTER_W                = 54,
+    CW_SENSORS_ID_END,
+    TIME_DIFF_EXHAUSTED              = 97,
+    CW_TIME_BASE                     = 98,
+    CW_META_DATA                     = 99,
+    CW_MAGNETIC_UNCALIBRATED_BIAS    = 100,
+    CW_GYROSCOPE_UNCALIBRATED_BIAS   = 101
 } CW_SENSORS_ID;
 
 #define        SAVE_PATH_ACC                                "/data/misc/AccOffset.txt"
@@ -65,16 +82,15 @@
 
 #define TIMESTAMP_SYNC_CODE        (98)
 
-#define PERIODIC_SYNC_TIME_SEC     (1)
+#define PERIODIC_SYNC_TIME_SEC     (30)
 
 class CwMcuSensor : public SensorBase {
 
-        uint32_t mEnabled;
+        android::BitSet64 mEnabled;
         InputEventCircularReader mInputReader;
         sensors_event_t mPendingEvents[numSensors];
         sensors_event_t mPendingEventsFlush;
-        uint32_t mFlushSensorEnabled;
-        uint32_t mPendingMask;
+        android::BitSet64 mPendingMask;
         char fixed_sysfs_path[PATH_MAX];
         int fixed_sysfs_path_len;
 
@@ -107,6 +123,7 @@
         virtual int getEnable(int32_t handle);
         virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
         virtual int flush(int handle);
+        bool is_batch_wake_sensor(int32_t handle);
         int find_sensor(int32_t handle);
         int find_handle(int32_t sensors_id);
         void cw_save_calibrator_file(int type, const char * path, int* str);
diff --git a/sensor_hub/libsensors/sensors.cpp b/sensor_hub/libsensors/sensors.cpp
index f4ea40f..09fda1a 100644
--- a/sensor_hub/libsensors/sensors.cpp
+++ b/sensor_hub/libsensors/sensors.cpp
@@ -51,7 +51,7 @@
          .power =      0.17f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -68,7 +68,7 @@
          .power =      5.0f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -85,7 +85,7 @@
          .power =      6.1f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -119,7 +119,7 @@
          .power =      0.0027f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -136,7 +136,7 @@
          .power =      11.27f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -153,7 +153,7 @@
          .power =      11.27f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -170,7 +170,7 @@
          .power =      11.27f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -187,7 +187,7 @@
          .power =      11.27f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -204,7 +204,7 @@
          .power =      5.0f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =    610,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -221,7 +221,7 @@
          .power =      6.1f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =    610,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -238,7 +238,7 @@
          .power =      11.27f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -255,7 +255,7 @@
          .power =      11.27f,
          .minDelay =   10000,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =      200000,
@@ -289,7 +289,7 @@
          .power =      0.17f,
          .minDelay =   0,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =           0,
@@ -306,13 +306,253 @@
          .power =      0.17f,
          .minDelay =   0,
          .fifoReservedEventCount = 0,
-         .fifoMaxEventCount =   2480,
+         .fifoMaxEventCount =   1220,
          .stringType =         0,
          .requiredPermission = 0,
          .maxDelay =           0,
          .flags = SENSOR_FLAG_ON_CHANGE_MODE,
          .reserved =          {}
         },
+
+
+        {.name =       "Accelerometer Sensor (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_A_W,
+         .type =       SENSOR_TYPE_ACCELEROMETER,
+         .maxRange =   RANGE_A,
+         .resolution = CONVERT_A,
+         .power =      0.17f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Magnetic field Sensor (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_M_W,
+         .type =       SENSOR_TYPE_MAGNETIC_FIELD,
+         .maxRange =   200.0f,
+         .resolution = CONVERT_M,
+         .power =      5.0f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Gyroscope Sensor (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_GY_W,
+         .type =       SENSOR_TYPE_GYROSCOPE,
+         .maxRange =   2000.0f,
+         .resolution = CONVERT_GYRO,
+         .power =      6.1f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Pressure Sensor (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_PS_W,
+         .type =       SENSOR_TYPE_PRESSURE,
+         .maxRange =   2000,
+         .resolution = 1.0f,
+         .power =      0.0027f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "CWGD Orientation Sensor (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_O_W,
+         .type =       SENSOR_TYPE_ORIENTATION,
+         .maxRange =   360.0f,
+         .resolution = 0.1f,
+         .power =      11.27f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Rotation Vector (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_RV_W,
+         .type =       SENSOR_TYPE_ROTATION_VECTOR,
+         .maxRange =   1.0f,
+         .resolution = 0.0001f,
+         .power =      11.27f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Linear Acceleration (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_LA_W,
+         .type =       SENSOR_TYPE_LINEAR_ACCELERATION,
+         .maxRange =   RANGE_A,
+         .resolution = 0.01,
+         .power =      11.27f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Gravity (WAKE_UP)",
+         .vendor =     "HTC Group Ltd.",
+         .version =    1,
+         .handle =     ID_G_W,
+         .type =       SENSOR_TYPE_GRAVITY,
+         .maxRange =   GRAVITY_EARTH,
+         .resolution = 0.01,
+         .power =      11.27f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Magnetic Uncalibrated (WAKE_UP)",
+         .vendor =     "hTC Corp.",
+         .version =    1,
+         .handle =     ID_CW_MAGNETIC_UNCALIBRATED_W,
+         .type =       SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+         .maxRange =   200.0f,
+         .resolution = CONVERT_M,
+         .power =      5.0f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =    610,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Gyroscope Uncalibrated (WAKE_UP)",
+         .vendor =     "hTC Corp.",
+         .version =    1,
+         .handle =     ID_CW_GYROSCOPE_UNCALIBRATED_W,
+         .type =       SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
+         .maxRange =   2000.0f,
+         .resolution = CONVERT_GYRO,
+         .power =      6.1f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =    610,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Game Rotation Vector (WAKE_UP)",
+         .vendor =     "hTC Corp.",
+         .version =    1,
+         .handle =     ID_CW_GAME_ROTATION_VECTOR_W,
+         .type =       SENSOR_TYPE_GAME_ROTATION_VECTOR,
+         .maxRange =   1.0f,
+         .resolution = 0.0001f,
+         .power =      11.27f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Geomagnetic Rotation Vector (WAKE_UP)",
+         .vendor =     "hTC Corp.",
+         .version =    1,
+         .handle =     ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W,
+         .type =       SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
+         .maxRange =   1.0f,
+         .resolution = 0.0001f,
+         .power =      11.27f,
+         .minDelay =   10000,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =      200000,
+         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Step Detector (WAKE_UP)",
+         .vendor =     "hTC Corp.",
+         .version =    1,
+         .handle =     ID_CW_STEP_DETECTOR_W,
+         .type =       SENSOR_TYPE_STEP_DETECTOR,
+         .maxRange =   200.0f,
+         .resolution = 1.0f,
+         .power =      0.17f,
+         .minDelay =   0,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =           0,
+         .flags = SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
+        {.name =       "Step Counter (WAKE_UP)",
+         .vendor =     "hTC Corp.",
+         .version =    1,
+         .handle =     ID_CW_STEP_COUNTER_W,
+         .type =       SENSOR_TYPE_STEP_COUNTER,
+         .maxRange =   200.0f,
+         .resolution = 1.0f,
+         .power =      0.17f,
+         .minDelay =   0,
+         .fifoReservedEventCount = 0,
+         .fifoMaxEventCount =   1220,
+         .stringType =         0,
+         .requiredPermission = 0,
+         .maxDelay =           0,
+         .flags = SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP,
+         .reserved =          {}
+        },
 };
 
 static int open_sensors(const struct hw_module_t* module, const char* id,
@@ -386,6 +626,20 @@
                 case ID_CW_SIGNIFICANT_MOTION:
                 case ID_CW_STEP_DETECTOR:
                 case ID_CW_STEP_COUNTER:
+                case ID_A_W:
+                case ID_M_W:
+                case ID_GY_W:
+                case ID_PS_W:
+                case ID_O_W:
+                case ID_RV_W:
+                case ID_LA_W:
+                case ID_G_W:
+                case ID_CW_MAGNETIC_UNCALIBRATED_W:
+                case ID_CW_GYROSCOPE_UNCALIBRATED_W:
+                case ID_CW_GAME_ROTATION_VECTOR_W:
+                case ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W:
+                case ID_CW_STEP_DETECTOR_W:
+                case ID_CW_STEP_COUNTER_W:
                         return cwmcu;
         }
         return -EINVAL;
@@ -562,7 +816,7 @@
     memset(&dev->device, 0, sizeof(sensors_poll_device_1_t));
 
     dev->device.common.tag = HARDWARE_DEVICE_TAG;
-    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_1;
+    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_3;
     dev->device.common.module   = const_cast<hw_module_t*>(module);
     dev->device.common.close    = poll__close;
     dev->device.activate        = poll__activate;
diff --git a/sensor_hub/libsensors/sensors.h b/sensor_hub/libsensors/sensors.h
index b0a538b..e1a40b5 100644
--- a/sensor_hub/libsensors/sensors.h
+++ b/sensor_hub/libsensors/sensors.h
@@ -51,6 +51,20 @@
 #define ID_CW_STEP_DETECTOR                        14//CW_STEP_DETECTOR
 #define ID_CW_STEP_COUNTER                         15//CW_STEP_COUNTER
 
+#define ID_A_W                                     16//CW_ACCELERATION_WAKE_UP
+#define ID_M_W                                     17//CW_MAGNETIC_WAKE_UP
+#define ID_GY_W                                    18//CW_GYRO_WAKE_UP
+#define ID_PS_W                                    19//CW_PRESSURE_WAKE_UP
+#define ID_O_W                                     20//CW_ORIENTATION_WAKE_UP
+#define ID_RV_W                                    21//CW_ROTATIONVECTOR_WAKE_UP
+#define ID_LA_W                                    22//CW_LINEARACCELERATION_WAKE_UP
+#define ID_G_W                                     23//CW_GRAVITY_WAKE_UP
+#define ID_CW_MAGNETIC_UNCALIBRATED_W              24//CW_MAGNETIC_UNCALIBRATED_WAKE_UP
+#define ID_CW_GYROSCOPE_UNCALIBRATED_W             25//CW_GYROSCOPE_UNCALIBRATED_WAKE_UP
+#define ID_CW_GAME_ROTATION_VECTOR_W               26//CW_GAME_ROTATION_VECTOR_WAKE_UP
+#define ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W        27//CW_GEOMAGNETIC_ROTATION_VECTOR_WAKE_UP
+#define ID_CW_STEP_DETECTOR_W                      28//CW_STEP_DETECTOR_WAKE_UP
+#define ID_CW_STEP_COUNTER_W                       29//CW_STEP_COUNTER_WAKE_UP
 /*****************************************************************************/
 
 // The SENSORS Module