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