Home | History | Annotate | Download | only in sensorhal
      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 extern const float kScaleAccel = (8.0f * 9.81f / 32768.0f);
     30 
     31 const float kMinSampleRateHzGyro = 6.250f;
     32 const float kMaxSampleRateHzGyro = 400.0f;
     33 
     34 const float kMinSampleRateHzMag = 3.125f;
     35 const float kMaxSampleRateHzMag = 50.0f;
     36 extern const float kScaleMag = 0.15f;
     37 
     38 const float kMinSampleRateHzPolling = 0.1f;
     39 const float kMaxSampleRateHzPolling = 25.0f;
     40 
     41 const float kMinSampleRateHzPressure = 0.1f;
     42 const float kMaxSampleRateHzPressure = 10.0f;
     43 
     44 const float kMinSampleRateHzTemperature = kMinSampleRateHzPolling;
     45 const float kMaxSampleRateHzTemperature = kMaxSampleRateHzPolling;
     46 
     47 const float kMinSampleRateHzProximity = kMinSampleRateHzPolling;
     48 const float kMaxSampleRateHzProximity = 5.0;
     49 
     50 const float kMinSampleRateHzLight = kMinSampleRateHzPolling;
     51 const float kMaxSampleRateHzLight = 5.0;
     52 
     53 const float kMinSampleRateHzOrientation = 12.5f;
     54 const float kMaxSampleRateHzOrientation = 200.0f;
     55 
     56 #ifdef DIRECT_REPORT_ENABLED
     57 constexpr uint32_t kDirectReportFlagAccel = (
     58         // support up to rate level fast (nominal 200Hz);
     59         (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
     60         // support ashmem and gralloc direct channel
     61         | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM
     62         | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
     63 constexpr uint32_t kDirectReportFlagGyro = (
     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
     68         | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
     69 constexpr uint32_t kDirectReportFlagMag = (
     70         // support up to rate level normal (nominal 50Hz);
     71         (SENSOR_DIRECT_RATE_NORMAL << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
     72         // support ashmem and gralloc direct channel
     73         | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM
     74         | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
     75 #else
     76 constexpr uint32_t kDirectReportFlagAccel = 0;
     77 constexpr uint32_t kDirectReportFlagGyro = 0;
     78 constexpr uint32_t kDirectReportFlagMag = 0;
     79 #endif
     80 
     81 /*
     82  * The fowllowing max count is determined by the total number of blocks
     83  * avaliable in the shared nanohub buffer and number of samples each type of
     84  * event can hold within a buffer block.
     85  * For marlin's case, there are 239 blocks in the shared sensor buffer and
     86  * each block can hold 30 OneAxis Samples, 15 ThreeAxis Samples or 24
     87  * RawThreeAxies Samples.
     88  */
     89 const int kMaxOneAxisEventCount = 7170;
     90 const int kMaxThreeAxisEventCount = 3585;
     91 const int kMaxRawThreeAxisEventCount = 5736;
     92 
     93 const int kMinFifoReservedEventCount = 20;
     94 
     95 const char SENSOR_STRING_TYPE_INTERNAL_TEMPERATURE[] =
     96     "com.google.sensor.internal_temperature";
     97 const char SENSOR_STRING_TYPE_SYNC[] =
     98     "com.google.sensor.sync";
     99 const char SENSOR_STRING_TYPE_DOUBLE_TWIST[] =
    100     "com.google.sensor.double_twist";
    101 const char SENSOR_STRING_TYPE_DOUBLE_TAP[] =
    102     "com.google.sensor.double_tap";
    103 const char SENSOR_STRING_TYPE_DOUBLE_TOUCH[] =
    104     "com.google.sensor.double_touch";
    105 
    106 extern const sensor_t kSensorList[] = {
    107     {
    108         "TMD4903 Proximity Sensor",
    109         "AMS",
    110         kVersion,
    111         COMMS_SENSOR_PROXIMITY,
    112         SENSOR_TYPE_PROXIMITY,
    113         5.0f,                                          // maxRange (cm)
    114         1.0f,                                          // resolution (cm)
    115         0.0f,                                          // XXX power
    116         (int32_t)(1.0E6f / kMaxSampleRateHzProximity), // minDelay
    117         300,                                           // XXX fifoReservedEventCount
    118         kMaxOneAxisEventCount,                         // XXX fifoMaxEventCount
    119         SENSOR_STRING_TYPE_PROXIMITY,
    120         "",                                            // requiredPermission
    121         (long)(1.0E6f / kMinSampleRateHzProximity),    // maxDelay
    122         SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE,
    123         { NULL, NULL }
    124     },
    125     {
    126         "TMD4903 Light Sensor",
    127         "AMS",
    128         kVersion,
    129         COMMS_SENSOR_LIGHT,
    130         SENSOR_TYPE_LIGHT,
    131         43000.0f,                                  // maxRange (lx)
    132         10.0f,                                     // XXX resolution (lx)
    133         0.0f,                                      // XXX power
    134         (int32_t)(1.0E6f / kMaxSampleRateHzLight), // minDelay
    135         kMinFifoReservedEventCount,                // XXX fifoReservedEventCount
    136         kMaxOneAxisEventCount,                     // XXX fifoMaxEventCount
    137         SENSOR_STRING_TYPE_LIGHT,
    138         "",                                        // requiredPermission
    139         (long)(1.0E6f / kMinSampleRateHzLight),    // maxDelay
    140         SENSOR_FLAG_ON_CHANGE_MODE,
    141         { NULL, NULL }
    142     },
    143     {
    144         "BMI160 accelerometer",
    145         "Bosch",
    146         kVersion,
    147         COMMS_SENSOR_ACCEL,
    148         SENSOR_TYPE_ACCELEROMETER,
    149         GRAVITY_EARTH * 8.0f,                      // maxRange
    150         GRAVITY_EARTH * 8.0f / 32768.0f,           // resolution
    151         0.0f,                                      // XXX power
    152         (int32_t)(1.0E6f / kMaxSampleRateHzAccel), // minDelay
    153         3000,                                      // XXX fifoReservedEventCount
    154         kMaxRawThreeAxisEventCount,                // XXX fifoMaxEventCount
    155         SENSOR_STRING_TYPE_ACCELEROMETER,
    156         "",                                        // requiredPermission
    157         (long)(1.0E6f / kMinSampleRateHzAccel),    // maxDelay
    158         SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel,
    159         { NULL, NULL }
    160     },
    161     {
    162         "BMI160 gyroscope",
    163         "Bosch",
    164         kVersion,
    165         COMMS_SENSOR_GYRO,
    166         SENSOR_TYPE_GYROSCOPE,
    167         1000.0f * M_PI / 180.0f,                   // maxRange
    168         1000.0f * M_PI / (180.0f * 32768.0f),      // resolution
    169         0.0f,                                      // XXX power
    170         (int32_t)(1.0E6f / kMaxSampleRateHzGyro),  // minDelay
    171         kMinFifoReservedEventCount,                // XXX fifoReservedEventCount
    172         kMaxThreeAxisEventCount,                   // XXX fifoMaxEventCount
    173         SENSOR_STRING_TYPE_GYROSCOPE,
    174         "",                                        // requiredPermission
    175         (long)(1.0E6f / kMinSampleRateHzGyro),     // maxDelay
    176         SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro,
    177         { NULL, NULL }
    178     },
    179     {
    180         "BMI160 gyroscope (uncalibrated)",
    181         "Bosch",
    182         kVersion,
    183         COMMS_SENSOR_GYRO_UNCALIBRATED,
    184         SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
    185         1000.0f * M_PI / 180.0f,                   // maxRange
    186         1000.0f * M_PI / (180.0f * 32768.0f),      // resolution
    187         0.0f,                                      // XXX power
    188         (int32_t)(1.0E6f / kMaxSampleRateHzGyro),  // minDelay
    189         kMinFifoReservedEventCount,                // XXX fifoReservedEventCount
    190         kMaxThreeAxisEventCount,                   // XXX fifoMaxEventCount
    191         SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED,
    192         "",                                        // requiredPermission
    193         (long)(1.0E6f / kMinSampleRateHzGyro),     // maxDelay
    194         SENSOR_FLAG_CONTINUOUS_MODE,
    195         { NULL, NULL }
    196     },
    197     {
    198         "AK09915 magnetometer",
    199         "AKM",
    200         kVersion,
    201         COMMS_SENSOR_MAG,
    202         SENSOR_TYPE_MAGNETIC_FIELD,
    203         1300.0f,                                   // XXX maxRange
    204         0.0f,                                      // XXX resolution
    205         0.0f,                                      // XXX power
    206         (int32_t)(1.0E6f / 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     },
    215     {
    216         "AK09915 magnetometer (uncalibrated)",
    217         "AKM",
    218         kVersion,
    219         COMMS_SENSOR_MAG_UNCALIBRATED,
    220         SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
    221         1300.0f,                                        // XXX maxRange
    222         0.0f,                                           // XXX resolution
    223         0.0f,                                           // XXX power
    224         (int32_t)(1.0E6f / kMaxSampleRateHzMag),        // minDelay
    225         600,                                            // XXX fifoReservedEventCount
    226         kMaxThreeAxisEventCount,                        // XXX fifoMaxEventCount
    227         SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
    228         "",                                             // requiredPermission
    229         (long)(1.0E6f / kMinSampleRateHzMag),           // maxDelay
    230         SENSOR_FLAG_CONTINUOUS_MODE,
    231         { NULL, NULL }
    232     },
    233     {
    234         "BMP285 pressure",
    235         "Bosch",
    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         (int32_t)(1.0E6f / 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     },
    251     {
    252         "BMP285 temperature",
    253         "Bosch",
    254         kVersion,
    255         COMMS_SENSOR_TEMPERATURE,
    256         SENSOR_TYPE_INTERNAL_TEMPERATURE,
    257         85.0f,                                           // maxRange (degC)
    258         0.01,                                            // resolution (degC)
    259         0.0f,                                            // XXX power
    260         (int32_t)(1.0E6f / kMaxSampleRateHzTemperature), // minDelay
    261         kMinFifoReservedEventCount,                      // XXX fifoReservedEventCount
    262         kMaxOneAxisEventCount,                           // XXX fifoMaxEventCount
    263         SENSOR_STRING_TYPE_INTERNAL_TEMPERATURE,
    264         "",                                              // requiredPermission
    265         (long)(1.0E6f / kMinSampleRateHzTemperature),    // maxDelay
    266         SENSOR_FLAG_CONTINUOUS_MODE,
    267         { NULL, NULL }
    268     },
    269     {
    270         "Orientation",
    271         "Google",
    272         kVersion,
    273         COMMS_SENSOR_ORIENTATION,
    274         SENSOR_TYPE_ORIENTATION,
    275         360.0f,                                          // maxRange (deg)
    276         1.0f,                                            // XXX resolution (deg)
    277         0.0f,                                            // XXX power
    278         (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
    279         kMinFifoReservedEventCount,                      // XXX fifoReservedEventCount
    280         kMaxThreeAxisEventCount,                         // XXX fifoMaxEventCount
    281         SENSOR_STRING_TYPE_ORIENTATION,
    282         "",                                              // requiredPermission
    283         (long)(1.0E6f / kMinSampleRateHzOrientation),    // maxDelay
    284         SENSOR_FLAG_CONTINUOUS_MODE,
    285         { NULL, NULL }
    286     },
    287     {
    288         "BMI160 Step detector",
    289         "Bosch",
    290         kVersion,
    291         COMMS_SENSOR_STEP_DETECTOR,
    292         SENSOR_TYPE_STEP_DETECTOR,
    293         1.0f,                                   // maxRange
    294         1.0f,                                   // XXX resolution
    295         0.0f,                                   // XXX power
    296         0,                                      // minDelay
    297         100,                                    // XXX fifoReservedEventCount
    298         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    299         SENSOR_STRING_TYPE_STEP_DETECTOR,
    300         "",                                     // requiredPermission
    301         0,                                      // maxDelay
    302         SENSOR_FLAG_SPECIAL_REPORTING_MODE,
    303         { NULL, NULL }
    304     },
    305     {
    306         "BMI160 Step counter",
    307         "Bosch",
    308         kVersion,
    309         COMMS_SENSOR_STEP_COUNTER,
    310         SENSOR_TYPE_STEP_COUNTER,
    311         1.0f,                                   // XXX maxRange
    312         1.0f,                                   // resolution
    313         0.0f,                                   // XXX power
    314         0,                                      // minDelay
    315         kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
    316         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    317         SENSOR_STRING_TYPE_STEP_COUNTER,
    318         "",                                     // requiredPermission
    319         0,                                      // maxDelay
    320         SENSOR_FLAG_ON_CHANGE_MODE,
    321         { NULL, NULL }
    322     },
    323     {
    324         "Significant motion",
    325         "Google",
    326         kVersion,
    327         COMMS_SENSOR_SIGNIFICANT_MOTION,
    328         SENSOR_TYPE_SIGNIFICANT_MOTION,
    329         1.0f,                                   // maxRange
    330         1.0f,                                   // XXX resolution
    331         0.0f,                                   // XXX power
    332         -1,                                     // minDelay
    333         0,                                      // XXX fifoReservedEventCount
    334         0,                                      // XXX fifoMaxEventCount
    335         SENSOR_STRING_TYPE_SIGNIFICANT_MOTION,
    336         "",                                     // requiredPermission
    337         0,                                      // maxDelay
    338         SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
    339         { NULL, NULL }
    340     },
    341     {
    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         (int32_t)(1.0E6f / 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     },
    359     {
    360         "Linear Acceleration",
    361         "Google",
    362         kVersion,
    363         COMMS_SENSOR_LINEAR_ACCEL,
    364         SENSOR_TYPE_LINEAR_ACCELERATION,
    365         1000.0f,                                         // maxRange
    366         1.0f,                                            // XXX resolution
    367         0.0f,                                            // XXX power
    368         (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
    369         kMinFifoReservedEventCount,                      // XXX fifoReservedEventCount
    370         kMaxThreeAxisEventCount,                         // XXX fifoMaxEventCount
    371         SENSOR_STRING_TYPE_LINEAR_ACCELERATION,
    372         "",                                              // requiredPermission
    373         (long)(1.0E6f / kMinSampleRateHzOrientation),    // maxDelay
    374         SENSOR_FLAG_CONTINUOUS_MODE,
    375         { NULL, NULL }
    376     },
    377     {
    378         "Rotation Vector",
    379         "Google",
    380         kVersion,
    381         COMMS_SENSOR_ROTATION_VECTOR,
    382         SENSOR_TYPE_ROTATION_VECTOR,
    383         1000.0f,                                         // maxRange
    384         1.0f,                                            // XXX resolution
    385         0.0f,                                            // XXX power
    386         (int32_t)(1.0E6f / 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     },
    395     {
    396         "Geomagnetic Rotation Vector",
    397         "Google",
    398         kVersion,
    399         COMMS_SENSOR_GEO_MAG,
    400         SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
    401         1000.0f,                                         // maxRange
    402         1.0f,                                            // XXX resolution
    403         0.0f,                                            // XXX power
    404         (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
    405         kMinFifoReservedEventCount,                      // XXX fifoReservedEventCount
    406         kMaxThreeAxisEventCount,                         // XXX fifoMaxEventCount
    407         SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
    408         "",                                              // requiredPermission
    409         (long)(1.0E6f / kMinSampleRateHzOrientation),    // maxDelay
    410         SENSOR_FLAG_CONTINUOUS_MODE,
    411         { NULL, NULL }
    412     },
    413     {
    414         "Game Rotation Vector",
    415         "Google",
    416         kVersion,
    417         COMMS_SENSOR_GAME_ROTATION_VECTOR,
    418         SENSOR_TYPE_GAME_ROTATION_VECTOR,
    419         1000.0f,                                         // maxRange
    420         1.0f,                                            // XXX resolution
    421         0.0f,                                            // XXX power
    422         (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
    423         300,                                             // XXX fifoReservedEventCount
    424         kMaxThreeAxisEventCount,                         // XXX fifoMaxEventCount
    425         SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR,
    426         "",                                              // requiredPermission
    427         (long)(1.0E6f / kMinSampleRateHzOrientation),    // maxDelay
    428         SENSOR_FLAG_CONTINUOUS_MODE,
    429         { NULL, NULL }
    430     },
    431     {
    432         "Tilt Detector",
    433         "Google",
    434         kVersion,
    435         COMMS_SENSOR_TILT,
    436         SENSOR_TYPE_TILT_DETECTOR,
    437         1.0f,                                   // maxRange
    438         1.0f,                                   // XXX resolution
    439         0.0f,                                   // XXX power
    440         0,                                      // minDelay
    441         kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
    442         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    443         SENSOR_STRING_TYPE_TILT_DETECTOR,
    444         "",                                     // requiredPermission
    445         0,                                      // maxDelay
    446         SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
    447         { NULL, NULL }
    448     },
    449     {
    450         "Pickup Gesture",
    451         "Google",
    452         kVersion,
    453         COMMS_SENSOR_GESTURE,
    454         SENSOR_TYPE_PICK_UP_GESTURE,
    455         1.0f,                                   // maxRange
    456         1.0f,                                   // XXX resolution
    457         0.0f,                                   // XXX power
    458         -1,                                     // minDelay
    459         0,                                      // XXX fifoReservedEventCount
    460         0,                                      // XXX fifoMaxEventCount
    461         SENSOR_STRING_TYPE_PICK_UP_GESTURE,
    462         "",                                     // requiredPermission
    463         0,                                      // maxDelay
    464         SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
    465         { NULL, NULL }
    466     },
    467     {
    468         "Sensors Sync",
    469         "Google",
    470         kVersion,
    471         COMMS_SENSOR_SYNC,
    472         SENSOR_TYPE_SYNC,
    473         1.0f,                                   // maxRange
    474         1.0f,                                   // XXX resolution
    475         0.1f,                                   // XXX power
    476         0,                                      // minDelay
    477         kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
    478         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    479         SENSOR_STRING_TYPE_SYNC,
    480         "",                                     // requiredPermission
    481         0,                                      // maxDelay
    482         SENSOR_FLAG_SPECIAL_REPORTING_MODE,
    483         { NULL, NULL }
    484     },
    485     {
    486         "Double Twist",
    487         "Google",
    488         kVersion,
    489         COMMS_SENSOR_DOUBLE_TWIST,
    490         SENSOR_TYPE_DOUBLE_TWIST,
    491         1.0f,                                   // maxRange
    492         1.0f,                                   // XXX resolution
    493         0.1f,                                   // XXX power
    494         0,                                      // minDelay
    495         kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
    496         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    497         SENSOR_STRING_TYPE_DOUBLE_TWIST,
    498         "",                                     // requiredPermission
    499         0,                                      // maxDelay
    500         SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
    501         { NULL, NULL }
    502     },
    503     {
    504         "Double Tap",
    505         "Google",
    506         kVersion,
    507         COMMS_SENSOR_DOUBLE_TAP,
    508         SENSOR_TYPE_DOUBLE_TAP,
    509         1.0f,                                   // maxRange
    510         1.0f,                                   // XXX resolution
    511         0.1f,                                   // XXX power
    512         0,                                      // minDelay
    513         kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
    514         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    515         SENSOR_STRING_TYPE_DOUBLE_TAP,
    516         "",                                     // requiredPermission
    517         0,                                      // maxDelay
    518         SENSOR_FLAG_SPECIAL_REPORTING_MODE,
    519         { NULL, NULL }
    520     },
    521     {
    522         "Device Orientation",
    523         "Google",
    524         kVersion,
    525         COMMS_SENSOR_WINDOW_ORIENTATION,
    526         SENSOR_TYPE_DEVICE_ORIENTATION,
    527         3.0f,                                   // maxRange
    528         1.0f,                                   // XXX resolution
    529         0.1f,                                   // XXX power
    530         0,                                      // minDelay
    531         kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
    532         kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
    533         SENSOR_STRING_TYPE_DEVICE_ORIENTATION,
    534         "",                                     // requiredPermission
    535         0,                                      // maxDelay
    536         SENSOR_FLAG_ON_CHANGE_MODE,
    537         { NULL, NULL }
    538     },
    539     {
    540         "Double Touch",
    541         "Google",
    542         kVersion,
    543         COMMS_SENSOR_DOUBLE_TOUCH,
    544         SENSOR_TYPE_DOUBLE_TOUCH,
    545         1.0f,                                   // maxRange
    546         1.0f,                                   // XXX resolution
    547         0.0f,                                   // XXX power
    548         -1,                                     // minDelay
    549         0,                                      // XXX fifoReservedEventCount
    550         0,                                      // XXX fifoMaxEventCount
    551         SENSOR_STRING_TYPE_DOUBLE_TOUCH,
    552         "",                                     // requiredPermission
    553         0,                                      // maxDelay
    554         SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
    555         { NULL, NULL }
    556     },
    557     {
    558         "BMI160 accelerometer (uncalibrated)",
    559         "Bosch",
    560         kVersion,
    561         COMMS_SENSOR_ACCEL_UNCALIBRATED,
    562         SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED,
    563         GRAVITY_EARTH * 8.0f,                      // maxRange
    564         GRAVITY_EARTH * 8.0f / 32768.0f,           // resolution
    565         0.0f,                                      // XXX power
    566         (int32_t)(1.0E6f / kMaxSampleRateHzAccel), // minDelay
    567         3000,                                      // XXX fifoReservedEventCount
    568         kMaxRawThreeAxisEventCount,                // XXX fifoMaxEventCount
    569         SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED,
    570         "",                                        // requiredPermission
    571         (long)(1.0E6f / kMinSampleRateHzAccel),    // maxDelay
    572         SENSOR_FLAG_CONTINUOUS_MODE,
    573         { NULL, NULL }
    574     },
    575 };
    576 
    577 extern const size_t kSensorCount = sizeof(kSensorList) / sizeof(sensor_t);
    578