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