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