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