1/* 2* Copyright (C) 2014 Invensense, Inc. 3* 4* Licensed under the Apache License, Version 2.0 (the "License"); 5* you may not use this file except in compliance with the License. 6* You may obtain a copy of the License at 7* 8* http://www.apache.org/licenses/LICENSE-2.0 9* 10* Unless required by applicable law or agreed to in writing, software 11* distributed under the License is distributed on an "AS IS" BASIS, 12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13* See the License for the specific language governing permissions and 14* limitations under the License. 15*/ 16 17#ifndef ANDROID_SENSORS_H 18#define ANDROID_SENSORS_H 19 20#include <stdint.h> 21#include <errno.h> 22#include <sys/cdefs.h> 23#include <sys/types.h> 24 25#include <linux/input.h> 26 27#include <hardware/hardware.h> 28#include <hardware/sensors.h> 29 30__BEGIN_DECLS 31 32/*****************************************************************************/ 33 34#ifndef ARRAY_SIZE 35#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 36#endif 37 38#undef ENABLE_PRESSURE 39 40enum { 41 ID_GY = 0, 42 ID_RG, 43 ID_A, 44 ID_M, 45 ID_RM, 46#ifdef ENABLE_PRESSURE 47 ID_PS, 48#endif 49 ID_O, 50 ID_RV, 51 ID_GRV, 52 ID_LA, 53 ID_GR, 54 ID_SM, 55 ID_P, 56 ID_SC, 57 ID_GMRV, 58 ID_SO 59}; 60 61enum { 62 Gyro = 0, 63 RawGyro, 64 Accelerometer, 65 MagneticField, 66 RawMagneticField, 67#ifdef ENABLE_PRESSURE 68 Pressure, 69#endif 70 Orientation, 71 RotationVector, 72 GameRotationVector, 73 LinearAccel, 74 Gravity, 75 SignificantMotion, 76 StepDetector, 77 StepCounter, 78 GeomagneticRotationVector, 79 NumSensors 80}; 81 82#ifdef ENABLE_PRESSURE 83#define LAST_HW_SENSOR Pressure 84#else 85#define LAST_HW_SENSOR RawMagneticField 86#endif 87 88/* Physical parameters of the sensors supported by Invensense MPL */ 89#define SENSORS_GYROSCOPE_HANDLE (ID_GY) 90#define SENSORS_RAW_GYROSCOPE_HANDLE (ID_RG) 91#define SENSORS_ACCELERATION_HANDLE (ID_A) 92#define SENSORS_MAGNETIC_FIELD_HANDLE (ID_M) 93#define SENSORS_RAW_MAGNETIC_FIELD_HANDLE (ID_RM) 94#define SENSORS_PRESSURE_HANDLE (ID_PS) 95#define SENSORS_ORIENTATION_HANDLE (ID_O) 96#define SENSORS_ROTATION_VECTOR_HANDLE (ID_RV) 97#define SENSORS_GAME_ROTATION_VECTOR_HANDLE (ID_GRV) 98#define SENSORS_LINEAR_ACCEL_HANDLE (ID_LA) 99#define SENSORS_GRAVITY_HANDLE (ID_GR) 100#define SENSORS_SIGNIFICANT_MOTION_HANDLE (ID_SM) 101#define SENSORS_PEDOMETER_HANDLE (ID_P) 102#define SENSORS_STEP_COUNTER_HANDLE (ID_SC) 103#define SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE (ID_GMRV) 104#define SENSORS_SCREEN_ORIENTATION_HANDLE (ID_SO) 105 106/*****************************************************************************/ 107 108/* 109 Android KitKat 110 Populate sensor_t structure according to hardware sensors.h 111 { name, vendor, version, handle, type, maxRange, resolution, power, minDelay, 112 fifoReservedEventCount, fifoMaxEventCount, reserved[] } 113*/ 114#if defined ANDROID_KITKAT 115static struct sensor_t sBaseSensorList[] = 116{ 117 {"MPL Gyroscope", "Invensense", 1, SENSORS_GYROSCOPE_HANDLE, 118 SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 124, 119 SENSOR_STRING_TYPE_GYROSCOPE, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 120 {"MPL Raw Gyroscope", "Invensense", 1, SENSORS_RAW_GYROSCOPE_HANDLE, 121 SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 2000.0f, 1.0f, 0.5f, 10000, 0, 124, 122 SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 123 {"MPL Accelerometer", "Invensense", 1, SENSORS_ACCELERATION_HANDLE, 124 SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, 0, 124, 125 SENSOR_STRING_TYPE_ACCELEROMETER, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 126 {"MPL Magnetic Field", "Invensense", 1, SENSORS_MAGNETIC_FIELD_HANDLE, 127 SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, 0, 124, 128 SENSOR_STRING_TYPE_MAGNETIC_FIELD, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 129 {"MPL Raw Magnetic Field", "Invensense", 1, SENSORS_RAW_MAGNETIC_FIELD_HANDLE, 130 SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 10240.0f, 1.0f, 0.5f, 10000, 0, 124, 131 SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 132#ifdef ENABLE_PRESSURE 133 {"MPL Pressure", "Invensense", 1, SENSORS_PRESSURE_HANDLE, 134 SENSOR_TYPE_PRESSURE, 10240.0f, 1.0f, 0.5f, 10000, 0, 165, 135 SENSOR_STRING_TYPE_PRESSURE, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 136#endif 137 {"MPL Orientation", "Invensense", 1, SENSORS_ORIENTATION_HANDLE, 138 SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, 0, 0, 139 SENSOR_STRING_TYPE_ORIENTATION, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 140 {"MPL Rotation Vector", "Invensense", 1, SENSORS_ROTATION_VECTOR_HANDLE, 141 SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 142 SENSOR_STRING_TYPE_ROTATION_VECTOR, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 143 {"MPL Game Rotation Vector", "Invensense", 1, SENSORS_GAME_ROTATION_VECTOR_HANDLE, 144 SENSOR_TYPE_GAME_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, 0, 62, 145 SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 146 {"MPL Linear Acceleration", "Invensense", 1, SENSORS_LINEAR_ACCEL_HANDLE, 147 SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 148 SENSOR_STRING_TYPE_LINEAR_ACCELERATION, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 149 {"MPL Gravity", "Invensense", 1, SENSORS_GRAVITY_HANDLE, 150 SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 151 SENSOR_STRING_TYPE_GRAVITY, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 152 {"MPL Significant Motion", "Invensense", 1, SENSORS_SIGNIFICANT_MOTION_HANDLE, 153 SENSOR_TYPE_SIGNIFICANT_MOTION, 100.0f, 1.0f, 1.1f, 0, 0, 0, 154 SENSOR_STRING_TYPE_SIGNIFICANT_MOTION, 0, 0, 155 SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP, {}}, 156 {"MPL Step Detector", "Invensense", 1, SENSORS_PEDOMETER_HANDLE, 157 SENSOR_TYPE_STEP_DETECTOR, 100.0f, 1.0f, 1.1f, 0, 0, 124, 158 SENSOR_STRING_TYPE_STEP_DETECTOR, 0, 0, SENSOR_FLAG_SPECIAL_REPORTING_MODE, {}}, 159 {"MPL Step Counter", "Invensense", 1, SENSORS_STEP_COUNTER_HANDLE, 160 SENSOR_TYPE_STEP_COUNTER, 100.0f, 1.0f, 1.1f, 0, 0, 0, 161 SENSOR_STRING_TYPE_STEP_COUNTER, 0, 0, SENSOR_FLAG_ON_CHANGE_MODE, {}}, 162 {"MPL Geomagnetic Rotation Vector", "Invensense", 1, 163 SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE, 164 SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 5000, 0, 0, 165 SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}}, 166#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION 167 {"MPL Screen Orientation", "Invensense ", 1, SENSORS_SCREEN_ORIENTATION_HANDLE, 168 SENSOR_TYPE_SCREEN_ORIENTATION, 100.0f, 1.0f, 1.1f, 0, 0, 0, 169 SENSOR_STRING_TYPE_SCREEN_ORIENTATION, 0, 0, SENSOR_FLAG_ON_CHANGE_MODE, {}}, 170#endif 171}; 172#else //ANDROID_KITKAT END 173static struct sensor_t sBaseSensorList[] = 174{ 175 {"MPL Gyroscope", "Invensense", 1, 176 SENSORS_GYROSCOPE_HANDLE, 177 SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, {}}, 178 {"MPL Raw Gyroscope", "Invensense", 1, 179 SENSORS_RAW_GYROSCOPE_HANDLE, 180 SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 2000.0f, 1.0f, 0.5f, 10000, {}}, 181 {"MPL Accelerometer", "Invensense", 1, 182 SENSORS_ACCELERATION_HANDLE, 183 SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, {}}, 184 {"MPL Magnetic Field", "Invensense", 1, 185 SENSORS_MAGNETIC_FIELD_HANDLE, 186 SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, {}}, 187 {"MPL Raw Magnetic Field", "Invensense", 1, 188 SENSORS_RAW_MAGNETIC_FIELD_HANDLE, 189 SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 10240.0f, 1.0f, 0.5f, 10000, {}}, 190#ifdef ENABLE_PRESSURE 191 {"MPL Pressure", "Invensense", 1, 192 SENSORS_PRESSURE_HANDLE, 193 SENSOR_TYPE_PRESSURE, 10240.0f, 1.0f, 0.5f, 10000, {}}, 194#endif 195 {"MPL Orientation", "Invensense", 1, 196 SENSORS_ORIENTATION_HANDLE, 197 SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, {}}, 198 {"MPL Rotation Vector", "Invensense", 1, 199 SENSORS_ROTATION_VECTOR_HANDLE, 200 SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, {}}, 201 {"MPL Game Rotation Vector", "Invensense", 1, 202 SENSORS_GAME_ROTATION_VECTOR_HANDLE, 203 SENSOR_TYPE_GAME_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, {}}, 204 {"MPL Linear Acceleration", "Invensense", 1, 205 SENSORS_LINEAR_ACCEL_HANDLE, 206 SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, {}}, 207 {"MPL Gravity", "Invensense", 1, 208 SENSORS_GRAVITY_HANDLE, 209 SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, {}}, 210 {"MPL Significant Motion", "Invensense", 1, 211 SENSORS_SIGNIFICANT_MOTION_HANDLE, 212 SENSOR_TYPE_SIGNIFICANT_MOTION, 100.0f, 1.0f, 1.1f, 0, {}}, 213 {"MPL Step Detector", "Invensense", 1, 214 SENSORS_PEDOMETER_HANDLE, 215 SENSOR_TYPE_STEP_DETECTOR, 100.0f, 1.0f, 1.1f, 0, {}}, 216 {"MPL Step Counter", "Invensense", 1, 217 SENSORS_STEP_COUNTER_HANDLE, 218 SENSOR_TYPE_STEP_COUNTER, 100.0f, 1.0f, 1.1f, 0, {}}, 219 {"MPL Geomagnetic Rotation Vector", "Invensense", 1, 220 SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE, 221 SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, {}}, 222#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION 223 {"MPL Screen Orientation", "Invensense ", 1, 224 SENSORS_SCREEN_ORIENTATION_HANDLE, 225 SENSOR_TYPE_SCREEN_ORIENTATION, 100.0f, 1.0f, 1.1f, 0, {}}, 226#endif 227}; 228#endif //ANDROID_JELLYBEAN END 229 230/*****************************************************************************/ 231 232/* 233 * The SENSORS Module 234 */ 235 236/* ITG3500 */ 237#define EVENT_TYPE_GYRO_X REL_X 238#define EVENT_TYPE_GYRO_Y REL_Y 239#define EVENT_TYPE_GYRO_Z REL_Z 240/* MPU6050 MPU9150 */ 241#define EVENT_TYPE_IACCEL_X REL_RX 242#define EVENT_TYPE_IACCEL_Y REL_RY 243#define EVENT_TYPE_IACCEL_Z REL_RZ 244/* MPU6050 MPU9150 */ 245#define EVENT_TYPE_ICOMPASS_X REL_X 246#define EVENT_TYPE_ICOMPASS_Y REL_Y 247#define EVENT_TYPE_ICOMPASS_Z REL_Z 248/* MPUxxxx */ 249#define EVENT_TYPE_TIMESTAMP_HI REL_MISC 250#define EVENT_TYPE_TIMESTAMP_LO REL_WHEEL 251 252/* Accel BMA250 */ 253#define EVENT_TYPE_ACCEL_X ABS_X 254#define EVENT_TYPE_ACCEL_Y ABS_Y 255#define EVENT_TYPE_ACCEL_Z ABS_Z 256#define LSG (1000.0f) 257 258// conversion of acceleration data to SI units (m/s^2) 259#define RANGE_A (4*GRAVITY_EARTH) 260#define RESOLUTION_A (GRAVITY_EARTH / LSG) 261#define CONVERT_A (GRAVITY_EARTH / LSG) 262#define CONVERT_A_X (CONVERT_A) 263#define CONVERT_A_Y (CONVERT_A) 264#define CONVERT_A_Z (CONVERT_A) 265 266/* AKM compasses */ 267#define EVENT_TYPE_MAGV_X ABS_RX 268#define EVENT_TYPE_MAGV_Y ABS_RY 269#define EVENT_TYPE_MAGV_Z ABS_RZ 270#define EVENT_TYPE_MAGV_STATUS ABS_RUDDER 271 272/* conversion of magnetic data to uT units */ 273#define CONVERT_M (0.06f) 274 275/* conversion of sensor rates */ 276#define hertz_request = 200; 277#define DEFAULT_MPL_GYRO_RATE (20000L) //us 278#define DEFAULT_MPL_COMPASS_RATE (20000L) //us 279 280#define DEFAULT_HW_GYRO_RATE (100) //Hz 281#define DEFAULT_HW_ACCEL_RATE (20) //ms 282#define DEFAULT_HW_COMPASS_RATE (20000000L) //ns 283#define DEFAULT_HW_AKMD_COMPASS_RATE (200000000L) //ns 284 285/* convert ns to hardware units */ 286#define HW_GYRO_RATE_NS (1000000000LL / rate_request) // to Hz 287#define HW_ACCEL_RATE_NS (rate_request / (1000000L)) // to ms 288#define HW_COMPASS_RATE_NS (rate_request) // to ns 289 290/* convert Hz to hardware units */ 291#define HW_GYRO_RATE_HZ (hertz_request) 292#define HW_ACCEL_RATE_HZ (1000 / hertz_request) 293#define HW_COMPASS_RATE_HZ (1000000000LL / hertz_request) 294 295#define RATE_200HZ 5000000LL 296#define RATE_15HZ 66667000LL 297#define RATE_5HZ 200000000LL 298__END_DECLS 299 300#endif // ANDROID_SENSORS_H 301