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