sensorhal: adds separate sensor lists for devices

This change adds support for a different sensor list depending
on the type of device.

Bug: 27943736
Change-Id: Id8c30b9b72084576d11546a663de7327fb29d76f
This commit is contained in:
Andrew Rossignol
2016-03-31 15:11:05 -07:00
parent c093c2a16d
commit d82bf31ea8
9 changed files with 1547 additions and 523 deletions

View File

@@ -18,9 +18,9 @@
// #defined LOG_NDEBUG 1
#include <utils/Log.h>
#include "sensors.h"
#include "hubconnection.h"
#include "sensorlist.h"
#include "sensors.h"
#include <errno.h>
#include <math.h>
@@ -29,485 +29,6 @@
using namespace android;
static const int kVersion = 1;
static const float kMinSampleRateHzAccel = 6.250f;
static const float kMaxSampleRateHzAccel = 400.0f;
static const float kMinSampleRateHzGyro = 6.250f;
static const float kMaxSampleRateHzGyro = 400.0f;
static const float kMinSampleRateHzMag = 3.125f;
static const float kMaxSampleRateHzMag = 50.0f;
static const float kMinSampleRateHzPolling = 0.1f;
static const float kMaxSampleRateHzPolling = 25.0f;
static const float kMinSampleRateHzPressure = 0.1f;
static const float kMaxSampleRateHzPressure = 10.0f;
static const float kMinSampleRateHzTemperature = kMinSampleRateHzPolling;
static const float kMaxSampleRateHzTemperature = kMaxSampleRateHzPolling;
static const float kMinSampleRateHzProximity = kMinSampleRateHzPolling;
static const float kMaxSampleRateHzProximity = 5.0;
static const float kMinSampleRateHzLight = kMinSampleRateHzPolling;
static const float kMaxSampleRateHzLight = 5.0;
static const float kMinSampleRateHzOrientation = 12.5f;
static const float kMaxSampleRateHzOrientation = 200.0f;
static const int kMaxOneAxisEventCount = 9000;
static const int kMaxThreeAxisEventCount = 4500;
static const char SENSOR_STRING_TYPE_INTERNAL_TEMPERATURE[] =
"com.google.sensor.internal_temperature";
static const char SENSOR_STRING_TYPE_SYNC[] =
"com.google.sensor.sync";
static const char SENSOR_STRING_TYPE_DOUBLE_TWIST[] =
"com.google.sensor.double_twist";
static const char SENSOR_STRING_TYPE_DOUBLE_TAP[] =
"com.google.sensor.double_tap";
static struct sensor_t kSensorList[] = {
{
// MUST BE THE FIRST ENTRY! The name/vendor will be patched once we
// get feedback from the hub on which part is installed.
"Unknown Proximity Sensor",
"Unknown",
kVersion,
COMMS_SENSOR_PROXIMITY,
SENSOR_TYPE_PROXIMITY,
5.0f, // maxRange (cm)
1.0f, // resolution (cm)
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzProximity), // minDelay
300, // XXX fifoReservedEventCount
kMaxOneAxisEventCount, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_PROXIMITY,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzProximity), // maxDelay
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE,
{ NULL, NULL }
},
{
"Unknown Light Sensor",
"Unknown",
kVersion,
COMMS_SENSOR_LIGHT,
SENSOR_TYPE_LIGHT,
43000.0f, // maxRange (lx)
10.0f, // XXX resolution (lx)
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzLight), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_LIGHT,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzLight), // maxDelay
SENSOR_FLAG_ON_CHANGE_MODE,
{ NULL, NULL }
},
{
"BMI160 accelerometer",
"Bosch",
kVersion,
COMMS_SENSOR_ACCEL,
SENSOR_TYPE_ACCELEROMETER,
GRAVITY_EARTH * 8.0f, // maxRange
GRAVITY_EARTH * 8.0f / 32768.0f, // resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzAccel), // minDelay
3000, // XXX fifoReservedEventCount
kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_ACCELEROMETER,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzAccel), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMI160 gyroscope",
"Bosch",
kVersion,
COMMS_SENSOR_GYRO,
SENSOR_TYPE_GYROSCOPE,
2000.0f * M_PI / 180.0f, // maxRange
2000.0f * M_PI / (180.0f * 32768.0f), // resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzGyro), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_GYROSCOPE,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzGyro), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMI160 gyroscope (uncalibrated)",
"Bosch",
kVersion,
COMMS_SENSOR_GYRO_UNCALIBRATED,
SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
2000.0f * M_PI / 180.0f, // maxRange
2000.0f * M_PI / (180.0f * 32768.0f), // resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzGyro), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzGyro), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMM150 magnetometer",
"Bosch",
kVersion,
COMMS_SENSOR_MAG,
SENSOR_TYPE_MAGNETIC_FIELD,
1300.0f, // XXX maxRange
0.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzMag), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_MAGNETIC_FIELD,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzMag), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMM150 magnetometer (uncalibrated)",
"Bosch",
kVersion,
COMMS_SENSOR_MAG_UNCALIBRATED,
SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
1300.0f, // XXX maxRange
0.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzMag), // minDelay
600, // XXX fifoReservedEventCount
kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzMag), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMP280 pressure",
"Bosch",
kVersion,
COMMS_SENSOR_PRESSURE,
SENSOR_TYPE_PRESSURE,
1100.0f, // maxRange (hPa)
0.005f, // resolution (hPa)
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzPressure), // minDelay
300, // XXX fifoReservedEventCount
kMaxOneAxisEventCount, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_PRESSURE,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzPressure), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMP280 temperature",
"Bosch",
kVersion,
COMMS_SENSOR_TEMPERATURE,
SENSOR_TYPE_INTERNAL_TEMPERATURE,
85.0f, // maxRange (degC)
0.01, // resolution (degC)
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzTemperature), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_INTERNAL_TEMPERATURE,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzTemperature), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"Orientation",
"Google",
kVersion,
COMMS_SENSOR_ORIENTATION,
SENSOR_TYPE_ORIENTATION,
360.0f, // maxRange (deg)
1.0f, // XXX resolution (deg)
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_ORIENTATION,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"BMI160 Step detector",
"Bosch",
kVersion,
COMMS_SENSOR_STEP_DETECTOR,
SENSOR_TYPE_STEP_DETECTOR,
1.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
0, // minDelay
100, // XXX fifoReservedEventCount
kMaxOneAxisEventCount, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_STEP_DETECTOR,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_SPECIAL_REPORTING_MODE,
{ NULL, NULL }
},
{
"BMI160 Step counter",
"Bosch",
kVersion,
COMMS_SENSOR_STEP_COUNTER,
SENSOR_TYPE_STEP_COUNTER,
1.0f, // XXX maxRange
1.0f, // resolution
0.0f, // XXX power
0, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_STEP_COUNTER,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_ON_CHANGE_MODE,
{ NULL, NULL }
},
{
"Significant motion",
"Google",
kVersion,
COMMS_SENSOR_SIGNIFICANT_MOTION,
SENSOR_TYPE_SIGNIFICANT_MOTION,
1.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
-1, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_SIGNIFICANT_MOTION,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
{ NULL, NULL }
},
{
"Gravity",
"Google",
kVersion,
COMMS_SENSOR_GRAVITY,
SENSOR_TYPE_GRAVITY,
1000.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_GRAVITY,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"Linear Acceleration",
"Google",
kVersion,
COMMS_SENSOR_LINEAR_ACCEL,
SENSOR_TYPE_LINEAR_ACCELERATION,
1000.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_LINEAR_ACCELERATION,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"Rotation Vector",
"Google",
kVersion,
COMMS_SENSOR_ROTATION_VECTOR,
SENSOR_TYPE_ROTATION_VECTOR,
1000.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_ROTATION_VECTOR,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"Geomagnetic Rotation Vector",
"Google",
kVersion,
COMMS_SENSOR_GEO_MAG,
SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
1000.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"Game Rotation Vector",
"Google",
kVersion,
COMMS_SENSOR_GAME_ROTATION_VECTOR,
SENSOR_TYPE_GAME_ROTATION_VECTOR,
1000.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
(int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
300, // XXX fifoReservedEventCount
kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR,
"", // requiredPermission
(long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
SENSOR_FLAG_CONTINUOUS_MODE,
{ NULL, NULL }
},
{
"Tilt Detector",
"Google",
kVersion,
COMMS_SENSOR_TILT,
SENSOR_TYPE_TILT_DETECTOR,
1.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
0, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_TILT_DETECTOR,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
{ NULL, NULL }
},
{
"Pickup Gesture",
"Google",
kVersion,
COMMS_SENSOR_GESTURE,
SENSOR_TYPE_PICK_UP_GESTURE,
1.0f, // maxRange
1.0f, // XXX resolution
0.0f, // XXX power
-1, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_PICK_UP_GESTURE,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
{ NULL, NULL }
},
{
"Sensors Sync",
"Google",
kVersion,
COMMS_SENSOR_SYNC,
SENSOR_TYPE_SYNC,
1.0f, // maxRange
1.0f, // XXX resolution
0.1f, // XXX power
0, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_SYNC,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_SPECIAL_REPORTING_MODE,
{ NULL, NULL }
},
{
"Double Twist",
"Google",
kVersion,
COMMS_SENSOR_DOUBLE_TWIST,
SENSOR_TYPE_DOUBLE_TWIST,
1.0f, // maxRange
1.0f, // XXX resolution
0.1f, // XXX power
0, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_DOUBLE_TWIST,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
{ NULL, NULL }
},
{
"Double Tap",
"Google",
kVersion,
COMMS_SENSOR_DOUBLE_TAP,
SENSOR_TYPE_DOUBLE_TAP,
1.0f, // maxRange
1.0f, // XXX resolution
0.1f, // XXX power
0, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_DOUBLE_TAP,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_SPECIAL_REPORTING_MODE,
{ NULL, NULL }
},
{
"Device Orientation",
"Google",
kVersion,
COMMS_SENSOR_WINDOW_ORIENTATION,
SENSOR_TYPE_DEVICE_ORIENTATION,
3.0f, // maxRange
1.0f, // XXX resolution
0.1f, // XXX power
0, // minDelay
0, // XXX fifoReservedEventCount
0, // XXX fifoMaxEventCount
SENSOR_STRING_TYPE_DEVICE_ORIENTATION,
"", // requiredPermission
0, // maxDelay
SENSOR_FLAG_ON_CHANGE_MODE,
{ NULL, NULL }
},
};
////////////////////////////////////////////////////////////////////////////////
SensorContext::SensorContext(const struct hw_module_t *module)
@@ -524,32 +45,8 @@ SensorContext::SensorContext(const struct hw_module_t *module)
device.batch = BatchWrapper;
device.flush = FlushWrapper;
if (mHubConnection->initCheck() != (status_t)OK) {
mHubAlive = false;
} else {
if (mHubConnection->getAliveCheck() != (status_t)OK) {
mHubAlive = false;
} else {
HubConnection::ProximitySensorType type;
mHubConnection->getProximitySensorType(&type);
if (type == HubConnection::PROXIMITY_ROHM) {
kSensorList[0].name = "RPR0521 proximity";
kSensorList[0].vendor = "Rohm";
kSensorList[1].name = "RPR0521 light";
kSensorList[1].vendor = "Rohm";
} else if (type == HubConnection::PROXIMITY_AMS) {
kSensorList[0].name = "TMD27723 proximity";
kSensorList[0].vendor = "AMS";
kSensorList[1].name = "TMD27723 light";
kSensorList[1].vendor = "AMS";
kSensorList[1].maxRange = 10000;
}
}
}
}
SensorContext::~SensorContext() {
mHubAlive = (mHubConnection->initCheck() == OK
&& mHubConnection->getAliveCheck() == OK);
}
int SensorContext::close() {
@@ -573,8 +70,7 @@ int SensorContext::setDelay(int handle, int64_t delayNs) {
// clamp sample rate based on minDelay and maxDelay defined in kSensorList
int64_t delayNsClamped = delayNs;
int num_sensors = sizeof(kSensorList) / sizeof(sensor_t);
for (int i = 0; i < num_sensors; i++) {
for (size_t i = 0; i < kSensorCount; i++) {
sensor_t sensor = kSensorList[i];
if (sensor.handle != handle) {
continue;
@@ -617,8 +113,7 @@ int SensorContext::batch(
// clamp sample rate based on minDelay and maxDelay defined in kSensorList
int64_t sampling_period_ns_clamped = sampling_period_ns;
int num_sensors = sizeof(kSensorList) / sizeof(sensor_t);
for (int i = 0; i < num_sensors; i++) {
for (size_t i = 0; i < kSensorCount; i++) {
sensor_t sensor = kSensorList[i];
if (sensor.handle != handle) {
continue;
@@ -720,7 +215,7 @@ static int get_sensors_list(
if (gHubAlive) {
*list = kSensorList;
return sizeof(kSensorList) / sizeof(kSensorList[0]);
return kSensorCount;
} else {
*list = {};
return 0;