192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/* 292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Copyright (C) 2008-2014 The Android Open Source Project 392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * 492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Licensed under the Apache License, Version 2.0 (the "License"); 592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * you may not use this file except in compliance with the License. 692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * You may obtain a copy of the License at 792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * 892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * http://www.apache.org/licenses/LICENSE-2.0 992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * 1092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Unless required by applicable law or agreed to in writing, software 1192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * distributed under the License is distributed on an "AS IS" BASIS, 1292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * See the License for the specific language governing permissions and 1492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * limitations under the License. 1592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang */ 1692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 1792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define LOG_TAG "Sensors" 1892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 1992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <dirent.h> 2092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <errno.h> 2192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <fcntl.h> 2292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <linux/input.h> 2392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <math.h> 2492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <poll.h> 2592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <pthread.h> 2692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <stdlib.h> 2792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 2892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <utils/Atomic.h> 2992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <utils/Log.h> 3092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <hardware/sensors.h> 3292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include "sensors.h" 3492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include "CwMcuSensor.h" 3592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/ 3792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define DELAY_OUT_TIME 0x7FFFFFFF 3992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 4092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define LIGHT_SENSOR_POLLTIME 2000000000 4192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 4292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/ 4392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic const struct sensor_t sSensorList[] = { 4442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Accelerometer Sensor", 4542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 4642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 4742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_A, 4842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_ACCELEROMETER, 4942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = RANGE_A, 5042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = CONVERT_A, 5142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 0.17f, 5242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 5342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 5542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 5642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 5742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 5842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 5942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 6042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 6142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Magnetic field Sensor", 6242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 6342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 6442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_M, 6542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_MAGNETIC_FIELD, 6642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 200.0f, 6742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = CONVERT_M, 6842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 5.0f, 69943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .minDelay = 10000, 7042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 710861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 7242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 7342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 7442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 7542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 7642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 7742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 7842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Gyroscope Sensor", 7942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 8042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 8142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_GY, 8242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_GYROSCOPE, 83943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .maxRange = 2000.0f, 8442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = CONVERT_GYRO, 8542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 6.1f, 8642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 8742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 880861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 8942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 9042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 9142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 9242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 9342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 9442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 9592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang {.name = "CM32181 Light sensor", 9692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .vendor = "Capella Microsystems", 9792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .version = 1, 9892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .handle = ID_L, 9992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .type = SENSOR_TYPE_LIGHT, 10092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .maxRange = 10240.0f, 10192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .resolution = 1.0f, 10292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .power = 0.15f, 10392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang .minDelay = 0, 10442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 10542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoMaxEventCount = 0, 10642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = NULL, 10717c4ff58c6500cd0cb3ca0ff581d8109e82743ccAravind Akella .requiredPermission = NULL, 10842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 0, 10942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_ON_CHANGE_MODE, 11042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 11142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 11242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Pressure Sensor", 11342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 11442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 11542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_PS, 11642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_PRESSURE, 11742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 2000, 11842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = 1.0f, 11942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 0.0027f, 12042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 12142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 1220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 12342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 12442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 12542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 12642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 12742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 12842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 12942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "CWGD Orientation Sensor", 13042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 13142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 13242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_O, 13342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_ORIENTATION, 13442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 360.0f, 13542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = 0.1f, 13642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 11.27f, 13742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 13842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 1390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 14042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 14142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 14242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 14342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 14442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 14542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 14642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Rotation Vector", 14742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 14842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 14942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_RV, 15042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_ROTATION_VECTOR, 15142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 1.0f, 152943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = 0.0001f, 15342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 11.27f, 15442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 15542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 1560861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 15742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 15842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 15942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 16042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 16142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 16242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 16342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Linear Acceleration", 16442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 16542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 16642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_LA, 16742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_LINEAR_ACCELERATION, 16842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = RANGE_A, 169943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = 0.01, 17042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 11.27f, 17142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 17242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 1730861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 17442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 17542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 17642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 17742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 17842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 17942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 18042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Gravity", 18142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "HTC Group Ltd.", 18242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 18342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_G, 18442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_GRAVITY, 18542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = GRAVITY_EARTH, 186943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = 0.01, 18742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 11.27f, 18842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 18942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 1900861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 19142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 19242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 19342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 19442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 19542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 19642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 19742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Magnetic Uncalibrated", 19842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 19942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 20042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_MAGNETIC_UNCALIBRATED, 20142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 20242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 200.0f, 203943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = CONVERT_M, 20442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 5.0f, 205943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .minDelay = 10000, 20642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 2070861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 610, 20842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 20942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 21042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 21142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 21242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 21342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 21442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Gyroscope Uncalibrated", 21542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 21642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 21742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_GYROSCOPE_UNCALIBRATED, 21842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 219943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .maxRange = 2000.0f, 220943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = CONVERT_GYRO, 22142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 6.1f, 22242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 22342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 2240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 610, 22542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 22642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 22742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 22842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 22942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 23042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 23142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Game Rotation Vector", 23242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 23342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 23442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_GAME_ROTATION_VECTOR, 23542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_GAME_ROTATION_VECTOR, 236943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .maxRange = 1.0f, 237943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = 0.0001f, 23842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 11.27f, 23942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 24042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 2410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 24242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 24342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 24442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 24542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 24642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 24742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 24842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Geomagnetic Rotation Vector", 24942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 25042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 25142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_GEOMAGNETIC_ROTATION_VECTOR, 25242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 253943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .maxRange = 1.0f, 254943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang .resolution = 0.0001f, 25542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 11.27f, 25642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 10000, 25742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 2580861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 25942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 26042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 26142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 200000, 26242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE, 26342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 26442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 26542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Significant Motion", 26642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 26742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 26842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_SIGNIFICANT_MOTION, 26942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_SIGNIFICANT_MOTION, 27042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 200.0f, 27142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = 1.0f, 27242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 0.17f, 27342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = -1, 27442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 27542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoMaxEventCount = 0, 27642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 27742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 27842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 0, 27942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP, 28042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 28142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 28242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Step Detector", 28342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 28442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 28542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_STEP_DETECTOR, 28642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_STEP_DETECTOR, 28742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 200.0f, 28842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = 1.0f, 28942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 0.17f, 29042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 0, 29142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 2920861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 29342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 29442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 29542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 0, 29642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_SPECIAL_REPORTING_MODE, 29742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 29842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang }, 29942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang {.name = "Step Counter", 30042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .vendor = "hTC Corp.", 30142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .version = 1, 30242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .handle = ID_CW_STEP_COUNTER, 30342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .type = SENSOR_TYPE_STEP_COUNTER, 30442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxRange = 200.0f, 30542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .resolution = 1.0f, 30642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .power = 0.17f, 30742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .minDelay = 0, 30842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .fifoReservedEventCount = 0, 3090861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 31042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .stringType = 0, 31142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .requiredPermission = 0, 31242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .maxDelay = 0, 31342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .flags = SENSOR_FLAG_ON_CHANGE_MODE, 31442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang .reserved = {} 31592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang }, 3160861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang 3170861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang 3180861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Accelerometer Sensor (WAKE_UP)", 3190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 3200861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 3210861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_A_W, 3220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_ACCELEROMETER, 3230861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = RANGE_A, 3240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = CONVERT_A, 3250861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 0.17f, 3260861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 3270861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 3280861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 3290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 3300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 3310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 3320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 3330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 3340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 3350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Magnetic field Sensor (WAKE_UP)", 3360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 3370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 3380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_M_W, 3390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_MAGNETIC_FIELD, 3400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 200.0f, 3410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = CONVERT_M, 3420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 5.0f, 3430861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 3440861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 3450861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 3460861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 3470861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 3480861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 3490861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 3500861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 3510861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 3520861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Gyroscope Sensor (WAKE_UP)", 3530861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 3540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 3550861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_GY_W, 3560861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_GYROSCOPE, 3570861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 2000.0f, 3580861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = CONVERT_GYRO, 3590861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 6.1f, 3600861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 3610861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 3620861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 3630861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 3640861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 3650861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 3660861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 3670861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 3680861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 3690861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Pressure Sensor (WAKE_UP)", 3700861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 3710861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 3720861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_PS_W, 3730861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_PRESSURE, 3740861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 2000, 3750861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 1.0f, 3760861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 0.0027f, 3770861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 3780861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 3790861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 3800861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 3810861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 3820861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 3830861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 3840861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 3850861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 3860861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "CWGD Orientation Sensor (WAKE_UP)", 3870861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 3880861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 3890861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_O_W, 3900861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_ORIENTATION, 3910861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 360.0f, 3920861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 0.1f, 3930861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 11.27f, 3940861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 3950861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 3960861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 3970861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 3980861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 3990861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 4000861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 4010861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 4020861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 4030861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Rotation Vector (WAKE_UP)", 4040861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 4050861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 4060861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_RV_W, 4070861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_ROTATION_VECTOR, 4080861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 1.0f, 4090861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 0.0001f, 4100861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 11.27f, 4110861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 4120861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 4130861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 4140861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 4150861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 4160861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 4170861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 4180861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 4190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 4200861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Linear Acceleration (WAKE_UP)", 4210861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 4220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 4230861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_LA_W, 4240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_LINEAR_ACCELERATION, 4250861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = RANGE_A, 4260861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 0.01, 4270861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 11.27f, 4280861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 4290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 4300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 4310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 4320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 4330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 4340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 4350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 4360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 4370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Gravity (WAKE_UP)", 4380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "HTC Group Ltd.", 4390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 4400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_G_W, 4410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_GRAVITY, 4420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = GRAVITY_EARTH, 4430861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 0.01, 4440861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 11.27f, 4450861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 4460861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 4470861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 4480861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 4490861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 4500861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 4510861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 4520861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 4530861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 4540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Magnetic Uncalibrated (WAKE_UP)", 4550861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "hTC Corp.", 4560861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 4570861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_CW_MAGNETIC_UNCALIBRATED_W, 4580861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 4590861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 200.0f, 4600861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = CONVERT_M, 4610861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 5.0f, 4620861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 4630861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 4640861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 610, 4650861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 4660861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 4670861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 4680861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 4690861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 4700861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 4710861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Gyroscope Uncalibrated (WAKE_UP)", 4720861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "hTC Corp.", 4730861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 4740861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_CW_GYROSCOPE_UNCALIBRATED_W, 4750861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 4760861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 2000.0f, 4770861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = CONVERT_GYRO, 4780861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 6.1f, 4790861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 4800861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 4810861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 610, 4820861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 4830861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 4840861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 4850861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 4860861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 4870861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 4880861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Game Rotation Vector (WAKE_UP)", 4890861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "hTC Corp.", 4900861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 4910861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_CW_GAME_ROTATION_VECTOR_W, 4920861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_GAME_ROTATION_VECTOR, 4930861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 1.0f, 4940861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 0.0001f, 4950861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 11.27f, 4960861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 4970861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 4980861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 4990861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 5000861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 5010861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 5020861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 5030861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 5040861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 5050861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Geomagnetic Rotation Vector (WAKE_UP)", 5060861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "hTC Corp.", 5070861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 5080861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W, 5090861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 5100861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 1.0f, 5110861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 0.0001f, 5120861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 11.27f, 5130861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 10000, 5140861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 5150861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 5160861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 5170861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 5180861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 200000, 5190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, 5200861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 5210861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 5220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Step Detector (WAKE_UP)", 5230861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "hTC Corp.", 5240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 5250861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_CW_STEP_DETECTOR_W, 5260861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_STEP_DETECTOR, 5270861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 200.0f, 5280861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 1.0f, 5290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 0.17f, 5300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 0, 5310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 5320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 5330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 5340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 5350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 0, 5360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP, 5370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 5380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 5390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang {.name = "Step Counter (WAKE_UP)", 5400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .vendor = "hTC Corp.", 5410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .version = 1, 5420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .handle = ID_CW_STEP_COUNTER_W, 5430861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .type = SENSOR_TYPE_STEP_COUNTER, 5440861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxRange = 200.0f, 5450861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .resolution = 1.0f, 5460861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .power = 0.17f, 5470861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .minDelay = 0, 5480861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoReservedEventCount = 0, 5490861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .fifoMaxEventCount = 1220, 5500861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .stringType = 0, 5510861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .requiredPermission = 0, 5520861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .maxDelay = 0, 5530861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .flags = SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP, 5540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang .reserved = {} 5550861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang }, 55692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}; 55792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 55892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int open_sensors(const struct hw_module_t* module, const char* id, 55992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang struct hw_device_t** device); 56092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 56192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int sensors__get_sensors_list(struct sensors_module_t*, 56292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang struct sensor_t const** list) 56392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 56492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang *list = sSensorList; 56592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return ARRAY_SIZE(sSensorList); 56692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 56792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 56892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic struct hw_module_methods_t sensors_module_methods = { 56992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang open: open_sensors 57092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}; 57192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 57292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstruct sensors_module_t HAL_MODULE_INFO_SYM = { 57392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang common: { 57492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang tag: HARDWARE_MODULE_TAG, 57592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang version_major: 1, 57692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang version_minor: 0, 57792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang id: SENSORS_HARDWARE_MODULE_ID, 57892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang name: "Sensor module", 57992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang author: "Electronic Company", 58092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang methods: &sensors_module_methods, 58192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dso: NULL, 58292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang reserved: { }, 58392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang }, 58492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang get_sensors_list: sensors__get_sensors_list, 58592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}; 58692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 58792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstruct sensors_poll_context_t { 588facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang sensors_poll_device_1_t device; // must be first 58992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 59092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_poll_context_t(); 59192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ~sensors_poll_context_t(); 59292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int activate(int handle, int enabled); 59392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int setDelay(int handle, int64_t ns); 59492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int pollEvents(sensors_event_t* data, int count); 595facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int batch(int handle, int flags, int64_t period_ns, int64_t timeout); 596facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int flush(int handle); 59792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 59892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangprivate: 59992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang enum { 60092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang cwmcu = 0, 60192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang numSensorDrivers, 60292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang numFds, 60392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang }; 60492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 60592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang static const size_t wake = numFds - 1; 60692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang static const char WAKE_MESSAGE = 'W'; 60792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang struct pollfd mPollFds[numFds]; 60892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int mWritePipeFd; 60992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang SensorBase* mSensors[numSensorDrivers]; 61092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 61192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint handleToDriver(int handle) const { 61292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang switch (handle) { 61392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_A: 61492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_M: 61592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_GY: 61692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_L: 61792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_PS: 61892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_O: 61992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_RV: 62092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_LA: 62192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_G: 62292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_MAGNETIC_UNCALIBRATED: 62392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_GYROSCOPE_UNCALIBRATED: 62492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_GAME_ROTATION_VECTOR: 62592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_GEOMAGNETIC_ROTATION_VECTOR: 62692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_SIGNIFICANT_MOTION: 62792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_STEP_DETECTOR: 62892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang case ID_CW_STEP_COUNTER: 6290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_A_W: 6300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_M_W: 6310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_GY_W: 6320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_PS_W: 6330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_O_W: 6340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_RV_W: 6350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_LA_W: 6360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_G_W: 6370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_CW_MAGNETIC_UNCALIBRATED_W: 6380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_CW_GYROSCOPE_UNCALIBRATED_W: 6390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_CW_GAME_ROTATION_VECTOR_W: 6400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W: 6410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_CW_STEP_DETECTOR_W: 6420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang case ID_CW_STEP_COUNTER_W: 64392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return cwmcu; 64492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 64592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return -EINVAL; 64692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 64792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}; 64892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 64992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/ 65092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 65192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangsensors_poll_context_t::sensors_poll_context_t() 65292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 65392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mSensors[cwmcu] = new CwMcuSensor(); 65492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[cwmcu].fd = mSensors[cwmcu]->getFd(); 65592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[cwmcu].events = POLLIN; 65692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[cwmcu].revents = 0; 65792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 65892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int wakeFds[2]; 65992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int result = pipe(wakeFds); 66092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno)); 66192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang fcntl(wakeFds[0], F_SETFL, O_NONBLOCK); 66292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang fcntl(wakeFds[1], F_SETFL, O_NONBLOCK); 66392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mWritePipeFd = wakeFds[1]; 66492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 66592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[wake].fd = wakeFds[0]; 66692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[wake].events = POLLIN; 66792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[wake].revents = 0; 66892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 66992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 67092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangsensors_poll_context_t::~sensors_poll_context_t() { 67192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang for (int i=0 ; i<numSensorDrivers ; i++) { 67292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang delete mSensors[i]; 67392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 67492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang close(mPollFds[wake].fd); 67592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang close(mWritePipeFd); 67692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 67792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 67892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint sensors_poll_context_t::activate(int handle, int enabled) { 67992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int index = handleToDriver(handle); 68092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (index < 0) return index; 68192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int err = mSensors[index]->setEnable(handle, enabled); 68292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (enabled && !err) { 68392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang const char wakeMessage(WAKE_MESSAGE); 68492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int result = write(mWritePipeFd, &wakeMessage, 1); 68592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE_IF(result<0, "error sending wake message (%s)", strerror(errno)); 68692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 68792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return err; 68892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 68992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 69092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint sensors_poll_context_t::setDelay(int handle, int64_t ns) { 69192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 69292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int index = handleToDriver(handle); 69392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (index < 0) return index; 69492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return mSensors[index]->setDelay(handle, ns); 69592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 69692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 69792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint sensors_poll_context_t::pollEvents(sensors_event_t* data, int count) 69892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 69992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int nbEvents = 0; 70092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int n = 0; 70192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang do { 70292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang // see if we have some leftover from the last poll() 70392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang for (int i=0 ; count && i<numSensorDrivers ; i++) { 70492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang SensorBase* const sensor(mSensors[i]); 70592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) { 70692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int nb = sensor->readEvents(data, count); 70792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (nb < count) { 70892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang // no more data for this sensor 70992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[i].revents = 0; 71092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 71192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang count -= nb; 71292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang nbEvents += nb; 71392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang data += nb; 71492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 71592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 71692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 71792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (count) { 71892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang // we still have some room, so try to see if we can get 71992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang // some events immediately or just wait if we don't have 72092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang // anything to return 72192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang do { 72292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang TEMP_FAILURE_RETRY(n = poll(mPollFds, numFds, nbEvents ? 0 : -1)); 72392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } while (n < 0 && errno == EINTR); 72492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (n<0) { 72592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE("poll() failed (%s)", strerror(errno)); 72692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return -errno; 72792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 72892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (mPollFds[wake].revents & POLLIN) { 72992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang char msg(WAKE_MESSAGE); 73092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int result = read(mPollFds[wake].fd, &msg, 1); 73192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno)); 73292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg)); 73392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang mPollFds[wake].revents = 0; 73492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 73592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 73692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang // if we have events and space, go read them 73792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } while (n && count); 73892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return nbEvents; 73992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 74092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 741facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangint sensors_poll_context_t::batch(int handle, int flags, int64_t period_ns, int64_t timeout) 742facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{ 743facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int index = handleToDriver(handle); 744facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 745facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang if (index < 0) 746facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang return index; 747facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 748facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int err = mSensors[index]->batch(handle, flags, period_ns, timeout); 749facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 750facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang return err; 751facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang} 752facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 753facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangint sensors_poll_context_t::flush(int handle) 754facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{ 755facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int index = handleToDriver(handle); 756facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 757facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang if (index < 0) 758facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang return index; 759facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 760facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int err = mSensors[index]->flush(handle); 761facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 762facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang return err; 763facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang} 764facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 765facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 76692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/ 76792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 76892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__close(struct hw_device_t *dev) 76992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 77092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev); 77192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (ctx) { 77292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang delete ctx; 77392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 77492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return 0; 77592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 77692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 77792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__activate(struct sensors_poll_device_t *dev, 77892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int handle, int enabled) { 77992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev); 78092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return ctx->activate(handle, enabled); 78192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 78292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 78392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__setDelay(struct sensors_poll_device_t *dev, 78492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int handle, int64_t ns) { 78592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev); 78692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return ctx->setDelay(handle, ns); 78792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 78892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 78992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__poll(struct sensors_poll_device_t *dev, 79092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_event_t* data, int count) { 79192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev); 79292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return ctx->pollEvents(data, count); 79392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 79492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 795facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangstatic int poll__batch(struct sensors_poll_device_1 *dev, 796facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int handle, int flags, int64_t period_ns, int64_t timeout) 797facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{ 798facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; 799facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang return ctx->batch(handle, flags, period_ns, timeout); 800facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang} 801facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 802facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangstatic int poll__flush(struct sensors_poll_device_1 *dev, 803facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang int handle) 804facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{ 805facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; 806facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang return ctx->flush(handle); 807facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang} 80892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/ 80992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 81092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang// Open a new instance of a sensor device using name 81192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int open_sensors(const struct hw_module_t* module, const char*, 81292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang struct hw_device_t** device) 81392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 81492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang sensors_poll_context_t *dev = new sensors_poll_context_t(); 81592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 816facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang memset(&dev->device, 0, sizeof(sensors_poll_device_1_t)); 81792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 81892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev->device.common.tag = HARDWARE_DEVICE_TAG; 8190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang dev->device.common.version = SENSORS_DEVICE_API_VERSION_1_3; 82092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev->device.common.module = const_cast<hw_module_t*>(module); 82192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev->device.common.close = poll__close; 82292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev->device.activate = poll__activate; 82392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev->device.setDelay = poll__setDelay; 82492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev->device.poll = poll__poll; 82592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 826facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang // Batch processing 827facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang dev->device.batch = poll__batch; 828facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang dev->device.flush = poll__flush; 829facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang 83092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang *device = &dev->device.common; 83192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 83292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return 0; 83392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 8343b6c76f413578d3941cc0efb15d2937a5eaa6856JP Abgrall 835