1 /* 2 * Copyright (C) 2016 The Android Open Source Project 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 #include "sensorlist.h" 18 19 #include <math.h> 20 21 #include "hubdefs.h" 22 23 using namespace android; 24 25 const int kVersion = 1; 26 27 const float kMinSampleRateHzAccel = 0.8125f; 28 const float kMaxSampleRateHzAccel = 416.0f; 29 const float kAccelRangeG = 8.0f; 30 extern const float kScaleAccel = 0.00239364f; 31 32 const float kMinSampleRateHzGyro = 0.8125f; 33 const float kMaxSampleRateHzGyro = 416.0f; 34 35 const float kMinSampleRateHzMag = 0.8125f; 36 const float kMaxSampleRateHzMag = 104.0f; 37 extern const float kScaleMag = 0.15f; 38 39 const float kMinSampleRateHzPressure = 1.0f; 40 const float kMaxSampleRateHzPressure = 75.0f; 41 42 const float kMinSampleRateHzTemperature = 1.0f; 43 const float kMaxSampleRateHzTemperature = 75.0f; 44 45 const float kMinSampleRateHzHumidity = 1.0f; 46 const float kMaxSampleRateHzHumidity = 12.5f; 47 48 #ifdef HAVE_VL53L0X_DRIVER 49 const float kMinSampleRateHzProximity = 0.1f; 50 const float kMaxSampleRateHzProximity = 5.0f; 51 #endif 52 53 const float kMinSampleRateHzLight = 10.0f; 54 const float kMaxSampleRateHzLight = 10.0f; 55 56 const float kMinSampleRateHzOrientation = 12.5f; 57 const float kMaxSampleRateHzOrientation = 200.0f; 58 59 #define MINDELAY(x) ((int32_t)ceil(1.0E6f / (x))) 60 61 #ifdef DIRECT_REPORT_ENABLED 62 constexpr uint32_t kDirectReportFlagAccel = ( 63 // support up to rate level fast (nominal 200Hz); 64 (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT) 65 // support ashmem and gralloc direct channel 66 | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC); 67 constexpr uint32_t kDirectReportFlagGyro = ( 68 // support up to rate level fast (nominal 200Hz); 69 (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT) 70 // support ashmem and gralloc direct channel 71 | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC); 72 constexpr uint32_t kDirectReportFlagMag = ( 73 // support up to rate level normal (nominal 50Hz); 74 (SENSOR_DIRECT_RATE_NORMAL << SENSOR_FLAG_SHIFT_DIRECT_REPORT) 75 // support ashmem and gralloc direct channel 76 | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC); 77 #else 78 constexpr uint32_t kDirectReportFlagAccel = 0; 79 constexpr uint32_t kDirectReportFlagGyro = 0; 80 constexpr uint32_t kDirectReportFlagMag = 0; 81 #endif 82 83 /* 84 * The following max count is determined by the total number of blocks 85 * available in the shared nanohub buffer and number of samples each type of 86 * event can hold within a buffer block. 87 * For argonkey's case, there are 193 blocks in the shared sensor buffer and 88 * each block can hold 30 OneAxis Samples, 15 ThreeAxis Samples or 24 89 * RawThreeAxis Samples. 90 */ 91 #ifdef HAVE_VL53L0X_DRIVER 92 const int kMaxOneAxisEventCount = 193 * 30; 93 const int kMaxThreeAxisEventCount = 193 * 15; 94 const int kMaxRawThreeAxisEventCount = 193 * 24; 95 #else 96 const int kMaxOneAxisEventCount = 183 * 30; 97 const int kMaxThreeAxisEventCount = 183 * 15; 98 const int kMaxRawThreeAxisEventCount = 183 * 24; 99 #endif 100 101 const int kMinFifoReservedEventCount = 20; 102 103 extern const sensor_t kSensorList[] = { 104 #ifdef HAVE_VL53L0X_DRIVER 105 {"VL53L0X Proximity Sensor", 106 "STMicroelectronics", 107 kVersion, 108 COMMS_SENSOR_PROXIMITY, 109 SENSOR_TYPE_PROXIMITY, 110 5.0f, // maxRange (cm) 111 1.0f, // resolution (cm) 112 0.0f, // XXX power 113 MINDELAY(kMaxSampleRateHzProximity), // minDelay 114 300, // XXX fifoReservedEventCount 115 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 116 SENSOR_STRING_TYPE_PROXIMITY, 117 "", // requiredPermission 118 (long)(1.0E6f / kMinSampleRateHzProximity), // maxDelay 119 SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE, 120 {NULL, NULL}}, 121 #endif 122 {"ILS29034 Light Sensor", 123 "Intersil", 124 kVersion, 125 COMMS_SENSOR_LIGHT, 126 SENSOR_TYPE_LIGHT, 127 43000.0f, // maxRange (lx) 128 10.0f, // XXX resolution (lx) 129 0.0f, // XXX power 130 MINDELAY(kMaxSampleRateHzLight), // minDelay 131 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 132 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 133 SENSOR_STRING_TYPE_LIGHT, 134 "", // requiredPermission 135 (long)(1.0E6f / kMinSampleRateHzLight), // maxDelay 136 SENSOR_FLAG_ON_CHANGE_MODE, 137 {NULL, NULL}}, 138 {"LSM6DSL accelerometer", 139 "STMicroelectronics", 140 kVersion, 141 COMMS_SENSOR_ACCEL, 142 SENSOR_TYPE_ACCELEROMETER, 143 GRAVITY_EARTH* kAccelRangeG, // maxRange 144 kScaleAccel, // resolution 145 0.0f, // XXX power 146 MINDELAY(kMaxSampleRateHzAccel), // minDelay 147 3000, // XXX fifoReservedEventCount 148 kMaxRawThreeAxisEventCount, // XXX fifoMaxEventCount 149 SENSOR_STRING_TYPE_ACCELEROMETER, 150 "", // requiredPermission 151 (long)(1.0E6f / kMinSampleRateHzAccel), // maxDelay 152 SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel, 153 {NULL, NULL}}, 154 {"LSM6DSL accelerometer (uncalibrated)", 155 "STMicroelectronics", 156 kVersion, 157 COMMS_SENSOR_ACCEL_UNCALIBRATED, 158 SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED, 159 GRAVITY_EARTH* kAccelRangeG, // maxRange 160 kScaleAccel, // resolution 161 0.0f, // XXX power 162 MINDELAY(kMaxSampleRateHzAccel), // minDelay 163 3000, // XXX fifoReservedEventCount 164 kMaxRawThreeAxisEventCount, // XXX fifoMaxEventCount 165 SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED, 166 "", // requiredPermission 167 (long)(1.0E6f / kMinSampleRateHzAccel), // maxDelay 168 SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel, 169 {NULL, NULL}}, 170 {"LSM6DSL gyroscope", 171 "STMicroelectronics", 172 kVersion, 173 COMMS_SENSOR_GYRO, 174 SENSOR_TYPE_GYROSCOPE, 175 2000.0f * M_PI / 180.0f, // maxRange 176 0.07f * M_PI / 180.0f, // resolution 177 0.0f, // XXX power 178 MINDELAY(kMaxSampleRateHzGyro), // minDelay 179 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 180 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 181 SENSOR_STRING_TYPE_GYROSCOPE, 182 "", // requiredPermission 183 (long)(1.0E6f / kMinSampleRateHzGyro), // maxDelay 184 SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro, 185 {NULL, NULL}}, 186 {"LSM6DSL gyroscope (uncalibrated)", 187 "STMicroelectronics", 188 kVersion, 189 COMMS_SENSOR_GYRO_UNCALIBRATED, 190 SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 191 2000.0f * M_PI / 180.0f, // maxRange 192 0.07f * M_PI / 180.0f, // resolution 193 0.0f, // XXX power 194 MINDELAY(kMaxSampleRateHzGyro), // minDelay 195 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 196 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 197 SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED, 198 "", // requiredPermission 199 (long)(1.0E6f / kMinSampleRateHzGyro), // maxDelay 200 SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro, 201 {NULL, NULL}}, 202 {"LIS2MDL magnetometer", 203 "STMicroelectronics", 204 kVersion, 205 COMMS_SENSOR_MAG, 206 SENSOR_TYPE_MAGNETIC_FIELD, 207 1300.0f, // XXX maxRange 208 kScaleMag, // XXX resolution 209 0.0f, // XXX power 210 MINDELAY(kMaxSampleRateHzMag), // minDelay 211 600, // XXX fifoReservedEventCount 212 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 213 SENSOR_STRING_TYPE_MAGNETIC_FIELD, 214 "", // requiredPermission 215 (long)(1.0E6f / kMinSampleRateHzMag), // maxDelay 216 SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagMag, 217 {NULL, NULL}}, 218 {"LIS2MDL magnetometer (uncalibrated)", 219 "STMicroelectronics", 220 kVersion, 221 COMMS_SENSOR_MAG_UNCALIBRATED, 222 SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 223 1300.0f, // XXX maxRange 224 kScaleMag, // XXX resolution 225 0.0f, // XXX power 226 MINDELAY(kMaxSampleRateHzMag), // minDelay 227 600, // XXX fifoReservedEventCount 228 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 229 SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 230 "", // requiredPermission 231 (long)(1.0E6f / kMinSampleRateHzMag), // maxDelay 232 SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagMag, 233 {NULL, NULL}}, 234 {"LPS22HB pressure", 235 "STMicroelectronics", 236 kVersion, 237 COMMS_SENSOR_PRESSURE, 238 SENSOR_TYPE_PRESSURE, 239 1100.0f, // maxRange (hPa) 240 0.005f, // resolution (hPa) 241 0.0f, // XXX power 242 MINDELAY(kMaxSampleRateHzPressure), // minDelay 243 300, // XXX fifoReservedEventCount 244 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 245 SENSOR_STRING_TYPE_PRESSURE, 246 "", // requiredPermission 247 (long)(1.0E6f / kMinSampleRateHzPressure), // maxDelay 248 SENSOR_FLAG_CONTINUOUS_MODE, 249 {NULL, NULL}}, 250 {"LPS22HB temperature", 251 "STMicroelectronics", 252 kVersion, 253 COMMS_SENSOR_AMBIENT_TEMPERATURE, 254 SENSOR_TYPE_AMBIENT_TEMPERATURE, 255 85.0f, // maxRange (degC) 256 0.01, // resolution (degC) 257 0.0f, // XXX power 258 MINDELAY(kMaxSampleRateHzTemperature), // minDelay 259 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 260 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 261 SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE, 262 "", // requiredPermission 263 (long)(1.0E6f / kMinSampleRateHzTemperature), // maxDelay 264 SENSOR_FLAG_CONTINUOUS_MODE, 265 {NULL, NULL}}, 266 {"HTS221 humidity", 267 "STMicroelectronics", 268 kVersion, 269 COMMS_SENSOR_HUMIDITY, 270 SENSOR_TYPE_RELATIVE_HUMIDITY, 271 100.0f, // maxRange (%) 272 0.001f, // resolution (%) 273 0.0f, // XXX power 274 MINDELAY(kMaxSampleRateHzHumidity), // minDelay 275 300, // XXX fifoReservedEventCount 276 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 277 SENSOR_STRING_TYPE_RELATIVE_HUMIDITY, 278 "", // requiredPermission 279 (long)(1.0E6f / kMinSampleRateHzHumidity), // maxDelay 280 SENSOR_FLAG_CONTINUOUS_MODE, 281 {NULL, NULL}}, 282 {"Orientation", 283 "Google", 284 kVersion, 285 COMMS_SENSOR_ORIENTATION, 286 SENSOR_TYPE_ORIENTATION, 287 360.0f, // maxRange (deg) 288 1.0f, // XXX resolution (deg) 289 0.0f, // XXX power 290 MINDELAY(kMaxSampleRateHzOrientation), // minDelay 291 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 292 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 293 SENSOR_STRING_TYPE_ORIENTATION, 294 "", // requiredPermission 295 (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay 296 SENSOR_FLAG_CONTINUOUS_MODE, 297 {NULL, NULL}}, 298 {"LSM6DSL Step detector", 299 "STMicroelectronics", 300 kVersion, 301 COMMS_SENSOR_STEP_DETECTOR, 302 SENSOR_TYPE_STEP_DETECTOR, 303 1.0f, // maxRange 304 1.0f, // XXX resolution 305 0.0f, // XXX power 306 0, // minDelay 307 100, // XXX fifoReservedEventCount 308 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 309 SENSOR_STRING_TYPE_STEP_DETECTOR, 310 "", // requiredPermission 311 0, // maxDelay 312 SENSOR_FLAG_SPECIAL_REPORTING_MODE, 313 {NULL, NULL}}, 314 {"LSM6DSL Step counter", 315 "STMicroelectronics", 316 kVersion, 317 COMMS_SENSOR_STEP_COUNTER, 318 SENSOR_TYPE_STEP_COUNTER, 319 65535.0f, // XXX maxRange 320 1.0f, // resolution 321 0.0f, // XXX power 322 0, // minDelay 323 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 324 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 325 SENSOR_STRING_TYPE_STEP_COUNTER, 326 "", // requiredPermission 327 0, // maxDelay 328 SENSOR_FLAG_ON_CHANGE_MODE, 329 {NULL, NULL}}, 330 {"LSM6DSL Significant motion", 331 "STMicroelectronics", 332 kVersion, 333 COMMS_SENSOR_SIGNIFICANT_MOTION, 334 SENSOR_TYPE_SIGNIFICANT_MOTION, 335 1.0f, // maxRange 336 1.0f, // XXX resolution 337 0.0f, // XXX power 338 -1, // minDelay 339 0, // XXX fifoReservedEventCount 340 0, // XXX fifoMaxEventCount 341 SENSOR_STRING_TYPE_SIGNIFICANT_MOTION, 342 "", // requiredPermission 343 0, // maxDelay 344 SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE, 345 {NULL, NULL}}, 346 {"Gravity", 347 "Google", 348 kVersion, 349 COMMS_SENSOR_GRAVITY, 350 SENSOR_TYPE_GRAVITY, 351 1000.0f, // maxRange 352 1.0f, // XXX resolution 353 0.0f, // XXX power 354 MINDELAY(kMaxSampleRateHzOrientation), // minDelay 355 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 356 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 357 SENSOR_STRING_TYPE_GRAVITY, 358 "", // requiredPermission 359 (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay 360 SENSOR_FLAG_CONTINUOUS_MODE, 361 {NULL, NULL}}, 362 {"Linear Acceleration", 363 "Google", 364 kVersion, 365 COMMS_SENSOR_LINEAR_ACCEL, 366 SENSOR_TYPE_LINEAR_ACCELERATION, 367 1000.0f, // maxRange 368 1.0f, // XXX resolution 369 0.0f, // XXX power 370 MINDELAY(kMaxSampleRateHzOrientation), // minDelay 371 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 372 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 373 SENSOR_STRING_TYPE_LINEAR_ACCELERATION, 374 "", // requiredPermission 375 (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay 376 SENSOR_FLAG_CONTINUOUS_MODE, 377 {NULL, NULL}}, 378 {"Rotation Vector", 379 "Google", 380 kVersion, 381 COMMS_SENSOR_ROTATION_VECTOR, 382 SENSOR_TYPE_ROTATION_VECTOR, 383 1.0f, // maxRange 384 0.001f, // XXX resolution 385 0.0f, // XXX power 386 MINDELAY(kMaxSampleRateHzOrientation), // minDelay 387 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 388 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 389 SENSOR_STRING_TYPE_ROTATION_VECTOR, 390 "", // requiredPermission 391 (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay 392 SENSOR_FLAG_CONTINUOUS_MODE, 393 {NULL, NULL}}, 394 {"Geomagnetic Rotation Vector", 395 "Google", 396 kVersion, 397 COMMS_SENSOR_GEO_MAG, 398 SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 399 1.0f, // maxRange 400 0.001f, // XXX resolution 401 0.0f, // XXX power 402 MINDELAY(kMaxSampleRateHzOrientation), // minDelay 403 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 404 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 405 SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 406 "", // requiredPermission 407 (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay 408 SENSOR_FLAG_CONTINUOUS_MODE, 409 {NULL, NULL}}, 410 {"Game Rotation Vector", 411 "Google", 412 kVersion, 413 COMMS_SENSOR_GAME_ROTATION_VECTOR, 414 SENSOR_TYPE_GAME_ROTATION_VECTOR, 415 1.0f, // maxRange 416 0.001f, // XXX resolution 417 0.0f, // XXX power 418 MINDELAY(kMaxSampleRateHzOrientation), // minDelay 419 300, // XXX fifoReservedEventCount 420 kMaxThreeAxisEventCount, // XXX fifoMaxEventCount 421 SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR, 422 "", // requiredPermission 423 (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay 424 SENSOR_FLAG_CONTINUOUS_MODE, 425 {NULL, NULL}}, 426 {"Tilt Detector", 427 "Google", 428 kVersion, 429 COMMS_SENSOR_TILT, 430 SENSOR_TYPE_TILT_DETECTOR, 431 1.0f, // maxRange 432 1.0f, // XXX resolution 433 0.0f, // XXX power 434 0, // minDelay 435 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 436 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 437 SENSOR_STRING_TYPE_TILT_DETECTOR, 438 "", // requiredPermission 439 0, // maxDelay 440 SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE, 441 {NULL, NULL}}, 442 {"Device Orientation", 443 "Google", 444 kVersion, 445 COMMS_SENSOR_WINDOW_ORIENTATION, 446 SENSOR_TYPE_DEVICE_ORIENTATION, 447 3.0f, // maxRange 448 1.0f, // XXX resolution 449 0.1f, // XXX power 450 0, // minDelay 451 kMinFifoReservedEventCount, // XXX fifoReservedEventCount 452 kMaxOneAxisEventCount, // XXX fifoMaxEventCount 453 SENSOR_STRING_TYPE_DEVICE_ORIENTATION, 454 "", // requiredPermission 455 0, // maxDelay 456 SENSOR_FLAG_ON_CHANGE_MODE, 457 {NULL, NULL}}, 458 }; 459 460 extern const size_t kSensorCount = sizeof(kSensorList) / sizeof(sensor_t); 461